aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-10-11 21:12:22 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-10-11 21:12:22 -0400
commit6b25e21fa6f26d0f0d45f161d169029411c84286 (patch)
treefdff805ecd81ec46951f49577efe450ddb7d060a /drivers/gpu/drm/amd/amdgpu
parenta379f71a30dddbd2e7393624e455ce53c87965d1 (diff)
parent69405d3da98b48633b78a49403e4f9cdb7c6a0f5 (diff)
Merge tag 'drm-for-v4.9' of git://people.freedesktop.org/~airlied/linux
Pull drm updates from Dave Airlie: "Core: - Fence destaging work - DRIVER_LEGACY to split off legacy drm drivers - drm_mm refactoring - Splitting drm_crtc.c into chunks and documenting better - Display info fixes - rbtree support for prime buffer lookup - Simple VGA DAC driver Panel: - Add Nexus 7 panel - More simple panels i915: - Refactoring GEM naming - Refactored vma/active tracking - Lockless request lookups - Better stolen memory support - FBC fixes - SKL watermark fixes - VGPU improvements - dma-buf fencing support - Better DP dongle support amdgpu: - Powerplay for Iceland asics - Improved GPU reset support - UVD/VEC powergating support for CZ/ST - Preinitialised VRAM buffer support - Virtual display support - Initial SI support - GTT rework - PCI shutdown callback support - HPD IRQ storm fixes amdkfd: - bugfixes tilcdc: - Atomic modesetting support mediatek: - AAL + GAMMA engine support - Hook up gamma LUT - Temporal dithering support imx: - Pixel clock from devicetree - drm bridge support for LVDS bridges - active plane reconfiguration - VDIC deinterlacer support - Frame synchronisation unit support - Color space conversion support analogix: - PSR support - Better panel on/off support rockchip: - rk3399 vop/crtc support - PSR support vc4: - Interlaced vblank timing - 3D rendering CPU overhead reduction - HDMI output fixes tda998x: - HDMI audio ASoC support sunxi: - Allwinner A33 support - better TCON support msm: - DT binding cleanups - Explicit fence-fd support sti: - remove sti415/416 support etnaviv: - MMUv2 refactoring - GC3000 support exynos: - Refactoring HDMI DCC/PHY - G2D pm regression fix - Page fault issues with wait for vblank There is no nouveau work in this tree, as Ben didn't get a pull request in, and he was fighting moving to atomic and adding mst support, so maybe best it waits for a cycle" * tag 'drm-for-v4.9' of git://people.freedesktop.org/~airlied/linux: (1412 commits) drm/crtc: constify drm_crtc_index parameter drm/i915: Fix conflict resolution from backmerge of v4.8-rc8 to drm-next drm/i915/guc: Unwind GuC workqueue reservation if request construction fails drm/i915: Reset the breadcrumbs IRQ more carefully drm/i915: Force relocations via cpu if we run out of idle aperture drm/i915: Distinguish last emitted request from last submitted request drm/i915: Allow DP to work w/o EDID drm/i915: Move long hpd handling into the hotplug work drm/i915/execlists: Reinitialise context image after GPU hang drm/i915: Use correct index for backtracking HUNG semaphores drm/i915: Unalias obj->phys_handle and obj->userptr drm/i915: Just clear the mmiodebug before a register access drm/i915/gen9: only add the planes actually affected by ddb changes drm/i915: Allow PCH DPLL sharing regardless of DPLL_SDVO_HIGH_SPEED drm/i915/bxt: Fix HDMI DPLL configuration drm/i915/gen9: fix the watermark res_blocks value drm/i915/gen9: fix plane_blocks_per_line on watermarks calculations drm/i915/gen9: minimum scanlines for Y tile is not always 4 drm/i915/gen9: fix the WaWmMemoryReadLatency implementation drm/i915/kbl: KBL also needs to run the SAGV code ...
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/Kconfig8
-rw-r--r--drivers/gpu/drm/amd/amdgpu/Makefile17
-rw-r--r--drivers/gpu/drm/amd/amdgpu/ObjectID.h7
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h188
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c11
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c8
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c17
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c17
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c185
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.h18
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c9
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c52
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c101
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c340
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c477
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_display.c143
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c156
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c73
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c8
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gds.h8
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c22
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c239
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.c19
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.h14
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c33
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c43
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_job.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c30
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h12
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.c479
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.h36
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_pll.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c120
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c42
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c48
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_test.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h20
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c261
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h90
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c26
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c85
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c54
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h57
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c502
-rw-r--r--drivers/gpu/drm/amd/amdgpu/atombios_crtc.c8
-rw-r--r--drivers/gpu/drm/amd/amdgpu/atombios_dp.c22
-rw-r--r--drivers/gpu/drm/amd/amdgpu/atombios_i2c.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/ci_dpm.c11
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cik.c431
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cik_sdma.c131
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cikd.h36
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cz_dpm.c94
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cz_smc.c13
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v10_0.c141
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v10_0.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v11_0.c125
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v11_0.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v6_0.c3176
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v6_0.h (renamed from drivers/gpu/drm/amd/amdgpu/tonga_smum.h)21
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v8_0.c183
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v8_0.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_virtual.c802
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_virtual.h (renamed from drivers/gpu/drm/amd/amdgpu/iceland_smum.h)20
-rw-r--r--drivers/gpu/drm/amd/amdgpu/fiji_dpm.c186
-rw-r--r--drivers/gpu/drm/amd/amdgpu/fiji_smc.c863
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c3362
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v6_0.h29
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c257
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c993
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c1071
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v6_0.h29
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c17
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c80
-rw-r--r--drivers/gpu/drm/amd/amdgpu/iceland_dpm.c200
-rw-r--r--drivers/gpu/drm/amd/amdgpu/iceland_smc.c677
-rw-r--r--drivers/gpu/drm/amd/amdgpu/kv_dpm.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/r600_dpm.h127
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c137
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c244
-rw-r--r--drivers/gpu/drm/amd/amdgpu/si.c1965
-rw-r--r--drivers/gpu/drm/amd/amdgpu/si.h (renamed from drivers/gpu/drm/amd/amdgpu/fiji_smum.h)23
-rw-r--r--drivers/gpu/drm/amd/amdgpu/si_dma.c915
-rw-r--r--drivers/gpu/drm/amd/amdgpu/si_dma.h29
-rw-r--r--drivers/gpu/drm/amd/amdgpu/si_dpm.c8006
-rw-r--r--drivers/gpu/drm/amd/amdgpu/si_dpm.h1015
-rw-r--r--drivers/gpu/drm/amd/amdgpu/si_ih.c299
-rw-r--r--drivers/gpu/drm/amd/amdgpu/si_ih.h29
-rw-r--r--drivers/gpu/drm/amd/amdgpu/si_smc.c273
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sislands_smc.h423
-rw-r--r--drivers/gpu/drm/amd/amdgpu/tonga_dpm.c186
-rw-r--r--drivers/gpu/drm/amd/amdgpu/tonga_ih.c49
-rw-r--r--drivers/gpu/drm/amd/amdgpu/tonga_smc.c862
-rw-r--r--drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c18
-rw-r--r--drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c18
-rw-r--r--drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c150
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vce_v2_0.c240
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vce_v3_0.c442
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vi.c535
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vid.h41
105 files changed, 27769 insertions, 5343 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/Kconfig b/drivers/gpu/drm/amd/amdgpu/Kconfig
index 7335c0420c70..61360e27715f 100644
--- a/drivers/gpu/drm/amd/amdgpu/Kconfig
+++ b/drivers/gpu/drm/amd/amdgpu/Kconfig
@@ -1,3 +1,10 @@
1config DRM_AMDGPU_SI
2 bool "Enable amdgpu support for SI parts"
3 depends on DRM_AMDGPU
4 help
5 Choose this option if you want to enable experimental support
6 for SI asics.
7
1config DRM_AMDGPU_CIK 8config DRM_AMDGPU_CIK
2 bool "Enable amdgpu support for CIK parts" 9 bool "Enable amdgpu support for CIK parts"
3 depends on DRM_AMDGPU 10 depends on DRM_AMDGPU
@@ -25,3 +32,4 @@ config DRM_AMDGPU_GART_DEBUGFS
25 Selecting this option creates a debugfs file to inspect the mapped 32 Selecting this option creates a debugfs file to inspect the mapped
26 pages. Uses more memory for housekeeping, enable only for debugging. 33 pages. Uses more memory for housekeeping, enable only for debugging.
27 34
35source "drivers/gpu/drm/amd/acp/Kconfig"
diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile b/drivers/gpu/drm/amd/amdgpu/Makefile
index c7fcdcedaadb..248a05d02917 100644
--- a/drivers/gpu/drm/amd/amdgpu/Makefile
+++ b/drivers/gpu/drm/amd/amdgpu/Makefile
@@ -23,13 +23,16 @@ amdgpu-y += amdgpu_device.o amdgpu_kms.o \
23 amdgpu_pm.o atombios_dp.o amdgpu_afmt.o amdgpu_trace_points.o \ 23 amdgpu_pm.o atombios_dp.o amdgpu_afmt.o amdgpu_trace_points.o \
24 atombios_encoders.o amdgpu_sa.o atombios_i2c.o \ 24 atombios_encoders.o amdgpu_sa.o atombios_i2c.o \
25 amdgpu_prime.o amdgpu_vm.o amdgpu_ib.o amdgpu_pll.o \ 25 amdgpu_prime.o amdgpu_vm.o amdgpu_ib.o amdgpu_pll.o \
26 amdgpu_ucode.o amdgpu_bo_list.o amdgpu_ctx.o amdgpu_sync.o 26 amdgpu_ucode.o amdgpu_bo_list.o amdgpu_ctx.o amdgpu_sync.o \
27 amdgpu_gtt_mgr.o
27 28
28# add asic specific block 29# add asic specific block
29amdgpu-$(CONFIG_DRM_AMDGPU_CIK)+= cik.o cik_ih.o kv_smc.o kv_dpm.o \ 30amdgpu-$(CONFIG_DRM_AMDGPU_CIK)+= cik.o cik_ih.o kv_smc.o kv_dpm.o \
30 ci_smc.o ci_dpm.o dce_v8_0.o gfx_v7_0.o cik_sdma.o uvd_v4_2.o vce_v2_0.o \ 31 ci_smc.o ci_dpm.o dce_v8_0.o gfx_v7_0.o cik_sdma.o uvd_v4_2.o vce_v2_0.o \
31 amdgpu_amdkfd_gfx_v7.o 32 amdgpu_amdkfd_gfx_v7.o
32 33
34amdgpu-$(CONFIG_DRM_AMDGPU_SI)+= si.o gmc_v6_0.o gfx_v6_0.o si_ih.o si_dma.o dce_v6_0.o si_dpm.o si_smc.o
35
33amdgpu-y += \ 36amdgpu-y += \
34 vi.o 37 vi.o
35 38
@@ -50,15 +53,13 @@ amdgpu-y += \
50amdgpu-y += \ 53amdgpu-y += \
51 amdgpu_dpm.o \ 54 amdgpu_dpm.o \
52 amdgpu_powerplay.o \ 55 amdgpu_powerplay.o \
53 cz_smc.o cz_dpm.o \ 56 cz_smc.o cz_dpm.o
54 tonga_smc.o tonga_dpm.o \
55 fiji_smc.o fiji_dpm.o \
56 iceland_smc.o iceland_dpm.o
57 57
58# add DCE block 58# add DCE block
59amdgpu-y += \ 59amdgpu-y += \
60 dce_v10_0.o \ 60 dce_v10_0.o \
61 dce_v11_0.o 61 dce_v11_0.o \
62 dce_virtual.o
62 63
63# add GFX block 64# add GFX block
64amdgpu-y += \ 65amdgpu-y += \
@@ -110,14 +111,10 @@ amdgpu-$(CONFIG_VGA_SWITCHEROO) += amdgpu_atpx_handler.o
110amdgpu-$(CONFIG_ACPI) += amdgpu_acpi.o 111amdgpu-$(CONFIG_ACPI) += amdgpu_acpi.o
111amdgpu-$(CONFIG_MMU_NOTIFIER) += amdgpu_mn.o 112amdgpu-$(CONFIG_MMU_NOTIFIER) += amdgpu_mn.o
112 113
113ifneq ($(CONFIG_DRM_AMD_POWERPLAY),)
114
115include $(FULL_AMD_PATH)/powerplay/Makefile 114include $(FULL_AMD_PATH)/powerplay/Makefile
116 115
117amdgpu-y += $(AMD_POWERPLAY_FILES) 116amdgpu-y += $(AMD_POWERPLAY_FILES)
118 117
119endif
120
121obj-$(CONFIG_DRM_AMDGPU)+= amdgpu.o 118obj-$(CONFIG_DRM_AMDGPU)+= amdgpu.o
122 119
123CFLAGS_amdgpu_trace_points.o := -I$(src) 120CFLAGS_amdgpu_trace_points.o := -I$(src)
diff --git a/drivers/gpu/drm/amd/amdgpu/ObjectID.h b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
index 06192698bd96..b8d66670bb17 100644
--- a/drivers/gpu/drm/amd/amdgpu/ObjectID.h
+++ b/drivers/gpu/drm/amd/amdgpu/ObjectID.h
@@ -90,6 +90,7 @@
90#define ENCODER_OBJECT_ID_INTERNAL_VCE 0x24 90#define ENCODER_OBJECT_ID_INTERNAL_VCE 0x24
91#define ENCODER_OBJECT_ID_INTERNAL_UNIPHY3 0x25 91#define ENCODER_OBJECT_ID_INTERNAL_UNIPHY3 0x25
92#define ENCODER_OBJECT_ID_INTERNAL_AMCLK 0x27 92#define ENCODER_OBJECT_ID_INTERNAL_AMCLK 0x27
93#define ENCODER_OBJECT_ID_VIRTUAL 0x28
93 94
94#define ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO 0xFF 95#define ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO 0xFF
95 96
@@ -119,6 +120,7 @@
119#define CONNECTOR_OBJECT_ID_eDP 0x14 120#define CONNECTOR_OBJECT_ID_eDP 0x14
120#define CONNECTOR_OBJECT_ID_MXM 0x15 121#define CONNECTOR_OBJECT_ID_MXM 0x15
121#define CONNECTOR_OBJECT_ID_LVDS_eDP 0x16 122#define CONNECTOR_OBJECT_ID_LVDS_eDP 0x16
123#define CONNECTOR_OBJECT_ID_VIRTUAL 0x17
122 124
123/* deleted */ 125/* deleted */
124 126
@@ -147,6 +149,7 @@
147#define GRAPH_OBJECT_ENUM_ID5 0x05 149#define GRAPH_OBJECT_ENUM_ID5 0x05
148#define GRAPH_OBJECT_ENUM_ID6 0x06 150#define GRAPH_OBJECT_ENUM_ID6 0x06
149#define GRAPH_OBJECT_ENUM_ID7 0x07 151#define GRAPH_OBJECT_ENUM_ID7 0x07
152#define GRAPH_OBJECT_ENUM_VIRTUAL 0x08
150 153
151/****************************************************/ 154/****************************************************/
152/* Graphics Object ID Bit definition */ 155/* Graphics Object ID Bit definition */
@@ -408,6 +411,10 @@
408 GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 411 GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\
409 ENCODER_OBJECT_ID_HDMI_ANX9805 << OBJECT_ID_SHIFT) 412 ENCODER_OBJECT_ID_HDMI_ANX9805 << OBJECT_ID_SHIFT)
410 413
414#define ENCODER_VIRTUAL_ENUM_VIRTUAL ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
415 GRAPH_OBJECT_ENUM_VIRTUAL << ENUM_ID_SHIFT |\
416 ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT)
417
411/****************************************************/ 418/****************************************************/
412/* Connector Object ID definition - Shared with BIOS */ 419/* Connector Object ID definition - Shared with BIOS */
413/****************************************************/ 420/****************************************************/
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 700c56baf2de..039b57e4644c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -51,11 +51,13 @@
51#include "amdgpu_ih.h" 51#include "amdgpu_ih.h"
52#include "amdgpu_irq.h" 52#include "amdgpu_irq.h"
53#include "amdgpu_ucode.h" 53#include "amdgpu_ucode.h"
54#include "amdgpu_ttm.h"
54#include "amdgpu_gds.h" 55#include "amdgpu_gds.h"
55#include "amd_powerplay.h" 56#include "amd_powerplay.h"
56#include "amdgpu_acp.h" 57#include "amdgpu_acp.h"
57 58
58#include "gpu_scheduler.h" 59#include "gpu_scheduler.h"
60#include "amdgpu_virt.h"
59 61
60/* 62/*
61 * Modules parameters. 63 * Modules parameters.
@@ -63,6 +65,7 @@
63extern int amdgpu_modeset; 65extern int amdgpu_modeset;
64extern int amdgpu_vram_limit; 66extern int amdgpu_vram_limit;
65extern int amdgpu_gart_size; 67extern int amdgpu_gart_size;
68extern int amdgpu_moverate;
66extern int amdgpu_benchmarking; 69extern int amdgpu_benchmarking;
67extern int amdgpu_testing; 70extern int amdgpu_testing;
68extern int amdgpu_audio; 71extern int amdgpu_audio;
@@ -91,6 +94,9 @@ extern unsigned amdgpu_pcie_lane_cap;
91extern unsigned amdgpu_cg_mask; 94extern unsigned amdgpu_cg_mask;
92extern unsigned amdgpu_pg_mask; 95extern unsigned amdgpu_pg_mask;
93extern char *amdgpu_disable_cu; 96extern char *amdgpu_disable_cu;
97extern int amdgpu_sclk_deep_sleep_en;
98extern char *amdgpu_virtual_display;
99extern unsigned amdgpu_pp_feature_mask;
94 100
95#define AMDGPU_WAIT_IDLE_TIMEOUT_IN_MS 3000 101#define AMDGPU_WAIT_IDLE_TIMEOUT_IN_MS 3000
96#define AMDGPU_MAX_USEC_TIMEOUT 100000 /* 100 ms */ 102#define AMDGPU_MAX_USEC_TIMEOUT 100000 /* 100 ms */
@@ -105,7 +111,7 @@ extern char *amdgpu_disable_cu;
105#define AMDGPU_MAX_RINGS 16 111#define AMDGPU_MAX_RINGS 16
106#define AMDGPU_MAX_GFX_RINGS 1 112#define AMDGPU_MAX_GFX_RINGS 1
107#define AMDGPU_MAX_COMPUTE_RINGS 8 113#define AMDGPU_MAX_COMPUTE_RINGS 8
108#define AMDGPU_MAX_VCE_RINGS 2 114#define AMDGPU_MAX_VCE_RINGS 3
109 115
110/* max number of IP instances */ 116/* max number of IP instances */
111#define AMDGPU_MAX_SDMA_INSTANCES 2 117#define AMDGPU_MAX_SDMA_INSTANCES 2
@@ -248,10 +254,9 @@ struct amdgpu_vm_pte_funcs {
248 uint64_t pe, uint64_t src, 254 uint64_t pe, uint64_t src,
249 unsigned count); 255 unsigned count);
250 /* write pte one entry at a time with addr mapping */ 256 /* write pte one entry at a time with addr mapping */
251 void (*write_pte)(struct amdgpu_ib *ib, 257 void (*write_pte)(struct amdgpu_ib *ib, uint64_t pe,
252 const dma_addr_t *pages_addr, uint64_t pe, 258 uint64_t value, unsigned count,
253 uint64_t addr, unsigned count, 259 uint32_t incr);
254 uint32_t incr, uint32_t flags);
255 /* for linear pte/pde updates without addr mapping */ 260 /* for linear pte/pde updates without addr mapping */
256 void (*set_pte_pde)(struct amdgpu_ib *ib, 261 void (*set_pte_pde)(struct amdgpu_ib *ib,
257 uint64_t pe, 262 uint64_t pe,
@@ -316,6 +321,10 @@ struct amdgpu_ring_funcs {
316 /* note usage for clock and power gating */ 321 /* note usage for clock and power gating */
317 void (*begin_use)(struct amdgpu_ring *ring); 322 void (*begin_use)(struct amdgpu_ring *ring);
318 void (*end_use)(struct amdgpu_ring *ring); 323 void (*end_use)(struct amdgpu_ring *ring);
324 void (*emit_switch_buffer) (struct amdgpu_ring *ring);
325 void (*emit_cntxcntl) (struct amdgpu_ring *ring, uint32_t flags);
326 unsigned (*get_emit_ib_size) (struct amdgpu_ring *ring);
327 unsigned (*get_dma_frame_size) (struct amdgpu_ring *ring);
319}; 328};
320 329
321/* 330/*
@@ -396,48 +405,8 @@ int amdgpu_fence_wait_empty(struct amdgpu_ring *ring);
396unsigned amdgpu_fence_count_emitted(struct amdgpu_ring *ring); 405unsigned amdgpu_fence_count_emitted(struct amdgpu_ring *ring);
397 406
398/* 407/*
399 * TTM. 408 * BO.
400 */ 409 */
401
402#define AMDGPU_TTM_LRU_SIZE 20
403
404struct amdgpu_mman_lru {
405 struct list_head *lru[TTM_NUM_MEM_TYPES];
406 struct list_head *swap_lru;
407};
408
409struct amdgpu_mman {
410 struct ttm_bo_global_ref bo_global_ref;
411 struct drm_global_reference mem_global_ref;
412 struct ttm_bo_device bdev;
413 bool mem_global_referenced;
414 bool initialized;
415
416#if defined(CONFIG_DEBUG_FS)
417 struct dentry *vram;
418 struct dentry *gtt;
419#endif
420
421 /* buffer handling */
422 const struct amdgpu_buffer_funcs *buffer_funcs;
423 struct amdgpu_ring *buffer_funcs_ring;
424 /* Scheduler entity for buffer moves */
425 struct amd_sched_entity entity;
426
427 /* custom LRU management */
428 struct amdgpu_mman_lru log2_size[AMDGPU_TTM_LRU_SIZE];
429 /* guard for log2_size array, don't add anything in between */
430 struct amdgpu_mman_lru guard;
431};
432
433int amdgpu_copy_buffer(struct amdgpu_ring *ring,
434 uint64_t src_offset,
435 uint64_t dst_offset,
436 uint32_t byte_count,
437 struct reservation_object *resv,
438 struct fence **fence);
439int amdgpu_mmap(struct file *filp, struct vm_area_struct *vma);
440
441struct amdgpu_bo_list_entry { 410struct amdgpu_bo_list_entry {
442 struct amdgpu_bo *robj; 411 struct amdgpu_bo *robj;
443 struct ttm_validate_buffer tv; 412 struct ttm_validate_buffer tv;
@@ -476,8 +445,6 @@ struct amdgpu_bo_va {
476#define AMDGPU_GEM_DOMAIN_MAX 0x3 445#define AMDGPU_GEM_DOMAIN_MAX 0x3
477 446
478struct amdgpu_bo { 447struct amdgpu_bo {
479 /* Protected by gem.mutex */
480 struct list_head list;
481 /* Protected by tbo.reserved */ 448 /* Protected by tbo.reserved */
482 u32 prefered_domains; 449 u32 prefered_domains;
483 u32 allowed_domains; 450 u32 allowed_domains;
@@ -500,10 +467,12 @@ struct amdgpu_bo {
500 struct amdgpu_device *adev; 467 struct amdgpu_device *adev;
501 struct drm_gem_object gem_base; 468 struct drm_gem_object gem_base;
502 struct amdgpu_bo *parent; 469 struct amdgpu_bo *parent;
470 struct amdgpu_bo *shadow;
503 471
504 struct ttm_bo_kmap_obj dma_buf_vmap; 472 struct ttm_bo_kmap_obj dma_buf_vmap;
505 struct amdgpu_mn *mn; 473 struct amdgpu_mn *mn;
506 struct list_head mn_list; 474 struct list_head mn_list;
475 struct list_head shadow_list;
507}; 476};
508#define gem_to_amdgpu_bo(gobj) container_of((gobj), struct amdgpu_bo, gem_base) 477#define gem_to_amdgpu_bo(gobj) container_of((gobj), struct amdgpu_bo, gem_base)
509 478
@@ -653,6 +622,7 @@ void amdgpu_gart_unbind(struct amdgpu_device *adev, uint64_t offset,
653int amdgpu_gart_bind(struct amdgpu_device *adev, uint64_t offset, 622int amdgpu_gart_bind(struct amdgpu_device *adev, uint64_t offset,
654 int pages, struct page **pagelist, 623 int pages, struct page **pagelist,
655 dma_addr_t *dma_addr, uint32_t flags); 624 dma_addr_t *dma_addr, uint32_t flags);
625int amdgpu_ttm_recover_gart(struct amdgpu_device *adev);
656 626
657/* 627/*
658 * GPU MC structures, functions & helpers 628 * GPU MC structures, functions & helpers
@@ -679,6 +649,8 @@ struct amdgpu_mc {
679 uint32_t fw_version; 649 uint32_t fw_version;
680 struct amdgpu_irq_src vm_fault; 650 struct amdgpu_irq_src vm_fault;
681 uint32_t vram_type; 651 uint32_t vram_type;
652 uint32_t srbm_soft_reset;
653 struct amdgpu_mode_mc_save save;
682}; 654};
683 655
684/* 656/*
@@ -723,13 +695,14 @@ void amdgpu_doorbell_get_kfd_info(struct amdgpu_device *adev,
723 */ 695 */
724 696
725struct amdgpu_flip_work { 697struct amdgpu_flip_work {
726 struct work_struct flip_work; 698 struct delayed_work flip_work;
727 struct work_struct unpin_work; 699 struct work_struct unpin_work;
728 struct amdgpu_device *adev; 700 struct amdgpu_device *adev;
729 int crtc_id; 701 int crtc_id;
702 u32 target_vblank;
730 uint64_t base; 703 uint64_t base;
731 struct drm_pending_vblank_event *event; 704 struct drm_pending_vblank_event *event;
732 struct amdgpu_bo *old_rbo; 705 struct amdgpu_bo *old_abo;
733 struct fence *excl; 706 struct fence *excl;
734 unsigned shared_count; 707 unsigned shared_count;
735 struct fence **shared; 708 struct fence **shared;
@@ -817,13 +790,17 @@ struct amdgpu_ring {
817/* maximum number of VMIDs */ 790/* maximum number of VMIDs */
818#define AMDGPU_NUM_VM 16 791#define AMDGPU_NUM_VM 16
819 792
793/* Maximum number of PTEs the hardware can write with one command */
794#define AMDGPU_VM_MAX_UPDATE_SIZE 0x3FFFF
795
820/* number of entries in page table */ 796/* number of entries in page table */
821#define AMDGPU_VM_PTE_COUNT (1 << amdgpu_vm_block_size) 797#define AMDGPU_VM_PTE_COUNT (1 << amdgpu_vm_block_size)
822 798
823/* PTBs (Page Table Blocks) need to be aligned to 32K */ 799/* PTBs (Page Table Blocks) need to be aligned to 32K */
824#define AMDGPU_VM_PTB_ALIGN_SIZE 32768 800#define AMDGPU_VM_PTB_ALIGN_SIZE 32768
825#define AMDGPU_VM_PTB_ALIGN_MASK (AMDGPU_VM_PTB_ALIGN_SIZE - 1) 801
826#define AMDGPU_VM_PTB_ALIGN(a) (((a) + AMDGPU_VM_PTB_ALIGN_MASK) & ~AMDGPU_VM_PTB_ALIGN_MASK) 802/* LOG2 number of continuous pages for the fragment field */
803#define AMDGPU_LOG2_PAGES_PER_FRAG 4
827 804
828#define AMDGPU_PTE_VALID (1 << 0) 805#define AMDGPU_PTE_VALID (1 << 0)
829#define AMDGPU_PTE_SYSTEM (1 << 1) 806#define AMDGPU_PTE_SYSTEM (1 << 1)
@@ -835,10 +812,7 @@ struct amdgpu_ring {
835#define AMDGPU_PTE_READABLE (1 << 5) 812#define AMDGPU_PTE_READABLE (1 << 5)
836#define AMDGPU_PTE_WRITEABLE (1 << 6) 813#define AMDGPU_PTE_WRITEABLE (1 << 6)
837 814
838/* PTE (Page Table Entry) fragment field for different page sizes */ 815#define AMDGPU_PTE_FRAG(x) ((x & 0x1f) << 7)
839#define AMDGPU_PTE_FRAG_4KB (0 << 7)
840#define AMDGPU_PTE_FRAG_64KB (4 << 7)
841#define AMDGPU_LOG2_PAGES_PER_FRAG 4
842 816
843/* How to programm VM fault handling */ 817/* How to programm VM fault handling */
844#define AMDGPU_VM_FAULT_STOP_NEVER 0 818#define AMDGPU_VM_FAULT_STOP_NEVER 0
@@ -848,6 +822,7 @@ struct amdgpu_ring {
848struct amdgpu_vm_pt { 822struct amdgpu_vm_pt {
849 struct amdgpu_bo_list_entry entry; 823 struct amdgpu_bo_list_entry entry;
850 uint64_t addr; 824 uint64_t addr;
825 uint64_t shadow_addr;
851}; 826};
852 827
853struct amdgpu_vm { 828struct amdgpu_vm {
@@ -950,7 +925,6 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
950 struct amdgpu_job *job); 925 struct amdgpu_job *job);
951int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job); 926int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job);
952void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vm_id); 927void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vm_id);
953uint64_t amdgpu_vm_map_gart(const dma_addr_t *pages_addr, uint64_t addr);
954int amdgpu_vm_update_page_directory(struct amdgpu_device *adev, 928int amdgpu_vm_update_page_directory(struct amdgpu_device *adev,
955 struct amdgpu_vm *vm); 929 struct amdgpu_vm *vm);
956int amdgpu_vm_clear_freed(struct amdgpu_device *adev, 930int amdgpu_vm_clear_freed(struct amdgpu_device *adev,
@@ -959,7 +933,7 @@ int amdgpu_vm_clear_invalids(struct amdgpu_device *adev, struct amdgpu_vm *vm,
959 struct amdgpu_sync *sync); 933 struct amdgpu_sync *sync);
960int amdgpu_vm_bo_update(struct amdgpu_device *adev, 934int amdgpu_vm_bo_update(struct amdgpu_device *adev,
961 struct amdgpu_bo_va *bo_va, 935 struct amdgpu_bo_va *bo_va,
962 struct ttm_mem_reg *mem); 936 bool clear);
963void amdgpu_vm_bo_invalidate(struct amdgpu_device *adev, 937void amdgpu_vm_bo_invalidate(struct amdgpu_device *adev,
964 struct amdgpu_bo *bo); 938 struct amdgpu_bo *bo);
965struct amdgpu_bo_va *amdgpu_vm_bo_find(struct amdgpu_vm *vm, 939struct amdgpu_bo_va *amdgpu_vm_bo_find(struct amdgpu_vm *vm,
@@ -994,6 +968,7 @@ struct amdgpu_ctx {
994 spinlock_t ring_lock; 968 spinlock_t ring_lock;
995 struct fence **fences; 969 struct fence **fences;
996 struct amdgpu_ctx_ring rings[AMDGPU_MAX_RINGS]; 970 struct amdgpu_ctx_ring rings[AMDGPU_MAX_RINGS];
971 bool preamble_presented;
997}; 972};
998 973
999struct amdgpu_ctx_mgr { 974struct amdgpu_ctx_mgr {
@@ -1197,6 +1172,10 @@ struct amdgpu_gfx {
1197 unsigned ce_ram_size; 1172 unsigned ce_ram_size;
1198 struct amdgpu_cu_info cu_info; 1173 struct amdgpu_cu_info cu_info;
1199 const struct amdgpu_gfx_funcs *funcs; 1174 const struct amdgpu_gfx_funcs *funcs;
1175
1176 /* reset mask */
1177 uint32_t grbm_soft_reset;
1178 uint32_t srbm_soft_reset;
1200}; 1179};
1201 1180
1202int amdgpu_ib_get(struct amdgpu_device *adev, struct amdgpu_vm *vm, 1181int amdgpu_ib_get(struct amdgpu_device *adev, struct amdgpu_vm *vm,
@@ -1249,11 +1228,16 @@ struct amdgpu_cs_parser {
1249 struct fence *fence; 1228 struct fence *fence;
1250 uint64_t bytes_moved_threshold; 1229 uint64_t bytes_moved_threshold;
1251 uint64_t bytes_moved; 1230 uint64_t bytes_moved;
1231 struct amdgpu_bo_list_entry *evictable;
1252 1232
1253 /* user fence */ 1233 /* user fence */
1254 struct amdgpu_bo_list_entry uf_entry; 1234 struct amdgpu_bo_list_entry uf_entry;
1255}; 1235};
1256 1236
1237#define AMDGPU_PREAMBLE_IB_PRESENT (1 << 0) /* bit set means command submit involves a preamble IB */
1238#define AMDGPU_PREAMBLE_IB_PRESENT_FIRST (1 << 1) /* bit set means preamble IB is first presented in belonging context */
1239#define AMDGPU_HAVE_CTX_SWITCH (1 << 2) /* bit set means context switch occured */
1240
1257struct amdgpu_job { 1241struct amdgpu_job {
1258 struct amd_sched_job base; 1242 struct amd_sched_job base;
1259 struct amdgpu_device *adev; 1243 struct amdgpu_device *adev;
@@ -1262,9 +1246,10 @@ struct amdgpu_job {
1262 struct amdgpu_sync sync; 1246 struct amdgpu_sync sync;
1263 struct amdgpu_ib *ibs; 1247 struct amdgpu_ib *ibs;
1264 struct fence *fence; /* the hw fence */ 1248 struct fence *fence; /* the hw fence */
1249 uint32_t preamble_status;
1265 uint32_t num_ibs; 1250 uint32_t num_ibs;
1266 void *owner; 1251 void *owner;
1267 uint64_t ctx; 1252 uint64_t fence_ctx; /* the fence_context this job uses */
1268 bool vm_needs_flush; 1253 bool vm_needs_flush;
1269 unsigned vm_id; 1254 unsigned vm_id;
1270 uint64_t vm_pd_addr; 1255 uint64_t vm_pd_addr;
@@ -1685,6 +1670,7 @@ struct amdgpu_uvd {
1685 bool address_64_bit; 1670 bool address_64_bit;
1686 bool use_ctx_buf; 1671 bool use_ctx_buf;
1687 struct amd_sched_entity entity; 1672 struct amd_sched_entity entity;
1673 uint32_t srbm_soft_reset;
1688}; 1674};
1689 1675
1690/* 1676/*
@@ -1711,6 +1697,8 @@ struct amdgpu_vce {
1711 struct amdgpu_irq_src irq; 1697 struct amdgpu_irq_src irq;
1712 unsigned harvest_config; 1698 unsigned harvest_config;
1713 struct amd_sched_entity entity; 1699 struct amd_sched_entity entity;
1700 uint32_t srbm_soft_reset;
1701 unsigned num_rings;
1714}; 1702};
1715 1703
1716/* 1704/*
@@ -1728,9 +1716,14 @@ struct amdgpu_sdma_instance {
1728 1716
1729struct amdgpu_sdma { 1717struct amdgpu_sdma {
1730 struct amdgpu_sdma_instance instance[AMDGPU_MAX_SDMA_INSTANCES]; 1718 struct amdgpu_sdma_instance instance[AMDGPU_MAX_SDMA_INSTANCES];
1719#ifdef CONFIG_DRM_AMDGPU_SI
1720 //SI DMA has a difference trap irq number for the second engine
1721 struct amdgpu_irq_src trap_irq_1;
1722#endif
1731 struct amdgpu_irq_src trap_irq; 1723 struct amdgpu_irq_src trap_irq;
1732 struct amdgpu_irq_src illegal_inst_irq; 1724 struct amdgpu_irq_src illegal_inst_irq;
1733 int num_instances; 1725 int num_instances;
1726 uint32_t srbm_soft_reset;
1734}; 1727};
1735 1728
1736/* 1729/*
@@ -1832,6 +1825,7 @@ struct amdgpu_asic_funcs {
1832 bool (*read_disabled_bios)(struct amdgpu_device *adev); 1825 bool (*read_disabled_bios)(struct amdgpu_device *adev);
1833 bool (*read_bios_from_rom)(struct amdgpu_device *adev, 1826 bool (*read_bios_from_rom)(struct amdgpu_device *adev,
1834 u8 *bios, u32 length_bytes); 1827 u8 *bios, u32 length_bytes);
1828 void (*detect_hw_virtualization) (struct amdgpu_device *adev);
1835 int (*read_register)(struct amdgpu_device *adev, u32 se_num, 1829 int (*read_register)(struct amdgpu_device *adev, u32 se_num,
1836 u32 sh_num, u32 reg_offset, u32 *value); 1830 u32 sh_num, u32 reg_offset, u32 *value);
1837 void (*set_vga_state)(struct amdgpu_device *adev, bool state); 1831 void (*set_vga_state)(struct amdgpu_device *adev, bool state);
@@ -1841,8 +1835,9 @@ struct amdgpu_asic_funcs {
1841 /* MM block clocks */ 1835 /* MM block clocks */
1842 int (*set_uvd_clocks)(struct amdgpu_device *adev, u32 vclk, u32 dclk); 1836 int (*set_uvd_clocks)(struct amdgpu_device *adev, u32 vclk, u32 dclk);
1843 int (*set_vce_clocks)(struct amdgpu_device *adev, u32 evclk, u32 ecclk); 1837 int (*set_vce_clocks)(struct amdgpu_device *adev, u32 evclk, u32 ecclk);
1844 /* query virtual capabilities */ 1838 /* static power management */
1845 u32 (*get_virtual_caps)(struct amdgpu_device *adev); 1839 int (*get_pcie_lanes)(struct amdgpu_device *adev);
1840 void (*set_pcie_lanes)(struct amdgpu_device *adev, int lanes);
1846}; 1841};
1847 1842
1848/* 1843/*
@@ -1935,16 +1930,6 @@ struct amdgpu_atcs {
1935struct cgs_device *amdgpu_cgs_create_device(struct amdgpu_device *adev); 1930struct cgs_device *amdgpu_cgs_create_device(struct amdgpu_device *adev);
1936void amdgpu_cgs_destroy_device(struct cgs_device *cgs_device); 1931void amdgpu_cgs_destroy_device(struct cgs_device *cgs_device);
1937 1932
1938
1939/* GPU virtualization */
1940#define AMDGPU_VIRT_CAPS_SRIOV_EN (1 << 0)
1941#define AMDGPU_VIRT_CAPS_IS_VF (1 << 1)
1942struct amdgpu_virtualization {
1943 bool supports_sr_iov;
1944 bool is_virtual;
1945 u32 caps;
1946};
1947
1948/* 1933/*
1949 * Core structure, functions and helpers. 1934 * Core structure, functions and helpers.
1950 */ 1935 */
@@ -1958,6 +1943,8 @@ struct amdgpu_ip_block_status {
1958 bool valid; 1943 bool valid;
1959 bool sw; 1944 bool sw;
1960 bool hw; 1945 bool hw;
1946 bool late_initialized;
1947 bool hang;
1961}; 1948};
1962 1949
1963struct amdgpu_device { 1950struct amdgpu_device {
@@ -2016,6 +2003,8 @@ struct amdgpu_device {
2016 spinlock_t pcie_idx_lock; 2003 spinlock_t pcie_idx_lock;
2017 amdgpu_rreg_t pcie_rreg; 2004 amdgpu_rreg_t pcie_rreg;
2018 amdgpu_wreg_t pcie_wreg; 2005 amdgpu_wreg_t pcie_wreg;
2006 amdgpu_rreg_t pciep_rreg;
2007 amdgpu_wreg_t pciep_wreg;
2019 /* protects concurrent UVD register access */ 2008 /* protects concurrent UVD register access */
2020 spinlock_t uvd_ctx_idx_lock; 2009 spinlock_t uvd_ctx_idx_lock;
2021 amdgpu_rreg_t uvd_ctx_rreg; 2010 amdgpu_rreg_t uvd_ctx_rreg;
@@ -2056,7 +2045,16 @@ struct amdgpu_device {
2056 atomic64_t num_evictions; 2045 atomic64_t num_evictions;
2057 atomic_t gpu_reset_counter; 2046 atomic_t gpu_reset_counter;
2058 2047
2048 /* data for buffer migration throttling */
2049 struct {
2050 spinlock_t lock;
2051 s64 last_update_us;
2052 s64 accum_us; /* accumulated microseconds */
2053 u32 log2_max_MBps;
2054 } mm_stats;
2055
2059 /* display */ 2056 /* display */
2057 bool enable_virtual_display;
2060 struct amdgpu_mode_info mode_info; 2058 struct amdgpu_mode_info mode_info;
2061 struct work_struct hotplug_work; 2059 struct work_struct hotplug_work;
2062 struct amdgpu_irq_src crtc_irq; 2060 struct amdgpu_irq_src crtc_irq;
@@ -2119,6 +2117,14 @@ struct amdgpu_device {
2119 struct kfd_dev *kfd; 2117 struct kfd_dev *kfd;
2120 2118
2121 struct amdgpu_virtualization virtualization; 2119 struct amdgpu_virtualization virtualization;
2120
2121 /* link all shadow bo */
2122 struct list_head shadow_list;
2123 struct mutex shadow_list_lock;
2124 /* link all gtt */
2125 spinlock_t gtt_list_lock;
2126 struct list_head gtt_list;
2127
2122}; 2128};
2123 2129
2124bool amdgpu_device_is_px(struct drm_device *dev); 2130bool amdgpu_device_is_px(struct drm_device *dev);
@@ -2151,6 +2157,8 @@ void amdgpu_mm_wdoorbell(struct amdgpu_device *adev, u32 index, u32 v);
2151#define REG_GET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK) 2157#define REG_GET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK)
2152#define RREG32_PCIE(reg) adev->pcie_rreg(adev, (reg)) 2158#define RREG32_PCIE(reg) adev->pcie_rreg(adev, (reg))
2153#define WREG32_PCIE(reg, v) adev->pcie_wreg(adev, (reg), (v)) 2159#define WREG32_PCIE(reg, v) adev->pcie_wreg(adev, (reg), (v))
2160#define RREG32_PCIE_PORT(reg) adev->pciep_rreg(adev, (reg))
2161#define WREG32_PCIE_PORT(reg, v) adev->pciep_wreg(adev, (reg), (v))
2154#define RREG32_SMC(reg) adev->smc_rreg(adev, (reg)) 2162#define RREG32_SMC(reg) adev->smc_rreg(adev, (reg))
2155#define WREG32_SMC(reg, v) adev->smc_wreg(adev, (reg), (v)) 2163#define WREG32_SMC(reg, v) adev->smc_wreg(adev, (reg), (v))
2156#define RREG32_UVD_CTX(reg) adev->uvd_ctx_rreg(adev, (reg)) 2164#define RREG32_UVD_CTX(reg) adev->uvd_ctx_rreg(adev, (reg))
@@ -2194,6 +2202,9 @@ void amdgpu_mm_wdoorbell(struct amdgpu_device *adev, u32 index, u32 v);
2194#define REG_GET_FIELD(value, reg, field) \ 2202#define REG_GET_FIELD(value, reg, field) \
2195 (((value) & REG_FIELD_MASK(reg, field)) >> REG_FIELD_SHIFT(reg, field)) 2203 (((value) & REG_FIELD_MASK(reg, field)) >> REG_FIELD_SHIFT(reg, field))
2196 2204
2205#define WREG32_FIELD(reg, field, val) \
2206 WREG32(mm##reg, (RREG32(mm##reg) & ~REG_FIELD_MASK(reg, field)) | (val) << REG_FIELD_SHIFT(reg, field))
2207
2197/* 2208/*
2198 * BIOS helpers. 2209 * BIOS helpers.
2199 */ 2210 */
@@ -2237,14 +2248,17 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
2237#define amdgpu_asic_get_xclk(adev) (adev)->asic_funcs->get_xclk((adev)) 2248#define amdgpu_asic_get_xclk(adev) (adev)->asic_funcs->get_xclk((adev))
2238#define amdgpu_asic_set_uvd_clocks(adev, v, d) (adev)->asic_funcs->set_uvd_clocks((adev), (v), (d)) 2249#define amdgpu_asic_set_uvd_clocks(adev, v, d) (adev)->asic_funcs->set_uvd_clocks((adev), (v), (d))
2239#define amdgpu_asic_set_vce_clocks(adev, ev, ec) (adev)->asic_funcs->set_vce_clocks((adev), (ev), (ec)) 2250#define amdgpu_asic_set_vce_clocks(adev, ev, ec) (adev)->asic_funcs->set_vce_clocks((adev), (ev), (ec))
2240#define amdgpu_asic_get_virtual_caps(adev) ((adev)->asic_funcs->get_virtual_caps((adev))) 2251#define amdgpu_get_pcie_lanes(adev) (adev)->asic_funcs->get_pcie_lanes((adev))
2252#define amdgpu_set_pcie_lanes(adev, l) (adev)->asic_funcs->set_pcie_lanes((adev), (l))
2253#define amdgpu_asic_get_gpu_clock_counter(adev) (adev)->asic_funcs->get_gpu_clock_counter((adev))
2241#define amdgpu_asic_read_disabled_bios(adev) (adev)->asic_funcs->read_disabled_bios((adev)) 2254#define amdgpu_asic_read_disabled_bios(adev) (adev)->asic_funcs->read_disabled_bios((adev))
2242#define amdgpu_asic_read_bios_from_rom(adev, b, l) (adev)->asic_funcs->read_bios_from_rom((adev), (b), (l)) 2255#define amdgpu_asic_read_bios_from_rom(adev, b, l) (adev)->asic_funcs->read_bios_from_rom((adev), (b), (l))
2256#define amdgpu_asic_detect_hw_virtualization(adev) (adev)->asic_funcs->detect_hw_virtualization((adev))
2243#define amdgpu_asic_read_register(adev, se, sh, offset, v)((adev)->asic_funcs->read_register((adev), (se), (sh), (offset), (v))) 2257#define amdgpu_asic_read_register(adev, se, sh, offset, v)((adev)->asic_funcs->read_register((adev), (se), (sh), (offset), (v)))
2244#define amdgpu_gart_flush_gpu_tlb(adev, vmid) (adev)->gart.gart_funcs->flush_gpu_tlb((adev), (vmid)) 2258#define amdgpu_gart_flush_gpu_tlb(adev, vmid) (adev)->gart.gart_funcs->flush_gpu_tlb((adev), (vmid))
2245#define amdgpu_gart_set_pte_pde(adev, pt, idx, addr, flags) (adev)->gart.gart_funcs->set_pte_pde((adev), (pt), (idx), (addr), (flags)) 2259#define amdgpu_gart_set_pte_pde(adev, pt, idx, addr, flags) (adev)->gart.gart_funcs->set_pte_pde((adev), (pt), (idx), (addr), (flags))
2246#define amdgpu_vm_copy_pte(adev, ib, pe, src, count) ((adev)->vm_manager.vm_pte_funcs->copy_pte((ib), (pe), (src), (count))) 2260#define amdgpu_vm_copy_pte(adev, ib, pe, src, count) ((adev)->vm_manager.vm_pte_funcs->copy_pte((ib), (pe), (src), (count)))
2247#define amdgpu_vm_write_pte(adev, ib, pa, pe, addr, count, incr, flags) ((adev)->vm_manager.vm_pte_funcs->write_pte((ib), (pa), (pe), (addr), (count), (incr), (flags))) 2261#define amdgpu_vm_write_pte(adev, ib, pe, value, count, incr) ((adev)->vm_manager.vm_pte_funcs->write_pte((ib), (pe), (value), (count), (incr)))
2248#define amdgpu_vm_set_pte_pde(adev, ib, pe, addr, count, incr, flags) ((adev)->vm_manager.vm_pte_funcs->set_pte_pde((ib), (pe), (addr), (count), (incr), (flags))) 2262#define amdgpu_vm_set_pte_pde(adev, ib, pe, addr, count, incr, flags) ((adev)->vm_manager.vm_pte_funcs->set_pte_pde((ib), (pe), (addr), (count), (incr), (flags)))
2249#define amdgpu_ring_parse_cs(r, p, ib) ((r)->funcs->parse_cs((p), (ib))) 2263#define amdgpu_ring_parse_cs(r, p, ib) ((r)->funcs->parse_cs((p), (ib)))
2250#define amdgpu_ring_test_ring(r) (r)->funcs->test_ring((r)) 2264#define amdgpu_ring_test_ring(r) (r)->funcs->test_ring((r))
@@ -2259,9 +2273,13 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
2259#define amdgpu_ring_emit_gds_switch(r, v, db, ds, wb, ws, ab, as) (r)->funcs->emit_gds_switch((r), (v), (db), (ds), (wb), (ws), (ab), (as)) 2273#define amdgpu_ring_emit_gds_switch(r, v, db, ds, wb, ws, ab, as) (r)->funcs->emit_gds_switch((r), (v), (db), (ds), (wb), (ws), (ab), (as))
2260#define amdgpu_ring_emit_hdp_flush(r) (r)->funcs->emit_hdp_flush((r)) 2274#define amdgpu_ring_emit_hdp_flush(r) (r)->funcs->emit_hdp_flush((r))
2261#define amdgpu_ring_emit_hdp_invalidate(r) (r)->funcs->emit_hdp_invalidate((r)) 2275#define amdgpu_ring_emit_hdp_invalidate(r) (r)->funcs->emit_hdp_invalidate((r))
2276#define amdgpu_ring_emit_switch_buffer(r) (r)->funcs->emit_switch_buffer((r))
2277#define amdgpu_ring_emit_cntxcntl(r, d) (r)->funcs->emit_cntxcntl((r), (d))
2262#define amdgpu_ring_pad_ib(r, ib) ((r)->funcs->pad_ib((r), (ib))) 2278#define amdgpu_ring_pad_ib(r, ib) ((r)->funcs->pad_ib((r), (ib)))
2263#define amdgpu_ring_init_cond_exec(r) (r)->funcs->init_cond_exec((r)) 2279#define amdgpu_ring_init_cond_exec(r) (r)->funcs->init_cond_exec((r))
2264#define amdgpu_ring_patch_cond_exec(r,o) (r)->funcs->patch_cond_exec((r),(o)) 2280#define amdgpu_ring_patch_cond_exec(r,o) (r)->funcs->patch_cond_exec((r),(o))
2281#define amdgpu_ring_get_emit_ib_size(r) (r)->funcs->get_emit_ib_size((r))
2282#define amdgpu_ring_get_dma_frame_size(r) (r)->funcs->get_dma_frame_size((r))
2265#define amdgpu_ih_get_wptr(adev) (adev)->irq.ih_funcs->get_wptr((adev)) 2283#define amdgpu_ih_get_wptr(adev) (adev)->irq.ih_funcs->get_wptr((adev))
2266#define amdgpu_ih_decode_iv(adev, iv) (adev)->irq.ih_funcs->decode_iv((adev), (iv)) 2284#define amdgpu_ih_decode_iv(adev, iv) (adev)->irq.ih_funcs->decode_iv((adev), (iv))
2267#define amdgpu_ih_set_rptr(adev) (adev)->irq.ih_funcs->set_rptr((adev)) 2285#define amdgpu_ih_set_rptr(adev) (adev)->irq.ih_funcs->set_rptr((adev))
@@ -2293,6 +2311,11 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
2293#define amdgpu_gfx_get_gpu_clock_counter(adev) (adev)->gfx.funcs->get_gpu_clock_counter((adev)) 2311#define amdgpu_gfx_get_gpu_clock_counter(adev) (adev)->gfx.funcs->get_gpu_clock_counter((adev))
2294#define amdgpu_gfx_select_se_sh(adev, se, sh, instance) (adev)->gfx.funcs->select_se_sh((adev), (se), (sh), (instance)) 2312#define amdgpu_gfx_select_se_sh(adev, se, sh, instance) (adev)->gfx.funcs->select_se_sh((adev), (se), (sh), (instance))
2295 2313
2314#define amdgpu_dpm_read_sensor(adev, idx, value) \
2315 ((adev)->pp_enabled ? \
2316 (adev)->powerplay.pp_funcs->read_sensor(adev->powerplay.pp_handle, (idx), (value)) : \
2317 -EINVAL)
2318
2296#define amdgpu_dpm_get_temperature(adev) \ 2319#define amdgpu_dpm_get_temperature(adev) \
2297 ((adev)->pp_enabled ? \ 2320 ((adev)->pp_enabled ? \
2298 (adev)->powerplay.pp_funcs->get_temperature((adev)->powerplay.pp_handle) : \ 2321 (adev)->powerplay.pp_funcs->get_temperature((adev)->powerplay.pp_handle) : \
@@ -2344,11 +2367,6 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
2344 (adev)->powerplay.pp_funcs->powergate_vce((adev)->powerplay.pp_handle, (g)) : \ 2367 (adev)->powerplay.pp_funcs->powergate_vce((adev)->powerplay.pp_handle, (g)) : \
2345 (adev)->pm.funcs->powergate_vce((adev), (g))) 2368 (adev)->pm.funcs->powergate_vce((adev), (g)))
2346 2369
2347#define amdgpu_dpm_debugfs_print_current_performance_level(adev, m) \
2348 ((adev)->pp_enabled ? \
2349 (adev)->powerplay.pp_funcs->print_current_performance_level((adev)->powerplay.pp_handle, (m)) : \
2350 (adev)->pm.funcs->debugfs_print_current_performance_level((adev), (m)))
2351
2352#define amdgpu_dpm_get_current_power_state(adev) \ 2370#define amdgpu_dpm_get_current_power_state(adev) \
2353 (adev)->powerplay.pp_funcs->get_current_power_state((adev)->powerplay.pp_handle) 2371 (adev)->powerplay.pp_funcs->get_current_power_state((adev)->powerplay.pp_handle)
2354 2372
@@ -2389,6 +2407,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
2389 2407
2390/* Common functions */ 2408/* Common functions */
2391int amdgpu_gpu_reset(struct amdgpu_device *adev); 2409int amdgpu_gpu_reset(struct amdgpu_device *adev);
2410bool amdgpu_need_backup(struct amdgpu_device *adev);
2392void amdgpu_pci_config_reset(struct amdgpu_device *adev); 2411void amdgpu_pci_config_reset(struct amdgpu_device *adev);
2393bool amdgpu_card_posted(struct amdgpu_device *adev); 2412bool amdgpu_card_posted(struct amdgpu_device *adev);
2394void amdgpu_update_display_priority(struct amdgpu_device *adev); 2413void amdgpu_update_display_priority(struct amdgpu_device *adev);
@@ -2397,7 +2416,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data);
2397int amdgpu_cs_get_ring(struct amdgpu_device *adev, u32 ip_type, 2416int amdgpu_cs_get_ring(struct amdgpu_device *adev, u32 ip_type,
2398 u32 ip_instance, u32 ring, 2417 u32 ip_instance, u32 ring,
2399 struct amdgpu_ring **out_ring); 2418 struct amdgpu_ring **out_ring);
2400void amdgpu_ttm_placement_from_domain(struct amdgpu_bo *rbo, u32 domain); 2419void amdgpu_ttm_placement_from_domain(struct amdgpu_bo *abo, u32 domain);
2401bool amdgpu_ttm_bo_is_amdgpu_bo(struct ttm_buffer_object *bo); 2420bool amdgpu_ttm_bo_is_amdgpu_bo(struct ttm_buffer_object *bo);
2402int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages); 2421int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages);
2403int amdgpu_ttm_tt_set_userptr(struct ttm_tt *ttm, uint64_t addr, 2422int amdgpu_ttm_tt_set_userptr(struct ttm_tt *ttm, uint64_t addr,
@@ -2414,6 +2433,10 @@ uint32_t amdgpu_ttm_tt_pte_flags(struct amdgpu_device *adev, struct ttm_tt *ttm,
2414void amdgpu_vram_location(struct amdgpu_device *adev, struct amdgpu_mc *mc, u64 base); 2433void amdgpu_vram_location(struct amdgpu_device *adev, struct amdgpu_mc *mc, u64 base);
2415void amdgpu_gtt_location(struct amdgpu_device *adev, struct amdgpu_mc *mc); 2434void amdgpu_gtt_location(struct amdgpu_device *adev, struct amdgpu_mc *mc);
2416void amdgpu_ttm_set_active_vram_size(struct amdgpu_device *adev, u64 size); 2435void amdgpu_ttm_set_active_vram_size(struct amdgpu_device *adev, u64 size);
2436u64 amdgpu_ttm_get_gtt_mem_size(struct amdgpu_device *adev);
2437int amdgpu_ttm_global_init(struct amdgpu_device *adev);
2438int amdgpu_ttm_init(struct amdgpu_device *adev);
2439void amdgpu_ttm_fini(struct amdgpu_device *adev);
2417void amdgpu_program_register_sequence(struct amdgpu_device *adev, 2440void amdgpu_program_register_sequence(struct amdgpu_device *adev,
2418 const u32 *registers, 2441 const u32 *registers,
2419 const u32 array_size); 2442 const u32 array_size);
@@ -2425,11 +2448,13 @@ void amdgpu_register_atpx_handler(void);
2425void amdgpu_unregister_atpx_handler(void); 2448void amdgpu_unregister_atpx_handler(void);
2426bool amdgpu_has_atpx_dgpu_power_cntl(void); 2449bool amdgpu_has_atpx_dgpu_power_cntl(void);
2427bool amdgpu_is_atpx_hybrid(void); 2450bool amdgpu_is_atpx_hybrid(void);
2451bool amdgpu_atpx_dgpu_req_power_for_displays(void);
2428#else 2452#else
2429static inline void amdgpu_register_atpx_handler(void) {} 2453static inline void amdgpu_register_atpx_handler(void) {}
2430static inline void amdgpu_unregister_atpx_handler(void) {} 2454static inline void amdgpu_unregister_atpx_handler(void) {}
2431static inline bool amdgpu_has_atpx_dgpu_power_cntl(void) { return false; } 2455static inline bool amdgpu_has_atpx_dgpu_power_cntl(void) { return false; }
2432static inline bool amdgpu_is_atpx_hybrid(void) { return false; } 2456static inline bool amdgpu_is_atpx_hybrid(void) { return false; }
2457static inline bool amdgpu_atpx_dgpu_req_power_for_displays(void) { return false; }
2433#endif 2458#endif
2434 2459
2435/* 2460/*
@@ -2446,8 +2471,8 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
2446 struct drm_file *file_priv); 2471 struct drm_file *file_priv);
2447void amdgpu_driver_preclose_kms(struct drm_device *dev, 2472void amdgpu_driver_preclose_kms(struct drm_device *dev,
2448 struct drm_file *file_priv); 2473 struct drm_file *file_priv);
2449int amdgpu_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon); 2474int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon);
2450int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon); 2475int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon);
2451u32 amdgpu_get_vblank_counter_kms(struct drm_device *dev, unsigned int pipe); 2476u32 amdgpu_get_vblank_counter_kms(struct drm_device *dev, unsigned int pipe);
2452int amdgpu_enable_vblank_kms(struct drm_device *dev, unsigned int pipe); 2477int amdgpu_enable_vblank_kms(struct drm_device *dev, unsigned int pipe);
2453void amdgpu_disable_vblank_kms(struct drm_device *dev, unsigned int pipe); 2478void amdgpu_disable_vblank_kms(struct drm_device *dev, unsigned int pipe);
@@ -2493,6 +2518,7 @@ static inline void amdgpu_acpi_fini(struct amdgpu_device *adev) { }
2493struct amdgpu_bo_va_mapping * 2518struct amdgpu_bo_va_mapping *
2494amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser, 2519amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
2495 uint64_t addr, struct amdgpu_bo **bo); 2520 uint64_t addr, struct amdgpu_bo **bo);
2521int amdgpu_cs_sysvm_access_required(struct amdgpu_cs_parser *parser);
2496 2522
2497#include "amdgpu_object.h" 2523#include "amdgpu_object.h"
2498#endif 2524#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
index 5cd7b736a9de..5796539a0bcb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
@@ -25,6 +25,7 @@
25#include <linux/acpi.h> 25#include <linux/acpi.h>
26#include <linux/slab.h> 26#include <linux/slab.h>
27#include <linux/power_supply.h> 27#include <linux/power_supply.h>
28#include <linux/pm_runtime.h>
28#include <acpi/video.h> 29#include <acpi/video.h>
29#include <drm/drmP.h> 30#include <drm/drmP.h>
30#include <drm/drm_crtc_helper.h> 31#include <drm/drm_crtc_helper.h>
@@ -333,6 +334,16 @@ int amdgpu_atif_handler(struct amdgpu_device *adev,
333#endif 334#endif
334 } 335 }
335 } 336 }
337 if (req.pending & ATIF_DGPU_DISPLAY_EVENT) {
338 if ((adev->flags & AMD_IS_PX) &&
339 amdgpu_atpx_dgpu_req_power_for_displays()) {
340 pm_runtime_get_sync(adev->ddev->dev);
341 /* Just fire off a uevent and let userspace tell us what to do */
342 drm_helper_hpd_irq_event(adev->ddev);
343 pm_runtime_mark_last_busy(adev->ddev->dev);
344 pm_runtime_put_autosuspend(adev->ddev->dev);
345 }
346 }
336 /* TODO: check other events */ 347 /* TODO: check other events */
337 348
338 /* We've handled the event, stop the notifier chain. The ACPI interface 349 /* We've handled the event, stop the notifier chain. The ACPI interface
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
index d080d0807a5b..dba8a5b25e66 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
@@ -143,14 +143,6 @@ int amdgpu_amdkfd_resume(struct amdgpu_device *rdev)
143 return r; 143 return r;
144} 144}
145 145
146u32 pool_to_domain(enum kgd_memory_pool p)
147{
148 switch (p) {
149 case KGD_POOL_FRAMEBUFFER: return AMDGPU_GEM_DOMAIN_VRAM;
150 default: return AMDGPU_GEM_DOMAIN_GTT;
151 }
152}
153
154int alloc_gtt_mem(struct kgd_dev *kgd, size_t size, 146int alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
155 void **mem_obj, uint64_t *gpu_addr, 147 void **mem_obj, uint64_t *gpu_addr,
156 void **cpu_ptr) 148 void **cpu_ptr)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
index 362bedc9e507..1a0a5f7cccbc 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
@@ -103,11 +103,11 @@ static bool kgd_hqd_is_occupied(struct kgd_dev *kgd, uint64_t queue_address,
103 uint32_t pipe_id, uint32_t queue_id); 103 uint32_t pipe_id, uint32_t queue_id);
104 104
105static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type, 105static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
106 unsigned int timeout, uint32_t pipe_id, 106 unsigned int utimeout, uint32_t pipe_id,
107 uint32_t queue_id); 107 uint32_t queue_id);
108static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd); 108static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd);
109static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd, 109static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
110 unsigned int timeout); 110 unsigned int utimeout);
111static int kgd_address_watch_disable(struct kgd_dev *kgd); 111static int kgd_address_watch_disable(struct kgd_dev *kgd);
112static int kgd_address_watch_execute(struct kgd_dev *kgd, 112static int kgd_address_watch_execute(struct kgd_dev *kgd,
113 unsigned int watch_point_id, 113 unsigned int watch_point_id,
@@ -437,11 +437,12 @@ static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd)
437} 437}
438 438
439static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type, 439static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
440 unsigned int timeout, uint32_t pipe_id, 440 unsigned int utimeout, uint32_t pipe_id,
441 uint32_t queue_id) 441 uint32_t queue_id)
442{ 442{
443 struct amdgpu_device *adev = get_amdgpu_device(kgd); 443 struct amdgpu_device *adev = get_amdgpu_device(kgd);
444 uint32_t temp; 444 uint32_t temp;
445 int timeout = utimeout;
445 446
446 acquire_queue(kgd, pipe_id, queue_id); 447 acquire_queue(kgd, pipe_id, queue_id);
447 WREG32(mmCP_HQD_PQ_DOORBELL_CONTROL, 0); 448 WREG32(mmCP_HQD_PQ_DOORBELL_CONTROL, 0);
@@ -452,9 +453,8 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
452 temp = RREG32(mmCP_HQD_ACTIVE); 453 temp = RREG32(mmCP_HQD_ACTIVE);
453 if (temp & CP_HQD_ACTIVE__ACTIVE_MASK) 454 if (temp & CP_HQD_ACTIVE__ACTIVE_MASK)
454 break; 455 break;
455 if (timeout == 0) { 456 if (timeout <= 0) {
456 pr_err("kfd: cp queue preemption time out (%dms)\n", 457 pr_err("kfd: cp queue preemption time out.\n");
457 temp);
458 release_queue(kgd); 458 release_queue(kgd);
459 return -ETIME; 459 return -ETIME;
460 } 460 }
@@ -467,12 +467,13 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
467} 467}
468 468
469static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd, 469static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
470 unsigned int timeout) 470 unsigned int utimeout)
471{ 471{
472 struct amdgpu_device *adev = get_amdgpu_device(kgd); 472 struct amdgpu_device *adev = get_amdgpu_device(kgd);
473 struct cik_sdma_rlc_registers *m; 473 struct cik_sdma_rlc_registers *m;
474 uint32_t sdma_base_addr; 474 uint32_t sdma_base_addr;
475 uint32_t temp; 475 uint32_t temp;
476 int timeout = utimeout;
476 477
477 m = get_sdma_mqd(mqd); 478 m = get_sdma_mqd(mqd);
478 sdma_base_addr = get_sdma_base_addr(m); 479 sdma_base_addr = get_sdma_base_addr(m);
@@ -485,7 +486,7 @@ static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
485 temp = RREG32(sdma_base_addr + mmSDMA0_RLC0_CONTEXT_STATUS); 486 temp = RREG32(sdma_base_addr + mmSDMA0_RLC0_CONTEXT_STATUS);
486 if (temp & SDMA0_STATUS_REG__RB_CMD_IDLE__SHIFT) 487 if (temp & SDMA0_STATUS_REG__RB_CMD_IDLE__SHIFT)
487 break; 488 break;
488 if (timeout == 0) 489 if (timeout <= 0)
489 return -ETIME; 490 return -ETIME;
490 msleep(20); 491 msleep(20);
491 timeout -= 20; 492 timeout -= 20;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
index 04b744d64b57..6697612239c2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
@@ -62,10 +62,10 @@ static bool kgd_hqd_is_occupied(struct kgd_dev *kgd, uint64_t queue_address,
62 uint32_t pipe_id, uint32_t queue_id); 62 uint32_t pipe_id, uint32_t queue_id);
63static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd); 63static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd);
64static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type, 64static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
65 unsigned int timeout, uint32_t pipe_id, 65 unsigned int utimeout, uint32_t pipe_id,
66 uint32_t queue_id); 66 uint32_t queue_id);
67static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd, 67static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
68 unsigned int timeout); 68 unsigned int utimeout);
69static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid); 69static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid);
70static int kgd_address_watch_disable(struct kgd_dev *kgd); 70static int kgd_address_watch_disable(struct kgd_dev *kgd);
71static int kgd_address_watch_execute(struct kgd_dev *kgd, 71static int kgd_address_watch_execute(struct kgd_dev *kgd,
@@ -349,11 +349,12 @@ static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd)
349} 349}
350 350
351static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type, 351static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
352 unsigned int timeout, uint32_t pipe_id, 352 unsigned int utimeout, uint32_t pipe_id,
353 uint32_t queue_id) 353 uint32_t queue_id)
354{ 354{
355 struct amdgpu_device *adev = get_amdgpu_device(kgd); 355 struct amdgpu_device *adev = get_amdgpu_device(kgd);
356 uint32_t temp; 356 uint32_t temp;
357 int timeout = utimeout;
357 358
358 acquire_queue(kgd, pipe_id, queue_id); 359 acquire_queue(kgd, pipe_id, queue_id);
359 360
@@ -363,9 +364,8 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
363 temp = RREG32(mmCP_HQD_ACTIVE); 364 temp = RREG32(mmCP_HQD_ACTIVE);
364 if (temp & CP_HQD_ACTIVE__ACTIVE_MASK) 365 if (temp & CP_HQD_ACTIVE__ACTIVE_MASK)
365 break; 366 break;
366 if (timeout == 0) { 367 if (timeout <= 0) {
367 pr_err("kfd: cp queue preemption time out (%dms)\n", 368 pr_err("kfd: cp queue preemption time out.\n");
368 temp);
369 release_queue(kgd); 369 release_queue(kgd);
370 return -ETIME; 370 return -ETIME;
371 } 371 }
@@ -378,12 +378,13 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
378} 378}
379 379
380static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd, 380static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
381 unsigned int timeout) 381 unsigned int utimeout)
382{ 382{
383 struct amdgpu_device *adev = get_amdgpu_device(kgd); 383 struct amdgpu_device *adev = get_amdgpu_device(kgd);
384 struct cik_sdma_rlc_registers *m; 384 struct cik_sdma_rlc_registers *m;
385 uint32_t sdma_base_addr; 385 uint32_t sdma_base_addr;
386 uint32_t temp; 386 uint32_t temp;
387 int timeout = utimeout;
387 388
388 m = get_sdma_mqd(mqd); 389 m = get_sdma_mqd(mqd);
389 sdma_base_addr = get_sdma_base_addr(m); 390 sdma_base_addr = get_sdma_base_addr(m);
@@ -396,7 +397,7 @@ static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
396 temp = RREG32(sdma_base_addr + mmSDMA0_RLC0_CONTEXT_STATUS); 397 temp = RREG32(sdma_base_addr + mmSDMA0_RLC0_CONTEXT_STATUS);
397 if (temp & SDMA0_STATUS_REG__RB_CMD_IDLE__SHIFT) 398 if (temp & SDMA0_STATUS_REG__RB_CMD_IDLE__SHIFT)
398 break; 399 break;
399 if (timeout == 0) 400 if (timeout <= 0)
400 return -ETIME; 401 return -ETIME;
401 msleep(20); 402 msleep(20);
402 timeout -= 20; 403 timeout -= 20;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
index fe872b82e619..8e6bf548d689 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
@@ -259,6 +259,33 @@ static const int object_connector_convert[] = {
259 DRM_MODE_CONNECTOR_Unknown 259 DRM_MODE_CONNECTOR_Unknown
260}; 260};
261 261
262bool amdgpu_atombios_has_dce_engine_info(struct amdgpu_device *adev)
263{
264 struct amdgpu_mode_info *mode_info = &adev->mode_info;
265 struct atom_context *ctx = mode_info->atom_context;
266 int index = GetIndexIntoMasterTable(DATA, Object_Header);
267 u16 size, data_offset;
268 u8 frev, crev;
269 ATOM_DISPLAY_OBJECT_PATH_TABLE *path_obj;
270 ATOM_OBJECT_HEADER *obj_header;
271
272 if (!amdgpu_atom_parse_data_header(ctx, index, &size, &frev, &crev, &data_offset))
273 return false;
274
275 if (crev < 2)
276 return false;
277
278 obj_header = (ATOM_OBJECT_HEADER *) (ctx->bios + data_offset);
279 path_obj = (ATOM_DISPLAY_OBJECT_PATH_TABLE *)
280 (ctx->bios + data_offset +
281 le16_to_cpu(obj_header->usDisplayPathTableOffset));
282
283 if (path_obj->ucNumOfDispPath)
284 return true;
285 else
286 return false;
287}
288
262bool amdgpu_atombios_get_connector_info_from_object_table(struct amdgpu_device *adev) 289bool amdgpu_atombios_get_connector_info_from_object_table(struct amdgpu_device *adev)
263{ 290{
264 struct amdgpu_mode_info *mode_info = &adev->mode_info; 291 struct amdgpu_mode_info *mode_info = &adev->mode_info;
@@ -964,6 +991,48 @@ int amdgpu_atombios_get_clock_dividers(struct amdgpu_device *adev,
964 return -EINVAL; 991 return -EINVAL;
965 992
966 switch (crev) { 993 switch (crev) {
994 case 2:
995 case 3:
996 case 5:
997 /* r6xx, r7xx, evergreen, ni, si.
998 * TODO: add support for asic_type <= CHIP_RV770*/
999 if (clock_type == COMPUTE_ENGINE_PLL_PARAM) {
1000 args.v3.ulClockParams = cpu_to_le32((clock_type << 24) | clock);
1001
1002 amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
1003
1004 dividers->post_div = args.v3.ucPostDiv;
1005 dividers->enable_post_div = (args.v3.ucCntlFlag &
1006 ATOM_PLL_CNTL_FLAG_PLL_POST_DIV_EN) ? true : false;
1007 dividers->enable_dithen = (args.v3.ucCntlFlag &
1008 ATOM_PLL_CNTL_FLAG_FRACTION_DISABLE) ? false : true;
1009 dividers->whole_fb_div = le16_to_cpu(args.v3.ulFbDiv.usFbDiv);
1010 dividers->frac_fb_div = le16_to_cpu(args.v3.ulFbDiv.usFbDivFrac);
1011 dividers->ref_div = args.v3.ucRefDiv;
1012 dividers->vco_mode = (args.v3.ucCntlFlag &
1013 ATOM_PLL_CNTL_FLAG_MPLL_VCO_MODE) ? 1 : 0;
1014 } else {
1015 /* for SI we use ComputeMemoryClockParam for memory plls */
1016 if (adev->asic_type >= CHIP_TAHITI)
1017 return -EINVAL;
1018 args.v5.ulClockParams = cpu_to_le32((clock_type << 24) | clock);
1019 if (strobe_mode)
1020 args.v5.ucInputFlag = ATOM_PLL_INPUT_FLAG_PLL_STROBE_MODE_EN;
1021
1022 amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
1023
1024 dividers->post_div = args.v5.ucPostDiv;
1025 dividers->enable_post_div = (args.v5.ucCntlFlag &
1026 ATOM_PLL_CNTL_FLAG_PLL_POST_DIV_EN) ? true : false;
1027 dividers->enable_dithen = (args.v5.ucCntlFlag &
1028 ATOM_PLL_CNTL_FLAG_FRACTION_DISABLE) ? false : true;
1029 dividers->whole_fb_div = le16_to_cpu(args.v5.ulFbDiv.usFbDiv);
1030 dividers->frac_fb_div = le16_to_cpu(args.v5.ulFbDiv.usFbDivFrac);
1031 dividers->ref_div = args.v5.ucRefDiv;
1032 dividers->vco_mode = (args.v5.ucCntlFlag &
1033 ATOM_PLL_CNTL_FLAG_MPLL_VCO_MODE) ? 1 : 0;
1034 }
1035 break;
967 case 4: 1036 case 4:
968 /* fusion */ 1037 /* fusion */
969 args.v4.ulClock = cpu_to_le32(clock); /* 10 khz */ 1038 args.v4.ulClock = cpu_to_le32(clock); /* 10 khz */
@@ -1108,6 +1177,32 @@ void amdgpu_atombios_set_engine_dram_timings(struct amdgpu_device *adev,
1108 amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args); 1177 amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
1109} 1178}
1110 1179
1180void amdgpu_atombios_get_default_voltages(struct amdgpu_device *adev,
1181 u16 *vddc, u16 *vddci, u16 *mvdd)
1182{
1183 struct amdgpu_mode_info *mode_info = &adev->mode_info;
1184 int index = GetIndexIntoMasterTable(DATA, FirmwareInfo);
1185 u8 frev, crev;
1186 u16 data_offset;
1187 union firmware_info *firmware_info;
1188
1189 *vddc = 0;
1190 *vddci = 0;
1191 *mvdd = 0;
1192
1193 if (amdgpu_atom_parse_data_header(mode_info->atom_context, index, NULL,
1194 &frev, &crev, &data_offset)) {
1195 firmware_info =
1196 (union firmware_info *)(mode_info->atom_context->bios +
1197 data_offset);
1198 *vddc = le16_to_cpu(firmware_info->info_14.usBootUpVDDCVoltage);
1199 if ((frev == 2) && (crev >= 2)) {
1200 *vddci = le16_to_cpu(firmware_info->info_22.usBootUpVDDCIVoltage);
1201 *mvdd = le16_to_cpu(firmware_info->info_22.usBootUpMVDDCVoltage);
1202 }
1203 }
1204}
1205
1111union set_voltage { 1206union set_voltage {
1112 struct _SET_VOLTAGE_PS_ALLOCATION alloc; 1207 struct _SET_VOLTAGE_PS_ALLOCATION alloc;
1113 struct _SET_VOLTAGE_PARAMETERS v1; 1208 struct _SET_VOLTAGE_PARAMETERS v1;
@@ -1115,6 +1210,52 @@ union set_voltage {
1115 struct _SET_VOLTAGE_PARAMETERS_V1_3 v3; 1210 struct _SET_VOLTAGE_PARAMETERS_V1_3 v3;
1116}; 1211};
1117 1212
1213int amdgpu_atombios_get_max_vddc(struct amdgpu_device *adev, u8 voltage_type,
1214 u16 voltage_id, u16 *voltage)
1215{
1216 union set_voltage args;
1217 int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
1218 u8 frev, crev;
1219
1220 if (!amdgpu_atom_parse_cmd_header(adev->mode_info.atom_context, index, &frev, &crev))
1221 return -EINVAL;
1222
1223 switch (crev) {
1224 case 1:
1225 return -EINVAL;
1226 case 2:
1227 args.v2.ucVoltageType = SET_VOLTAGE_GET_MAX_VOLTAGE;
1228 args.v2.ucVoltageMode = 0;
1229 args.v2.usVoltageLevel = 0;
1230
1231 amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
1232
1233 *voltage = le16_to_cpu(args.v2.usVoltageLevel);
1234 break;
1235 case 3:
1236 args.v3.ucVoltageType = voltage_type;
1237 args.v3.ucVoltageMode = ATOM_GET_VOLTAGE_LEVEL;
1238 args.v3.usVoltageLevel = cpu_to_le16(voltage_id);
1239
1240 amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
1241
1242 *voltage = le16_to_cpu(args.v3.usVoltageLevel);
1243 break;
1244 default:
1245 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
1246 return -EINVAL;
1247 }
1248
1249 return 0;
1250}
1251
1252int amdgpu_atombios_get_leakage_vddc_based_on_leakage_idx(struct amdgpu_device *adev,
1253 u16 *voltage,
1254 u16 leakage_idx)
1255{
1256 return amdgpu_atombios_get_max_vddc(adev, VOLTAGE_TYPE_VDDC, leakage_idx, voltage);
1257}
1258
1118void amdgpu_atombios_set_voltage(struct amdgpu_device *adev, 1259void amdgpu_atombios_set_voltage(struct amdgpu_device *adev,
1119 u16 voltage_level, 1260 u16 voltage_level,
1120 u8 voltage_type) 1261 u8 voltage_type)
@@ -1335,6 +1476,50 @@ static ATOM_VOLTAGE_OBJECT_V3 *amdgpu_atombios_lookup_voltage_object_v3(ATOM_VOL
1335 return NULL; 1476 return NULL;
1336} 1477}
1337 1478
1479int amdgpu_atombios_get_svi2_info(struct amdgpu_device *adev,
1480 u8 voltage_type,
1481 u8 *svd_gpio_id, u8 *svc_gpio_id)
1482{
1483 int index = GetIndexIntoMasterTable(DATA, VoltageObjectInfo);
1484 u8 frev, crev;
1485 u16 data_offset, size;
1486 union voltage_object_info *voltage_info;
1487 union voltage_object *voltage_object = NULL;
1488
1489 if (amdgpu_atom_parse_data_header(adev->mode_info.atom_context, index, &size,
1490 &frev, &crev, &data_offset)) {
1491 voltage_info = (union voltage_object_info *)
1492 (adev->mode_info.atom_context->bios + data_offset);
1493
1494 switch (frev) {
1495 case 3:
1496 switch (crev) {
1497 case 1:
1498 voltage_object = (union voltage_object *)
1499 amdgpu_atombios_lookup_voltage_object_v3(&voltage_info->v3,
1500 voltage_type,
1501 VOLTAGE_OBJ_SVID2);
1502 if (voltage_object) {
1503 *svd_gpio_id = voltage_object->v3.asSVID2Obj.ucSVDGpioId;
1504 *svc_gpio_id = voltage_object->v3.asSVID2Obj.ucSVCGpioId;
1505 } else {
1506 return -EINVAL;
1507 }
1508 break;
1509 default:
1510 DRM_ERROR("unknown voltage object table\n");
1511 return -EINVAL;
1512 }
1513 break;
1514 default:
1515 DRM_ERROR("unknown voltage object table\n");
1516 return -EINVAL;
1517 }
1518
1519 }
1520 return 0;
1521}
1522
1338bool 1523bool
1339amdgpu_atombios_is_voltage_gpio(struct amdgpu_device *adev, 1524amdgpu_atombios_is_voltage_gpio(struct amdgpu_device *adev,
1340 u8 voltage_type, u8 voltage_mode) 1525 u8 voltage_type, u8 voltage_mode)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.h
index 8c2e69661799..17356151db38 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.h
@@ -140,6 +140,8 @@ struct amdgpu_i2c_bus_rec amdgpu_atombios_lookup_i2c_gpio(struct amdgpu_device *
140 uint8_t id); 140 uint8_t id);
141void amdgpu_atombios_i2c_init(struct amdgpu_device *adev); 141void amdgpu_atombios_i2c_init(struct amdgpu_device *adev);
142 142
143bool amdgpu_atombios_has_dce_engine_info(struct amdgpu_device *adev);
144
143bool amdgpu_atombios_get_connector_info_from_object_table(struct amdgpu_device *adev); 145bool amdgpu_atombios_get_connector_info_from_object_table(struct amdgpu_device *adev);
144 146
145int amdgpu_atombios_get_clock_info(struct amdgpu_device *adev); 147int amdgpu_atombios_get_clock_info(struct amdgpu_device *adev);
@@ -206,5 +208,19 @@ void amdgpu_atombios_scratch_regs_save(struct amdgpu_device *adev);
206void amdgpu_atombios_scratch_regs_restore(struct amdgpu_device *adev); 208void amdgpu_atombios_scratch_regs_restore(struct amdgpu_device *adev);
207 209
208void amdgpu_atombios_copy_swap(u8 *dst, u8 *src, u8 num_bytes, bool to_le); 210void amdgpu_atombios_copy_swap(u8 *dst, u8 *src, u8 num_bytes, bool to_le);
209 211int amdgpu_atombios_get_max_vddc(struct amdgpu_device *adev, u8 voltage_type,
212 u16 voltage_id, u16 *voltage);
213int amdgpu_atombios_get_leakage_vddc_based_on_leakage_idx(struct amdgpu_device *adev,
214 u16 *voltage,
215 u16 leakage_idx);
216void amdgpu_atombios_get_default_voltages(struct amdgpu_device *adev,
217 u16 *vddc, u16 *vddci, u16 *mvdd);
218int amdgpu_atombios_get_clock_dividers(struct amdgpu_device *adev,
219 u8 clock_type,
220 u32 clock,
221 bool strobe_mode,
222 struct atom_clock_dividers *dividers);
223int amdgpu_atombios_get_svi2_info(struct amdgpu_device *adev,
224 u8 voltage_type,
225 u8 *svd_gpio_id, u8 *svc_gpio_id);
210#endif 226#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
index 10b5ddf2c588..dae35a96a694 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
@@ -29,6 +29,7 @@ struct amdgpu_atpx {
29 acpi_handle handle; 29 acpi_handle handle;
30 struct amdgpu_atpx_functions functions; 30 struct amdgpu_atpx_functions functions;
31 bool is_hybrid; 31 bool is_hybrid;
32 bool dgpu_req_power_for_displays;
32}; 33};
33 34
34static struct amdgpu_atpx_priv { 35static struct amdgpu_atpx_priv {
@@ -73,6 +74,10 @@ bool amdgpu_is_atpx_hybrid(void) {
73 return amdgpu_atpx_priv.atpx.is_hybrid; 74 return amdgpu_atpx_priv.atpx.is_hybrid;
74} 75}
75 76
77bool amdgpu_atpx_dgpu_req_power_for_displays(void) {
78 return amdgpu_atpx_priv.atpx.dgpu_req_power_for_displays;
79}
80
76/** 81/**
77 * amdgpu_atpx_call - call an ATPX method 82 * amdgpu_atpx_call - call an ATPX method
78 * 83 *
@@ -204,6 +209,10 @@ static int amdgpu_atpx_validate(struct amdgpu_atpx *atpx)
204 atpx->is_hybrid = true; 209 atpx->is_hybrid = true;
205 } 210 }
206 211
212 atpx->dgpu_req_power_for_displays = false;
213 if (valid_bits & ATPX_DGPU_REQ_POWER_FOR_DISPLAYS)
214 atpx->dgpu_req_power_for_displays = true;
215
207 return 0; 216 return 0;
208} 217}
209 218
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
index 33e47a43ae32..345305235349 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
@@ -39,7 +39,8 @@ static int amdgpu_benchmark_do_move(struct amdgpu_device *adev, unsigned size,
39 start_jiffies = jiffies; 39 start_jiffies = jiffies;
40 for (i = 0; i < n; i++) { 40 for (i = 0; i < n; i++) {
41 struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring; 41 struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
42 r = amdgpu_copy_buffer(ring, saddr, daddr, size, NULL, &fence); 42 r = amdgpu_copy_buffer(ring, saddr, daddr, size, NULL, &fence,
43 false);
43 if (r) 44 if (r)
44 goto exit_do_move; 45 goto exit_do_move;
45 r = fence_wait(fence, false); 46 r = fence_wait(fence, false);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
index bc0440f7a31d..7a8bfa34682f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
@@ -616,7 +616,7 @@ static int amdgpu_cgs_irq_put(struct cgs_device *cgs_device, unsigned src_id, un
616 return amdgpu_irq_put(adev, adev->irq.sources[src_id], type); 616 return amdgpu_irq_put(adev, adev->irq.sources[src_id], type);
617} 617}
618 618
619int amdgpu_cgs_set_clockgating_state(struct cgs_device *cgs_device, 619static int amdgpu_cgs_set_clockgating_state(struct cgs_device *cgs_device,
620 enum amd_ip_block_type block_type, 620 enum amd_ip_block_type block_type,
621 enum amd_clockgating_state state) 621 enum amd_clockgating_state state)
622{ 622{
@@ -637,7 +637,7 @@ int amdgpu_cgs_set_clockgating_state(struct cgs_device *cgs_device,
637 return r; 637 return r;
638} 638}
639 639
640int amdgpu_cgs_set_powergating_state(struct cgs_device *cgs_device, 640static int amdgpu_cgs_set_powergating_state(struct cgs_device *cgs_device,
641 enum amd_ip_block_type block_type, 641 enum amd_ip_block_type block_type,
642 enum amd_powergating_state state) 642 enum amd_powergating_state state)
643{ 643{
@@ -711,6 +711,47 @@ static int amdgpu_cgs_rel_firmware(struct cgs_device *cgs_device, enum cgs_ucode
711 return -EINVAL; 711 return -EINVAL;
712} 712}
713 713
714static uint16_t amdgpu_get_firmware_version(struct cgs_device *cgs_device,
715 enum cgs_ucode_id type)
716{
717 CGS_FUNC_ADEV;
718 uint16_t fw_version;
719
720 switch (type) {
721 case CGS_UCODE_ID_SDMA0:
722 fw_version = adev->sdma.instance[0].fw_version;
723 break;
724 case CGS_UCODE_ID_SDMA1:
725 fw_version = adev->sdma.instance[1].fw_version;
726 break;
727 case CGS_UCODE_ID_CP_CE:
728 fw_version = adev->gfx.ce_fw_version;
729 break;
730 case CGS_UCODE_ID_CP_PFP:
731 fw_version = adev->gfx.pfp_fw_version;
732 break;
733 case CGS_UCODE_ID_CP_ME:
734 fw_version = adev->gfx.me_fw_version;
735 break;
736 case CGS_UCODE_ID_CP_MEC:
737 fw_version = adev->gfx.mec_fw_version;
738 break;
739 case CGS_UCODE_ID_CP_MEC_JT1:
740 fw_version = adev->gfx.mec_fw_version;
741 break;
742 case CGS_UCODE_ID_CP_MEC_JT2:
743 fw_version = adev->gfx.mec_fw_version;
744 break;
745 case CGS_UCODE_ID_RLC_G:
746 fw_version = adev->gfx.rlc_fw_version;
747 break;
748 default:
749 DRM_ERROR("firmware type %d do not have version\n", type);
750 fw_version = 0;
751 }
752 return fw_version;
753}
754
714static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device, 755static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,
715 enum cgs_ucode_id type, 756 enum cgs_ucode_id type,
716 struct cgs_firmware_info *info) 757 struct cgs_firmware_info *info)
@@ -741,6 +782,7 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,
741 info->mc_addr = gpu_addr; 782 info->mc_addr = gpu_addr;
742 info->image_size = data_size; 783 info->image_size = data_size;
743 info->version = (uint16_t)le32_to_cpu(header->header.ucode_version); 784 info->version = (uint16_t)le32_to_cpu(header->header.ucode_version);
785 info->fw_version = amdgpu_get_firmware_version(cgs_device, type);
744 info->feature_version = (uint16_t)le32_to_cpu(header->ucode_feature_version); 786 info->feature_version = (uint16_t)le32_to_cpu(header->ucode_feature_version);
745 } else { 787 } else {
746 char fw_name[30] = {0}; 788 char fw_name[30] = {0};
@@ -848,6 +890,12 @@ static int amdgpu_cgs_query_system_info(struct cgs_device *cgs_device,
848 case CGS_SYSTEM_INFO_GFX_SE_INFO: 890 case CGS_SYSTEM_INFO_GFX_SE_INFO:
849 sys_info->value = adev->gfx.config.max_shader_engines; 891 sys_info->value = adev->gfx.config.max_shader_engines;
850 break; 892 break;
893 case CGS_SYSTEM_INFO_PCIE_SUB_SYS_ID:
894 sys_info->value = adev->pdev->subsystem_device;
895 break;
896 case CGS_SYSTEM_INFO_PCIE_SUB_SYS_VENDOR_ID:
897 sys_info->value = adev->pdev->subsystem_vendor;
898 break;
851 default: 899 default:
852 return -ENODEV; 900 return -ENODEV;
853 } 901 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
index ff0b55a65ca3..2e3a0543760d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
@@ -168,12 +168,12 @@ int amdgpu_connector_get_monitor_bpc(struct drm_connector *connector)
168 } 168 }
169 169
170 /* Any defined maximum tmds clock limit we must not exceed? */ 170 /* Any defined maximum tmds clock limit we must not exceed? */
171 if (connector->max_tmds_clock > 0) { 171 if (connector->display_info.max_tmds_clock > 0) {
172 /* mode_clock is clock in kHz for mode to be modeset on this connector */ 172 /* mode_clock is clock in kHz for mode to be modeset on this connector */
173 mode_clock = amdgpu_connector->pixelclock_for_modeset; 173 mode_clock = amdgpu_connector->pixelclock_for_modeset;
174 174
175 /* Maximum allowable input clock in kHz */ 175 /* Maximum allowable input clock in kHz */
176 max_tmds_clock = connector->max_tmds_clock * 1000; 176 max_tmds_clock = connector->display_info.max_tmds_clock;
177 177
178 DRM_DEBUG("%s: hdmi mode dotclock %d kHz, max tmds input clock %d kHz.\n", 178 DRM_DEBUG("%s: hdmi mode dotclock %d kHz, max tmds input clock %d kHz.\n",
179 connector->name, mode_clock, max_tmds_clock); 179 connector->name, mode_clock, max_tmds_clock);
@@ -769,8 +769,10 @@ static void amdgpu_connector_destroy(struct drm_connector *connector)
769{ 769{
770 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 770 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
771 771
772 if (amdgpu_connector->ddc_bus->has_aux) 772 if (amdgpu_connector->ddc_bus->has_aux) {
773 drm_dp_aux_unregister(&amdgpu_connector->ddc_bus->aux); 773 drm_dp_aux_unregister(&amdgpu_connector->ddc_bus->aux);
774 amdgpu_connector->ddc_bus->has_aux = false;
775 }
774 amdgpu_connector_free_edid(connector); 776 amdgpu_connector_free_edid(connector);
775 kfree(amdgpu_connector->con_priv); 777 kfree(amdgpu_connector->con_priv);
776 drm_connector_unregister(connector); 778 drm_connector_unregister(connector);
@@ -1504,6 +1506,88 @@ static const struct drm_connector_funcs amdgpu_connector_edp_funcs = {
1504 .force = amdgpu_connector_dvi_force, 1506 .force = amdgpu_connector_dvi_force,
1505}; 1507};
1506 1508
1509static struct drm_encoder *
1510amdgpu_connector_virtual_encoder(struct drm_connector *connector)
1511{
1512 int enc_id = connector->encoder_ids[0];
1513 struct drm_encoder *encoder;
1514 int i;
1515 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
1516 if (connector->encoder_ids[i] == 0)
1517 break;
1518
1519 encoder = drm_encoder_find(connector->dev, connector->encoder_ids[i]);
1520 if (!encoder)
1521 continue;
1522
1523 if (encoder->encoder_type == DRM_MODE_ENCODER_VIRTUAL)
1524 return encoder;
1525 }
1526
1527 /* pick the first one */
1528 if (enc_id)
1529 return drm_encoder_find(connector->dev, enc_id);
1530 return NULL;
1531}
1532
1533static int amdgpu_connector_virtual_get_modes(struct drm_connector *connector)
1534{
1535 struct drm_encoder *encoder = amdgpu_connector_best_single_encoder(connector);
1536
1537 if (encoder) {
1538 amdgpu_connector_add_common_modes(encoder, connector);
1539 }
1540
1541 return 0;
1542}
1543
1544static int amdgpu_connector_virtual_mode_valid(struct drm_connector *connector,
1545 struct drm_display_mode *mode)
1546{
1547 return MODE_OK;
1548}
1549
1550static int
1551amdgpu_connector_virtual_dpms(struct drm_connector *connector, int mode)
1552{
1553 return 0;
1554}
1555
1556static enum drm_connector_status
1557
1558amdgpu_connector_virtual_detect(struct drm_connector *connector, bool force)
1559{
1560 return connector_status_connected;
1561}
1562
1563static int
1564amdgpu_connector_virtual_set_property(struct drm_connector *connector,
1565 struct drm_property *property,
1566 uint64_t val)
1567{
1568 return 0;
1569}
1570
1571static void amdgpu_connector_virtual_force(struct drm_connector *connector)
1572{
1573 return;
1574}
1575
1576static const struct drm_connector_helper_funcs amdgpu_connector_virtual_helper_funcs = {
1577 .get_modes = amdgpu_connector_virtual_get_modes,
1578 .mode_valid = amdgpu_connector_virtual_mode_valid,
1579 .best_encoder = amdgpu_connector_virtual_encoder,
1580};
1581
1582static const struct drm_connector_funcs amdgpu_connector_virtual_funcs = {
1583 .dpms = amdgpu_connector_virtual_dpms,
1584 .detect = amdgpu_connector_virtual_detect,
1585 .fill_modes = drm_helper_probe_single_connector_modes,
1586 .set_property = amdgpu_connector_virtual_set_property,
1587 .destroy = amdgpu_connector_destroy,
1588 .force = amdgpu_connector_virtual_force,
1589};
1590
1507void 1591void
1508amdgpu_connector_add(struct amdgpu_device *adev, 1592amdgpu_connector_add(struct amdgpu_device *adev,
1509 uint32_t connector_id, 1593 uint32_t connector_id,
@@ -1888,6 +1972,17 @@ amdgpu_connector_add(struct amdgpu_device *adev,
1888 connector->interlace_allowed = false; 1972 connector->interlace_allowed = false;
1889 connector->doublescan_allowed = false; 1973 connector->doublescan_allowed = false;
1890 break; 1974 break;
1975 case DRM_MODE_CONNECTOR_VIRTUAL:
1976 amdgpu_dig_connector = kzalloc(sizeof(struct amdgpu_connector_atom_dig), GFP_KERNEL);
1977 if (!amdgpu_dig_connector)
1978 goto failed;
1979 amdgpu_connector->con_priv = amdgpu_dig_connector;
1980 drm_connector_init(dev, &amdgpu_connector->base, &amdgpu_connector_virtual_funcs, connector_type);
1981 drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_virtual_helper_funcs);
1982 subpixel_order = SubPixelHorizontalRGB;
1983 connector->interlace_allowed = false;
1984 connector->doublescan_allowed = false;
1985 break;
1891 } 1986 }
1892 } 1987 }
1893 1988
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 0307ff5887c5..b0f6e6957536 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -91,6 +91,7 @@ static int amdgpu_cs_user_fence_chunk(struct amdgpu_cs_parser *p,
91 uint32_t *offset) 91 uint32_t *offset)
92{ 92{
93 struct drm_gem_object *gobj; 93 struct drm_gem_object *gobj;
94 unsigned long size;
94 95
95 gobj = drm_gem_object_lookup(p->filp, data->handle); 96 gobj = drm_gem_object_lookup(p->filp, data->handle);
96 if (gobj == NULL) 97 if (gobj == NULL)
@@ -101,6 +102,11 @@ static int amdgpu_cs_user_fence_chunk(struct amdgpu_cs_parser *p,
101 p->uf_entry.tv.bo = &p->uf_entry.robj->tbo; 102 p->uf_entry.tv.bo = &p->uf_entry.robj->tbo;
102 p->uf_entry.tv.shared = true; 103 p->uf_entry.tv.shared = true;
103 p->uf_entry.user_pages = NULL; 104 p->uf_entry.user_pages = NULL;
105
106 size = amdgpu_bo_size(p->uf_entry.robj);
107 if (size != PAGE_SIZE || (data->offset + 8) > size)
108 return -EINVAL;
109
104 *offset = data->offset; 110 *offset = data->offset;
105 111
106 drm_gem_object_unreference_unlocked(gobj); 112 drm_gem_object_unreference_unlocked(gobj);
@@ -235,70 +241,212 @@ free_chunk:
235 return ret; 241 return ret;
236} 242}
237 243
238/* Returns how many bytes TTM can move per IB. 244/* Convert microseconds to bytes. */
245static u64 us_to_bytes(struct amdgpu_device *adev, s64 us)
246{
247 if (us <= 0 || !adev->mm_stats.log2_max_MBps)
248 return 0;
249
250 /* Since accum_us is incremented by a million per second, just
251 * multiply it by the number of MB/s to get the number of bytes.
252 */
253 return us << adev->mm_stats.log2_max_MBps;
254}
255
256static s64 bytes_to_us(struct amdgpu_device *adev, u64 bytes)
257{
258 if (!adev->mm_stats.log2_max_MBps)
259 return 0;
260
261 return bytes >> adev->mm_stats.log2_max_MBps;
262}
263
264/* Returns how many bytes TTM can move right now. If no bytes can be moved,
265 * it returns 0. If it returns non-zero, it's OK to move at least one buffer,
266 * which means it can go over the threshold once. If that happens, the driver
267 * will be in debt and no other buffer migrations can be done until that debt
268 * is repaid.
269 *
270 * This approach allows moving a buffer of any size (it's important to allow
271 * that).
272 *
273 * The currency is simply time in microseconds and it increases as the clock
274 * ticks. The accumulated microseconds (us) are converted to bytes and
275 * returned.
239 */ 276 */
240static u64 amdgpu_cs_get_threshold_for_moves(struct amdgpu_device *adev) 277static u64 amdgpu_cs_get_threshold_for_moves(struct amdgpu_device *adev)
241{ 278{
242 u64 real_vram_size = adev->mc.real_vram_size; 279 s64 time_us, increment_us;
243 u64 vram_usage = atomic64_read(&adev->vram_usage); 280 u64 max_bytes;
281 u64 free_vram, total_vram, used_vram;
244 282
245 /* This function is based on the current VRAM usage. 283 /* Allow a maximum of 200 accumulated ms. This is basically per-IB
284 * throttling.
246 * 285 *
247 * - If all of VRAM is free, allow relocating the number of bytes that 286 * It means that in order to get full max MBps, at least 5 IBs per
248 * is equal to 1/4 of the size of VRAM for this IB. 287 * second must be submitted and not more than 200ms apart from each
288 * other.
289 */
290 const s64 us_upper_bound = 200000;
249 291
250 * - If more than one half of VRAM is occupied, only allow relocating 292 if (!adev->mm_stats.log2_max_MBps)
251 * 1 MB of data for this IB. 293 return 0;
252 * 294
253 * - From 0 to one half of used VRAM, the threshold decreases 295 total_vram = adev->mc.real_vram_size - adev->vram_pin_size;
254 * linearly. 296 used_vram = atomic64_read(&adev->vram_usage);
255 * __________________ 297 free_vram = used_vram >= total_vram ? 0 : total_vram - used_vram;
256 * 1/4 of -|\ | 298
257 * VRAM | \ | 299 spin_lock(&adev->mm_stats.lock);
258 * | \ | 300
259 * | \ | 301 /* Increase the amount of accumulated us. */
260 * | \ | 302 time_us = ktime_to_us(ktime_get());
261 * | \ | 303 increment_us = time_us - adev->mm_stats.last_update_us;
262 * | \ | 304 adev->mm_stats.last_update_us = time_us;
263 * | \________|1 MB 305 adev->mm_stats.accum_us = min(adev->mm_stats.accum_us + increment_us,
264 * |----------------| 306 us_upper_bound);
265 * VRAM 0 % 100 % 307
266 * used used 308 /* This prevents the short period of low performance when the VRAM
267 * 309 * usage is low and the driver is in debt or doesn't have enough
268 * Note: It's a threshold, not a limit. The threshold must be crossed 310 * accumulated us to fill VRAM quickly.
269 * for buffer relocations to stop, so any buffer of an arbitrary size
270 * can be moved as long as the threshold isn't crossed before
271 * the relocation takes place. We don't want to disable buffer
272 * relocations completely.
273 * 311 *
274 * The idea is that buffers should be placed in VRAM at creation time 312 * The situation can occur in these cases:
275 * and TTM should only do a minimum number of relocations during 313 * - a lot of VRAM is freed by userspace
276 * command submission. In practice, you need to submit at least 314 * - the presence of a big buffer causes a lot of evictions
277 * a dozen IBs to move all buffers to VRAM if they are in GTT. 315 * (solution: split buffers into smaller ones)
278 * 316 *
279 * Also, things can get pretty crazy under memory pressure and actual 317 * If 128 MB or 1/8th of VRAM is free, start filling it now by setting
280 * VRAM usage can change a lot, so playing safe even at 50% does 318 * accum_us to a positive number.
281 * consistently increase performance. 319 */
320 if (free_vram >= 128 * 1024 * 1024 || free_vram >= total_vram / 8) {
321 s64 min_us;
322
323 /* Be more aggresive on dGPUs. Try to fill a portion of free
324 * VRAM now.
325 */
326 if (!(adev->flags & AMD_IS_APU))
327 min_us = bytes_to_us(adev, free_vram / 4);
328 else
329 min_us = 0; /* Reset accum_us on APUs. */
330
331 adev->mm_stats.accum_us = max(min_us, adev->mm_stats.accum_us);
332 }
333
334 /* This returns 0 if the driver is in debt to disallow (optional)
335 * buffer moves.
336 */
337 max_bytes = us_to_bytes(adev, adev->mm_stats.accum_us);
338
339 spin_unlock(&adev->mm_stats.lock);
340 return max_bytes;
341}
342
343/* Report how many bytes have really been moved for the last command
344 * submission. This can result in a debt that can stop buffer migrations
345 * temporarily.
346 */
347static void amdgpu_cs_report_moved_bytes(struct amdgpu_device *adev,
348 u64 num_bytes)
349{
350 spin_lock(&adev->mm_stats.lock);
351 adev->mm_stats.accum_us -= bytes_to_us(adev, num_bytes);
352 spin_unlock(&adev->mm_stats.lock);
353}
354
355static int amdgpu_cs_bo_validate(struct amdgpu_cs_parser *p,
356 struct amdgpu_bo *bo)
357{
358 u64 initial_bytes_moved;
359 uint32_t domain;
360 int r;
361
362 if (bo->pin_count)
363 return 0;
364
365 /* Don't move this buffer if we have depleted our allowance
366 * to move it. Don't move anything if the threshold is zero.
282 */ 367 */
368 if (p->bytes_moved < p->bytes_moved_threshold)
369 domain = bo->prefered_domains;
370 else
371 domain = bo->allowed_domains;
372
373retry:
374 amdgpu_ttm_placement_from_domain(bo, domain);
375 initial_bytes_moved = atomic64_read(&bo->adev->num_bytes_moved);
376 r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false);
377 p->bytes_moved += atomic64_read(&bo->adev->num_bytes_moved) -
378 initial_bytes_moved;
379
380 if (unlikely(r == -ENOMEM) && domain != bo->allowed_domains) {
381 domain = bo->allowed_domains;
382 goto retry;
383 }
283 384
284 u64 half_vram = real_vram_size >> 1; 385 return r;
285 u64 half_free_vram = vram_usage >= half_vram ? 0 : half_vram - vram_usage;
286 u64 bytes_moved_threshold = half_free_vram >> 1;
287 return max(bytes_moved_threshold, 1024*1024ull);
288} 386}
289 387
290int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p, 388/* Last resort, try to evict something from the current working set */
389static bool amdgpu_cs_try_evict(struct amdgpu_cs_parser *p,
390 struct amdgpu_bo_list_entry *lobj)
391{
392 uint32_t domain = lobj->robj->allowed_domains;
393 int r;
394
395 if (!p->evictable)
396 return false;
397
398 for (;&p->evictable->tv.head != &p->validated;
399 p->evictable = list_prev_entry(p->evictable, tv.head)) {
400
401 struct amdgpu_bo_list_entry *candidate = p->evictable;
402 struct amdgpu_bo *bo = candidate->robj;
403 u64 initial_bytes_moved;
404 uint32_t other;
405
406 /* If we reached our current BO we can forget it */
407 if (candidate == lobj)
408 break;
409
410 other = amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type);
411
412 /* Check if this BO is in one of the domains we need space for */
413 if (!(other & domain))
414 continue;
415
416 /* Check if we can move this BO somewhere else */
417 other = bo->allowed_domains & ~domain;
418 if (!other)
419 continue;
420
421 /* Good we can try to move this BO somewhere else */
422 amdgpu_ttm_placement_from_domain(bo, other);
423 initial_bytes_moved = atomic64_read(&bo->adev->num_bytes_moved);
424 r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false);
425 p->bytes_moved += atomic64_read(&bo->adev->num_bytes_moved) -
426 initial_bytes_moved;
427
428 if (unlikely(r))
429 break;
430
431 p->evictable = list_prev_entry(p->evictable, tv.head);
432 list_move(&candidate->tv.head, &p->validated);
433
434 return true;
435 }
436
437 return false;
438}
439
440static int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p,
291 struct list_head *validated) 441 struct list_head *validated)
292{ 442{
293 struct amdgpu_bo_list_entry *lobj; 443 struct amdgpu_bo_list_entry *lobj;
294 u64 initial_bytes_moved;
295 int r; 444 int r;
296 445
297 list_for_each_entry(lobj, validated, tv.head) { 446 list_for_each_entry(lobj, validated, tv.head) {
298 struct amdgpu_bo *bo = lobj->robj; 447 struct amdgpu_bo *bo = lobj->robj;
299 bool binding_userptr = false; 448 bool binding_userptr = false;
300 struct mm_struct *usermm; 449 struct mm_struct *usermm;
301 uint32_t domain;
302 450
303 usermm = amdgpu_ttm_tt_get_usermm(bo->tbo.ttm); 451 usermm = amdgpu_ttm_tt_get_usermm(bo->tbo.ttm);
304 if (usermm && usermm != current->mm) 452 if (usermm && usermm != current->mm)
@@ -313,35 +461,19 @@ int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p,
313 binding_userptr = true; 461 binding_userptr = true;
314 } 462 }
315 463
316 if (bo->pin_count) 464 if (p->evictable == lobj)
317 continue; 465 p->evictable = NULL;
318
319 /* Avoid moving this one if we have moved too many buffers
320 * for this IB already.
321 *
322 * Note that this allows moving at least one buffer of
323 * any size, because it doesn't take the current "bo"
324 * into account. We don't want to disallow buffer moves
325 * completely.
326 */
327 if (p->bytes_moved <= p->bytes_moved_threshold)
328 domain = bo->prefered_domains;
329 else
330 domain = bo->allowed_domains;
331
332 retry:
333 amdgpu_ttm_placement_from_domain(bo, domain);
334 initial_bytes_moved = atomic64_read(&bo->adev->num_bytes_moved);
335 r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false);
336 p->bytes_moved += atomic64_read(&bo->adev->num_bytes_moved) -
337 initial_bytes_moved;
338 466
339 if (unlikely(r)) { 467 do {
340 if (r != -ERESTARTSYS && domain != bo->allowed_domains) { 468 r = amdgpu_cs_bo_validate(p, bo);
341 domain = bo->allowed_domains; 469 } while (r == -ENOMEM && amdgpu_cs_try_evict(p, lobj));
342 goto retry; 470 if (r)
343 }
344 return r; 471 return r;
472
473 if (bo->shadow) {
474 r = amdgpu_cs_bo_validate(p, bo);
475 if (r)
476 return r;
345 } 477 }
346 478
347 if (binding_userptr) { 479 if (binding_userptr) {
@@ -386,8 +518,10 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
386 518
387 r = ttm_eu_reserve_buffers(&p->ticket, &p->validated, true, 519 r = ttm_eu_reserve_buffers(&p->ticket, &p->validated, true,
388 &duplicates); 520 &duplicates);
389 if (unlikely(r != 0)) 521 if (unlikely(r != 0)) {
522 DRM_ERROR("ttm_eu_reserve_buffers failed.\n");
390 goto error_free_pages; 523 goto error_free_pages;
524 }
391 525
392 /* Without a BO list we don't have userptr BOs */ 526 /* Without a BO list we don't have userptr BOs */
393 if (!p->bo_list) 527 if (!p->bo_list)
@@ -427,9 +561,10 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
427 /* Unreserve everything again. */ 561 /* Unreserve everything again. */
428 ttm_eu_backoff_reservation(&p->ticket, &p->validated); 562 ttm_eu_backoff_reservation(&p->ticket, &p->validated);
429 563
430 /* We tried to often, just abort */ 564 /* We tried too many times, just abort */
431 if (!--tries) { 565 if (!--tries) {
432 r = -EDEADLK; 566 r = -EDEADLK;
567 DRM_ERROR("deadlock in %s\n", __func__);
433 goto error_free_pages; 568 goto error_free_pages;
434 } 569 }
435 570
@@ -441,11 +576,13 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
441 sizeof(struct page*)); 576 sizeof(struct page*));
442 if (!e->user_pages) { 577 if (!e->user_pages) {
443 r = -ENOMEM; 578 r = -ENOMEM;
579 DRM_ERROR("calloc failure in %s\n", __func__);
444 goto error_free_pages; 580 goto error_free_pages;
445 } 581 }
446 582
447 r = amdgpu_ttm_tt_get_user_pages(ttm, e->user_pages); 583 r = amdgpu_ttm_tt_get_user_pages(ttm, e->user_pages);
448 if (r) { 584 if (r) {
585 DRM_ERROR("amdgpu_ttm_tt_get_user_pages failed.\n");
449 drm_free_large(e->user_pages); 586 drm_free_large(e->user_pages);
450 e->user_pages = NULL; 587 e->user_pages = NULL;
451 goto error_free_pages; 588 goto error_free_pages;
@@ -460,14 +597,23 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
460 597
461 p->bytes_moved_threshold = amdgpu_cs_get_threshold_for_moves(p->adev); 598 p->bytes_moved_threshold = amdgpu_cs_get_threshold_for_moves(p->adev);
462 p->bytes_moved = 0; 599 p->bytes_moved = 0;
600 p->evictable = list_last_entry(&p->validated,
601 struct amdgpu_bo_list_entry,
602 tv.head);
463 603
464 r = amdgpu_cs_list_validate(p, &duplicates); 604 r = amdgpu_cs_list_validate(p, &duplicates);
465 if (r) 605 if (r) {
606 DRM_ERROR("amdgpu_cs_list_validate(duplicates) failed.\n");
466 goto error_validate; 607 goto error_validate;
608 }
467 609
468 r = amdgpu_cs_list_validate(p, &p->validated); 610 r = amdgpu_cs_list_validate(p, &p->validated);
469 if (r) 611 if (r) {
612 DRM_ERROR("amdgpu_cs_list_validate(validated) failed.\n");
470 goto error_validate; 613 goto error_validate;
614 }
615
616 amdgpu_cs_report_moved_bytes(p->adev, p->bytes_moved);
471 617
472 fpriv->vm.last_eviction_counter = 618 fpriv->vm.last_eviction_counter =
473 atomic64_read(&p->adev->num_evictions); 619 atomic64_read(&p->adev->num_evictions);
@@ -499,8 +645,12 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
499 } 645 }
500 } 646 }
501 647
502 if (p->uf_entry.robj) 648 if (!r && p->uf_entry.robj) {
503 p->job->uf_addr += amdgpu_bo_gpu_offset(p->uf_entry.robj); 649 struct amdgpu_bo *uf = p->uf_entry.robj;
650
651 r = amdgpu_ttm_bind(&uf->tbo, &uf->tbo.mem);
652 p->job->uf_addr += amdgpu_bo_gpu_offset(uf);
653 }
504 654
505error_validate: 655error_validate:
506 if (r) { 656 if (r) {
@@ -617,7 +767,7 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p,
617 if (bo_va == NULL) 767 if (bo_va == NULL)
618 continue; 768 continue;
619 769
620 r = amdgpu_vm_bo_update(adev, bo_va, &bo->tbo.mem); 770 r = amdgpu_vm_bo_update(adev, bo_va, false);
621 if (r) 771 if (r)
622 return r; 772 return r;
623 773
@@ -710,6 +860,14 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev,
710 if (r) 860 if (r)
711 return r; 861 return r;
712 862
863 if (ib->flags & AMDGPU_IB_FLAG_PREAMBLE) {
864 parser->job->preamble_status |= AMDGPU_PREAMBLE_IB_PRESENT;
865 if (!parser->ctx->preamble_presented) {
866 parser->job->preamble_status |= AMDGPU_PREAMBLE_IB_PRESENT_FIRST;
867 parser->ctx->preamble_presented = true;
868 }
869 }
870
713 if (parser->job->ring && parser->job->ring != ring) 871 if (parser->job->ring && parser->job->ring != ring)
714 return -EINVAL; 872 return -EINVAL;
715 873
@@ -849,7 +1007,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
849 } 1007 }
850 1008
851 job->owner = p->filp; 1009 job->owner = p->filp;
852 job->ctx = entity->fence_context; 1010 job->fence_ctx = entity->fence_context;
853 p->fence = fence_get(&job->base.s_fence->finished); 1011 p->fence = fence_get(&job->base.s_fence->finished);
854 cs->out.handle = amdgpu_ctx_add_fence(p->ctx, ring, p->fence); 1012 cs->out.handle = amdgpu_ctx_add_fence(p->ctx, ring, p->fence);
855 job->uf_sequence = cs->out.handle; 1013 job->uf_sequence = cs->out.handle;
@@ -1015,3 +1173,29 @@ amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
1015 1173
1016 return NULL; 1174 return NULL;
1017} 1175}
1176
1177/**
1178 * amdgpu_cs_sysvm_access_required - make BOs accessible by the system VM
1179 *
1180 * @parser: command submission parser context
1181 *
1182 * Helper for UVD/VCE VM emulation, make sure BOs are accessible by the system VM.
1183 */
1184int amdgpu_cs_sysvm_access_required(struct amdgpu_cs_parser *parser)
1185{
1186 unsigned i;
1187 int r;
1188
1189 if (!parser->bo_list)
1190 return 0;
1191
1192 for (i = 0; i < parser->bo_list->num_entries; i++) {
1193 struct amdgpu_bo *bo = parser->bo_list->array[i].robj;
1194
1195 r = amdgpu_ttm_bind(&bo->tbo, &bo->tbo.mem);
1196 if (unlikely(r))
1197 return r;
1198 }
1199
1200 return 0;
1201}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
index 17e13621fae9..e203e5561107 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
@@ -60,6 +60,7 @@ static int amdgpu_ctx_init(struct amdgpu_device *adev, struct amdgpu_ctx *ctx)
60 amd_sched_entity_fini(&adev->rings[j]->sched, 60 amd_sched_entity_fini(&adev->rings[j]->sched,
61 &ctx->rings[j].entity); 61 &ctx->rings[j].entity);
62 kfree(ctx->fences); 62 kfree(ctx->fences);
63 ctx->fences = NULL;
63 return r; 64 return r;
64 } 65 }
65 return 0; 66 return 0;
@@ -77,6 +78,7 @@ static void amdgpu_ctx_fini(struct amdgpu_ctx *ctx)
77 for (j = 0; j < amdgpu_sched_jobs; ++j) 78 for (j = 0; j < amdgpu_sched_jobs; ++j)
78 fence_put(ctx->rings[i].fences[j]); 79 fence_put(ctx->rings[i].fences[j]);
79 kfree(ctx->fences); 80 kfree(ctx->fences);
81 ctx->fences = NULL;
80 82
81 for (i = 0; i < adev->num_rings; i++) 83 for (i = 0; i < adev->num_rings; i++)
82 amd_sched_entity_fini(&adev->rings[i]->sched, 84 amd_sched_entity_fini(&adev->rings[i]->sched,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 39c01b942ee4..7dbe85d67d26 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -41,16 +41,26 @@
41#include "atom.h" 41#include "atom.h"
42#include "amdgpu_atombios.h" 42#include "amdgpu_atombios.h"
43#include "amd_pcie.h" 43#include "amd_pcie.h"
44#ifdef CONFIG_DRM_AMDGPU_SI
45#include "si.h"
46#endif
44#ifdef CONFIG_DRM_AMDGPU_CIK 47#ifdef CONFIG_DRM_AMDGPU_CIK
45#include "cik.h" 48#include "cik.h"
46#endif 49#endif
47#include "vi.h" 50#include "vi.h"
48#include "bif/bif_4_1_d.h" 51#include "bif/bif_4_1_d.h"
52#include <linux/pci.h>
53#include <linux/firmware.h>
49 54
50static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev); 55static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev);
51static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev); 56static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev);
52 57
53static const char *amdgpu_asic_name[] = { 58static const char *amdgpu_asic_name[] = {
59 "TAHITI",
60 "PITCAIRN",
61 "VERDE",
62 "OLAND",
63 "HAINAN",
54 "BONAIRE", 64 "BONAIRE",
55 "KAVERI", 65 "KAVERI",
56 "KABINI", 66 "KABINI",
@@ -101,7 +111,7 @@ void amdgpu_mm_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v,
101 bool always_indirect) 111 bool always_indirect)
102{ 112{
103 trace_amdgpu_mm_wreg(adev->pdev->device, reg, v); 113 trace_amdgpu_mm_wreg(adev->pdev->device, reg, v);
104 114
105 if ((reg * 4) < adev->rmmio_size && !always_indirect) 115 if ((reg * 4) < adev->rmmio_size && !always_indirect)
106 writel(v, ((void __iomem *)adev->rmmio) + (reg * 4)); 116 writel(v, ((void __iomem *)adev->rmmio) + (reg * 4));
107 else { 117 else {
@@ -642,6 +652,46 @@ bool amdgpu_card_posted(struct amdgpu_device *adev)
642 652
643} 653}
644 654
655static bool amdgpu_vpost_needed(struct amdgpu_device *adev)
656{
657 if (amdgpu_sriov_vf(adev))
658 return false;
659
660 if (amdgpu_passthrough(adev)) {
661 /* for FIJI: In whole GPU pass-through virtualization case
662 * old smc fw won't clear some registers (e.g. MEM_SIZE, BIOS_SCRATCH)
663 * so amdgpu_card_posted return false and driver will incorrectly skip vPost.
664 * but if we force vPost do in pass-through case, the driver reload will hang.
665 * whether doing vPost depends on amdgpu_card_posted if smc version is above
666 * 00160e00 for FIJI.
667 */
668 if (adev->asic_type == CHIP_FIJI) {
669 int err;
670 uint32_t fw_ver;
671 err = request_firmware(&adev->pm.fw, "amdgpu/fiji_smc.bin", adev->dev);
672 /* force vPost if error occured */
673 if (err)
674 return true;
675
676 fw_ver = *((uint32_t *)adev->pm.fw->data + 69);
677 if (fw_ver >= 0x00160e00)
678 return !amdgpu_card_posted(adev);
679 }
680 } else {
681 /* in bare-metal case, amdgpu_card_posted return false
682 * after system reboot/boot, and return true if driver
683 * reloaded.
684 * we shouldn't do vPost after driver reload otherwise GPU
685 * could hang.
686 */
687 if (amdgpu_card_posted(adev))
688 return false;
689 }
690
691 /* we assume vPost is neede for all other cases */
692 return true;
693}
694
645/** 695/**
646 * amdgpu_dummy_page_init - init dummy page used by the driver 696 * amdgpu_dummy_page_init - init dummy page used by the driver
647 * 697 *
@@ -1026,7 +1076,7 @@ static void amdgpu_switcheroo_set_state(struct pci_dev *pdev, enum vga_switchero
1026 /* don't suspend or resume card normally */ 1076 /* don't suspend or resume card normally */
1027 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING; 1077 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
1028 1078
1029 amdgpu_resume_kms(dev, true, true); 1079 amdgpu_device_resume(dev, true, true);
1030 1080
1031 dev->pdev->d3_delay = d3_delay; 1081 dev->pdev->d3_delay = d3_delay;
1032 1082
@@ -1036,7 +1086,7 @@ static void amdgpu_switcheroo_set_state(struct pci_dev *pdev, enum vga_switchero
1036 printk(KERN_INFO "amdgpu: switched off\n"); 1086 printk(KERN_INFO "amdgpu: switched off\n");
1037 drm_kms_helper_poll_disable(dev); 1087 drm_kms_helper_poll_disable(dev);
1038 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING; 1088 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
1039 amdgpu_suspend_kms(dev, true, true); 1089 amdgpu_device_suspend(dev, true, true);
1040 dev->switch_power_state = DRM_SWITCH_POWER_OFF; 1090 dev->switch_power_state = DRM_SWITCH_POWER_OFF;
1041 } 1091 }
1042} 1092}
@@ -1181,10 +1231,38 @@ int amdgpu_ip_block_version_cmp(struct amdgpu_device *adev,
1181 return 1; 1231 return 1;
1182} 1232}
1183 1233
1234static void amdgpu_whether_enable_virtual_display(struct amdgpu_device *adev)
1235{
1236 adev->enable_virtual_display = false;
1237
1238 if (amdgpu_virtual_display) {
1239 struct drm_device *ddev = adev->ddev;
1240 const char *pci_address_name = pci_name(ddev->pdev);
1241 char *pciaddstr, *pciaddstr_tmp, *pciaddname;
1242
1243 pciaddstr = kstrdup(amdgpu_virtual_display, GFP_KERNEL);
1244 pciaddstr_tmp = pciaddstr;
1245 while ((pciaddname = strsep(&pciaddstr_tmp, ";"))) {
1246 if (!strcmp(pci_address_name, pciaddname)) {
1247 adev->enable_virtual_display = true;
1248 break;
1249 }
1250 }
1251
1252 DRM_INFO("virtual display string:%s, %s:virtual_display:%d\n",
1253 amdgpu_virtual_display, pci_address_name,
1254 adev->enable_virtual_display);
1255
1256 kfree(pciaddstr);
1257 }
1258}
1259
1184static int amdgpu_early_init(struct amdgpu_device *adev) 1260static int amdgpu_early_init(struct amdgpu_device *adev)
1185{ 1261{
1186 int i, r; 1262 int i, r;
1187 1263
1264 amdgpu_whether_enable_virtual_display(adev);
1265
1188 switch (adev->asic_type) { 1266 switch (adev->asic_type) {
1189 case CHIP_TOPAZ: 1267 case CHIP_TOPAZ:
1190 case CHIP_TONGA: 1268 case CHIP_TONGA:
@@ -1202,6 +1280,18 @@ static int amdgpu_early_init(struct amdgpu_device *adev)
1202 if (r) 1280 if (r)
1203 return r; 1281 return r;
1204 break; 1282 break;
1283#ifdef CONFIG_DRM_AMDGPU_SI
1284 case CHIP_VERDE:
1285 case CHIP_TAHITI:
1286 case CHIP_PITCAIRN:
1287 case CHIP_OLAND:
1288 case CHIP_HAINAN:
1289 adev->family = AMDGPU_FAMILY_SI;
1290 r = si_set_ip_blocks(adev);
1291 if (r)
1292 return r;
1293 break;
1294#endif
1205#ifdef CONFIG_DRM_AMDGPU_CIK 1295#ifdef CONFIG_DRM_AMDGPU_CIK
1206 case CHIP_BONAIRE: 1296 case CHIP_BONAIRE:
1207 case CHIP_HAWAII: 1297 case CHIP_HAWAII:
@@ -1318,6 +1408,9 @@ static int amdgpu_late_init(struct amdgpu_device *adev)
1318 for (i = 0; i < adev->num_ip_blocks; i++) { 1408 for (i = 0; i < adev->num_ip_blocks; i++) {
1319 if (!adev->ip_block_status[i].valid) 1409 if (!adev->ip_block_status[i].valid)
1320 continue; 1410 continue;
1411 if (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_UVD ||
1412 adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_VCE)
1413 continue;
1321 /* enable clockgating to save power */ 1414 /* enable clockgating to save power */
1322 r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev, 1415 r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev,
1323 AMD_CG_STATE_GATE); 1416 AMD_CG_STATE_GATE);
@@ -1331,6 +1424,7 @@ static int amdgpu_late_init(struct amdgpu_device *adev)
1331 DRM_ERROR("late_init of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r); 1424 DRM_ERROR("late_init of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r);
1332 return r; 1425 return r;
1333 } 1426 }
1427 adev->ip_block_status[i].late_initialized = true;
1334 } 1428 }
1335 } 1429 }
1336 1430
@@ -1376,8 +1470,11 @@ static int amdgpu_fini(struct amdgpu_device *adev)
1376 } 1470 }
1377 1471
1378 for (i = adev->num_ip_blocks - 1; i >= 0; i--) { 1472 for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
1473 if (!adev->ip_block_status[i].late_initialized)
1474 continue;
1379 if (adev->ip_blocks[i].funcs->late_fini) 1475 if (adev->ip_blocks[i].funcs->late_fini)
1380 adev->ip_blocks[i].funcs->late_fini((void *)adev); 1476 adev->ip_blocks[i].funcs->late_fini((void *)adev);
1477 adev->ip_block_status[i].late_initialized = false;
1381 } 1478 }
1382 1479
1383 return 0; 1480 return 0;
@@ -1433,13 +1530,10 @@ static int amdgpu_resume(struct amdgpu_device *adev)
1433 return 0; 1530 return 0;
1434} 1531}
1435 1532
1436static bool amdgpu_device_is_virtual(void) 1533static void amdgpu_device_detect_sriov_bios(struct amdgpu_device *adev)
1437{ 1534{
1438#ifdef CONFIG_X86 1535 if (amdgpu_atombios_has_gpu_virtualization_table(adev))
1439 return boot_cpu_has(X86_FEATURE_HYPERVISOR); 1536 adev->virtualization.virtual_caps |= AMDGPU_SRIOV_CAPS_SRIOV_VBIOS;
1440#else
1441 return false;
1442#endif
1443} 1537}
1444 1538
1445/** 1539/**
@@ -1461,6 +1555,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
1461{ 1555{
1462 int r, i; 1556 int r, i;
1463 bool runtime = false; 1557 bool runtime = false;
1558 u32 max_MBps;
1464 1559
1465 adev->shutdown = false; 1560 adev->shutdown = false;
1466 adev->dev = &pdev->dev; 1561 adev->dev = &pdev->dev;
@@ -1484,6 +1579,8 @@ int amdgpu_device_init(struct amdgpu_device *adev,
1484 adev->smc_wreg = &amdgpu_invalid_wreg; 1579 adev->smc_wreg = &amdgpu_invalid_wreg;
1485 adev->pcie_rreg = &amdgpu_invalid_rreg; 1580 adev->pcie_rreg = &amdgpu_invalid_rreg;
1486 adev->pcie_wreg = &amdgpu_invalid_wreg; 1581 adev->pcie_wreg = &amdgpu_invalid_wreg;
1582 adev->pciep_rreg = &amdgpu_invalid_rreg;
1583 adev->pciep_wreg = &amdgpu_invalid_wreg;
1487 adev->uvd_ctx_rreg = &amdgpu_invalid_rreg; 1584 adev->uvd_ctx_rreg = &amdgpu_invalid_rreg;
1488 adev->uvd_ctx_wreg = &amdgpu_invalid_wreg; 1585 adev->uvd_ctx_wreg = &amdgpu_invalid_wreg;
1489 adev->didt_rreg = &amdgpu_invalid_rreg; 1586 adev->didt_rreg = &amdgpu_invalid_rreg;
@@ -1520,9 +1617,22 @@ int amdgpu_device_init(struct amdgpu_device *adev,
1520 spin_lock_init(&adev->didt_idx_lock); 1617 spin_lock_init(&adev->didt_idx_lock);
1521 spin_lock_init(&adev->gc_cac_idx_lock); 1618 spin_lock_init(&adev->gc_cac_idx_lock);
1522 spin_lock_init(&adev->audio_endpt_idx_lock); 1619 spin_lock_init(&adev->audio_endpt_idx_lock);
1620 spin_lock_init(&adev->mm_stats.lock);
1621
1622 INIT_LIST_HEAD(&adev->shadow_list);
1623 mutex_init(&adev->shadow_list_lock);
1624
1625 INIT_LIST_HEAD(&adev->gtt_list);
1626 spin_lock_init(&adev->gtt_list_lock);
1627
1628 if (adev->asic_type >= CHIP_BONAIRE) {
1629 adev->rmmio_base = pci_resource_start(adev->pdev, 5);
1630 adev->rmmio_size = pci_resource_len(adev->pdev, 5);
1631 } else {
1632 adev->rmmio_base = pci_resource_start(adev->pdev, 2);
1633 adev->rmmio_size = pci_resource_len(adev->pdev, 2);
1634 }
1523 1635
1524 adev->rmmio_base = pci_resource_start(adev->pdev, 5);
1525 adev->rmmio_size = pci_resource_len(adev->pdev, 5);
1526 adev->rmmio = ioremap(adev->rmmio_base, adev->rmmio_size); 1636 adev->rmmio = ioremap(adev->rmmio_base, adev->rmmio_size);
1527 if (adev->rmmio == NULL) { 1637 if (adev->rmmio == NULL) {
1528 return -ENOMEM; 1638 return -ENOMEM;
@@ -1530,8 +1640,9 @@ int amdgpu_device_init(struct amdgpu_device *adev,
1530 DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)adev->rmmio_base); 1640 DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)adev->rmmio_base);
1531 DRM_INFO("register mmio size: %u\n", (unsigned)adev->rmmio_size); 1641 DRM_INFO("register mmio size: %u\n", (unsigned)adev->rmmio_size);
1532 1642
1533 /* doorbell bar mapping */ 1643 if (adev->asic_type >= CHIP_BONAIRE)
1534 amdgpu_doorbell_init(adev); 1644 /* doorbell bar mapping */
1645 amdgpu_doorbell_init(adev);
1535 1646
1536 /* io port mapping */ 1647 /* io port mapping */
1537 for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { 1648 for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
@@ -1579,25 +1690,24 @@ int amdgpu_device_init(struct amdgpu_device *adev,
1579 goto failed; 1690 goto failed;
1580 } 1691 }
1581 1692
1582 /* See if the asic supports SR-IOV */ 1693 /* detect if we are with an SRIOV vbios */
1583 adev->virtualization.supports_sr_iov = 1694 amdgpu_device_detect_sriov_bios(adev);
1584 amdgpu_atombios_has_gpu_virtualization_table(adev);
1585
1586 /* Check if we are executing in a virtualized environment */
1587 adev->virtualization.is_virtual = amdgpu_device_is_virtual();
1588 adev->virtualization.caps = amdgpu_asic_get_virtual_caps(adev);
1589 1695
1590 /* Post card if necessary */ 1696 /* Post card if necessary */
1591 if (!amdgpu_card_posted(adev) || 1697 if (amdgpu_vpost_needed(adev)) {
1592 (adev->virtualization.is_virtual &&
1593 !(adev->virtualization.caps & AMDGPU_VIRT_CAPS_SRIOV_EN))) {
1594 if (!adev->bios) { 1698 if (!adev->bios) {
1595 dev_err(adev->dev, "Card not posted and no BIOS - ignoring\n"); 1699 dev_err(adev->dev, "no vBIOS found\n");
1596 r = -EINVAL; 1700 r = -EINVAL;
1597 goto failed; 1701 goto failed;
1598 } 1702 }
1599 DRM_INFO("GPU not posted. posting now...\n"); 1703 DRM_INFO("GPU posting now...\n");
1600 amdgpu_atom_asic_init(adev->mode_info.atom_context); 1704 r = amdgpu_atom_asic_init(adev->mode_info.atom_context);
1705 if (r) {
1706 dev_err(adev->dev, "gpu post error!\n");
1707 goto failed;
1708 }
1709 } else {
1710 DRM_INFO("GPU post is not needed\n");
1601 } 1711 }
1602 1712
1603 /* Initialize clocks */ 1713 /* Initialize clocks */
@@ -1628,6 +1738,14 @@ int amdgpu_device_init(struct amdgpu_device *adev,
1628 1738
1629 adev->accel_working = true; 1739 adev->accel_working = true;
1630 1740
1741 /* Initialize the buffer migration limit. */
1742 if (amdgpu_moverate >= 0)
1743 max_MBps = amdgpu_moverate;
1744 else
1745 max_MBps = 8; /* Allow 8 MB/s. */
1746 /* Get a log2 for easy divisions. */
1747 adev->mm_stats.log2_max_MBps = ilog2(max(1u, max_MBps));
1748
1631 amdgpu_fbdev_init(adev); 1749 amdgpu_fbdev_init(adev);
1632 1750
1633 r = amdgpu_ib_pool_init(adev); 1751 r = amdgpu_ib_pool_init(adev);
@@ -1732,7 +1850,8 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
1732 adev->rio_mem = NULL; 1850 adev->rio_mem = NULL;
1733 iounmap(adev->rmmio); 1851 iounmap(adev->rmmio);
1734 adev->rmmio = NULL; 1852 adev->rmmio = NULL;
1735 amdgpu_doorbell_fini(adev); 1853 if (adev->asic_type >= CHIP_BONAIRE)
1854 amdgpu_doorbell_fini(adev);
1736 amdgpu_debugfs_regs_cleanup(adev); 1855 amdgpu_debugfs_regs_cleanup(adev);
1737 amdgpu_debugfs_remove_files(adev); 1856 amdgpu_debugfs_remove_files(adev);
1738} 1857}
@@ -1742,7 +1861,7 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
1742 * Suspend & resume. 1861 * Suspend & resume.
1743 */ 1862 */
1744/** 1863/**
1745 * amdgpu_suspend_kms - initiate device suspend 1864 * amdgpu_device_suspend - initiate device suspend
1746 * 1865 *
1747 * @pdev: drm dev pointer 1866 * @pdev: drm dev pointer
1748 * @state: suspend state 1867 * @state: suspend state
@@ -1751,7 +1870,7 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
1751 * Returns 0 for success or an error on failure. 1870 * Returns 0 for success or an error on failure.
1752 * Called at driver suspend. 1871 * Called at driver suspend.
1753 */ 1872 */
1754int amdgpu_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon) 1873int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
1755{ 1874{
1756 struct amdgpu_device *adev; 1875 struct amdgpu_device *adev;
1757 struct drm_crtc *crtc; 1876 struct drm_crtc *crtc;
@@ -1819,6 +1938,10 @@ int amdgpu_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon)
1819 /* Shut down the device */ 1938 /* Shut down the device */
1820 pci_disable_device(dev->pdev); 1939 pci_disable_device(dev->pdev);
1821 pci_set_power_state(dev->pdev, PCI_D3hot); 1940 pci_set_power_state(dev->pdev, PCI_D3hot);
1941 } else {
1942 r = amdgpu_asic_reset(adev);
1943 if (r)
1944 DRM_ERROR("amdgpu asic reset failed\n");
1822 } 1945 }
1823 1946
1824 if (fbcon) { 1947 if (fbcon) {
@@ -1830,7 +1953,7 @@ int amdgpu_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon)
1830} 1953}
1831 1954
1832/** 1955/**
1833 * amdgpu_resume_kms - initiate device resume 1956 * amdgpu_device_resume - initiate device resume
1834 * 1957 *
1835 * @pdev: drm dev pointer 1958 * @pdev: drm dev pointer
1836 * 1959 *
@@ -1838,7 +1961,7 @@ int amdgpu_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon)
1838 * Returns 0 for success or an error on failure. 1961 * Returns 0 for success or an error on failure.
1839 * Called at driver resume. 1962 * Called at driver resume.
1840 */ 1963 */
1841int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon) 1964int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
1842{ 1965{
1843 struct drm_connector *connector; 1966 struct drm_connector *connector;
1844 struct amdgpu_device *adev = dev->dev_private; 1967 struct amdgpu_device *adev = dev->dev_private;
@@ -1848,22 +1971,26 @@ int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon)
1848 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) 1971 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
1849 return 0; 1972 return 0;
1850 1973
1851 if (fbcon) { 1974 if (fbcon)
1852 console_lock(); 1975 console_lock();
1853 } 1976
1854 if (resume) { 1977 if (resume) {
1855 pci_set_power_state(dev->pdev, PCI_D0); 1978 pci_set_power_state(dev->pdev, PCI_D0);
1856 pci_restore_state(dev->pdev); 1979 pci_restore_state(dev->pdev);
1857 if (pci_enable_device(dev->pdev)) { 1980 r = pci_enable_device(dev->pdev);
1981 if (r) {
1858 if (fbcon) 1982 if (fbcon)
1859 console_unlock(); 1983 console_unlock();
1860 return -1; 1984 return r;
1861 } 1985 }
1862 } 1986 }
1863 1987
1864 /* post card */ 1988 /* post card */
1865 if (!amdgpu_card_posted(adev)) 1989 if (!amdgpu_card_posted(adev) || !resume) {
1866 amdgpu_atom_asic_init(adev->mode_info.atom_context); 1990 r = amdgpu_atom_asic_init(adev->mode_info.atom_context);
1991 if (r)
1992 DRM_ERROR("amdgpu asic init failed\n");
1993 }
1867 1994
1868 r = amdgpu_resume(adev); 1995 r = amdgpu_resume(adev);
1869 if (r) 1996 if (r)
@@ -1937,6 +2064,126 @@ int amdgpu_resume_kms(struct drm_device *dev, bool resume, bool fbcon)
1937 return 0; 2064 return 0;
1938} 2065}
1939 2066
2067static bool amdgpu_check_soft_reset(struct amdgpu_device *adev)
2068{
2069 int i;
2070 bool asic_hang = false;
2071
2072 for (i = 0; i < adev->num_ip_blocks; i++) {
2073 if (!adev->ip_block_status[i].valid)
2074 continue;
2075 if (adev->ip_blocks[i].funcs->check_soft_reset)
2076 adev->ip_blocks[i].funcs->check_soft_reset(adev);
2077 if (adev->ip_block_status[i].hang) {
2078 DRM_INFO("IP block:%d is hang!\n", i);
2079 asic_hang = true;
2080 }
2081 }
2082 return asic_hang;
2083}
2084
2085static int amdgpu_pre_soft_reset(struct amdgpu_device *adev)
2086{
2087 int i, r = 0;
2088
2089 for (i = 0; i < adev->num_ip_blocks; i++) {
2090 if (!adev->ip_block_status[i].valid)
2091 continue;
2092 if (adev->ip_block_status[i].hang &&
2093 adev->ip_blocks[i].funcs->pre_soft_reset) {
2094 r = adev->ip_blocks[i].funcs->pre_soft_reset(adev);
2095 if (r)
2096 return r;
2097 }
2098 }
2099
2100 return 0;
2101}
2102
2103static bool amdgpu_need_full_reset(struct amdgpu_device *adev)
2104{
2105 if (adev->ip_block_status[AMD_IP_BLOCK_TYPE_GMC].hang ||
2106 adev->ip_block_status[AMD_IP_BLOCK_TYPE_SMC].hang ||
2107 adev->ip_block_status[AMD_IP_BLOCK_TYPE_ACP].hang ||
2108 adev->ip_block_status[AMD_IP_BLOCK_TYPE_DCE].hang) {
2109 DRM_INFO("Some block need full reset!\n");
2110 return true;
2111 }
2112 return false;
2113}
2114
2115static int amdgpu_soft_reset(struct amdgpu_device *adev)
2116{
2117 int i, r = 0;
2118
2119 for (i = 0; i < adev->num_ip_blocks; i++) {
2120 if (!adev->ip_block_status[i].valid)
2121 continue;
2122 if (adev->ip_block_status[i].hang &&
2123 adev->ip_blocks[i].funcs->soft_reset) {
2124 r = adev->ip_blocks[i].funcs->soft_reset(adev);
2125 if (r)
2126 return r;
2127 }
2128 }
2129
2130 return 0;
2131}
2132
2133static int amdgpu_post_soft_reset(struct amdgpu_device *adev)
2134{
2135 int i, r = 0;
2136
2137 for (i = 0; i < adev->num_ip_blocks; i++) {
2138 if (!adev->ip_block_status[i].valid)
2139 continue;
2140 if (adev->ip_block_status[i].hang &&
2141 adev->ip_blocks[i].funcs->post_soft_reset)
2142 r = adev->ip_blocks[i].funcs->post_soft_reset(adev);
2143 if (r)
2144 return r;
2145 }
2146
2147 return 0;
2148}
2149
2150bool amdgpu_need_backup(struct amdgpu_device *adev)
2151{
2152 if (adev->flags & AMD_IS_APU)
2153 return false;
2154
2155 return amdgpu_lockup_timeout > 0 ? true : false;
2156}
2157
2158static int amdgpu_recover_vram_from_shadow(struct amdgpu_device *adev,
2159 struct amdgpu_ring *ring,
2160 struct amdgpu_bo *bo,
2161 struct fence **fence)
2162{
2163 uint32_t domain;
2164 int r;
2165
2166 if (!bo->shadow)
2167 return 0;
2168
2169 r = amdgpu_bo_reserve(bo, false);
2170 if (r)
2171 return r;
2172 domain = amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type);
2173 /* if bo has been evicted, then no need to recover */
2174 if (domain == AMDGPU_GEM_DOMAIN_VRAM) {
2175 r = amdgpu_bo_restore_from_shadow(adev, ring, bo,
2176 NULL, fence, true);
2177 if (r) {
2178 DRM_ERROR("recover page table failed!\n");
2179 goto err;
2180 }
2181 }
2182err:
2183 amdgpu_bo_unreserve(bo);
2184 return r;
2185}
2186
1940/** 2187/**
1941 * amdgpu_gpu_reset - reset the asic 2188 * amdgpu_gpu_reset - reset the asic
1942 * 2189 *
@@ -1949,6 +2196,12 @@ int amdgpu_gpu_reset(struct amdgpu_device *adev)
1949{ 2196{
1950 int i, r; 2197 int i, r;
1951 int resched; 2198 int resched;
2199 bool need_full_reset;
2200
2201 if (!amdgpu_check_soft_reset(adev)) {
2202 DRM_INFO("No hardware hang detected. Did some blocks stall?\n");
2203 return 0;
2204 }
1952 2205
1953 atomic_inc(&adev->gpu_reset_counter); 2206 atomic_inc(&adev->gpu_reset_counter);
1954 2207
@@ -1967,40 +2220,93 @@ int amdgpu_gpu_reset(struct amdgpu_device *adev)
1967 /* after all hw jobs are reset, hw fence is meaningless, so force_completion */ 2220 /* after all hw jobs are reset, hw fence is meaningless, so force_completion */
1968 amdgpu_fence_driver_force_completion(adev); 2221 amdgpu_fence_driver_force_completion(adev);
1969 2222
1970 /* save scratch */ 2223 need_full_reset = amdgpu_need_full_reset(adev);
1971 amdgpu_atombios_scratch_regs_save(adev);
1972 r = amdgpu_suspend(adev);
1973 2224
1974retry: 2225 if (!need_full_reset) {
1975 /* Disable fb access */ 2226 amdgpu_pre_soft_reset(adev);
1976 if (adev->mode_info.num_crtc) { 2227 r = amdgpu_soft_reset(adev);
1977 struct amdgpu_mode_mc_save save; 2228 amdgpu_post_soft_reset(adev);
1978 amdgpu_display_stop_mc_access(adev, &save); 2229 if (r || amdgpu_check_soft_reset(adev)) {
1979 amdgpu_wait_for_idle(adev, AMD_IP_BLOCK_TYPE_GMC); 2230 DRM_INFO("soft reset failed, will fallback to full reset!\n");
2231 need_full_reset = true;
2232 }
1980 } 2233 }
1981 2234
1982 r = amdgpu_asic_reset(adev); 2235 if (need_full_reset) {
1983 /* post card */ 2236 /* save scratch */
1984 amdgpu_atom_asic_init(adev->mode_info.atom_context); 2237 amdgpu_atombios_scratch_regs_save(adev);
2238 r = amdgpu_suspend(adev);
1985 2239
1986 if (!r) { 2240retry:
1987 dev_info(adev->dev, "GPU reset succeeded, trying to resume\n"); 2241 /* Disable fb access */
1988 r = amdgpu_resume(adev); 2242 if (adev->mode_info.num_crtc) {
2243 struct amdgpu_mode_mc_save save;
2244 amdgpu_display_stop_mc_access(adev, &save);
2245 amdgpu_wait_for_idle(adev, AMD_IP_BLOCK_TYPE_GMC);
2246 }
2247
2248 r = amdgpu_asic_reset(adev);
2249 /* post card */
2250 amdgpu_atom_asic_init(adev->mode_info.atom_context);
2251
2252 if (!r) {
2253 dev_info(adev->dev, "GPU reset succeeded, trying to resume\n");
2254 r = amdgpu_resume(adev);
2255 }
2256 /* restore scratch */
2257 amdgpu_atombios_scratch_regs_restore(adev);
1989 } 2258 }
1990 /* restore scratch */
1991 amdgpu_atombios_scratch_regs_restore(adev);
1992 if (!r) { 2259 if (!r) {
2260 amdgpu_irq_gpu_reset_resume_helper(adev);
2261 if (need_full_reset && amdgpu_need_backup(adev)) {
2262 r = amdgpu_ttm_recover_gart(adev);
2263 if (r)
2264 DRM_ERROR("gart recovery failed!!!\n");
2265 }
1993 r = amdgpu_ib_ring_tests(adev); 2266 r = amdgpu_ib_ring_tests(adev);
1994 if (r) { 2267 if (r) {
1995 dev_err(adev->dev, "ib ring test failed (%d).\n", r); 2268 dev_err(adev->dev, "ib ring test failed (%d).\n", r);
1996 r = amdgpu_suspend(adev); 2269 r = amdgpu_suspend(adev);
2270 need_full_reset = true;
1997 goto retry; 2271 goto retry;
1998 } 2272 }
2273 /**
2274 * recovery vm page tables, since we cannot depend on VRAM is
2275 * consistent after gpu full reset.
2276 */
2277 if (need_full_reset && amdgpu_need_backup(adev)) {
2278 struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
2279 struct amdgpu_bo *bo, *tmp;
2280 struct fence *fence = NULL, *next = NULL;
2281
2282 DRM_INFO("recover vram bo from shadow\n");
2283 mutex_lock(&adev->shadow_list_lock);
2284 list_for_each_entry_safe(bo, tmp, &adev->shadow_list, shadow_list) {
2285 amdgpu_recover_vram_from_shadow(adev, ring, bo, &next);
2286 if (fence) {
2287 r = fence_wait(fence, false);
2288 if (r) {
2289 WARN(r, "recovery from shadow isn't comleted\n");
2290 break;
2291 }
2292 }
1999 2293
2294 fence_put(fence);
2295 fence = next;
2296 }
2297 mutex_unlock(&adev->shadow_list_lock);
2298 if (fence) {
2299 r = fence_wait(fence, false);
2300 if (r)
2301 WARN(r, "recovery from shadow isn't comleted\n");
2302 }
2303 fence_put(fence);
2304 }
2000 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { 2305 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
2001 struct amdgpu_ring *ring = adev->rings[i]; 2306 struct amdgpu_ring *ring = adev->rings[i];
2002 if (!ring) 2307 if (!ring)
2003 continue; 2308 continue;
2309
2004 amd_sched_job_recovery(&ring->sched); 2310 amd_sched_job_recovery(&ring->sched);
2005 kthread_unpark(ring->sched.thread); 2311 kthread_unpark(ring->sched.thread);
2006 } 2312 }
@@ -2020,7 +2326,6 @@ retry:
2020 /* bad news, how to tell it to userspace ? */ 2326 /* bad news, how to tell it to userspace ? */
2021 dev_info(adev->dev, "GPU reset failed\n"); 2327 dev_info(adev->dev, "GPU reset failed\n");
2022 } 2328 }
2023 amdgpu_irq_gpu_reset_resume_helper(adev);
2024 2329
2025 return r; 2330 return r;
2026} 2331}
@@ -2178,22 +2483,26 @@ static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
2178 struct amdgpu_device *adev = f->f_inode->i_private; 2483 struct amdgpu_device *adev = f->f_inode->i_private;
2179 ssize_t result = 0; 2484 ssize_t result = 0;
2180 int r; 2485 int r;
2181 bool use_bank; 2486 bool pm_pg_lock, use_bank;
2182 unsigned instance_bank, sh_bank, se_bank; 2487 unsigned instance_bank, sh_bank, se_bank;
2183 2488
2184 if (size & 0x3 || *pos & 0x3) 2489 if (size & 0x3 || *pos & 0x3)
2185 return -EINVAL; 2490 return -EINVAL;
2186 2491
2492 /* are we reading registers for which a PG lock is necessary? */
2493 pm_pg_lock = (*pos >> 23) & 1;
2494
2187 if (*pos & (1ULL << 62)) { 2495 if (*pos & (1ULL << 62)) {
2188 se_bank = (*pos >> 24) & 0x3FF; 2496 se_bank = (*pos >> 24) & 0x3FF;
2189 sh_bank = (*pos >> 34) & 0x3FF; 2497 sh_bank = (*pos >> 34) & 0x3FF;
2190 instance_bank = (*pos >> 44) & 0x3FF; 2498 instance_bank = (*pos >> 44) & 0x3FF;
2191 use_bank = 1; 2499 use_bank = 1;
2192 *pos &= 0xFFFFFF;
2193 } else { 2500 } else {
2194 use_bank = 0; 2501 use_bank = 0;
2195 } 2502 }
2196 2503
2504 *pos &= 0x3FFFF;
2505
2197 if (use_bank) { 2506 if (use_bank) {
2198 if (sh_bank >= adev->gfx.config.max_sh_per_se || 2507 if (sh_bank >= adev->gfx.config.max_sh_per_se ||
2199 se_bank >= adev->gfx.config.max_shader_engines) 2508 se_bank >= adev->gfx.config.max_shader_engines)
@@ -2203,6 +2512,9 @@ static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
2203 sh_bank, instance_bank); 2512 sh_bank, instance_bank);
2204 } 2513 }
2205 2514
2515 if (pm_pg_lock)
2516 mutex_lock(&adev->pm.mutex);
2517
2206 while (size) { 2518 while (size) {
2207 uint32_t value; 2519 uint32_t value;
2208 2520
@@ -2228,6 +2540,9 @@ end:
2228 mutex_unlock(&adev->grbm_idx_mutex); 2540 mutex_unlock(&adev->grbm_idx_mutex);
2229 } 2541 }
2230 2542
2543 if (pm_pg_lock)
2544 mutex_unlock(&adev->pm.mutex);
2545
2231 return result; 2546 return result;
2232} 2547}
2233 2548
@@ -2385,7 +2700,7 @@ static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,
2385 while (size) { 2700 while (size) {
2386 uint32_t value; 2701 uint32_t value;
2387 2702
2388 value = RREG32_SMC(*pos >> 2); 2703 value = RREG32_SMC(*pos);
2389 r = put_user(value, (uint32_t *)buf); 2704 r = put_user(value, (uint32_t *)buf);
2390 if (r) 2705 if (r)
2391 return r; 2706 return r;
@@ -2416,7 +2731,7 @@ static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *
2416 if (r) 2731 if (r)
2417 return r; 2732 return r;
2418 2733
2419 WREG32_SMC(*pos >> 2, value); 2734 WREG32_SMC(*pos, value);
2420 2735
2421 result += 4; 2736 result += 4;
2422 buf += 4; 2737 buf += 4;
@@ -2438,12 +2753,12 @@ static ssize_t amdgpu_debugfs_gca_config_read(struct file *f, char __user *buf,
2438 if (size & 0x3 || *pos & 0x3) 2753 if (size & 0x3 || *pos & 0x3)
2439 return -EINVAL; 2754 return -EINVAL;
2440 2755
2441 config = kmalloc(256 * sizeof(*config), GFP_KERNEL); 2756 config = kmalloc_array(256, sizeof(*config), GFP_KERNEL);
2442 if (!config) 2757 if (!config)
2443 return -ENOMEM; 2758 return -ENOMEM;
2444 2759
2445 /* version, increment each time something is added */ 2760 /* version, increment each time something is added */
2446 config[no_regs++] = 0; 2761 config[no_regs++] = 2;
2447 config[no_regs++] = adev->gfx.config.max_shader_engines; 2762 config[no_regs++] = adev->gfx.config.max_shader_engines;
2448 config[no_regs++] = adev->gfx.config.max_tile_pipes; 2763 config[no_regs++] = adev->gfx.config.max_tile_pipes;
2449 config[no_regs++] = adev->gfx.config.max_cu_per_sh; 2764 config[no_regs++] = adev->gfx.config.max_cu_per_sh;
@@ -2468,6 +2783,15 @@ static ssize_t amdgpu_debugfs_gca_config_read(struct file *f, char __user *buf,
2468 config[no_regs++] = adev->gfx.config.gb_addr_config; 2783 config[no_regs++] = adev->gfx.config.gb_addr_config;
2469 config[no_regs++] = adev->gfx.config.num_rbs; 2784 config[no_regs++] = adev->gfx.config.num_rbs;
2470 2785
2786 /* rev==1 */
2787 config[no_regs++] = adev->rev_id;
2788 config[no_regs++] = adev->pg_flags;
2789 config[no_regs++] = adev->cg_flags;
2790
2791 /* rev==2 */
2792 config[no_regs++] = adev->family;
2793 config[no_regs++] = adev->external_rev_id;
2794
2471 while (size && (*pos < no_regs * 4)) { 2795 while (size && (*pos < no_regs * 4)) {
2472 uint32_t value; 2796 uint32_t value;
2473 2797
@@ -2488,6 +2812,29 @@ static ssize_t amdgpu_debugfs_gca_config_read(struct file *f, char __user *buf,
2488 return result; 2812 return result;
2489} 2813}
2490 2814
2815static ssize_t amdgpu_debugfs_sensor_read(struct file *f, char __user *buf,
2816 size_t size, loff_t *pos)
2817{
2818 struct amdgpu_device *adev = f->f_inode->i_private;
2819 int idx, r;
2820 int32_t value;
2821
2822 if (size != 4 || *pos & 0x3)
2823 return -EINVAL;
2824
2825 /* convert offset to sensor number */
2826 idx = *pos >> 2;
2827
2828 if (adev->powerplay.pp_funcs && adev->powerplay.pp_funcs->read_sensor)
2829 r = adev->powerplay.pp_funcs->read_sensor(adev->powerplay.pp_handle, idx, &value);
2830 else
2831 return -EINVAL;
2832
2833 if (!r)
2834 r = put_user(value, (int32_t *)buf);
2835
2836 return !r ? 4 : r;
2837}
2491 2838
2492static const struct file_operations amdgpu_debugfs_regs_fops = { 2839static const struct file_operations amdgpu_debugfs_regs_fops = {
2493 .owner = THIS_MODULE, 2840 .owner = THIS_MODULE,
@@ -2520,12 +2867,19 @@ static const struct file_operations amdgpu_debugfs_gca_config_fops = {
2520 .llseek = default_llseek 2867 .llseek = default_llseek
2521}; 2868};
2522 2869
2870static const struct file_operations amdgpu_debugfs_sensors_fops = {
2871 .owner = THIS_MODULE,
2872 .read = amdgpu_debugfs_sensor_read,
2873 .llseek = default_llseek
2874};
2875
2523static const struct file_operations *debugfs_regs[] = { 2876static const struct file_operations *debugfs_regs[] = {
2524 &amdgpu_debugfs_regs_fops, 2877 &amdgpu_debugfs_regs_fops,
2525 &amdgpu_debugfs_regs_didt_fops, 2878 &amdgpu_debugfs_regs_didt_fops,
2526 &amdgpu_debugfs_regs_pcie_fops, 2879 &amdgpu_debugfs_regs_pcie_fops,
2527 &amdgpu_debugfs_regs_smc_fops, 2880 &amdgpu_debugfs_regs_smc_fops,
2528 &amdgpu_debugfs_gca_config_fops, 2881 &amdgpu_debugfs_gca_config_fops,
2882 &amdgpu_debugfs_sensors_fops,
2529}; 2883};
2530 2884
2531static const char *debugfs_regs_names[] = { 2885static const char *debugfs_regs_names[] = {
@@ -2534,6 +2888,7 @@ static const char *debugfs_regs_names[] = {
2534 "amdgpu_regs_pcie", 2888 "amdgpu_regs_pcie",
2535 "amdgpu_regs_smc", 2889 "amdgpu_regs_smc",
2536 "amdgpu_gca_config", 2890 "amdgpu_gca_config",
2891 "amdgpu_sensors",
2537}; 2892};
2538 2893
2539static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev) 2894static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
index 76f96028313d..083e2b429872 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
@@ -41,7 +41,7 @@ static void amdgpu_flip_callback(struct fence *f, struct fence_cb *cb)
41 container_of(cb, struct amdgpu_flip_work, cb); 41 container_of(cb, struct amdgpu_flip_work, cb);
42 42
43 fence_put(f); 43 fence_put(f);
44 schedule_work(&work->flip_work); 44 schedule_work(&work->flip_work.work);
45} 45}
46 46
47static bool amdgpu_flip_handle_fence(struct amdgpu_flip_work *work, 47static bool amdgpu_flip_handle_fence(struct amdgpu_flip_work *work,
@@ -63,16 +63,17 @@ static bool amdgpu_flip_handle_fence(struct amdgpu_flip_work *work,
63 63
64static void amdgpu_flip_work_func(struct work_struct *__work) 64static void amdgpu_flip_work_func(struct work_struct *__work)
65{ 65{
66 struct delayed_work *delayed_work =
67 container_of(__work, struct delayed_work, work);
66 struct amdgpu_flip_work *work = 68 struct amdgpu_flip_work *work =
67 container_of(__work, struct amdgpu_flip_work, flip_work); 69 container_of(delayed_work, struct amdgpu_flip_work, flip_work);
68 struct amdgpu_device *adev = work->adev; 70 struct amdgpu_device *adev = work->adev;
69 struct amdgpu_crtc *amdgpuCrtc = adev->mode_info.crtcs[work->crtc_id]; 71 struct amdgpu_crtc *amdgpuCrtc = adev->mode_info.crtcs[work->crtc_id];
70 72
71 struct drm_crtc *crtc = &amdgpuCrtc->base; 73 struct drm_crtc *crtc = &amdgpuCrtc->base;
72 unsigned long flags; 74 unsigned long flags;
73 unsigned i, repcnt = 4; 75 unsigned i;
74 int vpos, hpos, stat, min_udelay = 0; 76 int vpos, hpos;
75 struct drm_vblank_crtc *vblank = &crtc->dev->vblank[work->crtc_id];
76 77
77 if (amdgpu_flip_handle_fence(work, &work->excl)) 78 if (amdgpu_flip_handle_fence(work, &work->excl))
78 return; 79 return;
@@ -81,55 +82,23 @@ static void amdgpu_flip_work_func(struct work_struct *__work)
81 if (amdgpu_flip_handle_fence(work, &work->shared[i])) 82 if (amdgpu_flip_handle_fence(work, &work->shared[i]))
82 return; 83 return;
83 84
84 /* We borrow the event spin lock for protecting flip_status */ 85 /* Wait until we're out of the vertical blank period before the one
85 spin_lock_irqsave(&crtc->dev->event_lock, flags); 86 * targeted by the flip
86
87 /* If this happens to execute within the "virtually extended" vblank
88 * interval before the start of the real vblank interval then it needs
89 * to delay programming the mmio flip until the real vblank is entered.
90 * This prevents completing a flip too early due to the way we fudge
91 * our vblank counter and vblank timestamps in order to work around the
92 * problem that the hw fires vblank interrupts before actual start of
93 * vblank (when line buffer refilling is done for a frame). It
94 * complements the fudging logic in amdgpu_get_crtc_scanoutpos() for
95 * timestamping and amdgpu_get_vblank_counter_kms() for vblank counts.
96 *
97 * In practice this won't execute very often unless on very fast
98 * machines because the time window for this to happen is very small.
99 */ 87 */
100 while (amdgpuCrtc->enabled && --repcnt) { 88 if (amdgpuCrtc->enabled &&
101 /* GET_DISTANCE_TO_VBLANKSTART returns distance to real vblank 89 (amdgpu_get_crtc_scanoutpos(adev->ddev, work->crtc_id, 0,
102 * start in hpos, and to the "fudged earlier" vblank start in 90 &vpos, &hpos, NULL, NULL,
103 * vpos. 91 &crtc->hwmode)
104 */ 92 & (DRM_SCANOUTPOS_VALID | DRM_SCANOUTPOS_IN_VBLANK)) ==
105 stat = amdgpu_get_crtc_scanoutpos(adev->ddev, work->crtc_id, 93 (DRM_SCANOUTPOS_VALID | DRM_SCANOUTPOS_IN_VBLANK) &&
106 GET_DISTANCE_TO_VBLANKSTART, 94 (int)(work->target_vblank -
107 &vpos, &hpos, NULL, NULL, 95 amdgpu_get_vblank_counter_kms(adev->ddev, amdgpuCrtc->crtc_id)) > 0) {
108 &crtc->hwmode); 96 schedule_delayed_work(&work->flip_work, usecs_to_jiffies(1000));
109 97 return;
110 if ((stat & (DRM_SCANOUTPOS_VALID | DRM_SCANOUTPOS_ACCURATE)) !=
111 (DRM_SCANOUTPOS_VALID | DRM_SCANOUTPOS_ACCURATE) ||
112 !(vpos >= 0 && hpos <= 0))
113 break;
114
115 /* Sleep at least until estimated real start of hw vblank */
116 min_udelay = (-hpos + 1) * max(vblank->linedur_ns / 1000, 5);
117 if (min_udelay > vblank->framedur_ns / 2000) {
118 /* Don't wait ridiculously long - something is wrong */
119 repcnt = 0;
120 break;
121 }
122 spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
123 usleep_range(min_udelay, 2 * min_udelay);
124 spin_lock_irqsave(&crtc->dev->event_lock, flags);
125 } 98 }
126 99
127 if (!repcnt) 100 /* We borrow the event spin lock for protecting flip_status */
128 DRM_DEBUG_DRIVER("Delay problem on crtc %d: min_udelay %d, " 101 spin_lock_irqsave(&crtc->dev->event_lock, flags);
129 "framedur %d, linedur %d, stat %d, vpos %d, "
130 "hpos %d\n", work->crtc_id, min_udelay,
131 vblank->framedur_ns / 1000,
132 vblank->linedur_ns / 1000, stat, vpos, hpos);
133 102
134 /* Do the flip (mmio) */ 103 /* Do the flip (mmio) */
135 adev->mode_info.funcs->page_flip(adev, work->crtc_id, work->base, work->async); 104 adev->mode_info.funcs->page_flip(adev, work->crtc_id, work->base, work->async);
@@ -154,25 +123,25 @@ static void amdgpu_unpin_work_func(struct work_struct *__work)
154 int r; 123 int r;
155 124
156 /* unpin of the old buffer */ 125 /* unpin of the old buffer */
157 r = amdgpu_bo_reserve(work->old_rbo, false); 126 r = amdgpu_bo_reserve(work->old_abo, false);
158 if (likely(r == 0)) { 127 if (likely(r == 0)) {
159 r = amdgpu_bo_unpin(work->old_rbo); 128 r = amdgpu_bo_unpin(work->old_abo);
160 if (unlikely(r != 0)) { 129 if (unlikely(r != 0)) {
161 DRM_ERROR("failed to unpin buffer after flip\n"); 130 DRM_ERROR("failed to unpin buffer after flip\n");
162 } 131 }
163 amdgpu_bo_unreserve(work->old_rbo); 132 amdgpu_bo_unreserve(work->old_abo);
164 } else 133 } else
165 DRM_ERROR("failed to reserve buffer after flip\n"); 134 DRM_ERROR("failed to reserve buffer after flip\n");
166 135
167 amdgpu_bo_unref(&work->old_rbo); 136 amdgpu_bo_unref(&work->old_abo);
168 kfree(work->shared); 137 kfree(work->shared);
169 kfree(work); 138 kfree(work);
170} 139}
171 140
172int amdgpu_crtc_page_flip(struct drm_crtc *crtc, 141int amdgpu_crtc_page_flip_target(struct drm_crtc *crtc,
173 struct drm_framebuffer *fb, 142 struct drm_framebuffer *fb,
174 struct drm_pending_vblank_event *event, 143 struct drm_pending_vblank_event *event,
175 uint32_t page_flip_flags) 144 uint32_t page_flip_flags, uint32_t target)
176{ 145{
177 struct drm_device *dev = crtc->dev; 146 struct drm_device *dev = crtc->dev;
178 struct amdgpu_device *adev = dev->dev_private; 147 struct amdgpu_device *adev = dev->dev_private;
@@ -181,7 +150,7 @@ int amdgpu_crtc_page_flip(struct drm_crtc *crtc,
181 struct amdgpu_framebuffer *new_amdgpu_fb; 150 struct amdgpu_framebuffer *new_amdgpu_fb;
182 struct drm_gem_object *obj; 151 struct drm_gem_object *obj;
183 struct amdgpu_flip_work *work; 152 struct amdgpu_flip_work *work;
184 struct amdgpu_bo *new_rbo; 153 struct amdgpu_bo *new_abo;
185 unsigned long flags; 154 unsigned long flags;
186 u64 tiling_flags; 155 u64 tiling_flags;
187 u64 base; 156 u64 base;
@@ -191,7 +160,7 @@ int amdgpu_crtc_page_flip(struct drm_crtc *crtc,
191 if (work == NULL) 160 if (work == NULL)
192 return -ENOMEM; 161 return -ENOMEM;
193 162
194 INIT_WORK(&work->flip_work, amdgpu_flip_work_func); 163 INIT_DELAYED_WORK(&work->flip_work, amdgpu_flip_work_func);
195 INIT_WORK(&work->unpin_work, amdgpu_unpin_work_func); 164 INIT_WORK(&work->unpin_work, amdgpu_unpin_work_func);
196 165
197 work->event = event; 166 work->event = event;
@@ -204,28 +173,28 @@ int amdgpu_crtc_page_flip(struct drm_crtc *crtc,
204 obj = old_amdgpu_fb->obj; 173 obj = old_amdgpu_fb->obj;
205 174
206 /* take a reference to the old object */ 175 /* take a reference to the old object */
207 work->old_rbo = gem_to_amdgpu_bo(obj); 176 work->old_abo = gem_to_amdgpu_bo(obj);
208 amdgpu_bo_ref(work->old_rbo); 177 amdgpu_bo_ref(work->old_abo);
209 178
210 new_amdgpu_fb = to_amdgpu_framebuffer(fb); 179 new_amdgpu_fb = to_amdgpu_framebuffer(fb);
211 obj = new_amdgpu_fb->obj; 180 obj = new_amdgpu_fb->obj;
212 new_rbo = gem_to_amdgpu_bo(obj); 181 new_abo = gem_to_amdgpu_bo(obj);
213 182
214 /* pin the new buffer */ 183 /* pin the new buffer */
215 r = amdgpu_bo_reserve(new_rbo, false); 184 r = amdgpu_bo_reserve(new_abo, false);
216 if (unlikely(r != 0)) { 185 if (unlikely(r != 0)) {
217 DRM_ERROR("failed to reserve new rbo buffer before flip\n"); 186 DRM_ERROR("failed to reserve new abo buffer before flip\n");
218 goto cleanup; 187 goto cleanup;
219 } 188 }
220 189
221 r = amdgpu_bo_pin_restricted(new_rbo, AMDGPU_GEM_DOMAIN_VRAM, 0, 0, &base); 190 r = amdgpu_bo_pin_restricted(new_abo, AMDGPU_GEM_DOMAIN_VRAM, 0, 0, &base);
222 if (unlikely(r != 0)) { 191 if (unlikely(r != 0)) {
223 r = -EINVAL; 192 r = -EINVAL;
224 DRM_ERROR("failed to pin new rbo buffer before flip\n"); 193 DRM_ERROR("failed to pin new abo buffer before flip\n");
225 goto unreserve; 194 goto unreserve;
226 } 195 }
227 196
228 r = reservation_object_get_fences_rcu(new_rbo->tbo.resv, &work->excl, 197 r = reservation_object_get_fences_rcu(new_abo->tbo.resv, &work->excl,
229 &work->shared_count, 198 &work->shared_count,
230 &work->shared); 199 &work->shared);
231 if (unlikely(r != 0)) { 200 if (unlikely(r != 0)) {
@@ -233,16 +202,12 @@ int amdgpu_crtc_page_flip(struct drm_crtc *crtc,
233 goto unpin; 202 goto unpin;
234 } 203 }
235 204
236 amdgpu_bo_get_tiling_flags(new_rbo, &tiling_flags); 205 amdgpu_bo_get_tiling_flags(new_abo, &tiling_flags);
237 amdgpu_bo_unreserve(new_rbo); 206 amdgpu_bo_unreserve(new_abo);
238 207
239 work->base = base; 208 work->base = base;
240 209 work->target_vblank = target - drm_crtc_vblank_count(crtc) +
241 r = drm_crtc_vblank_get(crtc); 210 amdgpu_get_vblank_counter_kms(dev, work->crtc_id);
242 if (r) {
243 DRM_ERROR("failed to get vblank before flip\n");
244 goto pflip_cleanup;
245 }
246 211
247 /* we borrow the event spin lock for protecting flip_wrok */ 212 /* we borrow the event spin lock for protecting flip_wrok */
248 spin_lock_irqsave(&crtc->dev->event_lock, flags); 213 spin_lock_irqsave(&crtc->dev->event_lock, flags);
@@ -250,7 +215,7 @@ int amdgpu_crtc_page_flip(struct drm_crtc *crtc,
250 DRM_DEBUG_DRIVER("flip queue: crtc already busy\n"); 215 DRM_DEBUG_DRIVER("flip queue: crtc already busy\n");
251 spin_unlock_irqrestore(&crtc->dev->event_lock, flags); 216 spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
252 r = -EBUSY; 217 r = -EBUSY;
253 goto vblank_cleanup; 218 goto pflip_cleanup;
254 } 219 }
255 220
256 amdgpu_crtc->pflip_status = AMDGPU_FLIP_PENDING; 221 amdgpu_crtc->pflip_status = AMDGPU_FLIP_PENDING;
@@ -262,26 +227,23 @@ int amdgpu_crtc_page_flip(struct drm_crtc *crtc,
262 /* update crtc fb */ 227 /* update crtc fb */
263 crtc->primary->fb = fb; 228 crtc->primary->fb = fb;
264 spin_unlock_irqrestore(&crtc->dev->event_lock, flags); 229 spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
265 amdgpu_flip_work_func(&work->flip_work); 230 amdgpu_flip_work_func(&work->flip_work.work);
266 return 0; 231 return 0;
267 232
268vblank_cleanup:
269 drm_crtc_vblank_put(crtc);
270
271pflip_cleanup: 233pflip_cleanup:
272 if (unlikely(amdgpu_bo_reserve(new_rbo, false) != 0)) { 234 if (unlikely(amdgpu_bo_reserve(new_abo, false) != 0)) {
273 DRM_ERROR("failed to reserve new rbo in error path\n"); 235 DRM_ERROR("failed to reserve new abo in error path\n");
274 goto cleanup; 236 goto cleanup;
275 } 237 }
276unpin: 238unpin:
277 if (unlikely(amdgpu_bo_unpin(new_rbo) != 0)) { 239 if (unlikely(amdgpu_bo_unpin(new_abo) != 0)) {
278 DRM_ERROR("failed to unpin new rbo in error path\n"); 240 DRM_ERROR("failed to unpin new abo in error path\n");
279 } 241 }
280unreserve: 242unreserve:
281 amdgpu_bo_unreserve(new_rbo); 243 amdgpu_bo_unreserve(new_abo);
282 244
283cleanup: 245cleanup:
284 amdgpu_bo_unref(&work->old_rbo); 246 amdgpu_bo_unref(&work->old_abo);
285 fence_put(work->excl); 247 fence_put(work->excl);
286 for (i = 0; i < work->shared_count; ++i) 248 for (i = 0; i < work->shared_count; ++i)
287 fence_put(work->shared[i]); 249 fence_put(work->shared[i]);
@@ -335,7 +297,7 @@ int amdgpu_crtc_set_config(struct drm_mode_set *set)
335 return ret; 297 return ret;
336} 298}
337 299
338static const char *encoder_names[38] = { 300static const char *encoder_names[41] = {
339 "NONE", 301 "NONE",
340 "INTERNAL_LVDS", 302 "INTERNAL_LVDS",
341 "INTERNAL_TMDS1", 303 "INTERNAL_TMDS1",
@@ -374,6 +336,9 @@ static const char *encoder_names[38] = {
374 "TRAVIS", 336 "TRAVIS",
375 "INTERNAL_VCE", 337 "INTERNAL_VCE",
376 "INTERNAL_UNIPHY3", 338 "INTERNAL_UNIPHY3",
339 "HDMI_ANX9805",
340 "INTERNAL_AMCLK",
341 "VIRTUAL",
377}; 342};
378 343
379static const char *hpd_names[6] = { 344static const char *hpd_names[6] = {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 9aa533cf4ad1..71ed27eb3dde 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -53,13 +53,19 @@
53 * - 3.2.0 - GFX8: Uses EOP_TC_WB_ACTION_EN, so UMDs don't have to do the same 53 * - 3.2.0 - GFX8: Uses EOP_TC_WB_ACTION_EN, so UMDs don't have to do the same
54 * at the end of IBs. 54 * at the end of IBs.
55 * - 3.3.0 - Add VM support for UVD on supported hardware. 55 * - 3.3.0 - Add VM support for UVD on supported hardware.
56 * - 3.4.0 - Add AMDGPU_INFO_NUM_EVICTIONS.
57 * - 3.5.0 - Add support for new UVD_NO_OP register.
58 * - 3.6.0 - kmd involves use CONTEXT_CONTROL in ring buffer.
59 * - 3.7.0 - Add support for VCE clock list packet
60 * - 3.8.0 - Add support raster config init in the kernel
56 */ 61 */
57#define KMS_DRIVER_MAJOR 3 62#define KMS_DRIVER_MAJOR 3
58#define KMS_DRIVER_MINOR 3 63#define KMS_DRIVER_MINOR 8
59#define KMS_DRIVER_PATCHLEVEL 0 64#define KMS_DRIVER_PATCHLEVEL 0
60 65
61int amdgpu_vram_limit = 0; 66int amdgpu_vram_limit = 0;
62int amdgpu_gart_size = -1; /* auto */ 67int amdgpu_gart_size = -1; /* auto */
68int amdgpu_moverate = -1; /* auto */
63int amdgpu_benchmarking = 0; 69int amdgpu_benchmarking = 0;
64int amdgpu_testing = 0; 70int amdgpu_testing = 0;
65int amdgpu_audio = -1; 71int amdgpu_audio = -1;
@@ -84,11 +90,14 @@ int amdgpu_sched_jobs = 32;
84int amdgpu_sched_hw_submission = 2; 90int amdgpu_sched_hw_submission = 2;
85int amdgpu_powerplay = -1; 91int amdgpu_powerplay = -1;
86int amdgpu_powercontainment = 1; 92int amdgpu_powercontainment = 1;
93int amdgpu_sclk_deep_sleep_en = 1;
87unsigned amdgpu_pcie_gen_cap = 0; 94unsigned amdgpu_pcie_gen_cap = 0;
88unsigned amdgpu_pcie_lane_cap = 0; 95unsigned amdgpu_pcie_lane_cap = 0;
89unsigned amdgpu_cg_mask = 0xffffffff; 96unsigned amdgpu_cg_mask = 0xffffffff;
90unsigned amdgpu_pg_mask = 0xffffffff; 97unsigned amdgpu_pg_mask = 0xffffffff;
91char *amdgpu_disable_cu = NULL; 98char *amdgpu_disable_cu = NULL;
99char *amdgpu_virtual_display = NULL;
100unsigned amdgpu_pp_feature_mask = 0xffffffff;
92 101
93MODULE_PARM_DESC(vramlimit, "Restrict VRAM for testing, in megabytes"); 102MODULE_PARM_DESC(vramlimit, "Restrict VRAM for testing, in megabytes");
94module_param_named(vramlimit, amdgpu_vram_limit, int, 0600); 103module_param_named(vramlimit, amdgpu_vram_limit, int, 0600);
@@ -96,6 +105,9 @@ module_param_named(vramlimit, amdgpu_vram_limit, int, 0600);
96MODULE_PARM_DESC(gartsize, "Size of PCIE/IGP gart to setup in megabytes (32, 64, etc., -1 = auto)"); 105MODULE_PARM_DESC(gartsize, "Size of PCIE/IGP gart to setup in megabytes (32, 64, etc., -1 = auto)");
97module_param_named(gartsize, amdgpu_gart_size, int, 0600); 106module_param_named(gartsize, amdgpu_gart_size, int, 0600);
98 107
108MODULE_PARM_DESC(moverate, "Maximum buffer migration rate in MB/s. (32, 64, etc., -1=auto, 0=1=disabled)");
109module_param_named(moverate, amdgpu_moverate, int, 0600);
110
99MODULE_PARM_DESC(benchmark, "Run benchmark"); 111MODULE_PARM_DESC(benchmark, "Run benchmark");
100module_param_named(benchmark, amdgpu_benchmarking, int, 0444); 112module_param_named(benchmark, amdgpu_benchmarking, int, 0444);
101 113
@@ -162,13 +174,17 @@ module_param_named(sched_jobs, amdgpu_sched_jobs, int, 0444);
162MODULE_PARM_DESC(sched_hw_submission, "the max number of HW submissions (default 2)"); 174MODULE_PARM_DESC(sched_hw_submission, "the max number of HW submissions (default 2)");
163module_param_named(sched_hw_submission, amdgpu_sched_hw_submission, int, 0444); 175module_param_named(sched_hw_submission, amdgpu_sched_hw_submission, int, 0444);
164 176
165#ifdef CONFIG_DRM_AMD_POWERPLAY
166MODULE_PARM_DESC(powerplay, "Powerplay component (1 = enable, 0 = disable, -1 = auto (default))"); 177MODULE_PARM_DESC(powerplay, "Powerplay component (1 = enable, 0 = disable, -1 = auto (default))");
167module_param_named(powerplay, amdgpu_powerplay, int, 0444); 178module_param_named(powerplay, amdgpu_powerplay, int, 0444);
168 179
169MODULE_PARM_DESC(powercontainment, "Power Containment (1 = enable (default), 0 = disable)"); 180MODULE_PARM_DESC(powercontainment, "Power Containment (1 = enable (default), 0 = disable)");
170module_param_named(powercontainment, amdgpu_powercontainment, int, 0444); 181module_param_named(powercontainment, amdgpu_powercontainment, int, 0444);
171#endif 182
183MODULE_PARM_DESC(ppfeaturemask, "all power features enabled (default))");
184module_param_named(ppfeaturemask, amdgpu_pp_feature_mask, int, 0444);
185
186MODULE_PARM_DESC(sclkdeepsleep, "SCLK Deep Sleep (1 = enable (default), 0 = disable)");
187module_param_named(sclkdeepsleep, amdgpu_sclk_deep_sleep_en, int, 0444);
172 188
173MODULE_PARM_DESC(pcie_gen_cap, "PCIE Gen Caps (0: autodetect (default))"); 189MODULE_PARM_DESC(pcie_gen_cap, "PCIE Gen Caps (0: autodetect (default))");
174module_param_named(pcie_gen_cap, amdgpu_pcie_gen_cap, uint, 0444); 190module_param_named(pcie_gen_cap, amdgpu_pcie_gen_cap, uint, 0444);
@@ -185,7 +201,84 @@ module_param_named(pg_mask, amdgpu_pg_mask, uint, 0444);
185MODULE_PARM_DESC(disable_cu, "Disable CUs (se.sh.cu,...)"); 201MODULE_PARM_DESC(disable_cu, "Disable CUs (se.sh.cu,...)");
186module_param_named(disable_cu, amdgpu_disable_cu, charp, 0444); 202module_param_named(disable_cu, amdgpu_disable_cu, charp, 0444);
187 203
204MODULE_PARM_DESC(virtual_display, "Enable virtual display feature (the virtual_display will be set like xxxx:xx:xx.x;xxxx:xx:xx.x)");
205module_param_named(virtual_display, amdgpu_virtual_display, charp, 0444);
206
188static const struct pci_device_id pciidlist[] = { 207static const struct pci_device_id pciidlist[] = {
208#ifdef CONFIG_DRM_AMDGPU_SI
209 {0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
210 {0x1002, 0x6784, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
211 {0x1002, 0x6788, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
212 {0x1002, 0x678A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
213 {0x1002, 0x6790, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
214 {0x1002, 0x6791, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
215 {0x1002, 0x6792, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
216 {0x1002, 0x6798, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
217 {0x1002, 0x6799, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
218 {0x1002, 0x679A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
219 {0x1002, 0x679B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
220 {0x1002, 0x679E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
221 {0x1002, 0x679F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
222 {0x1002, 0x6800, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|AMD_IS_MOBILITY},
223 {0x1002, 0x6801, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|AMD_IS_MOBILITY},
224 {0x1002, 0x6802, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|AMD_IS_MOBILITY},
225 {0x1002, 0x6806, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
226 {0x1002, 0x6808, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
227 {0x1002, 0x6809, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
228 {0x1002, 0x6810, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
229 {0x1002, 0x6811, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
230 {0x1002, 0x6816, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
231 {0x1002, 0x6817, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
232 {0x1002, 0x6818, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
233 {0x1002, 0x6819, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN},
234 {0x1002, 0x6600, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
235 {0x1002, 0x6601, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
236 {0x1002, 0x6602, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
237 {0x1002, 0x6603, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
238 {0x1002, 0x6604, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
239 {0x1002, 0x6605, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
240 {0x1002, 0x6606, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
241 {0x1002, 0x6607, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
242 {0x1002, 0x6608, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND},
243 {0x1002, 0x6610, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND},
244 {0x1002, 0x6611, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND},
245 {0x1002, 0x6613, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND},
246 {0x1002, 0x6617, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
247 {0x1002, 0x6620, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
248 {0x1002, 0x6621, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
249 {0x1002, 0x6623, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND|AMD_IS_MOBILITY},
250 {0x1002, 0x6631, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_OLAND},
251 {0x1002, 0x6820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
252 {0x1002, 0x6821, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
253 {0x1002, 0x6822, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
254 {0x1002, 0x6823, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
255 {0x1002, 0x6824, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
256 {0x1002, 0x6825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
257 {0x1002, 0x6826, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
258 {0x1002, 0x6827, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
259 {0x1002, 0x6828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
260 {0x1002, 0x6829, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
261 {0x1002, 0x682A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
262 {0x1002, 0x682B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
263 {0x1002, 0x682C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
264 {0x1002, 0x682D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
265 {0x1002, 0x682F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
266 {0x1002, 0x6830, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
267 {0x1002, 0x6831, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|AMD_IS_MOBILITY},
268 {0x1002, 0x6835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
269 {0x1002, 0x6837, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
270 {0x1002, 0x6838, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
271 {0x1002, 0x6839, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
272 {0x1002, 0x683B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
273 {0x1002, 0x683D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
274 {0x1002, 0x683F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE},
275 {0x1002, 0x6660, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
276 {0x1002, 0x6663, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
277 {0x1002, 0x6664, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
278 {0x1002, 0x6665, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
279 {0x1002, 0x6667, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
280 {0x1002, 0x666F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_HAINAN|AMD_IS_MOBILITY},
281#endif
189#ifdef CONFIG_DRM_AMDGPU_CIK 282#ifdef CONFIG_DRM_AMDGPU_CIK
190 /* Kaveri */ 283 /* Kaveri */
191 {0x1002, 0x1304, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU}, 284 {0x1002, 0x1304, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
@@ -341,7 +434,7 @@ static int amdgpu_kick_out_firmware_fb(struct pci_dev *pdev)
341#ifdef CONFIG_X86 434#ifdef CONFIG_X86
342 primary = pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW; 435 primary = pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;
343#endif 436#endif
344 remove_conflicting_framebuffers(ap, "amdgpudrmfb", primary); 437 drm_fb_helper_remove_conflicting_framebuffers(ap, "amdgpudrmfb", primary);
345 kfree(ap); 438 kfree(ap);
346 439
347 return 0; 440 return 0;
@@ -383,32 +476,70 @@ amdgpu_pci_remove(struct pci_dev *pdev)
383 drm_put_dev(dev); 476 drm_put_dev(dev);
384} 477}
385 478
479static void
480amdgpu_pci_shutdown(struct pci_dev *pdev)
481{
482 /* if we are running in a VM, make sure the device
483 * torn down properly on reboot/shutdown.
484 * unfortunately we can't detect certain
485 * hypervisors so just do this all the time.
486 */
487 amdgpu_pci_remove(pdev);
488}
489
386static int amdgpu_pmops_suspend(struct device *dev) 490static int amdgpu_pmops_suspend(struct device *dev)
387{ 491{
388 struct pci_dev *pdev = to_pci_dev(dev); 492 struct pci_dev *pdev = to_pci_dev(dev);
493
389 struct drm_device *drm_dev = pci_get_drvdata(pdev); 494 struct drm_device *drm_dev = pci_get_drvdata(pdev);
390 return amdgpu_suspend_kms(drm_dev, true, true); 495 return amdgpu_device_suspend(drm_dev, true, true);
391} 496}
392 497
393static int amdgpu_pmops_resume(struct device *dev) 498static int amdgpu_pmops_resume(struct device *dev)
394{ 499{
395 struct pci_dev *pdev = to_pci_dev(dev); 500 struct pci_dev *pdev = to_pci_dev(dev);
396 struct drm_device *drm_dev = pci_get_drvdata(pdev); 501 struct drm_device *drm_dev = pci_get_drvdata(pdev);
397 return amdgpu_resume_kms(drm_dev, true, true); 502
503 /* GPU comes up enabled by the bios on resume */
504 if (amdgpu_device_is_px(drm_dev)) {
505 pm_runtime_disable(dev);
506 pm_runtime_set_active(dev);
507 pm_runtime_enable(dev);
508 }
509
510 return amdgpu_device_resume(drm_dev, true, true);
398} 511}
399 512
400static int amdgpu_pmops_freeze(struct device *dev) 513static int amdgpu_pmops_freeze(struct device *dev)
401{ 514{
402 struct pci_dev *pdev = to_pci_dev(dev); 515 struct pci_dev *pdev = to_pci_dev(dev);
516
403 struct drm_device *drm_dev = pci_get_drvdata(pdev); 517 struct drm_device *drm_dev = pci_get_drvdata(pdev);
404 return amdgpu_suspend_kms(drm_dev, false, true); 518 return amdgpu_device_suspend(drm_dev, false, true);
405} 519}
406 520
407static int amdgpu_pmops_thaw(struct device *dev) 521static int amdgpu_pmops_thaw(struct device *dev)
408{ 522{
409 struct pci_dev *pdev = to_pci_dev(dev); 523 struct pci_dev *pdev = to_pci_dev(dev);
524
525 struct drm_device *drm_dev = pci_get_drvdata(pdev);
526 return amdgpu_device_resume(drm_dev, false, true);
527}
528
529static int amdgpu_pmops_poweroff(struct device *dev)
530{
531 struct pci_dev *pdev = to_pci_dev(dev);
532
533 struct drm_device *drm_dev = pci_get_drvdata(pdev);
534 return amdgpu_device_suspend(drm_dev, true, true);
535}
536
537static int amdgpu_pmops_restore(struct device *dev)
538{
539 struct pci_dev *pdev = to_pci_dev(dev);
540
410 struct drm_device *drm_dev = pci_get_drvdata(pdev); 541 struct drm_device *drm_dev = pci_get_drvdata(pdev);
411 return amdgpu_resume_kms(drm_dev, false, true); 542 return amdgpu_device_resume(drm_dev, false, true);
412} 543}
413 544
414static int amdgpu_pmops_runtime_suspend(struct device *dev) 545static int amdgpu_pmops_runtime_suspend(struct device *dev)
@@ -426,7 +557,7 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)
426 drm_kms_helper_poll_disable(drm_dev); 557 drm_kms_helper_poll_disable(drm_dev);
427 vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_OFF); 558 vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_OFF);
428 559
429 ret = amdgpu_suspend_kms(drm_dev, false, false); 560 ret = amdgpu_device_suspend(drm_dev, false, false);
430 pci_save_state(pdev); 561 pci_save_state(pdev);
431 pci_disable_device(pdev); 562 pci_disable_device(pdev);
432 pci_ignore_hotplug(pdev); 563 pci_ignore_hotplug(pdev);
@@ -459,7 +590,7 @@ static int amdgpu_pmops_runtime_resume(struct device *dev)
459 return ret; 590 return ret;
460 pci_set_master(pdev); 591 pci_set_master(pdev);
461 592
462 ret = amdgpu_resume_kms(drm_dev, false, false); 593 ret = amdgpu_device_resume(drm_dev, false, false);
463 drm_kms_helper_poll_enable(drm_dev); 594 drm_kms_helper_poll_enable(drm_dev);
464 vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_ON); 595 vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_ON);
465 drm_dev->switch_power_state = DRM_SWITCH_POWER_ON; 596 drm_dev->switch_power_state = DRM_SWITCH_POWER_ON;
@@ -513,8 +644,8 @@ static const struct dev_pm_ops amdgpu_pm_ops = {
513 .resume = amdgpu_pmops_resume, 644 .resume = amdgpu_pmops_resume,
514 .freeze = amdgpu_pmops_freeze, 645 .freeze = amdgpu_pmops_freeze,
515 .thaw = amdgpu_pmops_thaw, 646 .thaw = amdgpu_pmops_thaw,
516 .poweroff = amdgpu_pmops_freeze, 647 .poweroff = amdgpu_pmops_poweroff,
517 .restore = amdgpu_pmops_resume, 648 .restore = amdgpu_pmops_restore,
518 .runtime_suspend = amdgpu_pmops_runtime_suspend, 649 .runtime_suspend = amdgpu_pmops_runtime_suspend,
519 .runtime_resume = amdgpu_pmops_runtime_resume, 650 .runtime_resume = amdgpu_pmops_runtime_resume,
520 .runtime_idle = amdgpu_pmops_runtime_idle, 651 .runtime_idle = amdgpu_pmops_runtime_idle,
@@ -596,6 +727,7 @@ static struct pci_driver amdgpu_kms_pci_driver = {
596 .id_table = pciidlist, 727 .id_table = pciidlist,
597 .probe = amdgpu_pci_probe, 728 .probe = amdgpu_pci_probe,
598 .remove = amdgpu_pci_remove, 729 .remove = amdgpu_pci_remove,
730 .shutdown = amdgpu_pci_shutdown,
599 .driver.pm = &amdgpu_pm_ops, 731 .driver.pm = &amdgpu_pm_ops,
600}; 732};
601 733
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
index 919146780a15..9fb8aa4d6bae 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
@@ -25,7 +25,7 @@
25 */ 25 */
26#include <linux/module.h> 26#include <linux/module.h>
27#include <linux/slab.h> 27#include <linux/slab.h>
28#include <linux/fb.h> 28#include <linux/pm_runtime.h>
29 29
30#include <drm/drmP.h> 30#include <drm/drmP.h>
31#include <drm/drm_crtc.h> 31#include <drm/drm_crtc.h>
@@ -48,8 +48,35 @@ struct amdgpu_fbdev {
48 struct amdgpu_device *adev; 48 struct amdgpu_device *adev;
49}; 49};
50 50
51static int
52amdgpufb_open(struct fb_info *info, int user)
53{
54 struct amdgpu_fbdev *rfbdev = info->par;
55 struct amdgpu_device *adev = rfbdev->adev;
56 int ret = pm_runtime_get_sync(adev->ddev->dev);
57 if (ret < 0 && ret != -EACCES) {
58 pm_runtime_mark_last_busy(adev->ddev->dev);
59 pm_runtime_put_autosuspend(adev->ddev->dev);
60 return ret;
61 }
62 return 0;
63}
64
65static int
66amdgpufb_release(struct fb_info *info, int user)
67{
68 struct amdgpu_fbdev *rfbdev = info->par;
69 struct amdgpu_device *adev = rfbdev->adev;
70
71 pm_runtime_mark_last_busy(adev->ddev->dev);
72 pm_runtime_put_autosuspend(adev->ddev->dev);
73 return 0;
74}
75
51static struct fb_ops amdgpufb_ops = { 76static struct fb_ops amdgpufb_ops = {
52 .owner = THIS_MODULE, 77 .owner = THIS_MODULE,
78 .fb_open = amdgpufb_open,
79 .fb_release = amdgpufb_release,
53 .fb_check_var = drm_fb_helper_check_var, 80 .fb_check_var = drm_fb_helper_check_var,
54 .fb_set_par = drm_fb_helper_set_par, 81 .fb_set_par = drm_fb_helper_set_par,
55 .fb_fillrect = drm_fb_helper_cfb_fillrect, 82 .fb_fillrect = drm_fb_helper_cfb_fillrect,
@@ -88,14 +115,14 @@ int amdgpu_align_pitch(struct amdgpu_device *adev, int width, int bpp, bool tile
88 115
89static void amdgpufb_destroy_pinned_object(struct drm_gem_object *gobj) 116static void amdgpufb_destroy_pinned_object(struct drm_gem_object *gobj)
90{ 117{
91 struct amdgpu_bo *rbo = gem_to_amdgpu_bo(gobj); 118 struct amdgpu_bo *abo = gem_to_amdgpu_bo(gobj);
92 int ret; 119 int ret;
93 120
94 ret = amdgpu_bo_reserve(rbo, false); 121 ret = amdgpu_bo_reserve(abo, false);
95 if (likely(ret == 0)) { 122 if (likely(ret == 0)) {
96 amdgpu_bo_kunmap(rbo); 123 amdgpu_bo_kunmap(abo);
97 amdgpu_bo_unpin(rbo); 124 amdgpu_bo_unpin(abo);
98 amdgpu_bo_unreserve(rbo); 125 amdgpu_bo_unreserve(abo);
99 } 126 }
100 drm_gem_object_unreference_unlocked(gobj); 127 drm_gem_object_unreference_unlocked(gobj);
101} 128}
@@ -106,7 +133,7 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,
106{ 133{
107 struct amdgpu_device *adev = rfbdev->adev; 134 struct amdgpu_device *adev = rfbdev->adev;
108 struct drm_gem_object *gobj = NULL; 135 struct drm_gem_object *gobj = NULL;
109 struct amdgpu_bo *rbo = NULL; 136 struct amdgpu_bo *abo = NULL;
110 bool fb_tiled = false; /* useful for testing */ 137 bool fb_tiled = false; /* useful for testing */
111 u32 tiling_flags = 0; 138 u32 tiling_flags = 0;
112 int ret; 139 int ret;
@@ -132,30 +159,30 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,
132 aligned_size); 159 aligned_size);
133 return -ENOMEM; 160 return -ENOMEM;
134 } 161 }
135 rbo = gem_to_amdgpu_bo(gobj); 162 abo = gem_to_amdgpu_bo(gobj);
136 163
137 if (fb_tiled) 164 if (fb_tiled)
138 tiling_flags = AMDGPU_TILING_SET(ARRAY_MODE, GRPH_ARRAY_2D_TILED_THIN1); 165 tiling_flags = AMDGPU_TILING_SET(ARRAY_MODE, GRPH_ARRAY_2D_TILED_THIN1);
139 166
140 ret = amdgpu_bo_reserve(rbo, false); 167 ret = amdgpu_bo_reserve(abo, false);
141 if (unlikely(ret != 0)) 168 if (unlikely(ret != 0))
142 goto out_unref; 169 goto out_unref;
143 170
144 if (tiling_flags) { 171 if (tiling_flags) {
145 ret = amdgpu_bo_set_tiling_flags(rbo, 172 ret = amdgpu_bo_set_tiling_flags(abo,
146 tiling_flags); 173 tiling_flags);
147 if (ret) 174 if (ret)
148 dev_err(adev->dev, "FB failed to set tiling flags\n"); 175 dev_err(adev->dev, "FB failed to set tiling flags\n");
149 } 176 }
150 177
151 178
152 ret = amdgpu_bo_pin_restricted(rbo, AMDGPU_GEM_DOMAIN_VRAM, 0, 0, NULL); 179 ret = amdgpu_bo_pin_restricted(abo, AMDGPU_GEM_DOMAIN_VRAM, 0, 0, NULL);
153 if (ret) { 180 if (ret) {
154 amdgpu_bo_unreserve(rbo); 181 amdgpu_bo_unreserve(abo);
155 goto out_unref; 182 goto out_unref;
156 } 183 }
157 ret = amdgpu_bo_kmap(rbo, NULL); 184 ret = amdgpu_bo_kmap(abo, NULL);
158 amdgpu_bo_unreserve(rbo); 185 amdgpu_bo_unreserve(abo);
159 if (ret) { 186 if (ret) {
160 goto out_unref; 187 goto out_unref;
161 } 188 }
@@ -177,7 +204,7 @@ static int amdgpufb_create(struct drm_fb_helper *helper,
177 struct drm_framebuffer *fb = NULL; 204 struct drm_framebuffer *fb = NULL;
178 struct drm_mode_fb_cmd2 mode_cmd; 205 struct drm_mode_fb_cmd2 mode_cmd;
179 struct drm_gem_object *gobj = NULL; 206 struct drm_gem_object *gobj = NULL;
180 struct amdgpu_bo *rbo = NULL; 207 struct amdgpu_bo *abo = NULL;
181 int ret; 208 int ret;
182 unsigned long tmp; 209 unsigned long tmp;
183 210
@@ -196,7 +223,7 @@ static int amdgpufb_create(struct drm_fb_helper *helper,
196 return ret; 223 return ret;
197 } 224 }
198 225
199 rbo = gem_to_amdgpu_bo(gobj); 226 abo = gem_to_amdgpu_bo(gobj);
200 227
201 /* okay we have an object now allocate the framebuffer */ 228 /* okay we have an object now allocate the framebuffer */
202 info = drm_fb_helper_alloc_fbi(helper); 229 info = drm_fb_helper_alloc_fbi(helper);
@@ -219,7 +246,7 @@ static int amdgpufb_create(struct drm_fb_helper *helper,
219 /* setup helper */ 246 /* setup helper */
220 rfbdev->helper.fb = fb; 247 rfbdev->helper.fb = fb;
221 248
222 memset_io(rbo->kptr, 0x0, amdgpu_bo_size(rbo)); 249 memset_io(abo->kptr, 0x0, amdgpu_bo_size(abo));
223 250
224 strcpy(info->fix.id, "amdgpudrmfb"); 251 strcpy(info->fix.id, "amdgpudrmfb");
225 252
@@ -228,11 +255,11 @@ static int amdgpufb_create(struct drm_fb_helper *helper,
228 info->flags = FBINFO_DEFAULT | FBINFO_CAN_FORCE_OUTPUT; 255 info->flags = FBINFO_DEFAULT | FBINFO_CAN_FORCE_OUTPUT;
229 info->fbops = &amdgpufb_ops; 256 info->fbops = &amdgpufb_ops;
230 257
231 tmp = amdgpu_bo_gpu_offset(rbo) - adev->mc.vram_start; 258 tmp = amdgpu_bo_gpu_offset(abo) - adev->mc.vram_start;
232 info->fix.smem_start = adev->mc.aper_base + tmp; 259 info->fix.smem_start = adev->mc.aper_base + tmp;
233 info->fix.smem_len = amdgpu_bo_size(rbo); 260 info->fix.smem_len = amdgpu_bo_size(abo);
234 info->screen_base = rbo->kptr; 261 info->screen_base = abo->kptr;
235 info->screen_size = amdgpu_bo_size(rbo); 262 info->screen_size = amdgpu_bo_size(abo);
236 263
237 drm_fb_helper_fill_var(info, &rfbdev->helper, sizes->fb_width, sizes->fb_height); 264 drm_fb_helper_fill_var(info, &rfbdev->helper, sizes->fb_width, sizes->fb_height);
238 265
@@ -249,7 +276,7 @@ static int amdgpufb_create(struct drm_fb_helper *helper,
249 276
250 DRM_INFO("fb mappable at 0x%lX\n", info->fix.smem_start); 277 DRM_INFO("fb mappable at 0x%lX\n", info->fix.smem_start);
251 DRM_INFO("vram apper at 0x%lX\n", (unsigned long)adev->mc.aper_base); 278 DRM_INFO("vram apper at 0x%lX\n", (unsigned long)adev->mc.aper_base);
252 DRM_INFO("size %lu\n", (unsigned long)amdgpu_bo_size(rbo)); 279 DRM_INFO("size %lu\n", (unsigned long)amdgpu_bo_size(abo));
253 DRM_INFO("fb depth is %d\n", fb->depth); 280 DRM_INFO("fb depth is %d\n", fb->depth);
254 DRM_INFO(" pitch is %d\n", fb->pitches[0]); 281 DRM_INFO(" pitch is %d\n", fb->pitches[0]);
255 282
@@ -259,7 +286,7 @@ static int amdgpufb_create(struct drm_fb_helper *helper,
259out_destroy_fbi: 286out_destroy_fbi:
260 drm_fb_helper_release_fbi(helper); 287 drm_fb_helper_release_fbi(helper);
261out_unref: 288out_unref:
262 if (rbo) { 289 if (abo) {
263 290
264 } 291 }
265 if (fb && ret) { 292 if (fb && ret) {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
index 0b109aebfec6..3a2e42f4b897 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
@@ -454,6 +454,7 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev)
454 for (j = 0; j <= ring->fence_drv.num_fences_mask; ++j) 454 for (j = 0; j <= ring->fence_drv.num_fences_mask; ++j)
455 fence_put(ring->fence_drv.fences[j]); 455 fence_put(ring->fence_drv.fences[j]);
456 kfree(ring->fence_drv.fences); 456 kfree(ring->fence_drv.fences);
457 ring->fence_drv.fences = NULL;
457 ring->fence_drv.initialized = false; 458 ring->fence_drv.initialized = false;
458 } 459 }
459} 460}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
index 0feea347f680..21a1242fc13b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
@@ -238,7 +238,7 @@ void amdgpu_gart_unbind(struct amdgpu_device *adev, uint64_t offset,
238 t = offset / AMDGPU_GPU_PAGE_SIZE; 238 t = offset / AMDGPU_GPU_PAGE_SIZE;
239 p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); 239 p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE);
240 for (i = 0; i < pages; i++, p++) { 240 for (i = 0; i < pages; i++, p++) {
241#ifdef CONFIG_AMDGPU_GART_DEBUGFS 241#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
242 adev->gart.pages[p] = NULL; 242 adev->gart.pages[p] = NULL;
243#endif 243#endif
244 page_base = adev->dummy_page.addr; 244 page_base = adev->dummy_page.addr;
@@ -286,7 +286,7 @@ int amdgpu_gart_bind(struct amdgpu_device *adev, uint64_t offset,
286 p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); 286 p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE);
287 287
288 for (i = 0; i < pages; i++, p++) { 288 for (i = 0; i < pages; i++, p++) {
289#ifdef CONFIG_AMDGPU_GART_DEBUGFS 289#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
290 adev->gart.pages[p] = pagelist[i]; 290 adev->gart.pages[p] = pagelist[i];
291#endif 291#endif
292 if (adev->gart.ptr) { 292 if (adev->gart.ptr) {
@@ -331,7 +331,7 @@ int amdgpu_gart_init(struct amdgpu_device *adev)
331 DRM_INFO("GART: num cpu pages %u, num gpu pages %u\n", 331 DRM_INFO("GART: num cpu pages %u, num gpu pages %u\n",
332 adev->gart.num_cpu_pages, adev->gart.num_gpu_pages); 332 adev->gart.num_cpu_pages, adev->gart.num_gpu_pages);
333 333
334#ifdef CONFIG_AMDGPU_GART_DEBUGFS 334#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
335 /* Allocate pages table */ 335 /* Allocate pages table */
336 adev->gart.pages = vzalloc(sizeof(void *) * adev->gart.num_cpu_pages); 336 adev->gart.pages = vzalloc(sizeof(void *) * adev->gart.num_cpu_pages);
337 if (adev->gart.pages == NULL) { 337 if (adev->gart.pages == NULL) {
@@ -357,7 +357,7 @@ void amdgpu_gart_fini(struct amdgpu_device *adev)
357 amdgpu_gart_unbind(adev, 0, adev->gart.num_cpu_pages); 357 amdgpu_gart_unbind(adev, 0, adev->gart.num_cpu_pages);
358 } 358 }
359 adev->gart.ready = false; 359 adev->gart.ready = false;
360#ifdef CONFIG_AMDGPU_GART_DEBUGFS 360#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
361 vfree(adev->gart.pages); 361 vfree(adev->gart.pages);
362 adev->gart.pages = NULL; 362 adev->gart.pages = NULL;
363#endif 363#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gds.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gds.h
index 503d54098128..e73728d90388 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gds.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gds.h
@@ -31,14 +31,6 @@
31#define AMDGPU_GWS_SHIFT PAGE_SHIFT 31#define AMDGPU_GWS_SHIFT PAGE_SHIFT
32#define AMDGPU_OA_SHIFT PAGE_SHIFT 32#define AMDGPU_OA_SHIFT PAGE_SHIFT
33 33
34#define AMDGPU_PL_GDS TTM_PL_PRIV0
35#define AMDGPU_PL_GWS TTM_PL_PRIV1
36#define AMDGPU_PL_OA TTM_PL_PRIV2
37
38#define AMDGPU_PL_FLAG_GDS TTM_PL_FLAG_PRIV0
39#define AMDGPU_PL_FLAG_GWS TTM_PL_FLAG_PRIV1
40#define AMDGPU_PL_FLAG_OA TTM_PL_FLAG_PRIV2
41
42struct amdgpu_ring; 34struct amdgpu_ring;
43struct amdgpu_bo; 35struct amdgpu_bo;
44 36
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
index 88fbed2389c0..a7ea9a3b454e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
@@ -118,23 +118,23 @@ void amdgpu_gem_force_release(struct amdgpu_device *adev)
118 */ 118 */
119int amdgpu_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_priv) 119int amdgpu_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_priv)
120{ 120{
121 struct amdgpu_bo *rbo = gem_to_amdgpu_bo(obj); 121 struct amdgpu_bo *abo = gem_to_amdgpu_bo(obj);
122 struct amdgpu_device *adev = rbo->adev; 122 struct amdgpu_device *adev = abo->adev;
123 struct amdgpu_fpriv *fpriv = file_priv->driver_priv; 123 struct amdgpu_fpriv *fpriv = file_priv->driver_priv;
124 struct amdgpu_vm *vm = &fpriv->vm; 124 struct amdgpu_vm *vm = &fpriv->vm;
125 struct amdgpu_bo_va *bo_va; 125 struct amdgpu_bo_va *bo_va;
126 int r; 126 int r;
127 r = amdgpu_bo_reserve(rbo, false); 127 r = amdgpu_bo_reserve(abo, false);
128 if (r) 128 if (r)
129 return r; 129 return r;
130 130
131 bo_va = amdgpu_vm_bo_find(vm, rbo); 131 bo_va = amdgpu_vm_bo_find(vm, abo);
132 if (!bo_va) { 132 if (!bo_va) {
133 bo_va = amdgpu_vm_bo_add(adev, vm, rbo); 133 bo_va = amdgpu_vm_bo_add(adev, vm, abo);
134 } else { 134 } else {
135 ++bo_va->ref_count; 135 ++bo_va->ref_count;
136 } 136 }
137 amdgpu_bo_unreserve(rbo); 137 amdgpu_bo_unreserve(abo);
138 return 0; 138 return 0;
139} 139}
140 140
@@ -528,7 +528,7 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev,
528 goto error_unreserve; 528 goto error_unreserve;
529 529
530 if (operation == AMDGPU_VA_OP_MAP) 530 if (operation == AMDGPU_VA_OP_MAP)
531 r = amdgpu_vm_bo_update(adev, bo_va, &bo_va->bo->tbo.mem); 531 r = amdgpu_vm_bo_update(adev, bo_va, false);
532 532
533error_unreserve: 533error_unreserve:
534 ttm_eu_backoff_reservation(&ticket, &list); 534 ttm_eu_backoff_reservation(&ticket, &list);
@@ -547,7 +547,7 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
547 struct drm_gem_object *gobj; 547 struct drm_gem_object *gobj;
548 struct amdgpu_device *adev = dev->dev_private; 548 struct amdgpu_device *adev = dev->dev_private;
549 struct amdgpu_fpriv *fpriv = filp->driver_priv; 549 struct amdgpu_fpriv *fpriv = filp->driver_priv;
550 struct amdgpu_bo *rbo; 550 struct amdgpu_bo *abo;
551 struct amdgpu_bo_va *bo_va; 551 struct amdgpu_bo_va *bo_va;
552 struct ttm_validate_buffer tv, tv_pd; 552 struct ttm_validate_buffer tv, tv_pd;
553 struct ww_acquire_ctx ticket; 553 struct ww_acquire_ctx ticket;
@@ -587,10 +587,10 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
587 gobj = drm_gem_object_lookup(filp, args->handle); 587 gobj = drm_gem_object_lookup(filp, args->handle);
588 if (gobj == NULL) 588 if (gobj == NULL)
589 return -ENOENT; 589 return -ENOENT;
590 rbo = gem_to_amdgpu_bo(gobj); 590 abo = gem_to_amdgpu_bo(gobj);
591 INIT_LIST_HEAD(&list); 591 INIT_LIST_HEAD(&list);
592 INIT_LIST_HEAD(&duplicates); 592 INIT_LIST_HEAD(&duplicates);
593 tv.bo = &rbo->tbo; 593 tv.bo = &abo->tbo;
594 tv.shared = true; 594 tv.shared = true;
595 list_add(&tv.head, &list); 595 list_add(&tv.head, &list);
596 596
@@ -604,7 +604,7 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
604 return r; 604 return r;
605 } 605 }
606 606
607 bo_va = amdgpu_vm_bo_find(&fpriv->vm, rbo); 607 bo_va = amdgpu_vm_bo_find(&fpriv->vm, abo);
608 if (!bo_va) { 608 if (!bo_va) {
609 ttm_eu_backoff_reservation(&ticket, &list); 609 ttm_eu_backoff_reservation(&ticket, &list);
610 drm_gem_object_unreference_unlocked(gobj); 610 drm_gem_object_unreference_unlocked(gobj);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
new file mode 100644
index 000000000000..f86c84427778
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
@@ -0,0 +1,239 @@
1/*
2 * Copyright 2016 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 * Authors: Christian König
23 */
24
25#include <drm/drmP.h>
26#include "amdgpu.h"
27
28struct amdgpu_gtt_mgr {
29 struct drm_mm mm;
30 spinlock_t lock;
31 uint64_t available;
32};
33
34/**
35 * amdgpu_gtt_mgr_init - init GTT manager and DRM MM
36 *
37 * @man: TTM memory type manager
38 * @p_size: maximum size of GTT
39 *
40 * Allocate and initialize the GTT manager.
41 */
42static int amdgpu_gtt_mgr_init(struct ttm_mem_type_manager *man,
43 unsigned long p_size)
44{
45 struct amdgpu_gtt_mgr *mgr;
46
47 mgr = kzalloc(sizeof(*mgr), GFP_KERNEL);
48 if (!mgr)
49 return -ENOMEM;
50
51 drm_mm_init(&mgr->mm, 0, p_size);
52 spin_lock_init(&mgr->lock);
53 mgr->available = p_size;
54 man->priv = mgr;
55 return 0;
56}
57
58/**
59 * amdgpu_gtt_mgr_fini - free and destroy GTT manager
60 *
61 * @man: TTM memory type manager
62 *
63 * Destroy and free the GTT manager, returns -EBUSY if ranges are still
64 * allocated inside it.
65 */
66static int amdgpu_gtt_mgr_fini(struct ttm_mem_type_manager *man)
67{
68 struct amdgpu_gtt_mgr *mgr = man->priv;
69
70 spin_lock(&mgr->lock);
71 if (!drm_mm_clean(&mgr->mm)) {
72 spin_unlock(&mgr->lock);
73 return -EBUSY;
74 }
75
76 drm_mm_takedown(&mgr->mm);
77 spin_unlock(&mgr->lock);
78 kfree(mgr);
79 man->priv = NULL;
80 return 0;
81}
82
83/**
84 * amdgpu_gtt_mgr_alloc - allocate new ranges
85 *
86 * @man: TTM memory type manager
87 * @tbo: TTM BO we need this range for
88 * @place: placement flags and restrictions
89 * @mem: the resulting mem object
90 *
91 * Allocate the address space for a node.
92 */
93int amdgpu_gtt_mgr_alloc(struct ttm_mem_type_manager *man,
94 struct ttm_buffer_object *tbo,
95 const struct ttm_place *place,
96 struct ttm_mem_reg *mem)
97{
98 struct amdgpu_gtt_mgr *mgr = man->priv;
99 struct drm_mm_node *node = mem->mm_node;
100 enum drm_mm_search_flags sflags = DRM_MM_SEARCH_BEST;
101 enum drm_mm_allocator_flags aflags = DRM_MM_CREATE_DEFAULT;
102 unsigned long fpfn, lpfn;
103 int r;
104
105 if (node->start != AMDGPU_BO_INVALID_OFFSET)
106 return 0;
107
108 if (place)
109 fpfn = place->fpfn;
110 else
111 fpfn = 0;
112
113 if (place && place->lpfn)
114 lpfn = place->lpfn;
115 else
116 lpfn = man->size;
117
118 if (place && place->flags & TTM_PL_FLAG_TOPDOWN) {
119 sflags = DRM_MM_SEARCH_BELOW;
120 aflags = DRM_MM_CREATE_TOP;
121 }
122
123 spin_lock(&mgr->lock);
124 r = drm_mm_insert_node_in_range_generic(&mgr->mm, node, mem->num_pages,
125 mem->page_alignment, 0,
126 fpfn, lpfn, sflags, aflags);
127 spin_unlock(&mgr->lock);
128
129 if (!r) {
130 mem->start = node->start;
131 if (&tbo->mem == mem)
132 tbo->offset = (tbo->mem.start << PAGE_SHIFT) +
133 tbo->bdev->man[tbo->mem.mem_type].gpu_offset;
134 }
135
136 return r;
137}
138
139/**
140 * amdgpu_gtt_mgr_new - allocate a new node
141 *
142 * @man: TTM memory type manager
143 * @tbo: TTM BO we need this range for
144 * @place: placement flags and restrictions
145 * @mem: the resulting mem object
146 *
147 * Dummy, allocate the node but no space for it yet.
148 */
149static int amdgpu_gtt_mgr_new(struct ttm_mem_type_manager *man,
150 struct ttm_buffer_object *tbo,
151 const struct ttm_place *place,
152 struct ttm_mem_reg *mem)
153{
154 struct amdgpu_gtt_mgr *mgr = man->priv;
155 struct drm_mm_node *node;
156 int r;
157
158 spin_lock(&mgr->lock);
159 if (mgr->available < mem->num_pages) {
160 spin_unlock(&mgr->lock);
161 return 0;
162 }
163 mgr->available -= mem->num_pages;
164 spin_unlock(&mgr->lock);
165
166 node = kzalloc(sizeof(*node), GFP_KERNEL);
167 if (!node)
168 return -ENOMEM;
169
170 node->start = AMDGPU_BO_INVALID_OFFSET;
171 mem->mm_node = node;
172
173 if (place->fpfn || place->lpfn || place->flags & TTM_PL_FLAG_TOPDOWN) {
174 r = amdgpu_gtt_mgr_alloc(man, tbo, place, mem);
175 if (unlikely(r)) {
176 kfree(node);
177 mem->mm_node = NULL;
178 }
179 } else {
180 mem->start = node->start;
181 }
182
183 return 0;
184}
185
186/**
187 * amdgpu_gtt_mgr_del - free ranges
188 *
189 * @man: TTM memory type manager
190 * @tbo: TTM BO we need this range for
191 * @place: placement flags and restrictions
192 * @mem: TTM memory object
193 *
194 * Free the allocated GTT again.
195 */
196static void amdgpu_gtt_mgr_del(struct ttm_mem_type_manager *man,
197 struct ttm_mem_reg *mem)
198{
199 struct amdgpu_gtt_mgr *mgr = man->priv;
200 struct drm_mm_node *node = mem->mm_node;
201
202 if (!node)
203 return;
204
205 spin_lock(&mgr->lock);
206 if (node->start != AMDGPU_BO_INVALID_OFFSET)
207 drm_mm_remove_node(node);
208 mgr->available += mem->num_pages;
209 spin_unlock(&mgr->lock);
210
211 kfree(node);
212 mem->mm_node = NULL;
213}
214
215/**
216 * amdgpu_gtt_mgr_debug - dump VRAM table
217 *
218 * @man: TTM memory type manager
219 * @prefix: text prefix
220 *
221 * Dump the table content using printk.
222 */
223static void amdgpu_gtt_mgr_debug(struct ttm_mem_type_manager *man,
224 const char *prefix)
225{
226 struct amdgpu_gtt_mgr *mgr = man->priv;
227
228 spin_lock(&mgr->lock);
229 drm_mm_debug_table(&mgr->mm, prefix);
230 spin_unlock(&mgr->lock);
231}
232
233const struct ttm_mem_type_manager_func amdgpu_gtt_mgr_func = {
234 amdgpu_gtt_mgr_init,
235 amdgpu_gtt_mgr_fini,
236 amdgpu_gtt_mgr_new,
237 amdgpu_gtt_mgr_del,
238 amdgpu_gtt_mgr_debug
239};
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.c
index 31a676376d73..91d367399956 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.c
@@ -158,8 +158,8 @@ static const struct i2c_algorithm amdgpu_atombios_i2c_algo = {
158}; 158};
159 159
160struct amdgpu_i2c_chan *amdgpu_i2c_create(struct drm_device *dev, 160struct amdgpu_i2c_chan *amdgpu_i2c_create(struct drm_device *dev,
161 struct amdgpu_i2c_bus_rec *rec, 161 const struct amdgpu_i2c_bus_rec *rec,
162 const char *name) 162 const char *name)
163{ 163{
164 struct amdgpu_i2c_chan *i2c; 164 struct amdgpu_i2c_chan *i2c;
165 int ret; 165 int ret;
@@ -186,10 +186,8 @@ struct amdgpu_i2c_chan *amdgpu_i2c_create(struct drm_device *dev,
186 "AMDGPU i2c hw bus %s", name); 186 "AMDGPU i2c hw bus %s", name);
187 i2c->adapter.algo = &amdgpu_atombios_i2c_algo; 187 i2c->adapter.algo = &amdgpu_atombios_i2c_algo;
188 ret = i2c_add_adapter(&i2c->adapter); 188 ret = i2c_add_adapter(&i2c->adapter);
189 if (ret) { 189 if (ret)
190 DRM_ERROR("Failed to register hw i2c %s\n", name);
191 goto out_free; 190 goto out_free;
192 }
193 } else { 191 } else {
194 /* set the amdgpu bit adapter */ 192 /* set the amdgpu bit adapter */
195 snprintf(i2c->adapter.name, sizeof(i2c->adapter.name), 193 snprintf(i2c->adapter.name, sizeof(i2c->adapter.name),
@@ -222,6 +220,7 @@ void amdgpu_i2c_destroy(struct amdgpu_i2c_chan *i2c)
222{ 220{
223 if (!i2c) 221 if (!i2c)
224 return; 222 return;
223 WARN_ON(i2c->has_aux);
225 i2c_del_adapter(&i2c->adapter); 224 i2c_del_adapter(&i2c->adapter);
226 kfree(i2c); 225 kfree(i2c);
227} 226}
@@ -251,8 +250,8 @@ void amdgpu_i2c_fini(struct amdgpu_device *adev)
251 250
252/* Add additional buses */ 251/* Add additional buses */
253void amdgpu_i2c_add(struct amdgpu_device *adev, 252void amdgpu_i2c_add(struct amdgpu_device *adev,
254 struct amdgpu_i2c_bus_rec *rec, 253 const struct amdgpu_i2c_bus_rec *rec,
255 const char *name) 254 const char *name)
256{ 255{
257 struct drm_device *dev = adev->ddev; 256 struct drm_device *dev = adev->ddev;
258 int i; 257 int i;
@@ -268,7 +267,7 @@ void amdgpu_i2c_add(struct amdgpu_device *adev,
268/* looks up bus based on id */ 267/* looks up bus based on id */
269struct amdgpu_i2c_chan * 268struct amdgpu_i2c_chan *
270amdgpu_i2c_lookup(struct amdgpu_device *adev, 269amdgpu_i2c_lookup(struct amdgpu_device *adev,
271 struct amdgpu_i2c_bus_rec *i2c_bus) 270 const struct amdgpu_i2c_bus_rec *i2c_bus)
272{ 271{
273 int i; 272 int i;
274 273
@@ -338,7 +337,7 @@ static void amdgpu_i2c_put_byte(struct amdgpu_i2c_chan *i2c_bus,
338 337
339/* ddc router switching */ 338/* ddc router switching */
340void 339void
341amdgpu_i2c_router_select_ddc_port(struct amdgpu_connector *amdgpu_connector) 340amdgpu_i2c_router_select_ddc_port(const struct amdgpu_connector *amdgpu_connector)
342{ 341{
343 u8 val; 342 u8 val;
344 343
@@ -367,7 +366,7 @@ amdgpu_i2c_router_select_ddc_port(struct amdgpu_connector *amdgpu_connector)
367 366
368/* clock/data router switching */ 367/* clock/data router switching */
369void 368void
370amdgpu_i2c_router_select_cd_port(struct amdgpu_connector *amdgpu_connector) 369amdgpu_i2c_router_select_cd_port(const struct amdgpu_connector *amdgpu_connector)
371{ 370{
372 u8 val; 371 u8 val;
373 372
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.h
index d81e19b53973..63c2ff7499e1 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.h
@@ -25,20 +25,20 @@
25#define __AMDGPU_I2C_H__ 25#define __AMDGPU_I2C_H__
26 26
27struct amdgpu_i2c_chan *amdgpu_i2c_create(struct drm_device *dev, 27struct amdgpu_i2c_chan *amdgpu_i2c_create(struct drm_device *dev,
28 struct amdgpu_i2c_bus_rec *rec, 28 const struct amdgpu_i2c_bus_rec *rec,
29 const char *name); 29 const char *name);
30void amdgpu_i2c_destroy(struct amdgpu_i2c_chan *i2c); 30void amdgpu_i2c_destroy(struct amdgpu_i2c_chan *i2c);
31void amdgpu_i2c_init(struct amdgpu_device *adev); 31void amdgpu_i2c_init(struct amdgpu_device *adev);
32void amdgpu_i2c_fini(struct amdgpu_device *adev); 32void amdgpu_i2c_fini(struct amdgpu_device *adev);
33void amdgpu_i2c_add(struct amdgpu_device *adev, 33void amdgpu_i2c_add(struct amdgpu_device *adev,
34 struct amdgpu_i2c_bus_rec *rec, 34 const struct amdgpu_i2c_bus_rec *rec,
35 const char *name); 35 const char *name);
36struct amdgpu_i2c_chan * 36struct amdgpu_i2c_chan *
37amdgpu_i2c_lookup(struct amdgpu_device *adev, 37amdgpu_i2c_lookup(struct amdgpu_device *adev,
38 struct amdgpu_i2c_bus_rec *i2c_bus); 38 const struct amdgpu_i2c_bus_rec *i2c_bus);
39void 39void
40amdgpu_i2c_router_select_ddc_port(struct amdgpu_connector *amdgpu_connector); 40amdgpu_i2c_router_select_ddc_port(const struct amdgpu_connector *connector);
41void 41void
42amdgpu_i2c_router_select_cd_port(struct amdgpu_connector *amdgpu_connector); 42amdgpu_i2c_router_select_cd_port(const struct amdgpu_connector *connector);
43 43
44#endif 44#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
index ec1282af2479..6a6c86c9c169 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
@@ -124,7 +124,8 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
124 bool skip_preamble, need_ctx_switch; 124 bool skip_preamble, need_ctx_switch;
125 unsigned patch_offset = ~0; 125 unsigned patch_offset = ~0;
126 struct amdgpu_vm *vm; 126 struct amdgpu_vm *vm;
127 uint64_t ctx; 127 uint64_t fence_ctx;
128 uint32_t status = 0, alloc_size;
128 129
129 unsigned i; 130 unsigned i;
130 int r = 0; 131 int r = 0;
@@ -135,14 +136,14 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
135 /* ring tests don't use a job */ 136 /* ring tests don't use a job */
136 if (job) { 137 if (job) {
137 vm = job->vm; 138 vm = job->vm;
138 ctx = job->ctx; 139 fence_ctx = job->fence_ctx;
139 } else { 140 } else {
140 vm = NULL; 141 vm = NULL;
141 ctx = 0; 142 fence_ctx = 0;
142 } 143 }
143 144
144 if (!ring->ready) { 145 if (!ring->ready) {
145 dev_err(adev->dev, "couldn't schedule ib\n"); 146 dev_err(adev->dev, "couldn't schedule ib on ring <%s>\n", ring->name);
146 return -EINVAL; 147 return -EINVAL;
147 } 148 }
148 149
@@ -151,7 +152,10 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
151 return -EINVAL; 152 return -EINVAL;
152 } 153 }
153 154
154 r = amdgpu_ring_alloc(ring, 256 * num_ibs); 155 alloc_size = amdgpu_ring_get_dma_frame_size(ring) +
156 num_ibs * amdgpu_ring_get_emit_ib_size(ring);
157
158 r = amdgpu_ring_alloc(ring, alloc_size);
155 if (r) { 159 if (r) {
156 dev_err(adev->dev, "scheduling IB failed (%d).\n", r); 160 dev_err(adev->dev, "scheduling IB failed (%d).\n", r);
157 return r; 161 return r;
@@ -174,13 +178,22 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
174 /* always set cond_exec_polling to CONTINUE */ 178 /* always set cond_exec_polling to CONTINUE */
175 *ring->cond_exe_cpu_addr = 1; 179 *ring->cond_exe_cpu_addr = 1;
176 180
177 skip_preamble = ring->current_ctx == ctx; 181 skip_preamble = ring->current_ctx == fence_ctx;
178 need_ctx_switch = ring->current_ctx != ctx; 182 need_ctx_switch = ring->current_ctx != fence_ctx;
183 if (job && ring->funcs->emit_cntxcntl) {
184 if (need_ctx_switch)
185 status |= AMDGPU_HAVE_CTX_SWITCH;
186 status |= job->preamble_status;
187 amdgpu_ring_emit_cntxcntl(ring, status);
188 }
189
179 for (i = 0; i < num_ibs; ++i) { 190 for (i = 0; i < num_ibs; ++i) {
180 ib = &ibs[i]; 191 ib = &ibs[i];
181 192
182 /* drop preamble IBs if we don't have a context switch */ 193 /* drop preamble IBs if we don't have a context switch */
183 if ((ib->flags & AMDGPU_IB_FLAG_PREAMBLE) && skip_preamble) 194 if ((ib->flags & AMDGPU_IB_FLAG_PREAMBLE) &&
195 skip_preamble &&
196 !(status & AMDGPU_PREAMBLE_IB_PRESENT_FIRST))
184 continue; 197 continue;
185 198
186 amdgpu_ring_emit_ib(ring, ib, job ? job->vm_id : 0, 199 amdgpu_ring_emit_ib(ring, ib, job ? job->vm_id : 0,
@@ -209,7 +222,9 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
209 if (patch_offset != ~0 && ring->funcs->patch_cond_exec) 222 if (patch_offset != ~0 && ring->funcs->patch_cond_exec)
210 amdgpu_ring_patch_cond_exec(ring, patch_offset); 223 amdgpu_ring_patch_cond_exec(ring, patch_offset);
211 224
212 ring->current_ctx = ctx; 225 ring->current_ctx = fence_ctx;
226 if (ring->funcs->emit_switch_buffer)
227 amdgpu_ring_emit_switch_buffer(ring);
213 amdgpu_ring_commit(ring); 228 amdgpu_ring_commit(ring);
214 return 0; 229 return 0;
215} 230}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
index 534fc04e80fd..3ab4c65ecc8b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c
@@ -40,32 +40,15 @@ static int amdgpu_ih_ring_alloc(struct amdgpu_device *adev)
40 40
41 /* Allocate ring buffer */ 41 /* Allocate ring buffer */
42 if (adev->irq.ih.ring_obj == NULL) { 42 if (adev->irq.ih.ring_obj == NULL) {
43 r = amdgpu_bo_create(adev, adev->irq.ih.ring_size, 43 r = amdgpu_bo_create_kernel(adev, adev->irq.ih.ring_size,
44 PAGE_SIZE, true, 44 PAGE_SIZE, AMDGPU_GEM_DOMAIN_GTT,
45 AMDGPU_GEM_DOMAIN_GTT, 0, 45 &adev->irq.ih.ring_obj,
46 NULL, NULL, &adev->irq.ih.ring_obj); 46 &adev->irq.ih.gpu_addr,
47 (void **)&adev->irq.ih.ring);
47 if (r) { 48 if (r) {
48 DRM_ERROR("amdgpu: failed to create ih ring buffer (%d).\n", r); 49 DRM_ERROR("amdgpu: failed to create ih ring buffer (%d).\n", r);
49 return r; 50 return r;
50 } 51 }
51 r = amdgpu_bo_reserve(adev->irq.ih.ring_obj, false);
52 if (unlikely(r != 0))
53 return r;
54 r = amdgpu_bo_pin(adev->irq.ih.ring_obj,
55 AMDGPU_GEM_DOMAIN_GTT,
56 &adev->irq.ih.gpu_addr);
57 if (r) {
58 amdgpu_bo_unreserve(adev->irq.ih.ring_obj);
59 DRM_ERROR("amdgpu: failed to pin ih ring buffer (%d).\n", r);
60 return r;
61 }
62 r = amdgpu_bo_kmap(adev->irq.ih.ring_obj,
63 (void **)&adev->irq.ih.ring);
64 amdgpu_bo_unreserve(adev->irq.ih.ring_obj);
65 if (r) {
66 DRM_ERROR("amdgpu: failed to map ih ring buffer (%d).\n", r);
67 return r;
68 }
69 } 52 }
70 return 0; 53 return 0;
71} 54}
@@ -136,8 +119,6 @@ int amdgpu_ih_ring_init(struct amdgpu_device *adev, unsigned ring_size,
136 */ 119 */
137void amdgpu_ih_ring_fini(struct amdgpu_device *adev) 120void amdgpu_ih_ring_fini(struct amdgpu_device *adev)
138{ 121{
139 int r;
140
141 if (adev->irq.ih.use_bus_addr) { 122 if (adev->irq.ih.use_bus_addr) {
142 if (adev->irq.ih.ring) { 123 if (adev->irq.ih.ring) {
143 /* add 8 bytes for the rptr/wptr shadows and 124 /* add 8 bytes for the rptr/wptr shadows and
@@ -149,17 +130,9 @@ void amdgpu_ih_ring_fini(struct amdgpu_device *adev)
149 adev->irq.ih.ring = NULL; 130 adev->irq.ih.ring = NULL;
150 } 131 }
151 } else { 132 } else {
152 if (adev->irq.ih.ring_obj) { 133 amdgpu_bo_free_kernel(&adev->irq.ih.ring_obj,
153 r = amdgpu_bo_reserve(adev->irq.ih.ring_obj, false); 134 &adev->irq.ih.gpu_addr,
154 if (likely(r == 0)) { 135 (void **)&adev->irq.ih.ring);
155 amdgpu_bo_kunmap(adev->irq.ih.ring_obj);
156 amdgpu_bo_unpin(adev->irq.ih.ring_obj);
157 amdgpu_bo_unreserve(adev->irq.ih.ring_obj);
158 }
159 amdgpu_bo_unref(&adev->irq.ih.ring_obj);
160 adev->irq.ih.ring = NULL;
161 adev->irq.ih.ring_obj = NULL;
162 }
163 amdgpu_wb_free(adev, adev->irq.ih.wptr_offs); 136 amdgpu_wb_free(adev, adev->irq.ih.wptr_offs);
164 amdgpu_wb_free(adev, adev->irq.ih.rptr_offs); 137 amdgpu_wb_free(adev, adev->irq.ih.rptr_offs);
165 } 138 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
index 7ef09352e534..f016464035b8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
@@ -70,6 +70,7 @@ struct amdgpu_irq {
70 /* gen irq stuff */ 70 /* gen irq stuff */
71 struct irq_domain *domain; /* GPU irq controller domain */ 71 struct irq_domain *domain; /* GPU irq controller domain */
72 unsigned virq[AMDGPU_MAX_IRQ_SRC_ID]; 72 unsigned virq[AMDGPU_MAX_IRQ_SRC_ID];
73 uint32_t srbm_soft_reset;
73}; 74};
74 75
75void amdgpu_irq_preinstall(struct drm_device *dev); 76void amdgpu_irq_preinstall(struct drm_device *dev);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
index 6674d40eb3ab..8c5807994073 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
@@ -91,7 +91,7 @@ void amdgpu_job_free_resources(struct amdgpu_job *job)
91 amdgpu_ib_free(job->adev, &job->ibs[i], f); 91 amdgpu_ib_free(job->adev, &job->ibs[i], f);
92} 92}
93 93
94void amdgpu_job_free_cb(struct amd_sched_job *s_job) 94static void amdgpu_job_free_cb(struct amd_sched_job *s_job)
95{ 95{
96 struct amdgpu_job *job = container_of(s_job, struct amdgpu_job, base); 96 struct amdgpu_job *job = container_of(s_job, struct amdgpu_job, base);
97 97
@@ -124,7 +124,7 @@ int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
124 return r; 124 return r;
125 125
126 job->owner = owner; 126 job->owner = owner;
127 job->ctx = entity->fence_context; 127 job->fence_ctx = entity->fence_context;
128 *f = fence_get(&job->base.s_fence->finished); 128 *f = fence_get(&job->base.s_fence->finished);
129 amdgpu_job_free_resources(job); 129 amdgpu_job_free_resources(job);
130 amd_sched_entity_push_job(&job->base); 130 amd_sched_entity_push_job(&job->base);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index d942654a1de0..c2c7fb140338 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -292,14 +292,14 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
292 type = AMD_IP_BLOCK_TYPE_UVD; 292 type = AMD_IP_BLOCK_TYPE_UVD;
293 ring_mask = adev->uvd.ring.ready ? 1 : 0; 293 ring_mask = adev->uvd.ring.ready ? 1 : 0;
294 ib_start_alignment = AMDGPU_GPU_PAGE_SIZE; 294 ib_start_alignment = AMDGPU_GPU_PAGE_SIZE;
295 ib_size_alignment = 8; 295 ib_size_alignment = 16;
296 break; 296 break;
297 case AMDGPU_HW_IP_VCE: 297 case AMDGPU_HW_IP_VCE:
298 type = AMD_IP_BLOCK_TYPE_VCE; 298 type = AMD_IP_BLOCK_TYPE_VCE;
299 for (i = 0; i < AMDGPU_MAX_VCE_RINGS; i++) 299 for (i = 0; i < adev->vce.num_rings; i++)
300 ring_mask |= ((adev->vce.ring[i].ready ? 1 : 0) << i); 300 ring_mask |= ((adev->vce.ring[i].ready ? 1 : 0) << i);
301 ib_start_alignment = AMDGPU_GPU_PAGE_SIZE; 301 ib_start_alignment = AMDGPU_GPU_PAGE_SIZE;
302 ib_size_alignment = 8; 302 ib_size_alignment = 1;
303 break; 303 break;
304 default: 304 default:
305 return -EINVAL; 305 return -EINVAL;
@@ -373,6 +373,9 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
373 case AMDGPU_INFO_NUM_BYTES_MOVED: 373 case AMDGPU_INFO_NUM_BYTES_MOVED:
374 ui64 = atomic64_read(&adev->num_bytes_moved); 374 ui64 = atomic64_read(&adev->num_bytes_moved);
375 return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0; 375 return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0;
376 case AMDGPU_INFO_NUM_EVICTIONS:
377 ui64 = atomic64_read(&adev->num_evictions);
378 return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0;
376 case AMDGPU_INFO_VRAM_USAGE: 379 case AMDGPU_INFO_VRAM_USAGE:
377 ui64 = atomic64_read(&adev->vram_usage); 380 ui64 = atomic64_read(&adev->vram_usage);
378 return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0; 381 return copy_to_user(out, &ui64, min(size, 8u)) ? -EFAULT : 0;
@@ -539,12 +542,16 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
539 return r; 542 return r;
540 543
541 fpriv = kzalloc(sizeof(*fpriv), GFP_KERNEL); 544 fpriv = kzalloc(sizeof(*fpriv), GFP_KERNEL);
542 if (unlikely(!fpriv)) 545 if (unlikely(!fpriv)) {
543 return -ENOMEM; 546 r = -ENOMEM;
547 goto out_suspend;
548 }
544 549
545 r = amdgpu_vm_init(adev, &fpriv->vm); 550 r = amdgpu_vm_init(adev, &fpriv->vm);
546 if (r) 551 if (r) {
547 goto error_free; 552 kfree(fpriv);
553 goto out_suspend;
554 }
548 555
549 mutex_init(&fpriv->bo_list_lock); 556 mutex_init(&fpriv->bo_list_lock);
550 idr_init(&fpriv->bo_list_handles); 557 idr_init(&fpriv->bo_list_handles);
@@ -553,12 +560,9 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
553 560
554 file_priv->driver_priv = fpriv; 561 file_priv->driver_priv = fpriv;
555 562
563out_suspend:
556 pm_runtime_mark_last_busy(dev->dev); 564 pm_runtime_mark_last_busy(dev->dev);
557 pm_runtime_put_autosuspend(dev->dev); 565 pm_runtime_put_autosuspend(dev->dev);
558 return 0;
559
560error_free:
561 kfree(fpriv);
562 566
563 return r; 567 return r;
564} 568}
@@ -597,6 +601,9 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
597 601
598 kfree(fpriv); 602 kfree(fpriv);
599 file_priv->driver_priv = NULL; 603 file_priv->driver_priv = NULL;
604
605 pm_runtime_mark_last_busy(dev->dev);
606 pm_runtime_put_autosuspend(dev->dev);
600} 607}
601 608
602/** 609/**
@@ -611,6 +618,7 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
611void amdgpu_driver_preclose_kms(struct drm_device *dev, 618void amdgpu_driver_preclose_kms(struct drm_device *dev,
612 struct drm_file *file_priv) 619 struct drm_file *file_priv)
613{ 620{
621 pm_runtime_get_sync(dev->dev);
614} 622}
615 623
616/* 624/*
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
index 6b1d7d306564..7b0eff7d060b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
@@ -39,6 +39,8 @@
39#include <drm/drm_plane_helper.h> 39#include <drm/drm_plane_helper.h>
40#include <linux/i2c.h> 40#include <linux/i2c.h>
41#include <linux/i2c-algo-bit.h> 41#include <linux/i2c-algo-bit.h>
42#include <linux/hrtimer.h>
43#include "amdgpu_irq.h"
42 44
43struct amdgpu_bo; 45struct amdgpu_bo;
44struct amdgpu_device; 46struct amdgpu_device;
@@ -339,6 +341,8 @@ struct amdgpu_mode_info {
339 int num_dig; /* number of dig blocks */ 341 int num_dig; /* number of dig blocks */
340 int disp_priority; 342 int disp_priority;
341 const struct amdgpu_display_funcs *funcs; 343 const struct amdgpu_display_funcs *funcs;
344 struct hrtimer vblank_timer;
345 enum amdgpu_interrupt_state vsync_timer_enabled;
342}; 346};
343 347
344#define AMDGPU_MAX_BL_LEVEL 0xFF 348#define AMDGPU_MAX_BL_LEVEL 0xFF
@@ -587,10 +591,10 @@ int amdgpu_align_pitch(struct amdgpu_device *adev, int width, int bpp, bool tile
587void amdgpu_print_display_setup(struct drm_device *dev); 591void amdgpu_print_display_setup(struct drm_device *dev);
588int amdgpu_modeset_create_props(struct amdgpu_device *adev); 592int amdgpu_modeset_create_props(struct amdgpu_device *adev);
589int amdgpu_crtc_set_config(struct drm_mode_set *set); 593int amdgpu_crtc_set_config(struct drm_mode_set *set);
590int amdgpu_crtc_page_flip(struct drm_crtc *crtc, 594int amdgpu_crtc_page_flip_target(struct drm_crtc *crtc,
591 struct drm_framebuffer *fb, 595 struct drm_framebuffer *fb,
592 struct drm_pending_vblank_event *event, 596 struct drm_pending_vblank_event *event,
593 uint32_t page_flip_flags); 597 uint32_t page_flip_flags, uint32_t target);
594extern const struct drm_mode_config_funcs amdgpu_mode_funcs; 598extern const struct drm_mode_config_funcs amdgpu_mode_funcs;
595 599
596#endif 600#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index 6f0873c75a25..aa074fac0c7f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -38,20 +38,17 @@
38#include "amdgpu_trace.h" 38#include "amdgpu_trace.h"
39 39
40 40
41int amdgpu_ttm_init(struct amdgpu_device *adev);
42void amdgpu_ttm_fini(struct amdgpu_device *adev);
43 41
44static u64 amdgpu_get_vis_part_size(struct amdgpu_device *adev, 42static u64 amdgpu_get_vis_part_size(struct amdgpu_device *adev,
45 struct ttm_mem_reg *mem) 43 struct ttm_mem_reg *mem)
46{ 44{
47 u64 ret = 0; 45 if (mem->start << PAGE_SHIFT >= adev->mc.visible_vram_size)
48 if (mem->start << PAGE_SHIFT < adev->mc.visible_vram_size) { 46 return 0;
49 ret = (u64)((mem->start << PAGE_SHIFT) + mem->size) > 47
50 adev->mc.visible_vram_size ? 48 return ((mem->start << PAGE_SHIFT) + mem->size) >
51 adev->mc.visible_vram_size - (mem->start << PAGE_SHIFT) : 49 adev->mc.visible_vram_size ?
52 mem->size; 50 adev->mc.visible_vram_size - (mem->start << PAGE_SHIFT) :
53 } 51 mem->size;
54 return ret;
55} 52}
56 53
57static void amdgpu_update_memory_usage(struct amdgpu_device *adev, 54static void amdgpu_update_memory_usage(struct amdgpu_device *adev,
@@ -99,6 +96,11 @@ static void amdgpu_ttm_bo_destroy(struct ttm_buffer_object *tbo)
99 96
100 drm_gem_object_release(&bo->gem_base); 97 drm_gem_object_release(&bo->gem_base);
101 amdgpu_bo_unref(&bo->parent); 98 amdgpu_bo_unref(&bo->parent);
99 if (!list_empty(&bo->shadow_list)) {
100 mutex_lock(&bo->adev->shadow_list_lock);
101 list_del_init(&bo->shadow_list);
102 mutex_unlock(&bo->adev->shadow_list_lock);
103 }
102 kfree(bo->metadata); 104 kfree(bo->metadata);
103 kfree(bo); 105 kfree(bo);
104} 106}
@@ -112,90 +114,99 @@ bool amdgpu_ttm_bo_is_amdgpu_bo(struct ttm_buffer_object *bo)
112 114
113static void amdgpu_ttm_placement_init(struct amdgpu_device *adev, 115static void amdgpu_ttm_placement_init(struct amdgpu_device *adev,
114 struct ttm_placement *placement, 116 struct ttm_placement *placement,
115 struct ttm_place *placements, 117 struct ttm_place *places,
116 u32 domain, u64 flags) 118 u32 domain, u64 flags)
117{ 119{
118 u32 c = 0, i; 120 u32 c = 0;
119
120 placement->placement = placements;
121 placement->busy_placement = placements;
122 121
123 if (domain & AMDGPU_GEM_DOMAIN_VRAM) { 122 if (domain & AMDGPU_GEM_DOMAIN_VRAM) {
123 unsigned visible_pfn = adev->mc.visible_vram_size >> PAGE_SHIFT;
124
124 if (flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS && 125 if (flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS &&
125 adev->mc.visible_vram_size < adev->mc.real_vram_size) { 126 !(flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) &&
126 placements[c].fpfn = 127 adev->mc.visible_vram_size < adev->mc.real_vram_size) {
127 adev->mc.visible_vram_size >> PAGE_SHIFT; 128 places[c].fpfn = visible_pfn;
128 placements[c++].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | 129 places[c].lpfn = 0;
129 TTM_PL_FLAG_VRAM | TTM_PL_FLAG_TOPDOWN; 130 places[c].flags = TTM_PL_FLAG_WC |
131 TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM |
132 TTM_PL_FLAG_TOPDOWN;
133 c++;
130 } 134 }
131 placements[c].fpfn = 0; 135
132 placements[c++].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | 136 places[c].fpfn = 0;
137 places[c].lpfn = 0;
138 places[c].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
133 TTM_PL_FLAG_VRAM; 139 TTM_PL_FLAG_VRAM;
134 if (!(flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)) 140 if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)
135 placements[c - 1].flags |= TTM_PL_FLAG_TOPDOWN; 141 places[c].lpfn = visible_pfn;
142 else
143 places[c].flags |= TTM_PL_FLAG_TOPDOWN;
144 c++;
136 } 145 }
137 146
138 if (domain & AMDGPU_GEM_DOMAIN_GTT) { 147 if (domain & AMDGPU_GEM_DOMAIN_GTT) {
139 if (flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC) { 148 places[c].fpfn = 0;
140 placements[c].fpfn = 0; 149 places[c].lpfn = 0;
141 placements[c++].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_TT | 150 places[c].flags = TTM_PL_FLAG_TT;
151 if (flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC)
152 places[c].flags |= TTM_PL_FLAG_WC |
142 TTM_PL_FLAG_UNCACHED; 153 TTM_PL_FLAG_UNCACHED;
143 } else { 154 else
144 placements[c].fpfn = 0; 155 places[c].flags |= TTM_PL_FLAG_CACHED;
145 placements[c++].flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_TT; 156 c++;
146 }
147 } 157 }
148 158
149 if (domain & AMDGPU_GEM_DOMAIN_CPU) { 159 if (domain & AMDGPU_GEM_DOMAIN_CPU) {
150 if (flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC) { 160 places[c].fpfn = 0;
151 placements[c].fpfn = 0; 161 places[c].lpfn = 0;
152 placements[c++].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_SYSTEM | 162 places[c].flags = TTM_PL_FLAG_SYSTEM;
163 if (flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC)
164 places[c].flags |= TTM_PL_FLAG_WC |
153 TTM_PL_FLAG_UNCACHED; 165 TTM_PL_FLAG_UNCACHED;
154 } else { 166 else
155 placements[c].fpfn = 0; 167 places[c].flags |= TTM_PL_FLAG_CACHED;
156 placements[c++].flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_SYSTEM; 168 c++;
157 }
158 } 169 }
159 170
160 if (domain & AMDGPU_GEM_DOMAIN_GDS) { 171 if (domain & AMDGPU_GEM_DOMAIN_GDS) {
161 placements[c].fpfn = 0; 172 places[c].fpfn = 0;
162 placements[c++].flags = TTM_PL_FLAG_UNCACHED | 173 places[c].lpfn = 0;
163 AMDGPU_PL_FLAG_GDS; 174 places[c].flags = TTM_PL_FLAG_UNCACHED | AMDGPU_PL_FLAG_GDS;
175 c++;
164 } 176 }
177
165 if (domain & AMDGPU_GEM_DOMAIN_GWS) { 178 if (domain & AMDGPU_GEM_DOMAIN_GWS) {
166 placements[c].fpfn = 0; 179 places[c].fpfn = 0;
167 placements[c++].flags = TTM_PL_FLAG_UNCACHED | 180 places[c].lpfn = 0;
168 AMDGPU_PL_FLAG_GWS; 181 places[c].flags = TTM_PL_FLAG_UNCACHED | AMDGPU_PL_FLAG_GWS;
182 c++;
169 } 183 }
184
170 if (domain & AMDGPU_GEM_DOMAIN_OA) { 185 if (domain & AMDGPU_GEM_DOMAIN_OA) {
171 placements[c].fpfn = 0; 186 places[c].fpfn = 0;
172 placements[c++].flags = TTM_PL_FLAG_UNCACHED | 187 places[c].lpfn = 0;
173 AMDGPU_PL_FLAG_OA; 188 places[c].flags = TTM_PL_FLAG_UNCACHED | AMDGPU_PL_FLAG_OA;
189 c++;
174 } 190 }
175 191
176 if (!c) { 192 if (!c) {
177 placements[c].fpfn = 0; 193 places[c].fpfn = 0;
178 placements[c++].flags = TTM_PL_MASK_CACHING | 194 places[c].lpfn = 0;
179 TTM_PL_FLAG_SYSTEM; 195 places[c].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
196 c++;
180 } 197 }
198
181 placement->num_placement = c; 199 placement->num_placement = c;
182 placement->num_busy_placement = c; 200 placement->placement = places;
183 201
184 for (i = 0; i < c; i++) { 202 placement->num_busy_placement = c;
185 if ((flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) && 203 placement->busy_placement = places;
186 (placements[i].flags & TTM_PL_FLAG_VRAM) &&
187 !placements[i].fpfn)
188 placements[i].lpfn =
189 adev->mc.visible_vram_size >> PAGE_SHIFT;
190 else
191 placements[i].lpfn = 0;
192 }
193} 204}
194 205
195void amdgpu_ttm_placement_from_domain(struct amdgpu_bo *rbo, u32 domain) 206void amdgpu_ttm_placement_from_domain(struct amdgpu_bo *abo, u32 domain)
196{ 207{
197 amdgpu_ttm_placement_init(rbo->adev, &rbo->placement, 208 amdgpu_ttm_placement_init(abo->adev, &abo->placement,
198 rbo->placements, domain, rbo->flags); 209 abo->placements, domain, abo->flags);
199} 210}
200 211
201static void amdgpu_fill_placement_to_bo(struct amdgpu_bo *bo, 212static void amdgpu_fill_placement_to_bo(struct amdgpu_bo *bo,
@@ -211,6 +222,98 @@ static void amdgpu_fill_placement_to_bo(struct amdgpu_bo *bo,
211 bo->placement.busy_placement = bo->placements; 222 bo->placement.busy_placement = bo->placements;
212} 223}
213 224
225/**
226 * amdgpu_bo_create_kernel - create BO for kernel use
227 *
228 * @adev: amdgpu device object
229 * @size: size for the new BO
230 * @align: alignment for the new BO
231 * @domain: where to place it
232 * @bo_ptr: resulting BO
233 * @gpu_addr: GPU addr of the pinned BO
234 * @cpu_addr: optional CPU address mapping
235 *
236 * Allocates and pins a BO for kernel internal use.
237 *
238 * Returns 0 on success, negative error code otherwise.
239 */
240int amdgpu_bo_create_kernel(struct amdgpu_device *adev,
241 unsigned long size, int align,
242 u32 domain, struct amdgpu_bo **bo_ptr,
243 u64 *gpu_addr, void **cpu_addr)
244{
245 int r;
246
247 r = amdgpu_bo_create(adev, size, align, true, domain,
248 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
249 NULL, NULL, bo_ptr);
250 if (r) {
251 dev_err(adev->dev, "(%d) failed to allocate kernel bo\n", r);
252 return r;
253 }
254
255 r = amdgpu_bo_reserve(*bo_ptr, false);
256 if (r) {
257 dev_err(adev->dev, "(%d) failed to reserve kernel bo\n", r);
258 goto error_free;
259 }
260
261 r = amdgpu_bo_pin(*bo_ptr, domain, gpu_addr);
262 if (r) {
263 dev_err(adev->dev, "(%d) kernel bo pin failed\n", r);
264 goto error_unreserve;
265 }
266
267 if (cpu_addr) {
268 r = amdgpu_bo_kmap(*bo_ptr, cpu_addr);
269 if (r) {
270 dev_err(adev->dev, "(%d) kernel bo map failed\n", r);
271 goto error_unreserve;
272 }
273 }
274
275 amdgpu_bo_unreserve(*bo_ptr);
276
277 return 0;
278
279error_unreserve:
280 amdgpu_bo_unreserve(*bo_ptr);
281
282error_free:
283 amdgpu_bo_unref(bo_ptr);
284
285 return r;
286}
287
288/**
289 * amdgpu_bo_free_kernel - free BO for kernel use
290 *
291 * @bo: amdgpu BO to free
292 *
293 * unmaps and unpin a BO for kernel internal use.
294 */
295void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr,
296 void **cpu_addr)
297{
298 if (*bo == NULL)
299 return;
300
301 if (likely(amdgpu_bo_reserve(*bo, false) == 0)) {
302 if (cpu_addr)
303 amdgpu_bo_kunmap(*bo);
304
305 amdgpu_bo_unpin(*bo);
306 amdgpu_bo_unreserve(*bo);
307 }
308 amdgpu_bo_unref(bo);
309
310 if (gpu_addr)
311 *gpu_addr = 0;
312
313 if (cpu_addr)
314 *cpu_addr = NULL;
315}
316
214int amdgpu_bo_create_restricted(struct amdgpu_device *adev, 317int amdgpu_bo_create_restricted(struct amdgpu_device *adev,
215 unsigned long size, int byte_align, 318 unsigned long size, int byte_align,
216 bool kernel, u32 domain, u64 flags, 319 bool kernel, u32 domain, u64 flags,
@@ -249,7 +352,7 @@ int amdgpu_bo_create_restricted(struct amdgpu_device *adev,
249 return r; 352 return r;
250 } 353 }
251 bo->adev = adev; 354 bo->adev = adev;
252 INIT_LIST_HEAD(&bo->list); 355 INIT_LIST_HEAD(&bo->shadow_list);
253 INIT_LIST_HEAD(&bo->va); 356 INIT_LIST_HEAD(&bo->va);
254 bo->prefered_domains = domain & (AMDGPU_GEM_DOMAIN_VRAM | 357 bo->prefered_domains = domain & (AMDGPU_GEM_DOMAIN_VRAM |
255 AMDGPU_GEM_DOMAIN_GTT | 358 AMDGPU_GEM_DOMAIN_GTT |
@@ -277,11 +380,79 @@ int amdgpu_bo_create_restricted(struct amdgpu_device *adev,
277 if (unlikely(r != 0)) { 380 if (unlikely(r != 0)) {
278 return r; 381 return r;
279 } 382 }
383
384 if (flags & AMDGPU_GEM_CREATE_VRAM_CLEARED &&
385 bo->tbo.mem.placement & TTM_PL_FLAG_VRAM) {
386 struct fence *fence;
387
388 if (adev->mman.buffer_funcs_ring == NULL ||
389 !adev->mman.buffer_funcs_ring->ready) {
390 r = -EBUSY;
391 goto fail_free;
392 }
393
394 r = amdgpu_bo_reserve(bo, false);
395 if (unlikely(r != 0))
396 goto fail_free;
397
398 amdgpu_ttm_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_VRAM);
399 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false);
400 if (unlikely(r != 0))
401 goto fail_unreserve;
402
403 amdgpu_fill_buffer(bo, 0, bo->tbo.resv, &fence);
404 amdgpu_bo_fence(bo, fence, false);
405 amdgpu_bo_unreserve(bo);
406 fence_put(bo->tbo.moving);
407 bo->tbo.moving = fence_get(fence);
408 fence_put(fence);
409 }
280 *bo_ptr = bo; 410 *bo_ptr = bo;
281 411
282 trace_amdgpu_bo_create(bo); 412 trace_amdgpu_bo_create(bo);
283 413
284 return 0; 414 return 0;
415
416fail_unreserve:
417 amdgpu_bo_unreserve(bo);
418fail_free:
419 amdgpu_bo_unref(&bo);
420 return r;
421}
422
423static int amdgpu_bo_create_shadow(struct amdgpu_device *adev,
424 unsigned long size, int byte_align,
425 struct amdgpu_bo *bo)
426{
427 struct ttm_placement placement = {0};
428 struct ttm_place placements[AMDGPU_GEM_DOMAIN_MAX + 1];
429 int r;
430
431 if (bo->shadow)
432 return 0;
433
434 bo->flags |= AMDGPU_GEM_CREATE_SHADOW;
435 memset(&placements, 0,
436 (AMDGPU_GEM_DOMAIN_MAX + 1) * sizeof(struct ttm_place));
437
438 amdgpu_ttm_placement_init(adev, &placement,
439 placements, AMDGPU_GEM_DOMAIN_GTT,
440 AMDGPU_GEM_CREATE_CPU_GTT_USWC);
441
442 r = amdgpu_bo_create_restricted(adev, size, byte_align, true,
443 AMDGPU_GEM_DOMAIN_GTT,
444 AMDGPU_GEM_CREATE_CPU_GTT_USWC,
445 NULL, &placement,
446 bo->tbo.resv,
447 &bo->shadow);
448 if (!r) {
449 bo->shadow->parent = amdgpu_bo_ref(bo);
450 mutex_lock(&adev->shadow_list_lock);
451 list_add_tail(&bo->shadow_list, &adev->shadow_list);
452 mutex_unlock(&adev->shadow_list_lock);
453 }
454
455 return r;
285} 456}
286 457
287int amdgpu_bo_create(struct amdgpu_device *adev, 458int amdgpu_bo_create(struct amdgpu_device *adev,
@@ -293,6 +464,7 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
293{ 464{
294 struct ttm_placement placement = {0}; 465 struct ttm_placement placement = {0};
295 struct ttm_place placements[AMDGPU_GEM_DOMAIN_MAX + 1]; 466 struct ttm_place placements[AMDGPU_GEM_DOMAIN_MAX + 1];
467 int r;
296 468
297 memset(&placements, 0, 469 memset(&placements, 0,
298 (AMDGPU_GEM_DOMAIN_MAX + 1) * sizeof(struct ttm_place)); 470 (AMDGPU_GEM_DOMAIN_MAX + 1) * sizeof(struct ttm_place));
@@ -300,9 +472,83 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
300 amdgpu_ttm_placement_init(adev, &placement, 472 amdgpu_ttm_placement_init(adev, &placement,
301 placements, domain, flags); 473 placements, domain, flags);
302 474
303 return amdgpu_bo_create_restricted(adev, size, byte_align, kernel, 475 r = amdgpu_bo_create_restricted(adev, size, byte_align, kernel,
304 domain, flags, sg, &placement, 476 domain, flags, sg, &placement,
305 resv, bo_ptr); 477 resv, bo_ptr);
478 if (r)
479 return r;
480
481 if (amdgpu_need_backup(adev) && (flags & AMDGPU_GEM_CREATE_SHADOW)) {
482 r = amdgpu_bo_create_shadow(adev, size, byte_align, (*bo_ptr));
483 if (r)
484 amdgpu_bo_unref(bo_ptr);
485 }
486
487 return r;
488}
489
490int amdgpu_bo_backup_to_shadow(struct amdgpu_device *adev,
491 struct amdgpu_ring *ring,
492 struct amdgpu_bo *bo,
493 struct reservation_object *resv,
494 struct fence **fence,
495 bool direct)
496
497{
498 struct amdgpu_bo *shadow = bo->shadow;
499 uint64_t bo_addr, shadow_addr;
500 int r;
501
502 if (!shadow)
503 return -EINVAL;
504
505 bo_addr = amdgpu_bo_gpu_offset(bo);
506 shadow_addr = amdgpu_bo_gpu_offset(bo->shadow);
507
508 r = reservation_object_reserve_shared(bo->tbo.resv);
509 if (r)
510 goto err;
511
512 r = amdgpu_copy_buffer(ring, bo_addr, shadow_addr,
513 amdgpu_bo_size(bo), resv, fence,
514 direct);
515 if (!r)
516 amdgpu_bo_fence(bo, *fence, true);
517
518err:
519 return r;
520}
521
522int amdgpu_bo_restore_from_shadow(struct amdgpu_device *adev,
523 struct amdgpu_ring *ring,
524 struct amdgpu_bo *bo,
525 struct reservation_object *resv,
526 struct fence **fence,
527 bool direct)
528
529{
530 struct amdgpu_bo *shadow = bo->shadow;
531 uint64_t bo_addr, shadow_addr;
532 int r;
533
534 if (!shadow)
535 return -EINVAL;
536
537 bo_addr = amdgpu_bo_gpu_offset(bo);
538 shadow_addr = amdgpu_bo_gpu_offset(bo->shadow);
539
540 r = reservation_object_reserve_shared(bo->tbo.resv);
541 if (r)
542 goto err;
543
544 r = amdgpu_copy_buffer(ring, shadow_addr, bo_addr,
545 amdgpu_bo_size(bo), resv, fence,
546 direct);
547 if (!r)
548 amdgpu_bo_fence(bo, *fence, true);
549
550err:
551 return r;
306} 552}
307 553
308int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr) 554int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr)
@@ -380,16 +626,17 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,
380 return -EINVAL; 626 return -EINVAL;
381 627
382 if (bo->pin_count) { 628 if (bo->pin_count) {
629 uint32_t mem_type = bo->tbo.mem.mem_type;
630
631 if (domain != amdgpu_mem_type_to_domain(mem_type))
632 return -EINVAL;
633
383 bo->pin_count++; 634 bo->pin_count++;
384 if (gpu_addr) 635 if (gpu_addr)
385 *gpu_addr = amdgpu_bo_gpu_offset(bo); 636 *gpu_addr = amdgpu_bo_gpu_offset(bo);
386 637
387 if (max_offset != 0) { 638 if (max_offset != 0) {
388 u64 domain_start; 639 u64 domain_start = bo->tbo.bdev->man[mem_type].gpu_offset;
389 if (domain == AMDGPU_GEM_DOMAIN_VRAM)
390 domain_start = bo->adev->mc.vram_start;
391 else
392 domain_start = bo->adev->mc.gtt_start;
393 WARN_ON_ONCE(max_offset < 640 WARN_ON_ONCE(max_offset <
394 (amdgpu_bo_gpu_offset(bo) - domain_start)); 641 (amdgpu_bo_gpu_offset(bo) - domain_start));
395 } 642 }
@@ -401,7 +648,8 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,
401 /* force to pin into visible video ram */ 648 /* force to pin into visible video ram */
402 if ((bo->placements[i].flags & TTM_PL_FLAG_VRAM) && 649 if ((bo->placements[i].flags & TTM_PL_FLAG_VRAM) &&
403 !(bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS) && 650 !(bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS) &&
404 (!max_offset || max_offset > bo->adev->mc.visible_vram_size)) { 651 (!max_offset || max_offset >
652 bo->adev->mc.visible_vram_size)) {
405 if (WARN_ON_ONCE(min_offset > 653 if (WARN_ON_ONCE(min_offset >
406 bo->adev->mc.visible_vram_size)) 654 bo->adev->mc.visible_vram_size))
407 return -EINVAL; 655 return -EINVAL;
@@ -420,19 +668,28 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,
420 } 668 }
421 669
422 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); 670 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false);
423 if (likely(r == 0)) { 671 if (unlikely(r)) {
424 bo->pin_count = 1;
425 if (gpu_addr != NULL)
426 *gpu_addr = amdgpu_bo_gpu_offset(bo);
427 if (domain == AMDGPU_GEM_DOMAIN_VRAM) {
428 bo->adev->vram_pin_size += amdgpu_bo_size(bo);
429 if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
430 bo->adev->invisible_pin_size += amdgpu_bo_size(bo);
431 } else
432 bo->adev->gart_pin_size += amdgpu_bo_size(bo);
433 } else {
434 dev_err(bo->adev->dev, "%p pin failed\n", bo); 672 dev_err(bo->adev->dev, "%p pin failed\n", bo);
673 goto error;
674 }
675 r = amdgpu_ttm_bind(&bo->tbo, &bo->tbo.mem);
676 if (unlikely(r)) {
677 dev_err(bo->adev->dev, "%p bind failed\n", bo);
678 goto error;
435 } 679 }
680
681 bo->pin_count = 1;
682 if (gpu_addr != NULL)
683 *gpu_addr = amdgpu_bo_gpu_offset(bo);
684 if (domain == AMDGPU_GEM_DOMAIN_VRAM) {
685 bo->adev->vram_pin_size += amdgpu_bo_size(bo);
686 if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
687 bo->adev->invisible_pin_size += amdgpu_bo_size(bo);
688 } else if (domain == AMDGPU_GEM_DOMAIN_GTT) {
689 bo->adev->gart_pin_size += amdgpu_bo_size(bo);
690 }
691
692error:
436 return r; 693 return r;
437} 694}
438 695
@@ -457,16 +714,20 @@ int amdgpu_bo_unpin(struct amdgpu_bo *bo)
457 bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT; 714 bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
458 } 715 }
459 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); 716 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false);
460 if (likely(r == 0)) { 717 if (unlikely(r)) {
461 if (bo->tbo.mem.mem_type == TTM_PL_VRAM) {
462 bo->adev->vram_pin_size -= amdgpu_bo_size(bo);
463 if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
464 bo->adev->invisible_pin_size -= amdgpu_bo_size(bo);
465 } else
466 bo->adev->gart_pin_size -= amdgpu_bo_size(bo);
467 } else {
468 dev_err(bo->adev->dev, "%p validate failed for unpin\n", bo); 718 dev_err(bo->adev->dev, "%p validate failed for unpin\n", bo);
719 goto error;
469 } 720 }
721
722 if (bo->tbo.mem.mem_type == TTM_PL_VRAM) {
723 bo->adev->vram_pin_size -= amdgpu_bo_size(bo);
724 if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
725 bo->adev->invisible_pin_size -= amdgpu_bo_size(bo);
726 } else if (bo->tbo.mem.mem_type == TTM_PL_TT) {
727 bo->adev->gart_pin_size -= amdgpu_bo_size(bo);
728 }
729
730error:
470 return r; 731 return r;
471} 732}
472 733
@@ -588,23 +849,23 @@ int amdgpu_bo_get_metadata(struct amdgpu_bo *bo, void *buffer,
588void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, 849void amdgpu_bo_move_notify(struct ttm_buffer_object *bo,
589 struct ttm_mem_reg *new_mem) 850 struct ttm_mem_reg *new_mem)
590{ 851{
591 struct amdgpu_bo *rbo; 852 struct amdgpu_bo *abo;
592 struct ttm_mem_reg *old_mem = &bo->mem; 853 struct ttm_mem_reg *old_mem = &bo->mem;
593 854
594 if (!amdgpu_ttm_bo_is_amdgpu_bo(bo)) 855 if (!amdgpu_ttm_bo_is_amdgpu_bo(bo))
595 return; 856 return;
596 857
597 rbo = container_of(bo, struct amdgpu_bo, tbo); 858 abo = container_of(bo, struct amdgpu_bo, tbo);
598 amdgpu_vm_bo_invalidate(rbo->adev, rbo); 859 amdgpu_vm_bo_invalidate(abo->adev, abo);
599 860
600 /* update statistics */ 861 /* update statistics */
601 if (!new_mem) 862 if (!new_mem)
602 return; 863 return;
603 864
604 /* move_notify is called before move happens */ 865 /* move_notify is called before move happens */
605 amdgpu_update_memory_usage(rbo->adev, &bo->mem, new_mem); 866 amdgpu_update_memory_usage(abo->adev, &bo->mem, new_mem);
606 867
607 trace_amdgpu_ttm_bo_move(rbo, new_mem->mem_type, old_mem->mem_type); 868 trace_amdgpu_ttm_bo_move(abo, new_mem->mem_type, old_mem->mem_type);
608} 869}
609 870
610int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo) 871int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
@@ -637,7 +898,8 @@ int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
637 for (i = 0; i < abo->placement.num_placement; i++) { 898 for (i = 0; i < abo->placement.num_placement; i++) {
638 /* Force into visible VRAM */ 899 /* Force into visible VRAM */
639 if ((abo->placements[i].flags & TTM_PL_FLAG_VRAM) && 900 if ((abo->placements[i].flags & TTM_PL_FLAG_VRAM) &&
640 (!abo->placements[i].lpfn || abo->placements[i].lpfn > lpfn)) 901 (!abo->placements[i].lpfn ||
902 abo->placements[i].lpfn > lpfn))
641 abo->placements[i].lpfn = lpfn; 903 abo->placements[i].lpfn = lpfn;
642 } 904 }
643 r = ttm_bo_validate(bo, &abo->placement, false, false); 905 r = ttm_bo_validate(bo, &abo->placement, false, false);
@@ -674,3 +936,24 @@ void amdgpu_bo_fence(struct amdgpu_bo *bo, struct fence *fence,
674 else 936 else
675 reservation_object_add_excl_fence(resv, fence); 937 reservation_object_add_excl_fence(resv, fence);
676} 938}
939
940/**
941 * amdgpu_bo_gpu_offset - return GPU offset of bo
942 * @bo: amdgpu object for which we query the offset
943 *
944 * Returns current GPU offset of the object.
945 *
946 * Note: object should either be pinned or reserved when calling this
947 * function, it might be useful to add check for this for debugging.
948 */
949u64 amdgpu_bo_gpu_offset(struct amdgpu_bo *bo)
950{
951 WARN_ON_ONCE(bo->tbo.mem.mem_type == TTM_PL_SYSTEM);
952 WARN_ON_ONCE(bo->tbo.mem.mem_type == TTM_PL_TT &&
953 !amdgpu_ttm_is_bound(bo->tbo.ttm));
954 WARN_ON_ONCE(!ww_mutex_is_locked(&bo->tbo.resv->lock) &&
955 !bo->pin_count);
956 WARN_ON_ONCE(bo->tbo.mem.start == AMDGPU_BO_INVALID_OFFSET);
957
958 return bo->tbo.offset;
959}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
index bdb01d932548..8255034d73eb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
@@ -31,6 +31,8 @@
31#include <drm/amdgpu_drm.h> 31#include <drm/amdgpu_drm.h>
32#include "amdgpu.h" 32#include "amdgpu.h"
33 33
34#define AMDGPU_BO_INVALID_OFFSET LONG_MAX
35
34/** 36/**
35 * amdgpu_mem_type_to_domain - return domain corresponding to mem_type 37 * amdgpu_mem_type_to_domain - return domain corresponding to mem_type
36 * @mem_type: ttm memory type 38 * @mem_type: ttm memory type
@@ -85,21 +87,6 @@ static inline void amdgpu_bo_unreserve(struct amdgpu_bo *bo)
85 ttm_bo_unreserve(&bo->tbo); 87 ttm_bo_unreserve(&bo->tbo);
86} 88}
87 89
88/**
89 * amdgpu_bo_gpu_offset - return GPU offset of bo
90 * @bo: amdgpu object for which we query the offset
91 *
92 * Returns current GPU offset of the object.
93 *
94 * Note: object should either be pinned or reserved when calling this
95 * function, it might be useful to add check for this for debugging.
96 */
97static inline u64 amdgpu_bo_gpu_offset(struct amdgpu_bo *bo)
98{
99 WARN_ON_ONCE(bo->tbo.mem.mem_type == TTM_PL_SYSTEM);
100 return bo->tbo.offset;
101}
102
103static inline unsigned long amdgpu_bo_size(struct amdgpu_bo *bo) 90static inline unsigned long amdgpu_bo_size(struct amdgpu_bo *bo)
104{ 91{
105 return bo->tbo.num_pages << PAGE_SHIFT; 92 return bo->tbo.num_pages << PAGE_SHIFT;
@@ -139,6 +126,12 @@ int amdgpu_bo_create_restricted(struct amdgpu_device *adev,
139 struct ttm_placement *placement, 126 struct ttm_placement *placement,
140 struct reservation_object *resv, 127 struct reservation_object *resv,
141 struct amdgpu_bo **bo_ptr); 128 struct amdgpu_bo **bo_ptr);
129int amdgpu_bo_create_kernel(struct amdgpu_device *adev,
130 unsigned long size, int align,
131 u32 domain, struct amdgpu_bo **bo_ptr,
132 u64 *gpu_addr, void **cpu_addr);
133void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr,
134 void **cpu_addr);
142int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr); 135int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr);
143void amdgpu_bo_kunmap(struct amdgpu_bo *bo); 136void amdgpu_bo_kunmap(struct amdgpu_bo *bo);
144struct amdgpu_bo *amdgpu_bo_ref(struct amdgpu_bo *bo); 137struct amdgpu_bo *amdgpu_bo_ref(struct amdgpu_bo *bo);
@@ -165,6 +158,19 @@ void amdgpu_bo_move_notify(struct ttm_buffer_object *bo,
165int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo); 158int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo);
166void amdgpu_bo_fence(struct amdgpu_bo *bo, struct fence *fence, 159void amdgpu_bo_fence(struct amdgpu_bo *bo, struct fence *fence,
167 bool shared); 160 bool shared);
161u64 amdgpu_bo_gpu_offset(struct amdgpu_bo *bo);
162int amdgpu_bo_backup_to_shadow(struct amdgpu_device *adev,
163 struct amdgpu_ring *ring,
164 struct amdgpu_bo *bo,
165 struct reservation_object *resv,
166 struct fence **fence, bool direct);
167int amdgpu_bo_restore_from_shadow(struct amdgpu_device *adev,
168 struct amdgpu_ring *ring,
169 struct amdgpu_bo *bo,
170 struct reservation_object *resv,
171 struct fence **fence,
172 bool direct);
173
168 174
169/* 175/*
170 * sub allocation 176 * sub allocation
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pll.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pll.c
index d15314957732..8e67c1210d7c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pll.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pll.c
@@ -25,6 +25,7 @@
25#include "amdgpu.h" 25#include "amdgpu.h"
26#include "atom.h" 26#include "atom.h"
27#include "atombios_encoders.h" 27#include "atombios_encoders.h"
28#include "amdgpu_pll.h"
28#include <asm/div64.h> 29#include <asm/div64.h>
29#include <linux/gcd.h> 30#include <linux/gcd.h>
30 31
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
index 5cc7052e391d..accc908bdc88 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
@@ -1103,54 +1103,46 @@ force:
1103 1103
1104void amdgpu_dpm_enable_uvd(struct amdgpu_device *adev, bool enable) 1104void amdgpu_dpm_enable_uvd(struct amdgpu_device *adev, bool enable)
1105{ 1105{
1106 if (adev->pp_enabled) 1106 if (adev->pp_enabled || adev->pm.funcs->powergate_uvd) {
1107 /* enable/disable UVD */
1108 mutex_lock(&adev->pm.mutex);
1107 amdgpu_dpm_powergate_uvd(adev, !enable); 1109 amdgpu_dpm_powergate_uvd(adev, !enable);
1108 else { 1110 mutex_unlock(&adev->pm.mutex);
1109 if (adev->pm.funcs->powergate_uvd) { 1111 } else {
1112 if (enable) {
1110 mutex_lock(&adev->pm.mutex); 1113 mutex_lock(&adev->pm.mutex);
1111 /* enable/disable UVD */ 1114 adev->pm.dpm.uvd_active = true;
1112 amdgpu_dpm_powergate_uvd(adev, !enable); 1115 adev->pm.dpm.state = POWER_STATE_TYPE_INTERNAL_UVD;
1113 mutex_unlock(&adev->pm.mutex); 1116 mutex_unlock(&adev->pm.mutex);
1114 } else { 1117 } else {
1115 if (enable) { 1118 mutex_lock(&adev->pm.mutex);
1116 mutex_lock(&adev->pm.mutex); 1119 adev->pm.dpm.uvd_active = false;
1117 adev->pm.dpm.uvd_active = true; 1120 mutex_unlock(&adev->pm.mutex);
1118 adev->pm.dpm.state = POWER_STATE_TYPE_INTERNAL_UVD;
1119 mutex_unlock(&adev->pm.mutex);
1120 } else {
1121 mutex_lock(&adev->pm.mutex);
1122 adev->pm.dpm.uvd_active = false;
1123 mutex_unlock(&adev->pm.mutex);
1124 }
1125 amdgpu_pm_compute_clocks(adev);
1126 } 1121 }
1127 1122 amdgpu_pm_compute_clocks(adev);
1128 } 1123 }
1129} 1124}
1130 1125
1131void amdgpu_dpm_enable_vce(struct amdgpu_device *adev, bool enable) 1126void amdgpu_dpm_enable_vce(struct amdgpu_device *adev, bool enable)
1132{ 1127{
1133 if (adev->pp_enabled) 1128 if (adev->pp_enabled || adev->pm.funcs->powergate_vce) {
1129 /* enable/disable VCE */
1130 mutex_lock(&adev->pm.mutex);
1134 amdgpu_dpm_powergate_vce(adev, !enable); 1131 amdgpu_dpm_powergate_vce(adev, !enable);
1135 else { 1132 mutex_unlock(&adev->pm.mutex);
1136 if (adev->pm.funcs->powergate_vce) { 1133 } else {
1134 if (enable) {
1137 mutex_lock(&adev->pm.mutex); 1135 mutex_lock(&adev->pm.mutex);
1138 amdgpu_dpm_powergate_vce(adev, !enable); 1136 adev->pm.dpm.vce_active = true;
1137 /* XXX select vce level based on ring/task */
1138 adev->pm.dpm.vce_level = AMDGPU_VCE_LEVEL_AC_ALL;
1139 mutex_unlock(&adev->pm.mutex); 1139 mutex_unlock(&adev->pm.mutex);
1140 } else { 1140 } else {
1141 if (enable) { 1141 mutex_lock(&adev->pm.mutex);
1142 mutex_lock(&adev->pm.mutex); 1142 adev->pm.dpm.vce_active = false;
1143 adev->pm.dpm.vce_active = true; 1143 mutex_unlock(&adev->pm.mutex);
1144 /* XXX select vce level based on ring/task */
1145 adev->pm.dpm.vce_level = AMDGPU_VCE_LEVEL_AC_ALL;
1146 mutex_unlock(&adev->pm.mutex);
1147 } else {
1148 mutex_lock(&adev->pm.mutex);
1149 adev->pm.dpm.vce_active = false;
1150 mutex_unlock(&adev->pm.mutex);
1151 }
1152 amdgpu_pm_compute_clocks(adev);
1153 } 1144 }
1145 amdgpu_pm_compute_clocks(adev);
1154 } 1146 }
1155} 1147}
1156 1148
@@ -1330,6 +1322,64 @@ void amdgpu_pm_compute_clocks(struct amdgpu_device *adev)
1330 */ 1322 */
1331#if defined(CONFIG_DEBUG_FS) 1323#if defined(CONFIG_DEBUG_FS)
1332 1324
1325static int amdgpu_debugfs_pm_info_pp(struct seq_file *m, struct amdgpu_device *adev)
1326{
1327 int32_t value;
1328
1329 /* sanity check PP is enabled */
1330 if (!(adev->powerplay.pp_funcs &&
1331 adev->powerplay.pp_funcs->read_sensor))
1332 return -EINVAL;
1333
1334 /* GPU Clocks */
1335 seq_printf(m, "GFX Clocks and Power:\n");
1336 if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GFX_MCLK, &value))
1337 seq_printf(m, "\t%u MHz (MCLK)\n", value/100);
1338 if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GFX_SCLK, &value))
1339 seq_printf(m, "\t%u MHz (SCLK)\n", value/100);
1340 if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_VDDGFX, &value))
1341 seq_printf(m, "\t%u mV (VDDGFX)\n", value);
1342 if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_VDDNB, &value))
1343 seq_printf(m, "\t%u mV (VDDNB)\n", value);
1344 seq_printf(m, "\n");
1345
1346 /* GPU Temp */
1347 if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GPU_TEMP, &value))
1348 seq_printf(m, "GPU Temperature: %u C\n", value/1000);
1349
1350 /* GPU Load */
1351 if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GPU_LOAD, &value))
1352 seq_printf(m, "GPU Load: %u %%\n", value);
1353 seq_printf(m, "\n");
1354
1355 /* UVD clocks */
1356 if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_UVD_POWER, &value)) {
1357 if (!value) {
1358 seq_printf(m, "UVD: Disabled\n");
1359 } else {
1360 seq_printf(m, "UVD: Enabled\n");
1361 if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_UVD_DCLK, &value))
1362 seq_printf(m, "\t%u MHz (DCLK)\n", value/100);
1363 if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_UVD_VCLK, &value))
1364 seq_printf(m, "\t%u MHz (VCLK)\n", value/100);
1365 }
1366 }
1367 seq_printf(m, "\n");
1368
1369 /* VCE clocks */
1370 if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_VCE_POWER, &value)) {
1371 if (!value) {
1372 seq_printf(m, "VCE: Disabled\n");
1373 } else {
1374 seq_printf(m, "VCE: Enabled\n");
1375 if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_VCE_ECCLK, &value))
1376 seq_printf(m, "\t%u MHz (ECCLK)\n", value/100);
1377 }
1378 }
1379
1380 return 0;
1381}
1382
1333static int amdgpu_debugfs_pm_info(struct seq_file *m, void *data) 1383static int amdgpu_debugfs_pm_info(struct seq_file *m, void *data)
1334{ 1384{
1335 struct drm_info_node *node = (struct drm_info_node *) m->private; 1385 struct drm_info_node *node = (struct drm_info_node *) m->private;
@@ -1345,11 +1395,11 @@ static int amdgpu_debugfs_pm_info(struct seq_file *m, void *data)
1345 (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) { 1395 (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) {
1346 seq_printf(m, "PX asic powered off\n"); 1396 seq_printf(m, "PX asic powered off\n");
1347 } else if (adev->pp_enabled) { 1397 } else if (adev->pp_enabled) {
1348 amdgpu_dpm_debugfs_print_current_performance_level(adev, m); 1398 return amdgpu_debugfs_pm_info_pp(m, adev);
1349 } else { 1399 } else {
1350 mutex_lock(&adev->pm.mutex); 1400 mutex_lock(&adev->pm.mutex);
1351 if (adev->pm.funcs->debugfs_print_current_performance_level) 1401 if (adev->pm.funcs->debugfs_print_current_performance_level)
1352 amdgpu_dpm_debugfs_print_current_performance_level(adev, m); 1402 adev->pm.funcs->debugfs_print_current_performance_level(adev, m);
1353 else 1403 else
1354 seq_printf(m, "Debugfs support not implemented for this asic\n"); 1404 seq_printf(m, "Debugfs support not implemented for this asic\n");
1355 mutex_unlock(&adev->pm.mutex); 1405 mutex_unlock(&adev->pm.mutex);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
index c5738a22b690..7532ff822aa7 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
@@ -30,6 +30,7 @@
30#include "amdgpu_pm.h" 30#include "amdgpu_pm.h"
31#include <drm/amdgpu_drm.h> 31#include <drm/amdgpu_drm.h>
32#include "amdgpu_powerplay.h" 32#include "amdgpu_powerplay.h"
33#include "si_dpm.h"
33#include "cik_dpm.h" 34#include "cik_dpm.h"
34#include "vi_dpm.h" 35#include "vi_dpm.h"
35 36
@@ -41,7 +42,6 @@ static int amdgpu_powerplay_init(struct amdgpu_device *adev)
41 amd_pp = &(adev->powerplay); 42 amd_pp = &(adev->powerplay);
42 43
43 if (adev->pp_enabled) { 44 if (adev->pp_enabled) {
44#ifdef CONFIG_DRM_AMD_POWERPLAY
45 struct amd_pp_init *pp_init; 45 struct amd_pp_init *pp_init;
46 46
47 pp_init = kzalloc(sizeof(struct amd_pp_init), GFP_KERNEL); 47 pp_init = kzalloc(sizeof(struct amd_pp_init), GFP_KERNEL);
@@ -52,15 +52,21 @@ static int amdgpu_powerplay_init(struct amdgpu_device *adev)
52 pp_init->chip_family = adev->family; 52 pp_init->chip_family = adev->family;
53 pp_init->chip_id = adev->asic_type; 53 pp_init->chip_id = adev->asic_type;
54 pp_init->device = amdgpu_cgs_create_device(adev); 54 pp_init->device = amdgpu_cgs_create_device(adev);
55 pp_init->powercontainment_enabled = amdgpu_powercontainment;
56
57 ret = amd_powerplay_init(pp_init, amd_pp); 55 ret = amd_powerplay_init(pp_init, amd_pp);
58 kfree(pp_init); 56 kfree(pp_init);
59#endif
60 } else { 57 } else {
61 amd_pp->pp_handle = (void *)adev; 58 amd_pp->pp_handle = (void *)adev;
62 59
63 switch (adev->asic_type) { 60 switch (adev->asic_type) {
61#ifdef CONFIG_DRM_AMDGPU_SI
62 case CHIP_TAHITI:
63 case CHIP_PITCAIRN:
64 case CHIP_VERDE:
65 case CHIP_OLAND:
66 case CHIP_HAINAN:
67 amd_pp->ip_funcs = &si_dpm_ip_funcs;
68 break;
69#endif
64#ifdef CONFIG_DRM_AMDGPU_CIK 70#ifdef CONFIG_DRM_AMDGPU_CIK
65 case CHIP_BONAIRE: 71 case CHIP_BONAIRE:
66 case CHIP_HAWAII: 72 case CHIP_HAWAII:
@@ -72,15 +78,6 @@ static int amdgpu_powerplay_init(struct amdgpu_device *adev)
72 amd_pp->ip_funcs = &kv_dpm_ip_funcs; 78 amd_pp->ip_funcs = &kv_dpm_ip_funcs;
73 break; 79 break;
74#endif 80#endif
75 case CHIP_TOPAZ:
76 amd_pp->ip_funcs = &iceland_dpm_ip_funcs;
77 break;
78 case CHIP_TONGA:
79 amd_pp->ip_funcs = &tonga_dpm_ip_funcs;
80 break;
81 case CHIP_FIJI:
82 amd_pp->ip_funcs = &fiji_dpm_ip_funcs;
83 break;
84 case CHIP_CARRIZO: 81 case CHIP_CARRIZO:
85 case CHIP_STONEY: 82 case CHIP_STONEY:
86 amd_pp->ip_funcs = &cz_dpm_ip_funcs; 83 amd_pp->ip_funcs = &cz_dpm_ip_funcs;
@@ -98,19 +95,17 @@ static int amdgpu_pp_early_init(void *handle)
98 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 95 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
99 int ret = 0; 96 int ret = 0;
100 97
101#ifdef CONFIG_DRM_AMD_POWERPLAY
102 switch (adev->asic_type) { 98 switch (adev->asic_type) {
103 case CHIP_POLARIS11: 99 case CHIP_POLARIS11:
104 case CHIP_POLARIS10: 100 case CHIP_POLARIS10:
105 adev->pp_enabled = true;
106 break;
107 case CHIP_TONGA: 101 case CHIP_TONGA:
108 case CHIP_FIJI: 102 case CHIP_FIJI:
109 adev->pp_enabled = (amdgpu_powerplay == 0) ? false : true; 103 case CHIP_TOPAZ:
104 adev->pp_enabled = true;
110 break; 105 break;
111 case CHIP_CARRIZO: 106 case CHIP_CARRIZO:
112 case CHIP_STONEY: 107 case CHIP_STONEY:
113 adev->pp_enabled = (amdgpu_powerplay > 0) ? true : false; 108 adev->pp_enabled = (amdgpu_powerplay == 0) ? false : true;
114 break; 109 break;
115 /* These chips don't have powerplay implemenations */ 110 /* These chips don't have powerplay implemenations */
116 case CHIP_BONAIRE: 111 case CHIP_BONAIRE:
@@ -118,14 +113,10 @@ static int amdgpu_pp_early_init(void *handle)
118 case CHIP_KABINI: 113 case CHIP_KABINI:
119 case CHIP_MULLINS: 114 case CHIP_MULLINS:
120 case CHIP_KAVERI: 115 case CHIP_KAVERI:
121 case CHIP_TOPAZ:
122 default: 116 default:
123 adev->pp_enabled = false; 117 adev->pp_enabled = false;
124 break; 118 break;
125 } 119 }
126#else
127 adev->pp_enabled = false;
128#endif
129 120
130 ret = amdgpu_powerplay_init(adev); 121 ret = amdgpu_powerplay_init(adev);
131 if (ret) 122 if (ret)
@@ -147,12 +138,11 @@ static int amdgpu_pp_late_init(void *handle)
147 ret = adev->powerplay.ip_funcs->late_init( 138 ret = adev->powerplay.ip_funcs->late_init(
148 adev->powerplay.pp_handle); 139 adev->powerplay.pp_handle);
149 140
150#ifdef CONFIG_DRM_AMD_POWERPLAY
151 if (adev->pp_enabled && adev->pm.dpm_enabled) { 141 if (adev->pp_enabled && adev->pm.dpm_enabled) {
152 amdgpu_pm_sysfs_init(adev); 142 amdgpu_pm_sysfs_init(adev);
153 amdgpu_dpm_dispatch_task(adev, AMD_PP_EVENT_COMPLETE_INIT, NULL, NULL); 143 amdgpu_dpm_dispatch_task(adev, AMD_PP_EVENT_COMPLETE_INIT, NULL, NULL);
154 } 144 }
155#endif 145
156 return ret; 146 return ret;
157} 147}
158 148
@@ -165,10 +155,8 @@ static int amdgpu_pp_sw_init(void *handle)
165 ret = adev->powerplay.ip_funcs->sw_init( 155 ret = adev->powerplay.ip_funcs->sw_init(
166 adev->powerplay.pp_handle); 156 adev->powerplay.pp_handle);
167 157
168#ifdef CONFIG_DRM_AMD_POWERPLAY
169 if (adev->pp_enabled) 158 if (adev->pp_enabled)
170 adev->pm.dpm_enabled = true; 159 adev->pm.dpm_enabled = true;
171#endif
172 160
173 return ret; 161 return ret;
174} 162}
@@ -219,7 +207,6 @@ static int amdgpu_pp_hw_fini(void *handle)
219 207
220static void amdgpu_pp_late_fini(void *handle) 208static void amdgpu_pp_late_fini(void *handle)
221{ 209{
222#ifdef CONFIG_DRM_AMD_POWERPLAY
223 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 210 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
224 211
225 if (adev->pp_enabled) { 212 if (adev->pp_enabled) {
@@ -230,7 +217,6 @@ static void amdgpu_pp_late_fini(void *handle)
230 if (adev->powerplay.ip_funcs->late_fini) 217 if (adev->powerplay.ip_funcs->late_fini)
231 adev->powerplay.ip_funcs->late_fini( 218 adev->powerplay.ip_funcs->late_fini(
232 adev->powerplay.pp_handle); 219 adev->powerplay.pp_handle);
233#endif
234} 220}
235 221
236static int amdgpu_pp_suspend(void *handle) 222static int amdgpu_pp_suspend(void *handle)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
index 85aeb0a804bb..e1fa8731d1e2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
@@ -222,33 +222,16 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
222 222
223 /* Allocate ring buffer */ 223 /* Allocate ring buffer */
224 if (ring->ring_obj == NULL) { 224 if (ring->ring_obj == NULL) {
225 r = amdgpu_bo_create(adev, ring->ring_size, PAGE_SIZE, true, 225 r = amdgpu_bo_create_kernel(adev, ring->ring_size, PAGE_SIZE,
226 AMDGPU_GEM_DOMAIN_GTT, 0, 226 AMDGPU_GEM_DOMAIN_GTT,
227 NULL, NULL, &ring->ring_obj); 227 &ring->ring_obj,
228 &ring->gpu_addr,
229 (void **)&ring->ring);
228 if (r) { 230 if (r) {
229 dev_err(adev->dev, "(%d) ring create failed\n", r); 231 dev_err(adev->dev, "(%d) ring create failed\n", r);
230 return r; 232 return r;
231 } 233 }
232 r = amdgpu_bo_reserve(ring->ring_obj, false);
233 if (unlikely(r != 0))
234 return r;
235 r = amdgpu_bo_pin(ring->ring_obj, AMDGPU_GEM_DOMAIN_GTT,
236 &ring->gpu_addr);
237 if (r) {
238 amdgpu_bo_unreserve(ring->ring_obj);
239 dev_err(adev->dev, "(%d) ring pin failed\n", r);
240 return r;
241 }
242 r = amdgpu_bo_kmap(ring->ring_obj,
243 (void **)&ring->ring);
244
245 memset((void *)ring->ring, 0, ring->ring_size); 234 memset((void *)ring->ring, 0, ring->ring_size);
246
247 amdgpu_bo_unreserve(ring->ring_obj);
248 if (r) {
249 dev_err(adev->dev, "(%d) ring map failed\n", r);
250 return r;
251 }
252 } 235 }
253 ring->ptr_mask = (ring->ring_size / 4) - 1; 236 ring->ptr_mask = (ring->ring_size / 4) - 1;
254 ring->max_dw = max_dw; 237 ring->max_dw = max_dw;
@@ -269,29 +252,20 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
269 */ 252 */
270void amdgpu_ring_fini(struct amdgpu_ring *ring) 253void amdgpu_ring_fini(struct amdgpu_ring *ring)
271{ 254{
272 int r;
273 struct amdgpu_bo *ring_obj;
274
275 ring_obj = ring->ring_obj;
276 ring->ready = false; 255 ring->ready = false;
277 ring->ring = NULL;
278 ring->ring_obj = NULL;
279 256
280 amdgpu_wb_free(ring->adev, ring->cond_exe_offs); 257 amdgpu_wb_free(ring->adev, ring->cond_exe_offs);
281 amdgpu_wb_free(ring->adev, ring->fence_offs); 258 amdgpu_wb_free(ring->adev, ring->fence_offs);
282 amdgpu_wb_free(ring->adev, ring->rptr_offs); 259 amdgpu_wb_free(ring->adev, ring->rptr_offs);
283 amdgpu_wb_free(ring->adev, ring->wptr_offs); 260 amdgpu_wb_free(ring->adev, ring->wptr_offs);
284 261
285 if (ring_obj) { 262 amdgpu_bo_free_kernel(&ring->ring_obj,
286 r = amdgpu_bo_reserve(ring_obj, false); 263 &ring->gpu_addr,
287 if (likely(r == 0)) { 264 (void **)&ring->ring);
288 amdgpu_bo_kunmap(ring_obj); 265
289 amdgpu_bo_unpin(ring_obj);
290 amdgpu_bo_unreserve(ring_obj);
291 }
292 amdgpu_bo_unref(&ring_obj);
293 }
294 amdgpu_debugfs_ring_fini(ring); 266 amdgpu_debugfs_ring_fini(ring);
267
268 ring->adev->rings[ring->idx] = NULL;
295} 269}
296 270
297/* 271/*
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c
index 05a53f4fc334..b827c75e95de 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c
@@ -111,7 +111,7 @@ static void amdgpu_do_test_moves(struct amdgpu_device *adev)
111 amdgpu_bo_kunmap(gtt_obj[i]); 111 amdgpu_bo_kunmap(gtt_obj[i]);
112 112
113 r = amdgpu_copy_buffer(ring, gtt_addr, vram_addr, 113 r = amdgpu_copy_buffer(ring, gtt_addr, vram_addr,
114 size, NULL, &fence); 114 size, NULL, &fence, false);
115 115
116 if (r) { 116 if (r) {
117 DRM_ERROR("Failed GTT->VRAM copy %d\n", i); 117 DRM_ERROR("Failed GTT->VRAM copy %d\n", i);
@@ -156,7 +156,7 @@ static void amdgpu_do_test_moves(struct amdgpu_device *adev)
156 amdgpu_bo_kunmap(vram_obj); 156 amdgpu_bo_kunmap(vram_obj);
157 157
158 r = amdgpu_copy_buffer(ring, vram_addr, gtt_addr, 158 r = amdgpu_copy_buffer(ring, vram_addr, gtt_addr,
159 size, NULL, &fence); 159 size, NULL, &fence, false);
160 160
161 if (r) { 161 if (r) {
162 DRM_ERROR("Failed VRAM->GTT copy %d\n", i); 162 DRM_ERROR("Failed VRAM->GTT copy %d\n", i);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
index 0d8d65eb46cd..067e5e683bb3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
@@ -247,7 +247,7 @@ DEFINE_EVENT(amdgpu_vm_mapping, amdgpu_vm_bo_mapping,
247 TP_ARGS(mapping) 247 TP_ARGS(mapping)
248); 248);
249 249
250TRACE_EVENT(amdgpu_vm_set_page, 250TRACE_EVENT(amdgpu_vm_set_ptes,
251 TP_PROTO(uint64_t pe, uint64_t addr, unsigned count, 251 TP_PROTO(uint64_t pe, uint64_t addr, unsigned count,
252 uint32_t incr, uint32_t flags), 252 uint32_t incr, uint32_t flags),
253 TP_ARGS(pe, addr, count, incr, flags), 253 TP_ARGS(pe, addr, count, incr, flags),
@@ -271,6 +271,24 @@ TRACE_EVENT(amdgpu_vm_set_page,
271 __entry->flags, __entry->count) 271 __entry->flags, __entry->count)
272); 272);
273 273
274TRACE_EVENT(amdgpu_vm_copy_ptes,
275 TP_PROTO(uint64_t pe, uint64_t src, unsigned count),
276 TP_ARGS(pe, src, count),
277 TP_STRUCT__entry(
278 __field(u64, pe)
279 __field(u64, src)
280 __field(u32, count)
281 ),
282
283 TP_fast_assign(
284 __entry->pe = pe;
285 __entry->src = src;
286 __entry->count = count;
287 ),
288 TP_printk("pe=%010Lx, src=%010Lx, count=%u",
289 __entry->pe, __entry->src, __entry->count)
290);
291
274TRACE_EVENT(amdgpu_vm_flush, 292TRACE_EVENT(amdgpu_vm_flush,
275 TP_PROTO(uint64_t pd_addr, unsigned ring, unsigned id), 293 TP_PROTO(uint64_t pd_addr, unsigned ring, unsigned id),
276 TP_ARGS(pd_addr, ring, id), 294 TP_ARGS(pd_addr, ring, id),
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 716f2afeb6a9..887483b8b818 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -34,6 +34,7 @@
34#include <ttm/ttm_placement.h> 34#include <ttm/ttm_placement.h>
35#include <ttm/ttm_module.h> 35#include <ttm/ttm_module.h>
36#include <ttm/ttm_page_alloc.h> 36#include <ttm/ttm_page_alloc.h>
37#include <ttm/ttm_memory.h>
37#include <drm/drmP.h> 38#include <drm/drmP.h>
38#include <drm/amdgpu_drm.h> 39#include <drm/amdgpu_drm.h>
39#include <linux/seq_file.h> 40#include <linux/seq_file.h>
@@ -74,7 +75,7 @@ static void amdgpu_ttm_mem_global_release(struct drm_global_reference *ref)
74 ttm_mem_global_release(ref->object); 75 ttm_mem_global_release(ref->object);
75} 76}
76 77
77static int amdgpu_ttm_global_init(struct amdgpu_device *adev) 78int amdgpu_ttm_global_init(struct amdgpu_device *adev)
78{ 79{
79 struct drm_global_reference *global_ref; 80 struct drm_global_reference *global_ref;
80 struct amdgpu_ring *ring; 81 struct amdgpu_ring *ring;
@@ -88,10 +89,10 @@ static int amdgpu_ttm_global_init(struct amdgpu_device *adev)
88 global_ref->init = &amdgpu_ttm_mem_global_init; 89 global_ref->init = &amdgpu_ttm_mem_global_init;
89 global_ref->release = &amdgpu_ttm_mem_global_release; 90 global_ref->release = &amdgpu_ttm_mem_global_release;
90 r = drm_global_item_ref(global_ref); 91 r = drm_global_item_ref(global_ref);
91 if (r != 0) { 92 if (r) {
92 DRM_ERROR("Failed setting up TTM memory accounting " 93 DRM_ERROR("Failed setting up TTM memory accounting "
93 "subsystem.\n"); 94 "subsystem.\n");
94 return r; 95 goto error_mem;
95 } 96 }
96 97
97 adev->mman.bo_global_ref.mem_glob = 98 adev->mman.bo_global_ref.mem_glob =
@@ -102,26 +103,30 @@ static int amdgpu_ttm_global_init(struct amdgpu_device *adev)
102 global_ref->init = &ttm_bo_global_init; 103 global_ref->init = &ttm_bo_global_init;
103 global_ref->release = &ttm_bo_global_release; 104 global_ref->release = &ttm_bo_global_release;
104 r = drm_global_item_ref(global_ref); 105 r = drm_global_item_ref(global_ref);
105 if (r != 0) { 106 if (r) {
106 DRM_ERROR("Failed setting up TTM BO subsystem.\n"); 107 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
107 drm_global_item_unref(&adev->mman.mem_global_ref); 108 goto error_bo;
108 return r;
109 } 109 }
110 110
111 ring = adev->mman.buffer_funcs_ring; 111 ring = adev->mman.buffer_funcs_ring;
112 rq = &ring->sched.sched_rq[AMD_SCHED_PRIORITY_KERNEL]; 112 rq = &ring->sched.sched_rq[AMD_SCHED_PRIORITY_KERNEL];
113 r = amd_sched_entity_init(&ring->sched, &adev->mman.entity, 113 r = amd_sched_entity_init(&ring->sched, &adev->mman.entity,
114 rq, amdgpu_sched_jobs); 114 rq, amdgpu_sched_jobs);
115 if (r != 0) { 115 if (r) {
116 DRM_ERROR("Failed setting up TTM BO move run queue.\n"); 116 DRM_ERROR("Failed setting up TTM BO move run queue.\n");
117 drm_global_item_unref(&adev->mman.mem_global_ref); 117 goto error_entity;
118 drm_global_item_unref(&adev->mman.bo_global_ref.ref);
119 return r;
120 } 118 }
121 119
122 adev->mman.mem_global_referenced = true; 120 adev->mman.mem_global_referenced = true;
123 121
124 return 0; 122 return 0;
123
124error_entity:
125 drm_global_item_unref(&adev->mman.bo_global_ref.ref);
126error_bo:
127 drm_global_item_unref(&adev->mman.mem_global_ref);
128error_mem:
129 return r;
125} 130}
126 131
127static void amdgpu_ttm_global_fini(struct amdgpu_device *adev) 132static void amdgpu_ttm_global_fini(struct amdgpu_device *adev)
@@ -155,7 +160,7 @@ static int amdgpu_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
155 man->default_caching = TTM_PL_FLAG_CACHED; 160 man->default_caching = TTM_PL_FLAG_CACHED;
156 break; 161 break;
157 case TTM_PL_TT: 162 case TTM_PL_TT:
158 man->func = &ttm_bo_manager_func; 163 man->func = &amdgpu_gtt_mgr_func;
159 man->gpu_offset = adev->mc.gtt_start; 164 man->gpu_offset = adev->mc.gtt_start;
160 man->available_caching = TTM_PL_MASK_CACHING; 165 man->available_caching = TTM_PL_MASK_CACHING;
161 man->default_caching = TTM_PL_FLAG_CACHED; 166 man->default_caching = TTM_PL_FLAG_CACHED;
@@ -190,12 +195,13 @@ static int amdgpu_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
190static void amdgpu_evict_flags(struct ttm_buffer_object *bo, 195static void amdgpu_evict_flags(struct ttm_buffer_object *bo,
191 struct ttm_placement *placement) 196 struct ttm_placement *placement)
192{ 197{
193 struct amdgpu_bo *rbo; 198 struct amdgpu_bo *abo;
194 static struct ttm_place placements = { 199 static struct ttm_place placements = {
195 .fpfn = 0, 200 .fpfn = 0,
196 .lpfn = 0, 201 .lpfn = 0,
197 .flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM 202 .flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM
198 }; 203 };
204 unsigned i;
199 205
200 if (!amdgpu_ttm_bo_is_amdgpu_bo(bo)) { 206 if (!amdgpu_ttm_bo_is_amdgpu_bo(bo)) {
201 placement->placement = &placements; 207 placement->placement = &placements;
@@ -204,28 +210,44 @@ static void amdgpu_evict_flags(struct ttm_buffer_object *bo,
204 placement->num_busy_placement = 1; 210 placement->num_busy_placement = 1;
205 return; 211 return;
206 } 212 }
207 rbo = container_of(bo, struct amdgpu_bo, tbo); 213 abo = container_of(bo, struct amdgpu_bo, tbo);
208 switch (bo->mem.mem_type) { 214 switch (bo->mem.mem_type) {
209 case TTM_PL_VRAM: 215 case TTM_PL_VRAM:
210 if (rbo->adev->mman.buffer_funcs_ring->ready == false) 216 if (abo->adev->mman.buffer_funcs_ring->ready == false) {
211 amdgpu_ttm_placement_from_domain(rbo, AMDGPU_GEM_DOMAIN_CPU); 217 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU);
212 else 218 } else {
213 amdgpu_ttm_placement_from_domain(rbo, AMDGPU_GEM_DOMAIN_GTT); 219 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_GTT);
220 for (i = 0; i < abo->placement.num_placement; ++i) {
221 if (!(abo->placements[i].flags &
222 TTM_PL_FLAG_TT))
223 continue;
224
225 if (abo->placements[i].lpfn)
226 continue;
227
228 /* set an upper limit to force directly
229 * allocating address space for the BO.
230 */
231 abo->placements[i].lpfn =
232 abo->adev->mc.gtt_size >> PAGE_SHIFT;
233 }
234 }
214 break; 235 break;
215 case TTM_PL_TT: 236 case TTM_PL_TT:
216 default: 237 default:
217 amdgpu_ttm_placement_from_domain(rbo, AMDGPU_GEM_DOMAIN_CPU); 238 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU);
218 } 239 }
219 *placement = rbo->placement; 240 *placement = abo->placement;
220} 241}
221 242
222static int amdgpu_verify_access(struct ttm_buffer_object *bo, struct file *filp) 243static int amdgpu_verify_access(struct ttm_buffer_object *bo, struct file *filp)
223{ 244{
224 struct amdgpu_bo *rbo = container_of(bo, struct amdgpu_bo, tbo); 245 struct amdgpu_bo *abo = container_of(bo, struct amdgpu_bo, tbo);
225 246
226 if (amdgpu_ttm_tt_get_usermm(bo->ttm)) 247 if (amdgpu_ttm_tt_get_usermm(bo->ttm))
227 return -EPERM; 248 return -EPERM;
228 return drm_vma_node_verify_access(&rbo->gem_base.vma_node, filp); 249 return drm_vma_node_verify_access(&abo->gem_base.vma_node,
250 filp->private_data);
229} 251}
230 252
231static void amdgpu_move_null(struct ttm_buffer_object *bo, 253static void amdgpu_move_null(struct ttm_buffer_object *bo,
@@ -251,26 +273,30 @@ static int amdgpu_move_blit(struct ttm_buffer_object *bo,
251 273
252 adev = amdgpu_get_adev(bo->bdev); 274 adev = amdgpu_get_adev(bo->bdev);
253 ring = adev->mman.buffer_funcs_ring; 275 ring = adev->mman.buffer_funcs_ring;
254 old_start = (u64)old_mem->start << PAGE_SHIFT;
255 new_start = (u64)new_mem->start << PAGE_SHIFT;
256 276
257 switch (old_mem->mem_type) { 277 switch (old_mem->mem_type) {
258 case TTM_PL_VRAM:
259 old_start += adev->mc.vram_start;
260 break;
261 case TTM_PL_TT: 278 case TTM_PL_TT:
262 old_start += adev->mc.gtt_start; 279 r = amdgpu_ttm_bind(bo, old_mem);
280 if (r)
281 return r;
282
283 case TTM_PL_VRAM:
284 old_start = (u64)old_mem->start << PAGE_SHIFT;
285 old_start += bo->bdev->man[old_mem->mem_type].gpu_offset;
263 break; 286 break;
264 default: 287 default:
265 DRM_ERROR("Unknown placement %d\n", old_mem->mem_type); 288 DRM_ERROR("Unknown placement %d\n", old_mem->mem_type);
266 return -EINVAL; 289 return -EINVAL;
267 } 290 }
268 switch (new_mem->mem_type) { 291 switch (new_mem->mem_type) {
269 case TTM_PL_VRAM:
270 new_start += adev->mc.vram_start;
271 break;
272 case TTM_PL_TT: 292 case TTM_PL_TT:
273 new_start += adev->mc.gtt_start; 293 r = amdgpu_ttm_bind(bo, new_mem);
294 if (r)
295 return r;
296
297 case TTM_PL_VRAM:
298 new_start = (u64)new_mem->start << PAGE_SHIFT;
299 new_start += bo->bdev->man[new_mem->mem_type].gpu_offset;
274 break; 300 break;
275 default: 301 default:
276 DRM_ERROR("Unknown placement %d\n", old_mem->mem_type); 302 DRM_ERROR("Unknown placement %d\n", old_mem->mem_type);
@@ -285,7 +311,7 @@ static int amdgpu_move_blit(struct ttm_buffer_object *bo,
285 311
286 r = amdgpu_copy_buffer(ring, old_start, new_start, 312 r = amdgpu_copy_buffer(ring, old_start, new_start,
287 new_mem->num_pages * PAGE_SIZE, /* bytes */ 313 new_mem->num_pages * PAGE_SIZE, /* bytes */
288 bo->resv, &fence); 314 bo->resv, &fence, false);
289 if (r) 315 if (r)
290 return r; 316 return r;
291 317
@@ -314,7 +340,7 @@ static int amdgpu_move_vram_ram(struct ttm_buffer_object *bo,
314 placement.num_busy_placement = 1; 340 placement.num_busy_placement = 1;
315 placement.busy_placement = &placements; 341 placement.busy_placement = &placements;
316 placements.fpfn = 0; 342 placements.fpfn = 0;
317 placements.lpfn = 0; 343 placements.lpfn = adev->mc.gtt_size >> PAGE_SHIFT;
318 placements.flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT; 344 placements.flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
319 r = ttm_bo_mem_space(bo, &placement, &tmp_mem, 345 r = ttm_bo_mem_space(bo, &placement, &tmp_mem,
320 interruptible, no_wait_gpu); 346 interruptible, no_wait_gpu);
@@ -335,7 +361,7 @@ static int amdgpu_move_vram_ram(struct ttm_buffer_object *bo,
335 if (unlikely(r)) { 361 if (unlikely(r)) {
336 goto out_cleanup; 362 goto out_cleanup;
337 } 363 }
338 r = ttm_bo_move_ttm(bo, true, interruptible, no_wait_gpu, new_mem); 364 r = ttm_bo_move_ttm(bo, interruptible, no_wait_gpu, new_mem);
339out_cleanup: 365out_cleanup:
340 ttm_bo_mem_put(bo, &tmp_mem); 366 ttm_bo_mem_put(bo, &tmp_mem);
341 return r; 367 return r;
@@ -361,14 +387,14 @@ static int amdgpu_move_ram_vram(struct ttm_buffer_object *bo,
361 placement.num_busy_placement = 1; 387 placement.num_busy_placement = 1;
362 placement.busy_placement = &placements; 388 placement.busy_placement = &placements;
363 placements.fpfn = 0; 389 placements.fpfn = 0;
364 placements.lpfn = 0; 390 placements.lpfn = adev->mc.gtt_size >> PAGE_SHIFT;
365 placements.flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT; 391 placements.flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
366 r = ttm_bo_mem_space(bo, &placement, &tmp_mem, 392 r = ttm_bo_mem_space(bo, &placement, &tmp_mem,
367 interruptible, no_wait_gpu); 393 interruptible, no_wait_gpu);
368 if (unlikely(r)) { 394 if (unlikely(r)) {
369 return r; 395 return r;
370 } 396 }
371 r = ttm_bo_move_ttm(bo, true, interruptible, no_wait_gpu, &tmp_mem); 397 r = ttm_bo_move_ttm(bo, interruptible, no_wait_gpu, &tmp_mem);
372 if (unlikely(r)) { 398 if (unlikely(r)) {
373 goto out_cleanup; 399 goto out_cleanup;
374 } 400 }
@@ -435,8 +461,7 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo,
435 461
436 if (r) { 462 if (r) {
437memcpy: 463memcpy:
438 r = ttm_bo_move_memcpy(bo, evict, interruptible, 464 r = ttm_bo_move_memcpy(bo, interruptible, no_wait_gpu, new_mem);
439 no_wait_gpu, new_mem);
440 if (r) { 465 if (r) {
441 return r; 466 return r;
442 } 467 }
@@ -524,6 +549,7 @@ struct amdgpu_ttm_tt {
524 spinlock_t guptasklock; 549 spinlock_t guptasklock;
525 struct list_head guptasks; 550 struct list_head guptasks;
526 atomic_t mmu_invalidations; 551 atomic_t mmu_invalidations;
552 struct list_head list;
527}; 553};
528 554
529int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages) 555int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages)
@@ -641,7 +667,6 @@ static int amdgpu_ttm_backend_bind(struct ttm_tt *ttm,
641 struct ttm_mem_reg *bo_mem) 667 struct ttm_mem_reg *bo_mem)
642{ 668{
643 struct amdgpu_ttm_tt *gtt = (void*)ttm; 669 struct amdgpu_ttm_tt *gtt = (void*)ttm;
644 uint32_t flags = amdgpu_ttm_tt_pte_flags(gtt->adev, ttm, bo_mem);
645 int r; 670 int r;
646 671
647 if (gtt->userptr) { 672 if (gtt->userptr) {
@@ -651,7 +676,6 @@ static int amdgpu_ttm_backend_bind(struct ttm_tt *ttm,
651 return r; 676 return r;
652 } 677 }
653 } 678 }
654 gtt->offset = (unsigned long)(bo_mem->start << PAGE_SHIFT);
655 if (!ttm->num_pages) { 679 if (!ttm->num_pages) {
656 WARN(1, "nothing to bind %lu pages for mreg %p back %p!\n", 680 WARN(1, "nothing to bind %lu pages for mreg %p back %p!\n",
657 ttm->num_pages, bo_mem, ttm); 681 ttm->num_pages, bo_mem, ttm);
@@ -662,14 +686,71 @@ static int amdgpu_ttm_backend_bind(struct ttm_tt *ttm,
662 bo_mem->mem_type == AMDGPU_PL_OA) 686 bo_mem->mem_type == AMDGPU_PL_OA)
663 return -EINVAL; 687 return -EINVAL;
664 688
689 return 0;
690}
691
692bool amdgpu_ttm_is_bound(struct ttm_tt *ttm)
693{
694 struct amdgpu_ttm_tt *gtt = (void *)ttm;
695
696 return gtt && !list_empty(&gtt->list);
697}
698
699int amdgpu_ttm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *bo_mem)
700{
701 struct ttm_tt *ttm = bo->ttm;
702 struct amdgpu_ttm_tt *gtt = (void *)bo->ttm;
703 uint32_t flags;
704 int r;
705
706 if (!ttm || amdgpu_ttm_is_bound(ttm))
707 return 0;
708
709 r = amdgpu_gtt_mgr_alloc(&bo->bdev->man[TTM_PL_TT], bo,
710 NULL, bo_mem);
711 if (r) {
712 DRM_ERROR("Failed to allocate GTT address space (%d)\n", r);
713 return r;
714 }
715
716 flags = amdgpu_ttm_tt_pte_flags(gtt->adev, ttm, bo_mem);
717 gtt->offset = (u64)bo_mem->start << PAGE_SHIFT;
665 r = amdgpu_gart_bind(gtt->adev, gtt->offset, ttm->num_pages, 718 r = amdgpu_gart_bind(gtt->adev, gtt->offset, ttm->num_pages,
666 ttm->pages, gtt->ttm.dma_address, flags); 719 ttm->pages, gtt->ttm.dma_address, flags);
667 720
668 if (r) { 721 if (r) {
669 DRM_ERROR("failed to bind %lu pages at 0x%08X\n", 722 DRM_ERROR("failed to bind %lu pages at 0x%08llX\n",
670 ttm->num_pages, (unsigned)gtt->offset); 723 ttm->num_pages, gtt->offset);
671 return r; 724 return r;
672 } 725 }
726 spin_lock(&gtt->adev->gtt_list_lock);
727 list_add_tail(&gtt->list, &gtt->adev->gtt_list);
728 spin_unlock(&gtt->adev->gtt_list_lock);
729 return 0;
730}
731
732int amdgpu_ttm_recover_gart(struct amdgpu_device *adev)
733{
734 struct amdgpu_ttm_tt *gtt, *tmp;
735 struct ttm_mem_reg bo_mem;
736 uint32_t flags;
737 int r;
738
739 bo_mem.mem_type = TTM_PL_TT;
740 spin_lock(&adev->gtt_list_lock);
741 list_for_each_entry_safe(gtt, tmp, &adev->gtt_list, list) {
742 flags = amdgpu_ttm_tt_pte_flags(gtt->adev, &gtt->ttm.ttm, &bo_mem);
743 r = amdgpu_gart_bind(adev, gtt->offset, gtt->ttm.ttm.num_pages,
744 gtt->ttm.ttm.pages, gtt->ttm.dma_address,
745 flags);
746 if (r) {
747 spin_unlock(&adev->gtt_list_lock);
748 DRM_ERROR("failed to bind %lu pages at 0x%08llX\n",
749 gtt->ttm.ttm.num_pages, gtt->offset);
750 return r;
751 }
752 }
753 spin_unlock(&adev->gtt_list_lock);
673 return 0; 754 return 0;
674} 755}
675 756
@@ -677,12 +758,19 @@ static int amdgpu_ttm_backend_unbind(struct ttm_tt *ttm)
677{ 758{
678 struct amdgpu_ttm_tt *gtt = (void *)ttm; 759 struct amdgpu_ttm_tt *gtt = (void *)ttm;
679 760
761 if (gtt->userptr)
762 amdgpu_ttm_tt_unpin_userptr(ttm);
763
764 if (!amdgpu_ttm_is_bound(ttm))
765 return 0;
766
680 /* unbind shouldn't be done for GDS/GWS/OA in ttm_bo_clean_mm */ 767 /* unbind shouldn't be done for GDS/GWS/OA in ttm_bo_clean_mm */
681 if (gtt->adev->gart.ready) 768 if (gtt->adev->gart.ready)
682 amdgpu_gart_unbind(gtt->adev, gtt->offset, ttm->num_pages); 769 amdgpu_gart_unbind(gtt->adev, gtt->offset, ttm->num_pages);
683 770
684 if (gtt->userptr) 771 spin_lock(&gtt->adev->gtt_list_lock);
685 amdgpu_ttm_tt_unpin_userptr(ttm); 772 list_del_init(&gtt->list);
773 spin_unlock(&gtt->adev->gtt_list_lock);
686 774
687 return 0; 775 return 0;
688} 776}
@@ -720,6 +808,7 @@ static struct ttm_tt *amdgpu_ttm_tt_create(struct ttm_bo_device *bdev,
720 kfree(gtt); 808 kfree(gtt);
721 return NULL; 809 return NULL;
722 } 810 }
811 INIT_LIST_HEAD(&gtt->list);
723 return &gtt->ttm.ttm; 812 return &gtt->ttm.ttm;
724} 813}
725 814
@@ -991,10 +1080,6 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
991 unsigned i, j; 1080 unsigned i, j;
992 int r; 1081 int r;
993 1082
994 r = amdgpu_ttm_global_init(adev);
995 if (r) {
996 return r;
997 }
998 /* No others user of address space so set it to 0 */ 1083 /* No others user of address space so set it to 0 */
999 r = ttm_bo_device_init(&adev->mman.bdev, 1084 r = ttm_bo_device_init(&adev->mman.bdev,
1000 adev->mman.bo_global_ref.ref.object, 1085 adev->mman.bo_global_ref.ref.object,
@@ -1159,7 +1244,7 @@ int amdgpu_copy_buffer(struct amdgpu_ring *ring,
1159 uint64_t dst_offset, 1244 uint64_t dst_offset,
1160 uint32_t byte_count, 1245 uint32_t byte_count,
1161 struct reservation_object *resv, 1246 struct reservation_object *resv,
1162 struct fence **fence) 1247 struct fence **fence, bool direct_submit)
1163{ 1248{
1164 struct amdgpu_device *adev = ring->adev; 1249 struct amdgpu_device *adev = ring->adev;
1165 struct amdgpu_job *job; 1250 struct amdgpu_job *job;
@@ -1203,8 +1288,79 @@ int amdgpu_copy_buffer(struct amdgpu_ring *ring,
1203 1288
1204 amdgpu_ring_pad_ib(ring, &job->ibs[0]); 1289 amdgpu_ring_pad_ib(ring, &job->ibs[0]);
1205 WARN_ON(job->ibs[0].length_dw > num_dw); 1290 WARN_ON(job->ibs[0].length_dw > num_dw);
1291 if (direct_submit) {
1292 r = amdgpu_ib_schedule(ring, job->num_ibs, job->ibs,
1293 NULL, NULL, fence);
1294 job->fence = fence_get(*fence);
1295 if (r)
1296 DRM_ERROR("Error scheduling IBs (%d)\n", r);
1297 amdgpu_job_free(job);
1298 } else {
1299 r = amdgpu_job_submit(job, ring, &adev->mman.entity,
1300 AMDGPU_FENCE_OWNER_UNDEFINED, fence);
1301 if (r)
1302 goto error_free;
1303 }
1304
1305 return r;
1306
1307error_free:
1308 amdgpu_job_free(job);
1309 return r;
1310}
1311
1312int amdgpu_fill_buffer(struct amdgpu_bo *bo,
1313 uint32_t src_data,
1314 struct reservation_object *resv,
1315 struct fence **fence)
1316{
1317 struct amdgpu_device *adev = bo->adev;
1318 struct amdgpu_job *job;
1319 struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
1320
1321 uint32_t max_bytes, byte_count;
1322 uint64_t dst_offset;
1323 unsigned int num_loops, num_dw;
1324 unsigned int i;
1325 int r;
1326
1327 byte_count = bo->tbo.num_pages << PAGE_SHIFT;
1328 max_bytes = adev->mman.buffer_funcs->fill_max_bytes;
1329 num_loops = DIV_ROUND_UP(byte_count, max_bytes);
1330 num_dw = num_loops * adev->mman.buffer_funcs->fill_num_dw;
1331
1332 /* for IB padding */
1333 while (num_dw & 0x7)
1334 num_dw++;
1335
1336 r = amdgpu_job_alloc_with_ib(adev, num_dw * 4, &job);
1337 if (r)
1338 return r;
1339
1340 if (resv) {
1341 r = amdgpu_sync_resv(adev, &job->sync, resv,
1342 AMDGPU_FENCE_OWNER_UNDEFINED);
1343 if (r) {
1344 DRM_ERROR("sync failed (%d).\n", r);
1345 goto error_free;
1346 }
1347 }
1348
1349 dst_offset = bo->tbo.mem.start << PAGE_SHIFT;
1350 for (i = 0; i < num_loops; i++) {
1351 uint32_t cur_size_in_bytes = min(byte_count, max_bytes);
1352
1353 amdgpu_emit_fill_buffer(adev, &job->ibs[0], src_data,
1354 dst_offset, cur_size_in_bytes);
1355
1356 dst_offset += cur_size_in_bytes;
1357 byte_count -= cur_size_in_bytes;
1358 }
1359
1360 amdgpu_ring_pad_ib(ring, &job->ibs[0]);
1361 WARN_ON(job->ibs[0].length_dw > num_dw);
1206 r = amdgpu_job_submit(job, ring, &adev->mman.entity, 1362 r = amdgpu_job_submit(job, ring, &adev->mman.entity,
1207 AMDGPU_FENCE_OWNER_UNDEFINED, fence); 1363 AMDGPU_FENCE_OWNER_UNDEFINED, fence);
1208 if (r) 1364 if (r)
1209 goto error_free; 1365 goto error_free;
1210 1366
@@ -1395,3 +1551,8 @@ static void amdgpu_ttm_debugfs_fini(struct amdgpu_device *adev)
1395 1551
1396#endif 1552#endif
1397} 1553}
1554
1555u64 amdgpu_ttm_get_gtt_mem_size(struct amdgpu_device *adev)
1556{
1557 return ttm_get_kernel_zone_memory_size(adev->mman.mem_global_ref.object);
1558}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
new file mode 100644
index 000000000000..9812c805326c
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
@@ -0,0 +1,90 @@
1/*
2 * Copyright 2016 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23
24#ifndef __AMDGPU_TTM_H__
25#define __AMDGPU_TTM_H__
26
27#include "gpu_scheduler.h"
28
29#define AMDGPU_PL_GDS (TTM_PL_PRIV + 0)
30#define AMDGPU_PL_GWS (TTM_PL_PRIV + 1)
31#define AMDGPU_PL_OA (TTM_PL_PRIV + 2)
32
33#define AMDGPU_PL_FLAG_GDS (TTM_PL_FLAG_PRIV << 0)
34#define AMDGPU_PL_FLAG_GWS (TTM_PL_FLAG_PRIV << 1)
35#define AMDGPU_PL_FLAG_OA (TTM_PL_FLAG_PRIV << 2)
36
37#define AMDGPU_TTM_LRU_SIZE 20
38
39struct amdgpu_mman_lru {
40 struct list_head *lru[TTM_NUM_MEM_TYPES];
41 struct list_head *swap_lru;
42};
43
44struct amdgpu_mman {
45 struct ttm_bo_global_ref bo_global_ref;
46 struct drm_global_reference mem_global_ref;
47 struct ttm_bo_device bdev;
48 bool mem_global_referenced;
49 bool initialized;
50
51#if defined(CONFIG_DEBUG_FS)
52 struct dentry *vram;
53 struct dentry *gtt;
54#endif
55
56 /* buffer handling */
57 const struct amdgpu_buffer_funcs *buffer_funcs;
58 struct amdgpu_ring *buffer_funcs_ring;
59 /* Scheduler entity for buffer moves */
60 struct amd_sched_entity entity;
61
62 /* custom LRU management */
63 struct amdgpu_mman_lru log2_size[AMDGPU_TTM_LRU_SIZE];
64 /* guard for log2_size array, don't add anything in between */
65 struct amdgpu_mman_lru guard;
66};
67
68extern const struct ttm_mem_type_manager_func amdgpu_gtt_mgr_func;
69
70int amdgpu_gtt_mgr_alloc(struct ttm_mem_type_manager *man,
71 struct ttm_buffer_object *tbo,
72 const struct ttm_place *place,
73 struct ttm_mem_reg *mem);
74
75int amdgpu_copy_buffer(struct amdgpu_ring *ring,
76 uint64_t src_offset,
77 uint64_t dst_offset,
78 uint32_t byte_count,
79 struct reservation_object *resv,
80 struct fence **fence, bool direct_submit);
81int amdgpu_fill_buffer(struct amdgpu_bo *bo,
82 uint32_t src_data,
83 struct reservation_object *resv,
84 struct fence **fence);
85
86int amdgpu_mmap(struct file *filp, struct vm_area_struct *vma);
87bool amdgpu_ttm_is_bound(struct ttm_tt *ttm);
88int amdgpu_ttm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *bo_mem);
89
90#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
index 5cc95f1a7dab..cb3d252f3c78 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
@@ -247,40 +247,32 @@ int amdgpu_ucode_init_bo(struct amdgpu_device *adev)
247 const struct common_firmware_header *header = NULL; 247 const struct common_firmware_header *header = NULL;
248 248
249 err = amdgpu_bo_create(adev, adev->firmware.fw_size, PAGE_SIZE, true, 249 err = amdgpu_bo_create(adev, adev->firmware.fw_size, PAGE_SIZE, true,
250 AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, bo); 250 AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, bo);
251 if (err) { 251 if (err) {
252 dev_err(adev->dev, "(%d) Firmware buffer allocate failed\n", err); 252 dev_err(adev->dev, "(%d) Firmware buffer allocate failed\n", err);
253 err = -ENOMEM;
254 goto failed; 253 goto failed;
255 } 254 }
256 255
257 err = amdgpu_bo_reserve(*bo, false); 256 err = amdgpu_bo_reserve(*bo, false);
258 if (err) { 257 if (err) {
259 amdgpu_bo_unref(bo);
260 dev_err(adev->dev, "(%d) Firmware buffer reserve failed\n", err); 258 dev_err(adev->dev, "(%d) Firmware buffer reserve failed\n", err);
261 goto failed; 259 goto failed_reserve;
262 } 260 }
263 261
264 err = amdgpu_bo_pin(*bo, AMDGPU_GEM_DOMAIN_GTT, &fw_mc_addr); 262 err = amdgpu_bo_pin(*bo, AMDGPU_GEM_DOMAIN_GTT, &fw_mc_addr);
265 if (err) { 263 if (err) {
266 amdgpu_bo_unreserve(*bo);
267 amdgpu_bo_unref(bo);
268 dev_err(adev->dev, "(%d) Firmware buffer pin failed\n", err); 264 dev_err(adev->dev, "(%d) Firmware buffer pin failed\n", err);
269 goto failed; 265 goto failed_pin;
270 } 266 }
271 267
272 err = amdgpu_bo_kmap(*bo, &fw_buf_ptr); 268 err = amdgpu_bo_kmap(*bo, &fw_buf_ptr);
273 if (err) { 269 if (err) {
274 dev_err(adev->dev, "(%d) Firmware buffer kmap failed\n", err); 270 dev_err(adev->dev, "(%d) Firmware buffer kmap failed\n", err);
275 amdgpu_bo_unpin(*bo); 271 goto failed_kmap;
276 amdgpu_bo_unreserve(*bo);
277 amdgpu_bo_unref(bo);
278 goto failed;
279 } 272 }
280 273
281 amdgpu_bo_unreserve(*bo); 274 amdgpu_bo_unreserve(*bo);
282 275
283 fw_offset = 0;
284 for (i = 0; i < AMDGPU_UCODE_ID_MAXIMUM; i++) { 276 for (i = 0; i < AMDGPU_UCODE_ID_MAXIMUM; i++) {
285 ucode = &adev->firmware.ucode[i]; 277 ucode = &adev->firmware.ucode[i];
286 if (ucode->fw) { 278 if (ucode->fw) {
@@ -290,10 +282,16 @@ int amdgpu_ucode_init_bo(struct amdgpu_device *adev)
290 fw_offset += ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); 282 fw_offset += ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE);
291 } 283 }
292 } 284 }
285 return 0;
293 286
287failed_kmap:
288 amdgpu_bo_unpin(*bo);
289failed_pin:
290 amdgpu_bo_unreserve(*bo);
291failed_reserve:
292 amdgpu_bo_unref(bo);
294failed: 293failed:
295 if (err) 294 adev->firmware.smu_load = false;
296 adev->firmware.smu_load = false;
297 295
298 return err; 296 return err;
299} 297}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
index 4aa993d19018..e3281cacc586 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
@@ -201,39 +201,14 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
201 bo_size = AMDGPU_GPU_PAGE_ALIGN(le32_to_cpu(hdr->ucode_size_bytes) + 8) 201 bo_size = AMDGPU_GPU_PAGE_ALIGN(le32_to_cpu(hdr->ucode_size_bytes) + 8)
202 + AMDGPU_UVD_STACK_SIZE + AMDGPU_UVD_HEAP_SIZE 202 + AMDGPU_UVD_STACK_SIZE + AMDGPU_UVD_HEAP_SIZE
203 + AMDGPU_UVD_SESSION_SIZE * adev->uvd.max_handles; 203 + AMDGPU_UVD_SESSION_SIZE * adev->uvd.max_handles;
204 r = amdgpu_bo_create(adev, bo_size, PAGE_SIZE, true, 204 r = amdgpu_bo_create_kernel(adev, bo_size, PAGE_SIZE,
205 AMDGPU_GEM_DOMAIN_VRAM, 205 AMDGPU_GEM_DOMAIN_VRAM, &adev->uvd.vcpu_bo,
206 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 206 &adev->uvd.gpu_addr, &adev->uvd.cpu_addr);
207 NULL, NULL, &adev->uvd.vcpu_bo);
208 if (r) { 207 if (r) {
209 dev_err(adev->dev, "(%d) failed to allocate UVD bo\n", r); 208 dev_err(adev->dev, "(%d) failed to allocate UVD bo\n", r);
210 return r; 209 return r;
211 } 210 }
212 211
213 r = amdgpu_bo_reserve(adev->uvd.vcpu_bo, false);
214 if (r) {
215 amdgpu_bo_unref(&adev->uvd.vcpu_bo);
216 dev_err(adev->dev, "(%d) failed to reserve UVD bo\n", r);
217 return r;
218 }
219
220 r = amdgpu_bo_pin(adev->uvd.vcpu_bo, AMDGPU_GEM_DOMAIN_VRAM,
221 &adev->uvd.gpu_addr);
222 if (r) {
223 amdgpu_bo_unreserve(adev->uvd.vcpu_bo);
224 amdgpu_bo_unref(&adev->uvd.vcpu_bo);
225 dev_err(adev->dev, "(%d) UVD bo pin failed\n", r);
226 return r;
227 }
228
229 r = amdgpu_bo_kmap(adev->uvd.vcpu_bo, &adev->uvd.cpu_addr);
230 if (r) {
231 dev_err(adev->dev, "(%d) UVD map failed\n", r);
232 return r;
233 }
234
235 amdgpu_bo_unreserve(adev->uvd.vcpu_bo);
236
237 ring = &adev->uvd.ring; 212 ring = &adev->uvd.ring;
238 rq = &ring->sched.sched_rq[AMD_SCHED_PRIORITY_NORMAL]; 213 rq = &ring->sched.sched_rq[AMD_SCHED_PRIORITY_NORMAL];
239 r = amd_sched_entity_init(&ring->sched, &adev->uvd.entity, 214 r = amd_sched_entity_init(&ring->sched, &adev->uvd.entity,
@@ -274,22 +249,13 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
274 249
275int amdgpu_uvd_sw_fini(struct amdgpu_device *adev) 250int amdgpu_uvd_sw_fini(struct amdgpu_device *adev)
276{ 251{
277 int r;
278
279 kfree(adev->uvd.saved_bo); 252 kfree(adev->uvd.saved_bo);
280 253
281 amd_sched_entity_fini(&adev->uvd.ring.sched, &adev->uvd.entity); 254 amd_sched_entity_fini(&adev->uvd.ring.sched, &adev->uvd.entity);
282 255
283 if (adev->uvd.vcpu_bo) { 256 amdgpu_bo_free_kernel(&adev->uvd.vcpu_bo,
284 r = amdgpu_bo_reserve(adev->uvd.vcpu_bo, false); 257 &adev->uvd.gpu_addr,
285 if (!r) { 258 (void **)&adev->uvd.cpu_addr);
286 amdgpu_bo_kunmap(adev->uvd.vcpu_bo);
287 amdgpu_bo_unpin(adev->uvd.vcpu_bo);
288 amdgpu_bo_unreserve(adev->uvd.vcpu_bo);
289 }
290
291 amdgpu_bo_unref(&adev->uvd.vcpu_bo);
292 }
293 259
294 amdgpu_ring_fini(&adev->uvd.ring); 260 amdgpu_ring_fini(&adev->uvd.ring);
295 261
@@ -323,7 +289,7 @@ int amdgpu_uvd_suspend(struct amdgpu_device *adev)
323 if (!adev->uvd.saved_bo) 289 if (!adev->uvd.saved_bo)
324 return -ENOMEM; 290 return -ENOMEM;
325 291
326 memcpy(adev->uvd.saved_bo, ptr, size); 292 memcpy_fromio(adev->uvd.saved_bo, ptr, size);
327 293
328 return 0; 294 return 0;
329} 295}
@@ -340,7 +306,7 @@ int amdgpu_uvd_resume(struct amdgpu_device *adev)
340 ptr = adev->uvd.cpu_addr; 306 ptr = adev->uvd.cpu_addr;
341 307
342 if (adev->uvd.saved_bo != NULL) { 308 if (adev->uvd.saved_bo != NULL) {
343 memcpy(ptr, adev->uvd.saved_bo, size); 309 memcpy_toio(ptr, adev->uvd.saved_bo, size);
344 kfree(adev->uvd.saved_bo); 310 kfree(adev->uvd.saved_bo);
345 adev->uvd.saved_bo = NULL; 311 adev->uvd.saved_bo = NULL;
346 } else { 312 } else {
@@ -349,11 +315,11 @@ int amdgpu_uvd_resume(struct amdgpu_device *adev)
349 315
350 hdr = (const struct common_firmware_header *)adev->uvd.fw->data; 316 hdr = (const struct common_firmware_header *)adev->uvd.fw->data;
351 offset = le32_to_cpu(hdr->ucode_array_offset_bytes); 317 offset = le32_to_cpu(hdr->ucode_array_offset_bytes);
352 memcpy(adev->uvd.cpu_addr, (adev->uvd.fw->data) + offset, 318 memcpy_toio(adev->uvd.cpu_addr, adev->uvd.fw->data + offset,
353 (adev->uvd.fw->size) - offset); 319 le32_to_cpu(hdr->ucode_size_bytes));
354 size -= le32_to_cpu(hdr->ucode_size_bytes); 320 size -= le32_to_cpu(hdr->ucode_size_bytes);
355 ptr += le32_to_cpu(hdr->ucode_size_bytes); 321 ptr += le32_to_cpu(hdr->ucode_size_bytes);
356 memset(ptr, 0, size); 322 memset_io(ptr, 0, size);
357 } 323 }
358 324
359 return 0; 325 return 0;
@@ -385,12 +351,12 @@ void amdgpu_uvd_free_handles(struct amdgpu_device *adev, struct drm_file *filp)
385 } 351 }
386} 352}
387 353
388static void amdgpu_uvd_force_into_uvd_segment(struct amdgpu_bo *rbo) 354static void amdgpu_uvd_force_into_uvd_segment(struct amdgpu_bo *abo)
389{ 355{
390 int i; 356 int i;
391 for (i = 0; i < rbo->placement.num_placement; ++i) { 357 for (i = 0; i < abo->placement.num_placement; ++i) {
392 rbo->placements[i].fpfn = 0 >> PAGE_SHIFT; 358 abo->placements[i].fpfn = 0 >> PAGE_SHIFT;
393 rbo->placements[i].lpfn = (256 * 1024 * 1024) >> PAGE_SHIFT; 359 abo->placements[i].lpfn = (256 * 1024 * 1024) >> PAGE_SHIFT;
394 } 360 }
395} 361}
396 362
@@ -843,6 +809,7 @@ static int amdgpu_uvd_cs_reg(struct amdgpu_uvd_cs_ctx *ctx,
843 return r; 809 return r;
844 break; 810 break;
845 case mmUVD_ENGINE_CNTL: 811 case mmUVD_ENGINE_CNTL:
812 case mmUVD_NO_OP:
846 break; 813 break;
847 default: 814 default:
848 DRM_ERROR("Invalid reg 0x%X!\n", reg); 815 DRM_ERROR("Invalid reg 0x%X!\n", reg);
@@ -915,6 +882,10 @@ int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx)
915 return -EINVAL; 882 return -EINVAL;
916 } 883 }
917 884
885 r = amdgpu_cs_sysvm_access_required(parser);
886 if (r)
887 return r;
888
918 ctx.parser = parser; 889 ctx.parser = parser;
919 ctx.buf_sizes = buf_sizes; 890 ctx.buf_sizes = buf_sizes;
920 ctx.ib_idx = ib_idx; 891 ctx.ib_idx = ib_idx;
@@ -981,8 +952,10 @@ static int amdgpu_uvd_send_msg(struct amdgpu_ring *ring, struct amdgpu_bo *bo,
981 ib->ptr[3] = addr >> 32; 952 ib->ptr[3] = addr >> 32;
982 ib->ptr[4] = PACKET0(mmUVD_GPCOM_VCPU_CMD, 0); 953 ib->ptr[4] = PACKET0(mmUVD_GPCOM_VCPU_CMD, 0);
983 ib->ptr[5] = 0; 954 ib->ptr[5] = 0;
984 for (i = 6; i < 16; ++i) 955 for (i = 6; i < 16; i += 2) {
985 ib->ptr[i] = PACKET2(0); 956 ib->ptr[i] = PACKET0(mmUVD_NO_OP, 0);
957 ib->ptr[i+1] = 0;
958 }
986 ib->length_dw = 16; 959 ib->length_dw = 16;
987 960
988 if (direct) { 961 if (direct) {
@@ -1114,15 +1087,9 @@ static void amdgpu_uvd_idle_work_handler(struct work_struct *work)
1114{ 1087{
1115 struct amdgpu_device *adev = 1088 struct amdgpu_device *adev =
1116 container_of(work, struct amdgpu_device, uvd.idle_work.work); 1089 container_of(work, struct amdgpu_device, uvd.idle_work.work);
1117 unsigned i, fences, handles = 0; 1090 unsigned fences = amdgpu_fence_count_emitted(&adev->uvd.ring);
1118
1119 fences = amdgpu_fence_count_emitted(&adev->uvd.ring);
1120
1121 for (i = 0; i < adev->uvd.max_handles; ++i)
1122 if (atomic_read(&adev->uvd.handles[i]))
1123 ++handles;
1124 1091
1125 if (fences == 0 && handles == 0) { 1092 if (fences == 0) {
1126 if (adev->pm.dpm_enabled) { 1093 if (adev->pm.dpm_enabled) {
1127 amdgpu_dpm_enable_uvd(adev, false); 1094 amdgpu_dpm_enable_uvd(adev, false);
1128 } else { 1095 } else {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
index 05865ce35351..7fe8fd884f06 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
@@ -210,6 +210,8 @@ int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size)
210 */ 210 */
211int amdgpu_vce_sw_fini(struct amdgpu_device *adev) 211int amdgpu_vce_sw_fini(struct amdgpu_device *adev)
212{ 212{
213 unsigned i;
214
213 if (adev->vce.vcpu_bo == NULL) 215 if (adev->vce.vcpu_bo == NULL)
214 return 0; 216 return 0;
215 217
@@ -217,8 +219,8 @@ int amdgpu_vce_sw_fini(struct amdgpu_device *adev)
217 219
218 amdgpu_bo_unref(&adev->vce.vcpu_bo); 220 amdgpu_bo_unref(&adev->vce.vcpu_bo);
219 221
220 amdgpu_ring_fini(&adev->vce.ring[0]); 222 for (i = 0; i < adev->vce.num_rings; i++)
221 amdgpu_ring_fini(&adev->vce.ring[1]); 223 amdgpu_ring_fini(&adev->vce.ring[i]);
222 224
223 release_firmware(adev->vce.fw); 225 release_firmware(adev->vce.fw);
224 mutex_destroy(&adev->vce.idle_mutex); 226 mutex_destroy(&adev->vce.idle_mutex);
@@ -282,8 +284,8 @@ int amdgpu_vce_resume(struct amdgpu_device *adev)
282 284
283 hdr = (const struct common_firmware_header *)adev->vce.fw->data; 285 hdr = (const struct common_firmware_header *)adev->vce.fw->data;
284 offset = le32_to_cpu(hdr->ucode_array_offset_bytes); 286 offset = le32_to_cpu(hdr->ucode_array_offset_bytes);
285 memcpy(cpu_addr, (adev->vce.fw->data) + offset, 287 memcpy_toio(cpu_addr, adev->vce.fw->data + offset,
286 (adev->vce.fw->size) - offset); 288 adev->vce.fw->size - offset);
287 289
288 amdgpu_bo_kunmap(adev->vce.vcpu_bo); 290 amdgpu_bo_kunmap(adev->vce.vcpu_bo);
289 291
@@ -303,9 +305,12 @@ static void amdgpu_vce_idle_work_handler(struct work_struct *work)
303{ 305{
304 struct amdgpu_device *adev = 306 struct amdgpu_device *adev =
305 container_of(work, struct amdgpu_device, vce.idle_work.work); 307 container_of(work, struct amdgpu_device, vce.idle_work.work);
308 unsigned i, count = 0;
309
310 for (i = 0; i < adev->vce.num_rings; i++)
311 count += amdgpu_fence_count_emitted(&adev->vce.ring[i]);
306 312
307 if ((amdgpu_fence_count_emitted(&adev->vce.ring[0]) == 0) && 313 if (count == 0) {
308 (amdgpu_fence_count_emitted(&adev->vce.ring[1]) == 0)) {
309 if (adev->pm.dpm_enabled) { 314 if (adev->pm.dpm_enabled) {
310 amdgpu_dpm_enable_vce(adev, false); 315 amdgpu_dpm_enable_vce(adev, false);
311 } else { 316 } else {
@@ -634,7 +639,11 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx)
634 uint32_t allocated = 0; 639 uint32_t allocated = 0;
635 uint32_t tmp, handle = 0; 640 uint32_t tmp, handle = 0;
636 uint32_t *size = &tmp; 641 uint32_t *size = &tmp;
637 int i, r = 0, idx = 0; 642 int i, r, idx = 0;
643
644 r = amdgpu_cs_sysvm_access_required(p);
645 if (r)
646 return r;
638 647
639 while (idx < ib->length_dw) { 648 while (idx < ib->length_dw) {
640 uint32_t len = amdgpu_get_ib_value(p, ib_idx, idx); 649 uint32_t len = amdgpu_get_ib_value(p, ib_idx, idx);
@@ -687,6 +696,21 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx)
687 case 0x04000008: /* rdo */ 696 case 0x04000008: /* rdo */
688 case 0x04000009: /* vui */ 697 case 0x04000009: /* vui */
689 case 0x05000002: /* auxiliary buffer */ 698 case 0x05000002: /* auxiliary buffer */
699 case 0x05000009: /* clock table */
700 break;
701
702 case 0x0500000c: /* hw config */
703 switch (p->adev->asic_type) {
704#ifdef CONFIG_DRM_AMDGPU_CIK
705 case CHIP_KAVERI:
706 case CHIP_MULLINS:
707#endif
708 case CHIP_CARRIZO:
709 break;
710 default:
711 r = -EINVAL;
712 goto out;
713 }
690 break; 714 break;
691 715
692 case 0x03000001: /* encode */ 716 case 0x03000001: /* encode */
@@ -799,6 +823,18 @@ void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq,
799 amdgpu_ring_write(ring, VCE_CMD_END); 823 amdgpu_ring_write(ring, VCE_CMD_END);
800} 824}
801 825
826unsigned amdgpu_vce_ring_get_emit_ib_size(struct amdgpu_ring *ring)
827{
828 return
829 4; /* amdgpu_vce_ring_emit_ib */
830}
831
832unsigned amdgpu_vce_ring_get_dma_frame_size(struct amdgpu_ring *ring)
833{
834 return
835 6; /* amdgpu_vce_ring_emit_fence x1 no user fence */
836}
837
802/** 838/**
803 * amdgpu_vce_ring_test_ring - test if VCE ring is working 839 * amdgpu_vce_ring_test_ring - test if VCE ring is working
804 * 840 *
@@ -850,8 +886,8 @@ int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout)
850 struct fence *fence = NULL; 886 struct fence *fence = NULL;
851 long r; 887 long r;
852 888
853 /* skip vce ring1 ib test for now, since it's not reliable */ 889 /* skip vce ring1/2 ib test for now, since it's not reliable */
854 if (ring == &ring->adev->vce.ring[1]) 890 if (ring != &ring->adev->vce.ring[0])
855 return 0; 891 return 0;
856 892
857 r = amdgpu_vce_get_create_msg(ring, 1, NULL); 893 r = amdgpu_vce_get_create_msg(ring, 1, NULL);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
index 63f83d0d985c..12729d2852df 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
@@ -42,5 +42,7 @@ int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring);
42int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout); 42int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout);
43void amdgpu_vce_ring_begin_use(struct amdgpu_ring *ring); 43void amdgpu_vce_ring_begin_use(struct amdgpu_ring *ring);
44void amdgpu_vce_ring_end_use(struct amdgpu_ring *ring); 44void amdgpu_vce_ring_end_use(struct amdgpu_ring *ring);
45unsigned amdgpu_vce_ring_get_emit_ib_size(struct amdgpu_ring *ring);
46unsigned amdgpu_vce_ring_get_dma_frame_size(struct amdgpu_ring *ring);
45 47
46#endif 48#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
new file mode 100644
index 000000000000..2c37a374917f
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
@@ -0,0 +1,57 @@
1/*
2 * Copyright 2016 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 * Author: Monk.liu@amd.com
23 */
24#ifndef AMDGPU_VIRT_H
25#define AMDGPU_VIRT_H
26
27#define AMDGPU_SRIOV_CAPS_SRIOV_VBIOS (1 << 0) /* vBIOS is sr-iov ready */
28#define AMDGPU_SRIOV_CAPS_ENABLE_IOV (1 << 1) /* sr-iov is enabled on this GPU */
29#define AMDGPU_SRIOV_CAPS_IS_VF (1 << 2) /* this GPU is a virtual function */
30#define AMDGPU_PASSTHROUGH_MODE (1 << 3) /* thw whole GPU is pass through for VM */
31/* GPU virtualization */
32struct amdgpu_virtualization {
33 uint32_t virtual_caps;
34};
35
36#define amdgpu_sriov_enabled(adev) \
37((adev)->virtualization.virtual_caps & AMDGPU_SRIOV_CAPS_ENABLE_IOV)
38
39#define amdgpu_sriov_vf(adev) \
40((adev)->virtualization.virtual_caps & AMDGPU_SRIOV_CAPS_IS_VF)
41
42#define amdgpu_sriov_bios(adev) \
43((adev)->virtualization.virtual_caps & AMDGPU_SRIOV_CAPS_SRIOV_VBIOS)
44
45#define amdgpu_passthrough(adev) \
46((adev)->virtualization.virtual_caps & AMDGPU_PASSTHROUGH_MODE)
47
48static inline bool is_virtual_machine(void)
49{
50#ifdef CONFIG_X86
51 return boot_cpu_has(X86_FEATURE_HYPERVISOR);
52#else
53 return false;
54#endif
55}
56
57#endif \ No newline at end of file
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 80120fa4092c..06f24322e7c3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -51,19 +51,22 @@
51 * SI supports 16. 51 * SI supports 16.
52 */ 52 */
53 53
54/* Special value that no flush is necessary */
55#define AMDGPU_VM_NO_FLUSH (~0ll)
56
57/* Local structure. Encapsulate some VM table update parameters to reduce 54/* Local structure. Encapsulate some VM table update parameters to reduce
58 * the number of function parameters 55 * the number of function parameters
59 */ 56 */
60struct amdgpu_vm_update_params { 57struct amdgpu_pte_update_params {
58 /* amdgpu device we do this update for */
59 struct amdgpu_device *adev;
61 /* address where to copy page table entries from */ 60 /* address where to copy page table entries from */
62 uint64_t src; 61 uint64_t src;
63 /* DMA addresses to use for mapping */
64 dma_addr_t *pages_addr;
65 /* indirect buffer to fill with commands */ 62 /* indirect buffer to fill with commands */
66 struct amdgpu_ib *ib; 63 struct amdgpu_ib *ib;
64 /* Function which actually does the update */
65 void (*func)(struct amdgpu_pte_update_params *params, uint64_t pe,
66 uint64_t addr, unsigned count, uint32_t incr,
67 uint32_t flags);
68 /* indicate update pt or its shadow */
69 bool shadow;
67}; 70};
68 71
69/** 72/**
@@ -467,10 +470,9 @@ struct amdgpu_bo_va *amdgpu_vm_bo_find(struct amdgpu_vm *vm,
467} 470}
468 471
469/** 472/**
470 * amdgpu_vm_update_pages - helper to call the right asic function 473 * amdgpu_vm_do_set_ptes - helper to call the right asic function
471 * 474 *
472 * @adev: amdgpu_device pointer 475 * @params: see amdgpu_pte_update_params definition
473 * @vm_update_params: see amdgpu_vm_update_params definition
474 * @pe: addr of the page entry 476 * @pe: addr of the page entry
475 * @addr: dst addr to write into pe 477 * @addr: dst addr to write into pe
476 * @count: number of page entries to update 478 * @count: number of page entries to update
@@ -480,32 +482,46 @@ struct amdgpu_bo_va *amdgpu_vm_bo_find(struct amdgpu_vm *vm,
480 * Traces the parameters and calls the right asic functions 482 * Traces the parameters and calls the right asic functions
481 * to setup the page table using the DMA. 483 * to setup the page table using the DMA.
482 */ 484 */
483static void amdgpu_vm_update_pages(struct amdgpu_device *adev, 485static void amdgpu_vm_do_set_ptes(struct amdgpu_pte_update_params *params,
484 struct amdgpu_vm_update_params 486 uint64_t pe, uint64_t addr,
485 *vm_update_params, 487 unsigned count, uint32_t incr,
488 uint32_t flags)
489{
490 trace_amdgpu_vm_set_ptes(pe, addr, count, incr, flags);
491
492 if (count < 3) {
493 amdgpu_vm_write_pte(params->adev, params->ib, pe,
494 addr | flags, count, incr);
495
496 } else {
497 amdgpu_vm_set_pte_pde(params->adev, params->ib, pe, addr,
498 count, incr, flags);
499 }
500}
501
502/**
503 * amdgpu_vm_do_copy_ptes - copy the PTEs from the GART
504 *
505 * @params: see amdgpu_pte_update_params definition
506 * @pe: addr of the page entry
507 * @addr: dst addr to write into pe
508 * @count: number of page entries to update
509 * @incr: increase next addr by incr bytes
510 * @flags: hw access flags
511 *
512 * Traces the parameters and calls the DMA function to copy the PTEs.
513 */
514static void amdgpu_vm_do_copy_ptes(struct amdgpu_pte_update_params *params,
486 uint64_t pe, uint64_t addr, 515 uint64_t pe, uint64_t addr,
487 unsigned count, uint32_t incr, 516 unsigned count, uint32_t incr,
488 uint32_t flags) 517 uint32_t flags)
489{ 518{
490 trace_amdgpu_vm_set_page(pe, addr, count, incr, flags); 519 uint64_t src = (params->src + (addr >> 12) * 8);
491
492 if (vm_update_params->src) {
493 amdgpu_vm_copy_pte(adev, vm_update_params->ib,
494 pe, (vm_update_params->src + (addr >> 12) * 8), count);
495 520
496 } else if (vm_update_params->pages_addr) {
497 amdgpu_vm_write_pte(adev, vm_update_params->ib,
498 vm_update_params->pages_addr,
499 pe, addr, count, incr, flags);
500 521
501 } else if (count < 3) { 522 trace_amdgpu_vm_copy_ptes(pe, src, count);
502 amdgpu_vm_write_pte(adev, vm_update_params->ib, NULL, pe, addr,
503 count, incr, flags);
504 523
505 } else { 524 amdgpu_vm_copy_pte(params->adev, params->ib, pe, src, count);
506 amdgpu_vm_set_pte_pde(adev, vm_update_params->ib, pe, addr,
507 count, incr, flags);
508 }
509} 525}
510 526
511/** 527/**
@@ -523,12 +539,11 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,
523 struct amdgpu_ring *ring; 539 struct amdgpu_ring *ring;
524 struct fence *fence = NULL; 540 struct fence *fence = NULL;
525 struct amdgpu_job *job; 541 struct amdgpu_job *job;
526 struct amdgpu_vm_update_params vm_update_params; 542 struct amdgpu_pte_update_params params;
527 unsigned entries; 543 unsigned entries;
528 uint64_t addr; 544 uint64_t addr;
529 int r; 545 int r;
530 546
531 memset(&vm_update_params, 0, sizeof(vm_update_params));
532 ring = container_of(vm->entity.sched, struct amdgpu_ring, sched); 547 ring = container_of(vm->entity.sched, struct amdgpu_ring, sched);
533 548
534 r = reservation_object_reserve_shared(bo->tbo.resv); 549 r = reservation_object_reserve_shared(bo->tbo.resv);
@@ -539,6 +554,10 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,
539 if (r) 554 if (r)
540 goto error; 555 goto error;
541 556
557 r = amdgpu_ttm_bind(&bo->tbo, &bo->tbo.mem);
558 if (r)
559 goto error;
560
542 addr = amdgpu_bo_gpu_offset(bo); 561 addr = amdgpu_bo_gpu_offset(bo);
543 entries = amdgpu_bo_size(bo) / 8; 562 entries = amdgpu_bo_size(bo) / 8;
544 563
@@ -546,9 +565,10 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,
546 if (r) 565 if (r)
547 goto error; 566 goto error;
548 567
549 vm_update_params.ib = &job->ibs[0]; 568 memset(&params, 0, sizeof(params));
550 amdgpu_vm_update_pages(adev, &vm_update_params, addr, 0, entries, 569 params.adev = adev;
551 0, 0); 570 params.ib = &job->ibs[0];
571 amdgpu_vm_do_set_ptes(&params, addr, 0, entries, 0, 0);
552 amdgpu_ring_pad_ib(ring, &job->ibs[0]); 572 amdgpu_ring_pad_ib(ring, &job->ibs[0]);
553 573
554 WARN_ON(job->ibs[0].length_dw > 64); 574 WARN_ON(job->ibs[0].length_dw > 64);
@@ -577,55 +597,46 @@ error:
577 * Look up the physical address of the page that the pte resolves 597 * Look up the physical address of the page that the pte resolves
578 * to and return the pointer for the page table entry. 598 * to and return the pointer for the page table entry.
579 */ 599 */
580uint64_t amdgpu_vm_map_gart(const dma_addr_t *pages_addr, uint64_t addr) 600static uint64_t amdgpu_vm_map_gart(const dma_addr_t *pages_addr, uint64_t addr)
581{ 601{
582 uint64_t result; 602 uint64_t result;
583 603
584 if (pages_addr) { 604 /* page table offset */
585 /* page table offset */ 605 result = pages_addr[addr >> PAGE_SHIFT];
586 result = pages_addr[addr >> PAGE_SHIFT];
587
588 /* in case cpu page size != gpu page size*/
589 result |= addr & (~PAGE_MASK);
590 606
591 } else { 607 /* in case cpu page size != gpu page size*/
592 /* No mapping required */ 608 result |= addr & (~PAGE_MASK);
593 result = addr;
594 }
595 609
596 result &= 0xFFFFFFFFFFFFF000ULL; 610 result &= 0xFFFFFFFFFFFFF000ULL;
597 611
598 return result; 612 return result;
599} 613}
600 614
601/** 615static int amdgpu_vm_update_pd_or_shadow(struct amdgpu_device *adev,
602 * amdgpu_vm_update_pdes - make sure that page directory is valid 616 struct amdgpu_vm *vm,
603 * 617 bool shadow)
604 * @adev: amdgpu_device pointer
605 * @vm: requested vm
606 * @start: start of GPU address range
607 * @end: end of GPU address range
608 *
609 * Allocates new page tables if necessary
610 * and updates the page directory.
611 * Returns 0 for success, error for failure.
612 */
613int amdgpu_vm_update_page_directory(struct amdgpu_device *adev,
614 struct amdgpu_vm *vm)
615{ 618{
616 struct amdgpu_ring *ring; 619 struct amdgpu_ring *ring;
617 struct amdgpu_bo *pd = vm->page_directory; 620 struct amdgpu_bo *pd = shadow ? vm->page_directory->shadow :
618 uint64_t pd_addr = amdgpu_bo_gpu_offset(pd); 621 vm->page_directory;
622 uint64_t pd_addr;
619 uint32_t incr = AMDGPU_VM_PTE_COUNT * 8; 623 uint32_t incr = AMDGPU_VM_PTE_COUNT * 8;
620 uint64_t last_pde = ~0, last_pt = ~0; 624 uint64_t last_pde = ~0, last_pt = ~0;
621 unsigned count = 0, pt_idx, ndw; 625 unsigned count = 0, pt_idx, ndw;
622 struct amdgpu_job *job; 626 struct amdgpu_job *job;
623 struct amdgpu_vm_update_params vm_update_params; 627 struct amdgpu_pte_update_params params;
624 struct fence *fence = NULL; 628 struct fence *fence = NULL;
625 629
626 int r; 630 int r;
627 631
628 memset(&vm_update_params, 0, sizeof(vm_update_params)); 632 if (!pd)
633 return 0;
634
635 r = amdgpu_ttm_bind(&pd->tbo, &pd->tbo.mem);
636 if (r)
637 return r;
638
639 pd_addr = amdgpu_bo_gpu_offset(pd);
629 ring = container_of(vm->entity.sched, struct amdgpu_ring, sched); 640 ring = container_of(vm->entity.sched, struct amdgpu_ring, sched);
630 641
631 /* padding, etc. */ 642 /* padding, etc. */
@@ -638,7 +649,9 @@ int amdgpu_vm_update_page_directory(struct amdgpu_device *adev,
638 if (r) 649 if (r)
639 return r; 650 return r;
640 651
641 vm_update_params.ib = &job->ibs[0]; 652 memset(&params, 0, sizeof(params));
653 params.adev = adev;
654 params.ib = &job->ibs[0];
642 655
643 /* walk over the address space and update the page directory */ 656 /* walk over the address space and update the page directory */
644 for (pt_idx = 0; pt_idx <= vm->max_pde_used; ++pt_idx) { 657 for (pt_idx = 0; pt_idx <= vm->max_pde_used; ++pt_idx) {
@@ -648,20 +661,34 @@ int amdgpu_vm_update_page_directory(struct amdgpu_device *adev,
648 if (bo == NULL) 661 if (bo == NULL)
649 continue; 662 continue;
650 663
664 if (bo->shadow) {
665 struct amdgpu_bo *shadow = bo->shadow;
666
667 r = amdgpu_ttm_bind(&shadow->tbo, &shadow->tbo.mem);
668 if (r)
669 return r;
670 }
671
651 pt = amdgpu_bo_gpu_offset(bo); 672 pt = amdgpu_bo_gpu_offset(bo);
652 if (vm->page_tables[pt_idx].addr == pt) 673 if (!shadow) {
653 continue; 674 if (vm->page_tables[pt_idx].addr == pt)
654 vm->page_tables[pt_idx].addr = pt; 675 continue;
676 vm->page_tables[pt_idx].addr = pt;
677 } else {
678 if (vm->page_tables[pt_idx].shadow_addr == pt)
679 continue;
680 vm->page_tables[pt_idx].shadow_addr = pt;
681 }
655 682
656 pde = pd_addr + pt_idx * 8; 683 pde = pd_addr + pt_idx * 8;
657 if (((last_pde + 8 * count) != pde) || 684 if (((last_pde + 8 * count) != pde) ||
658 ((last_pt + incr * count) != pt)) { 685 ((last_pt + incr * count) != pt) ||
686 (count == AMDGPU_VM_MAX_UPDATE_SIZE)) {
659 687
660 if (count) { 688 if (count) {
661 amdgpu_vm_update_pages(adev, &vm_update_params, 689 amdgpu_vm_do_set_ptes(&params, last_pde,
662 last_pde, last_pt, 690 last_pt, count, incr,
663 count, incr, 691 AMDGPU_PTE_VALID);
664 AMDGPU_PTE_VALID);
665 } 692 }
666 693
667 count = 1; 694 count = 1;
@@ -673,15 +700,14 @@ int amdgpu_vm_update_page_directory(struct amdgpu_device *adev,
673 } 700 }
674 701
675 if (count) 702 if (count)
676 amdgpu_vm_update_pages(adev, &vm_update_params, 703 amdgpu_vm_do_set_ptes(&params, last_pde, last_pt,
677 last_pde, last_pt, 704 count, incr, AMDGPU_PTE_VALID);
678 count, incr, AMDGPU_PTE_VALID);
679 705
680 if (vm_update_params.ib->length_dw != 0) { 706 if (params.ib->length_dw != 0) {
681 amdgpu_ring_pad_ib(ring, vm_update_params.ib); 707 amdgpu_ring_pad_ib(ring, params.ib);
682 amdgpu_sync_resv(adev, &job->sync, pd->tbo.resv, 708 amdgpu_sync_resv(adev, &job->sync, pd->tbo.resv,
683 AMDGPU_FENCE_OWNER_VM); 709 AMDGPU_FENCE_OWNER_VM);
684 WARN_ON(vm_update_params.ib->length_dw > ndw); 710 WARN_ON(params.ib->length_dw > ndw);
685 r = amdgpu_job_submit(job, ring, &vm->entity, 711 r = amdgpu_job_submit(job, ring, &vm->entity,
686 AMDGPU_FENCE_OWNER_VM, &fence); 712 AMDGPU_FENCE_OWNER_VM, &fence);
687 if (r) 713 if (r)
@@ -703,92 +729,33 @@ error_free:
703 return r; 729 return r;
704} 730}
705 731
706/** 732/*
707 * amdgpu_vm_frag_ptes - add fragment information to PTEs 733 * amdgpu_vm_update_pdes - make sure that page directory is valid
708 * 734 *
709 * @adev: amdgpu_device pointer 735 * @adev: amdgpu_device pointer
710 * @vm_update_params: see amdgpu_vm_update_params definition 736 * @vm: requested vm
711 * @pe_start: first PTE to handle 737 * @start: start of GPU address range
712 * @pe_end: last PTE to handle 738 * @end: end of GPU address range
713 * @addr: addr those PTEs should point to 739 *
714 * @flags: hw mapping flags 740 * Allocates new page tables if necessary
741 * and updates the page directory.
742 * Returns 0 for success, error for failure.
715 */ 743 */
716static void amdgpu_vm_frag_ptes(struct amdgpu_device *adev, 744int amdgpu_vm_update_page_directory(struct amdgpu_device *adev,
717 struct amdgpu_vm_update_params 745 struct amdgpu_vm *vm)
718 *vm_update_params,
719 uint64_t pe_start, uint64_t pe_end,
720 uint64_t addr, uint32_t flags)
721{ 746{
722 /** 747 int r;
723 * The MC L1 TLB supports variable sized pages, based on a fragment
724 * field in the PTE. When this field is set to a non-zero value, page
725 * granularity is increased from 4KB to (1 << (12 + frag)). The PTE
726 * flags are considered valid for all PTEs within the fragment range
727 * and corresponding mappings are assumed to be physically contiguous.
728 *
729 * The L1 TLB can store a single PTE for the whole fragment,
730 * significantly increasing the space available for translation
731 * caching. This leads to large improvements in throughput when the
732 * TLB is under pressure.
733 *
734 * The L2 TLB distributes small and large fragments into two
735 * asymmetric partitions. The large fragment cache is significantly
736 * larger. Thus, we try to use large fragments wherever possible.
737 * Userspace can support this by aligning virtual base address and
738 * allocation size to the fragment size.
739 */
740
741 /* SI and newer are optimized for 64KB */
742 uint64_t frag_flags = AMDGPU_PTE_FRAG_64KB;
743 uint64_t frag_align = 0x80;
744
745 uint64_t frag_start = ALIGN(pe_start, frag_align);
746 uint64_t frag_end = pe_end & ~(frag_align - 1);
747
748 unsigned count;
749
750 /* Abort early if there isn't anything to do */
751 if (pe_start == pe_end)
752 return;
753
754 /* system pages are non continuously */
755 if (vm_update_params->src || vm_update_params->pages_addr ||
756 !(flags & AMDGPU_PTE_VALID) || (frag_start >= frag_end)) {
757
758 count = (pe_end - pe_start) / 8;
759 amdgpu_vm_update_pages(adev, vm_update_params, pe_start,
760 addr, count, AMDGPU_GPU_PAGE_SIZE,
761 flags);
762 return;
763 }
764
765 /* handle the 4K area at the beginning */
766 if (pe_start != frag_start) {
767 count = (frag_start - pe_start) / 8;
768 amdgpu_vm_update_pages(adev, vm_update_params, pe_start, addr,
769 count, AMDGPU_GPU_PAGE_SIZE, flags);
770 addr += AMDGPU_GPU_PAGE_SIZE * count;
771 }
772
773 /* handle the area in the middle */
774 count = (frag_end - frag_start) / 8;
775 amdgpu_vm_update_pages(adev, vm_update_params, frag_start, addr, count,
776 AMDGPU_GPU_PAGE_SIZE, flags | frag_flags);
777 748
778 /* handle the 4K area at the end */ 749 r = amdgpu_vm_update_pd_or_shadow(adev, vm, true);
779 if (frag_end != pe_end) { 750 if (r)
780 addr += AMDGPU_GPU_PAGE_SIZE * count; 751 return r;
781 count = (pe_end - frag_end) / 8; 752 return amdgpu_vm_update_pd_or_shadow(adev, vm, false);
782 amdgpu_vm_update_pages(adev, vm_update_params, frag_end, addr,
783 count, AMDGPU_GPU_PAGE_SIZE, flags);
784 }
785} 753}
786 754
787/** 755/**
788 * amdgpu_vm_update_ptes - make sure that page tables are valid 756 * amdgpu_vm_update_ptes - make sure that page tables are valid
789 * 757 *
790 * @adev: amdgpu_device pointer 758 * @params: see amdgpu_pte_update_params definition
791 * @vm_update_params: see amdgpu_vm_update_params definition
792 * @vm: requested vm 759 * @vm: requested vm
793 * @start: start of GPU address range 760 * @start: start of GPU address range
794 * @end: end of GPU address range 761 * @end: end of GPU address range
@@ -797,16 +764,14 @@ static void amdgpu_vm_frag_ptes(struct amdgpu_device *adev,
797 * 764 *
798 * Update the page tables in the range @start - @end. 765 * Update the page tables in the range @start - @end.
799 */ 766 */
800static void amdgpu_vm_update_ptes(struct amdgpu_device *adev, 767static void amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params,
801 struct amdgpu_vm_update_params
802 *vm_update_params,
803 struct amdgpu_vm *vm, 768 struct amdgpu_vm *vm,
804 uint64_t start, uint64_t end, 769 uint64_t start, uint64_t end,
805 uint64_t dst, uint32_t flags) 770 uint64_t dst, uint32_t flags)
806{ 771{
807 const uint64_t mask = AMDGPU_VM_PTE_COUNT - 1; 772 const uint64_t mask = AMDGPU_VM_PTE_COUNT - 1;
808 773
809 uint64_t cur_pe_start, cur_pe_end, cur_dst; 774 uint64_t cur_pe_start, cur_nptes, cur_dst;
810 uint64_t addr; /* next GPU address to be updated */ 775 uint64_t addr; /* next GPU address to be updated */
811 uint64_t pt_idx; 776 uint64_t pt_idx;
812 struct amdgpu_bo *pt; 777 struct amdgpu_bo *pt;
@@ -817,7 +782,11 @@ static void amdgpu_vm_update_ptes(struct amdgpu_device *adev,
817 addr = start; 782 addr = start;
818 pt_idx = addr >> amdgpu_vm_block_size; 783 pt_idx = addr >> amdgpu_vm_block_size;
819 pt = vm->page_tables[pt_idx].entry.robj; 784 pt = vm->page_tables[pt_idx].entry.robj;
820 785 if (params->shadow) {
786 if (!pt->shadow)
787 return;
788 pt = vm->page_tables[pt_idx].entry.robj->shadow;
789 }
821 if ((addr & ~mask) == (end & ~mask)) 790 if ((addr & ~mask) == (end & ~mask))
822 nptes = end - addr; 791 nptes = end - addr;
823 else 792 else
@@ -825,7 +794,7 @@ static void amdgpu_vm_update_ptes(struct amdgpu_device *adev,
825 794
826 cur_pe_start = amdgpu_bo_gpu_offset(pt); 795 cur_pe_start = amdgpu_bo_gpu_offset(pt);
827 cur_pe_start += (addr & mask) * 8; 796 cur_pe_start += (addr & mask) * 8;
828 cur_pe_end = cur_pe_start + 8 * nptes; 797 cur_nptes = nptes;
829 cur_dst = dst; 798 cur_dst = dst;
830 799
831 /* for next ptb*/ 800 /* for next ptb*/
@@ -836,6 +805,11 @@ static void amdgpu_vm_update_ptes(struct amdgpu_device *adev,
836 while (addr < end) { 805 while (addr < end) {
837 pt_idx = addr >> amdgpu_vm_block_size; 806 pt_idx = addr >> amdgpu_vm_block_size;
838 pt = vm->page_tables[pt_idx].entry.robj; 807 pt = vm->page_tables[pt_idx].entry.robj;
808 if (params->shadow) {
809 if (!pt->shadow)
810 return;
811 pt = vm->page_tables[pt_idx].entry.robj->shadow;
812 }
839 813
840 if ((addr & ~mask) == (end & ~mask)) 814 if ((addr & ~mask) == (end & ~mask))
841 nptes = end - addr; 815 nptes = end - addr;
@@ -845,19 +819,19 @@ static void amdgpu_vm_update_ptes(struct amdgpu_device *adev,
845 next_pe_start = amdgpu_bo_gpu_offset(pt); 819 next_pe_start = amdgpu_bo_gpu_offset(pt);
846 next_pe_start += (addr & mask) * 8; 820 next_pe_start += (addr & mask) * 8;
847 821
848 if (cur_pe_end == next_pe_start) { 822 if ((cur_pe_start + 8 * cur_nptes) == next_pe_start &&
823 ((cur_nptes + nptes) <= AMDGPU_VM_MAX_UPDATE_SIZE)) {
849 /* The next ptb is consecutive to current ptb. 824 /* The next ptb is consecutive to current ptb.
850 * Don't call amdgpu_vm_frag_ptes now. 825 * Don't call the update function now.
851 * Will update two ptbs together in future. 826 * Will update two ptbs together in future.
852 */ 827 */
853 cur_pe_end += 8 * nptes; 828 cur_nptes += nptes;
854 } else { 829 } else {
855 amdgpu_vm_frag_ptes(adev, vm_update_params, 830 params->func(params, cur_pe_start, cur_dst, cur_nptes,
856 cur_pe_start, cur_pe_end, 831 AMDGPU_GPU_PAGE_SIZE, flags);
857 cur_dst, flags);
858 832
859 cur_pe_start = next_pe_start; 833 cur_pe_start = next_pe_start;
860 cur_pe_end = next_pe_start + 8 * nptes; 834 cur_nptes = nptes;
861 cur_dst = dst; 835 cur_dst = dst;
862 } 836 }
863 837
@@ -866,8 +840,75 @@ static void amdgpu_vm_update_ptes(struct amdgpu_device *adev,
866 dst += nptes * AMDGPU_GPU_PAGE_SIZE; 840 dst += nptes * AMDGPU_GPU_PAGE_SIZE;
867 } 841 }
868 842
869 amdgpu_vm_frag_ptes(adev, vm_update_params, cur_pe_start, 843 params->func(params, cur_pe_start, cur_dst, cur_nptes,
870 cur_pe_end, cur_dst, flags); 844 AMDGPU_GPU_PAGE_SIZE, flags);
845}
846
847/*
848 * amdgpu_vm_frag_ptes - add fragment information to PTEs
849 *
850 * @params: see amdgpu_pte_update_params definition
851 * @vm: requested vm
852 * @start: first PTE to handle
853 * @end: last PTE to handle
854 * @dst: addr those PTEs should point to
855 * @flags: hw mapping flags
856 */
857static void amdgpu_vm_frag_ptes(struct amdgpu_pte_update_params *params,
858 struct amdgpu_vm *vm,
859 uint64_t start, uint64_t end,
860 uint64_t dst, uint32_t flags)
861{
862 /**
863 * The MC L1 TLB supports variable sized pages, based on a fragment
864 * field in the PTE. When this field is set to a non-zero value, page
865 * granularity is increased from 4KB to (1 << (12 + frag)). The PTE
866 * flags are considered valid for all PTEs within the fragment range
867 * and corresponding mappings are assumed to be physically contiguous.
868 *
869 * The L1 TLB can store a single PTE for the whole fragment,
870 * significantly increasing the space available for translation
871 * caching. This leads to large improvements in throughput when the
872 * TLB is under pressure.
873 *
874 * The L2 TLB distributes small and large fragments into two
875 * asymmetric partitions. The large fragment cache is significantly
876 * larger. Thus, we try to use large fragments wherever possible.
877 * Userspace can support this by aligning virtual base address and
878 * allocation size to the fragment size.
879 */
880
881 /* SI and newer are optimized for 64KB */
882 uint64_t frag_flags = AMDGPU_PTE_FRAG(AMDGPU_LOG2_PAGES_PER_FRAG);
883 uint64_t frag_align = 1 << AMDGPU_LOG2_PAGES_PER_FRAG;
884
885 uint64_t frag_start = ALIGN(start, frag_align);
886 uint64_t frag_end = end & ~(frag_align - 1);
887
888 /* system pages are non continuously */
889 if (params->src || !(flags & AMDGPU_PTE_VALID) ||
890 (frag_start >= frag_end)) {
891
892 amdgpu_vm_update_ptes(params, vm, start, end, dst, flags);
893 return;
894 }
895
896 /* handle the 4K area at the beginning */
897 if (start != frag_start) {
898 amdgpu_vm_update_ptes(params, vm, start, frag_start,
899 dst, flags);
900 dst += (frag_start - start) * AMDGPU_GPU_PAGE_SIZE;
901 }
902
903 /* handle the area in the middle */
904 amdgpu_vm_update_ptes(params, vm, frag_start, frag_end, dst,
905 flags | frag_flags);
906
907 /* handle the 4K area at the end */
908 if (frag_end != end) {
909 dst += (frag_end - frag_start) * AMDGPU_GPU_PAGE_SIZE;
910 amdgpu_vm_update_ptes(params, vm, frag_end, end, dst, flags);
911 }
871} 912}
872 913
873/** 914/**
@@ -900,14 +941,19 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
900 void *owner = AMDGPU_FENCE_OWNER_VM; 941 void *owner = AMDGPU_FENCE_OWNER_VM;
901 unsigned nptes, ncmds, ndw; 942 unsigned nptes, ncmds, ndw;
902 struct amdgpu_job *job; 943 struct amdgpu_job *job;
903 struct amdgpu_vm_update_params vm_update_params; 944 struct amdgpu_pte_update_params params;
904 struct fence *f = NULL; 945 struct fence *f = NULL;
905 int r; 946 int r;
906 947
948 memset(&params, 0, sizeof(params));
949 params.adev = adev;
950 params.src = src;
951
907 ring = container_of(vm->entity.sched, struct amdgpu_ring, sched); 952 ring = container_of(vm->entity.sched, struct amdgpu_ring, sched);
908 memset(&vm_update_params, 0, sizeof(vm_update_params)); 953
909 vm_update_params.src = src; 954 memset(&params, 0, sizeof(params));
910 vm_update_params.pages_addr = pages_addr; 955 params.adev = adev;
956 params.src = src;
911 957
912 /* sync to everything on unmapping */ 958 /* sync to everything on unmapping */
913 if (!(flags & AMDGPU_PTE_VALID)) 959 if (!(flags & AMDGPU_PTE_VALID))
@@ -924,30 +970,53 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
924 /* padding, etc. */ 970 /* padding, etc. */
925 ndw = 64; 971 ndw = 64;
926 972
927 if (vm_update_params.src) { 973 if (src) {
928 /* only copy commands needed */ 974 /* only copy commands needed */
929 ndw += ncmds * 7; 975 ndw += ncmds * 7;
930 976
931 } else if (vm_update_params.pages_addr) { 977 params.func = amdgpu_vm_do_copy_ptes;
932 /* header for write data commands */ 978
933 ndw += ncmds * 4; 979 } else if (pages_addr) {
980 /* copy commands needed */
981 ndw += ncmds * 7;
934 982
935 /* body of write data command */ 983 /* and also PTEs */
936 ndw += nptes * 2; 984 ndw += nptes * 2;
937 985
986 params.func = amdgpu_vm_do_copy_ptes;
987
938 } else { 988 } else {
939 /* set page commands needed */ 989 /* set page commands needed */
940 ndw += ncmds * 10; 990 ndw += ncmds * 10;
941 991
942 /* two extra commands for begin/end of fragment */ 992 /* two extra commands for begin/end of fragment */
943 ndw += 2 * 10; 993 ndw += 2 * 10;
994
995 params.func = amdgpu_vm_do_set_ptes;
944 } 996 }
945 997
946 r = amdgpu_job_alloc_with_ib(adev, ndw * 4, &job); 998 r = amdgpu_job_alloc_with_ib(adev, ndw * 4, &job);
947 if (r) 999 if (r)
948 return r; 1000 return r;
949 1001
950 vm_update_params.ib = &job->ibs[0]; 1002 params.ib = &job->ibs[0];
1003
1004 if (!src && pages_addr) {
1005 uint64_t *pte;
1006 unsigned i;
1007
1008 /* Put the PTEs at the end of the IB. */
1009 i = ndw - nptes * 2;
1010 pte= (uint64_t *)&(job->ibs->ptr[i]);
1011 params.src = job->ibs->gpu_addr + i * 4;
1012
1013 for (i = 0; i < nptes; ++i) {
1014 pte[i] = amdgpu_vm_map_gart(pages_addr, addr + i *
1015 AMDGPU_GPU_PAGE_SIZE);
1016 pte[i] |= flags;
1017 }
1018 addr = 0;
1019 }
951 1020
952 r = amdgpu_sync_fence(adev, &job->sync, exclusive); 1021 r = amdgpu_sync_fence(adev, &job->sync, exclusive);
953 if (r) 1022 if (r)
@@ -962,11 +1031,13 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
962 if (r) 1031 if (r)
963 goto error_free; 1032 goto error_free;
964 1033
965 amdgpu_vm_update_ptes(adev, &vm_update_params, vm, start, 1034 params.shadow = true;
966 last + 1, addr, flags); 1035 amdgpu_vm_frag_ptes(&params, vm, start, last + 1, addr, flags);
1036 params.shadow = false;
1037 amdgpu_vm_frag_ptes(&params, vm, start, last + 1, addr, flags);
967 1038
968 amdgpu_ring_pad_ib(ring, vm_update_params.ib); 1039 amdgpu_ring_pad_ib(ring, params.ib);
969 WARN_ON(vm_update_params.ib->length_dw > ndw); 1040 WARN_ON(params.ib->length_dw > ndw);
970 r = amdgpu_job_submit(job, ring, &vm->entity, 1041 r = amdgpu_job_submit(job, ring, &vm->entity,
971 AMDGPU_FENCE_OWNER_VM, &f); 1042 AMDGPU_FENCE_OWNER_VM, &f);
972 if (r) 1043 if (r)
@@ -1062,28 +1133,32 @@ static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev,
1062 * 1133 *
1063 * @adev: amdgpu_device pointer 1134 * @adev: amdgpu_device pointer
1064 * @bo_va: requested BO and VM object 1135 * @bo_va: requested BO and VM object
1065 * @mem: ttm mem 1136 * @clear: if true clear the entries
1066 * 1137 *
1067 * Fill in the page table entries for @bo_va. 1138 * Fill in the page table entries for @bo_va.
1068 * Returns 0 for success, -EINVAL for failure. 1139 * Returns 0 for success, -EINVAL for failure.
1069 *
1070 * Object have to be reserved and mutex must be locked!
1071 */ 1140 */
1072int amdgpu_vm_bo_update(struct amdgpu_device *adev, 1141int amdgpu_vm_bo_update(struct amdgpu_device *adev,
1073 struct amdgpu_bo_va *bo_va, 1142 struct amdgpu_bo_va *bo_va,
1074 struct ttm_mem_reg *mem) 1143 bool clear)
1075{ 1144{
1076 struct amdgpu_vm *vm = bo_va->vm; 1145 struct amdgpu_vm *vm = bo_va->vm;
1077 struct amdgpu_bo_va_mapping *mapping; 1146 struct amdgpu_bo_va_mapping *mapping;
1078 dma_addr_t *pages_addr = NULL; 1147 dma_addr_t *pages_addr = NULL;
1079 uint32_t gtt_flags, flags; 1148 uint32_t gtt_flags, flags;
1149 struct ttm_mem_reg *mem;
1080 struct fence *exclusive; 1150 struct fence *exclusive;
1081 uint64_t addr; 1151 uint64_t addr;
1082 int r; 1152 int r;
1083 1153
1084 if (mem) { 1154 if (clear) {
1155 mem = NULL;
1156 addr = 0;
1157 exclusive = NULL;
1158 } else {
1085 struct ttm_dma_tt *ttm; 1159 struct ttm_dma_tt *ttm;
1086 1160
1161 mem = &bo_va->bo->tbo.mem;
1087 addr = (u64)mem->start << PAGE_SHIFT; 1162 addr = (u64)mem->start << PAGE_SHIFT;
1088 switch (mem->mem_type) { 1163 switch (mem->mem_type) {
1089 case TTM_PL_TT: 1164 case TTM_PL_TT:
@@ -1101,13 +1176,11 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev,
1101 } 1176 }
1102 1177
1103 exclusive = reservation_object_get_excl(bo_va->bo->tbo.resv); 1178 exclusive = reservation_object_get_excl(bo_va->bo->tbo.resv);
1104 } else {
1105 addr = 0;
1106 exclusive = NULL;
1107 } 1179 }
1108 1180
1109 flags = amdgpu_ttm_tt_pte_flags(adev, bo_va->bo->tbo.ttm, mem); 1181 flags = amdgpu_ttm_tt_pte_flags(adev, bo_va->bo->tbo.ttm, mem);
1110 gtt_flags = (adev == bo_va->bo->adev) ? flags : 0; 1182 gtt_flags = (amdgpu_ttm_is_bound(bo_va->bo->tbo.ttm) &&
1183 adev == bo_va->bo->adev) ? flags : 0;
1111 1184
1112 spin_lock(&vm->status_lock); 1185 spin_lock(&vm->status_lock);
1113 if (!list_empty(&bo_va->vm_status)) 1186 if (!list_empty(&bo_va->vm_status))
@@ -1134,7 +1207,7 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev,
1134 spin_lock(&vm->status_lock); 1207 spin_lock(&vm->status_lock);
1135 list_splice_init(&bo_va->invalids, &bo_va->valids); 1208 list_splice_init(&bo_va->invalids, &bo_va->valids);
1136 list_del_init(&bo_va->vm_status); 1209 list_del_init(&bo_va->vm_status);
1137 if (!mem) 1210 if (clear)
1138 list_add(&bo_va->vm_status, &vm->cleared); 1211 list_add(&bo_va->vm_status, &vm->cleared);
1139 spin_unlock(&vm->status_lock); 1212 spin_unlock(&vm->status_lock);
1140 1213
@@ -1197,7 +1270,7 @@ int amdgpu_vm_clear_invalids(struct amdgpu_device *adev,
1197 struct amdgpu_bo_va, vm_status); 1270 struct amdgpu_bo_va, vm_status);
1198 spin_unlock(&vm->status_lock); 1271 spin_unlock(&vm->status_lock);
1199 1272
1200 r = amdgpu_vm_bo_update(adev, bo_va, NULL); 1273 r = amdgpu_vm_bo_update(adev, bo_va, true);
1201 if (r) 1274 if (r)
1202 return r; 1275 return r;
1203 1276
@@ -1342,7 +1415,8 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev,
1342 r = amdgpu_bo_create(adev, AMDGPU_VM_PTE_COUNT * 8, 1415 r = amdgpu_bo_create(adev, AMDGPU_VM_PTE_COUNT * 8,
1343 AMDGPU_GPU_PAGE_SIZE, true, 1416 AMDGPU_GPU_PAGE_SIZE, true,
1344 AMDGPU_GEM_DOMAIN_VRAM, 1417 AMDGPU_GEM_DOMAIN_VRAM,
1345 AMDGPU_GEM_CREATE_NO_CPU_ACCESS, 1418 AMDGPU_GEM_CREATE_NO_CPU_ACCESS |
1419 AMDGPU_GEM_CREATE_SHADOW,
1346 NULL, resv, &pt); 1420 NULL, resv, &pt);
1347 if (r) 1421 if (r)
1348 goto error_free; 1422 goto error_free;
@@ -1354,10 +1428,20 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev,
1354 1428
1355 r = amdgpu_vm_clear_bo(adev, vm, pt); 1429 r = amdgpu_vm_clear_bo(adev, vm, pt);
1356 if (r) { 1430 if (r) {
1431 amdgpu_bo_unref(&pt->shadow);
1357 amdgpu_bo_unref(&pt); 1432 amdgpu_bo_unref(&pt);
1358 goto error_free; 1433 goto error_free;
1359 } 1434 }
1360 1435
1436 if (pt->shadow) {
1437 r = amdgpu_vm_clear_bo(adev, vm, pt->shadow);
1438 if (r) {
1439 amdgpu_bo_unref(&pt->shadow);
1440 amdgpu_bo_unref(&pt);
1441 goto error_free;
1442 }
1443 }
1444
1361 entry->robj = pt; 1445 entry->robj = pt;
1362 entry->priority = 0; 1446 entry->priority = 0;
1363 entry->tv.bo = &entry->robj->tbo; 1447 entry->tv.bo = &entry->robj->tbo;
@@ -1541,7 +1625,8 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm)
1541 1625
1542 r = amdgpu_bo_create(adev, pd_size, align, true, 1626 r = amdgpu_bo_create(adev, pd_size, align, true,
1543 AMDGPU_GEM_DOMAIN_VRAM, 1627 AMDGPU_GEM_DOMAIN_VRAM,
1544 AMDGPU_GEM_CREATE_NO_CPU_ACCESS, 1628 AMDGPU_GEM_CREATE_NO_CPU_ACCESS |
1629 AMDGPU_GEM_CREATE_SHADOW,
1545 NULL, NULL, &vm->page_directory); 1630 NULL, NULL, &vm->page_directory);
1546 if (r) 1631 if (r)
1547 goto error_free_sched_entity; 1632 goto error_free_sched_entity;
@@ -1551,14 +1636,25 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm)
1551 goto error_free_page_directory; 1636 goto error_free_page_directory;
1552 1637
1553 r = amdgpu_vm_clear_bo(adev, vm, vm->page_directory); 1638 r = amdgpu_vm_clear_bo(adev, vm, vm->page_directory);
1554 amdgpu_bo_unreserve(vm->page_directory);
1555 if (r) 1639 if (r)
1556 goto error_free_page_directory; 1640 goto error_unreserve;
1641
1642 if (vm->page_directory->shadow) {
1643 r = amdgpu_vm_clear_bo(adev, vm, vm->page_directory->shadow);
1644 if (r)
1645 goto error_unreserve;
1646 }
1647
1557 vm->last_eviction_counter = atomic64_read(&adev->num_evictions); 1648 vm->last_eviction_counter = atomic64_read(&adev->num_evictions);
1649 amdgpu_bo_unreserve(vm->page_directory);
1558 1650
1559 return 0; 1651 return 0;
1560 1652
1653error_unreserve:
1654 amdgpu_bo_unreserve(vm->page_directory);
1655
1561error_free_page_directory: 1656error_free_page_directory:
1657 amdgpu_bo_unref(&vm->page_directory->shadow);
1562 amdgpu_bo_unref(&vm->page_directory); 1658 amdgpu_bo_unref(&vm->page_directory);
1563 vm->page_directory = NULL; 1659 vm->page_directory = NULL;
1564 1660
@@ -1600,10 +1696,18 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
1600 kfree(mapping); 1696 kfree(mapping);
1601 } 1697 }
1602 1698
1603 for (i = 0; i < amdgpu_vm_num_pdes(adev); i++) 1699 for (i = 0; i < amdgpu_vm_num_pdes(adev); i++) {
1604 amdgpu_bo_unref(&vm->page_tables[i].entry.robj); 1700 struct amdgpu_bo *pt = vm->page_tables[i].entry.robj;
1701
1702 if (!pt)
1703 continue;
1704
1705 amdgpu_bo_unref(&pt->shadow);
1706 amdgpu_bo_unref(&pt);
1707 }
1605 drm_free_large(vm->page_tables); 1708 drm_free_large(vm->page_tables);
1606 1709
1710 amdgpu_bo_unref(&vm->page_directory->shadow);
1607 amdgpu_bo_unref(&vm->page_directory); 1711 amdgpu_bo_unref(&vm->page_directory);
1608 fence_put(vm->page_directory_fence); 1712 fence_put(vm->page_directory_fence);
1609} 1713}
diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_crtc.c b/drivers/gpu/drm/amd/amdgpu/atombios_crtc.c
index 49a39b1a0a96..f7d236f95e74 100644
--- a/drivers/gpu/drm/amd/amdgpu/atombios_crtc.c
+++ b/drivers/gpu/drm/amd/amdgpu/atombios_crtc.c
@@ -497,7 +497,13 @@ void amdgpu_atombios_crtc_set_disp_eng_pll(struct amdgpu_device *adev,
497 * SetPixelClock provides the dividers 497 * SetPixelClock provides the dividers
498 */ 498 */
499 args.v6.ulDispEngClkFreq = cpu_to_le32(dispclk); 499 args.v6.ulDispEngClkFreq = cpu_to_le32(dispclk);
500 args.v6.ucPpll = ATOM_EXT_PLL1; 500 if (adev->asic_type == CHIP_TAHITI ||
501 adev->asic_type == CHIP_PITCAIRN ||
502 adev->asic_type == CHIP_VERDE ||
503 adev->asic_type == CHIP_OLAND)
504 args.v6.ucPpll = ATOM_PPLL0;
505 else
506 args.v6.ucPpll = ATOM_EXT_PLL1;
501 break; 507 break;
502 default: 508 default:
503 DRM_ERROR("Unknown table version %d %d\n", frev, crev); 509 DRM_ERROR("Unknown table version %d %d\n", frev, crev);
diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_dp.c b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c
index 7f85c2c1d681..f81068ba4cc6 100644
--- a/drivers/gpu/drm/amd/amdgpu/atombios_dp.c
+++ b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c
@@ -88,7 +88,6 @@ static int amdgpu_atombios_dp_process_aux_ch(struct amdgpu_i2c_chan *chan,
88 88
89 /* timeout */ 89 /* timeout */
90 if (args.v2.ucReplyStatus == 1) { 90 if (args.v2.ucReplyStatus == 1) {
91 DRM_DEBUG_KMS("dp_aux_ch timeout\n");
92 r = -ETIMEDOUT; 91 r = -ETIMEDOUT;
93 goto done; 92 goto done;
94 } 93 }
@@ -339,22 +338,21 @@ int amdgpu_atombios_dp_get_dpcd(struct amdgpu_connector *amdgpu_connector)
339{ 338{
340 struct amdgpu_connector_atom_dig *dig_connector = amdgpu_connector->con_priv; 339 struct amdgpu_connector_atom_dig *dig_connector = amdgpu_connector->con_priv;
341 u8 msg[DP_DPCD_SIZE]; 340 u8 msg[DP_DPCD_SIZE];
342 int ret, i; 341 int ret;
343 342
344 for (i = 0; i < 7; i++) { 343 ret = drm_dp_dpcd_read(&amdgpu_connector->ddc_bus->aux, DP_DPCD_REV,
345 ret = drm_dp_dpcd_read(&amdgpu_connector->ddc_bus->aux, DP_DPCD_REV, msg, 344 msg, DP_DPCD_SIZE);
346 DP_DPCD_SIZE); 345 if (ret == DP_DPCD_SIZE) {
347 if (ret == DP_DPCD_SIZE) { 346 memcpy(dig_connector->dpcd, msg, DP_DPCD_SIZE);
348 memcpy(dig_connector->dpcd, msg, DP_DPCD_SIZE);
349 347
350 DRM_DEBUG_KMS("DPCD: %*ph\n", (int)sizeof(dig_connector->dpcd), 348 DRM_DEBUG_KMS("DPCD: %*ph\n", (int)sizeof(dig_connector->dpcd),
351 dig_connector->dpcd); 349 dig_connector->dpcd);
352 350
353 amdgpu_atombios_dp_probe_oui(amdgpu_connector); 351 amdgpu_atombios_dp_probe_oui(amdgpu_connector);
354 352
355 return 0; 353 return 0;
356 }
357 } 354 }
355
358 dig_connector->dpcd[0] = 0; 356 dig_connector->dpcd[0] = 0;
359 return -EINVAL; 357 return -EINVAL;
360} 358}
diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_i2c.c b/drivers/gpu/drm/amd/amdgpu/atombios_i2c.c
index bc56c8a181e6..b374653bd6cf 100644
--- a/drivers/gpu/drm/amd/amdgpu/atombios_i2c.c
+++ b/drivers/gpu/drm/amd/amdgpu/atombios_i2c.c
@@ -27,6 +27,7 @@
27#include "amdgpu.h" 27#include "amdgpu.h"
28#include "atom.h" 28#include "atom.h"
29#include "amdgpu_atombios.h" 29#include "amdgpu_atombios.h"
30#include "atombios_i2c.h"
30 31
31#define TARGET_HW_I2C_CLOCK 50 32#define TARGET_HW_I2C_CLOCK 50
32 33
diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
index a5c94b482459..1d8c375a3561 100644
--- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
+++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
@@ -5396,7 +5396,7 @@ static void ci_dpm_disable(struct amdgpu_device *adev)
5396 amdgpu_irq_put(adev, &adev->pm.dpm.thermal.irq, 5396 amdgpu_irq_put(adev, &adev->pm.dpm.thermal.irq,
5397 AMDGPU_THERMAL_IRQ_HIGH_TO_LOW); 5397 AMDGPU_THERMAL_IRQ_HIGH_TO_LOW);
5398 5398
5399 ci_dpm_powergate_uvd(adev, false); 5399 ci_dpm_powergate_uvd(adev, true);
5400 5400
5401 if (!amdgpu_ci_is_smc_running(adev)) 5401 if (!amdgpu_ci_is_smc_running(adev))
5402 return; 5402 return;
@@ -5874,7 +5874,10 @@ static int ci_dpm_init(struct amdgpu_device *adev)
5874 pi->pcie_dpm_key_disabled = 0; 5874 pi->pcie_dpm_key_disabled = 0;
5875 pi->thermal_sclk_dpm_enabled = 0; 5875 pi->thermal_sclk_dpm_enabled = 0;
5876 5876
5877 pi->caps_sclk_ds = true; 5877 if (amdgpu_sclk_deep_sleep_en)
5878 pi->caps_sclk_ds = true;
5879 else
5880 pi->caps_sclk_ds = false;
5878 5881
5879 pi->mclk_strobe_mode_threshold = 40000; 5882 pi->mclk_strobe_mode_threshold = 40000;
5880 pi->mclk_stutter_mode_threshold = 40000; 5883 pi->mclk_stutter_mode_threshold = 40000;
@@ -6033,7 +6036,7 @@ static int ci_dpm_init(struct amdgpu_device *adev)
6033 6036
6034 pi->caps_dynamic_ac_timing = true; 6037 pi->caps_dynamic_ac_timing = true;
6035 6038
6036 pi->uvd_power_gated = false; 6039 pi->uvd_power_gated = true;
6037 6040
6038 /* make sure dc limits are valid */ 6041 /* make sure dc limits are valid */
6039 if ((adev->pm.dpm.dyn_state.max_clock_voltage_on_dc.sclk == 0) || 6042 if ((adev->pm.dpm.dyn_state.max_clock_voltage_on_dc.sclk == 0) ||
@@ -6176,8 +6179,6 @@ static int ci_dpm_late_init(void *handle)
6176 if (ret) 6179 if (ret)
6177 return ret; 6180 return ret;
6178 6181
6179 ci_dpm_powergate_uvd(adev, true);
6180
6181 return 0; 6182 return 0;
6182} 6183}
6183 6184
diff --git a/drivers/gpu/drm/amd/amdgpu/cik.c b/drivers/gpu/drm/amd/amdgpu/cik.c
index 4efc901f658c..a845b6a93b79 100644
--- a/drivers/gpu/drm/amd/amdgpu/cik.c
+++ b/drivers/gpu/drm/amd/amdgpu/cik.c
@@ -67,6 +67,7 @@
67 67
68#include "amdgpu_amdkfd.h" 68#include "amdgpu_amdkfd.h"
69#include "amdgpu_powerplay.h" 69#include "amdgpu_powerplay.h"
70#include "dce_virtual.h"
70 71
71/* 72/*
72 * Indirect registers accessor 73 * Indirect registers accessor
@@ -962,12 +963,6 @@ static bool cik_read_bios_from_rom(struct amdgpu_device *adev,
962 return true; 963 return true;
963} 964}
964 965
965static u32 cik_get_virtual_caps(struct amdgpu_device *adev)
966{
967 /* CIK does not support SR-IOV */
968 return 0;
969}
970
971static const struct amdgpu_allowed_register_entry cik_allowed_read_registers[] = { 966static const struct amdgpu_allowed_register_entry cik_allowed_read_registers[] = {
972 {mmGRBM_STATUS, false}, 967 {mmGRBM_STATUS, false},
973 {mmGB_ADDR_CONFIG, false}, 968 {mmGB_ADDR_CONFIG, false},
@@ -1640,6 +1635,12 @@ static uint32_t cik_get_rev_id(struct amdgpu_device *adev)
1640 >> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT; 1635 >> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
1641} 1636}
1642 1637
1638static void cik_detect_hw_virtualization(struct amdgpu_device *adev)
1639{
1640 if (is_virtual_machine()) /* passthrough mode */
1641 adev->virtualization.virtual_caps |= AMDGPU_PASSTHROUGH_MODE;
1642}
1643
1643static const struct amdgpu_ip_block_version bonaire_ip_blocks[] = 1644static const struct amdgpu_ip_block_version bonaire_ip_blocks[] =
1644{ 1645{
1645 /* ORDER MATTERS! */ 1646 /* ORDER MATTERS! */
@@ -1708,6 +1709,74 @@ static const struct amdgpu_ip_block_version bonaire_ip_blocks[] =
1708 }, 1709 },
1709}; 1710};
1710 1711
1712static const struct amdgpu_ip_block_version bonaire_ip_blocks_vd[] =
1713{
1714 /* ORDER MATTERS! */
1715 {
1716 .type = AMD_IP_BLOCK_TYPE_COMMON,
1717 .major = 1,
1718 .minor = 0,
1719 .rev = 0,
1720 .funcs = &cik_common_ip_funcs,
1721 },
1722 {
1723 .type = AMD_IP_BLOCK_TYPE_GMC,
1724 .major = 7,
1725 .minor = 0,
1726 .rev = 0,
1727 .funcs = &gmc_v7_0_ip_funcs,
1728 },
1729 {
1730 .type = AMD_IP_BLOCK_TYPE_IH,
1731 .major = 2,
1732 .minor = 0,
1733 .rev = 0,
1734 .funcs = &cik_ih_ip_funcs,
1735 },
1736 {
1737 .type = AMD_IP_BLOCK_TYPE_SMC,
1738 .major = 7,
1739 .minor = 0,
1740 .rev = 0,
1741 .funcs = &amdgpu_pp_ip_funcs,
1742 },
1743 {
1744 .type = AMD_IP_BLOCK_TYPE_DCE,
1745 .major = 8,
1746 .minor = 2,
1747 .rev = 0,
1748 .funcs = &dce_virtual_ip_funcs,
1749 },
1750 {
1751 .type = AMD_IP_BLOCK_TYPE_GFX,
1752 .major = 7,
1753 .minor = 2,
1754 .rev = 0,
1755 .funcs = &gfx_v7_0_ip_funcs,
1756 },
1757 {
1758 .type = AMD_IP_BLOCK_TYPE_SDMA,
1759 .major = 2,
1760 .minor = 0,
1761 .rev = 0,
1762 .funcs = &cik_sdma_ip_funcs,
1763 },
1764 {
1765 .type = AMD_IP_BLOCK_TYPE_UVD,
1766 .major = 4,
1767 .minor = 2,
1768 .rev = 0,
1769 .funcs = &uvd_v4_2_ip_funcs,
1770 },
1771 {
1772 .type = AMD_IP_BLOCK_TYPE_VCE,
1773 .major = 2,
1774 .minor = 0,
1775 .rev = 0,
1776 .funcs = &vce_v2_0_ip_funcs,
1777 },
1778};
1779
1711static const struct amdgpu_ip_block_version hawaii_ip_blocks[] = 1780static const struct amdgpu_ip_block_version hawaii_ip_blocks[] =
1712{ 1781{
1713 /* ORDER MATTERS! */ 1782 /* ORDER MATTERS! */
@@ -1776,6 +1845,74 @@ static const struct amdgpu_ip_block_version hawaii_ip_blocks[] =
1776 }, 1845 },
1777}; 1846};
1778 1847
1848static const struct amdgpu_ip_block_version hawaii_ip_blocks_vd[] =
1849{
1850 /* ORDER MATTERS! */
1851 {
1852 .type = AMD_IP_BLOCK_TYPE_COMMON,
1853 .major = 1,
1854 .minor = 0,
1855 .rev = 0,
1856 .funcs = &cik_common_ip_funcs,
1857 },
1858 {
1859 .type = AMD_IP_BLOCK_TYPE_GMC,
1860 .major = 7,
1861 .minor = 0,
1862 .rev = 0,
1863 .funcs = &gmc_v7_0_ip_funcs,
1864 },
1865 {
1866 .type = AMD_IP_BLOCK_TYPE_IH,
1867 .major = 2,
1868 .minor = 0,
1869 .rev = 0,
1870 .funcs = &cik_ih_ip_funcs,
1871 },
1872 {
1873 .type = AMD_IP_BLOCK_TYPE_SMC,
1874 .major = 7,
1875 .minor = 0,
1876 .rev = 0,
1877 .funcs = &amdgpu_pp_ip_funcs,
1878 },
1879 {
1880 .type = AMD_IP_BLOCK_TYPE_DCE,
1881 .major = 8,
1882 .minor = 5,
1883 .rev = 0,
1884 .funcs = &dce_virtual_ip_funcs,
1885 },
1886 {
1887 .type = AMD_IP_BLOCK_TYPE_GFX,
1888 .major = 7,
1889 .minor = 3,
1890 .rev = 0,
1891 .funcs = &gfx_v7_0_ip_funcs,
1892 },
1893 {
1894 .type = AMD_IP_BLOCK_TYPE_SDMA,
1895 .major = 2,
1896 .minor = 0,
1897 .rev = 0,
1898 .funcs = &cik_sdma_ip_funcs,
1899 },
1900 {
1901 .type = AMD_IP_BLOCK_TYPE_UVD,
1902 .major = 4,
1903 .minor = 2,
1904 .rev = 0,
1905 .funcs = &uvd_v4_2_ip_funcs,
1906 },
1907 {
1908 .type = AMD_IP_BLOCK_TYPE_VCE,
1909 .major = 2,
1910 .minor = 0,
1911 .rev = 0,
1912 .funcs = &vce_v2_0_ip_funcs,
1913 },
1914};
1915
1779static const struct amdgpu_ip_block_version kabini_ip_blocks[] = 1916static const struct amdgpu_ip_block_version kabini_ip_blocks[] =
1780{ 1917{
1781 /* ORDER MATTERS! */ 1918 /* ORDER MATTERS! */
@@ -1844,6 +1981,74 @@ static const struct amdgpu_ip_block_version kabini_ip_blocks[] =
1844 }, 1981 },
1845}; 1982};
1846 1983
1984static const struct amdgpu_ip_block_version kabini_ip_blocks_vd[] =
1985{
1986 /* ORDER MATTERS! */
1987 {
1988 .type = AMD_IP_BLOCK_TYPE_COMMON,
1989 .major = 1,
1990 .minor = 0,
1991 .rev = 0,
1992 .funcs = &cik_common_ip_funcs,
1993 },
1994 {
1995 .type = AMD_IP_BLOCK_TYPE_GMC,
1996 .major = 7,
1997 .minor = 0,
1998 .rev = 0,
1999 .funcs = &gmc_v7_0_ip_funcs,
2000 },
2001 {
2002 .type = AMD_IP_BLOCK_TYPE_IH,
2003 .major = 2,
2004 .minor = 0,
2005 .rev = 0,
2006 .funcs = &cik_ih_ip_funcs,
2007 },
2008 {
2009 .type = AMD_IP_BLOCK_TYPE_SMC,
2010 .major = 7,
2011 .minor = 0,
2012 .rev = 0,
2013 .funcs = &amdgpu_pp_ip_funcs,
2014 },
2015 {
2016 .type = AMD_IP_BLOCK_TYPE_DCE,
2017 .major = 8,
2018 .minor = 3,
2019 .rev = 0,
2020 .funcs = &dce_virtual_ip_funcs,
2021 },
2022 {
2023 .type = AMD_IP_BLOCK_TYPE_GFX,
2024 .major = 7,
2025 .minor = 2,
2026 .rev = 0,
2027 .funcs = &gfx_v7_0_ip_funcs,
2028 },
2029 {
2030 .type = AMD_IP_BLOCK_TYPE_SDMA,
2031 .major = 2,
2032 .minor = 0,
2033 .rev = 0,
2034 .funcs = &cik_sdma_ip_funcs,
2035 },
2036 {
2037 .type = AMD_IP_BLOCK_TYPE_UVD,
2038 .major = 4,
2039 .minor = 2,
2040 .rev = 0,
2041 .funcs = &uvd_v4_2_ip_funcs,
2042 },
2043 {
2044 .type = AMD_IP_BLOCK_TYPE_VCE,
2045 .major = 2,
2046 .minor = 0,
2047 .rev = 0,
2048 .funcs = &vce_v2_0_ip_funcs,
2049 },
2050};
2051
1847static const struct amdgpu_ip_block_version mullins_ip_blocks[] = 2052static const struct amdgpu_ip_block_version mullins_ip_blocks[] =
1848{ 2053{
1849 /* ORDER MATTERS! */ 2054 /* ORDER MATTERS! */
@@ -1912,6 +2117,74 @@ static const struct amdgpu_ip_block_version mullins_ip_blocks[] =
1912 }, 2117 },
1913}; 2118};
1914 2119
2120static const struct amdgpu_ip_block_version mullins_ip_blocks_vd[] =
2121{
2122 /* ORDER MATTERS! */
2123 {
2124 .type = AMD_IP_BLOCK_TYPE_COMMON,
2125 .major = 1,
2126 .minor = 0,
2127 .rev = 0,
2128 .funcs = &cik_common_ip_funcs,
2129 },
2130 {
2131 .type = AMD_IP_BLOCK_TYPE_GMC,
2132 .major = 7,
2133 .minor = 0,
2134 .rev = 0,
2135 .funcs = &gmc_v7_0_ip_funcs,
2136 },
2137 {
2138 .type = AMD_IP_BLOCK_TYPE_IH,
2139 .major = 2,
2140 .minor = 0,
2141 .rev = 0,
2142 .funcs = &cik_ih_ip_funcs,
2143 },
2144 {
2145 .type = AMD_IP_BLOCK_TYPE_SMC,
2146 .major = 7,
2147 .minor = 0,
2148 .rev = 0,
2149 .funcs = &amdgpu_pp_ip_funcs,
2150 },
2151 {
2152 .type = AMD_IP_BLOCK_TYPE_DCE,
2153 .major = 8,
2154 .minor = 3,
2155 .rev = 0,
2156 .funcs = &dce_virtual_ip_funcs,
2157 },
2158 {
2159 .type = AMD_IP_BLOCK_TYPE_GFX,
2160 .major = 7,
2161 .minor = 2,
2162 .rev = 0,
2163 .funcs = &gfx_v7_0_ip_funcs,
2164 },
2165 {
2166 .type = AMD_IP_BLOCK_TYPE_SDMA,
2167 .major = 2,
2168 .minor = 0,
2169 .rev = 0,
2170 .funcs = &cik_sdma_ip_funcs,
2171 },
2172 {
2173 .type = AMD_IP_BLOCK_TYPE_UVD,
2174 .major = 4,
2175 .minor = 2,
2176 .rev = 0,
2177 .funcs = &uvd_v4_2_ip_funcs,
2178 },
2179 {
2180 .type = AMD_IP_BLOCK_TYPE_VCE,
2181 .major = 2,
2182 .minor = 0,
2183 .rev = 0,
2184 .funcs = &vce_v2_0_ip_funcs,
2185 },
2186};
2187
1915static const struct amdgpu_ip_block_version kaveri_ip_blocks[] = 2188static const struct amdgpu_ip_block_version kaveri_ip_blocks[] =
1916{ 2189{
1917 /* ORDER MATTERS! */ 2190 /* ORDER MATTERS! */
@@ -1980,32 +2253,128 @@ static const struct amdgpu_ip_block_version kaveri_ip_blocks[] =
1980 }, 2253 },
1981}; 2254};
1982 2255
2256static const struct amdgpu_ip_block_version kaveri_ip_blocks_vd[] =
2257{
2258 /* ORDER MATTERS! */
2259 {
2260 .type = AMD_IP_BLOCK_TYPE_COMMON,
2261 .major = 1,
2262 .minor = 0,
2263 .rev = 0,
2264 .funcs = &cik_common_ip_funcs,
2265 },
2266 {
2267 .type = AMD_IP_BLOCK_TYPE_GMC,
2268 .major = 7,
2269 .minor = 0,
2270 .rev = 0,
2271 .funcs = &gmc_v7_0_ip_funcs,
2272 },
2273 {
2274 .type = AMD_IP_BLOCK_TYPE_IH,
2275 .major = 2,
2276 .minor = 0,
2277 .rev = 0,
2278 .funcs = &cik_ih_ip_funcs,
2279 },
2280 {
2281 .type = AMD_IP_BLOCK_TYPE_SMC,
2282 .major = 7,
2283 .minor = 0,
2284 .rev = 0,
2285 .funcs = &amdgpu_pp_ip_funcs,
2286 },
2287 {
2288 .type = AMD_IP_BLOCK_TYPE_DCE,
2289 .major = 8,
2290 .minor = 1,
2291 .rev = 0,
2292 .funcs = &dce_virtual_ip_funcs,
2293 },
2294 {
2295 .type = AMD_IP_BLOCK_TYPE_GFX,
2296 .major = 7,
2297 .minor = 1,
2298 .rev = 0,
2299 .funcs = &gfx_v7_0_ip_funcs,
2300 },
2301 {
2302 .type = AMD_IP_BLOCK_TYPE_SDMA,
2303 .major = 2,
2304 .minor = 0,
2305 .rev = 0,
2306 .funcs = &cik_sdma_ip_funcs,
2307 },
2308 {
2309 .type = AMD_IP_BLOCK_TYPE_UVD,
2310 .major = 4,
2311 .minor = 2,
2312 .rev = 0,
2313 .funcs = &uvd_v4_2_ip_funcs,
2314 },
2315 {
2316 .type = AMD_IP_BLOCK_TYPE_VCE,
2317 .major = 2,
2318 .minor = 0,
2319 .rev = 0,
2320 .funcs = &vce_v2_0_ip_funcs,
2321 },
2322};
2323
1983int cik_set_ip_blocks(struct amdgpu_device *adev) 2324int cik_set_ip_blocks(struct amdgpu_device *adev)
1984{ 2325{
1985 switch (adev->asic_type) { 2326 if (adev->enable_virtual_display) {
1986 case CHIP_BONAIRE: 2327 switch (adev->asic_type) {
1987 adev->ip_blocks = bonaire_ip_blocks; 2328 case CHIP_BONAIRE:
1988 adev->num_ip_blocks = ARRAY_SIZE(bonaire_ip_blocks); 2329 adev->ip_blocks = bonaire_ip_blocks_vd;
1989 break; 2330 adev->num_ip_blocks = ARRAY_SIZE(bonaire_ip_blocks_vd);
1990 case CHIP_HAWAII: 2331 break;
1991 adev->ip_blocks = hawaii_ip_blocks; 2332 case CHIP_HAWAII:
1992 adev->num_ip_blocks = ARRAY_SIZE(hawaii_ip_blocks); 2333 adev->ip_blocks = hawaii_ip_blocks_vd;
1993 break; 2334 adev->num_ip_blocks = ARRAY_SIZE(hawaii_ip_blocks_vd);
1994 case CHIP_KAVERI: 2335 break;
1995 adev->ip_blocks = kaveri_ip_blocks; 2336 case CHIP_KAVERI:
1996 adev->num_ip_blocks = ARRAY_SIZE(kaveri_ip_blocks); 2337 adev->ip_blocks = kaveri_ip_blocks_vd;
1997 break; 2338 adev->num_ip_blocks = ARRAY_SIZE(kaveri_ip_blocks_vd);
1998 case CHIP_KABINI: 2339 break;
1999 adev->ip_blocks = kabini_ip_blocks; 2340 case CHIP_KABINI:
2000 adev->num_ip_blocks = ARRAY_SIZE(kabini_ip_blocks); 2341 adev->ip_blocks = kabini_ip_blocks_vd;
2001 break; 2342 adev->num_ip_blocks = ARRAY_SIZE(kabini_ip_blocks_vd);
2002 case CHIP_MULLINS: 2343 break;
2003 adev->ip_blocks = mullins_ip_blocks; 2344 case CHIP_MULLINS:
2004 adev->num_ip_blocks = ARRAY_SIZE(mullins_ip_blocks); 2345 adev->ip_blocks = mullins_ip_blocks_vd;
2005 break; 2346 adev->num_ip_blocks = ARRAY_SIZE(mullins_ip_blocks_vd);
2006 default: 2347 break;
2007 /* FIXME: not supported yet */ 2348 default:
2008 return -EINVAL; 2349 /* FIXME: not supported yet */
2350 return -EINVAL;
2351 }
2352 } else {
2353 switch (adev->asic_type) {
2354 case CHIP_BONAIRE:
2355 adev->ip_blocks = bonaire_ip_blocks;
2356 adev->num_ip_blocks = ARRAY_SIZE(bonaire_ip_blocks);
2357 break;
2358 case CHIP_HAWAII:
2359 adev->ip_blocks = hawaii_ip_blocks;
2360 adev->num_ip_blocks = ARRAY_SIZE(hawaii_ip_blocks);
2361 break;
2362 case CHIP_KAVERI:
2363 adev->ip_blocks = kaveri_ip_blocks;
2364 adev->num_ip_blocks = ARRAY_SIZE(kaveri_ip_blocks);
2365 break;
2366 case CHIP_KABINI:
2367 adev->ip_blocks = kabini_ip_blocks;
2368 adev->num_ip_blocks = ARRAY_SIZE(kabini_ip_blocks);
2369 break;
2370 case CHIP_MULLINS:
2371 adev->ip_blocks = mullins_ip_blocks;
2372 adev->num_ip_blocks = ARRAY_SIZE(mullins_ip_blocks);
2373 break;
2374 default:
2375 /* FIXME: not supported yet */
2376 return -EINVAL;
2377 }
2009 } 2378 }
2010 2379
2011 return 0; 2380 return 0;
@@ -2015,13 +2384,13 @@ static const struct amdgpu_asic_funcs cik_asic_funcs =
2015{ 2384{
2016 .read_disabled_bios = &cik_read_disabled_bios, 2385 .read_disabled_bios = &cik_read_disabled_bios,
2017 .read_bios_from_rom = &cik_read_bios_from_rom, 2386 .read_bios_from_rom = &cik_read_bios_from_rom,
2387 .detect_hw_virtualization = cik_detect_hw_virtualization,
2018 .read_register = &cik_read_register, 2388 .read_register = &cik_read_register,
2019 .reset = &cik_asic_reset, 2389 .reset = &cik_asic_reset,
2020 .set_vga_state = &cik_vga_set_state, 2390 .set_vga_state = &cik_vga_set_state,
2021 .get_xclk = &cik_get_xclk, 2391 .get_xclk = &cik_get_xclk,
2022 .set_uvd_clocks = &cik_set_uvd_clocks, 2392 .set_uvd_clocks = &cik_set_uvd_clocks,
2023 .set_vce_clocks = &cik_set_vce_clocks, 2393 .set_vce_clocks = &cik_set_vce_clocks,
2024 .get_virtual_caps = &cik_get_virtual_caps,
2025}; 2394};
2026 2395
2027static int cik_common_early_init(void *handle) 2396static int cik_common_early_init(void *handle)
diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
index 77fdd9911c3c..cb952acc7133 100644
--- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
+++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
@@ -695,24 +695,16 @@ static void cik_sdma_vm_copy_pte(struct amdgpu_ib *ib,
695 uint64_t pe, uint64_t src, 695 uint64_t pe, uint64_t src,
696 unsigned count) 696 unsigned count)
697{ 697{
698 while (count) { 698 unsigned bytes = count * 8;
699 unsigned bytes = count * 8; 699
700 if (bytes > 0x1FFFF8) 700 ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_COPY,
701 bytes = 0x1FFFF8; 701 SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
702 702 ib->ptr[ib->length_dw++] = bytes;
703 ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_COPY, 703 ib->ptr[ib->length_dw++] = 0; /* src/dst endian swap */
704 SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 704 ib->ptr[ib->length_dw++] = lower_32_bits(src);
705 ib->ptr[ib->length_dw++] = bytes; 705 ib->ptr[ib->length_dw++] = upper_32_bits(src);
706 ib->ptr[ib->length_dw++] = 0; /* src/dst endian swap */ 706 ib->ptr[ib->length_dw++] = lower_32_bits(pe);
707 ib->ptr[ib->length_dw++] = lower_32_bits(src); 707 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
708 ib->ptr[ib->length_dw++] = upper_32_bits(src);
709 ib->ptr[ib->length_dw++] = lower_32_bits(pe);
710 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
711
712 pe += bytes;
713 src += bytes;
714 count -= bytes / 8;
715 }
716} 708}
717 709
718/** 710/**
@@ -720,39 +712,27 @@ static void cik_sdma_vm_copy_pte(struct amdgpu_ib *ib,
720 * 712 *
721 * @ib: indirect buffer to fill with commands 713 * @ib: indirect buffer to fill with commands
722 * @pe: addr of the page entry 714 * @pe: addr of the page entry
723 * @addr: dst addr to write into pe 715 * @value: dst addr to write into pe
724 * @count: number of page entries to update 716 * @count: number of page entries to update
725 * @incr: increase next addr by incr bytes 717 * @incr: increase next addr by incr bytes
726 * @flags: access flags
727 * 718 *
728 * Update PTEs by writing them manually using sDMA (CIK). 719 * Update PTEs by writing them manually using sDMA (CIK).
729 */ 720 */
730static void cik_sdma_vm_write_pte(struct amdgpu_ib *ib, 721static void cik_sdma_vm_write_pte(struct amdgpu_ib *ib, uint64_t pe,
731 const dma_addr_t *pages_addr, uint64_t pe, 722 uint64_t value, unsigned count,
732 uint64_t addr, unsigned count, 723 uint32_t incr)
733 uint32_t incr, uint32_t flags)
734{ 724{
735 uint64_t value; 725 unsigned ndw = count * 2;
736 unsigned ndw; 726
737 727 ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_WRITE,
738 while (count) { 728 SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
739 ndw = count * 2; 729 ib->ptr[ib->length_dw++] = lower_32_bits(pe);
740 if (ndw > 0xFFFFE) 730 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
741 ndw = 0xFFFFE; 731 ib->ptr[ib->length_dw++] = ndw;
742 732 for (; ndw > 0; ndw -= 2) {
743 /* for non-physically contiguous pages (system) */ 733 ib->ptr[ib->length_dw++] = lower_32_bits(value);
744 ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_WRITE, 734 ib->ptr[ib->length_dw++] = upper_32_bits(value);
745 SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 735 value += incr;
746 ib->ptr[ib->length_dw++] = pe;
747 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
748 ib->ptr[ib->length_dw++] = ndw;
749 for (; ndw > 0; ndw -= 2, --count, pe += 8) {
750 value = amdgpu_vm_map_gart(pages_addr, addr);
751 addr += incr;
752 value |= flags;
753 ib->ptr[ib->length_dw++] = value;
754 ib->ptr[ib->length_dw++] = upper_32_bits(value);
755 }
756 } 736 }
757} 737}
758 738
@@ -768,40 +748,21 @@ static void cik_sdma_vm_write_pte(struct amdgpu_ib *ib,
768 * 748 *
769 * Update the page tables using sDMA (CIK). 749 * Update the page tables using sDMA (CIK).
770 */ 750 */
771static void cik_sdma_vm_set_pte_pde(struct amdgpu_ib *ib, 751static void cik_sdma_vm_set_pte_pde(struct amdgpu_ib *ib, uint64_t pe,
772 uint64_t pe,
773 uint64_t addr, unsigned count, 752 uint64_t addr, unsigned count,
774 uint32_t incr, uint32_t flags) 753 uint32_t incr, uint32_t flags)
775{ 754{
776 uint64_t value; 755 /* for physically contiguous pages (vram) */
777 unsigned ndw; 756 ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_GENERATE_PTE_PDE, 0, 0);
778 757 ib->ptr[ib->length_dw++] = lower_32_bits(pe); /* dst addr */
779 while (count) { 758 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
780 ndw = count; 759 ib->ptr[ib->length_dw++] = flags; /* mask */
781 if (ndw > 0x7FFFF) 760 ib->ptr[ib->length_dw++] = 0;
782 ndw = 0x7FFFF; 761 ib->ptr[ib->length_dw++] = lower_32_bits(addr); /* value */
783 762 ib->ptr[ib->length_dw++] = upper_32_bits(addr);
784 if (flags & AMDGPU_PTE_VALID) 763 ib->ptr[ib->length_dw++] = incr; /* increment size */
785 value = addr; 764 ib->ptr[ib->length_dw++] = 0;
786 else 765 ib->ptr[ib->length_dw++] = count; /* number of entries */
787 value = 0;
788
789 /* for physically contiguous pages (vram) */
790 ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_GENERATE_PTE_PDE, 0, 0);
791 ib->ptr[ib->length_dw++] = pe; /* dst addr */
792 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
793 ib->ptr[ib->length_dw++] = flags; /* mask */
794 ib->ptr[ib->length_dw++] = 0;
795 ib->ptr[ib->length_dw++] = value; /* value */
796 ib->ptr[ib->length_dw++] = upper_32_bits(value);
797 ib->ptr[ib->length_dw++] = incr; /* increment size */
798 ib->ptr[ib->length_dw++] = 0;
799 ib->ptr[ib->length_dw++] = ndw; /* number of entries */
800
801 pe += ndw * 8;
802 addr += ndw * incr;
803 count -= ndw;
804 }
805} 766}
806 767
807/** 768/**
@@ -887,6 +848,22 @@ static void cik_sdma_ring_emit_vm_flush(struct amdgpu_ring *ring,
887 amdgpu_ring_write(ring, (0xfff << 16) | 10); /* retry count, poll interval */ 848 amdgpu_ring_write(ring, (0xfff << 16) | 10); /* retry count, poll interval */
888} 849}
889 850
851static unsigned cik_sdma_ring_get_emit_ib_size(struct amdgpu_ring *ring)
852{
853 return
854 7 + 4; /* cik_sdma_ring_emit_ib */
855}
856
857static unsigned cik_sdma_ring_get_dma_frame_size(struct amdgpu_ring *ring)
858{
859 return
860 6 + /* cik_sdma_ring_emit_hdp_flush */
861 3 + /* cik_sdma_ring_emit_hdp_invalidate */
862 6 + /* cik_sdma_ring_emit_pipeline_sync */
863 12 + /* cik_sdma_ring_emit_vm_flush */
864 9 + 9 + 9; /* cik_sdma_ring_emit_fence x3 for user fence, vm fence */
865}
866
890static void cik_enable_sdma_mgcg(struct amdgpu_device *adev, 867static void cik_enable_sdma_mgcg(struct amdgpu_device *adev,
891 bool enable) 868 bool enable)
892{ 869{
@@ -1262,6 +1239,8 @@ static const struct amdgpu_ring_funcs cik_sdma_ring_funcs = {
1262 .test_ib = cik_sdma_ring_test_ib, 1239 .test_ib = cik_sdma_ring_test_ib,
1263 .insert_nop = cik_sdma_ring_insert_nop, 1240 .insert_nop = cik_sdma_ring_insert_nop,
1264 .pad_ib = cik_sdma_ring_pad_ib, 1241 .pad_ib = cik_sdma_ring_pad_ib,
1242 .get_emit_ib_size = cik_sdma_ring_get_emit_ib_size,
1243 .get_dma_frame_size = cik_sdma_ring_get_dma_frame_size,
1265}; 1244};
1266 1245
1267static void cik_sdma_set_ring_funcs(struct amdgpu_device *adev) 1246static void cik_sdma_set_ring_funcs(struct amdgpu_device *adev)
diff --git a/drivers/gpu/drm/amd/amdgpu/cikd.h b/drivers/gpu/drm/amd/amdgpu/cikd.h
index c4f6f00d62bc..8659852aea9e 100644
--- a/drivers/gpu/drm/amd/amdgpu/cikd.h
+++ b/drivers/gpu/drm/amd/amdgpu/cikd.h
@@ -562,4 +562,40 @@ enum {
562 MTYPE_NONCACHED = 3 562 MTYPE_NONCACHED = 3
563}; 563};
564 564
565/* mmPA_SC_RASTER_CONFIG mask */
566#define RB_MAP_PKR0(x) ((x) << 0)
567#define RB_MAP_PKR0_MASK (0x3 << 0)
568#define RB_MAP_PKR1(x) ((x) << 2)
569#define RB_MAP_PKR1_MASK (0x3 << 2)
570#define RB_XSEL2(x) ((x) << 4)
571#define RB_XSEL2_MASK (0x3 << 4)
572#define RB_XSEL (1 << 6)
573#define RB_YSEL (1 << 7)
574#define PKR_MAP(x) ((x) << 8)
575#define PKR_MAP_MASK (0x3 << 8)
576#define PKR_XSEL(x) ((x) << 10)
577#define PKR_XSEL_MASK (0x3 << 10)
578#define PKR_YSEL(x) ((x) << 12)
579#define PKR_YSEL_MASK (0x3 << 12)
580#define SC_MAP(x) ((x) << 16)
581#define SC_MAP_MASK (0x3 << 16)
582#define SC_XSEL(x) ((x) << 18)
583#define SC_XSEL_MASK (0x3 << 18)
584#define SC_YSEL(x) ((x) << 20)
585#define SC_YSEL_MASK (0x3 << 20)
586#define SE_MAP(x) ((x) << 24)
587#define SE_MAP_MASK (0x3 << 24)
588#define SE_XSEL(x) ((x) << 26)
589#define SE_XSEL_MASK (0x3 << 26)
590#define SE_YSEL(x) ((x) << 28)
591#define SE_YSEL_MASK (0x3 << 28)
592
593/* mmPA_SC_RASTER_CONFIG_1 mask */
594#define SE_PAIR_MAP(x) ((x) << 0)
595#define SE_PAIR_MAP_MASK (0x3 << 0)
596#define SE_PAIR_XSEL(x) ((x) << 2)
597#define SE_PAIR_XSEL_MASK (0x3 << 2)
598#define SE_PAIR_YSEL(x) ((x) << 4)
599#define SE_PAIR_YSEL_MASK (0x3 << 4)
600
565#endif 601#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c
index 2a11413ed54a..f80a0834e889 100644
--- a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c
+++ b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c
@@ -44,6 +44,7 @@
44 44
45static void cz_dpm_powergate_uvd(struct amdgpu_device *adev, bool gate); 45static void cz_dpm_powergate_uvd(struct amdgpu_device *adev, bool gate);
46static void cz_dpm_powergate_vce(struct amdgpu_device *adev, bool gate); 46static void cz_dpm_powergate_vce(struct amdgpu_device *adev, bool gate);
47static void cz_dpm_fini(struct amdgpu_device *adev);
47 48
48static struct cz_ps *cz_get_ps(struct amdgpu_ps *rps) 49static struct cz_ps *cz_get_ps(struct amdgpu_ps *rps)
49{ 50{
@@ -350,6 +351,8 @@ static int cz_parse_power_table(struct amdgpu_device *adev)
350 351
351 ps = kzalloc(sizeof(struct cz_ps), GFP_KERNEL); 352 ps = kzalloc(sizeof(struct cz_ps), GFP_KERNEL);
352 if (ps == NULL) { 353 if (ps == NULL) {
354 for (j = 0; j < i; j++)
355 kfree(adev->pm.dpm.ps[j].ps_priv);
353 kfree(adev->pm.dpm.ps); 356 kfree(adev->pm.dpm.ps);
354 return -ENOMEM; 357 return -ENOMEM;
355 } 358 }
@@ -409,11 +412,11 @@ static int cz_dpm_init(struct amdgpu_device *adev)
409 412
410 ret = amdgpu_get_platform_caps(adev); 413 ret = amdgpu_get_platform_caps(adev);
411 if (ret) 414 if (ret)
412 return ret; 415 goto err;
413 416
414 ret = amdgpu_parse_extended_power_table(adev); 417 ret = amdgpu_parse_extended_power_table(adev);
415 if (ret) 418 if (ret)
416 return ret; 419 goto err;
417 420
418 pi->sram_end = SMC_RAM_END; 421 pi->sram_end = SMC_RAM_END;
419 422
@@ -435,7 +438,11 @@ static int cz_dpm_init(struct amdgpu_device *adev)
435 pi->caps_td_ramping = true; 438 pi->caps_td_ramping = true;
436 pi->caps_tcp_ramping = true; 439 pi->caps_tcp_ramping = true;
437 } 440 }
438 pi->caps_sclk_ds = true; 441 if (amdgpu_sclk_deep_sleep_en)
442 pi->caps_sclk_ds = true;
443 else
444 pi->caps_sclk_ds = false;
445
439 pi->voting_clients = 0x00c00033; 446 pi->voting_clients = 0x00c00033;
440 pi->auto_thermal_throttling_enabled = true; 447 pi->auto_thermal_throttling_enabled = true;
441 pi->bapm_enabled = false; 448 pi->bapm_enabled = false;
@@ -463,23 +470,26 @@ static int cz_dpm_init(struct amdgpu_device *adev)
463 470
464 ret = cz_parse_sys_info_table(adev); 471 ret = cz_parse_sys_info_table(adev);
465 if (ret) 472 if (ret)
466 return ret; 473 goto err;
467 474
468 cz_patch_voltage_values(adev); 475 cz_patch_voltage_values(adev);
469 cz_construct_boot_state(adev); 476 cz_construct_boot_state(adev);
470 477
471 ret = cz_parse_power_table(adev); 478 ret = cz_parse_power_table(adev);
472 if (ret) 479 if (ret)
473 return ret; 480 goto err;
474 481
475 ret = cz_process_firmware_header(adev); 482 ret = cz_process_firmware_header(adev);
476 if (ret) 483 if (ret)
477 return ret; 484 goto err;
478 485
479 pi->dpm_enabled = true; 486 pi->dpm_enabled = true;
480 pi->uvd_dynamic_pg = false; 487 pi->uvd_dynamic_pg = false;
481 488
482 return 0; 489 return 0;
490err:
491 cz_dpm_fini(adev);
492 return ret;
483} 493}
484 494
485static void cz_dpm_fini(struct amdgpu_device *adev) 495static void cz_dpm_fini(struct amdgpu_device *adev)
@@ -668,17 +678,12 @@ static void cz_reset_ap_mask(struct amdgpu_device *adev)
668 struct cz_power_info *pi = cz_get_pi(adev); 678 struct cz_power_info *pi = cz_get_pi(adev);
669 679
670 pi->active_process_mask = 0; 680 pi->active_process_mask = 0;
671
672} 681}
673 682
674static int cz_dpm_download_pptable_from_smu(struct amdgpu_device *adev, 683static int cz_dpm_download_pptable_from_smu(struct amdgpu_device *adev,
675 void **table) 684 void **table)
676{ 685{
677 int ret = 0; 686 return cz_smu_download_pptable(adev, table);
678
679 ret = cz_smu_download_pptable(adev, table);
680
681 return ret;
682} 687}
683 688
684static int cz_dpm_upload_pptable_to_smu(struct amdgpu_device *adev) 689static int cz_dpm_upload_pptable_to_smu(struct amdgpu_device *adev)
@@ -818,9 +823,9 @@ static void cz_init_sclk_limit(struct amdgpu_device *adev)
818 pi->sclk_dpm.hard_min_clk = 0; 823 pi->sclk_dpm.hard_min_clk = 0;
819 cz_send_msg_to_smc(adev, PPSMC_MSG_GetMaxSclkLevel); 824 cz_send_msg_to_smc(adev, PPSMC_MSG_GetMaxSclkLevel);
820 level = cz_get_argument(adev); 825 level = cz_get_argument(adev);
821 if (level < table->count) 826 if (level < table->count) {
822 clock = table->entries[level].clk; 827 clock = table->entries[level].clk;
823 else { 828 } else {
824 DRM_ERROR("Invalid SLCK Voltage Dependency table entry.\n"); 829 DRM_ERROR("Invalid SLCK Voltage Dependency table entry.\n");
825 clock = table->entries[table->count - 1].clk; 830 clock = table->entries[table->count - 1].clk;
826 } 831 }
@@ -846,9 +851,9 @@ static void cz_init_uvd_limit(struct amdgpu_device *adev)
846 pi->uvd_dpm.hard_min_clk = 0; 851 pi->uvd_dpm.hard_min_clk = 0;
847 cz_send_msg_to_smc(adev, PPSMC_MSG_GetMaxUvdLevel); 852 cz_send_msg_to_smc(adev, PPSMC_MSG_GetMaxUvdLevel);
848 level = cz_get_argument(adev); 853 level = cz_get_argument(adev);
849 if (level < table->count) 854 if (level < table->count) {
850 clock = table->entries[level].vclk; 855 clock = table->entries[level].vclk;
851 else { 856 } else {
852 DRM_ERROR("Invalid UVD Voltage Dependency table entry.\n"); 857 DRM_ERROR("Invalid UVD Voltage Dependency table entry.\n");
853 clock = table->entries[table->count - 1].vclk; 858 clock = table->entries[table->count - 1].vclk;
854 } 859 }
@@ -874,9 +879,9 @@ static void cz_init_vce_limit(struct amdgpu_device *adev)
874 pi->vce_dpm.hard_min_clk = table->entries[0].ecclk; 879 pi->vce_dpm.hard_min_clk = table->entries[0].ecclk;
875 cz_send_msg_to_smc(adev, PPSMC_MSG_GetMaxEclkLevel); 880 cz_send_msg_to_smc(adev, PPSMC_MSG_GetMaxEclkLevel);
876 level = cz_get_argument(adev); 881 level = cz_get_argument(adev);
877 if (level < table->count) 882 if (level < table->count) {
878 clock = table->entries[level].ecclk; 883 clock = table->entries[level].ecclk;
879 else { 884 } else {
880 /* future BIOS would fix this error */ 885 /* future BIOS would fix this error */
881 DRM_ERROR("Invalid VCE Voltage Dependency table entry.\n"); 886 DRM_ERROR("Invalid VCE Voltage Dependency table entry.\n");
882 clock = table->entries[table->count - 1].ecclk; 887 clock = table->entries[table->count - 1].ecclk;
@@ -903,9 +908,9 @@ static void cz_init_acp_limit(struct amdgpu_device *adev)
903 pi->acp_dpm.hard_min_clk = 0; 908 pi->acp_dpm.hard_min_clk = 0;
904 cz_send_msg_to_smc(adev, PPSMC_MSG_GetMaxAclkLevel); 909 cz_send_msg_to_smc(adev, PPSMC_MSG_GetMaxAclkLevel);
905 level = cz_get_argument(adev); 910 level = cz_get_argument(adev);
906 if (level < table->count) 911 if (level < table->count) {
907 clock = table->entries[level].clk; 912 clock = table->entries[level].clk;
908 else { 913 } else {
909 DRM_ERROR("Invalid ACP Voltage Dependency table entry.\n"); 914 DRM_ERROR("Invalid ACP Voltage Dependency table entry.\n");
910 clock = table->entries[table->count - 1].clk; 915 clock = table->entries[table->count - 1].clk;
911 } 916 }
@@ -930,7 +935,6 @@ static void cz_init_sclk_threshold(struct amdgpu_device *adev)
930 struct cz_power_info *pi = cz_get_pi(adev); 935 struct cz_power_info *pi = cz_get_pi(adev);
931 936
932 pi->low_sclk_interrupt_threshold = 0; 937 pi->low_sclk_interrupt_threshold = 0;
933
934} 938}
935 939
936static void cz_dpm_setup_asic(struct amdgpu_device *adev) 940static void cz_dpm_setup_asic(struct amdgpu_device *adev)
@@ -1203,7 +1207,7 @@ static int cz_enable_didt(struct amdgpu_device *adev, bool enable)
1203 int ret; 1207 int ret;
1204 1208
1205 if (pi->caps_sq_ramping || pi->caps_db_ramping || 1209 if (pi->caps_sq_ramping || pi->caps_db_ramping ||
1206 pi->caps_td_ramping || pi->caps_tcp_ramping) { 1210 pi->caps_td_ramping || pi->caps_tcp_ramping) {
1207 if (adev->gfx.gfx_current_status != AMDGPU_GFX_SAFE_MODE) { 1211 if (adev->gfx.gfx_current_status != AMDGPU_GFX_SAFE_MODE) {
1208 ret = cz_disable_cgpg(adev); 1212 ret = cz_disable_cgpg(adev);
1209 if (ret) { 1213 if (ret) {
@@ -1277,7 +1281,7 @@ static void cz_apply_state_adjust_rules(struct amdgpu_device *adev,
1277 ps->force_high = false; 1281 ps->force_high = false;
1278 ps->need_dfs_bypass = true; 1282 ps->need_dfs_bypass = true;
1279 pi->video_start = new_rps->dclk || new_rps->vclk || 1283 pi->video_start = new_rps->dclk || new_rps->vclk ||
1280 new_rps->evclk || new_rps->ecclk; 1284 new_rps->evclk || new_rps->ecclk;
1281 1285
1282 if ((new_rps->class & ATOM_PPLIB_CLASSIFICATION_UI_MASK) == 1286 if ((new_rps->class & ATOM_PPLIB_CLASSIFICATION_UI_MASK) ==
1283 ATOM_PPLIB_CLASSIFICATION_UI_BATTERY) 1287 ATOM_PPLIB_CLASSIFICATION_UI_BATTERY)
@@ -1335,7 +1339,6 @@ static int cz_dpm_enable(struct amdgpu_device *adev)
1335 } 1339 }
1336 1340
1337 cz_reset_acp_boot_level(adev); 1341 cz_reset_acp_boot_level(adev);
1338
1339 cz_update_current_ps(adev, adev->pm.dpm.boot_ps); 1342 cz_update_current_ps(adev, adev->pm.dpm.boot_ps);
1340 1343
1341 return 0; 1344 return 0;
@@ -1665,7 +1668,6 @@ static void cz_dpm_post_set_power_state(struct amdgpu_device *adev)
1665 struct amdgpu_ps *ps = &pi->requested_rps; 1668 struct amdgpu_ps *ps = &pi->requested_rps;
1666 1669
1667 cz_update_current_ps(adev, ps); 1670 cz_update_current_ps(adev, ps);
1668
1669} 1671}
1670 1672
1671static int cz_dpm_force_highest(struct amdgpu_device *adev) 1673static int cz_dpm_force_highest(struct amdgpu_device *adev)
@@ -2108,29 +2110,58 @@ static void cz_dpm_powergate_uvd(struct amdgpu_device *adev, bool gate)
2108 /* disable clockgating so we can properly shut down the block */ 2110 /* disable clockgating so we can properly shut down the block */
2109 ret = amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_UVD, 2111 ret = amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
2110 AMD_CG_STATE_UNGATE); 2112 AMD_CG_STATE_UNGATE);
2113 if (ret) {
2114 DRM_ERROR("UVD DPM Power Gating failed to set clockgating state\n");
2115 return;
2116 }
2117
2111 /* shutdown the UVD block */ 2118 /* shutdown the UVD block */
2112 ret = amdgpu_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_UVD, 2119 ret = amdgpu_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
2113 AMD_PG_STATE_GATE); 2120 AMD_PG_STATE_GATE);
2114 /* XXX: check for errors */ 2121
2122 if (ret) {
2123 DRM_ERROR("UVD DPM Power Gating failed to set powergating state\n");
2124 return;
2125 }
2115 } 2126 }
2116 cz_update_uvd_dpm(adev, gate); 2127 cz_update_uvd_dpm(adev, gate);
2117 if (pi->caps_uvd_pg) 2128 if (pi->caps_uvd_pg) {
2118 /* power off the UVD block */ 2129 /* power off the UVD block */
2119 cz_send_msg_to_smc(adev, PPSMC_MSG_UVDPowerOFF); 2130 ret = cz_send_msg_to_smc(adev, PPSMC_MSG_UVDPowerOFF);
2131 if (ret) {
2132 DRM_ERROR("UVD DPM Power Gating failed to send SMU PowerOFF message\n");
2133 return;
2134 }
2135 }
2120 } else { 2136 } else {
2121 if (pi->caps_uvd_pg) { 2137 if (pi->caps_uvd_pg) {
2122 /* power on the UVD block */ 2138 /* power on the UVD block */
2123 if (pi->uvd_dynamic_pg) 2139 if (pi->uvd_dynamic_pg)
2124 cz_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_UVDPowerON, 1); 2140 ret = cz_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_UVDPowerON, 1);
2125 else 2141 else
2126 cz_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_UVDPowerON, 0); 2142 ret = cz_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_UVDPowerON, 0);
2143
2144 if (ret) {
2145 DRM_ERROR("UVD DPM Power Gating Failed to send SMU PowerON message\n");
2146 return;
2147 }
2148
2127 /* re-init the UVD block */ 2149 /* re-init the UVD block */
2128 ret = amdgpu_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_UVD, 2150 ret = amdgpu_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
2129 AMD_PG_STATE_UNGATE); 2151 AMD_PG_STATE_UNGATE);
2152
2153 if (ret) {
2154 DRM_ERROR("UVD DPM Power Gating Failed to set powergating state\n");
2155 return;
2156 }
2157
2130 /* enable clockgating. hw will dynamically gate/ungate clocks on the fly */ 2158 /* enable clockgating. hw will dynamically gate/ungate clocks on the fly */
2131 ret = amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_UVD, 2159 ret = amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
2132 AMD_CG_STATE_GATE); 2160 AMD_CG_STATE_GATE);
2133 /* XXX: check for errors */ 2161 if (ret) {
2162 DRM_ERROR("UVD DPM Power Gating Failed to set clockgating state\n");
2163 return;
2164 }
2134 } 2165 }
2135 cz_update_uvd_dpm(adev, gate); 2166 cz_update_uvd_dpm(adev, gate);
2136 } 2167 }
@@ -2168,7 +2199,6 @@ static int cz_update_vce_dpm(struct amdgpu_device *adev)
2168 /* Stable Pstate is enabled and we need to set the VCE DPM to highest level */ 2199 /* Stable Pstate is enabled and we need to set the VCE DPM to highest level */
2169 if (pi->caps_stable_power_state) { 2200 if (pi->caps_stable_power_state) {
2170 pi->vce_dpm.hard_min_clk = table->entries[table->count-1].ecclk; 2201 pi->vce_dpm.hard_min_clk = table->entries[table->count-1].ecclk;
2171
2172 } else { /* non-stable p-state cases. without vce.Arbiter.EcclkHardMin */ 2202 } else { /* non-stable p-state cases. without vce.Arbiter.EcclkHardMin */
2173 /* leave it as set by user */ 2203 /* leave it as set by user */
2174 /*pi->vce_dpm.hard_min_clk = table->entries[0].ecclk;*/ 2204 /*pi->vce_dpm.hard_min_clk = table->entries[0].ecclk;*/
diff --git a/drivers/gpu/drm/amd/amdgpu/cz_smc.c b/drivers/gpu/drm/amd/amdgpu/cz_smc.c
index ac7fee7b7eca..aed7033c0973 100644
--- a/drivers/gpu/drm/amd/amdgpu/cz_smc.c
+++ b/drivers/gpu/drm/amd/amdgpu/cz_smc.c
@@ -29,6 +29,8 @@
29#include "cz_smumgr.h" 29#include "cz_smumgr.h"
30#include "smu_ucode_xfer_cz.h" 30#include "smu_ucode_xfer_cz.h"
31#include "amdgpu_ucode.h" 31#include "amdgpu_ucode.h"
32#include "cz_dpm.h"
33#include "vi_dpm.h"
32 34
33#include "smu/smu_8_0_d.h" 35#include "smu/smu_8_0_d.h"
34#include "smu/smu_8_0_sh_mask.h" 36#include "smu/smu_8_0_sh_mask.h"
@@ -48,7 +50,7 @@ static struct cz_smu_private_data *cz_smu_get_priv(struct amdgpu_device *adev)
48 return priv; 50 return priv;
49} 51}
50 52
51int cz_send_msg_to_smc_async(struct amdgpu_device *adev, u16 msg) 53static int cz_send_msg_to_smc_async(struct amdgpu_device *adev, u16 msg)
52{ 54{
53 int i; 55 int i;
54 u32 content = 0, tmp; 56 u32 content = 0, tmp;
@@ -99,13 +101,6 @@ int cz_send_msg_to_smc(struct amdgpu_device *adev, u16 msg)
99 return 0; 101 return 0;
100} 102}
101 103
102int cz_send_msg_to_smc_with_parameter_async(struct amdgpu_device *adev,
103 u16 msg, u32 parameter)
104{
105 WREG32(mmSMU_MP1_SRBM2P_ARG_0, parameter);
106 return cz_send_msg_to_smc_async(adev, msg);
107}
108
109int cz_send_msg_to_smc_with_parameter(struct amdgpu_device *adev, 104int cz_send_msg_to_smc_with_parameter(struct amdgpu_device *adev,
110 u16 msg, u32 parameter) 105 u16 msg, u32 parameter)
111{ 106{
@@ -140,7 +135,7 @@ int cz_read_smc_sram_dword(struct amdgpu_device *adev, u32 smc_address,
140 return 0; 135 return 0;
141} 136}
142 137
143int cz_write_smc_sram_dword(struct amdgpu_device *adev, u32 smc_address, 138static int cz_write_smc_sram_dword(struct amdgpu_device *adev, u32 smc_address,
144 u32 value, u32 limit) 139 u32 value, u32 limit)
145{ 140{
146 int ret; 141 int ret;
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
index c1b04e9aab57..613ebb7ed50f 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
@@ -221,7 +221,7 @@ static bool dce_v10_0_is_counter_moving(struct amdgpu_device *adev, int crtc)
221 */ 221 */
222static void dce_v10_0_vblank_wait(struct amdgpu_device *adev, int crtc) 222static void dce_v10_0_vblank_wait(struct amdgpu_device *adev, int crtc)
223{ 223{
224 unsigned i = 0; 224 unsigned i = 100;
225 225
226 if (crtc >= adev->mode_info.num_crtc) 226 if (crtc >= adev->mode_info.num_crtc)
227 return; 227 return;
@@ -233,14 +233,16 @@ static void dce_v10_0_vblank_wait(struct amdgpu_device *adev, int crtc)
233 * wait for another frame. 233 * wait for another frame.
234 */ 234 */
235 while (dce_v10_0_is_in_vblank(adev, crtc)) { 235 while (dce_v10_0_is_in_vblank(adev, crtc)) {
236 if (i++ % 100 == 0) { 236 if (i++ == 100) {
237 i = 0;
237 if (!dce_v10_0_is_counter_moving(adev, crtc)) 238 if (!dce_v10_0_is_counter_moving(adev, crtc))
238 break; 239 break;
239 } 240 }
240 } 241 }
241 242
242 while (!dce_v10_0_is_in_vblank(adev, crtc)) { 243 while (!dce_v10_0_is_in_vblank(adev, crtc)) {
243 if (i++ % 100 == 0) { 244 if (i++ == 100) {
245 i = 0;
244 if (!dce_v10_0_is_counter_moving(adev, crtc)) 246 if (!dce_v10_0_is_counter_moving(adev, crtc))
245 break; 247 break;
246 } 248 }
@@ -425,16 +427,6 @@ static void dce_v10_0_hpd_init(struct amdgpu_device *adev)
425 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 427 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
426 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 428 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
427 429
428 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
429 connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
430 /* don't try to enable hpd on eDP or LVDS avoid breaking the
431 * aux dp channel on imac and help (but not completely fix)
432 * https://bugzilla.redhat.com/show_bug.cgi?id=726143
433 * also avoid interrupt storms during dpms.
434 */
435 continue;
436 }
437
438 switch (amdgpu_connector->hpd.hpd) { 430 switch (amdgpu_connector->hpd.hpd) {
439 case AMDGPU_HPD_1: 431 case AMDGPU_HPD_1:
440 idx = 0; 432 idx = 0;
@@ -458,6 +450,19 @@ static void dce_v10_0_hpd_init(struct amdgpu_device *adev)
458 continue; 450 continue;
459 } 451 }
460 452
453 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
454 connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
455 /* don't try to enable hpd on eDP or LVDS avoid breaking the
456 * aux dp channel on imac and help (but not completely fix)
457 * https://bugzilla.redhat.com/show_bug.cgi?id=726143
458 * also avoid interrupt storms during dpms.
459 */
460 tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx]);
461 tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_EN, 0);
462 WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx], tmp);
463 continue;
464 }
465
461 tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[idx]); 466 tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[idx]);
462 tmp = REG_SET_FIELD(tmp, DC_HPD_CONTROL, DC_HPD_EN, 1); 467 tmp = REG_SET_FIELD(tmp, DC_HPD_CONTROL, DC_HPD_EN, 1);
463 WREG32(mmDC_HPD_CONTROL + hpd_offsets[idx], tmp); 468 WREG32(mmDC_HPD_CONTROL + hpd_offsets[idx], tmp);
@@ -646,8 +651,8 @@ static void dce_v10_0_resume_mc_access(struct amdgpu_device *adev,
646 651
647 if (save->crtc_enabled[i]) { 652 if (save->crtc_enabled[i]) {
648 tmp = RREG32(mmMASTER_UPDATE_MODE + crtc_offsets[i]); 653 tmp = RREG32(mmMASTER_UPDATE_MODE + crtc_offsets[i]);
649 if (REG_GET_FIELD(tmp, MASTER_UPDATE_MODE, MASTER_UPDATE_MODE) != 3) { 654 if (REG_GET_FIELD(tmp, MASTER_UPDATE_MODE, MASTER_UPDATE_MODE) != 0) {
650 tmp = REG_SET_FIELD(tmp, MASTER_UPDATE_MODE, MASTER_UPDATE_MODE, 3); 655 tmp = REG_SET_FIELD(tmp, MASTER_UPDATE_MODE, MASTER_UPDATE_MODE, 0);
651 WREG32(mmMASTER_UPDATE_MODE + crtc_offsets[i], tmp); 656 WREG32(mmMASTER_UPDATE_MODE + crtc_offsets[i], tmp);
652 } 657 }
653 tmp = RREG32(mmGRPH_UPDATE + crtc_offsets[i]); 658 tmp = RREG32(mmGRPH_UPDATE + crtc_offsets[i]);
@@ -712,6 +717,45 @@ static void dce_v10_0_set_vga_render_state(struct amdgpu_device *adev,
712 WREG32(mmVGA_RENDER_CONTROL, tmp); 717 WREG32(mmVGA_RENDER_CONTROL, tmp);
713} 718}
714 719
720static int dce_v10_0_get_num_crtc(struct amdgpu_device *adev)
721{
722 int num_crtc = 0;
723
724 switch (adev->asic_type) {
725 case CHIP_FIJI:
726 case CHIP_TONGA:
727 num_crtc = 6;
728 break;
729 default:
730 num_crtc = 0;
731 }
732 return num_crtc;
733}
734
735void dce_v10_0_disable_dce(struct amdgpu_device *adev)
736{
737 /*Disable VGA render and enabled crtc, if has DCE engine*/
738 if (amdgpu_atombios_has_dce_engine_info(adev)) {
739 u32 tmp;
740 int crtc_enabled, i;
741
742 dce_v10_0_set_vga_render_state(adev, false);
743
744 /*Disable crtc*/
745 for (i = 0; i < dce_v10_0_get_num_crtc(adev); i++) {
746 crtc_enabled = REG_GET_FIELD(RREG32(mmCRTC_CONTROL + crtc_offsets[i]),
747 CRTC_CONTROL, CRTC_MASTER_EN);
748 if (crtc_enabled) {
749 WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 1);
750 tmp = RREG32(mmCRTC_CONTROL + crtc_offsets[i]);
751 tmp = REG_SET_FIELD(tmp, CRTC_CONTROL, CRTC_MASTER_EN, 0);
752 WREG32(mmCRTC_CONTROL + crtc_offsets[i], tmp);
753 WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 0);
754 }
755 }
756 }
757}
758
715static void dce_v10_0_program_fmt(struct drm_encoder *encoder) 759static void dce_v10_0_program_fmt(struct drm_encoder *encoder)
716{ 760{
717 struct drm_device *dev = encoder->dev; 761 struct drm_device *dev = encoder->dev;
@@ -2063,7 +2107,7 @@ static int dce_v10_0_crtc_do_set_base(struct drm_crtc *crtc,
2063 struct amdgpu_framebuffer *amdgpu_fb; 2107 struct amdgpu_framebuffer *amdgpu_fb;
2064 struct drm_framebuffer *target_fb; 2108 struct drm_framebuffer *target_fb;
2065 struct drm_gem_object *obj; 2109 struct drm_gem_object *obj;
2066 struct amdgpu_bo *rbo; 2110 struct amdgpu_bo *abo;
2067 uint64_t fb_location, tiling_flags; 2111 uint64_t fb_location, tiling_flags;
2068 uint32_t fb_format, fb_pitch_pixels; 2112 uint32_t fb_format, fb_pitch_pixels;
2069 u32 fb_swap = REG_SET_FIELD(0, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP, ENDIAN_NONE); 2113 u32 fb_swap = REG_SET_FIELD(0, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP, ENDIAN_NONE);
@@ -2071,6 +2115,7 @@ static int dce_v10_0_crtc_do_set_base(struct drm_crtc *crtc,
2071 u32 tmp, viewport_w, viewport_h; 2115 u32 tmp, viewport_w, viewport_h;
2072 int r; 2116 int r;
2073 bool bypass_lut = false; 2117 bool bypass_lut = false;
2118 char *format_name;
2074 2119
2075 /* no fb bound */ 2120 /* no fb bound */
2076 if (!atomic && !crtc->primary->fb) { 2121 if (!atomic && !crtc->primary->fb) {
@@ -2090,23 +2135,23 @@ static int dce_v10_0_crtc_do_set_base(struct drm_crtc *crtc,
2090 * just update base pointers 2135 * just update base pointers
2091 */ 2136 */
2092 obj = amdgpu_fb->obj; 2137 obj = amdgpu_fb->obj;
2093 rbo = gem_to_amdgpu_bo(obj); 2138 abo = gem_to_amdgpu_bo(obj);
2094 r = amdgpu_bo_reserve(rbo, false); 2139 r = amdgpu_bo_reserve(abo, false);
2095 if (unlikely(r != 0)) 2140 if (unlikely(r != 0))
2096 return r; 2141 return r;
2097 2142
2098 if (atomic) { 2143 if (atomic) {
2099 fb_location = amdgpu_bo_gpu_offset(rbo); 2144 fb_location = amdgpu_bo_gpu_offset(abo);
2100 } else { 2145 } else {
2101 r = amdgpu_bo_pin(rbo, AMDGPU_GEM_DOMAIN_VRAM, &fb_location); 2146 r = amdgpu_bo_pin(abo, AMDGPU_GEM_DOMAIN_VRAM, &fb_location);
2102 if (unlikely(r != 0)) { 2147 if (unlikely(r != 0)) {
2103 amdgpu_bo_unreserve(rbo); 2148 amdgpu_bo_unreserve(abo);
2104 return -EINVAL; 2149 return -EINVAL;
2105 } 2150 }
2106 } 2151 }
2107 2152
2108 amdgpu_bo_get_tiling_flags(rbo, &tiling_flags); 2153 amdgpu_bo_get_tiling_flags(abo, &tiling_flags);
2109 amdgpu_bo_unreserve(rbo); 2154 amdgpu_bo_unreserve(abo);
2110 2155
2111 pipe_config = AMDGPU_TILING_GET(tiling_flags, PIPE_CONFIG); 2156 pipe_config = AMDGPU_TILING_GET(tiling_flags, PIPE_CONFIG);
2112 2157
@@ -2182,8 +2227,9 @@ static int dce_v10_0_crtc_do_set_base(struct drm_crtc *crtc,
2182 bypass_lut = true; 2227 bypass_lut = true;
2183 break; 2228 break;
2184 default: 2229 default:
2185 DRM_ERROR("Unsupported screen format %s\n", 2230 format_name = drm_get_format_name(target_fb->pixel_format);
2186 drm_get_format_name(target_fb->pixel_format)); 2231 DRM_ERROR("Unsupported screen format %s\n", format_name);
2232 kfree(format_name);
2187 return -EINVAL; 2233 return -EINVAL;
2188 } 2234 }
2189 2235
@@ -2275,17 +2321,17 @@ static int dce_v10_0_crtc_do_set_base(struct drm_crtc *crtc,
2275 WREG32(mmVIEWPORT_SIZE + amdgpu_crtc->crtc_offset, 2321 WREG32(mmVIEWPORT_SIZE + amdgpu_crtc->crtc_offset,
2276 (viewport_w << 16) | viewport_h); 2322 (viewport_w << 16) | viewport_h);
2277 2323
2278 /* set pageflip to happen only at start of vblank interval (front porch) */ 2324 /* set pageflip to happen anywhere in vblank interval */
2279 WREG32(mmMASTER_UPDATE_MODE + amdgpu_crtc->crtc_offset, 3); 2325 WREG32(mmMASTER_UPDATE_MODE + amdgpu_crtc->crtc_offset, 0);
2280 2326
2281 if (!atomic && fb && fb != crtc->primary->fb) { 2327 if (!atomic && fb && fb != crtc->primary->fb) {
2282 amdgpu_fb = to_amdgpu_framebuffer(fb); 2328 amdgpu_fb = to_amdgpu_framebuffer(fb);
2283 rbo = gem_to_amdgpu_bo(amdgpu_fb->obj); 2329 abo = gem_to_amdgpu_bo(amdgpu_fb->obj);
2284 r = amdgpu_bo_reserve(rbo, false); 2330 r = amdgpu_bo_reserve(abo, false);
2285 if (unlikely(r != 0)) 2331 if (unlikely(r != 0))
2286 return r; 2332 return r;
2287 amdgpu_bo_unpin(rbo); 2333 amdgpu_bo_unpin(abo);
2288 amdgpu_bo_unreserve(rbo); 2334 amdgpu_bo_unreserve(abo);
2289 } 2335 }
2290 2336
2291 /* Bytes per pixel may have changed */ 2337 /* Bytes per pixel may have changed */
@@ -2698,7 +2744,7 @@ static const struct drm_crtc_funcs dce_v10_0_crtc_funcs = {
2698 .gamma_set = dce_v10_0_crtc_gamma_set, 2744 .gamma_set = dce_v10_0_crtc_gamma_set,
2699 .set_config = amdgpu_crtc_set_config, 2745 .set_config = amdgpu_crtc_set_config,
2700 .destroy = dce_v10_0_crtc_destroy, 2746 .destroy = dce_v10_0_crtc_destroy,
2701 .page_flip = amdgpu_crtc_page_flip, 2747 .page_flip_target = amdgpu_crtc_page_flip_target,
2702}; 2748};
2703 2749
2704static void dce_v10_0_crtc_dpms(struct drm_crtc *crtc, int mode) 2750static void dce_v10_0_crtc_dpms(struct drm_crtc *crtc, int mode)
@@ -2765,16 +2811,16 @@ static void dce_v10_0_crtc_disable(struct drm_crtc *crtc)
2765 if (crtc->primary->fb) { 2811 if (crtc->primary->fb) {
2766 int r; 2812 int r;
2767 struct amdgpu_framebuffer *amdgpu_fb; 2813 struct amdgpu_framebuffer *amdgpu_fb;
2768 struct amdgpu_bo *rbo; 2814 struct amdgpu_bo *abo;
2769 2815
2770 amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb); 2816 amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb);
2771 rbo = gem_to_amdgpu_bo(amdgpu_fb->obj); 2817 abo = gem_to_amdgpu_bo(amdgpu_fb->obj);
2772 r = amdgpu_bo_reserve(rbo, false); 2818 r = amdgpu_bo_reserve(abo, false);
2773 if (unlikely(r)) 2819 if (unlikely(r))
2774 DRM_ERROR("failed to reserve rbo before unpin\n"); 2820 DRM_ERROR("failed to reserve abo before unpin\n");
2775 else { 2821 else {
2776 amdgpu_bo_unpin(rbo); 2822 amdgpu_bo_unpin(abo);
2777 amdgpu_bo_unreserve(rbo); 2823 amdgpu_bo_unreserve(abo);
2778 } 2824 }
2779 } 2825 }
2780 /* disable the GRPH */ 2826 /* disable the GRPH */
@@ -2962,10 +3008,11 @@ static int dce_v10_0_early_init(void *handle)
2962 dce_v10_0_set_display_funcs(adev); 3008 dce_v10_0_set_display_funcs(adev);
2963 dce_v10_0_set_irq_funcs(adev); 3009 dce_v10_0_set_irq_funcs(adev);
2964 3010
3011 adev->mode_info.num_crtc = dce_v10_0_get_num_crtc(adev);
3012
2965 switch (adev->asic_type) { 3013 switch (adev->asic_type) {
2966 case CHIP_FIJI: 3014 case CHIP_FIJI:
2967 case CHIP_TONGA: 3015 case CHIP_TONGA:
2968 adev->mode_info.num_crtc = 6; /* XXX 7??? */
2969 adev->mode_info.num_hpd = 6; 3016 adev->mode_info.num_hpd = 6;
2970 adev->mode_info.num_dig = 7; 3017 adev->mode_info.num_dig = 7;
2971 break; 3018 break;
@@ -3141,11 +3188,26 @@ static int dce_v10_0_wait_for_idle(void *handle)
3141 return 0; 3188 return 0;
3142} 3189}
3143 3190
3191static int dce_v10_0_check_soft_reset(void *handle)
3192{
3193 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
3194
3195 if (dce_v10_0_is_display_hung(adev))
3196 adev->ip_block_status[AMD_IP_BLOCK_TYPE_DCE].hang = true;
3197 else
3198 adev->ip_block_status[AMD_IP_BLOCK_TYPE_DCE].hang = false;
3199
3200 return 0;
3201}
3202
3144static int dce_v10_0_soft_reset(void *handle) 3203static int dce_v10_0_soft_reset(void *handle)
3145{ 3204{
3146 u32 srbm_soft_reset = 0, tmp; 3205 u32 srbm_soft_reset = 0, tmp;
3147 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 3206 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
3148 3207
3208 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_DCE].hang)
3209 return 0;
3210
3149 if (dce_v10_0_is_display_hung(adev)) 3211 if (dce_v10_0_is_display_hung(adev))
3150 srbm_soft_reset |= SRBM_SOFT_RESET__SOFT_RESET_DC_MASK; 3212 srbm_soft_reset |= SRBM_SOFT_RESET__SOFT_RESET_DC_MASK;
3151 3213
@@ -3512,6 +3574,7 @@ const struct amd_ip_funcs dce_v10_0_ip_funcs = {
3512 .resume = dce_v10_0_resume, 3574 .resume = dce_v10_0_resume,
3513 .is_idle = dce_v10_0_is_idle, 3575 .is_idle = dce_v10_0_is_idle,
3514 .wait_for_idle = dce_v10_0_wait_for_idle, 3576 .wait_for_idle = dce_v10_0_wait_for_idle,
3577 .check_soft_reset = dce_v10_0_check_soft_reset,
3515 .soft_reset = dce_v10_0_soft_reset, 3578 .soft_reset = dce_v10_0_soft_reset,
3516 .set_clockgating_state = dce_v10_0_set_clockgating_state, 3579 .set_clockgating_state = dce_v10_0_set_clockgating_state,
3517 .set_powergating_state = dce_v10_0_set_powergating_state, 3580 .set_powergating_state = dce_v10_0_set_powergating_state,
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.h b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.h
index 1bfa48ddd8a6..e3dc04d293e4 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.h
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.h
@@ -26,4 +26,6 @@
26 26
27extern const struct amd_ip_funcs dce_v10_0_ip_funcs; 27extern const struct amd_ip_funcs dce_v10_0_ip_funcs;
28 28
29void dce_v10_0_disable_dce(struct amdgpu_device *adev);
30
29#endif 31#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
index d4bf133908b1..f264b8f17ad1 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
@@ -443,16 +443,6 @@ static void dce_v11_0_hpd_init(struct amdgpu_device *adev)
443 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 443 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
444 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 444 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
445 445
446 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
447 connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
448 /* don't try to enable hpd on eDP or LVDS avoid breaking the
449 * aux dp channel on imac and help (but not completely fix)
450 * https://bugzilla.redhat.com/show_bug.cgi?id=726143
451 * also avoid interrupt storms during dpms.
452 */
453 continue;
454 }
455
456 switch (amdgpu_connector->hpd.hpd) { 446 switch (amdgpu_connector->hpd.hpd) {
457 case AMDGPU_HPD_1: 447 case AMDGPU_HPD_1:
458 idx = 0; 448 idx = 0;
@@ -476,6 +466,19 @@ static void dce_v11_0_hpd_init(struct amdgpu_device *adev)
476 continue; 466 continue;
477 } 467 }
478 468
469 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
470 connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
471 /* don't try to enable hpd on eDP or LVDS avoid breaking the
472 * aux dp channel on imac and help (but not completely fix)
473 * https://bugzilla.redhat.com/show_bug.cgi?id=726143
474 * also avoid interrupt storms during dpms.
475 */
476 tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx]);
477 tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_EN, 0);
478 WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx], tmp);
479 continue;
480 }
481
479 tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[idx]); 482 tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[idx]);
480 tmp = REG_SET_FIELD(tmp, DC_HPD_CONTROL, DC_HPD_EN, 1); 483 tmp = REG_SET_FIELD(tmp, DC_HPD_CONTROL, DC_HPD_EN, 1);
481 WREG32(mmDC_HPD_CONTROL + hpd_offsets[idx], tmp); 484 WREG32(mmDC_HPD_CONTROL + hpd_offsets[idx], tmp);
@@ -673,6 +676,53 @@ static void dce_v11_0_set_vga_render_state(struct amdgpu_device *adev,
673 WREG32(mmVGA_RENDER_CONTROL, tmp); 676 WREG32(mmVGA_RENDER_CONTROL, tmp);
674} 677}
675 678
679static int dce_v11_0_get_num_crtc (struct amdgpu_device *adev)
680{
681 int num_crtc = 0;
682
683 switch (adev->asic_type) {
684 case CHIP_CARRIZO:
685 num_crtc = 3;
686 break;
687 case CHIP_STONEY:
688 num_crtc = 2;
689 break;
690 case CHIP_POLARIS10:
691 num_crtc = 6;
692 break;
693 case CHIP_POLARIS11:
694 num_crtc = 5;
695 break;
696 default:
697 num_crtc = 0;
698 }
699 return num_crtc;
700}
701
702void dce_v11_0_disable_dce(struct amdgpu_device *adev)
703{
704 /*Disable VGA render and enabled crtc, if has DCE engine*/
705 if (amdgpu_atombios_has_dce_engine_info(adev)) {
706 u32 tmp;
707 int crtc_enabled, i;
708
709 dce_v11_0_set_vga_render_state(adev, false);
710
711 /*Disable crtc*/
712 for (i = 0; i < dce_v11_0_get_num_crtc(adev); i++) {
713 crtc_enabled = REG_GET_FIELD(RREG32(mmCRTC_CONTROL + crtc_offsets[i]),
714 CRTC_CONTROL, CRTC_MASTER_EN);
715 if (crtc_enabled) {
716 WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 1);
717 tmp = RREG32(mmCRTC_CONTROL + crtc_offsets[i]);
718 tmp = REG_SET_FIELD(tmp, CRTC_CONTROL, CRTC_MASTER_EN, 0);
719 WREG32(mmCRTC_CONTROL + crtc_offsets[i], tmp);
720 WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 0);
721 }
722 }
723 }
724}
725
676static void dce_v11_0_program_fmt(struct drm_encoder *encoder) 726static void dce_v11_0_program_fmt(struct drm_encoder *encoder)
677{ 727{
678 struct drm_device *dev = encoder->dev; 728 struct drm_device *dev = encoder->dev;
@@ -2038,7 +2088,7 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,
2038 struct amdgpu_framebuffer *amdgpu_fb; 2088 struct amdgpu_framebuffer *amdgpu_fb;
2039 struct drm_framebuffer *target_fb; 2089 struct drm_framebuffer *target_fb;
2040 struct drm_gem_object *obj; 2090 struct drm_gem_object *obj;
2041 struct amdgpu_bo *rbo; 2091 struct amdgpu_bo *abo;
2042 uint64_t fb_location, tiling_flags; 2092 uint64_t fb_location, tiling_flags;
2043 uint32_t fb_format, fb_pitch_pixels; 2093 uint32_t fb_format, fb_pitch_pixels;
2044 u32 fb_swap = REG_SET_FIELD(0, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP, ENDIAN_NONE); 2094 u32 fb_swap = REG_SET_FIELD(0, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP, ENDIAN_NONE);
@@ -2046,6 +2096,7 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,
2046 u32 tmp, viewport_w, viewport_h; 2096 u32 tmp, viewport_w, viewport_h;
2047 int r; 2097 int r;
2048 bool bypass_lut = false; 2098 bool bypass_lut = false;
2099 char *format_name;
2049 2100
2050 /* no fb bound */ 2101 /* no fb bound */
2051 if (!atomic && !crtc->primary->fb) { 2102 if (!atomic && !crtc->primary->fb) {
@@ -2065,23 +2116,23 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,
2065 * just update base pointers 2116 * just update base pointers
2066 */ 2117 */
2067 obj = amdgpu_fb->obj; 2118 obj = amdgpu_fb->obj;
2068 rbo = gem_to_amdgpu_bo(obj); 2119 abo = gem_to_amdgpu_bo(obj);
2069 r = amdgpu_bo_reserve(rbo, false); 2120 r = amdgpu_bo_reserve(abo, false);
2070 if (unlikely(r != 0)) 2121 if (unlikely(r != 0))
2071 return r; 2122 return r;
2072 2123
2073 if (atomic) { 2124 if (atomic) {
2074 fb_location = amdgpu_bo_gpu_offset(rbo); 2125 fb_location = amdgpu_bo_gpu_offset(abo);
2075 } else { 2126 } else {
2076 r = amdgpu_bo_pin(rbo, AMDGPU_GEM_DOMAIN_VRAM, &fb_location); 2127 r = amdgpu_bo_pin(abo, AMDGPU_GEM_DOMAIN_VRAM, &fb_location);
2077 if (unlikely(r != 0)) { 2128 if (unlikely(r != 0)) {
2078 amdgpu_bo_unreserve(rbo); 2129 amdgpu_bo_unreserve(abo);
2079 return -EINVAL; 2130 return -EINVAL;
2080 } 2131 }
2081 } 2132 }
2082 2133
2083 amdgpu_bo_get_tiling_flags(rbo, &tiling_flags); 2134 amdgpu_bo_get_tiling_flags(abo, &tiling_flags);
2084 amdgpu_bo_unreserve(rbo); 2135 amdgpu_bo_unreserve(abo);
2085 2136
2086 pipe_config = AMDGPU_TILING_GET(tiling_flags, PIPE_CONFIG); 2137 pipe_config = AMDGPU_TILING_GET(tiling_flags, PIPE_CONFIG);
2087 2138
@@ -2157,8 +2208,9 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,
2157 bypass_lut = true; 2208 bypass_lut = true;
2158 break; 2209 break;
2159 default: 2210 default:
2160 DRM_ERROR("Unsupported screen format %s\n", 2211 format_name = drm_get_format_name(target_fb->pixel_format);
2161 drm_get_format_name(target_fb->pixel_format)); 2212 DRM_ERROR("Unsupported screen format %s\n", format_name);
2213 kfree(format_name);
2162 return -EINVAL; 2214 return -EINVAL;
2163 } 2215 }
2164 2216
@@ -2250,17 +2302,17 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,
2250 WREG32(mmVIEWPORT_SIZE + amdgpu_crtc->crtc_offset, 2302 WREG32(mmVIEWPORT_SIZE + amdgpu_crtc->crtc_offset,
2251 (viewport_w << 16) | viewport_h); 2303 (viewport_w << 16) | viewport_h);
2252 2304
2253 /* set pageflip to happen only at start of vblank interval (front porch) */ 2305 /* set pageflip to happen anywhere in vblank interval */
2254 WREG32(mmCRTC_MASTER_UPDATE_MODE + amdgpu_crtc->crtc_offset, 3); 2306 WREG32(mmCRTC_MASTER_UPDATE_MODE + amdgpu_crtc->crtc_offset, 0);
2255 2307
2256 if (!atomic && fb && fb != crtc->primary->fb) { 2308 if (!atomic && fb && fb != crtc->primary->fb) {
2257 amdgpu_fb = to_amdgpu_framebuffer(fb); 2309 amdgpu_fb = to_amdgpu_framebuffer(fb);
2258 rbo = gem_to_amdgpu_bo(amdgpu_fb->obj); 2310 abo = gem_to_amdgpu_bo(amdgpu_fb->obj);
2259 r = amdgpu_bo_reserve(rbo, false); 2311 r = amdgpu_bo_reserve(abo, false);
2260 if (unlikely(r != 0)) 2312 if (unlikely(r != 0))
2261 return r; 2313 return r;
2262 amdgpu_bo_unpin(rbo); 2314 amdgpu_bo_unpin(abo);
2263 amdgpu_bo_unreserve(rbo); 2315 amdgpu_bo_unreserve(abo);
2264 } 2316 }
2265 2317
2266 /* Bytes per pixel may have changed */ 2318 /* Bytes per pixel may have changed */
@@ -2708,7 +2760,7 @@ static const struct drm_crtc_funcs dce_v11_0_crtc_funcs = {
2708 .gamma_set = dce_v11_0_crtc_gamma_set, 2760 .gamma_set = dce_v11_0_crtc_gamma_set,
2709 .set_config = amdgpu_crtc_set_config, 2761 .set_config = amdgpu_crtc_set_config,
2710 .destroy = dce_v11_0_crtc_destroy, 2762 .destroy = dce_v11_0_crtc_destroy,
2711 .page_flip = amdgpu_crtc_page_flip, 2763 .page_flip_target = amdgpu_crtc_page_flip_target,
2712}; 2764};
2713 2765
2714static void dce_v11_0_crtc_dpms(struct drm_crtc *crtc, int mode) 2766static void dce_v11_0_crtc_dpms(struct drm_crtc *crtc, int mode)
@@ -2775,16 +2827,16 @@ static void dce_v11_0_crtc_disable(struct drm_crtc *crtc)
2775 if (crtc->primary->fb) { 2827 if (crtc->primary->fb) {
2776 int r; 2828 int r;
2777 struct amdgpu_framebuffer *amdgpu_fb; 2829 struct amdgpu_framebuffer *amdgpu_fb;
2778 struct amdgpu_bo *rbo; 2830 struct amdgpu_bo *abo;
2779 2831
2780 amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb); 2832 amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb);
2781 rbo = gem_to_amdgpu_bo(amdgpu_fb->obj); 2833 abo = gem_to_amdgpu_bo(amdgpu_fb->obj);
2782 r = amdgpu_bo_reserve(rbo, false); 2834 r = amdgpu_bo_reserve(abo, false);
2783 if (unlikely(r)) 2835 if (unlikely(r))
2784 DRM_ERROR("failed to reserve rbo before unpin\n"); 2836 DRM_ERROR("failed to reserve abo before unpin\n");
2785 else { 2837 else {
2786 amdgpu_bo_unpin(rbo); 2838 amdgpu_bo_unpin(abo);
2787 amdgpu_bo_unreserve(rbo); 2839 amdgpu_bo_unreserve(abo);
2788 } 2840 }
2789 } 2841 }
2790 /* disable the GRPH */ 2842 /* disable the GRPH */
@@ -2999,24 +3051,22 @@ static int dce_v11_0_early_init(void *handle)
2999 dce_v11_0_set_display_funcs(adev); 3051 dce_v11_0_set_display_funcs(adev);
3000 dce_v11_0_set_irq_funcs(adev); 3052 dce_v11_0_set_irq_funcs(adev);
3001 3053
3054 adev->mode_info.num_crtc = dce_v11_0_get_num_crtc(adev);
3055
3002 switch (adev->asic_type) { 3056 switch (adev->asic_type) {
3003 case CHIP_CARRIZO: 3057 case CHIP_CARRIZO:
3004 adev->mode_info.num_crtc = 3;
3005 adev->mode_info.num_hpd = 6; 3058 adev->mode_info.num_hpd = 6;
3006 adev->mode_info.num_dig = 9; 3059 adev->mode_info.num_dig = 9;
3007 break; 3060 break;
3008 case CHIP_STONEY: 3061 case CHIP_STONEY:
3009 adev->mode_info.num_crtc = 2;
3010 adev->mode_info.num_hpd = 6; 3062 adev->mode_info.num_hpd = 6;
3011 adev->mode_info.num_dig = 9; 3063 adev->mode_info.num_dig = 9;
3012 break; 3064 break;
3013 case CHIP_POLARIS10: 3065 case CHIP_POLARIS10:
3014 adev->mode_info.num_crtc = 6;
3015 adev->mode_info.num_hpd = 6; 3066 adev->mode_info.num_hpd = 6;
3016 adev->mode_info.num_dig = 6; 3067 adev->mode_info.num_dig = 6;
3017 break; 3068 break;
3018 case CHIP_POLARIS11: 3069 case CHIP_POLARIS11:
3019 adev->mode_info.num_crtc = 5;
3020 adev->mode_info.num_hpd = 5; 3070 adev->mode_info.num_hpd = 5;
3021 adev->mode_info.num_dig = 5; 3071 adev->mode_info.num_dig = 5;
3022 break; 3072 break;
@@ -3109,6 +3159,7 @@ static int dce_v11_0_sw_fini(void *handle)
3109 3159
3110 dce_v11_0_afmt_fini(adev); 3160 dce_v11_0_afmt_fini(adev);
3111 3161
3162 drm_mode_config_cleanup(adev->ddev);
3112 adev->mode_info.mode_config_initialized = false; 3163 adev->mode_info.mode_config_initialized = false;
3113 3164
3114 return 0; 3165 return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.h b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.h
index 84e4618f5253..1f58a65ba2ef 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.h
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.h
@@ -26,4 +26,6 @@
26 26
27extern const struct amd_ip_funcs dce_v11_0_ip_funcs; 27extern const struct amd_ip_funcs dce_v11_0_ip_funcs;
28 28
29void dce_v11_0_disable_dce(struct amdgpu_device *adev);
30
29#endif 31#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
new file mode 100644
index 000000000000..b948d6cb1399
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
@@ -0,0 +1,3176 @@
1/*
2 * Copyright 2015 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23#include "drmP.h"
24#include "amdgpu.h"
25#include "amdgpu_pm.h"
26#include "amdgpu_i2c.h"
27#include "atom.h"
28#include "amdgpu_atombios.h"
29#include "atombios_crtc.h"
30#include "atombios_encoders.h"
31#include "amdgpu_pll.h"
32#include "amdgpu_connectors.h"
33#include "si/si_reg.h"
34#include "si/sid.h"
35
36static void dce_v6_0_set_display_funcs(struct amdgpu_device *adev);
37static void dce_v6_0_set_irq_funcs(struct amdgpu_device *adev);
38
39static const u32 crtc_offsets[6] =
40{
41 SI_CRTC0_REGISTER_OFFSET,
42 SI_CRTC1_REGISTER_OFFSET,
43 SI_CRTC2_REGISTER_OFFSET,
44 SI_CRTC3_REGISTER_OFFSET,
45 SI_CRTC4_REGISTER_OFFSET,
46 SI_CRTC5_REGISTER_OFFSET
47};
48
49static const uint32_t dig_offsets[] = {
50 SI_CRTC0_REGISTER_OFFSET,
51 SI_CRTC1_REGISTER_OFFSET,
52 SI_CRTC2_REGISTER_OFFSET,
53 SI_CRTC3_REGISTER_OFFSET,
54 SI_CRTC4_REGISTER_OFFSET,
55 SI_CRTC5_REGISTER_OFFSET,
56 (0x13830 - 0x7030) >> 2,
57};
58
59static const struct {
60 uint32_t reg;
61 uint32_t vblank;
62 uint32_t vline;
63 uint32_t hpd;
64
65} interrupt_status_offsets[6] = { {
66 .reg = DISP_INTERRUPT_STATUS,
67 .vblank = DISP_INTERRUPT_STATUS__LB_D1_VBLANK_INTERRUPT_MASK,
68 .vline = DISP_INTERRUPT_STATUS__LB_D1_VLINE_INTERRUPT_MASK,
69 .hpd = DISP_INTERRUPT_STATUS__DC_HPD1_INTERRUPT_MASK
70}, {
71 .reg = DISP_INTERRUPT_STATUS_CONTINUE,
72 .vblank = DISP_INTERRUPT_STATUS_CONTINUE__LB_D2_VBLANK_INTERRUPT_MASK,
73 .vline = DISP_INTERRUPT_STATUS_CONTINUE__LB_D2_VLINE_INTERRUPT_MASK,
74 .hpd = DISP_INTERRUPT_STATUS_CONTINUE__DC_HPD2_INTERRUPT_MASK
75}, {
76 .reg = DISP_INTERRUPT_STATUS_CONTINUE2,
77 .vblank = DISP_INTERRUPT_STATUS_CONTINUE2__LB_D3_VBLANK_INTERRUPT_MASK,
78 .vline = DISP_INTERRUPT_STATUS_CONTINUE2__LB_D3_VLINE_INTERRUPT_MASK,
79 .hpd = DISP_INTERRUPT_STATUS_CONTINUE2__DC_HPD3_INTERRUPT_MASK
80}, {
81 .reg = DISP_INTERRUPT_STATUS_CONTINUE3,
82 .vblank = DISP_INTERRUPT_STATUS_CONTINUE3__LB_D4_VBLANK_INTERRUPT_MASK,
83 .vline = DISP_INTERRUPT_STATUS_CONTINUE3__LB_D4_VLINE_INTERRUPT_MASK,
84 .hpd = DISP_INTERRUPT_STATUS_CONTINUE3__DC_HPD4_INTERRUPT_MASK
85}, {
86 .reg = DISP_INTERRUPT_STATUS_CONTINUE4,
87 .vblank = DISP_INTERRUPT_STATUS_CONTINUE4__LB_D5_VBLANK_INTERRUPT_MASK,
88 .vline = DISP_INTERRUPT_STATUS_CONTINUE4__LB_D5_VLINE_INTERRUPT_MASK,
89 .hpd = DISP_INTERRUPT_STATUS_CONTINUE4__DC_HPD5_INTERRUPT_MASK
90}, {
91 .reg = DISP_INTERRUPT_STATUS_CONTINUE5,
92 .vblank = DISP_INTERRUPT_STATUS_CONTINUE5__LB_D6_VBLANK_INTERRUPT_MASK,
93 .vline = DISP_INTERRUPT_STATUS_CONTINUE5__LB_D6_VLINE_INTERRUPT_MASK,
94 .hpd = DISP_INTERRUPT_STATUS_CONTINUE5__DC_HPD6_INTERRUPT_MASK
95} };
96
97static const uint32_t hpd_int_control_offsets[6] = {
98 DC_HPD1_INT_CONTROL,
99 DC_HPD2_INT_CONTROL,
100 DC_HPD3_INT_CONTROL,
101 DC_HPD4_INT_CONTROL,
102 DC_HPD5_INT_CONTROL,
103 DC_HPD6_INT_CONTROL,
104};
105
106static u32 dce_v6_0_audio_endpt_rreg(struct amdgpu_device *adev,
107 u32 block_offset, u32 reg)
108{
109 DRM_INFO("xxxx: dce_v6_0_audio_endpt_rreg ----no impl!!!!\n");
110 return 0;
111}
112
113static void dce_v6_0_audio_endpt_wreg(struct amdgpu_device *adev,
114 u32 block_offset, u32 reg, u32 v)
115{
116 DRM_INFO("xxxx: dce_v6_0_audio_endpt_wreg ----no impl!!!!\n");
117}
118
119static bool dce_v6_0_is_in_vblank(struct amdgpu_device *adev, int crtc)
120{
121 if (RREG32(EVERGREEN_CRTC_STATUS + crtc_offsets[crtc]) & EVERGREEN_CRTC_V_BLANK)
122 return true;
123 else
124 return false;
125}
126
127static bool dce_v6_0_is_counter_moving(struct amdgpu_device *adev, int crtc)
128{
129 u32 pos1, pos2;
130
131 pos1 = RREG32(EVERGREEN_CRTC_STATUS_POSITION + crtc_offsets[crtc]);
132 pos2 = RREG32(EVERGREEN_CRTC_STATUS_POSITION + crtc_offsets[crtc]);
133
134 if (pos1 != pos2)
135 return true;
136 else
137 return false;
138}
139
140/**
141 * dce_v6_0_wait_for_vblank - vblank wait asic callback.
142 *
143 * @crtc: crtc to wait for vblank on
144 *
145 * Wait for vblank on the requested crtc (evergreen+).
146 */
147static void dce_v6_0_vblank_wait(struct amdgpu_device *adev, int crtc)
148{
149 unsigned i = 100;
150
151 if (crtc >= adev->mode_info.num_crtc)
152 return;
153
154 if (!(RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[crtc]) & EVERGREEN_CRTC_MASTER_EN))
155 return;
156
157 /* depending on when we hit vblank, we may be close to active; if so,
158 * wait for another frame.
159 */
160 while (dce_v6_0_is_in_vblank(adev, crtc)) {
161 if (i++ == 100) {
162 i = 0;
163 if (!dce_v6_0_is_counter_moving(adev, crtc))
164 break;
165 }
166 }
167
168 while (!dce_v6_0_is_in_vblank(adev, crtc)) {
169 if (i++ == 100) {
170 i = 0;
171 if (!dce_v6_0_is_counter_moving(adev, crtc))
172 break;
173 }
174 }
175}
176
177static u32 dce_v6_0_vblank_get_counter(struct amdgpu_device *adev, int crtc)
178{
179 if (crtc >= adev->mode_info.num_crtc)
180 return 0;
181 else
182 return RREG32(CRTC_STATUS_FRAME_COUNT + crtc_offsets[crtc]);
183}
184
185static void dce_v6_0_pageflip_interrupt_init(struct amdgpu_device *adev)
186{
187 unsigned i;
188
189 /* Enable pflip interrupts */
190 for (i = 0; i < adev->mode_info.num_crtc; i++)
191 amdgpu_irq_get(adev, &adev->pageflip_irq, i);
192}
193
194static void dce_v6_0_pageflip_interrupt_fini(struct amdgpu_device *adev)
195{
196 unsigned i;
197
198 /* Disable pflip interrupts */
199 for (i = 0; i < adev->mode_info.num_crtc; i++)
200 amdgpu_irq_put(adev, &adev->pageflip_irq, i);
201}
202
203/**
204 * dce_v6_0_page_flip - pageflip callback.
205 *
206 * @adev: amdgpu_device pointer
207 * @crtc_id: crtc to cleanup pageflip on
208 * @crtc_base: new address of the crtc (GPU MC address)
209 *
210 * Does the actual pageflip (evergreen+).
211 * During vblank we take the crtc lock and wait for the update_pending
212 * bit to go high, when it does, we release the lock, and allow the
213 * double buffered update to take place.
214 * Returns the current update pending status.
215 */
216static void dce_v6_0_page_flip(struct amdgpu_device *adev,
217 int crtc_id, u64 crtc_base, bool async)
218{
219 struct amdgpu_crtc *amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
220
221 /* flip at hsync for async, default is vsync */
222 WREG32(EVERGREEN_GRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, async ?
223 EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0);
224 /* update the scanout addresses */
225 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
226 upper_32_bits(crtc_base));
227 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
228 (u32)crtc_base);
229
230 /* post the write */
231 RREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset);
232}
233
234static int dce_v6_0_crtc_get_scanoutpos(struct amdgpu_device *adev, int crtc,
235 u32 *vbl, u32 *position)
236{
237 if ((crtc < 0) || (crtc >= adev->mode_info.num_crtc))
238 return -EINVAL;
239 *vbl = RREG32(EVERGREEN_CRTC_V_BLANK_START_END + crtc_offsets[crtc]);
240 *position = RREG32(EVERGREEN_CRTC_STATUS_POSITION + crtc_offsets[crtc]);
241
242 return 0;
243
244}
245
246/**
247 * dce_v6_0_hpd_sense - hpd sense callback.
248 *
249 * @adev: amdgpu_device pointer
250 * @hpd: hpd (hotplug detect) pin
251 *
252 * Checks if a digital monitor is connected (evergreen+).
253 * Returns true if connected, false if not connected.
254 */
255static bool dce_v6_0_hpd_sense(struct amdgpu_device *adev,
256 enum amdgpu_hpd_id hpd)
257{
258 bool connected = false;
259
260 switch (hpd) {
261 case AMDGPU_HPD_1:
262 if (RREG32(DC_HPD1_INT_STATUS) & DC_HPDx_SENSE)
263 connected = true;
264 break;
265 case AMDGPU_HPD_2:
266 if (RREG32(DC_HPD2_INT_STATUS) & DC_HPDx_SENSE)
267 connected = true;
268 break;
269 case AMDGPU_HPD_3:
270 if (RREG32(DC_HPD3_INT_STATUS) & DC_HPDx_SENSE)
271 connected = true;
272 break;
273 case AMDGPU_HPD_4:
274 if (RREG32(DC_HPD4_INT_STATUS) & DC_HPDx_SENSE)
275 connected = true;
276 break;
277 case AMDGPU_HPD_5:
278 if (RREG32(DC_HPD5_INT_STATUS) & DC_HPDx_SENSE)
279 connected = true;
280 break;
281 case AMDGPU_HPD_6:
282 if (RREG32(DC_HPD6_INT_STATUS) & DC_HPDx_SENSE)
283 connected = true;
284 break;
285 default:
286 break;
287 }
288
289 return connected;
290}
291
292/**
293 * dce_v6_0_hpd_set_polarity - hpd set polarity callback.
294 *
295 * @adev: amdgpu_device pointer
296 * @hpd: hpd (hotplug detect) pin
297 *
298 * Set the polarity of the hpd pin (evergreen+).
299 */
300static void dce_v6_0_hpd_set_polarity(struct amdgpu_device *adev,
301 enum amdgpu_hpd_id hpd)
302{
303 u32 tmp;
304 bool connected = dce_v6_0_hpd_sense(adev, hpd);
305
306 switch (hpd) {
307 case AMDGPU_HPD_1:
308 tmp = RREG32(DC_HPD1_INT_CONTROL);
309 if (connected)
310 tmp &= ~DC_HPDx_INT_POLARITY;
311 else
312 tmp |= DC_HPDx_INT_POLARITY;
313 WREG32(DC_HPD1_INT_CONTROL, tmp);
314 break;
315 case AMDGPU_HPD_2:
316 tmp = RREG32(DC_HPD2_INT_CONTROL);
317 if (connected)
318 tmp &= ~DC_HPDx_INT_POLARITY;
319 else
320 tmp |= DC_HPDx_INT_POLARITY;
321 WREG32(DC_HPD2_INT_CONTROL, tmp);
322 break;
323 case AMDGPU_HPD_3:
324 tmp = RREG32(DC_HPD3_INT_CONTROL);
325 if (connected)
326 tmp &= ~DC_HPDx_INT_POLARITY;
327 else
328 tmp |= DC_HPDx_INT_POLARITY;
329 WREG32(DC_HPD3_INT_CONTROL, tmp);
330 break;
331 case AMDGPU_HPD_4:
332 tmp = RREG32(DC_HPD4_INT_CONTROL);
333 if (connected)
334 tmp &= ~DC_HPDx_INT_POLARITY;
335 else
336 tmp |= DC_HPDx_INT_POLARITY;
337 WREG32(DC_HPD4_INT_CONTROL, tmp);
338 break;
339 case AMDGPU_HPD_5:
340 tmp = RREG32(DC_HPD5_INT_CONTROL);
341 if (connected)
342 tmp &= ~DC_HPDx_INT_POLARITY;
343 else
344 tmp |= DC_HPDx_INT_POLARITY;
345 WREG32(DC_HPD5_INT_CONTROL, tmp);
346 break;
347 case AMDGPU_HPD_6:
348 tmp = RREG32(DC_HPD6_INT_CONTROL);
349 if (connected)
350 tmp &= ~DC_HPDx_INT_POLARITY;
351 else
352 tmp |= DC_HPDx_INT_POLARITY;
353 WREG32(DC_HPD6_INT_CONTROL, tmp);
354 break;
355 default:
356 break;
357 }
358}
359
360/**
361 * dce_v6_0_hpd_init - hpd setup callback.
362 *
363 * @adev: amdgpu_device pointer
364 *
365 * Setup the hpd pins used by the card (evergreen+).
366 * Enable the pin, set the polarity, and enable the hpd interrupts.
367 */
368static void dce_v6_0_hpd_init(struct amdgpu_device *adev)
369{
370 struct drm_device *dev = adev->ddev;
371 struct drm_connector *connector;
372 u32 tmp = DC_HPDx_CONNECTION_TIMER(0x9c4) |
373 DC_HPDx_RX_INT_TIMER(0xfa) | DC_HPDx_EN;
374
375 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
376 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
377
378 switch (amdgpu_connector->hpd.hpd) {
379 case AMDGPU_HPD_1:
380 WREG32(DC_HPD1_CONTROL, tmp);
381 break;
382 case AMDGPU_HPD_2:
383 WREG32(DC_HPD2_CONTROL, tmp);
384 break;
385 case AMDGPU_HPD_3:
386 WREG32(DC_HPD3_CONTROL, tmp);
387 break;
388 case AMDGPU_HPD_4:
389 WREG32(DC_HPD4_CONTROL, tmp);
390 break;
391 case AMDGPU_HPD_5:
392 WREG32(DC_HPD5_CONTROL, tmp);
393 break;
394 case AMDGPU_HPD_6:
395 WREG32(DC_HPD6_CONTROL, tmp);
396 break;
397 default:
398 break;
399 }
400
401 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
402 connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
403 /* don't try to enable hpd on eDP or LVDS avoid breaking the
404 * aux dp channel on imac and help (but not completely fix)
405 * https://bugzilla.redhat.com/show_bug.cgi?id=726143
406 * also avoid interrupt storms during dpms.
407 */
408 u32 dc_hpd_int_cntl_reg, dc_hpd_int_cntl;
409
410 switch (amdgpu_connector->hpd.hpd) {
411 case AMDGPU_HPD_1:
412 dc_hpd_int_cntl_reg = DC_HPD1_INT_CONTROL;
413 break;
414 case AMDGPU_HPD_2:
415 dc_hpd_int_cntl_reg = DC_HPD2_INT_CONTROL;
416 break;
417 case AMDGPU_HPD_3:
418 dc_hpd_int_cntl_reg = DC_HPD3_INT_CONTROL;
419 break;
420 case AMDGPU_HPD_4:
421 dc_hpd_int_cntl_reg = DC_HPD4_INT_CONTROL;
422 break;
423 case AMDGPU_HPD_5:
424 dc_hpd_int_cntl_reg = DC_HPD5_INT_CONTROL;
425 break;
426 case AMDGPU_HPD_6:
427 dc_hpd_int_cntl_reg = DC_HPD6_INT_CONTROL;
428 break;
429 default:
430 continue;
431 }
432
433 dc_hpd_int_cntl = RREG32(dc_hpd_int_cntl_reg);
434 dc_hpd_int_cntl &= ~DC_HPDx_INT_EN;
435 WREG32(dc_hpd_int_cntl_reg, dc_hpd_int_cntl);
436 continue;
437 }
438
439 dce_v6_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
440 amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
441 }
442
443}
444
445/**
446 * dce_v6_0_hpd_fini - hpd tear down callback.
447 *
448 * @adev: amdgpu_device pointer
449 *
450 * Tear down the hpd pins used by the card (evergreen+).
451 * Disable the hpd interrupts.
452 */
453static void dce_v6_0_hpd_fini(struct amdgpu_device *adev)
454{
455 struct drm_device *dev = adev->ddev;
456 struct drm_connector *connector;
457
458 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
459 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
460
461 switch (amdgpu_connector->hpd.hpd) {
462 case AMDGPU_HPD_1:
463 WREG32(DC_HPD1_CONTROL, 0);
464 break;
465 case AMDGPU_HPD_2:
466 WREG32(DC_HPD2_CONTROL, 0);
467 break;
468 case AMDGPU_HPD_3:
469 WREG32(DC_HPD3_CONTROL, 0);
470 break;
471 case AMDGPU_HPD_4:
472 WREG32(DC_HPD4_CONTROL, 0);
473 break;
474 case AMDGPU_HPD_5:
475 WREG32(DC_HPD5_CONTROL, 0);
476 break;
477 case AMDGPU_HPD_6:
478 WREG32(DC_HPD6_CONTROL, 0);
479 break;
480 default:
481 break;
482 }
483 amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
484 }
485}
486
487static u32 dce_v6_0_hpd_get_gpio_reg(struct amdgpu_device *adev)
488{
489 return SI_DC_GPIO_HPD_A;
490}
491
492static bool dce_v6_0_is_display_hung(struct amdgpu_device *adev)
493{
494 DRM_INFO("xxxx: dce_v6_0_is_display_hung ----no imp!!!!!\n");
495
496 return true;
497}
498
499static u32 evergreen_get_vblank_counter(struct amdgpu_device* adev, int crtc)
500{
501 if (crtc >= adev->mode_info.num_crtc)
502 return 0;
503 else
504 return RREG32(CRTC_STATUS_FRAME_COUNT + crtc_offsets[crtc]);
505}
506
507static void dce_v6_0_stop_mc_access(struct amdgpu_device *adev,
508 struct amdgpu_mode_mc_save *save)
509{
510 u32 crtc_enabled, tmp, frame_count;
511 int i, j;
512
513 save->vga_render_control = RREG32(VGA_RENDER_CONTROL);
514 save->vga_hdp_control = RREG32(VGA_HDP_CONTROL);
515
516 /* disable VGA render */
517 WREG32(VGA_RENDER_CONTROL, 0);
518
519 /* blank the display controllers */
520 for (i = 0; i < adev->mode_info.num_crtc; i++) {
521 crtc_enabled = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]) & EVERGREEN_CRTC_MASTER_EN;
522 if (crtc_enabled) {
523 save->crtc_enabled[i] = true;
524 tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]);
525
526 if (!(tmp & EVERGREEN_CRTC_BLANK_DATA_EN)) {
527 dce_v6_0_vblank_wait(adev, i);
528 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
529 tmp |= EVERGREEN_CRTC_BLANK_DATA_EN;
530 WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
531 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
532 }
533 /* wait for the next frame */
534 frame_count = evergreen_get_vblank_counter(adev, i);
535 for (j = 0; j < adev->usec_timeout; j++) {
536 if (evergreen_get_vblank_counter(adev, i) != frame_count)
537 break;
538 udelay(1);
539 }
540
541 /* XXX this is a hack to avoid strange behavior with EFI on certain systems */
542 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1);
543 tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]);
544 tmp &= ~EVERGREEN_CRTC_MASTER_EN;
545 WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp);
546 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0);
547 save->crtc_enabled[i] = false;
548 /* ***** */
549 } else {
550 save->crtc_enabled[i] = false;
551 }
552 }
553}
554
555static void dce_v6_0_resume_mc_access(struct amdgpu_device *adev,
556 struct amdgpu_mode_mc_save *save)
557{
558 u32 tmp;
559 int i, j;
560
561 /* update crtc base addresses */
562 for (i = 0; i < adev->mode_info.num_crtc; i++) {
563 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i],
564 upper_32_bits(adev->mc.vram_start));
565 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i],
566 upper_32_bits(adev->mc.vram_start));
567 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + crtc_offsets[i],
568 (u32)adev->mc.vram_start);
569 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + crtc_offsets[i],
570 (u32)adev->mc.vram_start);
571 }
572
573 WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS_HIGH, upper_32_bits(adev->mc.vram_start));
574 WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS, (u32)adev->mc.vram_start);
575
576 /* unlock regs and wait for update */
577 for (i = 0; i < adev->mode_info.num_crtc; i++) {
578 if (save->crtc_enabled[i]) {
579 tmp = RREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i]);
580 if ((tmp & 0x7) != 3) {
581 tmp &= ~0x7;
582 tmp |= 0x3;
583 WREG32(EVERGREEN_MASTER_UPDATE_MODE + crtc_offsets[i], tmp);
584 }
585 tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]);
586 if (tmp & EVERGREEN_GRPH_UPDATE_LOCK) {
587 tmp &= ~EVERGREEN_GRPH_UPDATE_LOCK;
588 WREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i], tmp);
589 }
590 tmp = RREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i]);
591 if (tmp & 1) {
592 tmp &= ~1;
593 WREG32(EVERGREEN_MASTER_UPDATE_LOCK + crtc_offsets[i], tmp);
594 }
595 for (j = 0; j < adev->usec_timeout; j++) {
596 tmp = RREG32(EVERGREEN_GRPH_UPDATE + crtc_offsets[i]);
597 if ((tmp & EVERGREEN_GRPH_SURFACE_UPDATE_PENDING) == 0)
598 break;
599 udelay(1);
600 }
601 }
602 }
603
604 /* Unlock vga access */
605 WREG32(VGA_HDP_CONTROL, save->vga_hdp_control);
606 mdelay(1);
607 WREG32(VGA_RENDER_CONTROL, save->vga_render_control);
608
609}
610
611static void dce_v6_0_set_vga_render_state(struct amdgpu_device *adev,
612 bool render)
613{
614 if (!render)
615 WREG32(R_000300_VGA_RENDER_CONTROL,
616 RREG32(R_000300_VGA_RENDER_CONTROL) & C_000300_VGA_VSTATUS_CNTL);
617
618}
619
620static void dce_v6_0_program_fmt(struct drm_encoder *encoder)
621{
622
623 struct drm_device *dev = encoder->dev;
624 struct amdgpu_device *adev = dev->dev_private;
625 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
626 struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder);
627 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(encoder->crtc);
628 int bpc = 0;
629 u32 tmp = 0;
630 enum amdgpu_connector_dither dither = AMDGPU_FMT_DITHER_DISABLE;
631
632 if (connector) {
633 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
634 bpc = amdgpu_connector_get_monitor_bpc(connector);
635 dither = amdgpu_connector->dither;
636 }
637
638 /* LVDS FMT is set up by atom */
639 if (amdgpu_encoder->devices & ATOM_DEVICE_LCD_SUPPORT)
640 return;
641
642 if (bpc == 0)
643 return;
644
645
646 switch (bpc) {
647 case 6:
648 if (dither == AMDGPU_FMT_DITHER_ENABLE)
649 /* XXX sort out optimal dither settings */
650 tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
651 FMT_SPATIAL_DITHER_EN);
652 else
653 tmp |= FMT_TRUNCATE_EN;
654 break;
655 case 8:
656 if (dither == AMDGPU_FMT_DITHER_ENABLE)
657 /* XXX sort out optimal dither settings */
658 tmp |= (FMT_FRAME_RANDOM_ENABLE | FMT_HIGHPASS_RANDOM_ENABLE |
659 FMT_RGB_RANDOM_ENABLE |
660 FMT_SPATIAL_DITHER_EN | FMT_SPATIAL_DITHER_DEPTH);
661 else
662 tmp |= (FMT_TRUNCATE_EN | FMT_TRUNCATE_DEPTH);
663 break;
664 case 10:
665 default:
666 /* not needed */
667 break;
668 }
669
670 WREG32(FMT_BIT_DEPTH_CONTROL + amdgpu_crtc->crtc_offset, tmp);
671}
672
673/**
674 * cik_get_number_of_dram_channels - get the number of dram channels
675 *
676 * @adev: amdgpu_device pointer
677 *
678 * Look up the number of video ram channels (CIK).
679 * Used for display watermark bandwidth calculations
680 * Returns the number of dram channels
681 */
682static u32 si_get_number_of_dram_channels(struct amdgpu_device *adev)
683{
684 u32 tmp = RREG32(MC_SHARED_CHMAP);
685
686 switch ((tmp & MC_SHARED_CHMAP__NOOFCHAN_MASK) >> MC_SHARED_CHMAP__NOOFCHAN__SHIFT) {
687 case 0:
688 default:
689 return 1;
690 case 1:
691 return 2;
692 case 2:
693 return 4;
694 case 3:
695 return 8;
696 case 4:
697 return 3;
698 case 5:
699 return 6;
700 case 6:
701 return 10;
702 case 7:
703 return 12;
704 case 8:
705 return 16;
706 }
707}
708
709struct dce6_wm_params {
710 u32 dram_channels; /* number of dram channels */
711 u32 yclk; /* bandwidth per dram data pin in kHz */
712 u32 sclk; /* engine clock in kHz */
713 u32 disp_clk; /* display clock in kHz */
714 u32 src_width; /* viewport width */
715 u32 active_time; /* active display time in ns */
716 u32 blank_time; /* blank time in ns */
717 bool interlaced; /* mode is interlaced */
718 fixed20_12 vsc; /* vertical scale ratio */
719 u32 num_heads; /* number of active crtcs */
720 u32 bytes_per_pixel; /* bytes per pixel display + overlay */
721 u32 lb_size; /* line buffer allocated to pipe */
722 u32 vtaps; /* vertical scaler taps */
723};
724
725/**
726 * dce_v6_0_dram_bandwidth - get the dram bandwidth
727 *
728 * @wm: watermark calculation data
729 *
730 * Calculate the raw dram bandwidth (CIK).
731 * Used for display watermark bandwidth calculations
732 * Returns the dram bandwidth in MBytes/s
733 */
734static u32 dce_v6_0_dram_bandwidth(struct dce6_wm_params *wm)
735{
736 /* Calculate raw DRAM Bandwidth */
737 fixed20_12 dram_efficiency; /* 0.7 */
738 fixed20_12 yclk, dram_channels, bandwidth;
739 fixed20_12 a;
740
741 a.full = dfixed_const(1000);
742 yclk.full = dfixed_const(wm->yclk);
743 yclk.full = dfixed_div(yclk, a);
744 dram_channels.full = dfixed_const(wm->dram_channels * 4);
745 a.full = dfixed_const(10);
746 dram_efficiency.full = dfixed_const(7);
747 dram_efficiency.full = dfixed_div(dram_efficiency, a);
748 bandwidth.full = dfixed_mul(dram_channels, yclk);
749 bandwidth.full = dfixed_mul(bandwidth, dram_efficiency);
750
751 return dfixed_trunc(bandwidth);
752}
753
754/**
755 * dce_v6_0_dram_bandwidth_for_display - get the dram bandwidth for display
756 *
757 * @wm: watermark calculation data
758 *
759 * Calculate the dram bandwidth used for display (CIK).
760 * Used for display watermark bandwidth calculations
761 * Returns the dram bandwidth for display in MBytes/s
762 */
763static u32 dce_v6_0_dram_bandwidth_for_display(struct dce6_wm_params *wm)
764{
765 /* Calculate DRAM Bandwidth and the part allocated to display. */
766 fixed20_12 disp_dram_allocation; /* 0.3 to 0.7 */
767 fixed20_12 yclk, dram_channels, bandwidth;
768 fixed20_12 a;
769
770 a.full = dfixed_const(1000);
771 yclk.full = dfixed_const(wm->yclk);
772 yclk.full = dfixed_div(yclk, a);
773 dram_channels.full = dfixed_const(wm->dram_channels * 4);
774 a.full = dfixed_const(10);
775 disp_dram_allocation.full = dfixed_const(3); /* XXX worse case value 0.3 */
776 disp_dram_allocation.full = dfixed_div(disp_dram_allocation, a);
777 bandwidth.full = dfixed_mul(dram_channels, yclk);
778 bandwidth.full = dfixed_mul(bandwidth, disp_dram_allocation);
779
780 return dfixed_trunc(bandwidth);
781}
782
783/**
784 * dce_v6_0_data_return_bandwidth - get the data return bandwidth
785 *
786 * @wm: watermark calculation data
787 *
788 * Calculate the data return bandwidth used for display (CIK).
789 * Used for display watermark bandwidth calculations
790 * Returns the data return bandwidth in MBytes/s
791 */
792static u32 dce_v6_0_data_return_bandwidth(struct dce6_wm_params *wm)
793{
794 /* Calculate the display Data return Bandwidth */
795 fixed20_12 return_efficiency; /* 0.8 */
796 fixed20_12 sclk, bandwidth;
797 fixed20_12 a;
798
799 a.full = dfixed_const(1000);
800 sclk.full = dfixed_const(wm->sclk);
801 sclk.full = dfixed_div(sclk, a);
802 a.full = dfixed_const(10);
803 return_efficiency.full = dfixed_const(8);
804 return_efficiency.full = dfixed_div(return_efficiency, a);
805 a.full = dfixed_const(32);
806 bandwidth.full = dfixed_mul(a, sclk);
807 bandwidth.full = dfixed_mul(bandwidth, return_efficiency);
808
809 return dfixed_trunc(bandwidth);
810}
811
812/**
813 * dce_v6_0_dmif_request_bandwidth - get the dmif bandwidth
814 *
815 * @wm: watermark calculation data
816 *
817 * Calculate the dmif bandwidth used for display (CIK).
818 * Used for display watermark bandwidth calculations
819 * Returns the dmif bandwidth in MBytes/s
820 */
821static u32 dce_v6_0_dmif_request_bandwidth(struct dce6_wm_params *wm)
822{
823 /* Calculate the DMIF Request Bandwidth */
824 fixed20_12 disp_clk_request_efficiency; /* 0.8 */
825 fixed20_12 disp_clk, bandwidth;
826 fixed20_12 a, b;
827
828 a.full = dfixed_const(1000);
829 disp_clk.full = dfixed_const(wm->disp_clk);
830 disp_clk.full = dfixed_div(disp_clk, a);
831 a.full = dfixed_const(32);
832 b.full = dfixed_mul(a, disp_clk);
833
834 a.full = dfixed_const(10);
835 disp_clk_request_efficiency.full = dfixed_const(8);
836 disp_clk_request_efficiency.full = dfixed_div(disp_clk_request_efficiency, a);
837
838 bandwidth.full = dfixed_mul(b, disp_clk_request_efficiency);
839
840 return dfixed_trunc(bandwidth);
841}
842
843/**
844 * dce_v6_0_available_bandwidth - get the min available bandwidth
845 *
846 * @wm: watermark calculation data
847 *
848 * Calculate the min available bandwidth used for display (CIK).
849 * Used for display watermark bandwidth calculations
850 * Returns the min available bandwidth in MBytes/s
851 */
852static u32 dce_v6_0_available_bandwidth(struct dce6_wm_params *wm)
853{
854 /* Calculate the Available bandwidth. Display can use this temporarily but not in average. */
855 u32 dram_bandwidth = dce_v6_0_dram_bandwidth(wm);
856 u32 data_return_bandwidth = dce_v6_0_data_return_bandwidth(wm);
857 u32 dmif_req_bandwidth = dce_v6_0_dmif_request_bandwidth(wm);
858
859 return min(dram_bandwidth, min(data_return_bandwidth, dmif_req_bandwidth));
860}
861
862/**
863 * dce_v6_0_average_bandwidth - get the average available bandwidth
864 *
865 * @wm: watermark calculation data
866 *
867 * Calculate the average available bandwidth used for display (CIK).
868 * Used for display watermark bandwidth calculations
869 * Returns the average available bandwidth in MBytes/s
870 */
871static u32 dce_v6_0_average_bandwidth(struct dce6_wm_params *wm)
872{
873 /* Calculate the display mode Average Bandwidth
874 * DisplayMode should contain the source and destination dimensions,
875 * timing, etc.
876 */
877 fixed20_12 bpp;
878 fixed20_12 line_time;
879 fixed20_12 src_width;
880 fixed20_12 bandwidth;
881 fixed20_12 a;
882
883 a.full = dfixed_const(1000);
884 line_time.full = dfixed_const(wm->active_time + wm->blank_time);
885 line_time.full = dfixed_div(line_time, a);
886 bpp.full = dfixed_const(wm->bytes_per_pixel);
887 src_width.full = dfixed_const(wm->src_width);
888 bandwidth.full = dfixed_mul(src_width, bpp);
889 bandwidth.full = dfixed_mul(bandwidth, wm->vsc);
890 bandwidth.full = dfixed_div(bandwidth, line_time);
891
892 return dfixed_trunc(bandwidth);
893}
894
895/**
896 * dce_v6_0_latency_watermark - get the latency watermark
897 *
898 * @wm: watermark calculation data
899 *
900 * Calculate the latency watermark (CIK).
901 * Used for display watermark bandwidth calculations
902 * Returns the latency watermark in ns
903 */
904static u32 dce_v6_0_latency_watermark(struct dce6_wm_params *wm)
905{
906 /* First calculate the latency in ns */
907 u32 mc_latency = 2000; /* 2000 ns. */
908 u32 available_bandwidth = dce_v6_0_available_bandwidth(wm);
909 u32 worst_chunk_return_time = (512 * 8 * 1000) / available_bandwidth;
910 u32 cursor_line_pair_return_time = (128 * 4 * 1000) / available_bandwidth;
911 u32 dc_latency = 40000000 / wm->disp_clk; /* dc pipe latency */
912 u32 other_heads_data_return_time = ((wm->num_heads + 1) * worst_chunk_return_time) +
913 (wm->num_heads * cursor_line_pair_return_time);
914 u32 latency = mc_latency + other_heads_data_return_time + dc_latency;
915 u32 max_src_lines_per_dst_line, lb_fill_bw, line_fill_time;
916 u32 tmp, dmif_size = 12288;
917 fixed20_12 a, b, c;
918
919 if (wm->num_heads == 0)
920 return 0;
921
922 a.full = dfixed_const(2);
923 b.full = dfixed_const(1);
924 if ((wm->vsc.full > a.full) ||
925 ((wm->vsc.full > b.full) && (wm->vtaps >= 3)) ||
926 (wm->vtaps >= 5) ||
927 ((wm->vsc.full >= a.full) && wm->interlaced))
928 max_src_lines_per_dst_line = 4;
929 else
930 max_src_lines_per_dst_line = 2;
931
932 a.full = dfixed_const(available_bandwidth);
933 b.full = dfixed_const(wm->num_heads);
934 a.full = dfixed_div(a, b);
935
936 b.full = dfixed_const(mc_latency + 512);
937 c.full = dfixed_const(wm->disp_clk);
938 b.full = dfixed_div(b, c);
939
940 c.full = dfixed_const(dmif_size);
941 b.full = dfixed_div(c, b);
942
943 tmp = min(dfixed_trunc(a), dfixed_trunc(b));
944
945 b.full = dfixed_const(1000);
946 c.full = dfixed_const(wm->disp_clk);
947 b.full = dfixed_div(c, b);
948 c.full = dfixed_const(wm->bytes_per_pixel);
949 b.full = dfixed_mul(b, c);
950
951 lb_fill_bw = min(tmp, dfixed_trunc(b));
952
953 a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel);
954 b.full = dfixed_const(1000);
955 c.full = dfixed_const(lb_fill_bw);
956 b.full = dfixed_div(c, b);
957 a.full = dfixed_div(a, b);
958 line_fill_time = dfixed_trunc(a);
959
960 if (line_fill_time < wm->active_time)
961 return latency;
962 else
963 return latency + (line_fill_time - wm->active_time);
964
965}
966
967/**
968 * dce_v6_0_average_bandwidth_vs_dram_bandwidth_for_display - check
969 * average and available dram bandwidth
970 *
971 * @wm: watermark calculation data
972 *
973 * Check if the display average bandwidth fits in the display
974 * dram bandwidth (CIK).
975 * Used for display watermark bandwidth calculations
976 * Returns true if the display fits, false if not.
977 */
978static bool dce_v6_0_average_bandwidth_vs_dram_bandwidth_for_display(struct dce6_wm_params *wm)
979{
980 if (dce_v6_0_average_bandwidth(wm) <=
981 (dce_v6_0_dram_bandwidth_for_display(wm) / wm->num_heads))
982 return true;
983 else
984 return false;
985}
986
987/**
988 * dce_v6_0_average_bandwidth_vs_available_bandwidth - check
989 * average and available bandwidth
990 *
991 * @wm: watermark calculation data
992 *
993 * Check if the display average bandwidth fits in the display
994 * available bandwidth (CIK).
995 * Used for display watermark bandwidth calculations
996 * Returns true if the display fits, false if not.
997 */
998static bool dce_v6_0_average_bandwidth_vs_available_bandwidth(struct dce6_wm_params *wm)
999{
1000 if (dce_v6_0_average_bandwidth(wm) <=
1001 (dce_v6_0_available_bandwidth(wm) / wm->num_heads))
1002 return true;
1003 else
1004 return false;
1005}
1006
1007/**
1008 * dce_v6_0_check_latency_hiding - check latency hiding
1009 *
1010 * @wm: watermark calculation data
1011 *
1012 * Check latency hiding (CIK).
1013 * Used for display watermark bandwidth calculations
1014 * Returns true if the display fits, false if not.
1015 */
1016static bool dce_v6_0_check_latency_hiding(struct dce6_wm_params *wm)
1017{
1018 u32 lb_partitions = wm->lb_size / wm->src_width;
1019 u32 line_time = wm->active_time + wm->blank_time;
1020 u32 latency_tolerant_lines;
1021 u32 latency_hiding;
1022 fixed20_12 a;
1023
1024 a.full = dfixed_const(1);
1025 if (wm->vsc.full > a.full)
1026 latency_tolerant_lines = 1;
1027 else {
1028 if (lb_partitions <= (wm->vtaps + 1))
1029 latency_tolerant_lines = 1;
1030 else
1031 latency_tolerant_lines = 2;
1032 }
1033
1034 latency_hiding = (latency_tolerant_lines * line_time + wm->blank_time);
1035
1036 if (dce_v6_0_latency_watermark(wm) <= latency_hiding)
1037 return true;
1038 else
1039 return false;
1040}
1041
1042/**
1043 * dce_v6_0_program_watermarks - program display watermarks
1044 *
1045 * @adev: amdgpu_device pointer
1046 * @amdgpu_crtc: the selected display controller
1047 * @lb_size: line buffer size
1048 * @num_heads: number of display controllers in use
1049 *
1050 * Calculate and program the display watermarks for the
1051 * selected display controller (CIK).
1052 */
1053static void dce_v6_0_program_watermarks(struct amdgpu_device *adev,
1054 struct amdgpu_crtc *amdgpu_crtc,
1055 u32 lb_size, u32 num_heads)
1056{
1057 struct drm_display_mode *mode = &amdgpu_crtc->base.mode;
1058 struct dce6_wm_params wm_low, wm_high;
1059 u32 dram_channels;
1060 u32 pixel_period;
1061 u32 line_time = 0;
1062 u32 latency_watermark_a = 0, latency_watermark_b = 0;
1063 u32 priority_a_mark = 0, priority_b_mark = 0;
1064 u32 priority_a_cnt = PRIORITY_OFF;
1065 u32 priority_b_cnt = PRIORITY_OFF;
1066 u32 tmp, arb_control3;
1067 fixed20_12 a, b, c;
1068
1069 if (amdgpu_crtc->base.enabled && num_heads && mode) {
1070 pixel_period = 1000000 / (u32)mode->clock;
1071 line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535);
1072 priority_a_cnt = 0;
1073 priority_b_cnt = 0;
1074
1075 dram_channels = si_get_number_of_dram_channels(adev);
1076
1077 /* watermark for high clocks */
1078 if (adev->pm.dpm_enabled) {
1079 wm_high.yclk =
1080 amdgpu_dpm_get_mclk(adev, false) * 10;
1081 wm_high.sclk =
1082 amdgpu_dpm_get_sclk(adev, false) * 10;
1083 } else {
1084 wm_high.yclk = adev->pm.current_mclk * 10;
1085 wm_high.sclk = adev->pm.current_sclk * 10;
1086 }
1087
1088 wm_high.disp_clk = mode->clock;
1089 wm_high.src_width = mode->crtc_hdisplay;
1090 wm_high.active_time = mode->crtc_hdisplay * pixel_period;
1091 wm_high.blank_time = line_time - wm_high.active_time;
1092 wm_high.interlaced = false;
1093 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
1094 wm_high.interlaced = true;
1095 wm_high.vsc = amdgpu_crtc->vsc;
1096 wm_high.vtaps = 1;
1097 if (amdgpu_crtc->rmx_type != RMX_OFF)
1098 wm_high.vtaps = 2;
1099 wm_high.bytes_per_pixel = 4; /* XXX: get this from fb config */
1100 wm_high.lb_size = lb_size;
1101 wm_high.dram_channels = dram_channels;
1102 wm_high.num_heads = num_heads;
1103
1104 if (adev->pm.dpm_enabled) {
1105 /* watermark for low clocks */
1106 wm_low.yclk =
1107 amdgpu_dpm_get_mclk(adev, true) * 10;
1108 wm_low.sclk =
1109 amdgpu_dpm_get_sclk(adev, true) * 10;
1110 } else {
1111 wm_low.yclk = adev->pm.current_mclk * 10;
1112 wm_low.sclk = adev->pm.current_sclk * 10;
1113 }
1114
1115 wm_low.disp_clk = mode->clock;
1116 wm_low.src_width = mode->crtc_hdisplay;
1117 wm_low.active_time = mode->crtc_hdisplay * pixel_period;
1118 wm_low.blank_time = line_time - wm_low.active_time;
1119 wm_low.interlaced = false;
1120 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
1121 wm_low.interlaced = true;
1122 wm_low.vsc = amdgpu_crtc->vsc;
1123 wm_low.vtaps = 1;
1124 if (amdgpu_crtc->rmx_type != RMX_OFF)
1125 wm_low.vtaps = 2;
1126 wm_low.bytes_per_pixel = 4; /* XXX: get this from fb config */
1127 wm_low.lb_size = lb_size;
1128 wm_low.dram_channels = dram_channels;
1129 wm_low.num_heads = num_heads;
1130
1131 /* set for high clocks */
1132 latency_watermark_a = min(dce_v6_0_latency_watermark(&wm_high), (u32)65535);
1133 /* set for low clocks */
1134 latency_watermark_b = min(dce_v6_0_latency_watermark(&wm_low), (u32)65535);
1135
1136 /* possibly force display priority to high */
1137 /* should really do this at mode validation time... */
1138 if (!dce_v6_0_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high) ||
1139 !dce_v6_0_average_bandwidth_vs_available_bandwidth(&wm_high) ||
1140 !dce_v6_0_check_latency_hiding(&wm_high) ||
1141 (adev->mode_info.disp_priority == 2)) {
1142 DRM_DEBUG_KMS("force priority to high\n");
1143 priority_a_cnt |= PRIORITY_ALWAYS_ON;
1144 priority_b_cnt |= PRIORITY_ALWAYS_ON;
1145 }
1146 if (!dce_v6_0_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low) ||
1147 !dce_v6_0_average_bandwidth_vs_available_bandwidth(&wm_low) ||
1148 !dce_v6_0_check_latency_hiding(&wm_low) ||
1149 (adev->mode_info.disp_priority == 2)) {
1150 DRM_DEBUG_KMS("force priority to high\n");
1151 priority_a_cnt |= PRIORITY_ALWAYS_ON;
1152 priority_b_cnt |= PRIORITY_ALWAYS_ON;
1153 }
1154
1155 a.full = dfixed_const(1000);
1156 b.full = dfixed_const(mode->clock);
1157 b.full = dfixed_div(b, a);
1158 c.full = dfixed_const(latency_watermark_a);
1159 c.full = dfixed_mul(c, b);
1160 c.full = dfixed_mul(c, amdgpu_crtc->hsc);
1161 c.full = dfixed_div(c, a);
1162 a.full = dfixed_const(16);
1163 c.full = dfixed_div(c, a);
1164 priority_a_mark = dfixed_trunc(c);
1165 priority_a_cnt |= priority_a_mark & PRIORITY_MARK_MASK;
1166
1167 a.full = dfixed_const(1000);
1168 b.full = dfixed_const(mode->clock);
1169 b.full = dfixed_div(b, a);
1170 c.full = dfixed_const(latency_watermark_b);
1171 c.full = dfixed_mul(c, b);
1172 c.full = dfixed_mul(c, amdgpu_crtc->hsc);
1173 c.full = dfixed_div(c, a);
1174 a.full = dfixed_const(16);
1175 c.full = dfixed_div(c, a);
1176 priority_b_mark = dfixed_trunc(c);
1177 priority_b_cnt |= priority_b_mark & PRIORITY_MARK_MASK;
1178 }
1179
1180 /* select wm A */
1181 arb_control3 = RREG32(DPG_PIPE_ARBITRATION_CONTROL3 + amdgpu_crtc->crtc_offset);
1182 tmp = arb_control3;
1183 tmp &= ~LATENCY_WATERMARK_MASK(3);
1184 tmp |= LATENCY_WATERMARK_MASK(1);
1185 WREG32(DPG_PIPE_ARBITRATION_CONTROL3 + amdgpu_crtc->crtc_offset, tmp);
1186 WREG32(DPG_PIPE_LATENCY_CONTROL + amdgpu_crtc->crtc_offset,
1187 (LATENCY_LOW_WATERMARK(latency_watermark_a) |
1188 LATENCY_HIGH_WATERMARK(line_time)));
1189 /* select wm B */
1190 tmp = RREG32(DPG_PIPE_ARBITRATION_CONTROL3 + amdgpu_crtc->crtc_offset);
1191 tmp &= ~LATENCY_WATERMARK_MASK(3);
1192 tmp |= LATENCY_WATERMARK_MASK(2);
1193 WREG32(DPG_PIPE_ARBITRATION_CONTROL3 + amdgpu_crtc->crtc_offset, tmp);
1194 WREG32(DPG_PIPE_LATENCY_CONTROL + amdgpu_crtc->crtc_offset,
1195 (LATENCY_LOW_WATERMARK(latency_watermark_b) |
1196 LATENCY_HIGH_WATERMARK(line_time)));
1197 /* restore original selection */
1198 WREG32(DPG_PIPE_ARBITRATION_CONTROL3 + amdgpu_crtc->crtc_offset, arb_control3);
1199
1200 /* write the priority marks */
1201 WREG32(PRIORITY_A_CNT + amdgpu_crtc->crtc_offset, priority_a_cnt);
1202 WREG32(PRIORITY_B_CNT + amdgpu_crtc->crtc_offset, priority_b_cnt);
1203
1204 /* save values for DPM */
1205 amdgpu_crtc->line_time = line_time;
1206 amdgpu_crtc->wm_high = latency_watermark_a;
1207}
1208
1209/* watermark setup */
1210static u32 dce_v6_0_line_buffer_adjust(struct amdgpu_device *adev,
1211 struct amdgpu_crtc *amdgpu_crtc,
1212 struct drm_display_mode *mode,
1213 struct drm_display_mode *other_mode)
1214{
1215 u32 tmp, buffer_alloc, i;
1216 u32 pipe_offset = amdgpu_crtc->crtc_id * 0x8;
1217 /*
1218 * Line Buffer Setup
1219 * There are 3 line buffers, each one shared by 2 display controllers.
1220 * DC_LB_MEMORY_SPLIT controls how that line buffer is shared between
1221 * the display controllers. The paritioning is done via one of four
1222 * preset allocations specified in bits 21:20:
1223 * 0 - half lb
1224 * 2 - whole lb, other crtc must be disabled
1225 */
1226 /* this can get tricky if we have two large displays on a paired group
1227 * of crtcs. Ideally for multiple large displays we'd assign them to
1228 * non-linked crtcs for maximum line buffer allocation.
1229 */
1230 if (amdgpu_crtc->base.enabled && mode) {
1231 if (other_mode) {
1232 tmp = 0; /* 1/2 */
1233 buffer_alloc = 1;
1234 } else {
1235 tmp = 2; /* whole */
1236 buffer_alloc = 2;
1237 }
1238 } else {
1239 tmp = 0;
1240 buffer_alloc = 0;
1241 }
1242
1243 WREG32(DC_LB_MEMORY_SPLIT + amdgpu_crtc->crtc_offset,
1244 DC_LB_MEMORY_CONFIG(tmp));
1245
1246 WREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset,
1247 DMIF_BUFFERS_ALLOCATED(buffer_alloc));
1248 for (i = 0; i < adev->usec_timeout; i++) {
1249 if (RREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset) &
1250 DMIF_BUFFERS_ALLOCATED_COMPLETED)
1251 break;
1252 udelay(1);
1253 }
1254
1255 if (amdgpu_crtc->base.enabled && mode) {
1256 switch (tmp) {
1257 case 0:
1258 default:
1259 return 4096 * 2;
1260 case 2:
1261 return 8192 * 2;
1262 }
1263 }
1264
1265 /* controller not enabled, so no lb used */
1266 return 0;
1267}
1268
1269
1270/**
1271 *
1272 * dce_v6_0_bandwidth_update - program display watermarks
1273 *
1274 * @adev: amdgpu_device pointer
1275 *
1276 * Calculate and program the display watermarks and line
1277 * buffer allocation (CIK).
1278 */
1279static void dce_v6_0_bandwidth_update(struct amdgpu_device *adev)
1280{
1281 struct drm_display_mode *mode0 = NULL;
1282 struct drm_display_mode *mode1 = NULL;
1283 u32 num_heads = 0, lb_size;
1284 int i;
1285
1286 if (!adev->mode_info.mode_config_initialized)
1287 return;
1288
1289 amdgpu_update_display_priority(adev);
1290
1291 for (i = 0; i < adev->mode_info.num_crtc; i++) {
1292 if (adev->mode_info.crtcs[i]->base.enabled)
1293 num_heads++;
1294 }
1295 for (i = 0; i < adev->mode_info.num_crtc; i += 2) {
1296 mode0 = &adev->mode_info.crtcs[i]->base.mode;
1297 mode1 = &adev->mode_info.crtcs[i+1]->base.mode;
1298 lb_size = dce_v6_0_line_buffer_adjust(adev, adev->mode_info.crtcs[i], mode0, mode1);
1299 dce_v6_0_program_watermarks(adev, adev->mode_info.crtcs[i], lb_size, num_heads);
1300 lb_size = dce_v6_0_line_buffer_adjust(adev, adev->mode_info.crtcs[i+1], mode1, mode0);
1301 dce_v6_0_program_watermarks(adev, adev->mode_info.crtcs[i+1], lb_size, num_heads);
1302 }
1303}
1304/*
1305static void dce_v6_0_audio_get_connected_pins(struct amdgpu_device *adev)
1306{
1307 int i;
1308 u32 offset, tmp;
1309
1310 for (i = 0; i < adev->mode_info.audio.num_pins; i++) {
1311 offset = adev->mode_info.audio.pin[i].offset;
1312 tmp = RREG32_AUDIO_ENDPT(offset,
1313 AZ_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT);
1314 if (((tmp & PORT_CONNECTIVITY_MASK) >> PORT_CONNECTIVITY_SHIFT) == 1)
1315 adev->mode_info.audio.pin[i].connected = false;
1316 else
1317 adev->mode_info.audio.pin[i].connected = true;
1318 }
1319
1320}
1321
1322static struct amdgpu_audio_pin *dce_v6_0_audio_get_pin(struct amdgpu_device *adev)
1323{
1324 int i;
1325
1326 dce_v6_0_audio_get_connected_pins(adev);
1327
1328 for (i = 0; i < adev->mode_info.audio.num_pins; i++) {
1329 if (adev->mode_info.audio.pin[i].connected)
1330 return &adev->mode_info.audio.pin[i];
1331 }
1332 DRM_ERROR("No connected audio pins found!\n");
1333 return NULL;
1334}
1335
1336static void dce_v6_0_afmt_audio_select_pin(struct drm_encoder *encoder)
1337{
1338 struct amdgpu_device *adev = encoder->dev->dev_private;
1339 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1340 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
1341 u32 offset;
1342
1343 if (!dig || !dig->afmt || !dig->afmt->pin)
1344 return;
1345
1346 offset = dig->afmt->offset;
1347
1348 WREG32(AFMT_AUDIO_SRC_CONTROL + offset,
1349 AFMT_AUDIO_SRC_SELECT(dig->afmt->pin->id));
1350
1351}
1352
1353static void dce_v6_0_audio_write_latency_fields(struct drm_encoder *encoder,
1354 struct drm_display_mode *mode)
1355{
1356 DRM_INFO("xxxx: dce_v6_0_audio_write_latency_fields---no imp!!!!!\n");
1357}
1358
1359static void dce_v6_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
1360{
1361 DRM_INFO("xxxx: dce_v6_0_audio_write_speaker_allocation---no imp!!!!!\n");
1362}
1363
1364static void dce_v6_0_audio_write_sad_regs(struct drm_encoder *encoder)
1365{
1366 DRM_INFO("xxxx: dce_v6_0_audio_write_sad_regs---no imp!!!!!\n");
1367
1368}
1369*/
1370static void dce_v6_0_audio_enable(struct amdgpu_device *adev,
1371 struct amdgpu_audio_pin *pin,
1372 bool enable)
1373{
1374 DRM_INFO("xxxx: dce_v6_0_audio_enable---no imp!!!!!\n");
1375}
1376
1377static const u32 pin_offsets[7] =
1378{
1379 (0x1780 - 0x1780),
1380 (0x1786 - 0x1780),
1381 (0x178c - 0x1780),
1382 (0x1792 - 0x1780),
1383 (0x1798 - 0x1780),
1384 (0x179d - 0x1780),
1385 (0x17a4 - 0x1780),
1386};
1387
1388static int dce_v6_0_audio_init(struct amdgpu_device *adev)
1389{
1390 return 0;
1391}
1392
1393static void dce_v6_0_audio_fini(struct amdgpu_device *adev)
1394{
1395
1396}
1397
1398/*
1399static void dce_v6_0_afmt_update_ACR(struct drm_encoder *encoder, uint32_t clock)
1400{
1401 DRM_INFO("xxxx: dce_v6_0_afmt_update_ACR---no imp!!!!!\n");
1402}
1403*/
1404/*
1405 * build a HDMI Video Info Frame
1406 */
1407/*
1408static void dce_v6_0_afmt_update_avi_infoframe(struct drm_encoder *encoder,
1409 void *buffer, size_t size)
1410{
1411 DRM_INFO("xxxx: dce_v6_0_afmt_update_avi_infoframe---no imp!!!!!\n");
1412}
1413
1414static void dce_v6_0_audio_set_dto(struct drm_encoder *encoder, u32 clock)
1415{
1416 DRM_INFO("xxxx: dce_v6_0_audio_set_dto---no imp!!!!!\n");
1417}
1418*/
1419/*
1420 * update the info frames with the data from the current display mode
1421 */
1422static void dce_v6_0_afmt_setmode(struct drm_encoder *encoder,
1423 struct drm_display_mode *mode)
1424{
1425 DRM_INFO("xxxx: dce_v6_0_afmt_setmode ----no impl !!!!!!!!\n");
1426}
1427
1428static void dce_v6_0_afmt_enable(struct drm_encoder *encoder, bool enable)
1429{
1430 struct drm_device *dev = encoder->dev;
1431 struct amdgpu_device *adev = dev->dev_private;
1432 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1433 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
1434
1435 if (!dig || !dig->afmt)
1436 return;
1437
1438 /* Silent, r600_hdmi_enable will raise WARN for us */
1439 if (enable && dig->afmt->enabled)
1440 return;
1441 if (!enable && !dig->afmt->enabled)
1442 return;
1443
1444 if (!enable && dig->afmt->pin) {
1445 dce_v6_0_audio_enable(adev, dig->afmt->pin, false);
1446 dig->afmt->pin = NULL;
1447 }
1448
1449 dig->afmt->enabled = enable;
1450
1451 DRM_DEBUG("%sabling AFMT interface @ 0x%04X for encoder 0x%x\n",
1452 enable ? "En" : "Dis", dig->afmt->offset, amdgpu_encoder->encoder_id);
1453}
1454
1455static int dce_v6_0_afmt_init(struct amdgpu_device *adev)
1456{
1457 int i, j;
1458
1459 for (i = 0; i < adev->mode_info.num_dig; i++)
1460 adev->mode_info.afmt[i] = NULL;
1461
1462 /* DCE6 has audio blocks tied to DIG encoders */
1463 for (i = 0; i < adev->mode_info.num_dig; i++) {
1464 adev->mode_info.afmt[i] = kzalloc(sizeof(struct amdgpu_afmt), GFP_KERNEL);
1465 if (adev->mode_info.afmt[i]) {
1466 adev->mode_info.afmt[i]->offset = dig_offsets[i];
1467 adev->mode_info.afmt[i]->id = i;
1468 } else {
1469 for (j = 0; j < i; j++) {
1470 kfree(adev->mode_info.afmt[j]);
1471 adev->mode_info.afmt[j] = NULL;
1472 }
1473 DRM_ERROR("Out of memory allocating afmt table\n");
1474 return -ENOMEM;
1475 }
1476 }
1477 return 0;
1478}
1479
1480static void dce_v6_0_afmt_fini(struct amdgpu_device *adev)
1481{
1482 int i;
1483
1484 for (i = 0; i < adev->mode_info.num_dig; i++) {
1485 kfree(adev->mode_info.afmt[i]);
1486 adev->mode_info.afmt[i] = NULL;
1487 }
1488}
1489
1490static const u32 vga_control_regs[6] =
1491{
1492 AVIVO_D1VGA_CONTROL,
1493 AVIVO_D2VGA_CONTROL,
1494 EVERGREEN_D3VGA_CONTROL,
1495 EVERGREEN_D4VGA_CONTROL,
1496 EVERGREEN_D5VGA_CONTROL,
1497 EVERGREEN_D6VGA_CONTROL,
1498};
1499
1500static void dce_v6_0_vga_enable(struct drm_crtc *crtc, bool enable)
1501{
1502 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
1503 struct drm_device *dev = crtc->dev;
1504 struct amdgpu_device *adev = dev->dev_private;
1505 u32 vga_control;
1506
1507 vga_control = RREG32(vga_control_regs[amdgpu_crtc->crtc_id]) & ~1;
1508 WREG32(vga_control_regs[amdgpu_crtc->crtc_id], vga_control | (enable ? 1 : 0));
1509}
1510
1511static void dce_v6_0_grph_enable(struct drm_crtc *crtc, bool enable)
1512{
1513 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
1514 struct drm_device *dev = crtc->dev;
1515 struct amdgpu_device *adev = dev->dev_private;
1516
1517 WREG32(EVERGREEN_GRPH_ENABLE + amdgpu_crtc->crtc_offset, enable ? 1 : 0);
1518}
1519
1520static int dce_v6_0_crtc_do_set_base(struct drm_crtc *crtc,
1521 struct drm_framebuffer *fb,
1522 int x, int y, int atomic)
1523{
1524 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
1525 struct drm_device *dev = crtc->dev;
1526 struct amdgpu_device *adev = dev->dev_private;
1527 struct amdgpu_framebuffer *amdgpu_fb;
1528 struct drm_framebuffer *target_fb;
1529 struct drm_gem_object *obj;
1530 struct amdgpu_bo *abo;
1531 uint64_t fb_location, tiling_flags;
1532 uint32_t fb_format, fb_pitch_pixels, pipe_config;
1533 u32 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE);
1534 u32 viewport_w, viewport_h;
1535 int r;
1536 bool bypass_lut = false;
1537
1538 /* no fb bound */
1539 if (!atomic && !crtc->primary->fb) {
1540 DRM_DEBUG_KMS("No FB bound\n");
1541 return 0;
1542 }
1543
1544 if (atomic) {
1545 amdgpu_fb = to_amdgpu_framebuffer(fb);
1546 target_fb = fb;
1547 } else {
1548 amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb);
1549 target_fb = crtc->primary->fb;
1550 }
1551
1552 /* If atomic, assume fb object is pinned & idle & fenced and
1553 * just update base pointers
1554 */
1555 obj = amdgpu_fb->obj;
1556 abo = gem_to_amdgpu_bo(obj);
1557 r = amdgpu_bo_reserve(abo, false);
1558 if (unlikely(r != 0))
1559 return r;
1560
1561 if (atomic) {
1562 fb_location = amdgpu_bo_gpu_offset(abo);
1563 } else {
1564 r = amdgpu_bo_pin(abo, AMDGPU_GEM_DOMAIN_VRAM, &fb_location);
1565 if (unlikely(r != 0)) {
1566 amdgpu_bo_unreserve(abo);
1567 return -EINVAL;
1568 }
1569 }
1570
1571 amdgpu_bo_get_tiling_flags(abo, &tiling_flags);
1572 amdgpu_bo_unreserve(abo);
1573
1574 switch (target_fb->pixel_format) {
1575 case DRM_FORMAT_C8:
1576 fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_8BPP) |
1577 EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_INDEXED));
1578 break;
1579 case DRM_FORMAT_XRGB4444:
1580 case DRM_FORMAT_ARGB4444:
1581 fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_16BPP) |
1582 EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB4444));
1583#ifdef __BIG_ENDIAN
1584 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN16);
1585#endif
1586 break;
1587 case DRM_FORMAT_XRGB1555:
1588 case DRM_FORMAT_ARGB1555:
1589 fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_16BPP) |
1590 EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB1555));
1591#ifdef __BIG_ENDIAN
1592 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN16);
1593#endif
1594 break;
1595 case DRM_FORMAT_BGRX5551:
1596 case DRM_FORMAT_BGRA5551:
1597 fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_16BPP) |
1598 EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_BGRA5551));
1599#ifdef __BIG_ENDIAN
1600 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN16);
1601#endif
1602 break;
1603 case DRM_FORMAT_RGB565:
1604 fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_16BPP) |
1605 EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB565));
1606#ifdef __BIG_ENDIAN
1607 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN16);
1608#endif
1609 break;
1610 case DRM_FORMAT_XRGB8888:
1611 case DRM_FORMAT_ARGB8888:
1612 fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_32BPP) |
1613 EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB8888));
1614#ifdef __BIG_ENDIAN
1615 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN32);
1616#endif
1617 break;
1618 case DRM_FORMAT_XRGB2101010:
1619 case DRM_FORMAT_ARGB2101010:
1620 fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_32BPP) |
1621 EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB2101010));
1622#ifdef __BIG_ENDIAN
1623 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN32);
1624#endif
1625 /* Greater 8 bpc fb needs to bypass hw-lut to retain precision */
1626 bypass_lut = true;
1627 break;
1628 case DRM_FORMAT_BGRX1010102:
1629 case DRM_FORMAT_BGRA1010102:
1630 fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_32BPP) |
1631 EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_BGRA1010102));
1632#ifdef __BIG_ENDIAN
1633 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN32);
1634#endif
1635 /* Greater 8 bpc fb needs to bypass hw-lut to retain precision */
1636 bypass_lut = true;
1637 break;
1638 default:
1639 DRM_ERROR("Unsupported screen format %s\n",
1640 drm_get_format_name(target_fb->pixel_format));
1641 return -EINVAL;
1642 }
1643
1644 if (AMDGPU_TILING_GET(tiling_flags, ARRAY_MODE) == ARRAY_2D_TILED_THIN1) {
1645 unsigned bankw, bankh, mtaspect, tile_split, num_banks;
1646
1647 bankw = AMDGPU_TILING_GET(tiling_flags, BANK_WIDTH);
1648 bankh = AMDGPU_TILING_GET(tiling_flags, BANK_HEIGHT);
1649 mtaspect = AMDGPU_TILING_GET(tiling_flags, MACRO_TILE_ASPECT);
1650 tile_split = AMDGPU_TILING_GET(tiling_flags, TILE_SPLIT);
1651 num_banks = AMDGPU_TILING_GET(tiling_flags, NUM_BANKS);
1652
1653 fb_format |= EVERGREEN_GRPH_NUM_BANKS(num_banks);
1654 fb_format |= EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_2D_TILED_THIN1);
1655 fb_format |= EVERGREEN_GRPH_TILE_SPLIT(tile_split);
1656 fb_format |= EVERGREEN_GRPH_BANK_WIDTH(bankw);
1657 fb_format |= EVERGREEN_GRPH_BANK_HEIGHT(bankh);
1658 fb_format |= EVERGREEN_GRPH_MACRO_TILE_ASPECT(mtaspect);
1659 } else if (AMDGPU_TILING_GET(tiling_flags, ARRAY_MODE) == ARRAY_1D_TILED_THIN1) {
1660 fb_format |= EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_1D_TILED_THIN1);
1661 }
1662
1663 pipe_config = AMDGPU_TILING_GET(tiling_flags, PIPE_CONFIG);
1664 fb_format |= SI_GRPH_PIPE_CONFIG(pipe_config);
1665
1666 dce_v6_0_vga_enable(crtc, false);
1667
1668 /* Make sure surface address is updated at vertical blank rather than
1669 * horizontal blank
1670 */
1671 WREG32(EVERGREEN_GRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, 0);
1672
1673 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
1674 upper_32_bits(fb_location));
1675 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
1676 upper_32_bits(fb_location));
1677 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
1678 (u32)fb_location & EVERGREEN_GRPH_SURFACE_ADDRESS_MASK);
1679 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
1680 (u32) fb_location & EVERGREEN_GRPH_SURFACE_ADDRESS_MASK);
1681 WREG32(EVERGREEN_GRPH_CONTROL + amdgpu_crtc->crtc_offset, fb_format);
1682 WREG32(EVERGREEN_GRPH_SWAP_CONTROL + amdgpu_crtc->crtc_offset, fb_swap);
1683
1684 /*
1685 * The LUT only has 256 slots for indexing by a 8 bpc fb. Bypass the LUT
1686 * for > 8 bpc scanout to avoid truncation of fb indices to 8 msb's, to
1687 * retain the full precision throughout the pipeline.
1688 */
1689 WREG32_P(EVERGREEN_GRPH_LUT_10BIT_BYPASS_CONTROL + amdgpu_crtc->crtc_offset,
1690 (bypass_lut ? EVERGREEN_LUT_10BIT_BYPASS_EN : 0),
1691 ~EVERGREEN_LUT_10BIT_BYPASS_EN);
1692
1693 if (bypass_lut)
1694 DRM_DEBUG_KMS("Bypassing hardware LUT due to 10 bit fb scanout.\n");
1695
1696 WREG32(EVERGREEN_GRPH_SURFACE_OFFSET_X + amdgpu_crtc->crtc_offset, 0);
1697 WREG32(EVERGREEN_GRPH_SURFACE_OFFSET_Y + amdgpu_crtc->crtc_offset, 0);
1698 WREG32(EVERGREEN_GRPH_X_START + amdgpu_crtc->crtc_offset, 0);
1699 WREG32(EVERGREEN_GRPH_Y_START + amdgpu_crtc->crtc_offset, 0);
1700 WREG32(EVERGREEN_GRPH_X_END + amdgpu_crtc->crtc_offset, target_fb->width);
1701 WREG32(EVERGREEN_GRPH_Y_END + amdgpu_crtc->crtc_offset, target_fb->height);
1702
1703 fb_pitch_pixels = target_fb->pitches[0] / (target_fb->bits_per_pixel / 8);
1704 WREG32(EVERGREEN_GRPH_PITCH + amdgpu_crtc->crtc_offset, fb_pitch_pixels);
1705
1706 dce_v6_0_grph_enable(crtc, true);
1707
1708 WREG32(EVERGREEN_DESKTOP_HEIGHT + amdgpu_crtc->crtc_offset,
1709 target_fb->height);
1710 x &= ~3;
1711 y &= ~1;
1712 WREG32(EVERGREEN_VIEWPORT_START + amdgpu_crtc->crtc_offset,
1713 (x << 16) | y);
1714 viewport_w = crtc->mode.hdisplay;
1715 viewport_h = (crtc->mode.vdisplay + 1) & ~1;
1716
1717 WREG32(EVERGREEN_VIEWPORT_SIZE + amdgpu_crtc->crtc_offset,
1718 (viewport_w << 16) | viewport_h);
1719
1720 /* set pageflip to happen anywhere in vblank interval */
1721 WREG32(EVERGREEN_MASTER_UPDATE_MODE + amdgpu_crtc->crtc_offset, 0);
1722
1723 if (!atomic && fb && fb != crtc->primary->fb) {
1724 amdgpu_fb = to_amdgpu_framebuffer(fb);
1725 abo = gem_to_amdgpu_bo(amdgpu_fb->obj);
1726 r = amdgpu_bo_reserve(abo, false);
1727 if (unlikely(r != 0))
1728 return r;
1729 amdgpu_bo_unpin(abo);
1730 amdgpu_bo_unreserve(abo);
1731 }
1732
1733 /* Bytes per pixel may have changed */
1734 dce_v6_0_bandwidth_update(adev);
1735
1736 return 0;
1737
1738}
1739
1740static void dce_v6_0_set_interleave(struct drm_crtc *crtc,
1741 struct drm_display_mode *mode)
1742{
1743 struct drm_device *dev = crtc->dev;
1744 struct amdgpu_device *adev = dev->dev_private;
1745 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
1746
1747 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
1748 WREG32(EVERGREEN_DATA_FORMAT + amdgpu_crtc->crtc_offset,
1749 EVERGREEN_INTERLEAVE_EN);
1750 else
1751 WREG32(EVERGREEN_DATA_FORMAT + amdgpu_crtc->crtc_offset, 0);
1752}
1753
1754static void dce_v6_0_crtc_load_lut(struct drm_crtc *crtc)
1755{
1756
1757 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
1758 struct drm_device *dev = crtc->dev;
1759 struct amdgpu_device *adev = dev->dev_private;
1760 int i;
1761
1762 DRM_DEBUG_KMS("%d\n", amdgpu_crtc->crtc_id);
1763
1764 WREG32(NI_INPUT_CSC_CONTROL + amdgpu_crtc->crtc_offset,
1765 (NI_INPUT_CSC_GRPH_MODE(NI_INPUT_CSC_BYPASS) |
1766 NI_INPUT_CSC_OVL_MODE(NI_INPUT_CSC_BYPASS)));
1767 WREG32(NI_PRESCALE_GRPH_CONTROL + amdgpu_crtc->crtc_offset,
1768 NI_GRPH_PRESCALE_BYPASS);
1769 WREG32(NI_PRESCALE_OVL_CONTROL + amdgpu_crtc->crtc_offset,
1770 NI_OVL_PRESCALE_BYPASS);
1771 WREG32(NI_INPUT_GAMMA_CONTROL + amdgpu_crtc->crtc_offset,
1772 (NI_GRPH_INPUT_GAMMA_MODE(NI_INPUT_GAMMA_USE_LUT) |
1773 NI_OVL_INPUT_GAMMA_MODE(NI_INPUT_GAMMA_USE_LUT)));
1774
1775
1776
1777 WREG32(EVERGREEN_DC_LUT_CONTROL + amdgpu_crtc->crtc_offset, 0);
1778
1779 WREG32(EVERGREEN_DC_LUT_BLACK_OFFSET_BLUE + amdgpu_crtc->crtc_offset, 0);
1780 WREG32(EVERGREEN_DC_LUT_BLACK_OFFSET_GREEN + amdgpu_crtc->crtc_offset, 0);
1781 WREG32(EVERGREEN_DC_LUT_BLACK_OFFSET_RED + amdgpu_crtc->crtc_offset, 0);
1782
1783 WREG32(EVERGREEN_DC_LUT_WHITE_OFFSET_BLUE + amdgpu_crtc->crtc_offset, 0xffff);
1784 WREG32(EVERGREEN_DC_LUT_WHITE_OFFSET_GREEN + amdgpu_crtc->crtc_offset, 0xffff);
1785 WREG32(EVERGREEN_DC_LUT_WHITE_OFFSET_RED + amdgpu_crtc->crtc_offset, 0xffff);
1786
1787 WREG32(EVERGREEN_DC_LUT_RW_MODE + amdgpu_crtc->crtc_offset, 0);
1788 WREG32(EVERGREEN_DC_LUT_WRITE_EN_MASK + amdgpu_crtc->crtc_offset, 0x00000007);
1789
1790 WREG32(EVERGREEN_DC_LUT_RW_INDEX + amdgpu_crtc->crtc_offset, 0);
1791 for (i = 0; i < 256; i++) {
1792 WREG32(EVERGREEN_DC_LUT_30_COLOR + amdgpu_crtc->crtc_offset,
1793 (amdgpu_crtc->lut_r[i] << 20) |
1794 (amdgpu_crtc->lut_g[i] << 10) |
1795 (amdgpu_crtc->lut_b[i] << 0));
1796 }
1797
1798 WREG32(NI_DEGAMMA_CONTROL + amdgpu_crtc->crtc_offset,
1799 (NI_GRPH_DEGAMMA_MODE(NI_DEGAMMA_BYPASS) |
1800 NI_OVL_DEGAMMA_MODE(NI_DEGAMMA_BYPASS) |
1801 NI_ICON_DEGAMMA_MODE(NI_DEGAMMA_BYPASS) |
1802 NI_CURSOR_DEGAMMA_MODE(NI_DEGAMMA_BYPASS)));
1803 WREG32(NI_GAMUT_REMAP_CONTROL + amdgpu_crtc->crtc_offset,
1804 (NI_GRPH_GAMUT_REMAP_MODE(NI_GAMUT_REMAP_BYPASS) |
1805 NI_OVL_GAMUT_REMAP_MODE(NI_GAMUT_REMAP_BYPASS)));
1806 WREG32(NI_REGAMMA_CONTROL + amdgpu_crtc->crtc_offset,
1807 (NI_GRPH_REGAMMA_MODE(NI_REGAMMA_BYPASS) |
1808 NI_OVL_REGAMMA_MODE(NI_REGAMMA_BYPASS)));
1809 WREG32(NI_OUTPUT_CSC_CONTROL + amdgpu_crtc->crtc_offset,
1810 (NI_OUTPUT_CSC_GRPH_MODE(0) |
1811 NI_OUTPUT_CSC_OVL_MODE(NI_OUTPUT_CSC_BYPASS)));
1812 /* XXX match this to the depth of the crtc fmt block, move to modeset? */
1813 WREG32(0x1a50 + amdgpu_crtc->crtc_offset, 0);
1814
1815
1816}
1817
1818static int dce_v6_0_pick_dig_encoder(struct drm_encoder *encoder)
1819{
1820 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
1821 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
1822
1823 switch (amdgpu_encoder->encoder_id) {
1824 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1825 return dig->linkb ? 1 : 0;
1826 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1827 return dig->linkb ? 3 : 2;
1828 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1829 return dig->linkb ? 5 : 4;
1830 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
1831 return 6;
1832 default:
1833 DRM_ERROR("invalid encoder_id: 0x%x\n", amdgpu_encoder->encoder_id);
1834 return 0;
1835 }
1836}
1837
1838/**
1839 * dce_v6_0_pick_pll - Allocate a PPLL for use by the crtc.
1840 *
1841 * @crtc: drm crtc
1842 *
1843 * Returns the PPLL (Pixel PLL) to be used by the crtc. For DP monitors
1844 * a single PPLL can be used for all DP crtcs/encoders. For non-DP
1845 * monitors a dedicated PPLL must be used. If a particular board has
1846 * an external DP PLL, return ATOM_PPLL_INVALID to skip PLL programming
1847 * as there is no need to program the PLL itself. If we are not able to
1848 * allocate a PLL, return ATOM_PPLL_INVALID to skip PLL programming to
1849 * avoid messing up an existing monitor.
1850 *
1851 *
1852 */
1853static u32 dce_v6_0_pick_pll(struct drm_crtc *crtc)
1854{
1855 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
1856 struct drm_device *dev = crtc->dev;
1857 struct amdgpu_device *adev = dev->dev_private;
1858 u32 pll_in_use;
1859 int pll;
1860
1861 if (ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(amdgpu_crtc->encoder))) {
1862 if (adev->clock.dp_extclk)
1863 /* skip PPLL programming if using ext clock */
1864 return ATOM_PPLL_INVALID;
1865 else
1866 return ATOM_PPLL0;
1867 } else {
1868 /* use the same PPLL for all monitors with the same clock */
1869 pll = amdgpu_pll_get_shared_nondp_ppll(crtc);
1870 if (pll != ATOM_PPLL_INVALID)
1871 return pll;
1872 }
1873
1874 /* PPLL1, and PPLL2 */
1875 pll_in_use = amdgpu_pll_get_use_mask(crtc);
1876 if (!(pll_in_use & (1 << ATOM_PPLL2)))
1877 return ATOM_PPLL2;
1878 if (!(pll_in_use & (1 << ATOM_PPLL1)))
1879 return ATOM_PPLL1;
1880 DRM_ERROR("unable to allocate a PPLL\n");
1881 return ATOM_PPLL_INVALID;
1882}
1883
1884static void dce_v6_0_lock_cursor(struct drm_crtc *crtc, bool lock)
1885{
1886 struct amdgpu_device *adev = crtc->dev->dev_private;
1887 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
1888 uint32_t cur_lock;
1889
1890 cur_lock = RREG32(EVERGREEN_CUR_UPDATE + amdgpu_crtc->crtc_offset);
1891 if (lock)
1892 cur_lock |= EVERGREEN_CURSOR_UPDATE_LOCK;
1893 else
1894 cur_lock &= ~EVERGREEN_CURSOR_UPDATE_LOCK;
1895 WREG32(EVERGREEN_CUR_UPDATE + amdgpu_crtc->crtc_offset, cur_lock);
1896}
1897
1898static void dce_v6_0_hide_cursor(struct drm_crtc *crtc)
1899{
1900 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
1901 struct amdgpu_device *adev = crtc->dev->dev_private;
1902
1903 WREG32_IDX(EVERGREEN_CUR_CONTROL + amdgpu_crtc->crtc_offset,
1904 EVERGREEN_CURSOR_MODE(EVERGREEN_CURSOR_24_8_PRE_MULT) |
1905 EVERGREEN_CURSOR_URGENT_CONTROL(EVERGREEN_CURSOR_URGENT_1_2));
1906
1907
1908}
1909
1910static void dce_v6_0_show_cursor(struct drm_crtc *crtc)
1911{
1912 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
1913 struct amdgpu_device *adev = crtc->dev->dev_private;
1914
1915 WREG32(EVERGREEN_CUR_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
1916 upper_32_bits(amdgpu_crtc->cursor_addr));
1917 WREG32(EVERGREEN_CUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
1918 lower_32_bits(amdgpu_crtc->cursor_addr));
1919
1920 WREG32_IDX(EVERGREEN_CUR_CONTROL + amdgpu_crtc->crtc_offset,
1921 EVERGREEN_CURSOR_EN |
1922 EVERGREEN_CURSOR_MODE(EVERGREEN_CURSOR_24_8_PRE_MULT) |
1923 EVERGREEN_CURSOR_URGENT_CONTROL(EVERGREEN_CURSOR_URGENT_1_2));
1924
1925}
1926
1927static int dce_v6_0_cursor_move_locked(struct drm_crtc *crtc,
1928 int x, int y)
1929{
1930 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
1931 struct amdgpu_device *adev = crtc->dev->dev_private;
1932 int xorigin = 0, yorigin = 0;
1933
1934 int w = amdgpu_crtc->cursor_width;
1935
1936 /* avivo cursor are offset into the total surface */
1937 x += crtc->x;
1938 y += crtc->y;
1939 DRM_DEBUG("x %d y %d c->x %d c->y %d\n", x, y, crtc->x, crtc->y);
1940
1941 if (x < 0) {
1942 xorigin = min(-x, amdgpu_crtc->max_cursor_width - 1);
1943 x = 0;
1944 }
1945 if (y < 0) {
1946 yorigin = min(-y, amdgpu_crtc->max_cursor_height - 1);
1947 y = 0;
1948 }
1949
1950 WREG32(EVERGREEN_CUR_POSITION + amdgpu_crtc->crtc_offset, (x << 16) | y);
1951 WREG32(EVERGREEN_CUR_HOT_SPOT + amdgpu_crtc->crtc_offset, (xorigin << 16) | yorigin);
1952 WREG32(EVERGREEN_CUR_SIZE + amdgpu_crtc->crtc_offset,
1953 ((w - 1) << 16) | (amdgpu_crtc->cursor_height - 1));
1954
1955 amdgpu_crtc->cursor_x = x;
1956 amdgpu_crtc->cursor_y = y;
1957 return 0;
1958}
1959
1960static int dce_v6_0_crtc_cursor_move(struct drm_crtc *crtc,
1961 int x, int y)
1962{
1963 int ret;
1964
1965 dce_v6_0_lock_cursor(crtc, true);
1966 ret = dce_v6_0_cursor_move_locked(crtc, x, y);
1967 dce_v6_0_lock_cursor(crtc, false);
1968
1969 return ret;
1970}
1971
1972static int dce_v6_0_crtc_cursor_set2(struct drm_crtc *crtc,
1973 struct drm_file *file_priv,
1974 uint32_t handle,
1975 uint32_t width,
1976 uint32_t height,
1977 int32_t hot_x,
1978 int32_t hot_y)
1979{
1980 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
1981 struct drm_gem_object *obj;
1982 struct amdgpu_bo *aobj;
1983 int ret;
1984
1985 if (!handle) {
1986 /* turn off cursor */
1987 dce_v6_0_hide_cursor(crtc);
1988 obj = NULL;
1989 goto unpin;
1990 }
1991
1992 if ((width > amdgpu_crtc->max_cursor_width) ||
1993 (height > amdgpu_crtc->max_cursor_height)) {
1994 DRM_ERROR("bad cursor width or height %d x %d\n", width, height);
1995 return -EINVAL;
1996 }
1997
1998 obj = drm_gem_object_lookup(file_priv, handle);
1999 if (!obj) {
2000 DRM_ERROR("Cannot find cursor object %x for crtc %d\n", handle, amdgpu_crtc->crtc_id);
2001 return -ENOENT;
2002 }
2003
2004 aobj = gem_to_amdgpu_bo(obj);
2005 ret = amdgpu_bo_reserve(aobj, false);
2006 if (ret != 0) {
2007 drm_gem_object_unreference_unlocked(obj);
2008 return ret;
2009 }
2010
2011 ret = amdgpu_bo_pin(aobj, AMDGPU_GEM_DOMAIN_VRAM, &amdgpu_crtc->cursor_addr);
2012 amdgpu_bo_unreserve(aobj);
2013 if (ret) {
2014 DRM_ERROR("Failed to pin new cursor BO (%d)\n", ret);
2015 drm_gem_object_unreference_unlocked(obj);
2016 return ret;
2017 }
2018
2019 amdgpu_crtc->cursor_width = width;
2020 amdgpu_crtc->cursor_height = height;
2021
2022 dce_v6_0_lock_cursor(crtc, true);
2023
2024 if (hot_x != amdgpu_crtc->cursor_hot_x ||
2025 hot_y != amdgpu_crtc->cursor_hot_y) {
2026 int x, y;
2027
2028 x = amdgpu_crtc->cursor_x + amdgpu_crtc->cursor_hot_x - hot_x;
2029 y = amdgpu_crtc->cursor_y + amdgpu_crtc->cursor_hot_y - hot_y;
2030
2031 dce_v6_0_cursor_move_locked(crtc, x, y);
2032
2033 amdgpu_crtc->cursor_hot_x = hot_x;
2034 amdgpu_crtc->cursor_hot_y = hot_y;
2035 }
2036
2037 dce_v6_0_show_cursor(crtc);
2038 dce_v6_0_lock_cursor(crtc, false);
2039
2040unpin:
2041 if (amdgpu_crtc->cursor_bo) {
2042 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
2043 ret = amdgpu_bo_reserve(aobj, false);
2044 if (likely(ret == 0)) {
2045 amdgpu_bo_unpin(aobj);
2046 amdgpu_bo_unreserve(aobj);
2047 }
2048 drm_gem_object_unreference_unlocked(amdgpu_crtc->cursor_bo);
2049 }
2050
2051 amdgpu_crtc->cursor_bo = obj;
2052 return 0;
2053}
2054
2055static void dce_v6_0_cursor_reset(struct drm_crtc *crtc)
2056{
2057 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2058
2059 if (amdgpu_crtc->cursor_bo) {
2060 dce_v6_0_lock_cursor(crtc, true);
2061
2062 dce_v6_0_cursor_move_locked(crtc, amdgpu_crtc->cursor_x,
2063 amdgpu_crtc->cursor_y);
2064
2065 dce_v6_0_show_cursor(crtc);
2066 dce_v6_0_lock_cursor(crtc, false);
2067 }
2068}
2069
2070static int dce_v6_0_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
2071 u16 *blue, uint32_t size)
2072{
2073 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2074 int i;
2075
2076 /* userspace palettes are always correct as is */
2077 for (i = 0; i < size; i++) {
2078 amdgpu_crtc->lut_r[i] = red[i] >> 6;
2079 amdgpu_crtc->lut_g[i] = green[i] >> 6;
2080 amdgpu_crtc->lut_b[i] = blue[i] >> 6;
2081 }
2082 dce_v6_0_crtc_load_lut(crtc);
2083
2084 return 0;
2085}
2086
2087static void dce_v6_0_crtc_destroy(struct drm_crtc *crtc)
2088{
2089 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2090
2091 drm_crtc_cleanup(crtc);
2092 kfree(amdgpu_crtc);
2093}
2094
2095static const struct drm_crtc_funcs dce_v6_0_crtc_funcs = {
2096 .cursor_set2 = dce_v6_0_crtc_cursor_set2,
2097 .cursor_move = dce_v6_0_crtc_cursor_move,
2098 .gamma_set = dce_v6_0_crtc_gamma_set,
2099 .set_config = amdgpu_crtc_set_config,
2100 .destroy = dce_v6_0_crtc_destroy,
2101 .page_flip_target = amdgpu_crtc_page_flip_target,
2102};
2103
2104static void dce_v6_0_crtc_dpms(struct drm_crtc *crtc, int mode)
2105{
2106 struct drm_device *dev = crtc->dev;
2107 struct amdgpu_device *adev = dev->dev_private;
2108 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2109 unsigned type;
2110
2111 switch (mode) {
2112 case DRM_MODE_DPMS_ON:
2113 amdgpu_crtc->enabled = true;
2114 amdgpu_atombios_crtc_enable(crtc, ATOM_ENABLE);
2115 amdgpu_atombios_crtc_blank(crtc, ATOM_DISABLE);
2116 /* Make sure VBLANK and PFLIP interrupts are still enabled */
2117 type = amdgpu_crtc_idx_to_irq_type(adev, amdgpu_crtc->crtc_id);
2118 amdgpu_irq_update(adev, &adev->crtc_irq, type);
2119 amdgpu_irq_update(adev, &adev->pageflip_irq, type);
2120 drm_vblank_post_modeset(dev, amdgpu_crtc->crtc_id);
2121 dce_v6_0_crtc_load_lut(crtc);
2122 break;
2123 case DRM_MODE_DPMS_STANDBY:
2124 case DRM_MODE_DPMS_SUSPEND:
2125 case DRM_MODE_DPMS_OFF:
2126 drm_vblank_pre_modeset(dev, amdgpu_crtc->crtc_id);
2127 if (amdgpu_crtc->enabled)
2128 amdgpu_atombios_crtc_blank(crtc, ATOM_ENABLE);
2129 amdgpu_atombios_crtc_enable(crtc, ATOM_DISABLE);
2130 amdgpu_crtc->enabled = false;
2131 break;
2132 }
2133 /* adjust pm to dpms */
2134 amdgpu_pm_compute_clocks(adev);
2135}
2136
2137static void dce_v6_0_crtc_prepare(struct drm_crtc *crtc)
2138{
2139 /* disable crtc pair power gating before programming */
2140 amdgpu_atombios_crtc_powergate(crtc, ATOM_DISABLE);
2141 amdgpu_atombios_crtc_lock(crtc, ATOM_ENABLE);
2142 dce_v6_0_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
2143}
2144
2145static void dce_v6_0_crtc_commit(struct drm_crtc *crtc)
2146{
2147 dce_v6_0_crtc_dpms(crtc, DRM_MODE_DPMS_ON);
2148 amdgpu_atombios_crtc_lock(crtc, ATOM_DISABLE);
2149}
2150
2151static void dce_v6_0_crtc_disable(struct drm_crtc *crtc)
2152{
2153
2154 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2155 struct drm_device *dev = crtc->dev;
2156 struct amdgpu_device *adev = dev->dev_private;
2157 struct amdgpu_atom_ss ss;
2158 int i;
2159
2160 dce_v6_0_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
2161 if (crtc->primary->fb) {
2162 int r;
2163 struct amdgpu_framebuffer *amdgpu_fb;
2164 struct amdgpu_bo *abo;
2165
2166 amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb);
2167 abo = gem_to_amdgpu_bo(amdgpu_fb->obj);
2168 r = amdgpu_bo_reserve(abo, false);
2169 if (unlikely(r))
2170 DRM_ERROR("failed to reserve abo before unpin\n");
2171 else {
2172 amdgpu_bo_unpin(abo);
2173 amdgpu_bo_unreserve(abo);
2174 }
2175 }
2176 /* disable the GRPH */
2177 dce_v6_0_grph_enable(crtc, false);
2178
2179 amdgpu_atombios_crtc_powergate(crtc, ATOM_ENABLE);
2180
2181 for (i = 0; i < adev->mode_info.num_crtc; i++) {
2182 if (adev->mode_info.crtcs[i] &&
2183 adev->mode_info.crtcs[i]->enabled &&
2184 i != amdgpu_crtc->crtc_id &&
2185 amdgpu_crtc->pll_id == adev->mode_info.crtcs[i]->pll_id) {
2186 /* one other crtc is using this pll don't turn
2187 * off the pll
2188 */
2189 goto done;
2190 }
2191 }
2192
2193 switch (amdgpu_crtc->pll_id) {
2194 case ATOM_PPLL1:
2195 case ATOM_PPLL2:
2196 /* disable the ppll */
2197 amdgpu_atombios_crtc_program_pll(crtc, amdgpu_crtc->crtc_id, amdgpu_crtc->pll_id,
2198 0, 0, ATOM_DISABLE, 0, 0, 0, 0, 0, false, &ss);
2199 break;
2200 default:
2201 break;
2202 }
2203done:
2204 amdgpu_crtc->pll_id = ATOM_PPLL_INVALID;
2205 amdgpu_crtc->adjusted_clock = 0;
2206 amdgpu_crtc->encoder = NULL;
2207 amdgpu_crtc->connector = NULL;
2208}
2209
2210static int dce_v6_0_crtc_mode_set(struct drm_crtc *crtc,
2211 struct drm_display_mode *mode,
2212 struct drm_display_mode *adjusted_mode,
2213 int x, int y, struct drm_framebuffer *old_fb)
2214{
2215 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2216
2217 if (!amdgpu_crtc->adjusted_clock)
2218 return -EINVAL;
2219
2220 amdgpu_atombios_crtc_set_pll(crtc, adjusted_mode);
2221 amdgpu_atombios_crtc_set_dtd_timing(crtc, adjusted_mode);
2222 dce_v6_0_crtc_do_set_base(crtc, old_fb, x, y, 0);
2223 amdgpu_atombios_crtc_overscan_setup(crtc, mode, adjusted_mode);
2224 amdgpu_atombios_crtc_scaler_setup(crtc);
2225 dce_v6_0_cursor_reset(crtc);
2226 /* update the hw version fpr dpm */
2227 amdgpu_crtc->hw_mode = *adjusted_mode;
2228
2229 return 0;
2230}
2231
2232static bool dce_v6_0_crtc_mode_fixup(struct drm_crtc *crtc,
2233 const struct drm_display_mode *mode,
2234 struct drm_display_mode *adjusted_mode)
2235{
2236
2237 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
2238 struct drm_device *dev = crtc->dev;
2239 struct drm_encoder *encoder;
2240
2241 /* assign the encoder to the amdgpu crtc to avoid repeated lookups later */
2242 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
2243 if (encoder->crtc == crtc) {
2244 amdgpu_crtc->encoder = encoder;
2245 amdgpu_crtc->connector = amdgpu_get_connector_for_encoder(encoder);
2246 break;
2247 }
2248 }
2249 if ((amdgpu_crtc->encoder == NULL) || (amdgpu_crtc->connector == NULL)) {
2250 amdgpu_crtc->encoder = NULL;
2251 amdgpu_crtc->connector = NULL;
2252 return false;
2253 }
2254 if (!amdgpu_crtc_scaling_mode_fixup(crtc, mode, adjusted_mode))
2255 return false;
2256 if (amdgpu_atombios_crtc_prepare_pll(crtc, adjusted_mode))
2257 return false;
2258 /* pick pll */
2259 amdgpu_crtc->pll_id = dce_v6_0_pick_pll(crtc);
2260 /* if we can't get a PPLL for a non-DP encoder, fail */
2261 if ((amdgpu_crtc->pll_id == ATOM_PPLL_INVALID) &&
2262 !ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(amdgpu_crtc->encoder)))
2263 return false;
2264
2265 return true;
2266}
2267
2268static int dce_v6_0_crtc_set_base(struct drm_crtc *crtc, int x, int y,
2269 struct drm_framebuffer *old_fb)
2270{
2271 return dce_v6_0_crtc_do_set_base(crtc, old_fb, x, y, 0);
2272}
2273
2274static int dce_v6_0_crtc_set_base_atomic(struct drm_crtc *crtc,
2275 struct drm_framebuffer *fb,
2276 int x, int y, enum mode_set_atomic state)
2277{
2278 return dce_v6_0_crtc_do_set_base(crtc, fb, x, y, 1);
2279}
2280
2281static const struct drm_crtc_helper_funcs dce_v6_0_crtc_helper_funcs = {
2282 .dpms = dce_v6_0_crtc_dpms,
2283 .mode_fixup = dce_v6_0_crtc_mode_fixup,
2284 .mode_set = dce_v6_0_crtc_mode_set,
2285 .mode_set_base = dce_v6_0_crtc_set_base,
2286 .mode_set_base_atomic = dce_v6_0_crtc_set_base_atomic,
2287 .prepare = dce_v6_0_crtc_prepare,
2288 .commit = dce_v6_0_crtc_commit,
2289 .load_lut = dce_v6_0_crtc_load_lut,
2290 .disable = dce_v6_0_crtc_disable,
2291};
2292
2293static int dce_v6_0_crtc_init(struct amdgpu_device *adev, int index)
2294{
2295 struct amdgpu_crtc *amdgpu_crtc;
2296 int i;
2297
2298 amdgpu_crtc = kzalloc(sizeof(struct amdgpu_crtc) +
2299 (AMDGPUFB_CONN_LIMIT * sizeof(struct drm_connector *)), GFP_KERNEL);
2300 if (amdgpu_crtc == NULL)
2301 return -ENOMEM;
2302
2303 drm_crtc_init(adev->ddev, &amdgpu_crtc->base, &dce_v6_0_crtc_funcs);
2304
2305 drm_mode_crtc_set_gamma_size(&amdgpu_crtc->base, 256);
2306 amdgpu_crtc->crtc_id = index;
2307 adev->mode_info.crtcs[index] = amdgpu_crtc;
2308
2309 amdgpu_crtc->max_cursor_width = CURSOR_WIDTH;
2310 amdgpu_crtc->max_cursor_height = CURSOR_HEIGHT;
2311 adev->ddev->mode_config.cursor_width = amdgpu_crtc->max_cursor_width;
2312 adev->ddev->mode_config.cursor_height = amdgpu_crtc->max_cursor_height;
2313
2314 for (i = 0; i < 256; i++) {
2315 amdgpu_crtc->lut_r[i] = i << 2;
2316 amdgpu_crtc->lut_g[i] = i << 2;
2317 amdgpu_crtc->lut_b[i] = i << 2;
2318 }
2319
2320 amdgpu_crtc->crtc_offset = crtc_offsets[amdgpu_crtc->crtc_id];
2321
2322 amdgpu_crtc->pll_id = ATOM_PPLL_INVALID;
2323 amdgpu_crtc->adjusted_clock = 0;
2324 amdgpu_crtc->encoder = NULL;
2325 amdgpu_crtc->connector = NULL;
2326 drm_crtc_helper_add(&amdgpu_crtc->base, &dce_v6_0_crtc_helper_funcs);
2327
2328 return 0;
2329}
2330
2331static int dce_v6_0_early_init(void *handle)
2332{
2333 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2334
2335 adev->audio_endpt_rreg = &dce_v6_0_audio_endpt_rreg;
2336 adev->audio_endpt_wreg = &dce_v6_0_audio_endpt_wreg;
2337
2338 dce_v6_0_set_display_funcs(adev);
2339 dce_v6_0_set_irq_funcs(adev);
2340
2341 switch (adev->asic_type) {
2342 case CHIP_TAHITI:
2343 case CHIP_PITCAIRN:
2344 case CHIP_VERDE:
2345 adev->mode_info.num_crtc = 6;
2346 adev->mode_info.num_hpd = 6;
2347 adev->mode_info.num_dig = 6;
2348 break;
2349 case CHIP_OLAND:
2350 adev->mode_info.num_crtc = 2;
2351 adev->mode_info.num_hpd = 2;
2352 adev->mode_info.num_dig = 2;
2353 break;
2354 default:
2355 /* FIXME: not supported yet */
2356 return -EINVAL;
2357 }
2358
2359 return 0;
2360}
2361
2362static int dce_v6_0_sw_init(void *handle)
2363{
2364 int r, i;
2365 bool ret;
2366 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2367
2368 for (i = 0; i < adev->mode_info.num_crtc; i++) {
2369 r = amdgpu_irq_add_id(adev, i + 1, &adev->crtc_irq);
2370 if (r)
2371 return r;
2372 }
2373
2374 for (i = 8; i < 20; i += 2) {
2375 r = amdgpu_irq_add_id(adev, i, &adev->pageflip_irq);
2376 if (r)
2377 return r;
2378 }
2379
2380 /* HPD hotplug */
2381 r = amdgpu_irq_add_id(adev, 42, &adev->hpd_irq);
2382 if (r)
2383 return r;
2384
2385 adev->mode_info.mode_config_initialized = true;
2386
2387 adev->ddev->mode_config.funcs = &amdgpu_mode_funcs;
2388 adev->ddev->mode_config.async_page_flip = true;
2389 adev->ddev->mode_config.max_width = 16384;
2390 adev->ddev->mode_config.max_height = 16384;
2391 adev->ddev->mode_config.preferred_depth = 24;
2392 adev->ddev->mode_config.prefer_shadow = 1;
2393 adev->ddev->mode_config.fb_base = adev->mc.aper_base;
2394
2395 r = amdgpu_modeset_create_props(adev);
2396 if (r)
2397 return r;
2398
2399 adev->ddev->mode_config.max_width = 16384;
2400 adev->ddev->mode_config.max_height = 16384;
2401
2402 /* allocate crtcs */
2403 for (i = 0; i < adev->mode_info.num_crtc; i++) {
2404 r = dce_v6_0_crtc_init(adev, i);
2405 if (r)
2406 return r;
2407 }
2408
2409 ret = amdgpu_atombios_get_connector_info_from_object_table(adev);
2410 if (ret)
2411 amdgpu_print_display_setup(adev->ddev);
2412 else
2413 return -EINVAL;
2414
2415 /* setup afmt */
2416 r = dce_v6_0_afmt_init(adev);
2417 if (r)
2418 return r;
2419
2420 r = dce_v6_0_audio_init(adev);
2421 if (r)
2422 return r;
2423
2424 drm_kms_helper_poll_init(adev->ddev);
2425
2426 return r;
2427}
2428
2429static int dce_v6_0_sw_fini(void *handle)
2430{
2431 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2432
2433 kfree(adev->mode_info.bios_hardcoded_edid);
2434
2435 drm_kms_helper_poll_fini(adev->ddev);
2436
2437 dce_v6_0_audio_fini(adev);
2438 dce_v6_0_afmt_fini(adev);
2439
2440 drm_mode_config_cleanup(adev->ddev);
2441 adev->mode_info.mode_config_initialized = false;
2442
2443 return 0;
2444}
2445
2446static int dce_v6_0_hw_init(void *handle)
2447{
2448 int i;
2449 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2450
2451 /* init dig PHYs, disp eng pll */
2452 amdgpu_atombios_encoder_init_dig(adev);
2453 amdgpu_atombios_crtc_set_disp_eng_pll(adev, adev->clock.default_dispclk);
2454
2455 /* initialize hpd */
2456 dce_v6_0_hpd_init(adev);
2457
2458 for (i = 0; i < adev->mode_info.audio.num_pins; i++) {
2459 dce_v6_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false);
2460 }
2461
2462 dce_v6_0_pageflip_interrupt_init(adev);
2463
2464 return 0;
2465}
2466
2467static int dce_v6_0_hw_fini(void *handle)
2468{
2469 int i;
2470 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2471
2472 dce_v6_0_hpd_fini(adev);
2473
2474 for (i = 0; i < adev->mode_info.audio.num_pins; i++) {
2475 dce_v6_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false);
2476 }
2477
2478 dce_v6_0_pageflip_interrupt_fini(adev);
2479
2480 return 0;
2481}
2482
2483static int dce_v6_0_suspend(void *handle)
2484{
2485 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2486
2487 amdgpu_atombios_scratch_regs_save(adev);
2488
2489 return dce_v6_0_hw_fini(handle);
2490}
2491
2492static int dce_v6_0_resume(void *handle)
2493{
2494 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2495 int ret;
2496
2497 ret = dce_v6_0_hw_init(handle);
2498
2499 amdgpu_atombios_scratch_regs_restore(adev);
2500
2501 /* turn on the BL */
2502 if (adev->mode_info.bl_encoder) {
2503 u8 bl_level = amdgpu_display_backlight_get_level(adev,
2504 adev->mode_info.bl_encoder);
2505 amdgpu_display_backlight_set_level(adev, adev->mode_info.bl_encoder,
2506 bl_level);
2507 }
2508
2509 return ret;
2510}
2511
2512static bool dce_v6_0_is_idle(void *handle)
2513{
2514 return true;
2515}
2516
2517static int dce_v6_0_wait_for_idle(void *handle)
2518{
2519 return 0;
2520}
2521
2522static int dce_v6_0_soft_reset(void *handle)
2523{
2524 DRM_INFO("xxxx: dce_v6_0_soft_reset --- no impl!!\n");
2525 return 0;
2526}
2527
2528static void dce_v6_0_set_crtc_vblank_interrupt_state(struct amdgpu_device *adev,
2529 int crtc,
2530 enum amdgpu_interrupt_state state)
2531{
2532 u32 reg_block, interrupt_mask;
2533
2534 if (crtc >= adev->mode_info.num_crtc) {
2535 DRM_DEBUG("invalid crtc %d\n", crtc);
2536 return;
2537 }
2538
2539 switch (crtc) {
2540 case 0:
2541 reg_block = SI_CRTC0_REGISTER_OFFSET;
2542 break;
2543 case 1:
2544 reg_block = SI_CRTC1_REGISTER_OFFSET;
2545 break;
2546 case 2:
2547 reg_block = SI_CRTC2_REGISTER_OFFSET;
2548 break;
2549 case 3:
2550 reg_block = SI_CRTC3_REGISTER_OFFSET;
2551 break;
2552 case 4:
2553 reg_block = SI_CRTC4_REGISTER_OFFSET;
2554 break;
2555 case 5:
2556 reg_block = SI_CRTC5_REGISTER_OFFSET;
2557 break;
2558 default:
2559 DRM_DEBUG("invalid crtc %d\n", crtc);
2560 return;
2561 }
2562
2563 switch (state) {
2564 case AMDGPU_IRQ_STATE_DISABLE:
2565 interrupt_mask = RREG32(INT_MASK + reg_block);
2566 interrupt_mask &= ~VBLANK_INT_MASK;
2567 WREG32(INT_MASK + reg_block, interrupt_mask);
2568 break;
2569 case AMDGPU_IRQ_STATE_ENABLE:
2570 interrupt_mask = RREG32(INT_MASK + reg_block);
2571 interrupt_mask |= VBLANK_INT_MASK;
2572 WREG32(INT_MASK + reg_block, interrupt_mask);
2573 break;
2574 default:
2575 break;
2576 }
2577}
2578
2579static void dce_v6_0_set_crtc_vline_interrupt_state(struct amdgpu_device *adev,
2580 int crtc,
2581 enum amdgpu_interrupt_state state)
2582{
2583
2584}
2585
2586static int dce_v6_0_set_hpd_interrupt_state(struct amdgpu_device *adev,
2587 struct amdgpu_irq_src *src,
2588 unsigned type,
2589 enum amdgpu_interrupt_state state)
2590{
2591 u32 dc_hpd_int_cntl_reg, dc_hpd_int_cntl;
2592
2593 switch (type) {
2594 case AMDGPU_HPD_1:
2595 dc_hpd_int_cntl_reg = DC_HPD1_INT_CONTROL;
2596 break;
2597 case AMDGPU_HPD_2:
2598 dc_hpd_int_cntl_reg = DC_HPD2_INT_CONTROL;
2599 break;
2600 case AMDGPU_HPD_3:
2601 dc_hpd_int_cntl_reg = DC_HPD3_INT_CONTROL;
2602 break;
2603 case AMDGPU_HPD_4:
2604 dc_hpd_int_cntl_reg = DC_HPD4_INT_CONTROL;
2605 break;
2606 case AMDGPU_HPD_5:
2607 dc_hpd_int_cntl_reg = DC_HPD5_INT_CONTROL;
2608 break;
2609 case AMDGPU_HPD_6:
2610 dc_hpd_int_cntl_reg = DC_HPD6_INT_CONTROL;
2611 break;
2612 default:
2613 DRM_DEBUG("invalid hdp %d\n", type);
2614 return 0;
2615 }
2616
2617 switch (state) {
2618 case AMDGPU_IRQ_STATE_DISABLE:
2619 dc_hpd_int_cntl = RREG32(dc_hpd_int_cntl_reg);
2620 dc_hpd_int_cntl &= ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
2621 WREG32(dc_hpd_int_cntl_reg, dc_hpd_int_cntl);
2622 break;
2623 case AMDGPU_IRQ_STATE_ENABLE:
2624 dc_hpd_int_cntl = RREG32(dc_hpd_int_cntl_reg);
2625 dc_hpd_int_cntl |= (DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN);
2626 WREG32(dc_hpd_int_cntl_reg, dc_hpd_int_cntl);
2627 break;
2628 default:
2629 break;
2630 }
2631
2632 return 0;
2633}
2634
2635static int dce_v6_0_set_crtc_interrupt_state(struct amdgpu_device *adev,
2636 struct amdgpu_irq_src *src,
2637 unsigned type,
2638 enum amdgpu_interrupt_state state)
2639{
2640 switch (type) {
2641 case AMDGPU_CRTC_IRQ_VBLANK1:
2642 dce_v6_0_set_crtc_vblank_interrupt_state(adev, 0, state);
2643 break;
2644 case AMDGPU_CRTC_IRQ_VBLANK2:
2645 dce_v6_0_set_crtc_vblank_interrupt_state(adev, 1, state);
2646 break;
2647 case AMDGPU_CRTC_IRQ_VBLANK3:
2648 dce_v6_0_set_crtc_vblank_interrupt_state(adev, 2, state);
2649 break;
2650 case AMDGPU_CRTC_IRQ_VBLANK4:
2651 dce_v6_0_set_crtc_vblank_interrupt_state(adev, 3, state);
2652 break;
2653 case AMDGPU_CRTC_IRQ_VBLANK5:
2654 dce_v6_0_set_crtc_vblank_interrupt_state(adev, 4, state);
2655 break;
2656 case AMDGPU_CRTC_IRQ_VBLANK6:
2657 dce_v6_0_set_crtc_vblank_interrupt_state(adev, 5, state);
2658 break;
2659 case AMDGPU_CRTC_IRQ_VLINE1:
2660 dce_v6_0_set_crtc_vline_interrupt_state(adev, 0, state);
2661 break;
2662 case AMDGPU_CRTC_IRQ_VLINE2:
2663 dce_v6_0_set_crtc_vline_interrupt_state(adev, 1, state);
2664 break;
2665 case AMDGPU_CRTC_IRQ_VLINE3:
2666 dce_v6_0_set_crtc_vline_interrupt_state(adev, 2, state);
2667 break;
2668 case AMDGPU_CRTC_IRQ_VLINE4:
2669 dce_v6_0_set_crtc_vline_interrupt_state(adev, 3, state);
2670 break;
2671 case AMDGPU_CRTC_IRQ_VLINE5:
2672 dce_v6_0_set_crtc_vline_interrupt_state(adev, 4, state);
2673 break;
2674 case AMDGPU_CRTC_IRQ_VLINE6:
2675 dce_v6_0_set_crtc_vline_interrupt_state(adev, 5, state);
2676 break;
2677 default:
2678 break;
2679 }
2680 return 0;
2681}
2682
2683static int dce_v6_0_crtc_irq(struct amdgpu_device *adev,
2684 struct amdgpu_irq_src *source,
2685 struct amdgpu_iv_entry *entry)
2686{
2687 unsigned crtc = entry->src_id - 1;
2688 uint32_t disp_int = RREG32(interrupt_status_offsets[crtc].reg);
2689 unsigned irq_type = amdgpu_crtc_idx_to_irq_type(adev, crtc);
2690
2691 switch (entry->src_data) {
2692 case 0: /* vblank */
2693 if (disp_int & interrupt_status_offsets[crtc].vblank)
2694 WREG32(VBLANK_STATUS + crtc_offsets[crtc], VBLANK_ACK);
2695 else
2696 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
2697
2698 if (amdgpu_irq_enabled(adev, source, irq_type)) {
2699 drm_handle_vblank(adev->ddev, crtc);
2700 }
2701 DRM_DEBUG("IH: D%d vblank\n", crtc + 1);
2702 break;
2703 case 1: /* vline */
2704 if (disp_int & interrupt_status_offsets[crtc].vline)
2705 WREG32(VLINE_STATUS + crtc_offsets[crtc], VLINE_ACK);
2706 else
2707 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
2708
2709 DRM_DEBUG("IH: D%d vline\n", crtc + 1);
2710 break;
2711 default:
2712 DRM_DEBUG("Unhandled interrupt: %d %d\n", entry->src_id, entry->src_data);
2713 break;
2714 }
2715
2716 return 0;
2717}
2718
2719static int dce_v6_0_set_pageflip_interrupt_state(struct amdgpu_device *adev,
2720 struct amdgpu_irq_src *src,
2721 unsigned type,
2722 enum amdgpu_interrupt_state state)
2723{
2724 u32 reg;
2725
2726 if (type >= adev->mode_info.num_crtc) {
2727 DRM_ERROR("invalid pageflip crtc %d\n", type);
2728 return -EINVAL;
2729 }
2730
2731 reg = RREG32(GRPH_INT_CONTROL + crtc_offsets[type]);
2732 if (state == AMDGPU_IRQ_STATE_DISABLE)
2733 WREG32(GRPH_INT_CONTROL + crtc_offsets[type],
2734 reg & ~GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
2735 else
2736 WREG32(GRPH_INT_CONTROL + crtc_offsets[type],
2737 reg | GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK);
2738
2739 return 0;
2740}
2741
2742static int dce_v6_0_pageflip_irq(struct amdgpu_device *adev,
2743 struct amdgpu_irq_src *source,
2744 struct amdgpu_iv_entry *entry)
2745{
2746 unsigned long flags;
2747 unsigned crtc_id;
2748 struct amdgpu_crtc *amdgpu_crtc;
2749 struct amdgpu_flip_work *works;
2750
2751 crtc_id = (entry->src_id - 8) >> 1;
2752 amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
2753
2754 if (crtc_id >= adev->mode_info.num_crtc) {
2755 DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
2756 return -EINVAL;
2757 }
2758
2759 if (RREG32(GRPH_INT_STATUS + crtc_offsets[crtc_id]) &
2760 GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_OCCURRED_MASK)
2761 WREG32(GRPH_INT_STATUS + crtc_offsets[crtc_id],
2762 GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_CLEAR_MASK);
2763
2764 /* IRQ could occur when in initial stage */
2765 if (amdgpu_crtc == NULL)
2766 return 0;
2767
2768 spin_lock_irqsave(&adev->ddev->event_lock, flags);
2769 works = amdgpu_crtc->pflip_works;
2770 if (amdgpu_crtc->pflip_status != AMDGPU_FLIP_SUBMITTED){
2771 DRM_DEBUG_DRIVER("amdgpu_crtc->pflip_status = %d != "
2772 "AMDGPU_FLIP_SUBMITTED(%d)\n",
2773 amdgpu_crtc->pflip_status,
2774 AMDGPU_FLIP_SUBMITTED);
2775 spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
2776 return 0;
2777 }
2778
2779 /* page flip completed. clean up */
2780 amdgpu_crtc->pflip_status = AMDGPU_FLIP_NONE;
2781 amdgpu_crtc->pflip_works = NULL;
2782
2783 /* wakeup usersapce */
2784 if (works->event)
2785 drm_crtc_send_vblank_event(&amdgpu_crtc->base, works->event);
2786
2787 spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
2788
2789 drm_crtc_vblank_put(&amdgpu_crtc->base);
2790 schedule_work(&works->unpin_work);
2791
2792 return 0;
2793}
2794
2795static int dce_v6_0_hpd_irq(struct amdgpu_device *adev,
2796 struct amdgpu_irq_src *source,
2797 struct amdgpu_iv_entry *entry)
2798{
2799 uint32_t disp_int, mask, int_control, tmp;
2800 unsigned hpd;
2801
2802 if (entry->src_data >= adev->mode_info.num_hpd) {
2803 DRM_DEBUG("Unhandled interrupt: %d %d\n", entry->src_id, entry->src_data);
2804 return 0;
2805 }
2806
2807 hpd = entry->src_data;
2808 disp_int = RREG32(interrupt_status_offsets[hpd].reg);
2809 mask = interrupt_status_offsets[hpd].hpd;
2810 int_control = hpd_int_control_offsets[hpd];
2811
2812 if (disp_int & mask) {
2813 tmp = RREG32(int_control);
2814 tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
2815 WREG32(int_control, tmp);
2816 schedule_work(&adev->hotplug_work);
2817 DRM_INFO("IH: HPD%d\n", hpd + 1);
2818 }
2819
2820 return 0;
2821
2822}
2823
2824static int dce_v6_0_set_clockgating_state(void *handle,
2825 enum amd_clockgating_state state)
2826{
2827 return 0;
2828}
2829
2830static int dce_v6_0_set_powergating_state(void *handle,
2831 enum amd_powergating_state state)
2832{
2833 return 0;
2834}
2835
2836const struct amd_ip_funcs dce_v6_0_ip_funcs = {
2837 .name = "dce_v6_0",
2838 .early_init = dce_v6_0_early_init,
2839 .late_init = NULL,
2840 .sw_init = dce_v6_0_sw_init,
2841 .sw_fini = dce_v6_0_sw_fini,
2842 .hw_init = dce_v6_0_hw_init,
2843 .hw_fini = dce_v6_0_hw_fini,
2844 .suspend = dce_v6_0_suspend,
2845 .resume = dce_v6_0_resume,
2846 .is_idle = dce_v6_0_is_idle,
2847 .wait_for_idle = dce_v6_0_wait_for_idle,
2848 .soft_reset = dce_v6_0_soft_reset,
2849 .set_clockgating_state = dce_v6_0_set_clockgating_state,
2850 .set_powergating_state = dce_v6_0_set_powergating_state,
2851};
2852
2853static void
2854dce_v6_0_encoder_mode_set(struct drm_encoder *encoder,
2855 struct drm_display_mode *mode,
2856 struct drm_display_mode *adjusted_mode)
2857{
2858
2859 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
2860
2861 amdgpu_encoder->pixel_clock = adjusted_mode->clock;
2862
2863 /* need to call this here rather than in prepare() since we need some crtc info */
2864 amdgpu_atombios_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
2865
2866 /* set scaler clears this on some chips */
2867 dce_v6_0_set_interleave(encoder->crtc, mode);
2868
2869 if (amdgpu_atombios_encoder_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) {
2870 dce_v6_0_afmt_enable(encoder, true);
2871 dce_v6_0_afmt_setmode(encoder, adjusted_mode);
2872 }
2873}
2874
2875static void dce_v6_0_encoder_prepare(struct drm_encoder *encoder)
2876{
2877
2878 struct amdgpu_device *adev = encoder->dev->dev_private;
2879 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
2880 struct drm_connector *connector = amdgpu_get_connector_for_encoder(encoder);
2881
2882 if ((amdgpu_encoder->active_device &
2883 (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) ||
2884 (amdgpu_encoder_get_dp_bridge_encoder_id(encoder) !=
2885 ENCODER_OBJECT_ID_NONE)) {
2886 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
2887 if (dig) {
2888 dig->dig_encoder = dce_v6_0_pick_dig_encoder(encoder);
2889 if (amdgpu_encoder->active_device & ATOM_DEVICE_DFP_SUPPORT)
2890 dig->afmt = adev->mode_info.afmt[dig->dig_encoder];
2891 }
2892 }
2893
2894 amdgpu_atombios_scratch_regs_lock(adev, true);
2895
2896 if (connector) {
2897 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
2898
2899 /* select the clock/data port if it uses a router */
2900 if (amdgpu_connector->router.cd_valid)
2901 amdgpu_i2c_router_select_cd_port(amdgpu_connector);
2902
2903 /* turn eDP panel on for mode set */
2904 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP)
2905 amdgpu_atombios_encoder_set_edp_panel_power(connector,
2906 ATOM_TRANSMITTER_ACTION_POWER_ON);
2907 }
2908
2909 /* this is needed for the pll/ss setup to work correctly in some cases */
2910 amdgpu_atombios_encoder_set_crtc_source(encoder);
2911 /* set up the FMT blocks */
2912 dce_v6_0_program_fmt(encoder);
2913}
2914
2915static void dce_v6_0_encoder_commit(struct drm_encoder *encoder)
2916{
2917
2918 struct drm_device *dev = encoder->dev;
2919 struct amdgpu_device *adev = dev->dev_private;
2920
2921 /* need to call this here as we need the crtc set up */
2922 amdgpu_atombios_encoder_dpms(encoder, DRM_MODE_DPMS_ON);
2923 amdgpu_atombios_scratch_regs_lock(adev, false);
2924}
2925
2926static void dce_v6_0_encoder_disable(struct drm_encoder *encoder)
2927{
2928
2929 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
2930 struct amdgpu_encoder_atom_dig *dig;
2931
2932 amdgpu_atombios_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
2933
2934 if (amdgpu_atombios_encoder_is_digital(encoder)) {
2935 if (amdgpu_atombios_encoder_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI)
2936 dce_v6_0_afmt_enable(encoder, false);
2937 dig = amdgpu_encoder->enc_priv;
2938 dig->dig_encoder = -1;
2939 }
2940 amdgpu_encoder->active_device = 0;
2941}
2942
2943/* these are handled by the primary encoders */
2944static void dce_v6_0_ext_prepare(struct drm_encoder *encoder)
2945{
2946
2947}
2948
2949static void dce_v6_0_ext_commit(struct drm_encoder *encoder)
2950{
2951
2952}
2953
2954static void
2955dce_v6_0_ext_mode_set(struct drm_encoder *encoder,
2956 struct drm_display_mode *mode,
2957 struct drm_display_mode *adjusted_mode)
2958{
2959
2960}
2961
2962static void dce_v6_0_ext_disable(struct drm_encoder *encoder)
2963{
2964
2965}
2966
2967static void
2968dce_v6_0_ext_dpms(struct drm_encoder *encoder, int mode)
2969{
2970
2971}
2972
2973static bool dce_v6_0_ext_mode_fixup(struct drm_encoder *encoder,
2974 const struct drm_display_mode *mode,
2975 struct drm_display_mode *adjusted_mode)
2976{
2977 return true;
2978}
2979
2980static const struct drm_encoder_helper_funcs dce_v6_0_ext_helper_funcs = {
2981 .dpms = dce_v6_0_ext_dpms,
2982 .mode_fixup = dce_v6_0_ext_mode_fixup,
2983 .prepare = dce_v6_0_ext_prepare,
2984 .mode_set = dce_v6_0_ext_mode_set,
2985 .commit = dce_v6_0_ext_commit,
2986 .disable = dce_v6_0_ext_disable,
2987 /* no detect for TMDS/LVDS yet */
2988};
2989
2990static const struct drm_encoder_helper_funcs dce_v6_0_dig_helper_funcs = {
2991 .dpms = amdgpu_atombios_encoder_dpms,
2992 .mode_fixup = amdgpu_atombios_encoder_mode_fixup,
2993 .prepare = dce_v6_0_encoder_prepare,
2994 .mode_set = dce_v6_0_encoder_mode_set,
2995 .commit = dce_v6_0_encoder_commit,
2996 .disable = dce_v6_0_encoder_disable,
2997 .detect = amdgpu_atombios_encoder_dig_detect,
2998};
2999
3000static const struct drm_encoder_helper_funcs dce_v6_0_dac_helper_funcs = {
3001 .dpms = amdgpu_atombios_encoder_dpms,
3002 .mode_fixup = amdgpu_atombios_encoder_mode_fixup,
3003 .prepare = dce_v6_0_encoder_prepare,
3004 .mode_set = dce_v6_0_encoder_mode_set,
3005 .commit = dce_v6_0_encoder_commit,
3006 .detect = amdgpu_atombios_encoder_dac_detect,
3007};
3008
3009static void dce_v6_0_encoder_destroy(struct drm_encoder *encoder)
3010{
3011 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
3012 if (amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
3013 amdgpu_atombios_encoder_fini_backlight(amdgpu_encoder);
3014 kfree(amdgpu_encoder->enc_priv);
3015 drm_encoder_cleanup(encoder);
3016 kfree(amdgpu_encoder);
3017}
3018
3019static const struct drm_encoder_funcs dce_v6_0_encoder_funcs = {
3020 .destroy = dce_v6_0_encoder_destroy,
3021};
3022
3023static void dce_v6_0_encoder_add(struct amdgpu_device *adev,
3024 uint32_t encoder_enum,
3025 uint32_t supported_device,
3026 u16 caps)
3027{
3028 struct drm_device *dev = adev->ddev;
3029 struct drm_encoder *encoder;
3030 struct amdgpu_encoder *amdgpu_encoder;
3031
3032 /* see if we already added it */
3033 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
3034 amdgpu_encoder = to_amdgpu_encoder(encoder);
3035 if (amdgpu_encoder->encoder_enum == encoder_enum) {
3036 amdgpu_encoder->devices |= supported_device;
3037 return;
3038 }
3039
3040 }
3041
3042 /* add a new one */
3043 amdgpu_encoder = kzalloc(sizeof(struct amdgpu_encoder), GFP_KERNEL);
3044 if (!amdgpu_encoder)
3045 return;
3046
3047 encoder = &amdgpu_encoder->base;
3048 switch (adev->mode_info.num_crtc) {
3049 case 1:
3050 encoder->possible_crtcs = 0x1;
3051 break;
3052 case 2:
3053 default:
3054 encoder->possible_crtcs = 0x3;
3055 break;
3056 case 4:
3057 encoder->possible_crtcs = 0xf;
3058 break;
3059 case 6:
3060 encoder->possible_crtcs = 0x3f;
3061 break;
3062 }
3063
3064 amdgpu_encoder->enc_priv = NULL;
3065 amdgpu_encoder->encoder_enum = encoder_enum;
3066 amdgpu_encoder->encoder_id = (encoder_enum & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
3067 amdgpu_encoder->devices = supported_device;
3068 amdgpu_encoder->rmx_type = RMX_OFF;
3069 amdgpu_encoder->underscan_type = UNDERSCAN_OFF;
3070 amdgpu_encoder->is_ext_encoder = false;
3071 amdgpu_encoder->caps = caps;
3072
3073 switch (amdgpu_encoder->encoder_id) {
3074 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
3075 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
3076 drm_encoder_init(dev, encoder, &dce_v6_0_encoder_funcs,
3077 DRM_MODE_ENCODER_DAC, NULL);
3078 drm_encoder_helper_add(encoder, &dce_v6_0_dac_helper_funcs);
3079 break;
3080 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
3081 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
3082 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
3083 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
3084 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
3085 if (amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
3086 amdgpu_encoder->rmx_type = RMX_FULL;
3087 drm_encoder_init(dev, encoder, &dce_v6_0_encoder_funcs,
3088 DRM_MODE_ENCODER_LVDS, NULL);
3089 amdgpu_encoder->enc_priv = amdgpu_atombios_encoder_get_lcd_info(amdgpu_encoder);
3090 } else if (amdgpu_encoder->devices & (ATOM_DEVICE_CRT_SUPPORT)) {
3091 drm_encoder_init(dev, encoder, &dce_v6_0_encoder_funcs,
3092 DRM_MODE_ENCODER_DAC, NULL);
3093 amdgpu_encoder->enc_priv = amdgpu_atombios_encoder_get_dig_info(amdgpu_encoder);
3094 } else {
3095 drm_encoder_init(dev, encoder, &dce_v6_0_encoder_funcs,
3096 DRM_MODE_ENCODER_TMDS, NULL);
3097 amdgpu_encoder->enc_priv = amdgpu_atombios_encoder_get_dig_info(amdgpu_encoder);
3098 }
3099 drm_encoder_helper_add(encoder, &dce_v6_0_dig_helper_funcs);
3100 break;
3101 case ENCODER_OBJECT_ID_SI170B:
3102 case ENCODER_OBJECT_ID_CH7303:
3103 case ENCODER_OBJECT_ID_EXTERNAL_SDVOA:
3104 case ENCODER_OBJECT_ID_EXTERNAL_SDVOB:
3105 case ENCODER_OBJECT_ID_TITFP513:
3106 case ENCODER_OBJECT_ID_VT1623:
3107 case ENCODER_OBJECT_ID_HDMI_SI1930:
3108 case ENCODER_OBJECT_ID_TRAVIS:
3109 case ENCODER_OBJECT_ID_NUTMEG:
3110 /* these are handled by the primary encoders */
3111 amdgpu_encoder->is_ext_encoder = true;
3112 if (amdgpu_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
3113 drm_encoder_init(dev, encoder, &dce_v6_0_encoder_funcs,
3114 DRM_MODE_ENCODER_LVDS, NULL);
3115 else if (amdgpu_encoder->devices & (ATOM_DEVICE_CRT_SUPPORT))
3116 drm_encoder_init(dev, encoder, &dce_v6_0_encoder_funcs,
3117 DRM_MODE_ENCODER_DAC, NULL);
3118 else
3119 drm_encoder_init(dev, encoder, &dce_v6_0_encoder_funcs,
3120 DRM_MODE_ENCODER_TMDS, NULL);
3121 drm_encoder_helper_add(encoder, &dce_v6_0_ext_helper_funcs);
3122 break;
3123 }
3124}
3125
3126static const struct amdgpu_display_funcs dce_v6_0_display_funcs = {
3127 .set_vga_render_state = &dce_v6_0_set_vga_render_state,
3128 .bandwidth_update = &dce_v6_0_bandwidth_update,
3129 .vblank_get_counter = &dce_v6_0_vblank_get_counter,
3130 .vblank_wait = &dce_v6_0_vblank_wait,
3131 .is_display_hung = &dce_v6_0_is_display_hung,
3132 .backlight_set_level = &amdgpu_atombios_encoder_set_backlight_level,
3133 .backlight_get_level = &amdgpu_atombios_encoder_get_backlight_level,
3134 .hpd_sense = &dce_v6_0_hpd_sense,
3135 .hpd_set_polarity = &dce_v6_0_hpd_set_polarity,
3136 .hpd_get_gpio_reg = &dce_v6_0_hpd_get_gpio_reg,
3137 .page_flip = &dce_v6_0_page_flip,
3138 .page_flip_get_scanoutpos = &dce_v6_0_crtc_get_scanoutpos,
3139 .add_encoder = &dce_v6_0_encoder_add,
3140 .add_connector = &amdgpu_connector_add,
3141 .stop_mc_access = &dce_v6_0_stop_mc_access,
3142 .resume_mc_access = &dce_v6_0_resume_mc_access,
3143};
3144
3145static void dce_v6_0_set_display_funcs(struct amdgpu_device *adev)
3146{
3147 if (adev->mode_info.funcs == NULL)
3148 adev->mode_info.funcs = &dce_v6_0_display_funcs;
3149}
3150
3151static const struct amdgpu_irq_src_funcs dce_v6_0_crtc_irq_funcs = {
3152 .set = dce_v6_0_set_crtc_interrupt_state,
3153 .process = dce_v6_0_crtc_irq,
3154};
3155
3156static const struct amdgpu_irq_src_funcs dce_v6_0_pageflip_irq_funcs = {
3157 .set = dce_v6_0_set_pageflip_interrupt_state,
3158 .process = dce_v6_0_pageflip_irq,
3159};
3160
3161static const struct amdgpu_irq_src_funcs dce_v6_0_hpd_irq_funcs = {
3162 .set = dce_v6_0_set_hpd_interrupt_state,
3163 .process = dce_v6_0_hpd_irq,
3164};
3165
3166static void dce_v6_0_set_irq_funcs(struct amdgpu_device *adev)
3167{
3168 adev->crtc_irq.num_types = AMDGPU_CRTC_IRQ_LAST;
3169 adev->crtc_irq.funcs = &dce_v6_0_crtc_irq_funcs;
3170
3171 adev->pageflip_irq.num_types = AMDGPU_PAGEFLIP_IRQ_LAST;
3172 adev->pageflip_irq.funcs = &dce_v6_0_pageflip_irq_funcs;
3173
3174 adev->hpd_irq.num_types = AMDGPU_HPD_LAST;
3175 adev->hpd_irq.funcs = &dce_v6_0_hpd_irq_funcs;
3176}
diff --git a/drivers/gpu/drm/amd/amdgpu/tonga_smum.h b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.h
index c031ff99fe3e..6a5528105bb6 100644
--- a/drivers/gpu/drm/amd/amdgpu/tonga_smum.h
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.h
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright 2014 Advanced Micro Devices, Inc. 2 * Copyright 2015 Advanced Micro Devices, Inc.
3 * 3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"), 5 * copy of this software and associated documentation files (the "Software"),
@@ -21,22 +21,9 @@
21 * 21 *
22 */ 22 */
23 23
24#ifndef TONGA_SMUMGR_H 24#ifndef __DCE_V6_0_H__
25#define TONGA_SMUMGR_H 25#define __DCE_V6_0_H__
26 26
27#include "tonga_ppsmc.h" 27extern const struct amd_ip_funcs dce_v6_0_ip_funcs;
28
29int tonga_smu_init(struct amdgpu_device *adev);
30int tonga_smu_fini(struct amdgpu_device *adev);
31int tonga_smu_start(struct amdgpu_device *adev);
32
33struct tonga_smu_private_data
34{
35 uint8_t *header;
36 uint32_t smu_buffer_addr_high;
37 uint32_t smu_buffer_addr_low;
38 uint32_t header_addr_high;
39 uint32_t header_addr_low;
40};
41 28
42#endif 29#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
index 4fdfab1e9200..5966166ec94c 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
@@ -170,7 +170,7 @@ static bool dce_v8_0_is_counter_moving(struct amdgpu_device *adev, int crtc)
170 */ 170 */
171static void dce_v8_0_vblank_wait(struct amdgpu_device *adev, int crtc) 171static void dce_v8_0_vblank_wait(struct amdgpu_device *adev, int crtc)
172{ 172{
173 unsigned i = 0; 173 unsigned i = 100;
174 174
175 if (crtc >= adev->mode_info.num_crtc) 175 if (crtc >= adev->mode_info.num_crtc)
176 return; 176 return;
@@ -182,14 +182,16 @@ static void dce_v8_0_vblank_wait(struct amdgpu_device *adev, int crtc)
182 * wait for another frame. 182 * wait for another frame.
183 */ 183 */
184 while (dce_v8_0_is_in_vblank(adev, crtc)) { 184 while (dce_v8_0_is_in_vblank(adev, crtc)) {
185 if (i++ % 100 == 0) { 185 if (i++ == 100) {
186 i = 0;
186 if (!dce_v8_0_is_counter_moving(adev, crtc)) 187 if (!dce_v8_0_is_counter_moving(adev, crtc))
187 break; 188 break;
188 } 189 }
189 } 190 }
190 191
191 while (!dce_v8_0_is_in_vblank(adev, crtc)) { 192 while (!dce_v8_0_is_in_vblank(adev, crtc)) {
192 if (i++ % 100 == 0) { 193 if (i++ == 100) {
194 i = 0;
193 if (!dce_v8_0_is_counter_moving(adev, crtc)) 195 if (!dce_v8_0_is_counter_moving(adev, crtc))
194 break; 196 break;
195 } 197 }
@@ -395,15 +397,6 @@ static void dce_v8_0_hpd_init(struct amdgpu_device *adev)
395 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 397 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
396 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 398 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
397 399
398 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
399 connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
400 /* don't try to enable hpd on eDP or LVDS avoid breaking the
401 * aux dp channel on imac and help (but not completely fix)
402 * https://bugzilla.redhat.com/show_bug.cgi?id=726143
403 * also avoid interrupt storms during dpms.
404 */
405 continue;
406 }
407 switch (amdgpu_connector->hpd.hpd) { 400 switch (amdgpu_connector->hpd.hpd) {
408 case AMDGPU_HPD_1: 401 case AMDGPU_HPD_1:
409 WREG32(mmDC_HPD1_CONTROL, tmp); 402 WREG32(mmDC_HPD1_CONTROL, tmp);
@@ -426,6 +419,45 @@ static void dce_v8_0_hpd_init(struct amdgpu_device *adev)
426 default: 419 default:
427 break; 420 break;
428 } 421 }
422
423 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
424 connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
425 /* don't try to enable hpd on eDP or LVDS avoid breaking the
426 * aux dp channel on imac and help (but not completely fix)
427 * https://bugzilla.redhat.com/show_bug.cgi?id=726143
428 * also avoid interrupt storms during dpms.
429 */
430 u32 dc_hpd_int_cntl_reg, dc_hpd_int_cntl;
431
432 switch (amdgpu_connector->hpd.hpd) {
433 case AMDGPU_HPD_1:
434 dc_hpd_int_cntl_reg = mmDC_HPD1_INT_CONTROL;
435 break;
436 case AMDGPU_HPD_2:
437 dc_hpd_int_cntl_reg = mmDC_HPD2_INT_CONTROL;
438 break;
439 case AMDGPU_HPD_3:
440 dc_hpd_int_cntl_reg = mmDC_HPD3_INT_CONTROL;
441 break;
442 case AMDGPU_HPD_4:
443 dc_hpd_int_cntl_reg = mmDC_HPD4_INT_CONTROL;
444 break;
445 case AMDGPU_HPD_5:
446 dc_hpd_int_cntl_reg = mmDC_HPD5_INT_CONTROL;
447 break;
448 case AMDGPU_HPD_6:
449 dc_hpd_int_cntl_reg = mmDC_HPD6_INT_CONTROL;
450 break;
451 default:
452 continue;
453 }
454
455 dc_hpd_int_cntl = RREG32(dc_hpd_int_cntl_reg);
456 dc_hpd_int_cntl &= ~DC_HPD1_INT_CONTROL__DC_HPD1_INT_EN_MASK;
457 WREG32(dc_hpd_int_cntl_reg, dc_hpd_int_cntl);
458 continue;
459 }
460
429 dce_v8_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd); 461 dce_v8_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
430 amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd); 462 amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
431 } 463 }
@@ -604,6 +636,52 @@ static void dce_v8_0_set_vga_render_state(struct amdgpu_device *adev,
604 WREG32(mmVGA_RENDER_CONTROL, tmp); 636 WREG32(mmVGA_RENDER_CONTROL, tmp);
605} 637}
606 638
639static int dce_v8_0_get_num_crtc(struct amdgpu_device *adev)
640{
641 int num_crtc = 0;
642
643 switch (adev->asic_type) {
644 case CHIP_BONAIRE:
645 case CHIP_HAWAII:
646 num_crtc = 6;
647 break;
648 case CHIP_KAVERI:
649 num_crtc = 4;
650 break;
651 case CHIP_KABINI:
652 case CHIP_MULLINS:
653 num_crtc = 2;
654 break;
655 default:
656 num_crtc = 0;
657 }
658 return num_crtc;
659}
660
661void dce_v8_0_disable_dce(struct amdgpu_device *adev)
662{
663 /*Disable VGA render and enabled crtc, if has DCE engine*/
664 if (amdgpu_atombios_has_dce_engine_info(adev)) {
665 u32 tmp;
666 int crtc_enabled, i;
667
668 dce_v8_0_set_vga_render_state(adev, false);
669
670 /*Disable crtc*/
671 for (i = 0; i < dce_v8_0_get_num_crtc(adev); i++) {
672 crtc_enabled = REG_GET_FIELD(RREG32(mmCRTC_CONTROL + crtc_offsets[i]),
673 CRTC_CONTROL, CRTC_MASTER_EN);
674 if (crtc_enabled) {
675 WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 1);
676 tmp = RREG32(mmCRTC_CONTROL + crtc_offsets[i]);
677 tmp = REG_SET_FIELD(tmp, CRTC_CONTROL, CRTC_MASTER_EN, 0);
678 WREG32(mmCRTC_CONTROL + crtc_offsets[i], tmp);
679 WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 0);
680 }
681 }
682 }
683}
684
607static void dce_v8_0_program_fmt(struct drm_encoder *encoder) 685static void dce_v8_0_program_fmt(struct drm_encoder *encoder)
608{ 686{
609 struct drm_device *dev = encoder->dev; 687 struct drm_device *dev = encoder->dev;
@@ -1501,13 +1579,13 @@ static void dce_v8_0_audio_write_sad_regs(struct drm_encoder *encoder)
1501 1579
1502 if (sad->format == eld_reg_to_type[i][1]) { 1580 if (sad->format == eld_reg_to_type[i][1]) {
1503 if (sad->channels > max_channels) { 1581 if (sad->channels > max_channels) {
1504 value = (sad->channels << 1582 value = (sad->channels <<
1505 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0__MAX_CHANNELS__SHIFT) | 1583 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0__MAX_CHANNELS__SHIFT) |
1506 (sad->byte2 << 1584 (sad->byte2 <<
1507 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0__DESCRIPTOR_BYTE_2__SHIFT) | 1585 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0__DESCRIPTOR_BYTE_2__SHIFT) |
1508 (sad->freq << 1586 (sad->freq <<
1509 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0__SUPPORTED_FREQUENCIES__SHIFT); 1587 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0__SUPPORTED_FREQUENCIES__SHIFT);
1510 max_channels = sad->channels; 1588 max_channels = sad->channels;
1511 } 1589 }
1512 1590
1513 if (sad->format == HDMI_AUDIO_CODING_TYPE_PCM) 1591 if (sad->format == HDMI_AUDIO_CODING_TYPE_PCM)
@@ -1613,7 +1691,7 @@ static void dce_v8_0_afmt_update_ACR(struct drm_encoder *encoder, uint32_t clock
1613 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; 1691 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
1614 uint32_t offset = dig->afmt->offset; 1692 uint32_t offset = dig->afmt->offset;
1615 1693
1616 WREG32(mmHDMI_ACR_32_0 + offset, (acr.cts_32khz << HDMI_ACR_44_0__HDMI_ACR_CTS_44__SHIFT)); 1694 WREG32(mmHDMI_ACR_32_0 + offset, (acr.cts_32khz << HDMI_ACR_32_0__HDMI_ACR_CTS_32__SHIFT));
1617 WREG32(mmHDMI_ACR_32_1 + offset, acr.n_32khz); 1695 WREG32(mmHDMI_ACR_32_1 + offset, acr.n_32khz);
1618 1696
1619 WREG32(mmHDMI_ACR_44_0 + offset, (acr.cts_44_1khz << HDMI_ACR_44_0__HDMI_ACR_CTS_44__SHIFT)); 1697 WREG32(mmHDMI_ACR_44_0 + offset, (acr.cts_44_1khz << HDMI_ACR_44_0__HDMI_ACR_CTS_44__SHIFT));
@@ -1693,6 +1771,7 @@ static void dce_v8_0_afmt_setmode(struct drm_encoder *encoder,
1693 /* Silent, r600_hdmi_enable will raise WARN for us */ 1771 /* Silent, r600_hdmi_enable will raise WARN for us */
1694 if (!dig->afmt->enabled) 1772 if (!dig->afmt->enabled)
1695 return; 1773 return;
1774
1696 offset = dig->afmt->offset; 1775 offset = dig->afmt->offset;
1697 1776
1698 /* hdmi deep color mode general control packets setup, if bpc > 8 */ 1777 /* hdmi deep color mode general control packets setup, if bpc > 8 */
@@ -1817,7 +1896,7 @@ static void dce_v8_0_afmt_setmode(struct drm_encoder *encoder,
1817 1896
1818 WREG32_OR(mmHDMI_INFOFRAME_CONTROL0 + offset, 1897 WREG32_OR(mmHDMI_INFOFRAME_CONTROL0 + offset,
1819 HDMI_INFOFRAME_CONTROL0__HDMI_AVI_INFO_SEND_MASK | /* enable AVI info frames */ 1898 HDMI_INFOFRAME_CONTROL0__HDMI_AVI_INFO_SEND_MASK | /* enable AVI info frames */
1820 HDMI_INFOFRAME_CONTROL0__HDMI_AVI_INFO_SEND_MASK); /* required for audio info values to be updated */ 1899 HDMI_INFOFRAME_CONTROL0__HDMI_AVI_INFO_CONT_MASK); /* required for audio info values to be updated */
1821 1900
1822 WREG32_P(mmHDMI_INFOFRAME_CONTROL1 + offset, 1901 WREG32_P(mmHDMI_INFOFRAME_CONTROL1 + offset,
1823 (2 << HDMI_INFOFRAME_CONTROL1__HDMI_AVI_INFO_LINE__SHIFT), /* anything other than 0 */ 1902 (2 << HDMI_INFOFRAME_CONTROL1__HDMI_AVI_INFO_LINE__SHIFT), /* anything other than 0 */
@@ -1826,13 +1905,12 @@ static void dce_v8_0_afmt_setmode(struct drm_encoder *encoder,
1826 WREG32_OR(mmAFMT_AUDIO_PACKET_CONTROL + offset, 1905 WREG32_OR(mmAFMT_AUDIO_PACKET_CONTROL + offset,
1827 AFMT_AUDIO_PACKET_CONTROL__AFMT_AUDIO_SAMPLE_SEND_MASK); /* send audio packets */ 1906 AFMT_AUDIO_PACKET_CONTROL__AFMT_AUDIO_SAMPLE_SEND_MASK); /* send audio packets */
1828 1907
1829 /* it's unknown what these bits do excatly, but it's indeed quite useful for debugging */
1830 WREG32(mmAFMT_RAMP_CONTROL0 + offset, 0x00FFFFFF); 1908 WREG32(mmAFMT_RAMP_CONTROL0 + offset, 0x00FFFFFF);
1831 WREG32(mmAFMT_RAMP_CONTROL1 + offset, 0x007FFFFF); 1909 WREG32(mmAFMT_RAMP_CONTROL1 + offset, 0x007FFFFF);
1832 WREG32(mmAFMT_RAMP_CONTROL2 + offset, 0x00000001); 1910 WREG32(mmAFMT_RAMP_CONTROL2 + offset, 0x00000001);
1833 WREG32(mmAFMT_RAMP_CONTROL3 + offset, 0x00000001); 1911 WREG32(mmAFMT_RAMP_CONTROL3 + offset, 0x00000001);
1834 1912
1835 /* enable audio after to setting up hw */ 1913 /* enable audio after setting up hw */
1836 dce_v8_0_audio_enable(adev, dig->afmt->pin, true); 1914 dce_v8_0_audio_enable(adev, dig->afmt->pin, true);
1837} 1915}
1838 1916
@@ -1944,7 +2022,7 @@ static int dce_v8_0_crtc_do_set_base(struct drm_crtc *crtc,
1944 struct amdgpu_framebuffer *amdgpu_fb; 2022 struct amdgpu_framebuffer *amdgpu_fb;
1945 struct drm_framebuffer *target_fb; 2023 struct drm_framebuffer *target_fb;
1946 struct drm_gem_object *obj; 2024 struct drm_gem_object *obj;
1947 struct amdgpu_bo *rbo; 2025 struct amdgpu_bo *abo;
1948 uint64_t fb_location, tiling_flags; 2026 uint64_t fb_location, tiling_flags;
1949 uint32_t fb_format, fb_pitch_pixels; 2027 uint32_t fb_format, fb_pitch_pixels;
1950 u32 fb_swap = (GRPH_ENDIAN_NONE << GRPH_SWAP_CNTL__GRPH_ENDIAN_SWAP__SHIFT); 2028 u32 fb_swap = (GRPH_ENDIAN_NONE << GRPH_SWAP_CNTL__GRPH_ENDIAN_SWAP__SHIFT);
@@ -1952,6 +2030,7 @@ static int dce_v8_0_crtc_do_set_base(struct drm_crtc *crtc,
1952 u32 viewport_w, viewport_h; 2030 u32 viewport_w, viewport_h;
1953 int r; 2031 int r;
1954 bool bypass_lut = false; 2032 bool bypass_lut = false;
2033 char *format_name;
1955 2034
1956 /* no fb bound */ 2035 /* no fb bound */
1957 if (!atomic && !crtc->primary->fb) { 2036 if (!atomic && !crtc->primary->fb) {
@@ -1971,23 +2050,23 @@ static int dce_v8_0_crtc_do_set_base(struct drm_crtc *crtc,
1971 * just update base pointers 2050 * just update base pointers
1972 */ 2051 */
1973 obj = amdgpu_fb->obj; 2052 obj = amdgpu_fb->obj;
1974 rbo = gem_to_amdgpu_bo(obj); 2053 abo = gem_to_amdgpu_bo(obj);
1975 r = amdgpu_bo_reserve(rbo, false); 2054 r = amdgpu_bo_reserve(abo, false);
1976 if (unlikely(r != 0)) 2055 if (unlikely(r != 0))
1977 return r; 2056 return r;
1978 2057
1979 if (atomic) { 2058 if (atomic) {
1980 fb_location = amdgpu_bo_gpu_offset(rbo); 2059 fb_location = amdgpu_bo_gpu_offset(abo);
1981 } else { 2060 } else {
1982 r = amdgpu_bo_pin(rbo, AMDGPU_GEM_DOMAIN_VRAM, &fb_location); 2061 r = amdgpu_bo_pin(abo, AMDGPU_GEM_DOMAIN_VRAM, &fb_location);
1983 if (unlikely(r != 0)) { 2062 if (unlikely(r != 0)) {
1984 amdgpu_bo_unreserve(rbo); 2063 amdgpu_bo_unreserve(abo);
1985 return -EINVAL; 2064 return -EINVAL;
1986 } 2065 }
1987 } 2066 }
1988 2067
1989 amdgpu_bo_get_tiling_flags(rbo, &tiling_flags); 2068 amdgpu_bo_get_tiling_flags(abo, &tiling_flags);
1990 amdgpu_bo_unreserve(rbo); 2069 amdgpu_bo_unreserve(abo);
1991 2070
1992 pipe_config = AMDGPU_TILING_GET(tiling_flags, PIPE_CONFIG); 2071 pipe_config = AMDGPU_TILING_GET(tiling_flags, PIPE_CONFIG);
1993 2072
@@ -1999,7 +2078,7 @@ static int dce_v8_0_crtc_do_set_base(struct drm_crtc *crtc,
1999 case DRM_FORMAT_XRGB4444: 2078 case DRM_FORMAT_XRGB4444:
2000 case DRM_FORMAT_ARGB4444: 2079 case DRM_FORMAT_ARGB4444:
2001 fb_format = ((GRPH_DEPTH_16BPP << GRPH_CONTROL__GRPH_DEPTH__SHIFT) | 2080 fb_format = ((GRPH_DEPTH_16BPP << GRPH_CONTROL__GRPH_DEPTH__SHIFT) |
2002 (GRPH_FORMAT_ARGB1555 << GRPH_CONTROL__GRPH_FORMAT__SHIFT)); 2081 (GRPH_FORMAT_ARGB4444 << GRPH_CONTROL__GRPH_FORMAT__SHIFT));
2003#ifdef __BIG_ENDIAN 2082#ifdef __BIG_ENDIAN
2004 fb_swap = (GRPH_ENDIAN_8IN16 << GRPH_SWAP_CNTL__GRPH_ENDIAN_SWAP__SHIFT); 2083 fb_swap = (GRPH_ENDIAN_8IN16 << GRPH_SWAP_CNTL__GRPH_ENDIAN_SWAP__SHIFT);
2005#endif 2084#endif
@@ -2056,8 +2135,9 @@ static int dce_v8_0_crtc_do_set_base(struct drm_crtc *crtc,
2056 bypass_lut = true; 2135 bypass_lut = true;
2057 break; 2136 break;
2058 default: 2137 default:
2059 DRM_ERROR("Unsupported screen format %s\n", 2138 format_name = drm_get_format_name(target_fb->pixel_format);
2060 drm_get_format_name(target_fb->pixel_format)); 2139 DRM_ERROR("Unsupported screen format %s\n", format_name);
2140 kfree(format_name);
2061 return -EINVAL; 2141 return -EINVAL;
2062 } 2142 }
2063 2143
@@ -2137,17 +2217,17 @@ static int dce_v8_0_crtc_do_set_base(struct drm_crtc *crtc,
2137 WREG32(mmVIEWPORT_SIZE + amdgpu_crtc->crtc_offset, 2217 WREG32(mmVIEWPORT_SIZE + amdgpu_crtc->crtc_offset,
2138 (viewport_w << 16) | viewport_h); 2218 (viewport_w << 16) | viewport_h);
2139 2219
2140 /* set pageflip to happen only at start of vblank interval (front porch) */ 2220 /* set pageflip to happen anywhere in vblank interval */
2141 WREG32(mmMASTER_UPDATE_MODE + amdgpu_crtc->crtc_offset, 3); 2221 WREG32(mmMASTER_UPDATE_MODE + amdgpu_crtc->crtc_offset, 0);
2142 2222
2143 if (!atomic && fb && fb != crtc->primary->fb) { 2223 if (!atomic && fb && fb != crtc->primary->fb) {
2144 amdgpu_fb = to_amdgpu_framebuffer(fb); 2224 amdgpu_fb = to_amdgpu_framebuffer(fb);
2145 rbo = gem_to_amdgpu_bo(amdgpu_fb->obj); 2225 abo = gem_to_amdgpu_bo(amdgpu_fb->obj);
2146 r = amdgpu_bo_reserve(rbo, false); 2226 r = amdgpu_bo_reserve(abo, false);
2147 if (unlikely(r != 0)) 2227 if (unlikely(r != 0))
2148 return r; 2228 return r;
2149 amdgpu_bo_unpin(rbo); 2229 amdgpu_bo_unpin(abo);
2150 amdgpu_bo_unreserve(rbo); 2230 amdgpu_bo_unreserve(abo);
2151 } 2231 }
2152 2232
2153 /* Bytes per pixel may have changed */ 2233 /* Bytes per pixel may have changed */
@@ -2552,7 +2632,7 @@ static const struct drm_crtc_funcs dce_v8_0_crtc_funcs = {
2552 .gamma_set = dce_v8_0_crtc_gamma_set, 2632 .gamma_set = dce_v8_0_crtc_gamma_set,
2553 .set_config = amdgpu_crtc_set_config, 2633 .set_config = amdgpu_crtc_set_config,
2554 .destroy = dce_v8_0_crtc_destroy, 2634 .destroy = dce_v8_0_crtc_destroy,
2555 .page_flip = amdgpu_crtc_page_flip, 2635 .page_flip_target = amdgpu_crtc_page_flip_target,
2556}; 2636};
2557 2637
2558static void dce_v8_0_crtc_dpms(struct drm_crtc *crtc, int mode) 2638static void dce_v8_0_crtc_dpms(struct drm_crtc *crtc, int mode)
@@ -2619,16 +2699,16 @@ static void dce_v8_0_crtc_disable(struct drm_crtc *crtc)
2619 if (crtc->primary->fb) { 2699 if (crtc->primary->fb) {
2620 int r; 2700 int r;
2621 struct amdgpu_framebuffer *amdgpu_fb; 2701 struct amdgpu_framebuffer *amdgpu_fb;
2622 struct amdgpu_bo *rbo; 2702 struct amdgpu_bo *abo;
2623 2703
2624 amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb); 2704 amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb);
2625 rbo = gem_to_amdgpu_bo(amdgpu_fb->obj); 2705 abo = gem_to_amdgpu_bo(amdgpu_fb->obj);
2626 r = amdgpu_bo_reserve(rbo, false); 2706 r = amdgpu_bo_reserve(abo, false);
2627 if (unlikely(r)) 2707 if (unlikely(r))
2628 DRM_ERROR("failed to reserve rbo before unpin\n"); 2708 DRM_ERROR("failed to reserve abo before unpin\n");
2629 else { 2709 else {
2630 amdgpu_bo_unpin(rbo); 2710 amdgpu_bo_unpin(abo);
2631 amdgpu_bo_unreserve(rbo); 2711 amdgpu_bo_unreserve(abo);
2632 } 2712 }
2633 } 2713 }
2634 /* disable the GRPH */ 2714 /* disable the GRPH */
@@ -2653,7 +2733,7 @@ static void dce_v8_0_crtc_disable(struct drm_crtc *crtc)
2653 case ATOM_PPLL2: 2733 case ATOM_PPLL2:
2654 /* disable the ppll */ 2734 /* disable the ppll */
2655 amdgpu_atombios_crtc_program_pll(crtc, amdgpu_crtc->crtc_id, amdgpu_crtc->pll_id, 2735 amdgpu_atombios_crtc_program_pll(crtc, amdgpu_crtc->crtc_id, amdgpu_crtc->pll_id,
2656 0, 0, ATOM_DISABLE, 0, 0, 0, 0, 0, false, &ss); 2736 0, 0, ATOM_DISABLE, 0, 0, 0, 0, 0, false, &ss);
2657 break; 2737 break;
2658 case ATOM_PPLL0: 2738 case ATOM_PPLL0:
2659 /* disable the ppll */ 2739 /* disable the ppll */
@@ -2803,21 +2883,20 @@ static int dce_v8_0_early_init(void *handle)
2803 dce_v8_0_set_display_funcs(adev); 2883 dce_v8_0_set_display_funcs(adev);
2804 dce_v8_0_set_irq_funcs(adev); 2884 dce_v8_0_set_irq_funcs(adev);
2805 2885
2886 adev->mode_info.num_crtc = dce_v8_0_get_num_crtc(adev);
2887
2806 switch (adev->asic_type) { 2888 switch (adev->asic_type) {
2807 case CHIP_BONAIRE: 2889 case CHIP_BONAIRE:
2808 case CHIP_HAWAII: 2890 case CHIP_HAWAII:
2809 adev->mode_info.num_crtc = 6;
2810 adev->mode_info.num_hpd = 6; 2891 adev->mode_info.num_hpd = 6;
2811 adev->mode_info.num_dig = 6; 2892 adev->mode_info.num_dig = 6;
2812 break; 2893 break;
2813 case CHIP_KAVERI: 2894 case CHIP_KAVERI:
2814 adev->mode_info.num_crtc = 4;
2815 adev->mode_info.num_hpd = 6; 2895 adev->mode_info.num_hpd = 6;
2816 adev->mode_info.num_dig = 7; 2896 adev->mode_info.num_dig = 7;
2817 break; 2897 break;
2818 case CHIP_KABINI: 2898 case CHIP_KABINI:
2819 case CHIP_MULLINS: 2899 case CHIP_MULLINS:
2820 adev->mode_info.num_crtc = 2;
2821 adev->mode_info.num_hpd = 6; 2900 adev->mode_info.num_hpd = 6;
2822 adev->mode_info.num_dig = 6; /* ? */ 2901 adev->mode_info.num_dig = 6; /* ? */
2823 break; 2902 break;
@@ -3236,7 +3315,6 @@ static int dce_v8_0_crtc_irq(struct amdgpu_device *adev,
3236 drm_handle_vblank(adev->ddev, crtc); 3315 drm_handle_vblank(adev->ddev, crtc);
3237 } 3316 }
3238 DRM_DEBUG("IH: D%d vblank\n", crtc + 1); 3317 DRM_DEBUG("IH: D%d vblank\n", crtc + 1);
3239
3240 break; 3318 break;
3241 case 1: /* vline */ 3319 case 1: /* vline */
3242 if (disp_int & interrupt_status_offsets[crtc].vline) 3320 if (disp_int & interrupt_status_offsets[crtc].vline)
@@ -3245,7 +3323,6 @@ static int dce_v8_0_crtc_irq(struct amdgpu_device *adev,
3245 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); 3323 DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
3246 3324
3247 DRM_DEBUG("IH: D%d vline\n", crtc + 1); 3325 DRM_DEBUG("IH: D%d vline\n", crtc + 1);
3248
3249 break; 3326 break;
3250 default: 3327 default:
3251 DRM_DEBUG("Unhandled interrupt: %d %d\n", entry->src_id, entry->src_data); 3328 DRM_DEBUG("Unhandled interrupt: %d %d\n", entry->src_id, entry->src_data);
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.h b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.h
index 77016852b252..7d0770c3a49b 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.h
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.h
@@ -26,4 +26,6 @@
26 26
27extern const struct amd_ip_funcs dce_v8_0_ip_funcs; 27extern const struct amd_ip_funcs dce_v8_0_ip_funcs;
28 28
29void dce_v8_0_disable_dce(struct amdgpu_device *adev);
30
29#endif 31#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
new file mode 100644
index 000000000000..c2bd9f045532
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c
@@ -0,0 +1,802 @@
1/*
2 * Copyright 2014 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23#include "drmP.h"
24#include "amdgpu.h"
25#include "amdgpu_pm.h"
26#include "amdgpu_i2c.h"
27#include "atom.h"
28#include "amdgpu_pll.h"
29#include "amdgpu_connectors.h"
30#ifdef CONFIG_DRM_AMDGPU_CIK
31#include "dce_v8_0.h"
32#endif
33#include "dce_v10_0.h"
34#include "dce_v11_0.h"
35#include "dce_virtual.h"
36
37static void dce_virtual_set_display_funcs(struct amdgpu_device *adev);
38static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev);
39static int dce_virtual_pageflip_irq(struct amdgpu_device *adev,
40 struct amdgpu_irq_src *source,
41 struct amdgpu_iv_entry *entry);
42
43/**
44 * dce_virtual_vblank_wait - vblank wait asic callback.
45 *
46 * @adev: amdgpu_device pointer
47 * @crtc: crtc to wait for vblank on
48 *
49 * Wait for vblank on the requested crtc (evergreen+).
50 */
51static void dce_virtual_vblank_wait(struct amdgpu_device *adev, int crtc)
52{
53 return;
54}
55
56static u32 dce_virtual_vblank_get_counter(struct amdgpu_device *adev, int crtc)
57{
58 return 0;
59}
60
61static void dce_virtual_page_flip(struct amdgpu_device *adev,
62 int crtc_id, u64 crtc_base, bool async)
63{
64 return;
65}
66
67static int dce_virtual_crtc_get_scanoutpos(struct amdgpu_device *adev, int crtc,
68 u32 *vbl, u32 *position)
69{
70 *vbl = 0;
71 *position = 0;
72
73 return -EINVAL;
74}
75
76static bool dce_virtual_hpd_sense(struct amdgpu_device *adev,
77 enum amdgpu_hpd_id hpd)
78{
79 return true;
80}
81
82static void dce_virtual_hpd_set_polarity(struct amdgpu_device *adev,
83 enum amdgpu_hpd_id hpd)
84{
85 return;
86}
87
88static u32 dce_virtual_hpd_get_gpio_reg(struct amdgpu_device *adev)
89{
90 return 0;
91}
92
93static bool dce_virtual_is_display_hung(struct amdgpu_device *adev)
94{
95 return false;
96}
97
98static void dce_virtual_stop_mc_access(struct amdgpu_device *adev,
99 struct amdgpu_mode_mc_save *save)
100{
101 switch (adev->asic_type) {
102#ifdef CONFIG_DRM_AMDGPU_CIK
103 case CHIP_BONAIRE:
104 case CHIP_HAWAII:
105 case CHIP_KAVERI:
106 case CHIP_KABINI:
107 case CHIP_MULLINS:
108 dce_v8_0_disable_dce(adev);
109 break;
110#endif
111 case CHIP_FIJI:
112 case CHIP_TONGA:
113 dce_v10_0_disable_dce(adev);
114 break;
115 case CHIP_CARRIZO:
116 case CHIP_STONEY:
117 case CHIP_POLARIS11:
118 case CHIP_POLARIS10:
119 dce_v11_0_disable_dce(adev);
120 break;
121 case CHIP_TOPAZ:
122 /* no DCE */
123 return;
124 default:
125 DRM_ERROR("Virtual display unsupported ASIC type: 0x%X\n", adev->asic_type);
126 }
127
128 return;
129}
130static void dce_virtual_resume_mc_access(struct amdgpu_device *adev,
131 struct amdgpu_mode_mc_save *save)
132{
133 return;
134}
135
136static void dce_virtual_set_vga_render_state(struct amdgpu_device *adev,
137 bool render)
138{
139 return;
140}
141
142/**
143 * dce_virtual_bandwidth_update - program display watermarks
144 *
145 * @adev: amdgpu_device pointer
146 *
147 * Calculate and program the display watermarks and line
148 * buffer allocation (CIK).
149 */
150static void dce_virtual_bandwidth_update(struct amdgpu_device *adev)
151{
152 return;
153}
154
155static int dce_virtual_crtc_gamma_set(struct drm_crtc *crtc, u16 *red,
156 u16 *green, u16 *blue, uint32_t size)
157{
158 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
159 int i;
160
161 /* userspace palettes are always correct as is */
162 for (i = 0; i < size; i++) {
163 amdgpu_crtc->lut_r[i] = red[i] >> 6;
164 amdgpu_crtc->lut_g[i] = green[i] >> 6;
165 amdgpu_crtc->lut_b[i] = blue[i] >> 6;
166 }
167
168 return 0;
169}
170
171static void dce_virtual_crtc_destroy(struct drm_crtc *crtc)
172{
173 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
174
175 drm_crtc_cleanup(crtc);
176 kfree(amdgpu_crtc);
177}
178
179static const struct drm_crtc_funcs dce_virtual_crtc_funcs = {
180 .cursor_set2 = NULL,
181 .cursor_move = NULL,
182 .gamma_set = dce_virtual_crtc_gamma_set,
183 .set_config = amdgpu_crtc_set_config,
184 .destroy = dce_virtual_crtc_destroy,
185 .page_flip_target = amdgpu_crtc_page_flip_target,
186};
187
188static void dce_virtual_crtc_dpms(struct drm_crtc *crtc, int mode)
189{
190 struct drm_device *dev = crtc->dev;
191 struct amdgpu_device *adev = dev->dev_private;
192 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
193 unsigned type;
194
195 switch (mode) {
196 case DRM_MODE_DPMS_ON:
197 amdgpu_crtc->enabled = true;
198 /* Make sure VBLANK and PFLIP interrupts are still enabled */
199 type = amdgpu_crtc_idx_to_irq_type(adev, amdgpu_crtc->crtc_id);
200 amdgpu_irq_update(adev, &adev->crtc_irq, type);
201 amdgpu_irq_update(adev, &adev->pageflip_irq, type);
202 drm_vblank_on(dev, amdgpu_crtc->crtc_id);
203 break;
204 case DRM_MODE_DPMS_STANDBY:
205 case DRM_MODE_DPMS_SUSPEND:
206 case DRM_MODE_DPMS_OFF:
207 drm_vblank_off(dev, amdgpu_crtc->crtc_id);
208 amdgpu_crtc->enabled = false;
209 break;
210 }
211}
212
213
214static void dce_virtual_crtc_prepare(struct drm_crtc *crtc)
215{
216 dce_virtual_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
217}
218
219static void dce_virtual_crtc_commit(struct drm_crtc *crtc)
220{
221 dce_virtual_crtc_dpms(crtc, DRM_MODE_DPMS_ON);
222}
223
224static void dce_virtual_crtc_disable(struct drm_crtc *crtc)
225{
226 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
227
228 dce_virtual_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
229 if (crtc->primary->fb) {
230 int r;
231 struct amdgpu_framebuffer *amdgpu_fb;
232 struct amdgpu_bo *abo;
233
234 amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb);
235 abo = gem_to_amdgpu_bo(amdgpu_fb->obj);
236 r = amdgpu_bo_reserve(abo, false);
237 if (unlikely(r))
238 DRM_ERROR("failed to reserve abo before unpin\n");
239 else {
240 amdgpu_bo_unpin(abo);
241 amdgpu_bo_unreserve(abo);
242 }
243 }
244
245 amdgpu_crtc->pll_id = ATOM_PPLL_INVALID;
246 amdgpu_crtc->encoder = NULL;
247 amdgpu_crtc->connector = NULL;
248}
249
250static int dce_virtual_crtc_mode_set(struct drm_crtc *crtc,
251 struct drm_display_mode *mode,
252 struct drm_display_mode *adjusted_mode,
253 int x, int y, struct drm_framebuffer *old_fb)
254{
255 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
256
257 /* update the hw version fpr dpm */
258 amdgpu_crtc->hw_mode = *adjusted_mode;
259
260 return 0;
261}
262
263static bool dce_virtual_crtc_mode_fixup(struct drm_crtc *crtc,
264 const struct drm_display_mode *mode,
265 struct drm_display_mode *adjusted_mode)
266{
267 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
268 struct drm_device *dev = crtc->dev;
269 struct drm_encoder *encoder;
270
271 /* assign the encoder to the amdgpu crtc to avoid repeated lookups later */
272 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
273 if (encoder->crtc == crtc) {
274 amdgpu_crtc->encoder = encoder;
275 amdgpu_crtc->connector = amdgpu_get_connector_for_encoder(encoder);
276 break;
277 }
278 }
279 if ((amdgpu_crtc->encoder == NULL) || (amdgpu_crtc->connector == NULL)) {
280 amdgpu_crtc->encoder = NULL;
281 amdgpu_crtc->connector = NULL;
282 return false;
283 }
284
285 return true;
286}
287
288
289static int dce_virtual_crtc_set_base(struct drm_crtc *crtc, int x, int y,
290 struct drm_framebuffer *old_fb)
291{
292 return 0;
293}
294
295static void dce_virtual_crtc_load_lut(struct drm_crtc *crtc)
296{
297 return;
298}
299
300static int dce_virtual_crtc_set_base_atomic(struct drm_crtc *crtc,
301 struct drm_framebuffer *fb,
302 int x, int y, enum mode_set_atomic state)
303{
304 return 0;
305}
306
307static const struct drm_crtc_helper_funcs dce_virtual_crtc_helper_funcs = {
308 .dpms = dce_virtual_crtc_dpms,
309 .mode_fixup = dce_virtual_crtc_mode_fixup,
310 .mode_set = dce_virtual_crtc_mode_set,
311 .mode_set_base = dce_virtual_crtc_set_base,
312 .mode_set_base_atomic = dce_virtual_crtc_set_base_atomic,
313 .prepare = dce_virtual_crtc_prepare,
314 .commit = dce_virtual_crtc_commit,
315 .load_lut = dce_virtual_crtc_load_lut,
316 .disable = dce_virtual_crtc_disable,
317};
318
319static int dce_virtual_crtc_init(struct amdgpu_device *adev, int index)
320{
321 struct amdgpu_crtc *amdgpu_crtc;
322 int i;
323
324 amdgpu_crtc = kzalloc(sizeof(struct amdgpu_crtc) +
325 (AMDGPUFB_CONN_LIMIT * sizeof(struct drm_connector *)), GFP_KERNEL);
326 if (amdgpu_crtc == NULL)
327 return -ENOMEM;
328
329 drm_crtc_init(adev->ddev, &amdgpu_crtc->base, &dce_virtual_crtc_funcs);
330
331 drm_mode_crtc_set_gamma_size(&amdgpu_crtc->base, 256);
332 amdgpu_crtc->crtc_id = index;
333 adev->mode_info.crtcs[index] = amdgpu_crtc;
334
335 for (i = 0; i < 256; i++) {
336 amdgpu_crtc->lut_r[i] = i << 2;
337 amdgpu_crtc->lut_g[i] = i << 2;
338 amdgpu_crtc->lut_b[i] = i << 2;
339 }
340
341 amdgpu_crtc->pll_id = ATOM_PPLL_INVALID;
342 amdgpu_crtc->encoder = NULL;
343 amdgpu_crtc->connector = NULL;
344 drm_crtc_helper_add(&amdgpu_crtc->base, &dce_virtual_crtc_helper_funcs);
345
346 return 0;
347}
348
349static int dce_virtual_early_init(void *handle)
350{
351 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
352
353 adev->mode_info.vsync_timer_enabled = AMDGPU_IRQ_STATE_DISABLE;
354 dce_virtual_set_display_funcs(adev);
355 dce_virtual_set_irq_funcs(adev);
356
357 adev->mode_info.num_crtc = 1;
358 adev->mode_info.num_hpd = 1;
359 adev->mode_info.num_dig = 1;
360 return 0;
361}
362
363static bool dce_virtual_get_connector_info(struct amdgpu_device *adev)
364{
365 struct amdgpu_i2c_bus_rec ddc_bus;
366 struct amdgpu_router router;
367 struct amdgpu_hpd hpd;
368
369 /* look up gpio for ddc, hpd */
370 ddc_bus.valid = false;
371 hpd.hpd = AMDGPU_HPD_NONE;
372 /* needed for aux chan transactions */
373 ddc_bus.hpd = hpd.hpd;
374
375 memset(&router, 0, sizeof(router));
376 router.ddc_valid = false;
377 router.cd_valid = false;
378 amdgpu_display_add_connector(adev,
379 0,
380 ATOM_DEVICE_CRT1_SUPPORT,
381 DRM_MODE_CONNECTOR_VIRTUAL, &ddc_bus,
382 CONNECTOR_OBJECT_ID_VIRTUAL,
383 &hpd,
384 &router);
385
386 amdgpu_display_add_encoder(adev, ENCODER_VIRTUAL_ENUM_VIRTUAL,
387 ATOM_DEVICE_CRT1_SUPPORT,
388 0);
389
390 amdgpu_link_encoder_connector(adev->ddev);
391
392 return true;
393}
394
395static int dce_virtual_sw_init(void *handle)
396{
397 int r, i;
398 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
399
400 r = amdgpu_irq_add_id(adev, 229, &adev->crtc_irq);
401 if (r)
402 return r;
403
404 adev->ddev->max_vblank_count = 0;
405
406 adev->ddev->mode_config.funcs = &amdgpu_mode_funcs;
407
408 adev->ddev->mode_config.max_width = 16384;
409 adev->ddev->mode_config.max_height = 16384;
410
411 adev->ddev->mode_config.preferred_depth = 24;
412 adev->ddev->mode_config.prefer_shadow = 1;
413
414 adev->ddev->mode_config.fb_base = adev->mc.aper_base;
415
416 r = amdgpu_modeset_create_props(adev);
417 if (r)
418 return r;
419
420 adev->ddev->mode_config.max_width = 16384;
421 adev->ddev->mode_config.max_height = 16384;
422
423 /* allocate crtcs */
424 for (i = 0; i < adev->mode_info.num_crtc; i++) {
425 r = dce_virtual_crtc_init(adev, i);
426 if (r)
427 return r;
428 }
429
430 dce_virtual_get_connector_info(adev);
431 amdgpu_print_display_setup(adev->ddev);
432
433 drm_kms_helper_poll_init(adev->ddev);
434
435 adev->mode_info.mode_config_initialized = true;
436 return 0;
437}
438
439static int dce_virtual_sw_fini(void *handle)
440{
441 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
442
443 kfree(adev->mode_info.bios_hardcoded_edid);
444
445 drm_kms_helper_poll_fini(adev->ddev);
446
447 drm_mode_config_cleanup(adev->ddev);
448 adev->mode_info.mode_config_initialized = false;
449 return 0;
450}
451
452static int dce_virtual_hw_init(void *handle)
453{
454 return 0;
455}
456
457static int dce_virtual_hw_fini(void *handle)
458{
459 return 0;
460}
461
462static int dce_virtual_suspend(void *handle)
463{
464 return dce_virtual_hw_fini(handle);
465}
466
467static int dce_virtual_resume(void *handle)
468{
469 return dce_virtual_hw_init(handle);
470}
471
472static bool dce_virtual_is_idle(void *handle)
473{
474 return true;
475}
476
477static int dce_virtual_wait_for_idle(void *handle)
478{
479 return 0;
480}
481
482static int dce_virtual_soft_reset(void *handle)
483{
484 return 0;
485}
486
487static int dce_virtual_set_clockgating_state(void *handle,
488 enum amd_clockgating_state state)
489{
490 return 0;
491}
492
493static int dce_virtual_set_powergating_state(void *handle,
494 enum amd_powergating_state state)
495{
496 return 0;
497}
498
499const struct amd_ip_funcs dce_virtual_ip_funcs = {
500 .name = "dce_virtual",
501 .early_init = dce_virtual_early_init,
502 .late_init = NULL,
503 .sw_init = dce_virtual_sw_init,
504 .sw_fini = dce_virtual_sw_fini,
505 .hw_init = dce_virtual_hw_init,
506 .hw_fini = dce_virtual_hw_fini,
507 .suspend = dce_virtual_suspend,
508 .resume = dce_virtual_resume,
509 .is_idle = dce_virtual_is_idle,
510 .wait_for_idle = dce_virtual_wait_for_idle,
511 .soft_reset = dce_virtual_soft_reset,
512 .set_clockgating_state = dce_virtual_set_clockgating_state,
513 .set_powergating_state = dce_virtual_set_powergating_state,
514};
515
516/* these are handled by the primary encoders */
517static void dce_virtual_encoder_prepare(struct drm_encoder *encoder)
518{
519 return;
520}
521
522static void dce_virtual_encoder_commit(struct drm_encoder *encoder)
523{
524 return;
525}
526
527static void
528dce_virtual_encoder_mode_set(struct drm_encoder *encoder,
529 struct drm_display_mode *mode,
530 struct drm_display_mode *adjusted_mode)
531{
532 return;
533}
534
535static void dce_virtual_encoder_disable(struct drm_encoder *encoder)
536{
537 return;
538}
539
540static void
541dce_virtual_encoder_dpms(struct drm_encoder *encoder, int mode)
542{
543 return;
544}
545
546static bool dce_virtual_encoder_mode_fixup(struct drm_encoder *encoder,
547 const struct drm_display_mode *mode,
548 struct drm_display_mode *adjusted_mode)
549{
550
551 /* set the active encoder to connector routing */
552 amdgpu_encoder_set_active_device(encoder);
553
554 return true;
555}
556
557static const struct drm_encoder_helper_funcs dce_virtual_encoder_helper_funcs = {
558 .dpms = dce_virtual_encoder_dpms,
559 .mode_fixup = dce_virtual_encoder_mode_fixup,
560 .prepare = dce_virtual_encoder_prepare,
561 .mode_set = dce_virtual_encoder_mode_set,
562 .commit = dce_virtual_encoder_commit,
563 .disable = dce_virtual_encoder_disable,
564};
565
566static void dce_virtual_encoder_destroy(struct drm_encoder *encoder)
567{
568 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
569
570 kfree(amdgpu_encoder->enc_priv);
571 drm_encoder_cleanup(encoder);
572 kfree(amdgpu_encoder);
573}
574
575static const struct drm_encoder_funcs dce_virtual_encoder_funcs = {
576 .destroy = dce_virtual_encoder_destroy,
577};
578
579static void dce_virtual_encoder_add(struct amdgpu_device *adev,
580 uint32_t encoder_enum,
581 uint32_t supported_device,
582 u16 caps)
583{
584 struct drm_device *dev = adev->ddev;
585 struct drm_encoder *encoder;
586 struct amdgpu_encoder *amdgpu_encoder;
587
588 /* see if we already added it */
589 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
590 amdgpu_encoder = to_amdgpu_encoder(encoder);
591 if (amdgpu_encoder->encoder_enum == encoder_enum) {
592 amdgpu_encoder->devices |= supported_device;
593 return;
594 }
595
596 }
597
598 /* add a new one */
599 amdgpu_encoder = kzalloc(sizeof(struct amdgpu_encoder), GFP_KERNEL);
600 if (!amdgpu_encoder)
601 return;
602
603 encoder = &amdgpu_encoder->base;
604 encoder->possible_crtcs = 0x1;
605 amdgpu_encoder->enc_priv = NULL;
606 amdgpu_encoder->encoder_enum = encoder_enum;
607 amdgpu_encoder->encoder_id = (encoder_enum & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
608 amdgpu_encoder->devices = supported_device;
609 amdgpu_encoder->rmx_type = RMX_OFF;
610 amdgpu_encoder->underscan_type = UNDERSCAN_OFF;
611 amdgpu_encoder->is_ext_encoder = false;
612 amdgpu_encoder->caps = caps;
613
614 drm_encoder_init(dev, encoder, &dce_virtual_encoder_funcs,
615 DRM_MODE_ENCODER_VIRTUAL, NULL);
616 drm_encoder_helper_add(encoder, &dce_virtual_encoder_helper_funcs);
617 DRM_INFO("[FM]encoder: %d is VIRTUAL\n", amdgpu_encoder->encoder_id);
618}
619
620static const struct amdgpu_display_funcs dce_virtual_display_funcs = {
621 .set_vga_render_state = &dce_virtual_set_vga_render_state,
622 .bandwidth_update = &dce_virtual_bandwidth_update,
623 .vblank_get_counter = &dce_virtual_vblank_get_counter,
624 .vblank_wait = &dce_virtual_vblank_wait,
625 .is_display_hung = &dce_virtual_is_display_hung,
626 .backlight_set_level = NULL,
627 .backlight_get_level = NULL,
628 .hpd_sense = &dce_virtual_hpd_sense,
629 .hpd_set_polarity = &dce_virtual_hpd_set_polarity,
630 .hpd_get_gpio_reg = &dce_virtual_hpd_get_gpio_reg,
631 .page_flip = &dce_virtual_page_flip,
632 .page_flip_get_scanoutpos = &dce_virtual_crtc_get_scanoutpos,
633 .add_encoder = &dce_virtual_encoder_add,
634 .add_connector = &amdgpu_connector_add,
635 .stop_mc_access = &dce_virtual_stop_mc_access,
636 .resume_mc_access = &dce_virtual_resume_mc_access,
637};
638
639static void dce_virtual_set_display_funcs(struct amdgpu_device *adev)
640{
641 if (adev->mode_info.funcs == NULL)
642 adev->mode_info.funcs = &dce_virtual_display_funcs;
643}
644
645static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer *vblank_timer)
646{
647 struct amdgpu_mode_info *mode_info = container_of(vblank_timer, struct amdgpu_mode_info ,vblank_timer);
648 struct amdgpu_device *adev = container_of(mode_info, struct amdgpu_device ,mode_info);
649 unsigned crtc = 0;
650 drm_handle_vblank(adev->ddev, crtc);
651 dce_virtual_pageflip_irq(adev, NULL, NULL);
652 hrtimer_start(vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL);
653 return HRTIMER_NORESTART;
654}
655
656static void dce_virtual_set_crtc_vblank_interrupt_state(struct amdgpu_device *adev,
657 int crtc,
658 enum amdgpu_interrupt_state state)
659{
660 if (crtc >= adev->mode_info.num_crtc) {
661 DRM_DEBUG("invalid crtc %d\n", crtc);
662 return;
663 }
664
665 if (state && !adev->mode_info.vsync_timer_enabled) {
666 DRM_DEBUG("Enable software vsync timer\n");
667 hrtimer_init(&adev->mode_info.vblank_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
668 hrtimer_set_expires(&adev->mode_info.vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD));
669 adev->mode_info.vblank_timer.function = dce_virtual_vblank_timer_handle;
670 hrtimer_start(&adev->mode_info.vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL);
671 } else if (!state && adev->mode_info.vsync_timer_enabled) {
672 DRM_DEBUG("Disable software vsync timer\n");
673 hrtimer_cancel(&adev->mode_info.vblank_timer);
674 }
675
676 adev->mode_info.vsync_timer_enabled = state;
677 DRM_DEBUG("[FM]set crtc %d vblank interrupt state %d\n", crtc, state);
678}
679
680
681static int dce_virtual_set_crtc_irq_state(struct amdgpu_device *adev,
682 struct amdgpu_irq_src *source,
683 unsigned type,
684 enum amdgpu_interrupt_state state)
685{
686 switch (type) {
687 case AMDGPU_CRTC_IRQ_VBLANK1:
688 dce_virtual_set_crtc_vblank_interrupt_state(adev, 0, state);
689 break;
690 default:
691 break;
692 }
693 return 0;
694}
695
696static void dce_virtual_crtc_vblank_int_ack(struct amdgpu_device *adev,
697 int crtc)
698{
699 if (crtc >= adev->mode_info.num_crtc) {
700 DRM_DEBUG("invalid crtc %d\n", crtc);
701 return;
702 }
703}
704
705static int dce_virtual_crtc_irq(struct amdgpu_device *adev,
706 struct amdgpu_irq_src *source,
707 struct amdgpu_iv_entry *entry)
708{
709 unsigned crtc = 0;
710 unsigned irq_type = AMDGPU_CRTC_IRQ_VBLANK1;
711
712 dce_virtual_crtc_vblank_int_ack(adev, crtc);
713
714 if (amdgpu_irq_enabled(adev, source, irq_type)) {
715 drm_handle_vblank(adev->ddev, crtc);
716 }
717 dce_virtual_pageflip_irq(adev, NULL, NULL);
718 DRM_DEBUG("IH: D%d vblank\n", crtc + 1);
719 return 0;
720}
721
722static int dce_virtual_set_pageflip_irq_state(struct amdgpu_device *adev,
723 struct amdgpu_irq_src *src,
724 unsigned type,
725 enum amdgpu_interrupt_state state)
726{
727 if (type >= adev->mode_info.num_crtc) {
728 DRM_ERROR("invalid pageflip crtc %d\n", type);
729 return -EINVAL;
730 }
731 DRM_DEBUG("[FM]set pageflip irq type %d state %d\n", type, state);
732
733 return 0;
734}
735
736static int dce_virtual_pageflip_irq(struct amdgpu_device *adev,
737 struct amdgpu_irq_src *source,
738 struct amdgpu_iv_entry *entry)
739{
740 unsigned long flags;
741 unsigned crtc_id = 0;
742 struct amdgpu_crtc *amdgpu_crtc;
743 struct amdgpu_flip_work *works;
744
745 crtc_id = 0;
746 amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
747
748 if (crtc_id >= adev->mode_info.num_crtc) {
749 DRM_ERROR("invalid pageflip crtc %d\n", crtc_id);
750 return -EINVAL;
751 }
752
753 /* IRQ could occur when in initial stage */
754 if (amdgpu_crtc == NULL)
755 return 0;
756
757 spin_lock_irqsave(&adev->ddev->event_lock, flags);
758 works = amdgpu_crtc->pflip_works;
759 if (amdgpu_crtc->pflip_status != AMDGPU_FLIP_SUBMITTED) {
760 DRM_DEBUG_DRIVER("amdgpu_crtc->pflip_status = %d != "
761 "AMDGPU_FLIP_SUBMITTED(%d)\n",
762 amdgpu_crtc->pflip_status,
763 AMDGPU_FLIP_SUBMITTED);
764 spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
765 return 0;
766 }
767
768 /* page flip completed. clean up */
769 amdgpu_crtc->pflip_status = AMDGPU_FLIP_NONE;
770 amdgpu_crtc->pflip_works = NULL;
771
772 /* wakeup usersapce */
773 if (works->event)
774 drm_crtc_send_vblank_event(&amdgpu_crtc->base, works->event);
775
776 spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
777
778 drm_crtc_vblank_put(&amdgpu_crtc->base);
779 schedule_work(&works->unpin_work);
780
781 return 0;
782}
783
784static const struct amdgpu_irq_src_funcs dce_virtual_crtc_irq_funcs = {
785 .set = dce_virtual_set_crtc_irq_state,
786 .process = dce_virtual_crtc_irq,
787};
788
789static const struct amdgpu_irq_src_funcs dce_virtual_pageflip_irq_funcs = {
790 .set = dce_virtual_set_pageflip_irq_state,
791 .process = dce_virtual_pageflip_irq,
792};
793
794static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev)
795{
796 adev->crtc_irq.num_types = AMDGPU_CRTC_IRQ_LAST;
797 adev->crtc_irq.funcs = &dce_virtual_crtc_irq_funcs;
798
799 adev->pageflip_irq.num_types = AMDGPU_PAGEFLIP_IRQ_LAST;
800 adev->pageflip_irq.funcs = &dce_virtual_pageflip_irq_funcs;
801}
802
diff --git a/drivers/gpu/drm/amd/amdgpu/iceland_smum.h b/drivers/gpu/drm/amd/amdgpu/dce_virtual.h
index 5983e3150cc5..e239243f6ebc 100644
--- a/drivers/gpu/drm/amd/amdgpu/iceland_smum.h
+++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.h
@@ -21,21 +21,11 @@
21 * 21 *
22 */ 22 */
23 23
24#ifndef ICELAND_SMUM_H 24#ifndef __DCE_VIRTUAL_H__
25#define ICELAND_SMUM_H 25#define __DCE_VIRTUAL_H__
26 26
27#include "ppsmc.h" 27extern const struct amd_ip_funcs dce_virtual_ip_funcs;
28 28#define DCE_VIRTUAL_VBLANK_PERIOD 16666666
29extern int iceland_smu_init(struct amdgpu_device *adev);
30extern int iceland_smu_fini(struct amdgpu_device *adev);
31extern int iceland_smu_start(struct amdgpu_device *adev);
32
33struct iceland_smu_private_data
34{
35 uint8_t *header;
36 uint8_t *mec_image;
37 uint32_t header_addr_high;
38 uint32_t header_addr_low;
39};
40 29
41#endif 30#endif
31
diff --git a/drivers/gpu/drm/amd/amdgpu/fiji_dpm.c b/drivers/gpu/drm/amd/amdgpu/fiji_dpm.c
deleted file mode 100644
index ed03b75175d4..000000000000
--- a/drivers/gpu/drm/amd/amdgpu/fiji_dpm.c
+++ /dev/null
@@ -1,186 +0,0 @@
1/*
2 * Copyright 2014 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23
24#include <linux/firmware.h>
25#include "drmP.h"
26#include "amdgpu.h"
27#include "fiji_smum.h"
28
29MODULE_FIRMWARE("amdgpu/fiji_smc.bin");
30
31static void fiji_dpm_set_funcs(struct amdgpu_device *adev);
32
33static int fiji_dpm_early_init(void *handle)
34{
35 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
36
37 fiji_dpm_set_funcs(adev);
38
39 return 0;
40}
41
42static int fiji_dpm_init_microcode(struct amdgpu_device *adev)
43{
44 char fw_name[30] = "amdgpu/fiji_smc.bin";
45 int err;
46
47 err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
48 if (err)
49 goto out;
50 err = amdgpu_ucode_validate(adev->pm.fw);
51
52out:
53 if (err) {
54 DRM_ERROR("Failed to load firmware \"%s\"", fw_name);
55 release_firmware(adev->pm.fw);
56 adev->pm.fw = NULL;
57 }
58 return err;
59}
60
61static int fiji_dpm_sw_init(void *handle)
62{
63 int ret;
64 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
65
66 ret = fiji_dpm_init_microcode(adev);
67 if (ret)
68 return ret;
69
70 return 0;
71}
72
73static int fiji_dpm_sw_fini(void *handle)
74{
75 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
76
77 release_firmware(adev->pm.fw);
78 adev->pm.fw = NULL;
79
80 return 0;
81}
82
83static int fiji_dpm_hw_init(void *handle)
84{
85 int ret;
86 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
87
88 mutex_lock(&adev->pm.mutex);
89
90 ret = fiji_smu_init(adev);
91 if (ret) {
92 DRM_ERROR("SMU initialization failed\n");
93 goto fail;
94 }
95
96 ret = fiji_smu_start(adev);
97 if (ret) {
98 DRM_ERROR("SMU start failed\n");
99 goto fail;
100 }
101
102 mutex_unlock(&adev->pm.mutex);
103 return 0;
104
105fail:
106 adev->firmware.smu_load = false;
107 mutex_unlock(&adev->pm.mutex);
108 return -EINVAL;
109}
110
111static int fiji_dpm_hw_fini(void *handle)
112{
113 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
114 mutex_lock(&adev->pm.mutex);
115 fiji_smu_fini(adev);
116 mutex_unlock(&adev->pm.mutex);
117 return 0;
118}
119
120static int fiji_dpm_suspend(void *handle)
121{
122 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
123
124 fiji_dpm_hw_fini(adev);
125
126 return 0;
127}
128
129static int fiji_dpm_resume(void *handle)
130{
131 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
132
133 fiji_dpm_hw_init(adev);
134
135 return 0;
136}
137
138static int fiji_dpm_set_clockgating_state(void *handle,
139 enum amd_clockgating_state state)
140{
141 return 0;
142}
143
144static int fiji_dpm_set_powergating_state(void *handle,
145 enum amd_powergating_state state)
146{
147 return 0;
148}
149
150const struct amd_ip_funcs fiji_dpm_ip_funcs = {
151 .name = "fiji_dpm",
152 .early_init = fiji_dpm_early_init,
153 .late_init = NULL,
154 .sw_init = fiji_dpm_sw_init,
155 .sw_fini = fiji_dpm_sw_fini,
156 .hw_init = fiji_dpm_hw_init,
157 .hw_fini = fiji_dpm_hw_fini,
158 .suspend = fiji_dpm_suspend,
159 .resume = fiji_dpm_resume,
160 .is_idle = NULL,
161 .wait_for_idle = NULL,
162 .soft_reset = NULL,
163 .set_clockgating_state = fiji_dpm_set_clockgating_state,
164 .set_powergating_state = fiji_dpm_set_powergating_state,
165};
166
167static const struct amdgpu_dpm_funcs fiji_dpm_funcs = {
168 .get_temperature = NULL,
169 .pre_set_power_state = NULL,
170 .set_power_state = NULL,
171 .post_set_power_state = NULL,
172 .display_configuration_changed = NULL,
173 .get_sclk = NULL,
174 .get_mclk = NULL,
175 .print_power_state = NULL,
176 .debugfs_print_current_performance_level = NULL,
177 .force_performance_level = NULL,
178 .vblank_too_short = NULL,
179 .powergate_uvd = NULL,
180};
181
182static void fiji_dpm_set_funcs(struct amdgpu_device *adev)
183{
184 if (NULL == adev->pm.funcs)
185 adev->pm.funcs = &fiji_dpm_funcs;
186}
diff --git a/drivers/gpu/drm/amd/amdgpu/fiji_smc.c b/drivers/gpu/drm/amd/amdgpu/fiji_smc.c
deleted file mode 100644
index b3e19ba4c57f..000000000000
--- a/drivers/gpu/drm/amd/amdgpu/fiji_smc.c
+++ /dev/null
@@ -1,863 +0,0 @@
1/*
2 * Copyright 2014 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23
24#include <linux/firmware.h>
25#include "drmP.h"
26#include "amdgpu.h"
27#include "fiji_ppsmc.h"
28#include "fiji_smum.h"
29#include "smu_ucode_xfer_vi.h"
30#include "amdgpu_ucode.h"
31
32#include "smu/smu_7_1_3_d.h"
33#include "smu/smu_7_1_3_sh_mask.h"
34
35#define FIJI_SMC_SIZE 0x20000
36
37static int fiji_set_smc_sram_address(struct amdgpu_device *adev, uint32_t smc_address, uint32_t limit)
38{
39 uint32_t val;
40
41 if (smc_address & 3)
42 return -EINVAL;
43
44 if ((smc_address + 3) > limit)
45 return -EINVAL;
46
47 WREG32(mmSMC_IND_INDEX_0, smc_address);
48
49 val = RREG32(mmSMC_IND_ACCESS_CNTL);
50 val = REG_SET_FIELD(val, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, 0);
51 WREG32(mmSMC_IND_ACCESS_CNTL, val);
52
53 return 0;
54}
55
56static int fiji_copy_bytes_to_smc(struct amdgpu_device *adev, uint32_t smc_start_address, const uint8_t *src, uint32_t byte_count, uint32_t limit)
57{
58 uint32_t addr;
59 uint32_t data, orig_data;
60 int result = 0;
61 uint32_t extra_shift;
62 unsigned long flags;
63
64 if (smc_start_address & 3)
65 return -EINVAL;
66
67 if ((smc_start_address + byte_count) > limit)
68 return -EINVAL;
69
70 addr = smc_start_address;
71
72 spin_lock_irqsave(&adev->smc_idx_lock, flags);
73 while (byte_count >= 4) {
74 /* Bytes are written into the SMC addres space with the MSB first */
75 data = (src[0] << 24) + (src[1] << 16) + (src[2] << 8) + src[3];
76
77 result = fiji_set_smc_sram_address(adev, addr, limit);
78
79 if (result)
80 goto out;
81
82 WREG32(mmSMC_IND_DATA_0, data);
83
84 src += 4;
85 byte_count -= 4;
86 addr += 4;
87 }
88
89 if (0 != byte_count) {
90 /* Now write odd bytes left, do a read modify write cycle */
91 data = 0;
92
93 result = fiji_set_smc_sram_address(adev, addr, limit);
94 if (result)
95 goto out;
96
97 orig_data = RREG32(mmSMC_IND_DATA_0);
98 extra_shift = 8 * (4 - byte_count);
99
100 while (byte_count > 0) {
101 data = (data << 8) + *src++;
102 byte_count--;
103 }
104
105 data <<= extra_shift;
106 data |= (orig_data & ~((~0UL) << extra_shift));
107
108 result = fiji_set_smc_sram_address(adev, addr, limit);
109 if (result)
110 goto out;
111
112 WREG32(mmSMC_IND_DATA_0, data);
113 }
114
115out:
116 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
117 return result;
118}
119
120static int fiji_program_jump_on_start(struct amdgpu_device *adev)
121{
122 static unsigned char data[] = {0xE0, 0x00, 0x80, 0x40};
123 fiji_copy_bytes_to_smc(adev, 0x0, data, 4, sizeof(data)+1);
124
125 return 0;
126}
127
128static bool fiji_is_smc_ram_running(struct amdgpu_device *adev)
129{
130 uint32_t val = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
131 val = REG_GET_FIELD(val, SMC_SYSCON_CLOCK_CNTL_0, ck_disable);
132
133 return ((0 == val) && (0x20100 <= RREG32_SMC(ixSMC_PC_C)));
134}
135
136static int wait_smu_response(struct amdgpu_device *adev)
137{
138 int i;
139 uint32_t val;
140
141 for (i = 0; i < adev->usec_timeout; i++) {
142 val = RREG32(mmSMC_RESP_0);
143 if (REG_GET_FIELD(val, SMC_RESP_0, SMC_RESP))
144 break;
145 udelay(1);
146 }
147
148 if (i == adev->usec_timeout)
149 return -EINVAL;
150
151 return 0;
152}
153
154static int fiji_send_msg_to_smc_offset(struct amdgpu_device *adev)
155{
156 if (wait_smu_response(adev)) {
157 DRM_ERROR("Failed to send previous message\n");
158 return -EINVAL;
159 }
160
161 WREG32(mmSMC_MSG_ARG_0, 0x20000);
162 WREG32(mmSMC_MESSAGE_0, PPSMC_MSG_Test);
163
164 if (wait_smu_response(adev)) {
165 DRM_ERROR("Failed to send message\n");
166 return -EINVAL;
167 }
168
169 return 0;
170}
171
172static int fiji_send_msg_to_smc(struct amdgpu_device *adev, PPSMC_Msg msg)
173{
174 if (!fiji_is_smc_ram_running(adev))
175 {
176 return -EINVAL;
177 }
178
179 if (wait_smu_response(adev)) {
180 DRM_ERROR("Failed to send previous message\n");
181 return -EINVAL;
182 }
183
184 WREG32(mmSMC_MESSAGE_0, msg);
185
186 if (wait_smu_response(adev)) {
187 DRM_ERROR("Failed to send message\n");
188 return -EINVAL;
189 }
190
191 return 0;
192}
193
194static int fiji_send_msg_to_smc_without_waiting(struct amdgpu_device *adev,
195 PPSMC_Msg msg)
196{
197 if (wait_smu_response(adev)) {
198 DRM_ERROR("Failed to send previous message\n");
199 return -EINVAL;
200 }
201
202 WREG32(mmSMC_MESSAGE_0, msg);
203
204 return 0;
205}
206
207static int fiji_send_msg_to_smc_with_parameter(struct amdgpu_device *adev,
208 PPSMC_Msg msg,
209 uint32_t parameter)
210{
211 if (!fiji_is_smc_ram_running(adev))
212 return -EINVAL;
213
214 if (wait_smu_response(adev)) {
215 DRM_ERROR("Failed to send previous message\n");
216 return -EINVAL;
217 }
218
219 WREG32(mmSMC_MSG_ARG_0, parameter);
220
221 return fiji_send_msg_to_smc(adev, msg);
222}
223
224static int fiji_send_msg_to_smc_with_parameter_without_waiting(
225 struct amdgpu_device *adev,
226 PPSMC_Msg msg, uint32_t parameter)
227{
228 if (wait_smu_response(adev)) {
229 DRM_ERROR("Failed to send previous message\n");
230 return -EINVAL;
231 }
232
233 WREG32(mmSMC_MSG_ARG_0, parameter);
234
235 return fiji_send_msg_to_smc_without_waiting(adev, msg);
236}
237
238#if 0 /* not used yet */
239static int fiji_wait_for_smc_inactive(struct amdgpu_device *adev)
240{
241 int i;
242 uint32_t val;
243
244 if (!fiji_is_smc_ram_running(adev))
245 return -EINVAL;
246
247 for (i = 0; i < adev->usec_timeout; i++) {
248 val = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
249 if (REG_GET_FIELD(val, SMC_SYSCON_CLOCK_CNTL_0, cken) == 0)
250 break;
251 udelay(1);
252 }
253
254 if (i == adev->usec_timeout)
255 return -EINVAL;
256
257 return 0;
258}
259#endif
260
261static int fiji_smu_upload_firmware_image(struct amdgpu_device *adev)
262{
263 const struct smc_firmware_header_v1_0 *hdr;
264 uint32_t ucode_size;
265 uint32_t ucode_start_address;
266 const uint8_t *src;
267 uint32_t val;
268 uint32_t byte_count;
269 uint32_t *data;
270 unsigned long flags;
271
272 if (!adev->pm.fw)
273 return -EINVAL;
274
275 /* Skip SMC ucode loading on SR-IOV capable boards.
276 * vbios does this for us in asic_init in that case.
277 */
278 if (adev->virtualization.supports_sr_iov)
279 return 0;
280
281 hdr = (const struct smc_firmware_header_v1_0 *)adev->pm.fw->data;
282 amdgpu_ucode_print_smc_hdr(&hdr->header);
283
284 adev->pm.fw_version = le32_to_cpu(hdr->header.ucode_version);
285 ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes);
286 ucode_start_address = le32_to_cpu(hdr->ucode_start_addr);
287 src = (const uint8_t *)
288 (adev->pm.fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
289
290 if (ucode_size & 3) {
291 DRM_ERROR("SMC ucode is not 4 bytes aligned\n");
292 return -EINVAL;
293 }
294
295 if (ucode_size > FIJI_SMC_SIZE) {
296 DRM_ERROR("SMC address is beyond the SMC RAM area\n");
297 return -EINVAL;
298 }
299
300 spin_lock_irqsave(&adev->smc_idx_lock, flags);
301 WREG32(mmSMC_IND_INDEX_0, ucode_start_address);
302
303 val = RREG32(mmSMC_IND_ACCESS_CNTL);
304 val = REG_SET_FIELD(val, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, 1);
305 WREG32(mmSMC_IND_ACCESS_CNTL, val);
306
307 byte_count = ucode_size;
308 data = (uint32_t *)src;
309 for (; byte_count >= 4; data++, byte_count -= 4)
310 WREG32(mmSMC_IND_DATA_0, data[0]);
311
312 val = RREG32(mmSMC_IND_ACCESS_CNTL);
313 val = REG_SET_FIELD(val, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, 0);
314 WREG32(mmSMC_IND_ACCESS_CNTL, val);
315 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
316
317 return 0;
318}
319
320#if 0 /* not used yet */
321static int fiji_read_smc_sram_dword(struct amdgpu_device *adev,
322 uint32_t smc_address,
323 uint32_t *value,
324 uint32_t limit)
325{
326 int result;
327 unsigned long flags;
328
329 spin_lock_irqsave(&adev->smc_idx_lock, flags);
330 result = fiji_set_smc_sram_address(adev, smc_address, limit);
331 if (result == 0)
332 *value = RREG32(mmSMC_IND_DATA_0);
333 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
334 return result;
335}
336
337static int fiji_write_smc_sram_dword(struct amdgpu_device *adev,
338 uint32_t smc_address,
339 uint32_t value,
340 uint32_t limit)
341{
342 int result;
343 unsigned long flags;
344
345 spin_lock_irqsave(&adev->smc_idx_lock, flags);
346 result = fiji_set_smc_sram_address(adev, smc_address, limit);
347 if (result == 0)
348 WREG32(mmSMC_IND_DATA_0, value);
349 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
350 return result;
351}
352
353static int fiji_smu_stop_smc(struct amdgpu_device *adev)
354{
355 uint32_t val = RREG32_SMC(ixSMC_SYSCON_RESET_CNTL);
356 val = REG_SET_FIELD(val, SMC_SYSCON_RESET_CNTL, rst_reg, 1);
357 WREG32_SMC(ixSMC_SYSCON_RESET_CNTL, val);
358
359 val = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
360 val = REG_SET_FIELD(val, SMC_SYSCON_CLOCK_CNTL_0, ck_disable, 1);
361 WREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0, val);
362
363 return 0;
364}
365#endif
366
367static enum AMDGPU_UCODE_ID fiji_convert_fw_type(uint32_t fw_type)
368{
369 switch (fw_type) {
370 case UCODE_ID_SDMA0:
371 return AMDGPU_UCODE_ID_SDMA0;
372 case UCODE_ID_SDMA1:
373 return AMDGPU_UCODE_ID_SDMA1;
374 case UCODE_ID_CP_CE:
375 return AMDGPU_UCODE_ID_CP_CE;
376 case UCODE_ID_CP_PFP:
377 return AMDGPU_UCODE_ID_CP_PFP;
378 case UCODE_ID_CP_ME:
379 return AMDGPU_UCODE_ID_CP_ME;
380 case UCODE_ID_CP_MEC:
381 case UCODE_ID_CP_MEC_JT1:
382 case UCODE_ID_CP_MEC_JT2:
383 return AMDGPU_UCODE_ID_CP_MEC1;
384 case UCODE_ID_RLC_G:
385 return AMDGPU_UCODE_ID_RLC_G;
386 default:
387 DRM_ERROR("ucode type is out of range!\n");
388 return AMDGPU_UCODE_ID_MAXIMUM;
389 }
390}
391
392static int fiji_smu_populate_single_firmware_entry(struct amdgpu_device *adev,
393 uint32_t fw_type,
394 struct SMU_Entry *entry)
395{
396 enum AMDGPU_UCODE_ID id = fiji_convert_fw_type(fw_type);
397 struct amdgpu_firmware_info *ucode = &adev->firmware.ucode[id];
398 const struct gfx_firmware_header_v1_0 *header = NULL;
399 uint64_t gpu_addr;
400 uint32_t data_size;
401
402 if (ucode->fw == NULL)
403 return -EINVAL;
404 gpu_addr = ucode->mc_addr;
405 header = (const struct gfx_firmware_header_v1_0 *)ucode->fw->data;
406 data_size = le32_to_cpu(header->header.ucode_size_bytes);
407
408 if ((fw_type == UCODE_ID_CP_MEC_JT1) ||
409 (fw_type == UCODE_ID_CP_MEC_JT2)) {
410 gpu_addr += le32_to_cpu(header->jt_offset) << 2;
411 data_size = le32_to_cpu(header->jt_size) << 2;
412 }
413
414 entry->version = (uint16_t)le32_to_cpu(header->header.ucode_version);
415 entry->id = (uint16_t)fw_type;
416 entry->image_addr_high = upper_32_bits(gpu_addr);
417 entry->image_addr_low = lower_32_bits(gpu_addr);
418 entry->meta_data_addr_high = 0;
419 entry->meta_data_addr_low = 0;
420 entry->data_size_byte = data_size;
421 entry->num_register_entries = 0;
422
423 if (fw_type == UCODE_ID_RLC_G)
424 entry->flags = 1;
425 else
426 entry->flags = 0;
427
428 return 0;
429}
430
431static int fiji_smu_request_load_fw(struct amdgpu_device *adev)
432{
433 struct fiji_smu_private_data *private = (struct fiji_smu_private_data *)adev->smu.priv;
434 struct SMU_DRAMData_TOC *toc;
435 uint32_t fw_to_load;
436
437 WREG32_SMC(ixSOFT_REGISTERS_TABLE_28, 0);
438
439 fiji_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_SMU_DRAM_ADDR_HI, private->smu_buffer_addr_high);
440 fiji_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_SMU_DRAM_ADDR_LO, private->smu_buffer_addr_low);
441
442 toc = (struct SMU_DRAMData_TOC *)private->header;
443 toc->num_entries = 0;
444 toc->structure_version = 1;
445
446 if (!adev->firmware.smu_load)
447 return 0;
448
449 if (fiji_smu_populate_single_firmware_entry(adev, UCODE_ID_RLC_G,
450 &toc->entry[toc->num_entries++])) {
451 DRM_ERROR("Failed to get firmware entry for RLC\n");
452 return -EINVAL;
453 }
454
455 if (fiji_smu_populate_single_firmware_entry(adev, UCODE_ID_CP_CE,
456 &toc->entry[toc->num_entries++])) {
457 DRM_ERROR("Failed to get firmware entry for CE\n");
458 return -EINVAL;
459 }
460
461 if (fiji_smu_populate_single_firmware_entry(adev, UCODE_ID_CP_PFP,
462 &toc->entry[toc->num_entries++])) {
463 DRM_ERROR("Failed to get firmware entry for PFP\n");
464 return -EINVAL;
465 }
466
467 if (fiji_smu_populate_single_firmware_entry(adev, UCODE_ID_CP_ME,
468 &toc->entry[toc->num_entries++])) {
469 DRM_ERROR("Failed to get firmware entry for ME\n");
470 return -EINVAL;
471 }
472
473 if (fiji_smu_populate_single_firmware_entry(adev, UCODE_ID_CP_MEC,
474 &toc->entry[toc->num_entries++])) {
475 DRM_ERROR("Failed to get firmware entry for MEC\n");
476 return -EINVAL;
477 }
478
479 if (fiji_smu_populate_single_firmware_entry(adev, UCODE_ID_CP_MEC_JT1,
480 &toc->entry[toc->num_entries++])) {
481 DRM_ERROR("Failed to get firmware entry for MEC_JT1\n");
482 return -EINVAL;
483 }
484
485 if (fiji_smu_populate_single_firmware_entry(adev, UCODE_ID_CP_MEC_JT2,
486 &toc->entry[toc->num_entries++])) {
487 DRM_ERROR("Failed to get firmware entry for MEC_JT2\n");
488 return -EINVAL;
489 }
490
491 if (fiji_smu_populate_single_firmware_entry(adev, UCODE_ID_SDMA0,
492 &toc->entry[toc->num_entries++])) {
493 DRM_ERROR("Failed to get firmware entry for SDMA0\n");
494 return -EINVAL;
495 }
496
497 if (fiji_smu_populate_single_firmware_entry(adev, UCODE_ID_SDMA1,
498 &toc->entry[toc->num_entries++])) {
499 DRM_ERROR("Failed to get firmware entry for SDMA1\n");
500 return -EINVAL;
501 }
502
503 fiji_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_DRV_DRAM_ADDR_HI, private->header_addr_high);
504 fiji_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_DRV_DRAM_ADDR_LO, private->header_addr_low);
505
506 fw_to_load = UCODE_ID_RLC_G_MASK |
507 UCODE_ID_SDMA0_MASK |
508 UCODE_ID_SDMA1_MASK |
509 UCODE_ID_CP_CE_MASK |
510 UCODE_ID_CP_ME_MASK |
511 UCODE_ID_CP_PFP_MASK |
512 UCODE_ID_CP_MEC_MASK;
513
514 if (fiji_send_msg_to_smc_with_parameter_without_waiting(adev, PPSMC_MSG_LoadUcodes, fw_to_load)) {
515 DRM_ERROR("Fail to request SMU load ucode\n");
516 return -EINVAL;
517 }
518
519 return 0;
520}
521
522static uint32_t fiji_smu_get_mask_for_fw_type(uint32_t fw_type)
523{
524 switch (fw_type) {
525 case AMDGPU_UCODE_ID_SDMA0:
526 return UCODE_ID_SDMA0_MASK;
527 case AMDGPU_UCODE_ID_SDMA1:
528 return UCODE_ID_SDMA1_MASK;
529 case AMDGPU_UCODE_ID_CP_CE:
530 return UCODE_ID_CP_CE_MASK;
531 case AMDGPU_UCODE_ID_CP_PFP:
532 return UCODE_ID_CP_PFP_MASK;
533 case AMDGPU_UCODE_ID_CP_ME:
534 return UCODE_ID_CP_ME_MASK;
535 case AMDGPU_UCODE_ID_CP_MEC1:
536 return UCODE_ID_CP_MEC_MASK;
537 case AMDGPU_UCODE_ID_CP_MEC2:
538 return UCODE_ID_CP_MEC_MASK;
539 case AMDGPU_UCODE_ID_RLC_G:
540 return UCODE_ID_RLC_G_MASK;
541 default:
542 DRM_ERROR("ucode type is out of range!\n");
543 return 0;
544 }
545}
546
547static int fiji_smu_check_fw_load_finish(struct amdgpu_device *adev,
548 uint32_t fw_type)
549{
550 uint32_t fw_mask = fiji_smu_get_mask_for_fw_type(fw_type);
551 int i;
552
553 for (i = 0; i < adev->usec_timeout; i++) {
554 if (fw_mask == (RREG32_SMC(ixSOFT_REGISTERS_TABLE_28) & fw_mask))
555 break;
556 udelay(1);
557 }
558
559 if (i == adev->usec_timeout) {
560 DRM_ERROR("check firmware loading failed\n");
561 return -EINVAL;
562 }
563
564 return 0;
565}
566
567static int fiji_smu_start_in_protection_mode(struct amdgpu_device *adev)
568{
569 int result;
570 uint32_t val;
571 int i;
572
573 /* Assert reset */
574 val = RREG32_SMC(ixSMC_SYSCON_RESET_CNTL);
575 val = REG_SET_FIELD(val, SMC_SYSCON_RESET_CNTL, rst_reg, 1);
576 WREG32_SMC(ixSMC_SYSCON_RESET_CNTL, val);
577
578 result = fiji_smu_upload_firmware_image(adev);
579 if (result)
580 return result;
581
582 /* Clear status */
583 WREG32_SMC(ixSMU_STATUS, 0);
584
585 /* Enable clock */
586 val = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
587 val = REG_SET_FIELD(val, SMC_SYSCON_CLOCK_CNTL_0, ck_disable, 0);
588 WREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0, val);
589
590 /* De-assert reset */
591 val = RREG32_SMC(ixSMC_SYSCON_RESET_CNTL);
592 val = REG_SET_FIELD(val, SMC_SYSCON_RESET_CNTL, rst_reg, 0);
593 WREG32_SMC(ixSMC_SYSCON_RESET_CNTL, val);
594
595 /* Set SMU Auto Start */
596 val = RREG32_SMC(ixSMU_INPUT_DATA);
597 val = REG_SET_FIELD(val, SMU_INPUT_DATA, AUTO_START, 1);
598 WREG32_SMC(ixSMU_INPUT_DATA, val);
599
600 /* Clear firmware interrupt enable flag */
601 WREG32_SMC(ixFIRMWARE_FLAGS, 0);
602
603 for (i = 0; i < adev->usec_timeout; i++) {
604 val = RREG32_SMC(ixRCU_UC_EVENTS);
605 if (REG_GET_FIELD(val, RCU_UC_EVENTS, INTERRUPTS_ENABLED))
606 break;
607 udelay(1);
608 }
609
610 if (i == adev->usec_timeout) {
611 DRM_ERROR("Interrupt is not enabled by firmware\n");
612 return -EINVAL;
613 }
614
615 /* Call Test SMU message with 0x20000 offset
616 * to trigger SMU start
617 */
618 fiji_send_msg_to_smc_offset(adev);
619 DRM_INFO("[FM]try triger smu start\n");
620 /* Wait for done bit to be set */
621 for (i = 0; i < adev->usec_timeout; i++) {
622 val = RREG32_SMC(ixSMU_STATUS);
623 if (REG_GET_FIELD(val, SMU_STATUS, SMU_DONE))
624 break;
625 udelay(1);
626 }
627
628 if (i == adev->usec_timeout) {
629 DRM_ERROR("Timeout for SMU start\n");
630 return -EINVAL;
631 }
632
633 /* Check pass/failed indicator */
634 val = RREG32_SMC(ixSMU_STATUS);
635 if (!REG_GET_FIELD(val, SMU_STATUS, SMU_PASS)) {
636 DRM_ERROR("SMU Firmware start failed\n");
637 return -EINVAL;
638 }
639 DRM_INFO("[FM]smu started\n");
640 /* Wait for firmware to initialize */
641 for (i = 0; i < adev->usec_timeout; i++) {
642 val = RREG32_SMC(ixFIRMWARE_FLAGS);
643 if(REG_GET_FIELD(val, FIRMWARE_FLAGS, INTERRUPTS_ENABLED))
644 break;
645 udelay(1);
646 }
647
648 if (i == adev->usec_timeout) {
649 DRM_ERROR("SMU firmware initialization failed\n");
650 return -EINVAL;
651 }
652 DRM_INFO("[FM]smu initialized\n");
653
654 return 0;
655}
656
657static int fiji_smu_start_in_non_protection_mode(struct amdgpu_device *adev)
658{
659 int i, result;
660 uint32_t val;
661
662 /* wait for smc boot up */
663 for (i = 0; i < adev->usec_timeout; i++) {
664 val = RREG32_SMC(ixRCU_UC_EVENTS);
665 val = REG_GET_FIELD(val, RCU_UC_EVENTS, boot_seq_done);
666 if (val)
667 break;
668 udelay(1);
669 }
670
671 if (i == adev->usec_timeout) {
672 DRM_ERROR("SMC boot sequence is not completed\n");
673 return -EINVAL;
674 }
675
676 /* Clear firmware interrupt enable flag */
677 WREG32_SMC(ixFIRMWARE_FLAGS, 0);
678
679 /* Assert reset */
680 val = RREG32_SMC(ixSMC_SYSCON_RESET_CNTL);
681 val = REG_SET_FIELD(val, SMC_SYSCON_RESET_CNTL, rst_reg, 1);
682 WREG32_SMC(ixSMC_SYSCON_RESET_CNTL, val);
683
684 result = fiji_smu_upload_firmware_image(adev);
685 if (result)
686 return result;
687
688 /* Set smc instruct start point at 0x0 */
689 fiji_program_jump_on_start(adev);
690
691 /* Enable clock */
692 val = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
693 val = REG_SET_FIELD(val, SMC_SYSCON_CLOCK_CNTL_0, ck_disable, 0);
694 WREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0, val);
695
696 /* De-assert reset */
697 val = RREG32_SMC(ixSMC_SYSCON_RESET_CNTL);
698 val = REG_SET_FIELD(val, SMC_SYSCON_RESET_CNTL, rst_reg, 0);
699 WREG32_SMC(ixSMC_SYSCON_RESET_CNTL, val);
700
701 /* Wait for firmware to initialize */
702 for (i = 0; i < adev->usec_timeout; i++) {
703 val = RREG32_SMC(ixFIRMWARE_FLAGS);
704 if (REG_GET_FIELD(val, FIRMWARE_FLAGS, INTERRUPTS_ENABLED))
705 break;
706 udelay(1);
707 }
708
709 if (i == adev->usec_timeout) {
710 DRM_ERROR("Timeout for SMC firmware initialization\n");
711 return -EINVAL;
712 }
713
714 return 0;
715}
716
717int fiji_smu_start(struct amdgpu_device *adev)
718{
719 int result;
720 uint32_t val;
721
722 if (!fiji_is_smc_ram_running(adev)) {
723 val = RREG32_SMC(ixSMU_FIRMWARE);
724 if (!REG_GET_FIELD(val, SMU_FIRMWARE, SMU_MODE)) {
725 DRM_INFO("[FM]start smu in nonprotection mode\n");
726 result = fiji_smu_start_in_non_protection_mode(adev);
727 if (result)
728 return result;
729 } else {
730 DRM_INFO("[FM]start smu in protection mode\n");
731 result = fiji_smu_start_in_protection_mode(adev);
732 if (result)
733 return result;
734 }
735 }
736
737 return fiji_smu_request_load_fw(adev);
738}
739
740static const struct amdgpu_smumgr_funcs fiji_smumgr_funcs = {
741 .check_fw_load_finish = fiji_smu_check_fw_load_finish,
742 .request_smu_load_fw = NULL,
743 .request_smu_specific_fw = NULL,
744};
745
746int fiji_smu_init(struct amdgpu_device *adev)
747{
748 struct fiji_smu_private_data *private;
749 uint32_t image_size = ((sizeof(struct SMU_DRAMData_TOC) / 4096) + 1) * 4096;
750 uint32_t smu_internal_buffer_size = 200*4096;
751 struct amdgpu_bo **toc_buf = &adev->smu.toc_buf;
752 struct amdgpu_bo **smu_buf = &adev->smu.smu_buf;
753 uint64_t mc_addr;
754 void *toc_buf_ptr;
755 void *smu_buf_ptr;
756 int ret;
757
758 private = kzalloc(sizeof(struct fiji_smu_private_data), GFP_KERNEL);
759 if (NULL == private)
760 return -ENOMEM;
761
762 /* allocate firmware buffers */
763 if (adev->firmware.smu_load)
764 amdgpu_ucode_init_bo(adev);
765
766 adev->smu.priv = private;
767 adev->smu.fw_flags = 0;
768
769 /* Allocate FW image data structure and header buffer */
770 ret = amdgpu_bo_create(adev, image_size, PAGE_SIZE,
771 true, AMDGPU_GEM_DOMAIN_VRAM,
772 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
773 NULL, NULL, toc_buf);
774 if (ret) {
775 DRM_ERROR("Failed to allocate memory for TOC buffer\n");
776 return -ENOMEM;
777 }
778
779 /* Allocate buffer for SMU internal buffer */
780 ret = amdgpu_bo_create(adev, smu_internal_buffer_size, PAGE_SIZE,
781 true, AMDGPU_GEM_DOMAIN_VRAM,
782 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
783 NULL, NULL, smu_buf);
784 if (ret) {
785 DRM_ERROR("Failed to allocate memory for SMU internal buffer\n");
786 return -ENOMEM;
787 }
788
789 /* Retrieve GPU address for header buffer and internal buffer */
790 ret = amdgpu_bo_reserve(adev->smu.toc_buf, false);
791 if (ret) {
792 amdgpu_bo_unref(&adev->smu.toc_buf);
793 DRM_ERROR("Failed to reserve the TOC buffer\n");
794 return -EINVAL;
795 }
796
797 ret = amdgpu_bo_pin(adev->smu.toc_buf, AMDGPU_GEM_DOMAIN_VRAM, &mc_addr);
798 if (ret) {
799 amdgpu_bo_unreserve(adev->smu.toc_buf);
800 amdgpu_bo_unref(&adev->smu.toc_buf);
801 DRM_ERROR("Failed to pin the TOC buffer\n");
802 return -EINVAL;
803 }
804
805 ret = amdgpu_bo_kmap(*toc_buf, &toc_buf_ptr);
806 if (ret) {
807 amdgpu_bo_unreserve(adev->smu.toc_buf);
808 amdgpu_bo_unref(&adev->smu.toc_buf);
809 DRM_ERROR("Failed to map the TOC buffer\n");
810 return -EINVAL;
811 }
812
813 amdgpu_bo_unreserve(adev->smu.toc_buf);
814 private->header_addr_low = lower_32_bits(mc_addr);
815 private->header_addr_high = upper_32_bits(mc_addr);
816 private->header = toc_buf_ptr;
817
818 ret = amdgpu_bo_reserve(adev->smu.smu_buf, false);
819 if (ret) {
820 amdgpu_bo_unref(&adev->smu.smu_buf);
821 amdgpu_bo_unref(&adev->smu.toc_buf);
822 DRM_ERROR("Failed to reserve the SMU internal buffer\n");
823 return -EINVAL;
824 }
825
826 ret = amdgpu_bo_pin(adev->smu.smu_buf, AMDGPU_GEM_DOMAIN_VRAM, &mc_addr);
827 if (ret) {
828 amdgpu_bo_unreserve(adev->smu.smu_buf);
829 amdgpu_bo_unref(&adev->smu.smu_buf);
830 amdgpu_bo_unref(&adev->smu.toc_buf);
831 DRM_ERROR("Failed to pin the SMU internal buffer\n");
832 return -EINVAL;
833 }
834
835 ret = amdgpu_bo_kmap(*smu_buf, &smu_buf_ptr);
836 if (ret) {
837 amdgpu_bo_unreserve(adev->smu.smu_buf);
838 amdgpu_bo_unref(&adev->smu.smu_buf);
839 amdgpu_bo_unref(&adev->smu.toc_buf);
840 DRM_ERROR("Failed to map the SMU internal buffer\n");
841 return -EINVAL;
842 }
843
844 amdgpu_bo_unreserve(adev->smu.smu_buf);
845 private->smu_buffer_addr_low = lower_32_bits(mc_addr);
846 private->smu_buffer_addr_high = upper_32_bits(mc_addr);
847
848 adev->smu.smumgr_funcs = &fiji_smumgr_funcs;
849
850 return 0;
851}
852
853int fiji_smu_fini(struct amdgpu_device *adev)
854{
855 amdgpu_bo_unref(&adev->smu.toc_buf);
856 amdgpu_bo_unref(&adev->smu.smu_buf);
857 kfree(adev->smu.priv);
858 adev->smu.priv = NULL;
859 if (adev->firmware.fw_buf)
860 amdgpu_ucode_fini_bo(adev);
861
862 return 0;
863}
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
new file mode 100644
index 000000000000..40abb6b81c09
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
@@ -0,0 +1,3362 @@
1/*
2 * Copyright 2015 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23#include <linux/firmware.h>
24#include "amdgpu.h"
25#include "amdgpu_ih.h"
26#include "amdgpu_gfx.h"
27#include "amdgpu_ucode.h"
28#include "si/clearstate_si.h"
29#include "si/sid.h"
30
31#define GFX6_NUM_GFX_RINGS 1
32#define GFX6_NUM_COMPUTE_RINGS 2
33#define STATIC_PER_CU_PG_ENABLE (1 << 3)
34#define DYN_PER_CU_PG_ENABLE (1 << 2)
35#define RLC_SAVE_AND_RESTORE_STARTING_OFFSET 0x90
36#define RLC_CLEAR_STATE_DESCRIPTOR_OFFSET 0x3D
37
38
39static void gfx_v6_0_set_ring_funcs(struct amdgpu_device *adev);
40static void gfx_v6_0_set_irq_funcs(struct amdgpu_device *adev);
41static void gfx_v6_0_get_cu_info(struct amdgpu_device *adev);
42
43MODULE_FIRMWARE("radeon/tahiti_pfp.bin");
44MODULE_FIRMWARE("radeon/tahiti_me.bin");
45MODULE_FIRMWARE("radeon/tahiti_ce.bin");
46MODULE_FIRMWARE("radeon/tahiti_rlc.bin");
47
48MODULE_FIRMWARE("radeon/pitcairn_pfp.bin");
49MODULE_FIRMWARE("radeon/pitcairn_me.bin");
50MODULE_FIRMWARE("radeon/pitcairn_ce.bin");
51MODULE_FIRMWARE("radeon/pitcairn_rlc.bin");
52
53MODULE_FIRMWARE("radeon/verde_pfp.bin");
54MODULE_FIRMWARE("radeon/verde_me.bin");
55MODULE_FIRMWARE("radeon/verde_ce.bin");
56MODULE_FIRMWARE("radeon/verde_rlc.bin");
57
58MODULE_FIRMWARE("radeon/oland_pfp.bin");
59MODULE_FIRMWARE("radeon/oland_me.bin");
60MODULE_FIRMWARE("radeon/oland_ce.bin");
61MODULE_FIRMWARE("radeon/oland_rlc.bin");
62
63MODULE_FIRMWARE("radeon/hainan_pfp.bin");
64MODULE_FIRMWARE("radeon/hainan_me.bin");
65MODULE_FIRMWARE("radeon/hainan_ce.bin");
66MODULE_FIRMWARE("radeon/hainan_rlc.bin");
67
68static u32 gfx_v6_0_get_csb_size(struct amdgpu_device *adev);
69static void gfx_v6_0_get_csb_buffer(struct amdgpu_device *adev, volatile u32 *buffer);
70//static void gfx_v6_0_init_cp_pg_table(struct amdgpu_device *adev);
71static void gfx_v6_0_init_pg(struct amdgpu_device *adev);
72
73
74static const u32 verde_rlc_save_restore_register_list[] =
75{
76 (0x8000 << 16) | (0x98f4 >> 2),
77 0x00000000,
78 (0x8040 << 16) | (0x98f4 >> 2),
79 0x00000000,
80 (0x8000 << 16) | (0xe80 >> 2),
81 0x00000000,
82 (0x8040 << 16) | (0xe80 >> 2),
83 0x00000000,
84 (0x8000 << 16) | (0x89bc >> 2),
85 0x00000000,
86 (0x8040 << 16) | (0x89bc >> 2),
87 0x00000000,
88 (0x8000 << 16) | (0x8c1c >> 2),
89 0x00000000,
90 (0x8040 << 16) | (0x8c1c >> 2),
91 0x00000000,
92 (0x9c00 << 16) | (0x98f0 >> 2),
93 0x00000000,
94 (0x9c00 << 16) | (0xe7c >> 2),
95 0x00000000,
96 (0x8000 << 16) | (0x9148 >> 2),
97 0x00000000,
98 (0x8040 << 16) | (0x9148 >> 2),
99 0x00000000,
100 (0x9c00 << 16) | (0x9150 >> 2),
101 0x00000000,
102 (0x9c00 << 16) | (0x897c >> 2),
103 0x00000000,
104 (0x9c00 << 16) | (0x8d8c >> 2),
105 0x00000000,
106 (0x9c00 << 16) | (0xac54 >> 2),
107 0X00000000,
108 0x3,
109 (0x9c00 << 16) | (0x98f8 >> 2),
110 0x00000000,
111 (0x9c00 << 16) | (0x9910 >> 2),
112 0x00000000,
113 (0x9c00 << 16) | (0x9914 >> 2),
114 0x00000000,
115 (0x9c00 << 16) | (0x9918 >> 2),
116 0x00000000,
117 (0x9c00 << 16) | (0x991c >> 2),
118 0x00000000,
119 (0x9c00 << 16) | (0x9920 >> 2),
120 0x00000000,
121 (0x9c00 << 16) | (0x9924 >> 2),
122 0x00000000,
123 (0x9c00 << 16) | (0x9928 >> 2),
124 0x00000000,
125 (0x9c00 << 16) | (0x992c >> 2),
126 0x00000000,
127 (0x9c00 << 16) | (0x9930 >> 2),
128 0x00000000,
129 (0x9c00 << 16) | (0x9934 >> 2),
130 0x00000000,
131 (0x9c00 << 16) | (0x9938 >> 2),
132 0x00000000,
133 (0x9c00 << 16) | (0x993c >> 2),
134 0x00000000,
135 (0x9c00 << 16) | (0x9940 >> 2),
136 0x00000000,
137 (0x9c00 << 16) | (0x9944 >> 2),
138 0x00000000,
139 (0x9c00 << 16) | (0x9948 >> 2),
140 0x00000000,
141 (0x9c00 << 16) | (0x994c >> 2),
142 0x00000000,
143 (0x9c00 << 16) | (0x9950 >> 2),
144 0x00000000,
145 (0x9c00 << 16) | (0x9954 >> 2),
146 0x00000000,
147 (0x9c00 << 16) | (0x9958 >> 2),
148 0x00000000,
149 (0x9c00 << 16) | (0x995c >> 2),
150 0x00000000,
151 (0x9c00 << 16) | (0x9960 >> 2),
152 0x00000000,
153 (0x9c00 << 16) | (0x9964 >> 2),
154 0x00000000,
155 (0x9c00 << 16) | (0x9968 >> 2),
156 0x00000000,
157 (0x9c00 << 16) | (0x996c >> 2),
158 0x00000000,
159 (0x9c00 << 16) | (0x9970 >> 2),
160 0x00000000,
161 (0x9c00 << 16) | (0x9974 >> 2),
162 0x00000000,
163 (0x9c00 << 16) | (0x9978 >> 2),
164 0x00000000,
165 (0x9c00 << 16) | (0x997c >> 2),
166 0x00000000,
167 (0x9c00 << 16) | (0x9980 >> 2),
168 0x00000000,
169 (0x9c00 << 16) | (0x9984 >> 2),
170 0x00000000,
171 (0x9c00 << 16) | (0x9988 >> 2),
172 0x00000000,
173 (0x9c00 << 16) | (0x998c >> 2),
174 0x00000000,
175 (0x9c00 << 16) | (0x8c00 >> 2),
176 0x00000000,
177 (0x9c00 << 16) | (0x8c14 >> 2),
178 0x00000000,
179 (0x9c00 << 16) | (0x8c04 >> 2),
180 0x00000000,
181 (0x9c00 << 16) | (0x8c08 >> 2),
182 0x00000000,
183 (0x8000 << 16) | (0x9b7c >> 2),
184 0x00000000,
185 (0x8040 << 16) | (0x9b7c >> 2),
186 0x00000000,
187 (0x8000 << 16) | (0xe84 >> 2),
188 0x00000000,
189 (0x8040 << 16) | (0xe84 >> 2),
190 0x00000000,
191 (0x8000 << 16) | (0x89c0 >> 2),
192 0x00000000,
193 (0x8040 << 16) | (0x89c0 >> 2),
194 0x00000000,
195 (0x8000 << 16) | (0x914c >> 2),
196 0x00000000,
197 (0x8040 << 16) | (0x914c >> 2),
198 0x00000000,
199 (0x8000 << 16) | (0x8c20 >> 2),
200 0x00000000,
201 (0x8040 << 16) | (0x8c20 >> 2),
202 0x00000000,
203 (0x8000 << 16) | (0x9354 >> 2),
204 0x00000000,
205 (0x8040 << 16) | (0x9354 >> 2),
206 0x00000000,
207 (0x9c00 << 16) | (0x9060 >> 2),
208 0x00000000,
209 (0x9c00 << 16) | (0x9364 >> 2),
210 0x00000000,
211 (0x9c00 << 16) | (0x9100 >> 2),
212 0x00000000,
213 (0x9c00 << 16) | (0x913c >> 2),
214 0x00000000,
215 (0x8000 << 16) | (0x90e0 >> 2),
216 0x00000000,
217 (0x8000 << 16) | (0x90e4 >> 2),
218 0x00000000,
219 (0x8000 << 16) | (0x90e8 >> 2),
220 0x00000000,
221 (0x8040 << 16) | (0x90e0 >> 2),
222 0x00000000,
223 (0x8040 << 16) | (0x90e4 >> 2),
224 0x00000000,
225 (0x8040 << 16) | (0x90e8 >> 2),
226 0x00000000,
227 (0x9c00 << 16) | (0x8bcc >> 2),
228 0x00000000,
229 (0x9c00 << 16) | (0x8b24 >> 2),
230 0x00000000,
231 (0x9c00 << 16) | (0x88c4 >> 2),
232 0x00000000,
233 (0x9c00 << 16) | (0x8e50 >> 2),
234 0x00000000,
235 (0x9c00 << 16) | (0x8c0c >> 2),
236 0x00000000,
237 (0x9c00 << 16) | (0x8e58 >> 2),
238 0x00000000,
239 (0x9c00 << 16) | (0x8e5c >> 2),
240 0x00000000,
241 (0x9c00 << 16) | (0x9508 >> 2),
242 0x00000000,
243 (0x9c00 << 16) | (0x950c >> 2),
244 0x00000000,
245 (0x9c00 << 16) | (0x9494 >> 2),
246 0x00000000,
247 (0x9c00 << 16) | (0xac0c >> 2),
248 0x00000000,
249 (0x9c00 << 16) | (0xac10 >> 2),
250 0x00000000,
251 (0x9c00 << 16) | (0xac14 >> 2),
252 0x00000000,
253 (0x9c00 << 16) | (0xae00 >> 2),
254 0x00000000,
255 (0x9c00 << 16) | (0xac08 >> 2),
256 0x00000000,
257 (0x9c00 << 16) | (0x88d4 >> 2),
258 0x00000000,
259 (0x9c00 << 16) | (0x88c8 >> 2),
260 0x00000000,
261 (0x9c00 << 16) | (0x88cc >> 2),
262 0x00000000,
263 (0x9c00 << 16) | (0x89b0 >> 2),
264 0x00000000,
265 (0x9c00 << 16) | (0x8b10 >> 2),
266 0x00000000,
267 (0x9c00 << 16) | (0x8a14 >> 2),
268 0x00000000,
269 (0x9c00 << 16) | (0x9830 >> 2),
270 0x00000000,
271 (0x9c00 << 16) | (0x9834 >> 2),
272 0x00000000,
273 (0x9c00 << 16) | (0x9838 >> 2),
274 0x00000000,
275 (0x9c00 << 16) | (0x9a10 >> 2),
276 0x00000000,
277 (0x8000 << 16) | (0x9870 >> 2),
278 0x00000000,
279 (0x8000 << 16) | (0x9874 >> 2),
280 0x00000000,
281 (0x8001 << 16) | (0x9870 >> 2),
282 0x00000000,
283 (0x8001 << 16) | (0x9874 >> 2),
284 0x00000000,
285 (0x8040 << 16) | (0x9870 >> 2),
286 0x00000000,
287 (0x8040 << 16) | (0x9874 >> 2),
288 0x00000000,
289 (0x8041 << 16) | (0x9870 >> 2),
290 0x00000000,
291 (0x8041 << 16) | (0x9874 >> 2),
292 0x00000000,
293 0x00000000
294};
295
296static int gfx_v6_0_init_microcode(struct amdgpu_device *adev)
297{
298 const char *chip_name;
299 char fw_name[30];
300 int err;
301 const struct gfx_firmware_header_v1_0 *cp_hdr;
302 const struct rlc_firmware_header_v1_0 *rlc_hdr;
303
304 DRM_DEBUG("\n");
305
306 switch (adev->asic_type) {
307 case CHIP_TAHITI:
308 chip_name = "tahiti";
309 break;
310 case CHIP_PITCAIRN:
311 chip_name = "pitcairn";
312 break;
313 case CHIP_VERDE:
314 chip_name = "verde";
315 break;
316 case CHIP_OLAND:
317 chip_name = "oland";
318 break;
319 case CHIP_HAINAN:
320 chip_name = "hainan";
321 break;
322 default: BUG();
323 }
324
325 snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
326 err = request_firmware(&adev->gfx.pfp_fw, fw_name, adev->dev);
327 if (err)
328 goto out;
329 err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
330 if (err)
331 goto out;
332 cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.pfp_fw->data;
333 adev->gfx.pfp_fw_version = le32_to_cpu(cp_hdr->header.ucode_version);
334 adev->gfx.pfp_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
335
336 snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
337 err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
338 if (err)
339 goto out;
340 err = amdgpu_ucode_validate(adev->gfx.me_fw);
341 if (err)
342 goto out;
343 cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.me_fw->data;
344 adev->gfx.me_fw_version = le32_to_cpu(cp_hdr->header.ucode_version);
345 adev->gfx.me_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
346
347 snprintf(fw_name, sizeof(fw_name), "radeon/%s_ce.bin", chip_name);
348 err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
349 if (err)
350 goto out;
351 err = amdgpu_ucode_validate(adev->gfx.ce_fw);
352 if (err)
353 goto out;
354 cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.ce_fw->data;
355 adev->gfx.ce_fw_version = le32_to_cpu(cp_hdr->header.ucode_version);
356 adev->gfx.ce_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
357
358 snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", chip_name);
359 err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
360 if (err)
361 goto out;
362 err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
363 rlc_hdr = (const struct rlc_firmware_header_v1_0 *)adev->gfx.rlc_fw->data;
364 adev->gfx.rlc_fw_version = le32_to_cpu(rlc_hdr->header.ucode_version);
365 adev->gfx.rlc_feature_version = le32_to_cpu(rlc_hdr->ucode_feature_version);
366
367out:
368 if (err) {
369 printk(KERN_ERR
370 "gfx6: Failed to load firmware \"%s\"\n",
371 fw_name);
372 release_firmware(adev->gfx.pfp_fw);
373 adev->gfx.pfp_fw = NULL;
374 release_firmware(adev->gfx.me_fw);
375 adev->gfx.me_fw = NULL;
376 release_firmware(adev->gfx.ce_fw);
377 adev->gfx.ce_fw = NULL;
378 release_firmware(adev->gfx.rlc_fw);
379 adev->gfx.rlc_fw = NULL;
380 }
381 return err;
382}
383
384static void gfx_v6_0_tiling_mode_table_init(struct amdgpu_device *adev)
385{
386 const u32 num_tile_mode_states = 32;
387 u32 reg_offset, gb_tile_moden, split_equal_to_row_size;
388
389 switch (adev->gfx.config.mem_row_size_in_kb) {
390 case 1:
391 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_1KB;
392 break;
393 case 2:
394 default:
395 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_2KB;
396 break;
397 case 4:
398 split_equal_to_row_size = ADDR_SURF_TILE_SPLIT_4KB;
399 break;
400 }
401
402 if (adev->asic_type == CHIP_VERDE ||
403 adev->asic_type == CHIP_OLAND ||
404 adev->asic_type == CHIP_HAINAN) {
405 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
406 switch (reg_offset) {
407 case 0:
408 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
409 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
410 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
411 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
412 NUM_BANKS(ADDR_SURF_16_BANK) |
413 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
414 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
415 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
416 break;
417 case 1:
418 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
419 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
420 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
421 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
422 NUM_BANKS(ADDR_SURF_16_BANK) |
423 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
424 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
425 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
426 break;
427 case 2:
428 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
429 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
430 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
431 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
432 NUM_BANKS(ADDR_SURF_16_BANK) |
433 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
434 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
435 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
436 break;
437 case 3:
438 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
439 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
440 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
441 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
442 NUM_BANKS(ADDR_SURF_16_BANK) |
443 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
444 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
445 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
446 break;
447 case 4:
448 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
449 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
450 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
451 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
452 NUM_BANKS(ADDR_SURF_16_BANK) |
453 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
454 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
455 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
456 break;
457 case 5:
458 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
459 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
460 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
461 TILE_SPLIT(split_equal_to_row_size) |
462 NUM_BANKS(ADDR_SURF_16_BANK) |
463 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
464 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
465 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
466 break;
467 case 6:
468 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
469 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
470 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
471 TILE_SPLIT(split_equal_to_row_size) |
472 NUM_BANKS(ADDR_SURF_16_BANK) |
473 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
474 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
475 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
476 break;
477 case 7:
478 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
479 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
480 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
481 TILE_SPLIT(split_equal_to_row_size) |
482 NUM_BANKS(ADDR_SURF_16_BANK) |
483 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
484 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
485 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
486 break;
487 case 8:
488 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
489 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
490 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
491 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
492 NUM_BANKS(ADDR_SURF_16_BANK) |
493 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
494 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
495 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
496 break;
497 case 9:
498 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
499 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
500 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
501 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
502 NUM_BANKS(ADDR_SURF_16_BANK) |
503 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
504 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
505 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
506 break;
507 case 10:
508 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
509 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
510 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
511 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
512 NUM_BANKS(ADDR_SURF_16_BANK) |
513 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
514 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
515 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
516 break;
517 case 11:
518 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
519 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
520 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
521 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
522 NUM_BANKS(ADDR_SURF_16_BANK) |
523 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
524 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
525 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
526 break;
527 case 12:
528 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
529 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
530 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
531 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
532 NUM_BANKS(ADDR_SURF_16_BANK) |
533 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
534 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
535 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
536 break;
537 case 13:
538 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
539 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
540 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
541 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
542 NUM_BANKS(ADDR_SURF_16_BANK) |
543 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
544 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
545 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
546 break;
547 case 14:
548 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
549 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
550 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
551 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
552 NUM_BANKS(ADDR_SURF_16_BANK) |
553 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
554 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
555 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
556 break;
557 case 15:
558 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
559 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
560 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
561 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
562 NUM_BANKS(ADDR_SURF_16_BANK) |
563 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
564 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
565 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
566 break;
567 case 16:
568 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
569 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
570 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
571 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
572 NUM_BANKS(ADDR_SURF_16_BANK) |
573 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
574 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
575 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
576 break;
577 case 17:
578 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
579 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
580 PIPE_CONFIG(ADDR_SURF_P4_8x16) |
581 TILE_SPLIT(split_equal_to_row_size) |
582 NUM_BANKS(ADDR_SURF_16_BANK) |
583 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
584 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
585 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
586 break;
587 case 21:
588 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
589 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
590 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
591 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
592 NUM_BANKS(ADDR_SURF_16_BANK) |
593 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
594 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
595 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
596 break;
597 case 22:
598 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
599 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
600 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
601 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
602 NUM_BANKS(ADDR_SURF_16_BANK) |
603 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
604 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
605 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
606 break;
607 case 23:
608 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
609 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
610 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
611 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
612 NUM_BANKS(ADDR_SURF_16_BANK) |
613 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
614 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
615 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
616 break;
617 case 24:
618 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
619 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
620 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
621 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
622 NUM_BANKS(ADDR_SURF_16_BANK) |
623 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
624 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
625 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
626 break;
627 case 25:
628 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
629 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
630 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
631 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB) |
632 NUM_BANKS(ADDR_SURF_8_BANK) |
633 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
634 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
635 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
636 break;
637 default:
638 gb_tile_moden = 0;
639 break;
640 }
641 adev->gfx.config.tile_mode_array[reg_offset] = gb_tile_moden;
642 WREG32(GB_TILE_MODE0 + reg_offset, gb_tile_moden);
643 }
644 } else if ((adev->asic_type == CHIP_TAHITI) || (adev->asic_type == CHIP_PITCAIRN)) {
645 for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++) {
646 switch (reg_offset) {
647 case 0: /* non-AA compressed depth or any compressed stencil */
648 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
649 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
650 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
651 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
652 NUM_BANKS(ADDR_SURF_16_BANK) |
653 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
654 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
655 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
656 break;
657 case 1: /* 2xAA/4xAA compressed depth only */
658 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
659 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
660 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
661 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
662 NUM_BANKS(ADDR_SURF_16_BANK) |
663 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
664 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
665 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
666 break;
667 case 2: /* 8xAA compressed depth only */
668 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
669 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
670 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
671 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
672 NUM_BANKS(ADDR_SURF_16_BANK) |
673 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
674 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
675 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
676 break;
677 case 3: /* 2xAA/4xAA compressed depth with stencil (for depth buffer) */
678 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
679 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
680 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
681 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
682 NUM_BANKS(ADDR_SURF_16_BANK) |
683 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
684 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
685 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
686 break;
687 case 4: /* Maps w/ a dimension less than the 2D macro-tile dimensions (for mipmapped depth textures) */
688 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
689 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
690 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
691 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
692 NUM_BANKS(ADDR_SURF_16_BANK) |
693 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
694 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
695 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
696 break;
697 case 5: /* Uncompressed 16bpp depth - and stencil buffer allocated with it */
698 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
699 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
700 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
701 TILE_SPLIT(split_equal_to_row_size) |
702 NUM_BANKS(ADDR_SURF_16_BANK) |
703 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
704 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
705 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
706 break;
707 case 6: /* Uncompressed 32bpp depth - and stencil buffer allocated with it */
708 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
709 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
710 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
711 TILE_SPLIT(split_equal_to_row_size) |
712 NUM_BANKS(ADDR_SURF_16_BANK) |
713 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
714 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
715 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
716 break;
717 case 7: /* Uncompressed 8bpp stencil without depth (drivers typically do not use) */
718 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
719 MICRO_TILE_MODE(ADDR_SURF_DEPTH_MICRO_TILING) |
720 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
721 TILE_SPLIT(split_equal_to_row_size) |
722 NUM_BANKS(ADDR_SURF_16_BANK) |
723 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
724 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
725 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
726 break;
727 case 8: /* 1D and 1D Array Surfaces */
728 gb_tile_moden = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
729 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
730 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
731 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
732 NUM_BANKS(ADDR_SURF_16_BANK) |
733 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
734 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
735 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
736 break;
737 case 9: /* Displayable maps. */
738 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
739 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
740 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
741 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
742 NUM_BANKS(ADDR_SURF_16_BANK) |
743 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
744 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
745 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
746 break;
747 case 10: /* Display 8bpp. */
748 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
749 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
750 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
751 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
752 NUM_BANKS(ADDR_SURF_16_BANK) |
753 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
754 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
755 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
756 break;
757 case 11: /* Display 16bpp. */
758 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
759 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
760 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
761 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
762 NUM_BANKS(ADDR_SURF_16_BANK) |
763 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
764 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
765 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
766 break;
767 case 12: /* Display 32bpp. */
768 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
769 MICRO_TILE_MODE(ADDR_SURF_DISPLAY_MICRO_TILING) |
770 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
771 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
772 NUM_BANKS(ADDR_SURF_16_BANK) |
773 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
774 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
775 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
776 break;
777 case 13: /* Thin. */
778 gb_tile_moden = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
779 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
780 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
781 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
782 NUM_BANKS(ADDR_SURF_16_BANK) |
783 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
784 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
785 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
786 break;
787 case 14: /* Thin 8 bpp. */
788 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
789 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
790 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
791 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
792 NUM_BANKS(ADDR_SURF_16_BANK) |
793 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
794 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
795 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
796 break;
797 case 15: /* Thin 16 bpp. */
798 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
799 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
800 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
801 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
802 NUM_BANKS(ADDR_SURF_16_BANK) |
803 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
804 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
805 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
806 break;
807 case 16: /* Thin 32 bpp. */
808 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
809 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
810 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
811 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
812 NUM_BANKS(ADDR_SURF_16_BANK) |
813 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
814 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
815 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
816 break;
817 case 17: /* Thin 64 bpp. */
818 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
819 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
820 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
821 TILE_SPLIT(split_equal_to_row_size) |
822 NUM_BANKS(ADDR_SURF_16_BANK) |
823 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
824 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
825 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
826 break;
827 case 21: /* 8 bpp PRT. */
828 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
829 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
830 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
831 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
832 NUM_BANKS(ADDR_SURF_16_BANK) |
833 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
834 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
835 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
836 break;
837 case 22: /* 16 bpp PRT */
838 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
839 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
840 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
841 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
842 NUM_BANKS(ADDR_SURF_16_BANK) |
843 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
844 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
845 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4));
846 break;
847 case 23: /* 32 bpp PRT */
848 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
849 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
850 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
851 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
852 NUM_BANKS(ADDR_SURF_16_BANK) |
853 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
854 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
855 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
856 break;
857 case 24: /* 64 bpp PRT */
858 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
859 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
860 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
861 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
862 NUM_BANKS(ADDR_SURF_16_BANK) |
863 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
864 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
865 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2));
866 break;
867 case 25: /* 128 bpp PRT */
868 gb_tile_moden = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
869 MICRO_TILE_MODE(ADDR_SURF_THIN_MICRO_TILING) |
870 PIPE_CONFIG(ADDR_SURF_P8_32x32_8x16) |
871 TILE_SPLIT(ADDR_SURF_TILE_SPLIT_1KB) |
872 NUM_BANKS(ADDR_SURF_8_BANK) |
873 BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
874 BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
875 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1));
876 break;
877 default:
878 gb_tile_moden = 0;
879 break;
880 }
881 adev->gfx.config.tile_mode_array[reg_offset] = gb_tile_moden;
882 WREG32(GB_TILE_MODE0 + reg_offset, gb_tile_moden);
883 }
884 } else{
885
886 DRM_ERROR("unknown asic: 0x%x\n", adev->asic_type);
887 }
888
889}
890
891static void gfx_v6_0_select_se_sh(struct amdgpu_device *adev, u32 se_num,
892 u32 sh_num, u32 instance)
893{
894 u32 data;
895
896 if (instance == 0xffffffff)
897 data = INSTANCE_BROADCAST_WRITES;
898 else
899 data = INSTANCE_INDEX(instance);
900
901 if ((se_num == 0xffffffff) && (sh_num == 0xffffffff))
902 data |= SH_BROADCAST_WRITES | SE_BROADCAST_WRITES;
903 else if (se_num == 0xffffffff)
904 data |= SE_BROADCAST_WRITES | SH_INDEX(sh_num);
905 else if (sh_num == 0xffffffff)
906 data |= SH_BROADCAST_WRITES | SE_INDEX(se_num);
907 else
908 data |= SH_INDEX(sh_num) | SE_INDEX(se_num);
909 WREG32(GRBM_GFX_INDEX, data);
910}
911
912static u32 gfx_v6_0_create_bitmask(u32 bit_width)
913{
914 return (u32)(((u64)1 << bit_width) - 1);
915}
916
917static u32 gfx_v6_0_get_rb_disabled(struct amdgpu_device *adev,
918 u32 max_rb_num_per_se,
919 u32 sh_per_se)
920{
921 u32 data, mask;
922
923 data = RREG32(CC_RB_BACKEND_DISABLE);
924 data &= BACKEND_DISABLE_MASK;
925 data |= RREG32(GC_USER_RB_BACKEND_DISABLE);
926
927 data >>= BACKEND_DISABLE_SHIFT;
928
929 mask = gfx_v6_0_create_bitmask(max_rb_num_per_se / sh_per_se);
930
931 return data & mask;
932}
933
934static void gfx_v6_0_raster_config(struct amdgpu_device *adev, u32 *rconf)
935{
936 switch (adev->asic_type) {
937 case CHIP_TAHITI:
938 case CHIP_PITCAIRN:
939 *rconf |= RB_XSEL2(2) | RB_XSEL | PKR_MAP(2) | PKR_YSEL(1) |
940 SE_MAP(2) | SE_XSEL(2) | SE_YSEL(2);
941 break;
942 case CHIP_VERDE:
943 *rconf |= RB_XSEL | PKR_MAP(2) | PKR_YSEL(1);
944 break;
945 case CHIP_OLAND:
946 *rconf |= RB_YSEL;
947 break;
948 case CHIP_HAINAN:
949 *rconf |= 0x0;
950 break;
951 default:
952 DRM_ERROR("unknown asic: 0x%x\n", adev->asic_type);
953 break;
954 }
955}
956
957static void gfx_v6_0_write_harvested_raster_configs(struct amdgpu_device *adev,
958 u32 raster_config, unsigned rb_mask,
959 unsigned num_rb)
960{
961 unsigned sh_per_se = max_t(unsigned, adev->gfx.config.max_sh_per_se, 1);
962 unsigned num_se = max_t(unsigned, adev->gfx.config.max_shader_engines, 1);
963 unsigned rb_per_pkr = min_t(unsigned, num_rb / num_se / sh_per_se, 2);
964 unsigned rb_per_se = num_rb / num_se;
965 unsigned se_mask[4];
966 unsigned se;
967
968 se_mask[0] = ((1 << rb_per_se) - 1) & rb_mask;
969 se_mask[1] = (se_mask[0] << rb_per_se) & rb_mask;
970 se_mask[2] = (se_mask[1] << rb_per_se) & rb_mask;
971 se_mask[3] = (se_mask[2] << rb_per_se) & rb_mask;
972
973 WARN_ON(!(num_se == 1 || num_se == 2 || num_se == 4));
974 WARN_ON(!(sh_per_se == 1 || sh_per_se == 2));
975 WARN_ON(!(rb_per_pkr == 1 || rb_per_pkr == 2));
976
977 for (se = 0; se < num_se; se++) {
978 unsigned raster_config_se = raster_config;
979 unsigned pkr0_mask = ((1 << rb_per_pkr) - 1) << (se * rb_per_se);
980 unsigned pkr1_mask = pkr0_mask << rb_per_pkr;
981 int idx = (se / 2) * 2;
982
983 if ((num_se > 1) && (!se_mask[idx] || !se_mask[idx + 1])) {
984 raster_config_se &= ~SE_MAP_MASK;
985
986 if (!se_mask[idx]) {
987 raster_config_se |= SE_MAP(RASTER_CONFIG_SE_MAP_3);
988 } else {
989 raster_config_se |= SE_MAP(RASTER_CONFIG_SE_MAP_0);
990 }
991 }
992
993 pkr0_mask &= rb_mask;
994 pkr1_mask &= rb_mask;
995 if (rb_per_se > 2 && (!pkr0_mask || !pkr1_mask)) {
996 raster_config_se &= ~PKR_MAP_MASK;
997
998 if (!pkr0_mask) {
999 raster_config_se |= PKR_MAP(RASTER_CONFIG_PKR_MAP_3);
1000 } else {
1001 raster_config_se |= PKR_MAP(RASTER_CONFIG_PKR_MAP_0);
1002 }
1003 }
1004
1005 if (rb_per_se >= 2) {
1006 unsigned rb0_mask = 1 << (se * rb_per_se);
1007 unsigned rb1_mask = rb0_mask << 1;
1008
1009 rb0_mask &= rb_mask;
1010 rb1_mask &= rb_mask;
1011 if (!rb0_mask || !rb1_mask) {
1012 raster_config_se &= ~RB_MAP_PKR0_MASK;
1013
1014 if (!rb0_mask) {
1015 raster_config_se |=
1016 RB_MAP_PKR0(RASTER_CONFIG_RB_MAP_3);
1017 } else {
1018 raster_config_se |=
1019 RB_MAP_PKR0(RASTER_CONFIG_RB_MAP_0);
1020 }
1021 }
1022
1023 if (rb_per_se > 2) {
1024 rb0_mask = 1 << (se * rb_per_se + rb_per_pkr);
1025 rb1_mask = rb0_mask << 1;
1026 rb0_mask &= rb_mask;
1027 rb1_mask &= rb_mask;
1028 if (!rb0_mask || !rb1_mask) {
1029 raster_config_se &= ~RB_MAP_PKR1_MASK;
1030
1031 if (!rb0_mask) {
1032 raster_config_se |=
1033 RB_MAP_PKR1(RASTER_CONFIG_RB_MAP_3);
1034 } else {
1035 raster_config_se |=
1036 RB_MAP_PKR1(RASTER_CONFIG_RB_MAP_0);
1037 }
1038 }
1039 }
1040 }
1041
1042 /* GRBM_GFX_INDEX has a different offset on SI */
1043 gfx_v6_0_select_se_sh(adev, se, 0xffffffff, 0xffffffff);
1044 WREG32(PA_SC_RASTER_CONFIG, raster_config_se);
1045 }
1046
1047 /* GRBM_GFX_INDEX has a different offset on SI */
1048 gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1049}
1050
1051static void gfx_v6_0_setup_rb(struct amdgpu_device *adev,
1052 u32 se_num, u32 sh_per_se,
1053 u32 max_rb_num_per_se)
1054{
1055 int i, j;
1056 u32 data, mask;
1057 u32 disabled_rbs = 0;
1058 u32 enabled_rbs = 0;
1059 unsigned num_rb_pipes;
1060
1061 mutex_lock(&adev->grbm_idx_mutex);
1062 for (i = 0; i < se_num; i++) {
1063 for (j = 0; j < sh_per_se; j++) {
1064 gfx_v6_0_select_se_sh(adev, i, j, 0xffffffff);
1065 data = gfx_v6_0_get_rb_disabled(adev, max_rb_num_per_se, sh_per_se);
1066 disabled_rbs |= data << ((i * sh_per_se + j) * TAHITI_RB_BITMAP_WIDTH_PER_SH);
1067 }
1068 }
1069 gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1070 mutex_unlock(&adev->grbm_idx_mutex);
1071
1072 mask = 1;
1073 for (i = 0; i < max_rb_num_per_se * se_num; i++) {
1074 if (!(disabled_rbs & mask))
1075 enabled_rbs |= mask;
1076 mask <<= 1;
1077 }
1078
1079 adev->gfx.config.backend_enable_mask = enabled_rbs;
1080 adev->gfx.config.num_rbs = hweight32(enabled_rbs);
1081
1082 num_rb_pipes = min_t(unsigned, adev->gfx.config.max_backends_per_se *
1083 adev->gfx.config.max_shader_engines, 16);
1084
1085 mutex_lock(&adev->grbm_idx_mutex);
1086 for (i = 0; i < se_num; i++) {
1087 gfx_v6_0_select_se_sh(adev, i, 0xffffffff, 0xffffffff);
1088 data = 0;
1089 for (j = 0; j < sh_per_se; j++) {
1090 switch (enabled_rbs & 3) {
1091 case 1:
1092 data |= (RASTER_CONFIG_RB_MAP_0 << (i * sh_per_se + j) * 2);
1093 break;
1094 case 2:
1095 data |= (RASTER_CONFIG_RB_MAP_3 << (i * sh_per_se + j) * 2);
1096 break;
1097 case 3:
1098 default:
1099 data |= (RASTER_CONFIG_RB_MAP_2 << (i * sh_per_se + j) * 2);
1100 break;
1101 }
1102 enabled_rbs >>= 2;
1103 }
1104 gfx_v6_0_raster_config(adev, &data);
1105
1106 if (!adev->gfx.config.backend_enable_mask ||
1107 adev->gfx.config.num_rbs >= num_rb_pipes)
1108 WREG32(PA_SC_RASTER_CONFIG, data);
1109 else
1110 gfx_v6_0_write_harvested_raster_configs(adev, data,
1111 adev->gfx.config.backend_enable_mask,
1112 num_rb_pipes);
1113 }
1114 gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1115 mutex_unlock(&adev->grbm_idx_mutex);
1116}
1117/*
1118static void gmc_v6_0_init_compute_vmid(struct amdgpu_device *adev)
1119{
1120}
1121*/
1122
1123static u32 gfx_v6_0_get_cu_enabled(struct amdgpu_device *adev, u32 cu_per_sh)
1124{
1125 u32 data, mask;
1126
1127 data = RREG32(CC_GC_SHADER_ARRAY_CONFIG);
1128 data &= INACTIVE_CUS_MASK;
1129 data |= RREG32(GC_USER_SHADER_ARRAY_CONFIG);
1130
1131 data >>= INACTIVE_CUS_SHIFT;
1132
1133 mask = gfx_v6_0_create_bitmask(cu_per_sh);
1134
1135 return ~data & mask;
1136}
1137
1138
1139static void gfx_v6_0_setup_spi(struct amdgpu_device *adev,
1140 u32 se_num, u32 sh_per_se,
1141 u32 cu_per_sh)
1142{
1143 int i, j, k;
1144 u32 data, mask;
1145 u32 active_cu = 0;
1146
1147 mutex_lock(&adev->grbm_idx_mutex);
1148 for (i = 0; i < se_num; i++) {
1149 for (j = 0; j < sh_per_se; j++) {
1150 gfx_v6_0_select_se_sh(adev, i, j, 0xffffffff);
1151 data = RREG32(SPI_STATIC_THREAD_MGMT_3);
1152 active_cu = gfx_v6_0_get_cu_enabled(adev, cu_per_sh);
1153
1154 mask = 1;
1155 for (k = 0; k < 16; k++) {
1156 mask <<= k;
1157 if (active_cu & mask) {
1158 data &= ~mask;
1159 WREG32(SPI_STATIC_THREAD_MGMT_3, data);
1160 break;
1161 }
1162 }
1163 }
1164 }
1165 gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1166 mutex_unlock(&adev->grbm_idx_mutex);
1167}
1168
1169static void gfx_v6_0_gpu_init(struct amdgpu_device *adev)
1170{
1171 u32 gb_addr_config = 0;
1172 u32 mc_shared_chmap, mc_arb_ramcfg;
1173 u32 sx_debug_1;
1174 u32 hdp_host_path_cntl;
1175 u32 tmp;
1176
1177 switch (adev->asic_type) {
1178 case CHIP_TAHITI:
1179 adev->gfx.config.max_shader_engines = 2;
1180 adev->gfx.config.max_tile_pipes = 12;
1181 adev->gfx.config.max_cu_per_sh = 8;
1182 adev->gfx.config.max_sh_per_se = 2;
1183 adev->gfx.config.max_backends_per_se = 4;
1184 adev->gfx.config.max_texture_channel_caches = 12;
1185 adev->gfx.config.max_gprs = 256;
1186 adev->gfx.config.max_gs_threads = 32;
1187 adev->gfx.config.max_hw_contexts = 8;
1188
1189 adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1190 adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1191 adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1192 adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
1193 gb_addr_config = TAHITI_GB_ADDR_CONFIG_GOLDEN;
1194 break;
1195 case CHIP_PITCAIRN:
1196 adev->gfx.config.max_shader_engines = 2;
1197 adev->gfx.config.max_tile_pipes = 8;
1198 adev->gfx.config.max_cu_per_sh = 5;
1199 adev->gfx.config.max_sh_per_se = 2;
1200 adev->gfx.config.max_backends_per_se = 4;
1201 adev->gfx.config.max_texture_channel_caches = 8;
1202 adev->gfx.config.max_gprs = 256;
1203 adev->gfx.config.max_gs_threads = 32;
1204 adev->gfx.config.max_hw_contexts = 8;
1205
1206 adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1207 adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
1208 adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1209 adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
1210 gb_addr_config = TAHITI_GB_ADDR_CONFIG_GOLDEN;
1211 break;
1212
1213 case CHIP_VERDE:
1214 adev->gfx.config.max_shader_engines = 1;
1215 adev->gfx.config.max_tile_pipes = 4;
1216 adev->gfx.config.max_cu_per_sh = 5;
1217 adev->gfx.config.max_sh_per_se = 2;
1218 adev->gfx.config.max_backends_per_se = 4;
1219 adev->gfx.config.max_texture_channel_caches = 4;
1220 adev->gfx.config.max_gprs = 256;
1221 adev->gfx.config.max_gs_threads = 32;
1222 adev->gfx.config.max_hw_contexts = 8;
1223
1224 adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1225 adev->gfx.config.sc_prim_fifo_size_backend = 0x40;
1226 adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1227 adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
1228 gb_addr_config = VERDE_GB_ADDR_CONFIG_GOLDEN;
1229 break;
1230 case CHIP_OLAND:
1231 adev->gfx.config.max_shader_engines = 1;
1232 adev->gfx.config.max_tile_pipes = 4;
1233 adev->gfx.config.max_cu_per_sh = 6;
1234 adev->gfx.config.max_sh_per_se = 1;
1235 adev->gfx.config.max_backends_per_se = 2;
1236 adev->gfx.config.max_texture_channel_caches = 4;
1237 adev->gfx.config.max_gprs = 256;
1238 adev->gfx.config.max_gs_threads = 16;
1239 adev->gfx.config.max_hw_contexts = 8;
1240
1241 adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1242 adev->gfx.config.sc_prim_fifo_size_backend = 0x40;
1243 adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1244 adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
1245 gb_addr_config = VERDE_GB_ADDR_CONFIG_GOLDEN;
1246 break;
1247 case CHIP_HAINAN:
1248 adev->gfx.config.max_shader_engines = 1;
1249 adev->gfx.config.max_tile_pipes = 4;
1250 adev->gfx.config.max_cu_per_sh = 5;
1251 adev->gfx.config.max_sh_per_se = 1;
1252 adev->gfx.config.max_backends_per_se = 1;
1253 adev->gfx.config.max_texture_channel_caches = 2;
1254 adev->gfx.config.max_gprs = 256;
1255 adev->gfx.config.max_gs_threads = 16;
1256 adev->gfx.config.max_hw_contexts = 8;
1257
1258 adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
1259 adev->gfx.config.sc_prim_fifo_size_backend = 0x40;
1260 adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
1261 adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
1262 gb_addr_config = HAINAN_GB_ADDR_CONFIG_GOLDEN;
1263 break;
1264 default:
1265 BUG();
1266 break;
1267 }
1268
1269 WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
1270 WREG32(SRBM_INT_CNTL, 1);
1271 WREG32(SRBM_INT_ACK, 1);
1272
1273 WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);
1274
1275 mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
1276 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
1277
1278 adev->gfx.config.num_tile_pipes = adev->gfx.config.max_tile_pipes;
1279 adev->gfx.config.mem_max_burst_length_bytes = 256;
1280 tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
1281 adev->gfx.config.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
1282 if (adev->gfx.config.mem_row_size_in_kb > 4)
1283 adev->gfx.config.mem_row_size_in_kb = 4;
1284 adev->gfx.config.shader_engine_tile_size = 32;
1285 adev->gfx.config.num_gpus = 1;
1286 adev->gfx.config.multi_gpu_tile_size = 64;
1287
1288 gb_addr_config &= ~ROW_SIZE_MASK;
1289 switch (adev->gfx.config.mem_row_size_in_kb) {
1290 case 1:
1291 default:
1292 gb_addr_config |= ROW_SIZE(0);
1293 break;
1294 case 2:
1295 gb_addr_config |= ROW_SIZE(1);
1296 break;
1297 case 4:
1298 gb_addr_config |= ROW_SIZE(2);
1299 break;
1300 }
1301 adev->gfx.config.gb_addr_config = gb_addr_config;
1302
1303 WREG32(GB_ADDR_CONFIG, gb_addr_config);
1304 WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
1305 WREG32(DMIF_ADDR_CALC, gb_addr_config);
1306 WREG32(HDP_ADDR_CONFIG, gb_addr_config);
1307 WREG32(DMA_TILING_CONFIG + DMA0_REGISTER_OFFSET, gb_addr_config);
1308 WREG32(DMA_TILING_CONFIG + DMA1_REGISTER_OFFSET, gb_addr_config);
1309#if 0
1310 if (adev->has_uvd) {
1311 WREG32(UVD_UDEC_ADDR_CONFIG, gb_addr_config);
1312 WREG32(UVD_UDEC_DB_ADDR_CONFIG, gb_addr_config);
1313 WREG32(UVD_UDEC_DBW_ADDR_CONFIG, gb_addr_config);
1314 }
1315#endif
1316 gfx_v6_0_tiling_mode_table_init(adev);
1317
1318 gfx_v6_0_setup_rb(adev, adev->gfx.config.max_shader_engines,
1319 adev->gfx.config.max_sh_per_se,
1320 adev->gfx.config.max_backends_per_se);
1321
1322 gfx_v6_0_setup_spi(adev, adev->gfx.config.max_shader_engines,
1323 adev->gfx.config.max_sh_per_se,
1324 adev->gfx.config.max_cu_per_sh);
1325
1326 gfx_v6_0_get_cu_info(adev);
1327
1328 WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) |
1329 ROQ_IB2_START(0x2b)));
1330 WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
1331
1332 sx_debug_1 = RREG32(SX_DEBUG_1);
1333 WREG32(SX_DEBUG_1, sx_debug_1);
1334
1335 WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4));
1336
1337 WREG32(PA_SC_FIFO_SIZE, (SC_FRONTEND_PRIM_FIFO_SIZE(adev->gfx.config.sc_prim_fifo_size_frontend) |
1338 SC_BACKEND_PRIM_FIFO_SIZE(adev->gfx.config.sc_prim_fifo_size_backend) |
1339 SC_HIZ_TILE_FIFO_SIZE(adev->gfx.config.sc_hiz_tile_fifo_size) |
1340 SC_EARLYZ_TILE_FIFO_SIZE(adev->gfx.config.sc_earlyz_tile_fifo_size)));
1341
1342 WREG32(VGT_NUM_INSTANCES, 1);
1343 WREG32(CP_PERFMON_CNTL, 0);
1344 WREG32(SQ_CONFIG, 0);
1345 WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1346 FORCE_EOV_MAX_REZ_CNT(255)));
1347
1348 WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
1349 AUTO_INVLD_EN(ES_AND_GS_AUTO));
1350
1351 WREG32(VGT_GS_VERTEX_REUSE, 16);
1352 WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
1353
1354 WREG32(CB_PERFCOUNTER0_SELECT0, 0);
1355 WREG32(CB_PERFCOUNTER0_SELECT1, 0);
1356 WREG32(CB_PERFCOUNTER1_SELECT0, 0);
1357 WREG32(CB_PERFCOUNTER1_SELECT1, 0);
1358 WREG32(CB_PERFCOUNTER2_SELECT0, 0);
1359 WREG32(CB_PERFCOUNTER2_SELECT1, 0);
1360 WREG32(CB_PERFCOUNTER3_SELECT0, 0);
1361 WREG32(CB_PERFCOUNTER3_SELECT1, 0);
1362
1363 hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1364 WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1365
1366 WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
1367
1368 udelay(50);
1369}
1370
1371
1372static void gfx_v6_0_scratch_init(struct amdgpu_device *adev)
1373{
1374 int i;
1375
1376 adev->gfx.scratch.num_reg = 7;
1377 adev->gfx.scratch.reg_base = SCRATCH_REG0;
1378 for (i = 0; i < adev->gfx.scratch.num_reg; i++) {
1379 adev->gfx.scratch.free[i] = true;
1380 adev->gfx.scratch.reg[i] = adev->gfx.scratch.reg_base + i;
1381 }
1382}
1383
1384static int gfx_v6_0_ring_test_ring(struct amdgpu_ring *ring)
1385{
1386 struct amdgpu_device *adev = ring->adev;
1387 uint32_t scratch;
1388 uint32_t tmp = 0;
1389 unsigned i;
1390 int r;
1391
1392 r = amdgpu_gfx_scratch_get(adev, &scratch);
1393 if (r) {
1394 DRM_ERROR("amdgpu: cp failed to get scratch reg (%d).\n", r);
1395 return r;
1396 }
1397 WREG32(scratch, 0xCAFEDEAD);
1398
1399 r = amdgpu_ring_alloc(ring, 3);
1400 if (r) {
1401 DRM_ERROR("amdgpu: cp failed to lock ring %d (%d).\n", ring->idx, r);
1402 amdgpu_gfx_scratch_free(adev, scratch);
1403 return r;
1404 }
1405 amdgpu_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
1406 amdgpu_ring_write(ring, (scratch - PACKET3_SET_CONFIG_REG_START));
1407 amdgpu_ring_write(ring, 0xDEADBEEF);
1408 amdgpu_ring_commit(ring);
1409
1410 for (i = 0; i < adev->usec_timeout; i++) {
1411 tmp = RREG32(scratch);
1412 if (tmp == 0xDEADBEEF)
1413 break;
1414 DRM_UDELAY(1);
1415 }
1416 if (i < adev->usec_timeout) {
1417 DRM_INFO("ring test on %d succeeded in %d usecs\n", ring->idx, i);
1418 } else {
1419 DRM_ERROR("amdgpu: ring %d test failed (scratch(0x%04X)=0x%08X)\n",
1420 ring->idx, scratch, tmp);
1421 r = -EINVAL;
1422 }
1423 amdgpu_gfx_scratch_free(adev, scratch);
1424 return r;
1425}
1426
1427static void gfx_v6_0_ring_emit_hdp_flush(struct amdgpu_ring *ring)
1428{
1429 /* flush hdp cache */
1430 amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
1431 amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(1) |
1432 WRITE_DATA_DST_SEL(0)));
1433 amdgpu_ring_write(ring, HDP_MEM_COHERENCY_FLUSH_CNTL);
1434 amdgpu_ring_write(ring, 0);
1435 amdgpu_ring_write(ring, 0x1);
1436}
1437
1438/**
1439 * gfx_v6_0_ring_emit_hdp_invalidate - emit an hdp invalidate on the cp
1440 *
1441 * @adev: amdgpu_device pointer
1442 * @ridx: amdgpu ring index
1443 *
1444 * Emits an hdp invalidate on the cp.
1445 */
1446static void gfx_v6_0_ring_emit_hdp_invalidate(struct amdgpu_ring *ring)
1447{
1448 amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
1449 amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(1) |
1450 WRITE_DATA_DST_SEL(0)));
1451 amdgpu_ring_write(ring, HDP_DEBUG0);
1452 amdgpu_ring_write(ring, 0);
1453 amdgpu_ring_write(ring, 0x1);
1454}
1455
1456static void gfx_v6_0_ring_emit_fence(struct amdgpu_ring *ring, u64 addr,
1457 u64 seq, unsigned flags)
1458{
1459 bool write64bit = flags & AMDGPU_FENCE_FLAG_64BIT;
1460 bool int_sel = flags & AMDGPU_FENCE_FLAG_INT;
1461 /* flush read cache over gart */
1462 amdgpu_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
1463 amdgpu_ring_write(ring, (CP_COHER_CNTL2 - PACKET3_SET_CONFIG_REG_START));
1464 amdgpu_ring_write(ring, 0);
1465 amdgpu_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
1466 amdgpu_ring_write(ring, PACKET3_TCL1_ACTION_ENA |
1467 PACKET3_TC_ACTION_ENA |
1468 PACKET3_SH_KCACHE_ACTION_ENA |
1469 PACKET3_SH_ICACHE_ACTION_ENA);
1470 amdgpu_ring_write(ring, 0xFFFFFFFF);
1471 amdgpu_ring_write(ring, 0);
1472 amdgpu_ring_write(ring, 10); /* poll interval */
1473 /* EVENT_WRITE_EOP - flush caches, send int */
1474 amdgpu_ring_write(ring, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
1475 amdgpu_ring_write(ring, EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) | EVENT_INDEX(5));
1476 amdgpu_ring_write(ring, addr & 0xfffffffc);
1477 amdgpu_ring_write(ring, (upper_32_bits(addr) & 0xffff) |
1478 DATA_SEL(write64bit ? 2 : 1) | INT_SEL(int_sel ? 2 : 0));
1479 amdgpu_ring_write(ring, lower_32_bits(seq));
1480 amdgpu_ring_write(ring, upper_32_bits(seq));
1481}
1482
1483static void gfx_v6_0_ring_emit_ib(struct amdgpu_ring *ring,
1484 struct amdgpu_ib *ib,
1485 unsigned vm_id, bool ctx_switch)
1486{
1487 u32 header, control = 0;
1488
1489 /* insert SWITCH_BUFFER packet before first IB in the ring frame */
1490 if (ctx_switch) {
1491 amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
1492 amdgpu_ring_write(ring, 0);
1493 }
1494
1495 if (ib->flags & AMDGPU_IB_FLAG_CE)
1496 header = PACKET3(PACKET3_INDIRECT_BUFFER_CONST, 2);
1497 else
1498 header = PACKET3(PACKET3_INDIRECT_BUFFER, 2);
1499
1500 control |= ib->length_dw | (vm_id << 24);
1501
1502 amdgpu_ring_write(ring, header);
1503 amdgpu_ring_write(ring,
1504#ifdef __BIG_ENDIAN
1505 (2 << 0) |
1506#endif
1507 (ib->gpu_addr & 0xFFFFFFFC));
1508 amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF);
1509 amdgpu_ring_write(ring, control);
1510}
1511
1512/**
1513 * gfx_v6_0_ring_test_ib - basic ring IB test
1514 *
1515 * @ring: amdgpu_ring structure holding ring information
1516 *
1517 * Allocate an IB and execute it on the gfx ring (SI).
1518 * Provides a basic gfx ring test to verify that IBs are working.
1519 * Returns 0 on success, error on failure.
1520 */
1521static int gfx_v6_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
1522{
1523 struct amdgpu_device *adev = ring->adev;
1524 struct amdgpu_ib ib;
1525 struct fence *f = NULL;
1526 uint32_t scratch;
1527 uint32_t tmp = 0;
1528 long r;
1529
1530 r = amdgpu_gfx_scratch_get(adev, &scratch);
1531 if (r) {
1532 DRM_ERROR("amdgpu: failed to get scratch reg (%ld).\n", r);
1533 return r;
1534 }
1535 WREG32(scratch, 0xCAFEDEAD);
1536 memset(&ib, 0, sizeof(ib));
1537 r = amdgpu_ib_get(adev, NULL, 256, &ib);
1538 if (r) {
1539 DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
1540 goto err1;
1541 }
1542 ib.ptr[0] = PACKET3(PACKET3_SET_CONFIG_REG, 1);
1543 ib.ptr[1] = ((scratch - PACKET3_SET_CONFIG_REG_START));
1544 ib.ptr[2] = 0xDEADBEEF;
1545 ib.length_dw = 3;
1546
1547 r = amdgpu_ib_schedule(ring, 1, &ib, NULL, NULL, &f);
1548 if (r)
1549 goto err2;
1550
1551 r = fence_wait_timeout(f, false, timeout);
1552 if (r == 0) {
1553 DRM_ERROR("amdgpu: IB test timed out\n");
1554 r = -ETIMEDOUT;
1555 goto err2;
1556 } else if (r < 0) {
1557 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
1558 goto err2;
1559 }
1560 tmp = RREG32(scratch);
1561 if (tmp == 0xDEADBEEF) {
1562 DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
1563 r = 0;
1564 } else {
1565 DRM_ERROR("amdgpu: ib test failed (scratch(0x%04X)=0x%08X)\n",
1566 scratch, tmp);
1567 r = -EINVAL;
1568 }
1569
1570err2:
1571 amdgpu_ib_free(adev, &ib, NULL);
1572 fence_put(f);
1573err1:
1574 amdgpu_gfx_scratch_free(adev, scratch);
1575 return r;
1576}
1577
1578static void gfx_v6_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable)
1579{
1580 int i;
1581 if (enable)
1582 WREG32(CP_ME_CNTL, 0);
1583 else {
1584 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT | CP_CE_HALT));
1585 WREG32(SCRATCH_UMSK, 0);
1586 for (i = 0; i < adev->gfx.num_gfx_rings; i++)
1587 adev->gfx.gfx_ring[i].ready = false;
1588 for (i = 0; i < adev->gfx.num_compute_rings; i++)
1589 adev->gfx.compute_ring[i].ready = false;
1590 }
1591 udelay(50);
1592}
1593
1594static int gfx_v6_0_cp_gfx_load_microcode(struct amdgpu_device *adev)
1595{
1596 unsigned i;
1597 const struct gfx_firmware_header_v1_0 *pfp_hdr;
1598 const struct gfx_firmware_header_v1_0 *ce_hdr;
1599 const struct gfx_firmware_header_v1_0 *me_hdr;
1600 const __le32 *fw_data;
1601 u32 fw_size;
1602
1603 if (!adev->gfx.me_fw || !adev->gfx.pfp_fw || !adev->gfx.ce_fw)
1604 return -EINVAL;
1605
1606 gfx_v6_0_cp_gfx_enable(adev, false);
1607 pfp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.pfp_fw->data;
1608 ce_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.ce_fw->data;
1609 me_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.me_fw->data;
1610
1611 amdgpu_ucode_print_gfx_hdr(&pfp_hdr->header);
1612 amdgpu_ucode_print_gfx_hdr(&ce_hdr->header);
1613 amdgpu_ucode_print_gfx_hdr(&me_hdr->header);
1614
1615 /* PFP */
1616 fw_data = (const __le32 *)
1617 (adev->gfx.pfp_fw->data + le32_to_cpu(pfp_hdr->header.ucode_array_offset_bytes));
1618 fw_size = le32_to_cpu(pfp_hdr->header.ucode_size_bytes) / 4;
1619 WREG32(CP_PFP_UCODE_ADDR, 0);
1620 for (i = 0; i < fw_size; i++)
1621 WREG32(CP_PFP_UCODE_DATA, le32_to_cpup(fw_data++));
1622 WREG32(CP_PFP_UCODE_ADDR, 0);
1623
1624 /* CE */
1625 fw_data = (const __le32 *)
1626 (adev->gfx.ce_fw->data + le32_to_cpu(ce_hdr->header.ucode_array_offset_bytes));
1627 fw_size = le32_to_cpu(ce_hdr->header.ucode_size_bytes) / 4;
1628 WREG32(CP_CE_UCODE_ADDR, 0);
1629 for (i = 0; i < fw_size; i++)
1630 WREG32(CP_CE_UCODE_DATA, le32_to_cpup(fw_data++));
1631 WREG32(CP_CE_UCODE_ADDR, 0);
1632
1633 /* ME */
1634 fw_data = (const __be32 *)
1635 (adev->gfx.me_fw->data + le32_to_cpu(me_hdr->header.ucode_array_offset_bytes));
1636 fw_size = le32_to_cpu(me_hdr->header.ucode_size_bytes) / 4;
1637 WREG32(CP_ME_RAM_WADDR, 0);
1638 for (i = 0; i < fw_size; i++)
1639 WREG32(CP_ME_RAM_DATA, le32_to_cpup(fw_data++));
1640 WREG32(CP_ME_RAM_WADDR, 0);
1641
1642
1643 WREG32(CP_PFP_UCODE_ADDR, 0);
1644 WREG32(CP_CE_UCODE_ADDR, 0);
1645 WREG32(CP_ME_RAM_WADDR, 0);
1646 WREG32(CP_ME_RAM_RADDR, 0);
1647 return 0;
1648}
1649
1650static int gfx_v6_0_cp_gfx_start(struct amdgpu_device *adev)
1651{
1652 const struct cs_section_def *sect = NULL;
1653 const struct cs_extent_def *ext = NULL;
1654 struct amdgpu_ring *ring = &adev->gfx.gfx_ring[0];
1655 int r, i;
1656
1657 r = amdgpu_ring_alloc(ring, 7 + 4);
1658 if (r) {
1659 DRM_ERROR("amdgpu: cp failed to lock ring (%d).\n", r);
1660 return r;
1661 }
1662 amdgpu_ring_write(ring, PACKET3(PACKET3_ME_INITIALIZE, 5));
1663 amdgpu_ring_write(ring, 0x1);
1664 amdgpu_ring_write(ring, 0x0);
1665 amdgpu_ring_write(ring, adev->gfx.config.max_hw_contexts - 1);
1666 amdgpu_ring_write(ring, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
1667 amdgpu_ring_write(ring, 0);
1668 amdgpu_ring_write(ring, 0);
1669
1670 amdgpu_ring_write(ring, PACKET3(PACKET3_SET_BASE, 2));
1671 amdgpu_ring_write(ring, PACKET3_BASE_INDEX(CE_PARTITION_BASE));
1672 amdgpu_ring_write(ring, 0xc000);
1673 amdgpu_ring_write(ring, 0xe000);
1674 amdgpu_ring_commit(ring);
1675
1676 gfx_v6_0_cp_gfx_enable(adev, true);
1677
1678 r = amdgpu_ring_alloc(ring, gfx_v6_0_get_csb_size(adev) + 10);
1679 if (r) {
1680 DRM_ERROR("amdgpu: cp failed to lock ring (%d).\n", r);
1681 return r;
1682 }
1683
1684 amdgpu_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1685 amdgpu_ring_write(ring, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
1686
1687 for (sect = adev->gfx.rlc.cs_data; sect->section != NULL; ++sect) {
1688 for (ext = sect->section; ext->extent != NULL; ++ext) {
1689 if (sect->id == SECT_CONTEXT) {
1690 amdgpu_ring_write(ring,
1691 PACKET3(PACKET3_SET_CONTEXT_REG, ext->reg_count));
1692 amdgpu_ring_write(ring, ext->reg_index - PACKET3_SET_CONTEXT_REG_START);
1693 for (i = 0; i < ext->reg_count; i++)
1694 amdgpu_ring_write(ring, ext->extent[i]);
1695 }
1696 }
1697 }
1698
1699 amdgpu_ring_write(ring, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1700 amdgpu_ring_write(ring, PACKET3_PREAMBLE_END_CLEAR_STATE);
1701
1702 amdgpu_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
1703 amdgpu_ring_write(ring, 0);
1704
1705 amdgpu_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
1706 amdgpu_ring_write(ring, 0x00000316);
1707 amdgpu_ring_write(ring, 0x0000000e);
1708 amdgpu_ring_write(ring, 0x00000010);
1709
1710 amdgpu_ring_commit(ring);
1711
1712 return 0;
1713}
1714
1715static int gfx_v6_0_cp_gfx_resume(struct amdgpu_device *adev)
1716{
1717 struct amdgpu_ring *ring;
1718 u32 tmp;
1719 u32 rb_bufsz;
1720 int r;
1721 u64 rptr_addr;
1722
1723 WREG32(CP_SEM_WAIT_TIMER, 0x0);
1724 WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
1725
1726 /* Set the write pointer delay */
1727 WREG32(CP_RB_WPTR_DELAY, 0);
1728
1729 WREG32(CP_DEBUG, 0);
1730 WREG32(SCRATCH_ADDR, 0);
1731
1732 /* ring 0 - compute and gfx */
1733 /* Set ring buffer size */
1734 ring = &adev->gfx.gfx_ring[0];
1735 rb_bufsz = order_base_2(ring->ring_size / 8);
1736 tmp = (order_base_2(AMDGPU_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
1737
1738#ifdef __BIG_ENDIAN
1739 tmp |= BUF_SWAP_32BIT;
1740#endif
1741 WREG32(CP_RB0_CNTL, tmp);
1742
1743 /* Initialize the ring buffer's read and write pointers */
1744 WREG32(CP_RB0_CNTL, tmp | RB_RPTR_WR_ENA);
1745 ring->wptr = 0;
1746 WREG32(CP_RB0_WPTR, ring->wptr);
1747
1748 /* set the wb address whether it's enabled or not */
1749 rptr_addr = adev->wb.gpu_addr + (ring->rptr_offs * 4);
1750 WREG32(CP_RB0_RPTR_ADDR, lower_32_bits(rptr_addr));
1751 WREG32(CP_RB0_RPTR_ADDR_HI, upper_32_bits(rptr_addr) & 0xFF);
1752
1753 WREG32(SCRATCH_UMSK, 0);
1754
1755 mdelay(1);
1756 WREG32(CP_RB0_CNTL, tmp);
1757
1758 WREG32(CP_RB0_BASE, ring->gpu_addr >> 8);
1759
1760 /* start the rings */
1761 gfx_v6_0_cp_gfx_start(adev);
1762 ring->ready = true;
1763 r = amdgpu_ring_test_ring(ring);
1764 if (r) {
1765 ring->ready = false;
1766 return r;
1767 }
1768
1769 return 0;
1770}
1771
1772static u32 gfx_v6_0_ring_get_rptr(struct amdgpu_ring *ring)
1773{
1774 return ring->adev->wb.wb[ring->rptr_offs];
1775}
1776
1777static u32 gfx_v6_0_ring_get_wptr(struct amdgpu_ring *ring)
1778{
1779 struct amdgpu_device *adev = ring->adev;
1780
1781 if (ring == &adev->gfx.gfx_ring[0])
1782 return RREG32(CP_RB0_WPTR);
1783 else if (ring == &adev->gfx.compute_ring[0])
1784 return RREG32(CP_RB1_WPTR);
1785 else if (ring == &adev->gfx.compute_ring[1])
1786 return RREG32(CP_RB2_WPTR);
1787 else
1788 BUG();
1789}
1790
1791static void gfx_v6_0_ring_set_wptr_gfx(struct amdgpu_ring *ring)
1792{
1793 struct amdgpu_device *adev = ring->adev;
1794
1795 WREG32(CP_RB0_WPTR, ring->wptr);
1796 (void)RREG32(CP_RB0_WPTR);
1797}
1798
1799static void gfx_v6_0_ring_set_wptr_compute(struct amdgpu_ring *ring)
1800{
1801 struct amdgpu_device *adev = ring->adev;
1802
1803 if (ring == &adev->gfx.compute_ring[0]) {
1804 WREG32(CP_RB1_WPTR, ring->wptr);
1805 (void)RREG32(CP_RB1_WPTR);
1806 } else if (ring == &adev->gfx.compute_ring[1]) {
1807 WREG32(CP_RB2_WPTR, ring->wptr);
1808 (void)RREG32(CP_RB2_WPTR);
1809 } else {
1810 BUG();
1811 }
1812
1813}
1814
1815static int gfx_v6_0_cp_compute_resume(struct amdgpu_device *adev)
1816{
1817 struct amdgpu_ring *ring;
1818 u32 tmp;
1819 u32 rb_bufsz;
1820 int r;
1821 u64 rptr_addr;
1822
1823 /* ring1 - compute only */
1824 /* Set ring buffer size */
1825
1826 ring = &adev->gfx.compute_ring[0];
1827 rb_bufsz = order_base_2(ring->ring_size / 8);
1828 tmp = (order_base_2(AMDGPU_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
1829#ifdef __BIG_ENDIAN
1830 tmp |= BUF_SWAP_32BIT;
1831#endif
1832 WREG32(CP_RB1_CNTL, tmp);
1833
1834 WREG32(CP_RB1_CNTL, tmp | RB_RPTR_WR_ENA);
1835 ring->wptr = 0;
1836 WREG32(CP_RB1_WPTR, ring->wptr);
1837
1838 rptr_addr = adev->wb.gpu_addr + (ring->rptr_offs * 4);
1839 WREG32(CP_RB1_RPTR_ADDR, lower_32_bits(rptr_addr));
1840 WREG32(CP_RB1_RPTR_ADDR_HI, upper_32_bits(rptr_addr) & 0xFF);
1841
1842 mdelay(1);
1843 WREG32(CP_RB1_CNTL, tmp);
1844 WREG32(CP_RB1_BASE, ring->gpu_addr >> 8);
1845
1846 ring = &adev->gfx.compute_ring[1];
1847 rb_bufsz = order_base_2(ring->ring_size / 8);
1848 tmp = (order_base_2(AMDGPU_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
1849#ifdef __BIG_ENDIAN
1850 tmp |= BUF_SWAP_32BIT;
1851#endif
1852 WREG32(CP_RB2_CNTL, tmp);
1853
1854 WREG32(CP_RB2_CNTL, tmp | RB_RPTR_WR_ENA);
1855 ring->wptr = 0;
1856 WREG32(CP_RB2_WPTR, ring->wptr);
1857 rptr_addr = adev->wb.gpu_addr + (ring->rptr_offs * 4);
1858 WREG32(CP_RB2_RPTR_ADDR, lower_32_bits(rptr_addr));
1859 WREG32(CP_RB2_RPTR_ADDR_HI, upper_32_bits(rptr_addr) & 0xFF);
1860
1861 mdelay(1);
1862 WREG32(CP_RB2_CNTL, tmp);
1863 WREG32(CP_RB2_BASE, ring->gpu_addr >> 8);
1864
1865 adev->gfx.compute_ring[0].ready = true;
1866 adev->gfx.compute_ring[1].ready = true;
1867
1868 r = amdgpu_ring_test_ring(&adev->gfx.compute_ring[0]);
1869 if (r) {
1870 adev->gfx.compute_ring[0].ready = false;
1871 return r;
1872 }
1873
1874 r = amdgpu_ring_test_ring(&adev->gfx.compute_ring[1]);
1875 if (r) {
1876 adev->gfx.compute_ring[1].ready = false;
1877 return r;
1878 }
1879
1880 return 0;
1881}
1882
1883static void gfx_v6_0_cp_enable(struct amdgpu_device *adev, bool enable)
1884{
1885 gfx_v6_0_cp_gfx_enable(adev, enable);
1886}
1887
1888static int gfx_v6_0_cp_load_microcode(struct amdgpu_device *adev)
1889{
1890 return gfx_v6_0_cp_gfx_load_microcode(adev);
1891}
1892
1893static void gfx_v6_0_enable_gui_idle_interrupt(struct amdgpu_device *adev,
1894 bool enable)
1895{
1896 u32 tmp = RREG32(CP_INT_CNTL_RING0);
1897 u32 mask;
1898 int i;
1899
1900 if (enable)
1901 tmp |= (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
1902 else
1903 tmp &= ~(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
1904 WREG32(CP_INT_CNTL_RING0, tmp);
1905
1906 if (!enable) {
1907 /* read a gfx register */
1908 tmp = RREG32(DB_DEPTH_INFO);
1909
1910 mask = RLC_BUSY_STATUS | GFX_POWER_STATUS | GFX_CLOCK_STATUS | GFX_LS_STATUS;
1911 for (i = 0; i < adev->usec_timeout; i++) {
1912 if ((RREG32(RLC_STAT) & mask) == (GFX_CLOCK_STATUS | GFX_POWER_STATUS))
1913 break;
1914 udelay(1);
1915 }
1916 }
1917}
1918
1919static int gfx_v6_0_cp_resume(struct amdgpu_device *adev)
1920{
1921 int r;
1922
1923 gfx_v6_0_enable_gui_idle_interrupt(adev, false);
1924
1925 r = gfx_v6_0_cp_load_microcode(adev);
1926 if (r)
1927 return r;
1928
1929 r = gfx_v6_0_cp_gfx_resume(adev);
1930 if (r)
1931 return r;
1932 r = gfx_v6_0_cp_compute_resume(adev);
1933 if (r)
1934 return r;
1935
1936 gfx_v6_0_enable_gui_idle_interrupt(adev, true);
1937
1938 return 0;
1939}
1940
1941static void gfx_v6_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
1942{
1943 int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
1944 uint32_t seq = ring->fence_drv.sync_seq;
1945 uint64_t addr = ring->fence_drv.gpu_addr;
1946
1947 amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
1948 amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */
1949 WAIT_REG_MEM_FUNCTION(3) | /* equal */
1950 WAIT_REG_MEM_ENGINE(usepfp))); /* pfp or me */
1951 amdgpu_ring_write(ring, addr & 0xfffffffc);
1952 amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff);
1953 amdgpu_ring_write(ring, seq);
1954 amdgpu_ring_write(ring, 0xffffffff);
1955 amdgpu_ring_write(ring, 4); /* poll interval */
1956
1957 if (usepfp) {
1958 /* synce CE with ME to prevent CE fetch CEIB before context switch done */
1959 amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
1960 amdgpu_ring_write(ring, 0);
1961 amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
1962 amdgpu_ring_write(ring, 0);
1963 }
1964}
1965
1966static void gfx_v6_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
1967 unsigned vm_id, uint64_t pd_addr)
1968{
1969 int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
1970
1971 /* write new base address */
1972 amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
1973 amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(1) |
1974 WRITE_DATA_DST_SEL(0)));
1975 if (vm_id < 8) {
1976 amdgpu_ring_write(ring, (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + vm_id ));
1977 } else {
1978 amdgpu_ring_write(ring, (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + (vm_id - 8)));
1979 }
1980 amdgpu_ring_write(ring, 0);
1981 amdgpu_ring_write(ring, pd_addr >> 12);
1982
1983 /* bits 0-15 are the VM contexts0-15 */
1984 amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
1985 amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(1) |
1986 WRITE_DATA_DST_SEL(0)));
1987 amdgpu_ring_write(ring, VM_INVALIDATE_REQUEST);
1988 amdgpu_ring_write(ring, 0);
1989 amdgpu_ring_write(ring, 1 << vm_id);
1990
1991 /* wait for the invalidate to complete */
1992 amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
1993 amdgpu_ring_write(ring, (WAIT_REG_MEM_FUNCTION(0) | /* always */
1994 WAIT_REG_MEM_ENGINE(0))); /* me */
1995 amdgpu_ring_write(ring, VM_INVALIDATE_REQUEST);
1996 amdgpu_ring_write(ring, 0);
1997 amdgpu_ring_write(ring, 0); /* ref */
1998 amdgpu_ring_write(ring, 0); /* mask */
1999 amdgpu_ring_write(ring, 0x20); /* poll interval */
2000
2001 if (usepfp) {
2002 /* sync PFP to ME, otherwise we might get invalid PFP reads */
2003 amdgpu_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
2004 amdgpu_ring_write(ring, 0x0);
2005
2006 /* synce CE with ME to prevent CE fetch CEIB before context switch done */
2007 amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
2008 amdgpu_ring_write(ring, 0);
2009 amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
2010 amdgpu_ring_write(ring, 0);
2011 }
2012}
2013
2014
2015static void gfx_v6_0_rlc_fini(struct amdgpu_device *adev)
2016{
2017 int r;
2018
2019 if (adev->gfx.rlc.save_restore_obj) {
2020 r = amdgpu_bo_reserve(adev->gfx.rlc.save_restore_obj, false);
2021 if (unlikely(r != 0))
2022 dev_warn(adev->dev, "(%d) reserve RLC sr bo failed\n", r);
2023 amdgpu_bo_unpin(adev->gfx.rlc.save_restore_obj);
2024 amdgpu_bo_unreserve(adev->gfx.rlc.save_restore_obj);
2025
2026 amdgpu_bo_unref(&adev->gfx.rlc.save_restore_obj);
2027 adev->gfx.rlc.save_restore_obj = NULL;
2028 }
2029
2030 if (adev->gfx.rlc.clear_state_obj) {
2031 r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, false);
2032 if (unlikely(r != 0))
2033 dev_warn(adev->dev, "(%d) reserve RLC c bo failed\n", r);
2034 amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj);
2035 amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
2036
2037 amdgpu_bo_unref(&adev->gfx.rlc.clear_state_obj);
2038 adev->gfx.rlc.clear_state_obj = NULL;
2039 }
2040
2041 if (adev->gfx.rlc.cp_table_obj) {
2042 r = amdgpu_bo_reserve(adev->gfx.rlc.cp_table_obj, false);
2043 if (unlikely(r != 0))
2044 dev_warn(adev->dev, "(%d) reserve RLC cp table bo failed\n", r);
2045 amdgpu_bo_unpin(adev->gfx.rlc.cp_table_obj);
2046 amdgpu_bo_unreserve(adev->gfx.rlc.cp_table_obj);
2047
2048 amdgpu_bo_unref(&adev->gfx.rlc.cp_table_obj);
2049 adev->gfx.rlc.cp_table_obj = NULL;
2050 }
2051}
2052
2053static int gfx_v6_0_rlc_init(struct amdgpu_device *adev)
2054{
2055 const u32 *src_ptr;
2056 volatile u32 *dst_ptr;
2057 u32 dws, i;
2058 u64 reg_list_mc_addr;
2059 const struct cs_section_def *cs_data;
2060 int r;
2061
2062 adev->gfx.rlc.reg_list = verde_rlc_save_restore_register_list;
2063 adev->gfx.rlc.reg_list_size =
2064 (u32)ARRAY_SIZE(verde_rlc_save_restore_register_list);
2065
2066 adev->gfx.rlc.cs_data = si_cs_data;
2067 src_ptr = adev->gfx.rlc.reg_list;
2068 dws = adev->gfx.rlc.reg_list_size;
2069 cs_data = adev->gfx.rlc.cs_data;
2070
2071 if (src_ptr) {
2072 /* save restore block */
2073 if (adev->gfx.rlc.save_restore_obj == NULL) {
2074
2075 r = amdgpu_bo_create(adev, dws * 4, PAGE_SIZE, true,
2076 AMDGPU_GEM_DOMAIN_VRAM,
2077 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
2078 NULL, NULL,
2079 &adev->gfx.rlc.save_restore_obj);
2080
2081 if (r) {
2082 dev_warn(adev->dev, "(%d) create RLC sr bo failed\n", r);
2083 return r;
2084 }
2085 }
2086
2087 r = amdgpu_bo_reserve(adev->gfx.rlc.save_restore_obj, false);
2088 if (unlikely(r != 0)) {
2089 gfx_v6_0_rlc_fini(adev);
2090 return r;
2091 }
2092 r = amdgpu_bo_pin(adev->gfx.rlc.save_restore_obj, AMDGPU_GEM_DOMAIN_VRAM,
2093 &adev->gfx.rlc.save_restore_gpu_addr);
2094 if (r) {
2095 amdgpu_bo_unreserve(adev->gfx.rlc.save_restore_obj);
2096 dev_warn(adev->dev, "(%d) pin RLC sr bo failed\n", r);
2097 gfx_v6_0_rlc_fini(adev);
2098 return r;
2099 }
2100
2101 r = amdgpu_bo_kmap(adev->gfx.rlc.save_restore_obj, (void **)&adev->gfx.rlc.sr_ptr);
2102 if (r) {
2103 dev_warn(adev->dev, "(%d) map RLC sr bo failed\n", r);
2104 gfx_v6_0_rlc_fini(adev);
2105 return r;
2106 }
2107 /* write the sr buffer */
2108 dst_ptr = adev->gfx.rlc.sr_ptr;
2109 for (i = 0; i < adev->gfx.rlc.reg_list_size; i++)
2110 dst_ptr[i] = cpu_to_le32(src_ptr[i]);
2111 amdgpu_bo_kunmap(adev->gfx.rlc.save_restore_obj);
2112 amdgpu_bo_unreserve(adev->gfx.rlc.save_restore_obj);
2113 }
2114
2115 if (cs_data) {
2116 /* clear state block */
2117 adev->gfx.rlc.clear_state_size = gfx_v6_0_get_csb_size(adev);
2118 dws = adev->gfx.rlc.clear_state_size + (256 / 4);
2119
2120 if (adev->gfx.rlc.clear_state_obj == NULL) {
2121 r = amdgpu_bo_create(adev, dws * 4, PAGE_SIZE, true,
2122 AMDGPU_GEM_DOMAIN_VRAM,
2123 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
2124 NULL, NULL,
2125 &adev->gfx.rlc.clear_state_obj);
2126
2127 if (r) {
2128 dev_warn(adev->dev, "(%d) create RLC c bo failed\n", r);
2129 gfx_v6_0_rlc_fini(adev);
2130 return r;
2131 }
2132 }
2133 r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, false);
2134 if (unlikely(r != 0)) {
2135 gfx_v6_0_rlc_fini(adev);
2136 return r;
2137 }
2138 r = amdgpu_bo_pin(adev->gfx.rlc.clear_state_obj, AMDGPU_GEM_DOMAIN_VRAM,
2139 &adev->gfx.rlc.clear_state_gpu_addr);
2140 if (r) {
2141 amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
2142 dev_warn(adev->dev, "(%d) pin RLC c bo failed\n", r);
2143 gfx_v6_0_rlc_fini(adev);
2144 return r;
2145 }
2146
2147 r = amdgpu_bo_kmap(adev->gfx.rlc.clear_state_obj, (void **)&adev->gfx.rlc.cs_ptr);
2148 if (r) {
2149 dev_warn(adev->dev, "(%d) map RLC c bo failed\n", r);
2150 gfx_v6_0_rlc_fini(adev);
2151 return r;
2152 }
2153 /* set up the cs buffer */
2154 dst_ptr = adev->gfx.rlc.cs_ptr;
2155 reg_list_mc_addr = adev->gfx.rlc.clear_state_gpu_addr + 256;
2156 dst_ptr[0] = cpu_to_le32(upper_32_bits(reg_list_mc_addr));
2157 dst_ptr[1] = cpu_to_le32(lower_32_bits(reg_list_mc_addr));
2158 dst_ptr[2] = cpu_to_le32(adev->gfx.rlc.clear_state_size);
2159 gfx_v6_0_get_csb_buffer(adev, &dst_ptr[(256/4)]);
2160 amdgpu_bo_kunmap(adev->gfx.rlc.clear_state_obj);
2161 amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
2162 }
2163
2164 return 0;
2165}
2166
2167static void gfx_v6_0_enable_lbpw(struct amdgpu_device *adev, bool enable)
2168{
2169 u32 tmp;
2170
2171 tmp = RREG32(RLC_LB_CNTL);
2172 if (enable)
2173 tmp |= LOAD_BALANCE_ENABLE;
2174 else
2175 tmp &= ~LOAD_BALANCE_ENABLE;
2176 WREG32(RLC_LB_CNTL, tmp);
2177
2178 if (!enable) {
2179 gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
2180 WREG32(SPI_LB_CU_MASK, 0x00ff);
2181 }
2182
2183}
2184
2185static void gfx_v6_0_wait_for_rlc_serdes(struct amdgpu_device *adev)
2186{
2187 int i;
2188
2189 for (i = 0; i < adev->usec_timeout; i++) {
2190 if (RREG32(RLC_SERDES_MASTER_BUSY_0) == 0)
2191 break;
2192 udelay(1);
2193 }
2194
2195 for (i = 0; i < adev->usec_timeout; i++) {
2196 if (RREG32(RLC_SERDES_MASTER_BUSY_1) == 0)
2197 break;
2198 udelay(1);
2199 }
2200}
2201
2202static void gfx_v6_0_update_rlc(struct amdgpu_device *adev, u32 rlc)
2203{
2204 u32 tmp;
2205
2206 tmp = RREG32(RLC_CNTL);
2207 if (tmp != rlc)
2208 WREG32(RLC_CNTL, rlc);
2209}
2210
2211static u32 gfx_v6_0_halt_rlc(struct amdgpu_device *adev)
2212{
2213 u32 data, orig;
2214
2215 orig = data = RREG32(RLC_CNTL);
2216
2217 if (data & RLC_ENABLE) {
2218 data &= ~RLC_ENABLE;
2219 WREG32(RLC_CNTL, data);
2220
2221 gfx_v6_0_wait_for_rlc_serdes(adev);
2222 }
2223
2224 return orig;
2225}
2226
2227static void gfx_v6_0_rlc_stop(struct amdgpu_device *adev)
2228{
2229 WREG32(RLC_CNTL, 0);
2230
2231 gfx_v6_0_enable_gui_idle_interrupt(adev, false);
2232 gfx_v6_0_wait_for_rlc_serdes(adev);
2233}
2234
2235static void gfx_v6_0_rlc_start(struct amdgpu_device *adev)
2236{
2237 WREG32(RLC_CNTL, RLC_ENABLE);
2238
2239 gfx_v6_0_enable_gui_idle_interrupt(adev, true);
2240
2241 udelay(50);
2242}
2243
2244static void gfx_v6_0_rlc_reset(struct amdgpu_device *adev)
2245{
2246 u32 tmp = RREG32(GRBM_SOFT_RESET);
2247
2248 tmp |= SOFT_RESET_RLC;
2249 WREG32(GRBM_SOFT_RESET, tmp);
2250 udelay(50);
2251 tmp &= ~SOFT_RESET_RLC;
2252 WREG32(GRBM_SOFT_RESET, tmp);
2253 udelay(50);
2254}
2255
2256static bool gfx_v6_0_lbpw_supported(struct amdgpu_device *adev)
2257{
2258 u32 tmp;
2259
2260 /* Enable LBPW only for DDR3 */
2261 tmp = RREG32(MC_SEQ_MISC0);
2262 if ((tmp & 0xF0000000) == 0xB0000000)
2263 return true;
2264 return false;
2265}
2266static void gfx_v6_0_init_cg(struct amdgpu_device *adev)
2267{
2268}
2269
2270static int gfx_v6_0_rlc_resume(struct amdgpu_device *adev)
2271{
2272 u32 i;
2273 const struct rlc_firmware_header_v1_0 *hdr;
2274 const __le32 *fw_data;
2275 u32 fw_size;
2276
2277
2278 if (!adev->gfx.rlc_fw)
2279 return -EINVAL;
2280
2281 gfx_v6_0_rlc_stop(adev);
2282 gfx_v6_0_rlc_reset(adev);
2283 gfx_v6_0_init_pg(adev);
2284 gfx_v6_0_init_cg(adev);
2285
2286 WREG32(RLC_RL_BASE, 0);
2287 WREG32(RLC_RL_SIZE, 0);
2288 WREG32(RLC_LB_CNTL, 0);
2289 WREG32(RLC_LB_CNTR_MAX, 0xffffffff);
2290 WREG32(RLC_LB_CNTR_INIT, 0);
2291 WREG32(RLC_LB_INIT_CU_MASK, 0xffffffff);
2292
2293 WREG32(RLC_MC_CNTL, 0);
2294 WREG32(RLC_UCODE_CNTL, 0);
2295
2296 hdr = (const struct rlc_firmware_header_v1_0 *)adev->gfx.rlc_fw->data;
2297 fw_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
2298 fw_data = (const __le32 *)
2299 (adev->gfx.rlc_fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
2300
2301 amdgpu_ucode_print_rlc_hdr(&hdr->header);
2302
2303 for (i = 0; i < fw_size; i++) {
2304 WREG32(RLC_UCODE_ADDR, i);
2305 WREG32(RLC_UCODE_DATA, le32_to_cpup(fw_data++));
2306 }
2307 WREG32(RLC_UCODE_ADDR, 0);
2308
2309 gfx_v6_0_enable_lbpw(adev, gfx_v6_0_lbpw_supported(adev));
2310 gfx_v6_0_rlc_start(adev);
2311
2312 return 0;
2313}
2314
2315static void gfx_v6_0_enable_cgcg(struct amdgpu_device *adev, bool enable)
2316{
2317 u32 data, orig, tmp;
2318
2319 orig = data = RREG32(RLC_CGCG_CGLS_CTRL);
2320
2321 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG)) {
2322 gfx_v6_0_enable_gui_idle_interrupt(adev, true);
2323
2324 WREG32(RLC_GCPM_GENERAL_3, 0x00000080);
2325
2326 tmp = gfx_v6_0_halt_rlc(adev);
2327
2328 WREG32(RLC_SERDES_WR_MASTER_MASK_0, 0xffffffff);
2329 WREG32(RLC_SERDES_WR_MASTER_MASK_1, 0xffffffff);
2330 WREG32(RLC_SERDES_WR_CTRL, 0x00b000ff);
2331
2332 gfx_v6_0_wait_for_rlc_serdes(adev);
2333 gfx_v6_0_update_rlc(adev, tmp);
2334
2335 WREG32(RLC_SERDES_WR_CTRL, 0x007000ff);
2336
2337 data |= CGCG_EN | CGLS_EN;
2338 } else {
2339 gfx_v6_0_enable_gui_idle_interrupt(adev, false);
2340
2341 RREG32(CB_CGTT_SCLK_CTRL);
2342 RREG32(CB_CGTT_SCLK_CTRL);
2343 RREG32(CB_CGTT_SCLK_CTRL);
2344 RREG32(CB_CGTT_SCLK_CTRL);
2345
2346 data &= ~(CGCG_EN | CGLS_EN);
2347 }
2348
2349 if (orig != data)
2350 WREG32(RLC_CGCG_CGLS_CTRL, data);
2351
2352}
2353
2354static void gfx_v6_0_enable_mgcg(struct amdgpu_device *adev, bool enable)
2355{
2356
2357 u32 data, orig, tmp = 0;
2358
2359 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG)) {
2360 orig = data = RREG32(CGTS_SM_CTRL_REG);
2361 data = 0x96940200;
2362 if (orig != data)
2363 WREG32(CGTS_SM_CTRL_REG, data);
2364
2365 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CP_LS) {
2366 orig = data = RREG32(CP_MEM_SLP_CNTL);
2367 data |= CP_MEM_LS_EN;
2368 if (orig != data)
2369 WREG32(CP_MEM_SLP_CNTL, data);
2370 }
2371
2372 orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE);
2373 data &= 0xffffffc0;
2374 if (orig != data)
2375 WREG32(RLC_CGTT_MGCG_OVERRIDE, data);
2376
2377 tmp = gfx_v6_0_halt_rlc(adev);
2378
2379 WREG32(RLC_SERDES_WR_MASTER_MASK_0, 0xffffffff);
2380 WREG32(RLC_SERDES_WR_MASTER_MASK_1, 0xffffffff);
2381 WREG32(RLC_SERDES_WR_CTRL, 0x00d000ff);
2382
2383 gfx_v6_0_update_rlc(adev, tmp);
2384 } else {
2385 orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE);
2386 data |= 0x00000003;
2387 if (orig != data)
2388 WREG32(RLC_CGTT_MGCG_OVERRIDE, data);
2389
2390 data = RREG32(CP_MEM_SLP_CNTL);
2391 if (data & CP_MEM_LS_EN) {
2392 data &= ~CP_MEM_LS_EN;
2393 WREG32(CP_MEM_SLP_CNTL, data);
2394 }
2395 orig = data = RREG32(CGTS_SM_CTRL_REG);
2396 data |= LS_OVERRIDE | OVERRIDE;
2397 if (orig != data)
2398 WREG32(CGTS_SM_CTRL_REG, data);
2399
2400 tmp = gfx_v6_0_halt_rlc(adev);
2401
2402 WREG32(RLC_SERDES_WR_MASTER_MASK_0, 0xffffffff);
2403 WREG32(RLC_SERDES_WR_MASTER_MASK_1, 0xffffffff);
2404 WREG32(RLC_SERDES_WR_CTRL, 0x00e000ff);
2405
2406 gfx_v6_0_update_rlc(adev, tmp);
2407 }
2408}
2409/*
2410static void gfx_v6_0_update_cg(struct amdgpu_device *adev,
2411 bool enable)
2412{
2413 gfx_v6_0_enable_gui_idle_interrupt(adev, false);
2414 if (enable) {
2415 gfx_v6_0_enable_mgcg(adev, true);
2416 gfx_v6_0_enable_cgcg(adev, true);
2417 } else {
2418 gfx_v6_0_enable_cgcg(adev, false);
2419 gfx_v6_0_enable_mgcg(adev, false);
2420 }
2421 gfx_v6_0_enable_gui_idle_interrupt(adev, true);
2422}
2423*/
2424static void gfx_v6_0_enable_sclk_slowdown_on_pu(struct amdgpu_device *adev,
2425 bool enable)
2426{
2427}
2428
2429static void gfx_v6_0_enable_sclk_slowdown_on_pd(struct amdgpu_device *adev,
2430 bool enable)
2431{
2432}
2433
2434static void gfx_v6_0_enable_cp_pg(struct amdgpu_device *adev, bool enable)
2435{
2436 u32 data, orig;
2437
2438 orig = data = RREG32(RLC_PG_CNTL);
2439 if (enable && (adev->pg_flags & AMD_PG_SUPPORT_CP))
2440 data &= ~0x8000;
2441 else
2442 data |= 0x8000;
2443 if (orig != data)
2444 WREG32(RLC_PG_CNTL, data);
2445}
2446
2447static void gfx_v6_0_enable_gds_pg(struct amdgpu_device *adev, bool enable)
2448{
2449}
2450/*
2451static void gfx_v6_0_init_cp_pg_table(struct amdgpu_device *adev)
2452{
2453 const __le32 *fw_data;
2454 volatile u32 *dst_ptr;
2455 int me, i, max_me = 4;
2456 u32 bo_offset = 0;
2457 u32 table_offset, table_size;
2458
2459 if (adev->asic_type == CHIP_KAVERI)
2460 max_me = 5;
2461
2462 if (adev->gfx.rlc.cp_table_ptr == NULL)
2463 return;
2464
2465 dst_ptr = adev->gfx.rlc.cp_table_ptr;
2466 for (me = 0; me < max_me; me++) {
2467 if (me == 0) {
2468 const struct gfx_firmware_header_v1_0 *hdr =
2469 (const struct gfx_firmware_header_v1_0 *)adev->gfx.ce_fw->data;
2470 fw_data = (const __le32 *)
2471 (adev->gfx.ce_fw->data +
2472 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
2473 table_offset = le32_to_cpu(hdr->jt_offset);
2474 table_size = le32_to_cpu(hdr->jt_size);
2475 } else if (me == 1) {
2476 const struct gfx_firmware_header_v1_0 *hdr =
2477 (const struct gfx_firmware_header_v1_0 *)adev->gfx.pfp_fw->data;
2478 fw_data = (const __le32 *)
2479 (adev->gfx.pfp_fw->data +
2480 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
2481 table_offset = le32_to_cpu(hdr->jt_offset);
2482 table_size = le32_to_cpu(hdr->jt_size);
2483 } else if (me == 2) {
2484 const struct gfx_firmware_header_v1_0 *hdr =
2485 (const struct gfx_firmware_header_v1_0 *)adev->gfx.me_fw->data;
2486 fw_data = (const __le32 *)
2487 (adev->gfx.me_fw->data +
2488 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
2489 table_offset = le32_to_cpu(hdr->jt_offset);
2490 table_size = le32_to_cpu(hdr->jt_size);
2491 } else if (me == 3) {
2492 const struct gfx_firmware_header_v1_0 *hdr =
2493 (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data;
2494 fw_data = (const __le32 *)
2495 (adev->gfx.mec_fw->data +
2496 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
2497 table_offset = le32_to_cpu(hdr->jt_offset);
2498 table_size = le32_to_cpu(hdr->jt_size);
2499 } else {
2500 const struct gfx_firmware_header_v1_0 *hdr =
2501 (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data;
2502 fw_data = (const __le32 *)
2503 (adev->gfx.mec2_fw->data +
2504 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
2505 table_offset = le32_to_cpu(hdr->jt_offset);
2506 table_size = le32_to_cpu(hdr->jt_size);
2507 }
2508
2509 for (i = 0; i < table_size; i ++) {
2510 dst_ptr[bo_offset + i] =
2511 cpu_to_le32(le32_to_cpu(fw_data[table_offset + i]));
2512 }
2513
2514 bo_offset += table_size;
2515 }
2516}
2517*/
2518static void gfx_v6_0_enable_gfx_cgpg(struct amdgpu_device *adev,
2519 bool enable)
2520{
2521
2522 u32 tmp;
2523
2524 if (enable && (adev->pg_flags & AMD_PG_SUPPORT_GFX_PG)) {
2525 tmp = RLC_PUD(0x10) | RLC_PDD(0x10) | RLC_TTPD(0x10) | RLC_MSD(0x10);
2526 WREG32(RLC_TTOP_D, tmp);
2527
2528 tmp = RREG32(RLC_PG_CNTL);
2529 tmp |= GFX_PG_ENABLE;
2530 WREG32(RLC_PG_CNTL, tmp);
2531
2532 tmp = RREG32(RLC_AUTO_PG_CTRL);
2533 tmp |= AUTO_PG_EN;
2534 WREG32(RLC_AUTO_PG_CTRL, tmp);
2535 } else {
2536 tmp = RREG32(RLC_AUTO_PG_CTRL);
2537 tmp &= ~AUTO_PG_EN;
2538 WREG32(RLC_AUTO_PG_CTRL, tmp);
2539
2540 tmp = RREG32(DB_RENDER_CONTROL);
2541 }
2542}
2543
2544static u32 gfx_v6_0_get_cu_active_bitmap(struct amdgpu_device *adev,
2545 u32 se, u32 sh)
2546{
2547
2548 u32 mask = 0, tmp, tmp1;
2549 int i;
2550
2551 mutex_lock(&adev->grbm_idx_mutex);
2552 gfx_v6_0_select_se_sh(adev, se, sh, 0xffffffff);
2553 tmp = RREG32(CC_GC_SHADER_ARRAY_CONFIG);
2554 tmp1 = RREG32(GC_USER_SHADER_ARRAY_CONFIG);
2555 gfx_v6_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
2556 mutex_unlock(&adev->grbm_idx_mutex);
2557
2558 tmp &= 0xffff0000;
2559
2560 tmp |= tmp1;
2561 tmp >>= 16;
2562
2563 for (i = 0; i < adev->gfx.config.max_cu_per_sh; i ++) {
2564 mask <<= 1;
2565 mask |= 1;
2566 }
2567
2568 return (~tmp) & mask;
2569}
2570
2571static void gfx_v6_0_init_ao_cu_mask(struct amdgpu_device *adev)
2572{
2573 u32 i, j, k, active_cu_number = 0;
2574
2575 u32 mask, counter, cu_bitmap;
2576 u32 tmp = 0;
2577
2578 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
2579 for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
2580 mask = 1;
2581 cu_bitmap = 0;
2582 counter = 0;
2583 for (k = 0; k < adev->gfx.config.max_cu_per_sh; k++) {
2584 if (gfx_v6_0_get_cu_active_bitmap(adev, i, j) & mask) {
2585 if (counter < 2)
2586 cu_bitmap |= mask;
2587 counter++;
2588 }
2589 mask <<= 1;
2590 }
2591
2592 active_cu_number += counter;
2593 tmp |= (cu_bitmap << (i * 16 + j * 8));
2594 }
2595 }
2596
2597 WREG32(RLC_PG_AO_CU_MASK, tmp);
2598
2599 tmp = RREG32(RLC_MAX_PG_CU);
2600 tmp &= ~MAX_PU_CU_MASK;
2601 tmp |= MAX_PU_CU(active_cu_number);
2602 WREG32(RLC_MAX_PG_CU, tmp);
2603}
2604
2605static void gfx_v6_0_enable_gfx_static_mgpg(struct amdgpu_device *adev,
2606 bool enable)
2607{
2608 u32 data, orig;
2609
2610 orig = data = RREG32(RLC_PG_CNTL);
2611 if (enable && (adev->pg_flags & AMD_PG_SUPPORT_GFX_SMG))
2612 data |= STATIC_PER_CU_PG_ENABLE;
2613 else
2614 data &= ~STATIC_PER_CU_PG_ENABLE;
2615 if (orig != data)
2616 WREG32(RLC_PG_CNTL, data);
2617}
2618
2619static void gfx_v6_0_enable_gfx_dynamic_mgpg(struct amdgpu_device *adev,
2620 bool enable)
2621{
2622 u32 data, orig;
2623
2624 orig = data = RREG32(RLC_PG_CNTL);
2625 if (enable && (adev->pg_flags & AMD_PG_SUPPORT_GFX_DMG))
2626 data |= DYN_PER_CU_PG_ENABLE;
2627 else
2628 data &= ~DYN_PER_CU_PG_ENABLE;
2629 if (orig != data)
2630 WREG32(RLC_PG_CNTL, data);
2631}
2632
2633static void gfx_v6_0_init_gfx_cgpg(struct amdgpu_device *adev)
2634{
2635 u32 tmp;
2636
2637 WREG32(RLC_SAVE_AND_RESTORE_BASE, adev->gfx.rlc.save_restore_gpu_addr >> 8);
2638
2639 tmp = RREG32(RLC_PG_CNTL);
2640 tmp |= GFX_PG_SRC;
2641 WREG32(RLC_PG_CNTL, tmp);
2642
2643 WREG32(RLC_CLEAR_STATE_RESTORE_BASE, adev->gfx.rlc.clear_state_gpu_addr >> 8);
2644
2645 tmp = RREG32(RLC_AUTO_PG_CTRL);
2646
2647 tmp &= ~GRBM_REG_SGIT_MASK;
2648 tmp |= GRBM_REG_SGIT(0x700);
2649 tmp &= ~PG_AFTER_GRBM_REG_ST_MASK;
2650 WREG32(RLC_AUTO_PG_CTRL, tmp);
2651}
2652
2653static void gfx_v6_0_update_gfx_pg(struct amdgpu_device *adev, bool enable)
2654{
2655 gfx_v6_0_enable_gfx_cgpg(adev, enable);
2656 gfx_v6_0_enable_gfx_static_mgpg(adev, enable);
2657 gfx_v6_0_enable_gfx_dynamic_mgpg(adev, enable);
2658}
2659
2660static u32 gfx_v6_0_get_csb_size(struct amdgpu_device *adev)
2661{
2662 u32 count = 0;
2663 const struct cs_section_def *sect = NULL;
2664 const struct cs_extent_def *ext = NULL;
2665
2666 if (adev->gfx.rlc.cs_data == NULL)
2667 return 0;
2668
2669 /* begin clear state */
2670 count += 2;
2671 /* context control state */
2672 count += 3;
2673
2674 for (sect = adev->gfx.rlc.cs_data; sect->section != NULL; ++sect) {
2675 for (ext = sect->section; ext->extent != NULL; ++ext) {
2676 if (sect->id == SECT_CONTEXT)
2677 count += 2 + ext->reg_count;
2678 else
2679 return 0;
2680 }
2681 }
2682 /* pa_sc_raster_config */
2683 count += 3;
2684 /* end clear state */
2685 count += 2;
2686 /* clear state */
2687 count += 2;
2688
2689 return count;
2690}
2691
2692static void gfx_v6_0_get_csb_buffer(struct amdgpu_device *adev,
2693 volatile u32 *buffer)
2694{
2695 u32 count = 0, i;
2696 const struct cs_section_def *sect = NULL;
2697 const struct cs_extent_def *ext = NULL;
2698
2699 if (adev->gfx.rlc.cs_data == NULL)
2700 return;
2701 if (buffer == NULL)
2702 return;
2703
2704 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
2705 buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
2706
2707 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CONTEXT_CONTROL, 1));
2708 buffer[count++] = cpu_to_le32(0x80000000);
2709 buffer[count++] = cpu_to_le32(0x80000000);
2710
2711 for (sect = adev->gfx.rlc.cs_data; sect->section != NULL; ++sect) {
2712 for (ext = sect->section; ext->extent != NULL; ++ext) {
2713 if (sect->id == SECT_CONTEXT) {
2714 buffer[count++] =
2715 cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, ext->reg_count));
2716 buffer[count++] = cpu_to_le32(ext->reg_index - 0xa000);
2717 for (i = 0; i < ext->reg_count; i++)
2718 buffer[count++] = cpu_to_le32(ext->extent[i]);
2719 } else {
2720 return;
2721 }
2722 }
2723 }
2724
2725 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, 1));
2726 buffer[count++] = cpu_to_le32(PA_SC_RASTER_CONFIG - PACKET3_SET_CONTEXT_REG_START);
2727
2728 switch (adev->asic_type) {
2729 case CHIP_TAHITI:
2730 case CHIP_PITCAIRN:
2731 buffer[count++] = cpu_to_le32(0x2a00126a);
2732 break;
2733 case CHIP_VERDE:
2734 buffer[count++] = cpu_to_le32(0x0000124a);
2735 break;
2736 case CHIP_OLAND:
2737 buffer[count++] = cpu_to_le32(0x00000082);
2738 break;
2739 case CHIP_HAINAN:
2740 buffer[count++] = cpu_to_le32(0x00000000);
2741 break;
2742 default:
2743 buffer[count++] = cpu_to_le32(0x00000000);
2744 break;
2745 }
2746
2747 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
2748 buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_END_CLEAR_STATE);
2749
2750 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CLEAR_STATE, 0));
2751 buffer[count++] = cpu_to_le32(0);
2752}
2753
2754static void gfx_v6_0_init_pg(struct amdgpu_device *adev)
2755{
2756 if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG |
2757 AMD_PG_SUPPORT_GFX_SMG |
2758 AMD_PG_SUPPORT_GFX_DMG |
2759 AMD_PG_SUPPORT_CP |
2760 AMD_PG_SUPPORT_GDS |
2761 AMD_PG_SUPPORT_RLC_SMU_HS)) {
2762 gfx_v6_0_enable_sclk_slowdown_on_pu(adev, true);
2763 gfx_v6_0_enable_sclk_slowdown_on_pd(adev, true);
2764 if (adev->pg_flags & AMD_PG_SUPPORT_GFX_PG) {
2765 gfx_v6_0_init_gfx_cgpg(adev);
2766 gfx_v6_0_enable_cp_pg(adev, true);
2767 gfx_v6_0_enable_gds_pg(adev, true);
2768 } else {
2769 WREG32(RLC_SAVE_AND_RESTORE_BASE, adev->gfx.rlc.save_restore_gpu_addr >> 8);
2770 WREG32(RLC_CLEAR_STATE_RESTORE_BASE, adev->gfx.rlc.clear_state_gpu_addr >> 8);
2771
2772 }
2773 gfx_v6_0_init_ao_cu_mask(adev);
2774 gfx_v6_0_update_gfx_pg(adev, true);
2775 } else {
2776
2777 WREG32(RLC_SAVE_AND_RESTORE_BASE, adev->gfx.rlc.save_restore_gpu_addr >> 8);
2778 WREG32(RLC_CLEAR_STATE_RESTORE_BASE, adev->gfx.rlc.clear_state_gpu_addr >> 8);
2779 }
2780}
2781
2782static void gfx_v6_0_fini_pg(struct amdgpu_device *adev)
2783{
2784 if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG |
2785 AMD_PG_SUPPORT_GFX_SMG |
2786 AMD_PG_SUPPORT_GFX_DMG |
2787 AMD_PG_SUPPORT_CP |
2788 AMD_PG_SUPPORT_GDS |
2789 AMD_PG_SUPPORT_RLC_SMU_HS)) {
2790 gfx_v6_0_update_gfx_pg(adev, false);
2791 if (adev->pg_flags & AMD_PG_SUPPORT_GFX_PG) {
2792 gfx_v6_0_enable_cp_pg(adev, false);
2793 gfx_v6_0_enable_gds_pg(adev, false);
2794 }
2795 }
2796}
2797
2798static uint64_t gfx_v6_0_get_gpu_clock_counter(struct amdgpu_device *adev)
2799{
2800 uint64_t clock;
2801
2802 mutex_lock(&adev->gfx.gpu_clock_mutex);
2803 WREG32(RLC_CAPTURE_GPU_CLOCK_COUNT, 1);
2804 clock = (uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_LSB) |
2805 ((uint64_t)RREG32(RLC_GPU_CLOCK_COUNT_MSB) << 32ULL);
2806 mutex_unlock(&adev->gfx.gpu_clock_mutex);
2807 return clock;
2808}
2809
2810static void gfx_v6_ring_emit_cntxcntl(struct amdgpu_ring *ring, uint32_t flags)
2811{
2812 amdgpu_ring_write(ring, PACKET3(PACKET3_CONTEXT_CONTROL, 1));
2813 amdgpu_ring_write(ring, 0x80000000);
2814 amdgpu_ring_write(ring, 0);
2815}
2816
2817static unsigned gfx_v6_0_ring_get_emit_ib_size(struct amdgpu_ring *ring)
2818{
2819 return
2820 6; /* gfx_v6_0_ring_emit_ib */
2821}
2822
2823static unsigned gfx_v6_0_ring_get_dma_frame_size_gfx(struct amdgpu_ring *ring)
2824{
2825 return
2826 5 + /* gfx_v6_0_ring_emit_hdp_flush */
2827 5 + /* gfx_v6_0_ring_emit_hdp_invalidate */
2828 14 + 14 + 14 + /* gfx_v6_0_ring_emit_fence x3 for user fence, vm fence */
2829 7 + 4 + /* gfx_v6_0_ring_emit_pipeline_sync */
2830 17 + 6 + /* gfx_v6_0_ring_emit_vm_flush */
2831 3; /* gfx_v6_ring_emit_cntxcntl */
2832}
2833
2834static unsigned gfx_v6_0_ring_get_dma_frame_size_compute(struct amdgpu_ring *ring)
2835{
2836 return
2837 5 + /* gfx_v6_0_ring_emit_hdp_flush */
2838 5 + /* gfx_v6_0_ring_emit_hdp_invalidate */
2839 7 + /* gfx_v6_0_ring_emit_pipeline_sync */
2840 17 + /* gfx_v6_0_ring_emit_vm_flush */
2841 14 + 14 + 14; /* gfx_v6_0_ring_emit_fence x3 for user fence, vm fence */
2842}
2843
2844static const struct amdgpu_gfx_funcs gfx_v6_0_gfx_funcs = {
2845 .get_gpu_clock_counter = &gfx_v6_0_get_gpu_clock_counter,
2846 .select_se_sh = &gfx_v6_0_select_se_sh,
2847};
2848
2849static int gfx_v6_0_early_init(void *handle)
2850{
2851 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2852
2853 adev->gfx.num_gfx_rings = GFX6_NUM_GFX_RINGS;
2854 adev->gfx.num_compute_rings = GFX6_NUM_COMPUTE_RINGS;
2855 adev->gfx.funcs = &gfx_v6_0_gfx_funcs;
2856 gfx_v6_0_set_ring_funcs(adev);
2857 gfx_v6_0_set_irq_funcs(adev);
2858
2859 return 0;
2860}
2861
2862static int gfx_v6_0_sw_init(void *handle)
2863{
2864 struct amdgpu_ring *ring;
2865 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2866 int i, r;
2867
2868 r = amdgpu_irq_add_id(adev, 181, &adev->gfx.eop_irq);
2869 if (r)
2870 return r;
2871
2872 r = amdgpu_irq_add_id(adev, 184, &adev->gfx.priv_reg_irq);
2873 if (r)
2874 return r;
2875
2876 r = amdgpu_irq_add_id(adev, 185, &adev->gfx.priv_inst_irq);
2877 if (r)
2878 return r;
2879
2880 gfx_v6_0_scratch_init(adev);
2881
2882 r = gfx_v6_0_init_microcode(adev);
2883 if (r) {
2884 DRM_ERROR("Failed to load gfx firmware!\n");
2885 return r;
2886 }
2887
2888 r = gfx_v6_0_rlc_init(adev);
2889 if (r) {
2890 DRM_ERROR("Failed to init rlc BOs!\n");
2891 return r;
2892 }
2893
2894 for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
2895 ring = &adev->gfx.gfx_ring[i];
2896 ring->ring_obj = NULL;
2897 sprintf(ring->name, "gfx");
2898 r = amdgpu_ring_init(adev, ring, 1024,
2899 0x80000000, 0xf,
2900 &adev->gfx.eop_irq, AMDGPU_CP_IRQ_GFX_EOP,
2901 AMDGPU_RING_TYPE_GFX);
2902 if (r)
2903 return r;
2904 }
2905
2906 for (i = 0; i < adev->gfx.num_compute_rings; i++) {
2907 unsigned irq_type;
2908
2909 if ((i >= 32) || (i >= AMDGPU_MAX_COMPUTE_RINGS)) {
2910 DRM_ERROR("Too many (%d) compute rings!\n", i);
2911 break;
2912 }
2913 ring = &adev->gfx.compute_ring[i];
2914 ring->ring_obj = NULL;
2915 ring->use_doorbell = false;
2916 ring->doorbell_index = 0;
2917 ring->me = 1;
2918 ring->pipe = i;
2919 ring->queue = i;
2920 sprintf(ring->name, "comp %d.%d.%d", ring->me, ring->pipe, ring->queue);
2921 irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP + ring->pipe;
2922 r = amdgpu_ring_init(adev, ring, 1024,
2923 0x80000000, 0xf,
2924 &adev->gfx.eop_irq, irq_type,
2925 AMDGPU_RING_TYPE_COMPUTE);
2926 if (r)
2927 return r;
2928 }
2929
2930 return r;
2931}
2932
2933static int gfx_v6_0_sw_fini(void *handle)
2934{
2935 int i;
2936 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2937
2938 amdgpu_bo_unref(&adev->gds.oa_gfx_bo);
2939 amdgpu_bo_unref(&adev->gds.gws_gfx_bo);
2940 amdgpu_bo_unref(&adev->gds.gds_gfx_bo);
2941
2942 for (i = 0; i < adev->gfx.num_gfx_rings; i++)
2943 amdgpu_ring_fini(&adev->gfx.gfx_ring[i]);
2944 for (i = 0; i < adev->gfx.num_compute_rings; i++)
2945 amdgpu_ring_fini(&adev->gfx.compute_ring[i]);
2946
2947 gfx_v6_0_rlc_fini(adev);
2948
2949 return 0;
2950}
2951
2952static int gfx_v6_0_hw_init(void *handle)
2953{
2954 int r;
2955 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2956
2957 gfx_v6_0_gpu_init(adev);
2958
2959 r = gfx_v6_0_rlc_resume(adev);
2960 if (r)
2961 return r;
2962
2963 r = gfx_v6_0_cp_resume(adev);
2964 if (r)
2965 return r;
2966
2967 adev->gfx.ce_ram_size = 0x8000;
2968
2969 return r;
2970}
2971
2972static int gfx_v6_0_hw_fini(void *handle)
2973{
2974 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2975
2976 gfx_v6_0_cp_enable(adev, false);
2977 gfx_v6_0_rlc_stop(adev);
2978 gfx_v6_0_fini_pg(adev);
2979
2980 return 0;
2981}
2982
2983static int gfx_v6_0_suspend(void *handle)
2984{
2985 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2986
2987 return gfx_v6_0_hw_fini(adev);
2988}
2989
2990static int gfx_v6_0_resume(void *handle)
2991{
2992 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2993
2994 return gfx_v6_0_hw_init(adev);
2995}
2996
2997static bool gfx_v6_0_is_idle(void *handle)
2998{
2999 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
3000
3001 if (RREG32(GRBM_STATUS) & GRBM_STATUS__GUI_ACTIVE_MASK)
3002 return false;
3003 else
3004 return true;
3005}
3006
3007static int gfx_v6_0_wait_for_idle(void *handle)
3008{
3009 unsigned i;
3010 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
3011
3012 for (i = 0; i < adev->usec_timeout; i++) {
3013 if (gfx_v6_0_is_idle(handle))
3014 return 0;
3015 udelay(1);
3016 }
3017 return -ETIMEDOUT;
3018}
3019
3020static int gfx_v6_0_soft_reset(void *handle)
3021{
3022 return 0;
3023}
3024
3025static void gfx_v6_0_set_gfx_eop_interrupt_state(struct amdgpu_device *adev,
3026 enum amdgpu_interrupt_state state)
3027{
3028 u32 cp_int_cntl;
3029
3030 switch (state) {
3031 case AMDGPU_IRQ_STATE_DISABLE:
3032 cp_int_cntl = RREG32(CP_INT_CNTL_RING0);
3033 cp_int_cntl &= ~CP_INT_CNTL_RING__TIME_STAMP_INT_ENABLE_MASK;
3034 WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
3035 break;
3036 case AMDGPU_IRQ_STATE_ENABLE:
3037 cp_int_cntl = RREG32(CP_INT_CNTL_RING0);
3038 cp_int_cntl |= CP_INT_CNTL_RING__TIME_STAMP_INT_ENABLE_MASK;
3039 WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
3040 break;
3041 default:
3042 break;
3043 }
3044}
3045
3046static void gfx_v6_0_set_compute_eop_interrupt_state(struct amdgpu_device *adev,
3047 int ring,
3048 enum amdgpu_interrupt_state state)
3049{
3050 u32 cp_int_cntl;
3051 switch (state){
3052 case AMDGPU_IRQ_STATE_DISABLE:
3053 if (ring == 0) {
3054 cp_int_cntl = RREG32(CP_INT_CNTL_RING1);
3055 cp_int_cntl &= ~CP_INT_CNTL_RING__TIME_STAMP_INT_ENABLE_MASK;
3056 WREG32(CP_INT_CNTL_RING1, cp_int_cntl);
3057 break;
3058 } else {
3059 cp_int_cntl = RREG32(CP_INT_CNTL_RING2);
3060 cp_int_cntl &= ~CP_INT_CNTL_RING__TIME_STAMP_INT_ENABLE_MASK;
3061 WREG32(CP_INT_CNTL_RING2, cp_int_cntl);
3062 break;
3063
3064 }
3065 case AMDGPU_IRQ_STATE_ENABLE:
3066 if (ring == 0) {
3067 cp_int_cntl = RREG32(CP_INT_CNTL_RING1);
3068 cp_int_cntl |= CP_INT_CNTL_RING__TIME_STAMP_INT_ENABLE_MASK;
3069 WREG32(CP_INT_CNTL_RING1, cp_int_cntl);
3070 break;
3071 } else {
3072 cp_int_cntl = RREG32(CP_INT_CNTL_RING2);
3073 cp_int_cntl |= CP_INT_CNTL_RING__TIME_STAMP_INT_ENABLE_MASK;
3074 WREG32(CP_INT_CNTL_RING2, cp_int_cntl);
3075 break;
3076
3077 }
3078
3079 default:
3080 BUG();
3081 break;
3082
3083 }
3084}
3085
3086static int gfx_v6_0_set_priv_reg_fault_state(struct amdgpu_device *adev,
3087 struct amdgpu_irq_src *src,
3088 unsigned type,
3089 enum amdgpu_interrupt_state state)
3090{
3091 u32 cp_int_cntl;
3092
3093 switch (state) {
3094 case AMDGPU_IRQ_STATE_DISABLE:
3095 cp_int_cntl = RREG32(CP_INT_CNTL_RING0);
3096 cp_int_cntl &= ~CP_INT_CNTL_RING0__PRIV_REG_INT_ENABLE_MASK;
3097 WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
3098 break;
3099 case AMDGPU_IRQ_STATE_ENABLE:
3100 cp_int_cntl = RREG32(CP_INT_CNTL_RING0);
3101 cp_int_cntl |= CP_INT_CNTL_RING0__PRIV_REG_INT_ENABLE_MASK;
3102 WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
3103 break;
3104 default:
3105 break;
3106 }
3107
3108 return 0;
3109}
3110
3111static int gfx_v6_0_set_priv_inst_fault_state(struct amdgpu_device *adev,
3112 struct amdgpu_irq_src *src,
3113 unsigned type,
3114 enum amdgpu_interrupt_state state)
3115{
3116 u32 cp_int_cntl;
3117
3118 switch (state) {
3119 case AMDGPU_IRQ_STATE_DISABLE:
3120 cp_int_cntl = RREG32(CP_INT_CNTL_RING0);
3121 cp_int_cntl &= ~CP_INT_CNTL_RING0__PRIV_INSTR_INT_ENABLE_MASK;
3122 WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
3123 break;
3124 case AMDGPU_IRQ_STATE_ENABLE:
3125 cp_int_cntl = RREG32(CP_INT_CNTL_RING0);
3126 cp_int_cntl |= CP_INT_CNTL_RING0__PRIV_INSTR_INT_ENABLE_MASK;
3127 WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
3128 break;
3129 default:
3130 break;
3131 }
3132
3133 return 0;
3134}
3135
3136static int gfx_v6_0_set_eop_interrupt_state(struct amdgpu_device *adev,
3137 struct amdgpu_irq_src *src,
3138 unsigned type,
3139 enum amdgpu_interrupt_state state)
3140{
3141 switch (type) {
3142 case AMDGPU_CP_IRQ_GFX_EOP:
3143 gfx_v6_0_set_gfx_eop_interrupt_state(adev, state);
3144 break;
3145 case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP:
3146 gfx_v6_0_set_compute_eop_interrupt_state(adev, 0, state);
3147 break;
3148 case AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE1_EOP:
3149 gfx_v6_0_set_compute_eop_interrupt_state(adev, 1, state);
3150 break;
3151 default:
3152 break;
3153 }
3154 return 0;
3155}
3156
3157static int gfx_v6_0_eop_irq(struct amdgpu_device *adev,
3158 struct amdgpu_irq_src *source,
3159 struct amdgpu_iv_entry *entry)
3160{
3161 switch (entry->ring_id) {
3162 case 0:
3163 amdgpu_fence_process(&adev->gfx.gfx_ring[0]);
3164 break;
3165 case 1:
3166 case 2:
3167 amdgpu_fence_process(&adev->gfx.compute_ring[entry->ring_id -1]);
3168 break;
3169 default:
3170 break;
3171 }
3172 return 0;
3173}
3174
3175static int gfx_v6_0_priv_reg_irq(struct amdgpu_device *adev,
3176 struct amdgpu_irq_src *source,
3177 struct amdgpu_iv_entry *entry)
3178{
3179 DRM_ERROR("Illegal register access in command stream\n");
3180 schedule_work(&adev->reset_work);
3181 return 0;
3182}
3183
3184static int gfx_v6_0_priv_inst_irq(struct amdgpu_device *adev,
3185 struct amdgpu_irq_src *source,
3186 struct amdgpu_iv_entry *entry)
3187{
3188 DRM_ERROR("Illegal instruction in command stream\n");
3189 schedule_work(&adev->reset_work);
3190 return 0;
3191}
3192
3193static int gfx_v6_0_set_clockgating_state(void *handle,
3194 enum amd_clockgating_state state)
3195{
3196 bool gate = false;
3197 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
3198
3199 if (state == AMD_CG_STATE_GATE)
3200 gate = true;
3201
3202 gfx_v6_0_enable_gui_idle_interrupt(adev, false);
3203 if (gate) {
3204 gfx_v6_0_enable_mgcg(adev, true);
3205 gfx_v6_0_enable_cgcg(adev, true);
3206 } else {
3207 gfx_v6_0_enable_cgcg(adev, false);
3208 gfx_v6_0_enable_mgcg(adev, false);
3209 }
3210 gfx_v6_0_enable_gui_idle_interrupt(adev, true);
3211
3212 return 0;
3213}
3214
3215static int gfx_v6_0_set_powergating_state(void *handle,
3216 enum amd_powergating_state state)
3217{
3218 bool gate = false;
3219 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
3220
3221 if (state == AMD_PG_STATE_GATE)
3222 gate = true;
3223
3224 if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG |
3225 AMD_PG_SUPPORT_GFX_SMG |
3226 AMD_PG_SUPPORT_GFX_DMG |
3227 AMD_PG_SUPPORT_CP |
3228 AMD_PG_SUPPORT_GDS |
3229 AMD_PG_SUPPORT_RLC_SMU_HS)) {
3230 gfx_v6_0_update_gfx_pg(adev, gate);
3231 if (adev->pg_flags & AMD_PG_SUPPORT_GFX_PG) {
3232 gfx_v6_0_enable_cp_pg(adev, gate);
3233 gfx_v6_0_enable_gds_pg(adev, gate);
3234 }
3235 }
3236
3237 return 0;
3238}
3239
3240const struct amd_ip_funcs gfx_v6_0_ip_funcs = {
3241 .name = "gfx_v6_0",
3242 .early_init = gfx_v6_0_early_init,
3243 .late_init = NULL,
3244 .sw_init = gfx_v6_0_sw_init,
3245 .sw_fini = gfx_v6_0_sw_fini,
3246 .hw_init = gfx_v6_0_hw_init,
3247 .hw_fini = gfx_v6_0_hw_fini,
3248 .suspend = gfx_v6_0_suspend,
3249 .resume = gfx_v6_0_resume,
3250 .is_idle = gfx_v6_0_is_idle,
3251 .wait_for_idle = gfx_v6_0_wait_for_idle,
3252 .soft_reset = gfx_v6_0_soft_reset,
3253 .set_clockgating_state = gfx_v6_0_set_clockgating_state,
3254 .set_powergating_state = gfx_v6_0_set_powergating_state,
3255};
3256
3257static const struct amdgpu_ring_funcs gfx_v6_0_ring_funcs_gfx = {
3258 .get_rptr = gfx_v6_0_ring_get_rptr,
3259 .get_wptr = gfx_v6_0_ring_get_wptr,
3260 .set_wptr = gfx_v6_0_ring_set_wptr_gfx,
3261 .parse_cs = NULL,
3262 .emit_ib = gfx_v6_0_ring_emit_ib,
3263 .emit_fence = gfx_v6_0_ring_emit_fence,
3264 .emit_pipeline_sync = gfx_v6_0_ring_emit_pipeline_sync,
3265 .emit_vm_flush = gfx_v6_0_ring_emit_vm_flush,
3266 .emit_hdp_flush = gfx_v6_0_ring_emit_hdp_flush,
3267 .emit_hdp_invalidate = gfx_v6_0_ring_emit_hdp_invalidate,
3268 .test_ring = gfx_v6_0_ring_test_ring,
3269 .test_ib = gfx_v6_0_ring_test_ib,
3270 .insert_nop = amdgpu_ring_insert_nop,
3271 .emit_cntxcntl = gfx_v6_ring_emit_cntxcntl,
3272 .get_emit_ib_size = gfx_v6_0_ring_get_emit_ib_size,
3273 .get_dma_frame_size = gfx_v6_0_ring_get_dma_frame_size_gfx,
3274};
3275
3276static const struct amdgpu_ring_funcs gfx_v6_0_ring_funcs_compute = {
3277 .get_rptr = gfx_v6_0_ring_get_rptr,
3278 .get_wptr = gfx_v6_0_ring_get_wptr,
3279 .set_wptr = gfx_v6_0_ring_set_wptr_compute,
3280 .parse_cs = NULL,
3281 .emit_ib = gfx_v6_0_ring_emit_ib,
3282 .emit_fence = gfx_v6_0_ring_emit_fence,
3283 .emit_pipeline_sync = gfx_v6_0_ring_emit_pipeline_sync,
3284 .emit_vm_flush = gfx_v6_0_ring_emit_vm_flush,
3285 .emit_hdp_flush = gfx_v6_0_ring_emit_hdp_flush,
3286 .emit_hdp_invalidate = gfx_v6_0_ring_emit_hdp_invalidate,
3287 .test_ring = gfx_v6_0_ring_test_ring,
3288 .test_ib = gfx_v6_0_ring_test_ib,
3289 .insert_nop = amdgpu_ring_insert_nop,
3290 .get_emit_ib_size = gfx_v6_0_ring_get_emit_ib_size,
3291 .get_dma_frame_size = gfx_v6_0_ring_get_dma_frame_size_compute,
3292};
3293
3294static void gfx_v6_0_set_ring_funcs(struct amdgpu_device *adev)
3295{
3296 int i;
3297
3298 for (i = 0; i < adev->gfx.num_gfx_rings; i++)
3299 adev->gfx.gfx_ring[i].funcs = &gfx_v6_0_ring_funcs_gfx;
3300 for (i = 0; i < adev->gfx.num_compute_rings; i++)
3301 adev->gfx.compute_ring[i].funcs = &gfx_v6_0_ring_funcs_compute;
3302}
3303
3304static const struct amdgpu_irq_src_funcs gfx_v6_0_eop_irq_funcs = {
3305 .set = gfx_v6_0_set_eop_interrupt_state,
3306 .process = gfx_v6_0_eop_irq,
3307};
3308
3309static const struct amdgpu_irq_src_funcs gfx_v6_0_priv_reg_irq_funcs = {
3310 .set = gfx_v6_0_set_priv_reg_fault_state,
3311 .process = gfx_v6_0_priv_reg_irq,
3312};
3313
3314static const struct amdgpu_irq_src_funcs gfx_v6_0_priv_inst_irq_funcs = {
3315 .set = gfx_v6_0_set_priv_inst_fault_state,
3316 .process = gfx_v6_0_priv_inst_irq,
3317};
3318
3319static void gfx_v6_0_set_irq_funcs(struct amdgpu_device *adev)
3320{
3321 adev->gfx.eop_irq.num_types = AMDGPU_CP_IRQ_LAST;
3322 adev->gfx.eop_irq.funcs = &gfx_v6_0_eop_irq_funcs;
3323
3324 adev->gfx.priv_reg_irq.num_types = 1;
3325 adev->gfx.priv_reg_irq.funcs = &gfx_v6_0_priv_reg_irq_funcs;
3326
3327 adev->gfx.priv_inst_irq.num_types = 1;
3328 adev->gfx.priv_inst_irq.funcs = &gfx_v6_0_priv_inst_irq_funcs;
3329}
3330
3331static void gfx_v6_0_get_cu_info(struct amdgpu_device *adev)
3332{
3333 int i, j, k, counter, active_cu_number = 0;
3334 u32 mask, bitmap, ao_bitmap, ao_cu_mask = 0;
3335 struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info;
3336
3337 memset(cu_info, 0, sizeof(*cu_info));
3338
3339 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
3340 for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) {
3341 mask = 1;
3342 ao_bitmap = 0;
3343 counter = 0;
3344 bitmap = gfx_v6_0_get_cu_active_bitmap(adev, i, j);
3345 cu_info->bitmap[i][j] = bitmap;
3346
3347 for (k = 0; k < adev->gfx.config.max_cu_per_sh; k ++) {
3348 if (bitmap & mask) {
3349 if (counter < 2)
3350 ao_bitmap |= mask;
3351 counter ++;
3352 }
3353 mask <<= 1;
3354 }
3355 active_cu_number += counter;
3356 ao_cu_mask |= (ao_bitmap << (i * 16 + j * 8));
3357 }
3358 }
3359
3360 cu_info->number = active_cu_number;
3361 cu_info->ao_cu_mask = ao_cu_mask;
3362}
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.h b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.h
new file mode 100644
index 000000000000..b9657e72b248
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.h
@@ -0,0 +1,29 @@
1/*
2 * Copyright 2015 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23
24#ifndef __GFX_V6_0_H__
25#define __GFX_V6_0_H__
26
27extern const struct amd_ip_funcs gfx_v6_0_ip_funcs;
28
29#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
index 425413fcaf02..71116da9e782 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
@@ -1645,6 +1645,147 @@ static u32 gfx_v7_0_get_rb_active_bitmap(struct amdgpu_device *adev)
1645 return (~data) & mask; 1645 return (~data) & mask;
1646} 1646}
1647 1647
1648static void
1649gfx_v7_0_raster_config(struct amdgpu_device *adev, u32 *rconf, u32 *rconf1)
1650{
1651 switch (adev->asic_type) {
1652 case CHIP_BONAIRE:
1653 *rconf |= RB_MAP_PKR0(2) | RB_XSEL2(1) | SE_MAP(2) |
1654 SE_XSEL(1) | SE_YSEL(1);
1655 *rconf1 |= 0x0;
1656 break;
1657 case CHIP_HAWAII:
1658 *rconf |= RB_MAP_PKR0(2) | RB_MAP_PKR1(2) |
1659 RB_XSEL2(1) | PKR_MAP(2) | PKR_XSEL(1) |
1660 PKR_YSEL(1) | SE_MAP(2) | SE_XSEL(2) |
1661 SE_YSEL(3);
1662 *rconf1 |= SE_PAIR_MAP(2) | SE_PAIR_XSEL(3) |
1663 SE_PAIR_YSEL(2);
1664 break;
1665 case CHIP_KAVERI:
1666 *rconf |= RB_MAP_PKR0(2);
1667 *rconf1 |= 0x0;
1668 break;
1669 case CHIP_KABINI:
1670 case CHIP_MULLINS:
1671 *rconf |= 0x0;
1672 *rconf1 |= 0x0;
1673 break;
1674 default:
1675 DRM_ERROR("unknown asic: 0x%x\n", adev->asic_type);
1676 break;
1677 }
1678}
1679
1680static void
1681gfx_v7_0_write_harvested_raster_configs(struct amdgpu_device *adev,
1682 u32 raster_config, u32 raster_config_1,
1683 unsigned rb_mask, unsigned num_rb)
1684{
1685 unsigned sh_per_se = max_t(unsigned, adev->gfx.config.max_sh_per_se, 1);
1686 unsigned num_se = max_t(unsigned, adev->gfx.config.max_shader_engines, 1);
1687 unsigned rb_per_pkr = min_t(unsigned, num_rb / num_se / sh_per_se, 2);
1688 unsigned rb_per_se = num_rb / num_se;
1689 unsigned se_mask[4];
1690 unsigned se;
1691
1692 se_mask[0] = ((1 << rb_per_se) - 1) & rb_mask;
1693 se_mask[1] = (se_mask[0] << rb_per_se) & rb_mask;
1694 se_mask[2] = (se_mask[1] << rb_per_se) & rb_mask;
1695 se_mask[3] = (se_mask[2] << rb_per_se) & rb_mask;
1696
1697 WARN_ON(!(num_se == 1 || num_se == 2 || num_se == 4));
1698 WARN_ON(!(sh_per_se == 1 || sh_per_se == 2));
1699 WARN_ON(!(rb_per_pkr == 1 || rb_per_pkr == 2));
1700
1701 if ((num_se > 2) && ((!se_mask[0] && !se_mask[1]) ||
1702 (!se_mask[2] && !se_mask[3]))) {
1703 raster_config_1 &= ~SE_PAIR_MAP_MASK;
1704
1705 if (!se_mask[0] && !se_mask[1]) {
1706 raster_config_1 |=
1707 SE_PAIR_MAP(RASTER_CONFIG_SE_PAIR_MAP_3);
1708 } else {
1709 raster_config_1 |=
1710 SE_PAIR_MAP(RASTER_CONFIG_SE_PAIR_MAP_0);
1711 }
1712 }
1713
1714 for (se = 0; se < num_se; se++) {
1715 unsigned raster_config_se = raster_config;
1716 unsigned pkr0_mask = ((1 << rb_per_pkr) - 1) << (se * rb_per_se);
1717 unsigned pkr1_mask = pkr0_mask << rb_per_pkr;
1718 int idx = (se / 2) * 2;
1719
1720 if ((num_se > 1) && (!se_mask[idx] || !se_mask[idx + 1])) {
1721 raster_config_se &= ~SE_MAP_MASK;
1722
1723 if (!se_mask[idx]) {
1724 raster_config_se |= SE_MAP(RASTER_CONFIG_SE_MAP_3);
1725 } else {
1726 raster_config_se |= SE_MAP(RASTER_CONFIG_SE_MAP_0);
1727 }
1728 }
1729
1730 pkr0_mask &= rb_mask;
1731 pkr1_mask &= rb_mask;
1732 if (rb_per_se > 2 && (!pkr0_mask || !pkr1_mask)) {
1733 raster_config_se &= ~PKR_MAP_MASK;
1734
1735 if (!pkr0_mask) {
1736 raster_config_se |= PKR_MAP(RASTER_CONFIG_PKR_MAP_3);
1737 } else {
1738 raster_config_se |= PKR_MAP(RASTER_CONFIG_PKR_MAP_0);
1739 }
1740 }
1741
1742 if (rb_per_se >= 2) {
1743 unsigned rb0_mask = 1 << (se * rb_per_se);
1744 unsigned rb1_mask = rb0_mask << 1;
1745
1746 rb0_mask &= rb_mask;
1747 rb1_mask &= rb_mask;
1748 if (!rb0_mask || !rb1_mask) {
1749 raster_config_se &= ~RB_MAP_PKR0_MASK;
1750
1751 if (!rb0_mask) {
1752 raster_config_se |=
1753 RB_MAP_PKR0(RASTER_CONFIG_RB_MAP_3);
1754 } else {
1755 raster_config_se |=
1756 RB_MAP_PKR0(RASTER_CONFIG_RB_MAP_0);
1757 }
1758 }
1759
1760 if (rb_per_se > 2) {
1761 rb0_mask = 1 << (se * rb_per_se + rb_per_pkr);
1762 rb1_mask = rb0_mask << 1;
1763 rb0_mask &= rb_mask;
1764 rb1_mask &= rb_mask;
1765 if (!rb0_mask || !rb1_mask) {
1766 raster_config_se &= ~RB_MAP_PKR1_MASK;
1767
1768 if (!rb0_mask) {
1769 raster_config_se |=
1770 RB_MAP_PKR1(RASTER_CONFIG_RB_MAP_3);
1771 } else {
1772 raster_config_se |=
1773 RB_MAP_PKR1(RASTER_CONFIG_RB_MAP_0);
1774 }
1775 }
1776 }
1777 }
1778
1779 /* GRBM_GFX_INDEX has a different offset on CI+ */
1780 gfx_v7_0_select_se_sh(adev, se, 0xffffffff, 0xffffffff);
1781 WREG32(mmPA_SC_RASTER_CONFIG, raster_config_se);
1782 WREG32(mmPA_SC_RASTER_CONFIG_1, raster_config_1);
1783 }
1784
1785 /* GRBM_GFX_INDEX has a different offset on CI+ */
1786 gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1787}
1788
1648/** 1789/**
1649 * gfx_v7_0_setup_rb - setup the RBs on the asic 1790 * gfx_v7_0_setup_rb - setup the RBs on the asic
1650 * 1791 *
@@ -1658,9 +1799,11 @@ static void gfx_v7_0_setup_rb(struct amdgpu_device *adev)
1658{ 1799{
1659 int i, j; 1800 int i, j;
1660 u32 data; 1801 u32 data;
1802 u32 raster_config = 0, raster_config_1 = 0;
1661 u32 active_rbs = 0; 1803 u32 active_rbs = 0;
1662 u32 rb_bitmap_width_per_sh = adev->gfx.config.max_backends_per_se / 1804 u32 rb_bitmap_width_per_sh = adev->gfx.config.max_backends_per_se /
1663 adev->gfx.config.max_sh_per_se; 1805 adev->gfx.config.max_sh_per_se;
1806 unsigned num_rb_pipes;
1664 1807
1665 mutex_lock(&adev->grbm_idx_mutex); 1808 mutex_lock(&adev->grbm_idx_mutex);
1666 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { 1809 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
@@ -1672,10 +1815,25 @@ static void gfx_v7_0_setup_rb(struct amdgpu_device *adev)
1672 } 1815 }
1673 } 1816 }
1674 gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); 1817 gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1675 mutex_unlock(&adev->grbm_idx_mutex);
1676 1818
1677 adev->gfx.config.backend_enable_mask = active_rbs; 1819 adev->gfx.config.backend_enable_mask = active_rbs;
1678 adev->gfx.config.num_rbs = hweight32(active_rbs); 1820 adev->gfx.config.num_rbs = hweight32(active_rbs);
1821
1822 num_rb_pipes = min_t(unsigned, adev->gfx.config.max_backends_per_se *
1823 adev->gfx.config.max_shader_engines, 16);
1824
1825 gfx_v7_0_raster_config(adev, &raster_config, &raster_config_1);
1826
1827 if (!adev->gfx.config.backend_enable_mask ||
1828 adev->gfx.config.num_rbs >= num_rb_pipes) {
1829 WREG32(mmPA_SC_RASTER_CONFIG, raster_config);
1830 WREG32(mmPA_SC_RASTER_CONFIG_1, raster_config_1);
1831 } else {
1832 gfx_v7_0_write_harvested_raster_configs(adev, raster_config, raster_config_1,
1833 adev->gfx.config.backend_enable_mask,
1834 num_rb_pipes);
1835 }
1836 mutex_unlock(&adev->grbm_idx_mutex);
1679} 1837}
1680 1838
1681/** 1839/**
@@ -2096,6 +2254,25 @@ static void gfx_v7_0_ring_emit_ib_compute(struct amdgpu_ring *ring,
2096 amdgpu_ring_write(ring, control); 2254 amdgpu_ring_write(ring, control);
2097} 2255}
2098 2256
2257static void gfx_v7_ring_emit_cntxcntl(struct amdgpu_ring *ring, uint32_t flags)
2258{
2259 uint32_t dw2 = 0;
2260
2261 dw2 |= 0x80000000; /* set load_enable otherwise this package is just NOPs */
2262 if (flags & AMDGPU_HAVE_CTX_SWITCH) {
2263 /* set load_global_config & load_global_uconfig */
2264 dw2 |= 0x8001;
2265 /* set load_cs_sh_regs */
2266 dw2 |= 0x01000000;
2267 /* set load_per_context_state & load_gfx_sh_regs */
2268 dw2 |= 0x10002;
2269 }
2270
2271 amdgpu_ring_write(ring, PACKET3(PACKET3_CONTEXT_CONTROL, 1));
2272 amdgpu_ring_write(ring, dw2);
2273 amdgpu_ring_write(ring, 0);
2274}
2275
2099/** 2276/**
2100 * gfx_v7_0_ring_test_ib - basic ring IB test 2277 * gfx_v7_0_ring_test_ib - basic ring IB test
2101 * 2278 *
@@ -2443,7 +2620,7 @@ static int gfx_v7_0_cp_gfx_resume(struct amdgpu_device *adev)
2443 return 0; 2620 return 0;
2444} 2621}
2445 2622
2446static u32 gfx_v7_0_ring_get_rptr_gfx(struct amdgpu_ring *ring) 2623static u32 gfx_v7_0_ring_get_rptr(struct amdgpu_ring *ring)
2447{ 2624{
2448 return ring->adev->wb.wb[ring->rptr_offs]; 2625 return ring->adev->wb.wb[ring->rptr_offs];
2449} 2626}
@@ -2463,11 +2640,6 @@ static void gfx_v7_0_ring_set_wptr_gfx(struct amdgpu_ring *ring)
2463 (void)RREG32(mmCP_RB0_WPTR); 2640 (void)RREG32(mmCP_RB0_WPTR);
2464} 2641}
2465 2642
2466static u32 gfx_v7_0_ring_get_rptr_compute(struct amdgpu_ring *ring)
2467{
2468 return ring->adev->wb.wb[ring->rptr_offs];
2469}
2470
2471static u32 gfx_v7_0_ring_get_wptr_compute(struct amdgpu_ring *ring) 2643static u32 gfx_v7_0_ring_get_wptr_compute(struct amdgpu_ring *ring)
2472{ 2644{
2473 /* XXX check if swapping is necessary on BE */ 2645 /* XXX check if swapping is necessary on BE */
@@ -4182,6 +4354,41 @@ static void gfx_v7_0_ring_emit_gds_switch(struct amdgpu_ring *ring,
4182 amdgpu_ring_write(ring, (1 << (oa_size + oa_base)) - (1 << oa_base)); 4354 amdgpu_ring_write(ring, (1 << (oa_size + oa_base)) - (1 << oa_base));
4183} 4355}
4184 4356
4357static unsigned gfx_v7_0_ring_get_emit_ib_size_gfx(struct amdgpu_ring *ring)
4358{
4359 return
4360 4; /* gfx_v7_0_ring_emit_ib_gfx */
4361}
4362
4363static unsigned gfx_v7_0_ring_get_dma_frame_size_gfx(struct amdgpu_ring *ring)
4364{
4365 return
4366 20 + /* gfx_v7_0_ring_emit_gds_switch */
4367 7 + /* gfx_v7_0_ring_emit_hdp_flush */
4368 5 + /* gfx_v7_0_ring_emit_hdp_invalidate */
4369 12 + 12 + 12 + /* gfx_v7_0_ring_emit_fence_gfx x3 for user fence, vm fence */
4370 7 + 4 + /* gfx_v7_0_ring_emit_pipeline_sync */
4371 17 + 6 + /* gfx_v7_0_ring_emit_vm_flush */
4372 3; /* gfx_v7_ring_emit_cntxcntl */
4373}
4374
4375static unsigned gfx_v7_0_ring_get_emit_ib_size_compute(struct amdgpu_ring *ring)
4376{
4377 return
4378 4; /* gfx_v7_0_ring_emit_ib_compute */
4379}
4380
4381static unsigned gfx_v7_0_ring_get_dma_frame_size_compute(struct amdgpu_ring *ring)
4382{
4383 return
4384 20 + /* gfx_v7_0_ring_emit_gds_switch */
4385 7 + /* gfx_v7_0_ring_emit_hdp_flush */
4386 5 + /* gfx_v7_0_ring_emit_hdp_invalidate */
4387 7 + /* gfx_v7_0_ring_emit_pipeline_sync */
4388 17 + /* gfx_v7_0_ring_emit_vm_flush */
4389 7 + 7 + 7; /* gfx_v7_0_ring_emit_fence_compute x3 for user fence, vm fence */
4390}
4391
4185static const struct amdgpu_gfx_funcs gfx_v7_0_gfx_funcs = { 4392static const struct amdgpu_gfx_funcs gfx_v7_0_gfx_funcs = {
4186 .get_gpu_clock_counter = &gfx_v7_0_get_gpu_clock_counter, 4393 .get_gpu_clock_counter = &gfx_v7_0_get_gpu_clock_counter,
4187 .select_se_sh = &gfx_v7_0_select_se_sh, 4394 .select_se_sh = &gfx_v7_0_select_se_sh,
@@ -4471,24 +4678,21 @@ static int gfx_v7_0_sw_init(void *handle)
4471 } 4678 }
4472 4679
4473 /* reserve GDS, GWS and OA resource for gfx */ 4680 /* reserve GDS, GWS and OA resource for gfx */
4474 r = amdgpu_bo_create(adev, adev->gds.mem.gfx_partition_size, 4681 r = amdgpu_bo_create_kernel(adev, adev->gds.mem.gfx_partition_size,
4475 PAGE_SIZE, true, 4682 PAGE_SIZE, AMDGPU_GEM_DOMAIN_GDS,
4476 AMDGPU_GEM_DOMAIN_GDS, 0, 4683 &adev->gds.gds_gfx_bo, NULL, NULL);
4477 NULL, NULL, &adev->gds.gds_gfx_bo);
4478 if (r) 4684 if (r)
4479 return r; 4685 return r;
4480 4686
4481 r = amdgpu_bo_create(adev, adev->gds.gws.gfx_partition_size, 4687 r = amdgpu_bo_create_kernel(adev, adev->gds.gws.gfx_partition_size,
4482 PAGE_SIZE, true, 4688 PAGE_SIZE, AMDGPU_GEM_DOMAIN_GWS,
4483 AMDGPU_GEM_DOMAIN_GWS, 0, 4689 &adev->gds.gws_gfx_bo, NULL, NULL);
4484 NULL, NULL, &adev->gds.gws_gfx_bo);
4485 if (r) 4690 if (r)
4486 return r; 4691 return r;
4487 4692
4488 r = amdgpu_bo_create(adev, adev->gds.oa.gfx_partition_size, 4693 r = amdgpu_bo_create_kernel(adev, adev->gds.oa.gfx_partition_size,
4489 PAGE_SIZE, true, 4694 PAGE_SIZE, AMDGPU_GEM_DOMAIN_OA,
4490 AMDGPU_GEM_DOMAIN_OA, 0, 4695 &adev->gds.oa_gfx_bo, NULL, NULL);
4491 NULL, NULL, &adev->gds.oa_gfx_bo);
4492 if (r) 4696 if (r)
4493 return r; 4697 return r;
4494 4698
@@ -4504,9 +4708,9 @@ static int gfx_v7_0_sw_fini(void *handle)
4504 int i; 4708 int i;
4505 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 4709 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
4506 4710
4507 amdgpu_bo_unref(&adev->gds.oa_gfx_bo); 4711 amdgpu_bo_free_kernel(&adev->gds.oa_gfx_bo, NULL, NULL);
4508 amdgpu_bo_unref(&adev->gds.gws_gfx_bo); 4712 amdgpu_bo_free_kernel(&adev->gds.gws_gfx_bo, NULL, NULL);
4509 amdgpu_bo_unref(&adev->gds.gds_gfx_bo); 4713 amdgpu_bo_free_kernel(&adev->gds.gds_gfx_bo, NULL, NULL);
4510 4714
4511 for (i = 0; i < adev->gfx.num_gfx_rings; i++) 4715 for (i = 0; i < adev->gfx.num_gfx_rings; i++)
4512 amdgpu_ring_fini(&adev->gfx.gfx_ring[i]); 4716 amdgpu_ring_fini(&adev->gfx.gfx_ring[i]);
@@ -4937,7 +5141,7 @@ const struct amd_ip_funcs gfx_v7_0_ip_funcs = {
4937}; 5141};
4938 5142
4939static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_gfx = { 5143static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_gfx = {
4940 .get_rptr = gfx_v7_0_ring_get_rptr_gfx, 5144 .get_rptr = gfx_v7_0_ring_get_rptr,
4941 .get_wptr = gfx_v7_0_ring_get_wptr_gfx, 5145 .get_wptr = gfx_v7_0_ring_get_wptr_gfx,
4942 .set_wptr = gfx_v7_0_ring_set_wptr_gfx, 5146 .set_wptr = gfx_v7_0_ring_set_wptr_gfx,
4943 .parse_cs = NULL, 5147 .parse_cs = NULL,
@@ -4952,10 +5156,13 @@ static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_gfx = {
4952 .test_ib = gfx_v7_0_ring_test_ib, 5156 .test_ib = gfx_v7_0_ring_test_ib,
4953 .insert_nop = amdgpu_ring_insert_nop, 5157 .insert_nop = amdgpu_ring_insert_nop,
4954 .pad_ib = amdgpu_ring_generic_pad_ib, 5158 .pad_ib = amdgpu_ring_generic_pad_ib,
5159 .emit_cntxcntl = gfx_v7_ring_emit_cntxcntl,
5160 .get_emit_ib_size = gfx_v7_0_ring_get_emit_ib_size_gfx,
5161 .get_dma_frame_size = gfx_v7_0_ring_get_dma_frame_size_gfx,
4955}; 5162};
4956 5163
4957static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_compute = { 5164static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_compute = {
4958 .get_rptr = gfx_v7_0_ring_get_rptr_compute, 5165 .get_rptr = gfx_v7_0_ring_get_rptr,
4959 .get_wptr = gfx_v7_0_ring_get_wptr_compute, 5166 .get_wptr = gfx_v7_0_ring_get_wptr_compute,
4960 .set_wptr = gfx_v7_0_ring_set_wptr_compute, 5167 .set_wptr = gfx_v7_0_ring_set_wptr_compute,
4961 .parse_cs = NULL, 5168 .parse_cs = NULL,
@@ -4970,6 +5177,8 @@ static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_compute = {
4970 .test_ib = gfx_v7_0_ring_test_ib, 5177 .test_ib = gfx_v7_0_ring_test_ib,
4971 .insert_nop = amdgpu_ring_insert_nop, 5178 .insert_nop = amdgpu_ring_insert_nop,
4972 .pad_ib = amdgpu_ring_generic_pad_ib, 5179 .pad_ib = amdgpu_ring_generic_pad_ib,
5180 .get_emit_ib_size = gfx_v7_0_ring_get_emit_ib_size_compute,
5181 .get_dma_frame_size = gfx_v7_0_ring_get_dma_frame_size_compute,
4973}; 5182};
4974 5183
4975static void gfx_v7_0_set_ring_funcs(struct amdgpu_device *adev) 5184static void gfx_v7_0_set_ring_funcs(struct amdgpu_device *adev)
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index b8184617ca25..6c6ff57b1c95 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -703,7 +703,10 @@ static void gfx_v8_0_init_golden_registers(struct amdgpu_device *adev)
703 polaris10_golden_common_all, 703 polaris10_golden_common_all,
704 (const u32)ARRAY_SIZE(polaris10_golden_common_all)); 704 (const u32)ARRAY_SIZE(polaris10_golden_common_all));
705 WREG32_SMC(ixCG_ACLK_CNTL, 0x0000001C); 705 WREG32_SMC(ixCG_ACLK_CNTL, 0x0000001C);
706 if (adev->pdev->revision == 0xc7) { 706 if (adev->pdev->revision == 0xc7 &&
707 ((adev->pdev->subsystem_device == 0xb37 && adev->pdev->subsystem_vendor == 0x1002) ||
708 (adev->pdev->subsystem_device == 0x4a8 && adev->pdev->subsystem_vendor == 0x1043) ||
709 (adev->pdev->subsystem_device == 0x9480 && adev->pdev->subsystem_vendor == 0x1682))) {
707 amdgpu_atombios_i2c_channel_trans(adev, 0x10, 0x96, 0x1E, 0xDD); 710 amdgpu_atombios_i2c_channel_trans(adev, 0x10, 0x96, 0x1E, 0xDD);
708 amdgpu_atombios_i2c_channel_trans(adev, 0x10, 0x96, 0x1F, 0xD0); 711 amdgpu_atombios_i2c_channel_trans(adev, 0x10, 0x96, 0x1F, 0xD0);
709 } 712 }
@@ -1233,10 +1236,9 @@ static void gfx_v8_0_rlc_fini(struct amdgpu_device *adev)
1233 if (adev->gfx.rlc.clear_state_obj) { 1236 if (adev->gfx.rlc.clear_state_obj) {
1234 r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, false); 1237 r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, false);
1235 if (unlikely(r != 0)) 1238 if (unlikely(r != 0))
1236 dev_warn(adev->dev, "(%d) reserve RLC c bo failed\n", r); 1239 dev_warn(adev->dev, "(%d) reserve RLC cbs bo failed\n", r);
1237 amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj); 1240 amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj);
1238 amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj); 1241 amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
1239
1240 amdgpu_bo_unref(&adev->gfx.rlc.clear_state_obj); 1242 amdgpu_bo_unref(&adev->gfx.rlc.clear_state_obj);
1241 adev->gfx.rlc.clear_state_obj = NULL; 1243 adev->gfx.rlc.clear_state_obj = NULL;
1242 } 1244 }
@@ -1248,7 +1250,6 @@ static void gfx_v8_0_rlc_fini(struct amdgpu_device *adev)
1248 dev_warn(adev->dev, "(%d) reserve RLC cp table bo failed\n", r); 1250 dev_warn(adev->dev, "(%d) reserve RLC cp table bo failed\n", r);
1249 amdgpu_bo_unpin(adev->gfx.rlc.cp_table_obj); 1251 amdgpu_bo_unpin(adev->gfx.rlc.cp_table_obj);
1250 amdgpu_bo_unreserve(adev->gfx.rlc.cp_table_obj); 1252 amdgpu_bo_unreserve(adev->gfx.rlc.cp_table_obj);
1251
1252 amdgpu_bo_unref(&adev->gfx.rlc.cp_table_obj); 1253 amdgpu_bo_unref(&adev->gfx.rlc.cp_table_obj);
1253 adev->gfx.rlc.cp_table_obj = NULL; 1254 adev->gfx.rlc.cp_table_obj = NULL;
1254 } 1255 }
@@ -1290,14 +1291,14 @@ static int gfx_v8_0_rlc_init(struct amdgpu_device *adev)
1290 &adev->gfx.rlc.clear_state_gpu_addr); 1291 &adev->gfx.rlc.clear_state_gpu_addr);
1291 if (r) { 1292 if (r) {
1292 amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj); 1293 amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
1293 dev_warn(adev->dev, "(%d) pin RLC c bo failed\n", r); 1294 dev_warn(adev->dev, "(%d) pin RLC cbs bo failed\n", r);
1294 gfx_v8_0_rlc_fini(adev); 1295 gfx_v8_0_rlc_fini(adev);
1295 return r; 1296 return r;
1296 } 1297 }
1297 1298
1298 r = amdgpu_bo_kmap(adev->gfx.rlc.clear_state_obj, (void **)&adev->gfx.rlc.cs_ptr); 1299 r = amdgpu_bo_kmap(adev->gfx.rlc.clear_state_obj, (void **)&adev->gfx.rlc.cs_ptr);
1299 if (r) { 1300 if (r) {
1300 dev_warn(adev->dev, "(%d) map RLC c bo failed\n", r); 1301 dev_warn(adev->dev, "(%d) map RLC cbs bo failed\n", r);
1301 gfx_v8_0_rlc_fini(adev); 1302 gfx_v8_0_rlc_fini(adev);
1302 return r; 1303 return r;
1303 } 1304 }
@@ -1332,7 +1333,7 @@ static int gfx_v8_0_rlc_init(struct amdgpu_device *adev)
1332 &adev->gfx.rlc.cp_table_gpu_addr); 1333 &adev->gfx.rlc.cp_table_gpu_addr);
1333 if (r) { 1334 if (r) {
1334 amdgpu_bo_unreserve(adev->gfx.rlc.cp_table_obj); 1335 amdgpu_bo_unreserve(adev->gfx.rlc.cp_table_obj);
1335 dev_warn(adev->dev, "(%d) pin RLC cp_table bo failed\n", r); 1336 dev_warn(adev->dev, "(%d) pin RLC cp table bo failed\n", r);
1336 return r; 1337 return r;
1337 } 1338 }
1338 r = amdgpu_bo_kmap(adev->gfx.rlc.cp_table_obj, (void **)&adev->gfx.rlc.cp_table_ptr); 1339 r = amdgpu_bo_kmap(adev->gfx.rlc.cp_table_obj, (void **)&adev->gfx.rlc.cp_table_ptr);
@@ -1345,7 +1346,6 @@ static int gfx_v8_0_rlc_init(struct amdgpu_device *adev)
1345 1346
1346 amdgpu_bo_kunmap(adev->gfx.rlc.cp_table_obj); 1347 amdgpu_bo_kunmap(adev->gfx.rlc.cp_table_obj);
1347 amdgpu_bo_unreserve(adev->gfx.rlc.cp_table_obj); 1348 amdgpu_bo_unreserve(adev->gfx.rlc.cp_table_obj);
1348
1349 } 1349 }
1350 1350
1351 return 0; 1351 return 0;
@@ -1361,7 +1361,6 @@ static void gfx_v8_0_mec_fini(struct amdgpu_device *adev)
1361 dev_warn(adev->dev, "(%d) reserve HPD EOP bo failed\n", r); 1361 dev_warn(adev->dev, "(%d) reserve HPD EOP bo failed\n", r);
1362 amdgpu_bo_unpin(adev->gfx.mec.hpd_eop_obj); 1362 amdgpu_bo_unpin(adev->gfx.mec.hpd_eop_obj);
1363 amdgpu_bo_unreserve(adev->gfx.mec.hpd_eop_obj); 1363 amdgpu_bo_unreserve(adev->gfx.mec.hpd_eop_obj);
1364
1365 amdgpu_bo_unref(&adev->gfx.mec.hpd_eop_obj); 1364 amdgpu_bo_unref(&adev->gfx.mec.hpd_eop_obj);
1366 adev->gfx.mec.hpd_eop_obj = NULL; 1365 adev->gfx.mec.hpd_eop_obj = NULL;
1367 } 1366 }
@@ -2082,24 +2081,21 @@ static int gfx_v8_0_sw_init(void *handle)
2082 } 2081 }
2083 2082
2084 /* reserve GDS, GWS and OA resource for gfx */ 2083 /* reserve GDS, GWS and OA resource for gfx */
2085 r = amdgpu_bo_create(adev, adev->gds.mem.gfx_partition_size, 2084 r = amdgpu_bo_create_kernel(adev, adev->gds.mem.gfx_partition_size,
2086 PAGE_SIZE, true, 2085 PAGE_SIZE, AMDGPU_GEM_DOMAIN_GDS,
2087 AMDGPU_GEM_DOMAIN_GDS, 0, NULL, 2086 &adev->gds.gds_gfx_bo, NULL, NULL);
2088 NULL, &adev->gds.gds_gfx_bo);
2089 if (r) 2087 if (r)
2090 return r; 2088 return r;
2091 2089
2092 r = amdgpu_bo_create(adev, adev->gds.gws.gfx_partition_size, 2090 r = amdgpu_bo_create_kernel(adev, adev->gds.gws.gfx_partition_size,
2093 PAGE_SIZE, true, 2091 PAGE_SIZE, AMDGPU_GEM_DOMAIN_GWS,
2094 AMDGPU_GEM_DOMAIN_GWS, 0, NULL, 2092 &adev->gds.gws_gfx_bo, NULL, NULL);
2095 NULL, &adev->gds.gws_gfx_bo);
2096 if (r) 2093 if (r)
2097 return r; 2094 return r;
2098 2095
2099 r = amdgpu_bo_create(adev, adev->gds.oa.gfx_partition_size, 2096 r = amdgpu_bo_create_kernel(adev, adev->gds.oa.gfx_partition_size,
2100 PAGE_SIZE, true, 2097 PAGE_SIZE, AMDGPU_GEM_DOMAIN_OA,
2101 AMDGPU_GEM_DOMAIN_OA, 0, NULL, 2098 &adev->gds.oa_gfx_bo, NULL, NULL);
2102 NULL, &adev->gds.oa_gfx_bo);
2103 if (r) 2099 if (r)
2104 return r; 2100 return r;
2105 2101
@@ -2117,9 +2113,9 @@ static int gfx_v8_0_sw_fini(void *handle)
2117 int i; 2113 int i;
2118 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2114 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
2119 2115
2120 amdgpu_bo_unref(&adev->gds.oa_gfx_bo); 2116 amdgpu_bo_free_kernel(&adev->gds.oa_gfx_bo, NULL, NULL);
2121 amdgpu_bo_unref(&adev->gds.gws_gfx_bo); 2117 amdgpu_bo_free_kernel(&adev->gds.gws_gfx_bo, NULL, NULL);
2122 amdgpu_bo_unref(&adev->gds.gds_gfx_bo); 2118 amdgpu_bo_free_kernel(&adev->gds.gds_gfx_bo, NULL, NULL);
2123 2119
2124 for (i = 0; i < adev->gfx.num_gfx_rings; i++) 2120 for (i = 0; i < adev->gfx.num_gfx_rings; i++)
2125 amdgpu_ring_fini(&adev->gfx.gfx_ring[i]); 2121 amdgpu_ring_fini(&adev->gfx.gfx_ring[i]);
@@ -2127,9 +2123,7 @@ static int gfx_v8_0_sw_fini(void *handle)
2127 amdgpu_ring_fini(&adev->gfx.compute_ring[i]); 2123 amdgpu_ring_fini(&adev->gfx.compute_ring[i]);
2128 2124
2129 gfx_v8_0_mec_fini(adev); 2125 gfx_v8_0_mec_fini(adev);
2130
2131 gfx_v8_0_rlc_fini(adev); 2126 gfx_v8_0_rlc_fini(adev);
2132
2133 gfx_v8_0_free_microcode(adev); 2127 gfx_v8_0_free_microcode(adev);
2134 2128
2135 return 0; 2129 return 0;
@@ -3465,19 +3459,16 @@ static void gfx_v8_0_select_se_sh(struct amdgpu_device *adev,
3465 else 3459 else
3466 data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_INDEX, instance); 3460 data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_INDEX, instance);
3467 3461
3468 if ((se_num == 0xffffffff) && (sh_num == 0xffffffff)) { 3462 if (se_num == 0xffffffff)
3469 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_BROADCAST_WRITES, 1);
3470 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_BROADCAST_WRITES, 1); 3463 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_BROADCAST_WRITES, 1);
3471 } else if (se_num == 0xffffffff) { 3464 else
3472 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_INDEX, sh_num);
3473 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_BROADCAST_WRITES, 1);
3474 } else if (sh_num == 0xffffffff) {
3475 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_BROADCAST_WRITES, 1);
3476 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_INDEX, se_num); 3465 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_INDEX, se_num);
3477 } else { 3466
3467 if (sh_num == 0xffffffff)
3468 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_BROADCAST_WRITES, 1);
3469 else
3478 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_INDEX, sh_num); 3470 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_INDEX, sh_num);
3479 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_INDEX, se_num); 3471
3480 }
3481 WREG32(mmGRBM_GFX_INDEX, data); 3472 WREG32(mmGRBM_GFX_INDEX, data);
3482} 3473}
3483 3474
@@ -3490,11 +3481,10 @@ static u32 gfx_v8_0_get_rb_active_bitmap(struct amdgpu_device *adev)
3490{ 3481{
3491 u32 data, mask; 3482 u32 data, mask;
3492 3483
3493 data = RREG32(mmCC_RB_BACKEND_DISABLE); 3484 data = RREG32(mmCC_RB_BACKEND_DISABLE) |
3494 data |= RREG32(mmGC_USER_RB_BACKEND_DISABLE); 3485 RREG32(mmGC_USER_RB_BACKEND_DISABLE);
3495 3486
3496 data &= CC_RB_BACKEND_DISABLE__BACKEND_DISABLE_MASK; 3487 data = REG_GET_FIELD(data, GC_USER_RB_BACKEND_DISABLE, BACKEND_DISABLE);
3497 data >>= GC_USER_RB_BACKEND_DISABLE__BACKEND_DISABLE__SHIFT;
3498 3488
3499 mask = gfx_v8_0_create_bitmask(adev->gfx.config.max_backends_per_se / 3489 mask = gfx_v8_0_create_bitmask(adev->gfx.config.max_backends_per_se /
3500 adev->gfx.config.max_sh_per_se); 3490 adev->gfx.config.max_sh_per_se);
@@ -3502,13 +3492,163 @@ static u32 gfx_v8_0_get_rb_active_bitmap(struct amdgpu_device *adev)
3502 return (~data) & mask; 3492 return (~data) & mask;
3503} 3493}
3504 3494
3495static void
3496gfx_v8_0_raster_config(struct amdgpu_device *adev, u32 *rconf, u32 *rconf1)
3497{
3498 switch (adev->asic_type) {
3499 case CHIP_FIJI:
3500 *rconf |= RB_MAP_PKR0(2) | RB_MAP_PKR1(2) |
3501 RB_XSEL2(1) | PKR_MAP(2) |
3502 PKR_XSEL(1) | PKR_YSEL(1) |
3503 SE_MAP(2) | SE_XSEL(2) | SE_YSEL(3);
3504 *rconf1 |= SE_PAIR_MAP(2) | SE_PAIR_XSEL(3) |
3505 SE_PAIR_YSEL(2);
3506 break;
3507 case CHIP_TONGA:
3508 case CHIP_POLARIS10:
3509 *rconf |= RB_MAP_PKR0(2) | RB_XSEL2(1) | SE_MAP(2) |
3510 SE_XSEL(1) | SE_YSEL(1);
3511 *rconf1 |= SE_PAIR_MAP(2) | SE_PAIR_XSEL(2) |
3512 SE_PAIR_YSEL(2);
3513 break;
3514 case CHIP_TOPAZ:
3515 case CHIP_CARRIZO:
3516 *rconf |= RB_MAP_PKR0(2);
3517 *rconf1 |= 0x0;
3518 break;
3519 case CHIP_POLARIS11:
3520 *rconf |= RB_MAP_PKR0(2) | RB_XSEL2(1) | SE_MAP(2) |
3521 SE_XSEL(1) | SE_YSEL(1);
3522 *rconf1 |= 0x0;
3523 break;
3524 case CHIP_STONEY:
3525 *rconf |= 0x0;
3526 *rconf1 |= 0x0;
3527 break;
3528 default:
3529 DRM_ERROR("unknown asic: 0x%x\n", adev->asic_type);
3530 break;
3531 }
3532}
3533
3534static void
3535gfx_v8_0_write_harvested_raster_configs(struct amdgpu_device *adev,
3536 u32 raster_config, u32 raster_config_1,
3537 unsigned rb_mask, unsigned num_rb)
3538{
3539 unsigned sh_per_se = max_t(unsigned, adev->gfx.config.max_sh_per_se, 1);
3540 unsigned num_se = max_t(unsigned, adev->gfx.config.max_shader_engines, 1);
3541 unsigned rb_per_pkr = min_t(unsigned, num_rb / num_se / sh_per_se, 2);
3542 unsigned rb_per_se = num_rb / num_se;
3543 unsigned se_mask[4];
3544 unsigned se;
3545
3546 se_mask[0] = ((1 << rb_per_se) - 1) & rb_mask;
3547 se_mask[1] = (se_mask[0] << rb_per_se) & rb_mask;
3548 se_mask[2] = (se_mask[1] << rb_per_se) & rb_mask;
3549 se_mask[3] = (se_mask[2] << rb_per_se) & rb_mask;
3550
3551 WARN_ON(!(num_se == 1 || num_se == 2 || num_se == 4));
3552 WARN_ON(!(sh_per_se == 1 || sh_per_se == 2));
3553 WARN_ON(!(rb_per_pkr == 1 || rb_per_pkr == 2));
3554
3555 if ((num_se > 2) && ((!se_mask[0] && !se_mask[1]) ||
3556 (!se_mask[2] && !se_mask[3]))) {
3557 raster_config_1 &= ~SE_PAIR_MAP_MASK;
3558
3559 if (!se_mask[0] && !se_mask[1]) {
3560 raster_config_1 |=
3561 SE_PAIR_MAP(RASTER_CONFIG_SE_PAIR_MAP_3);
3562 } else {
3563 raster_config_1 |=
3564 SE_PAIR_MAP(RASTER_CONFIG_SE_PAIR_MAP_0);
3565 }
3566 }
3567
3568 for (se = 0; se < num_se; se++) {
3569 unsigned raster_config_se = raster_config;
3570 unsigned pkr0_mask = ((1 << rb_per_pkr) - 1) << (se * rb_per_se);
3571 unsigned pkr1_mask = pkr0_mask << rb_per_pkr;
3572 int idx = (se / 2) * 2;
3573
3574 if ((num_se > 1) && (!se_mask[idx] || !se_mask[idx + 1])) {
3575 raster_config_se &= ~SE_MAP_MASK;
3576
3577 if (!se_mask[idx]) {
3578 raster_config_se |= SE_MAP(RASTER_CONFIG_SE_MAP_3);
3579 } else {
3580 raster_config_se |= SE_MAP(RASTER_CONFIG_SE_MAP_0);
3581 }
3582 }
3583
3584 pkr0_mask &= rb_mask;
3585 pkr1_mask &= rb_mask;
3586 if (rb_per_se > 2 && (!pkr0_mask || !pkr1_mask)) {
3587 raster_config_se &= ~PKR_MAP_MASK;
3588
3589 if (!pkr0_mask) {
3590 raster_config_se |= PKR_MAP(RASTER_CONFIG_PKR_MAP_3);
3591 } else {
3592 raster_config_se |= PKR_MAP(RASTER_CONFIG_PKR_MAP_0);
3593 }
3594 }
3595
3596 if (rb_per_se >= 2) {
3597 unsigned rb0_mask = 1 << (se * rb_per_se);
3598 unsigned rb1_mask = rb0_mask << 1;
3599
3600 rb0_mask &= rb_mask;
3601 rb1_mask &= rb_mask;
3602 if (!rb0_mask || !rb1_mask) {
3603 raster_config_se &= ~RB_MAP_PKR0_MASK;
3604
3605 if (!rb0_mask) {
3606 raster_config_se |=
3607 RB_MAP_PKR0(RASTER_CONFIG_RB_MAP_3);
3608 } else {
3609 raster_config_se |=
3610 RB_MAP_PKR0(RASTER_CONFIG_RB_MAP_0);
3611 }
3612 }
3613
3614 if (rb_per_se > 2) {
3615 rb0_mask = 1 << (se * rb_per_se + rb_per_pkr);
3616 rb1_mask = rb0_mask << 1;
3617 rb0_mask &= rb_mask;
3618 rb1_mask &= rb_mask;
3619 if (!rb0_mask || !rb1_mask) {
3620 raster_config_se &= ~RB_MAP_PKR1_MASK;
3621
3622 if (!rb0_mask) {
3623 raster_config_se |=
3624 RB_MAP_PKR1(RASTER_CONFIG_RB_MAP_3);
3625 } else {
3626 raster_config_se |=
3627 RB_MAP_PKR1(RASTER_CONFIG_RB_MAP_0);
3628 }
3629 }
3630 }
3631 }
3632
3633 /* GRBM_GFX_INDEX has a different offset on VI */
3634 gfx_v8_0_select_se_sh(adev, se, 0xffffffff, 0xffffffff);
3635 WREG32(mmPA_SC_RASTER_CONFIG, raster_config_se);
3636 WREG32(mmPA_SC_RASTER_CONFIG_1, raster_config_1);
3637 }
3638
3639 /* GRBM_GFX_INDEX has a different offset on VI */
3640 gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
3641}
3642
3505static void gfx_v8_0_setup_rb(struct amdgpu_device *adev) 3643static void gfx_v8_0_setup_rb(struct amdgpu_device *adev)
3506{ 3644{
3507 int i, j; 3645 int i, j;
3508 u32 data; 3646 u32 data;
3647 u32 raster_config = 0, raster_config_1 = 0;
3509 u32 active_rbs = 0; 3648 u32 active_rbs = 0;
3510 u32 rb_bitmap_width_per_sh = adev->gfx.config.max_backends_per_se / 3649 u32 rb_bitmap_width_per_sh = adev->gfx.config.max_backends_per_se /
3511 adev->gfx.config.max_sh_per_se; 3650 adev->gfx.config.max_sh_per_se;
3651 unsigned num_rb_pipes;
3512 3652
3513 mutex_lock(&adev->grbm_idx_mutex); 3653 mutex_lock(&adev->grbm_idx_mutex);
3514 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { 3654 for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
@@ -3520,10 +3660,26 @@ static void gfx_v8_0_setup_rb(struct amdgpu_device *adev)
3520 } 3660 }
3521 } 3661 }
3522 gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); 3662 gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
3523 mutex_unlock(&adev->grbm_idx_mutex);
3524 3663
3525 adev->gfx.config.backend_enable_mask = active_rbs; 3664 adev->gfx.config.backend_enable_mask = active_rbs;
3526 adev->gfx.config.num_rbs = hweight32(active_rbs); 3665 adev->gfx.config.num_rbs = hweight32(active_rbs);
3666
3667 num_rb_pipes = min_t(unsigned, adev->gfx.config.max_backends_per_se *
3668 adev->gfx.config.max_shader_engines, 16);
3669
3670 gfx_v8_0_raster_config(adev, &raster_config, &raster_config_1);
3671
3672 if (!adev->gfx.config.backend_enable_mask ||
3673 adev->gfx.config.num_rbs >= num_rb_pipes) {
3674 WREG32(mmPA_SC_RASTER_CONFIG, raster_config);
3675 WREG32(mmPA_SC_RASTER_CONFIG_1, raster_config_1);
3676 } else {
3677 gfx_v8_0_write_harvested_raster_configs(adev, raster_config, raster_config_1,
3678 adev->gfx.config.backend_enable_mask,
3679 num_rb_pipes);
3680 }
3681
3682 mutex_unlock(&adev->grbm_idx_mutex);
3527} 3683}
3528 3684
3529/** 3685/**
@@ -3576,16 +3732,12 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev)
3576 u32 tmp; 3732 u32 tmp;
3577 int i; 3733 int i;
3578 3734
3579 tmp = RREG32(mmGRBM_CNTL); 3735 WREG32_FIELD(GRBM_CNTL, READ_TIMEOUT, 0xFF);
3580 tmp = REG_SET_FIELD(tmp, GRBM_CNTL, READ_TIMEOUT, 0xff);
3581 WREG32(mmGRBM_CNTL, tmp);
3582
3583 WREG32(mmGB_ADDR_CONFIG, adev->gfx.config.gb_addr_config); 3736 WREG32(mmGB_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
3584 WREG32(mmHDP_ADDR_CONFIG, adev->gfx.config.gb_addr_config); 3737 WREG32(mmHDP_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
3585 WREG32(mmDMIF_ADDR_CALC, adev->gfx.config.gb_addr_config); 3738 WREG32(mmDMIF_ADDR_CALC, adev->gfx.config.gb_addr_config);
3586 3739
3587 gfx_v8_0_tiling_mode_table_init(adev); 3740 gfx_v8_0_tiling_mode_table_init(adev);
3588
3589 gfx_v8_0_setup_rb(adev); 3741 gfx_v8_0_setup_rb(adev);
3590 gfx_v8_0_get_cu_info(adev); 3742 gfx_v8_0_get_cu_info(adev);
3591 3743
@@ -3769,9 +3921,7 @@ static int gfx_v8_0_init_save_restore_list(struct amdgpu_device *adev)
3769 sizeof(indirect_start_offsets)/sizeof(int)); 3921 sizeof(indirect_start_offsets)/sizeof(int));
3770 3922
3771 /* save and restore list */ 3923 /* save and restore list */
3772 temp = RREG32(mmRLC_SRM_CNTL); 3924 WREG32_FIELD(RLC_SRM_CNTL, AUTO_INCR_ADDR, 1);
3773 temp |= RLC_SRM_CNTL__AUTO_INCR_ADDR_MASK;
3774 WREG32(mmRLC_SRM_CNTL, temp);
3775 3925
3776 WREG32(mmRLC_SRM_ARAM_ADDR, 0); 3926 WREG32(mmRLC_SRM_ARAM_ADDR, 0);
3777 for (i = 0; i < adev->gfx.rlc.reg_list_size_bytes >> 2; i++) 3927 for (i = 0; i < adev->gfx.rlc.reg_list_size_bytes >> 2; i++)
@@ -3808,11 +3958,7 @@ static int gfx_v8_0_init_save_restore_list(struct amdgpu_device *adev)
3808 3958
3809static void gfx_v8_0_enable_save_restore_machine(struct amdgpu_device *adev) 3959static void gfx_v8_0_enable_save_restore_machine(struct amdgpu_device *adev)
3810{ 3960{
3811 uint32_t data; 3961 WREG32_FIELD(RLC_SRM_CNTL, SRM_ENABLE, 1);
3812
3813 data = RREG32(mmRLC_SRM_CNTL);
3814 data |= RLC_SRM_CNTL__SRM_ENABLE_MASK;
3815 WREG32(mmRLC_SRM_CNTL, data);
3816} 3962}
3817 3963
3818static void gfx_v8_0_init_power_gating(struct amdgpu_device *adev) 3964static void gfx_v8_0_init_power_gating(struct amdgpu_device *adev)
@@ -3822,75 +3968,34 @@ static void gfx_v8_0_init_power_gating(struct amdgpu_device *adev)
3822 if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG | 3968 if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG |
3823 AMD_PG_SUPPORT_GFX_SMG | 3969 AMD_PG_SUPPORT_GFX_SMG |
3824 AMD_PG_SUPPORT_GFX_DMG)) { 3970 AMD_PG_SUPPORT_GFX_DMG)) {
3825 data = RREG32(mmCP_RB_WPTR_POLL_CNTL); 3971 WREG32_FIELD(CP_RB_WPTR_POLL_CNTL, IDLE_POLL_COUNT, 0x60);
3826 data &= ~CP_RB_WPTR_POLL_CNTL__IDLE_POLL_COUNT_MASK;
3827 data |= (0x60 << CP_RB_WPTR_POLL_CNTL__IDLE_POLL_COUNT__SHIFT);
3828 WREG32(mmCP_RB_WPTR_POLL_CNTL, data);
3829
3830 data = 0;
3831 data |= (0x10 << RLC_PG_DELAY__POWER_UP_DELAY__SHIFT);
3832 data |= (0x10 << RLC_PG_DELAY__POWER_DOWN_DELAY__SHIFT);
3833 data |= (0x10 << RLC_PG_DELAY__CMD_PROPAGATE_DELAY__SHIFT);
3834 data |= (0x10 << RLC_PG_DELAY__MEM_SLEEP_DELAY__SHIFT);
3835 WREG32(mmRLC_PG_DELAY, data);
3836 3972
3837 data = RREG32(mmRLC_PG_DELAY_2); 3973 data = REG_SET_FIELD(0, RLC_PG_DELAY, POWER_UP_DELAY, 0x10);
3838 data &= ~RLC_PG_DELAY_2__SERDES_CMD_DELAY_MASK; 3974 data = REG_SET_FIELD(data, RLC_PG_DELAY, POWER_DOWN_DELAY, 0x10);
3839 data |= (0x3 << RLC_PG_DELAY_2__SERDES_CMD_DELAY__SHIFT); 3975 data = REG_SET_FIELD(data, RLC_PG_DELAY, CMD_PROPAGATE_DELAY, 0x10);
3840 WREG32(mmRLC_PG_DELAY_2, data); 3976 data = REG_SET_FIELD(data, RLC_PG_DELAY, MEM_SLEEP_DELAY, 0x10);
3977 WREG32(mmRLC_PG_DELAY, data);
3841 3978
3842 data = RREG32(mmRLC_AUTO_PG_CTRL); 3979 WREG32_FIELD(RLC_PG_DELAY_2, SERDES_CMD_DELAY, 0x3);
3843 data &= ~RLC_AUTO_PG_CTRL__GRBM_REG_SAVE_GFX_IDLE_THRESHOLD_MASK; 3980 WREG32_FIELD(RLC_AUTO_PG_CTRL, GRBM_REG_SAVE_GFX_IDLE_THRESHOLD, 0x55f0);
3844 data |= (0x55f0 << RLC_AUTO_PG_CTRL__GRBM_REG_SAVE_GFX_IDLE_THRESHOLD__SHIFT);
3845 WREG32(mmRLC_AUTO_PG_CTRL, data);
3846 } 3981 }
3847} 3982}
3848 3983
3849static void cz_enable_sck_slow_down_on_power_up(struct amdgpu_device *adev, 3984static void cz_enable_sck_slow_down_on_power_up(struct amdgpu_device *adev,
3850 bool enable) 3985 bool enable)
3851{ 3986{
3852 u32 data, orig; 3987 WREG32_FIELD(RLC_PG_CNTL, SMU_CLK_SLOWDOWN_ON_PU_ENABLE, enable ? 1 : 0);
3853
3854 orig = data = RREG32(mmRLC_PG_CNTL);
3855
3856 if (enable)
3857 data |= RLC_PG_CNTL__SMU_CLK_SLOWDOWN_ON_PU_ENABLE_MASK;
3858 else
3859 data &= ~RLC_PG_CNTL__SMU_CLK_SLOWDOWN_ON_PU_ENABLE_MASK;
3860
3861 if (orig != data)
3862 WREG32(mmRLC_PG_CNTL, data);
3863} 3988}
3864 3989
3865static void cz_enable_sck_slow_down_on_power_down(struct amdgpu_device *adev, 3990static void cz_enable_sck_slow_down_on_power_down(struct amdgpu_device *adev,
3866 bool enable) 3991 bool enable)
3867{ 3992{
3868 u32 data, orig; 3993 WREG32_FIELD(RLC_PG_CNTL, SMU_CLK_SLOWDOWN_ON_PD_ENABLE, enable ? 1 : 0);
3869
3870 orig = data = RREG32(mmRLC_PG_CNTL);
3871
3872 if (enable)
3873 data |= RLC_PG_CNTL__SMU_CLK_SLOWDOWN_ON_PD_ENABLE_MASK;
3874 else
3875 data &= ~RLC_PG_CNTL__SMU_CLK_SLOWDOWN_ON_PD_ENABLE_MASK;
3876
3877 if (orig != data)
3878 WREG32(mmRLC_PG_CNTL, data);
3879} 3994}
3880 3995
3881static void cz_enable_cp_power_gating(struct amdgpu_device *adev, bool enable) 3996static void cz_enable_cp_power_gating(struct amdgpu_device *adev, bool enable)
3882{ 3997{
3883 u32 data, orig; 3998 WREG32_FIELD(RLC_PG_CNTL, CP_PG_DISABLE, enable ? 1 : 0);
3884
3885 orig = data = RREG32(mmRLC_PG_CNTL);
3886
3887 if (enable)
3888 data &= ~RLC_PG_CNTL__CP_PG_DISABLE_MASK;
3889 else
3890 data |= RLC_PG_CNTL__CP_PG_DISABLE_MASK;
3891
3892 if (orig != data)
3893 WREG32(mmRLC_PG_CNTL, data);
3894} 3999}
3895 4000
3896static void gfx_v8_0_init_pg(struct amdgpu_device *adev) 4001static void gfx_v8_0_init_pg(struct amdgpu_device *adev)
@@ -3927,36 +4032,26 @@ static void gfx_v8_0_init_pg(struct amdgpu_device *adev)
3927 } 4032 }
3928} 4033}
3929 4034
3930void gfx_v8_0_rlc_stop(struct amdgpu_device *adev) 4035static void gfx_v8_0_rlc_stop(struct amdgpu_device *adev)
3931{ 4036{
3932 u32 tmp = RREG32(mmRLC_CNTL); 4037 WREG32_FIELD(RLC_CNTL, RLC_ENABLE_F32, 0);
3933
3934 tmp = REG_SET_FIELD(tmp, RLC_CNTL, RLC_ENABLE_F32, 0);
3935 WREG32(mmRLC_CNTL, tmp);
3936 4038
3937 gfx_v8_0_enable_gui_idle_interrupt(adev, false); 4039 gfx_v8_0_enable_gui_idle_interrupt(adev, false);
3938
3939 gfx_v8_0_wait_for_rlc_serdes(adev); 4040 gfx_v8_0_wait_for_rlc_serdes(adev);
3940} 4041}
3941 4042
3942static void gfx_v8_0_rlc_reset(struct amdgpu_device *adev) 4043static void gfx_v8_0_rlc_reset(struct amdgpu_device *adev)
3943{ 4044{
3944 u32 tmp = RREG32(mmGRBM_SOFT_RESET); 4045 WREG32_FIELD(GRBM_SOFT_RESET, SOFT_RESET_RLC, 1);
3945
3946 tmp = REG_SET_FIELD(tmp, GRBM_SOFT_RESET, SOFT_RESET_RLC, 1);
3947 WREG32(mmGRBM_SOFT_RESET, tmp);
3948 udelay(50); 4046 udelay(50);
3949 tmp = REG_SET_FIELD(tmp, GRBM_SOFT_RESET, SOFT_RESET_RLC, 0); 4047
3950 WREG32(mmGRBM_SOFT_RESET, tmp); 4048 WREG32_FIELD(GRBM_SOFT_RESET, SOFT_RESET_RLC, 0);
3951 udelay(50); 4049 udelay(50);
3952} 4050}
3953 4051
3954static void gfx_v8_0_rlc_start(struct amdgpu_device *adev) 4052static void gfx_v8_0_rlc_start(struct amdgpu_device *adev)
3955{ 4053{
3956 u32 tmp = RREG32(mmRLC_CNTL); 4054 WREG32_FIELD(RLC_CNTL, RLC_ENABLE_F32, 1);
3957
3958 tmp = REG_SET_FIELD(tmp, RLC_CNTL, RLC_ENABLE_F32, 1);
3959 WREG32(mmRLC_CNTL, tmp);
3960 4055
3961 /* carrizo do enable cp interrupt after cp inited */ 4056 /* carrizo do enable cp interrupt after cp inited */
3962 if (!(adev->flags & AMD_IS_APU)) 4057 if (!(adev->flags & AMD_IS_APU))
@@ -3998,14 +4093,13 @@ static int gfx_v8_0_rlc_resume(struct amdgpu_device *adev)
3998 /* disable CG */ 4093 /* disable CG */
3999 WREG32(mmRLC_CGCG_CGLS_CTRL, 0); 4094 WREG32(mmRLC_CGCG_CGLS_CTRL, 0);
4000 if (adev->asic_type == CHIP_POLARIS11 || 4095 if (adev->asic_type == CHIP_POLARIS11 ||
4001 adev->asic_type == CHIP_POLARIS10) 4096 adev->asic_type == CHIP_POLARIS10)
4002 WREG32(mmRLC_CGCG_CGLS_CTRL_3D, 0); 4097 WREG32(mmRLC_CGCG_CGLS_CTRL_3D, 0);
4003 4098
4004 /* disable PG */ 4099 /* disable PG */
4005 WREG32(mmRLC_PG_CNTL, 0); 4100 WREG32(mmRLC_PG_CNTL, 0);
4006 4101
4007 gfx_v8_0_rlc_reset(adev); 4102 gfx_v8_0_rlc_reset(adev);
4008
4009 gfx_v8_0_init_pg(adev); 4103 gfx_v8_0_init_pg(adev);
4010 4104
4011 if (!adev->pp_enabled) { 4105 if (!adev->pp_enabled) {
@@ -4300,12 +4394,10 @@ static int gfx_v8_0_cp_gfx_resume(struct amdgpu_device *adev)
4300 gfx_v8_0_cp_gfx_start(adev); 4394 gfx_v8_0_cp_gfx_start(adev);
4301 ring->ready = true; 4395 ring->ready = true;
4302 r = amdgpu_ring_test_ring(ring); 4396 r = amdgpu_ring_test_ring(ring);
4303 if (r) { 4397 if (r)
4304 ring->ready = false; 4398 ring->ready = false;
4305 return r;
4306 }
4307 4399
4308 return 0; 4400 return r;
4309} 4401}
4310 4402
4311static void gfx_v8_0_cp_compute_enable(struct amdgpu_device *adev, bool enable) 4403static void gfx_v8_0_cp_compute_enable(struct amdgpu_device *adev, bool enable)
@@ -4980,7 +5072,6 @@ static int gfx_v8_0_hw_init(void *handle)
4980 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 5072 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
4981 5073
4982 gfx_v8_0_init_golden_registers(adev); 5074 gfx_v8_0_init_golden_registers(adev);
4983
4984 gfx_v8_0_gpu_init(adev); 5075 gfx_v8_0_gpu_init(adev);
4985 5076
4986 r = gfx_v8_0_rlc_resume(adev); 5077 r = gfx_v8_0_rlc_resume(adev);
@@ -4988,8 +5079,6 @@ static int gfx_v8_0_hw_init(void *handle)
4988 return r; 5079 return r;
4989 5080
4990 r = gfx_v8_0_cp_resume(adev); 5081 r = gfx_v8_0_cp_resume(adev);
4991 if (r)
4992 return r;
4993 5082
4994 return r; 5083 return r;
4995} 5084}
@@ -5037,25 +5126,22 @@ static bool gfx_v8_0_is_idle(void *handle)
5037static int gfx_v8_0_wait_for_idle(void *handle) 5126static int gfx_v8_0_wait_for_idle(void *handle)
5038{ 5127{
5039 unsigned i; 5128 unsigned i;
5040 u32 tmp;
5041 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 5129 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5042 5130
5043 for (i = 0; i < adev->usec_timeout; i++) { 5131 for (i = 0; i < adev->usec_timeout; i++) {
5044 /* read MC_STATUS */ 5132 if (gfx_v8_0_is_idle(handle))
5045 tmp = RREG32(mmGRBM_STATUS) & GRBM_STATUS__GUI_ACTIVE_MASK;
5046
5047 if (!REG_GET_FIELD(tmp, GRBM_STATUS, GUI_ACTIVE))
5048 return 0; 5133 return 0;
5134
5049 udelay(1); 5135 udelay(1);
5050 } 5136 }
5051 return -ETIMEDOUT; 5137 return -ETIMEDOUT;
5052} 5138}
5053 5139
5054static int gfx_v8_0_soft_reset(void *handle) 5140static int gfx_v8_0_check_soft_reset(void *handle)
5055{ 5141{
5142 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5056 u32 grbm_soft_reset = 0, srbm_soft_reset = 0; 5143 u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
5057 u32 tmp; 5144 u32 tmp;
5058 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5059 5145
5060 /* GRBM_STATUS */ 5146 /* GRBM_STATUS */
5061 tmp = RREG32(mmGRBM_STATUS); 5147 tmp = RREG32(mmGRBM_STATUS);
@@ -5064,16 +5150,12 @@ static int gfx_v8_0_soft_reset(void *handle)
5064 GRBM_STATUS__TA_BUSY_MASK | GRBM_STATUS__VGT_BUSY_MASK | 5150 GRBM_STATUS__TA_BUSY_MASK | GRBM_STATUS__VGT_BUSY_MASK |
5065 GRBM_STATUS__DB_BUSY_MASK | GRBM_STATUS__CB_BUSY_MASK | 5151 GRBM_STATUS__DB_BUSY_MASK | GRBM_STATUS__CB_BUSY_MASK |
5066 GRBM_STATUS__GDS_BUSY_MASK | GRBM_STATUS__SPI_BUSY_MASK | 5152 GRBM_STATUS__GDS_BUSY_MASK | GRBM_STATUS__SPI_BUSY_MASK |
5067 GRBM_STATUS__IA_BUSY_MASK | GRBM_STATUS__IA_BUSY_NO_DMA_MASK)) { 5153 GRBM_STATUS__IA_BUSY_MASK | GRBM_STATUS__IA_BUSY_NO_DMA_MASK |
5154 GRBM_STATUS__CP_BUSY_MASK | GRBM_STATUS__CP_COHERENCY_BUSY_MASK)) {
5068 grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset, 5155 grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset,
5069 GRBM_SOFT_RESET, SOFT_RESET_CP, 1); 5156 GRBM_SOFT_RESET, SOFT_RESET_CP, 1);
5070 grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset, 5157 grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset,
5071 GRBM_SOFT_RESET, SOFT_RESET_GFX, 1); 5158 GRBM_SOFT_RESET, SOFT_RESET_GFX, 1);
5072 }
5073
5074 if (tmp & (GRBM_STATUS__CP_BUSY_MASK | GRBM_STATUS__CP_COHERENCY_BUSY_MASK)) {
5075 grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset,
5076 GRBM_SOFT_RESET, SOFT_RESET_CP, 1);
5077 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, 5159 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset,
5078 SRBM_SOFT_RESET, SOFT_RESET_GRBM, 1); 5160 SRBM_SOFT_RESET, SOFT_RESET_GRBM, 1);
5079 } 5161 }
@@ -5084,73 +5166,199 @@ static int gfx_v8_0_soft_reset(void *handle)
5084 grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset, 5166 grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset,
5085 GRBM_SOFT_RESET, SOFT_RESET_RLC, 1); 5167 GRBM_SOFT_RESET, SOFT_RESET_RLC, 1);
5086 5168
5169 if (REG_GET_FIELD(tmp, GRBM_STATUS2, CPF_BUSY) ||
5170 REG_GET_FIELD(tmp, GRBM_STATUS2, CPC_BUSY) ||
5171 REG_GET_FIELD(tmp, GRBM_STATUS2, CPG_BUSY)) {
5172 grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET,
5173 SOFT_RESET_CPF, 1);
5174 grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET,
5175 SOFT_RESET_CPC, 1);
5176 grbm_soft_reset = REG_SET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET,
5177 SOFT_RESET_CPG, 1);
5178 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET,
5179 SOFT_RESET_GRBM, 1);
5180 }
5181
5087 /* SRBM_STATUS */ 5182 /* SRBM_STATUS */
5088 tmp = RREG32(mmSRBM_STATUS); 5183 tmp = RREG32(mmSRBM_STATUS);
5089 if (REG_GET_FIELD(tmp, SRBM_STATUS, GRBM_RQ_PENDING)) 5184 if (REG_GET_FIELD(tmp, SRBM_STATUS, GRBM_RQ_PENDING))
5090 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, 5185 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset,
5091 SRBM_SOFT_RESET, SOFT_RESET_GRBM, 1); 5186 SRBM_SOFT_RESET, SOFT_RESET_GRBM, 1);
5187 if (REG_GET_FIELD(tmp, SRBM_STATUS, SEM_BUSY))
5188 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset,
5189 SRBM_SOFT_RESET, SOFT_RESET_SEM, 1);
5092 5190
5093 if (grbm_soft_reset || srbm_soft_reset) { 5191 if (grbm_soft_reset || srbm_soft_reset) {
5094 /* stop the rlc */ 5192 adev->ip_block_status[AMD_IP_BLOCK_TYPE_GFX].hang = true;
5095 gfx_v8_0_rlc_stop(adev); 5193 adev->gfx.grbm_soft_reset = grbm_soft_reset;
5194 adev->gfx.srbm_soft_reset = srbm_soft_reset;
5195 } else {
5196 adev->ip_block_status[AMD_IP_BLOCK_TYPE_GFX].hang = false;
5197 adev->gfx.grbm_soft_reset = 0;
5198 adev->gfx.srbm_soft_reset = 0;
5199 }
5200
5201 return 0;
5202}
5203
5204static void gfx_v8_0_inactive_hqd(struct amdgpu_device *adev,
5205 struct amdgpu_ring *ring)
5206{
5207 int i;
5208
5209 vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
5210 if (RREG32(mmCP_HQD_ACTIVE) & CP_HQD_ACTIVE__ACTIVE_MASK) {
5211 u32 tmp;
5212 tmp = RREG32(mmCP_HQD_DEQUEUE_REQUEST);
5213 tmp = REG_SET_FIELD(tmp, CP_HQD_DEQUEUE_REQUEST,
5214 DEQUEUE_REQ, 2);
5215 WREG32(mmCP_HQD_DEQUEUE_REQUEST, tmp);
5216 for (i = 0; i < adev->usec_timeout; i++) {
5217 if (!(RREG32(mmCP_HQD_ACTIVE) & CP_HQD_ACTIVE__ACTIVE_MASK))
5218 break;
5219 udelay(1);
5220 }
5221 }
5222}
5223
5224static int gfx_v8_0_pre_soft_reset(void *handle)
5225{
5226 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5227 u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
5228
5229 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_GFX].hang)
5230 return 0;
5231
5232 grbm_soft_reset = adev->gfx.grbm_soft_reset;
5233 srbm_soft_reset = adev->gfx.srbm_soft_reset;
5234
5235 /* stop the rlc */
5236 gfx_v8_0_rlc_stop(adev);
5096 5237
5238 if (REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CP) ||
5239 REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_GFX))
5097 /* Disable GFX parsing/prefetching */ 5240 /* Disable GFX parsing/prefetching */
5098 gfx_v8_0_cp_gfx_enable(adev, false); 5241 gfx_v8_0_cp_gfx_enable(adev, false);
5099 5242
5243 if (REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CP) ||
5244 REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CPF) ||
5245 REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CPC) ||
5246 REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CPG)) {
5247 int i;
5248
5249 for (i = 0; i < adev->gfx.num_compute_rings; i++) {
5250 struct amdgpu_ring *ring = &adev->gfx.compute_ring[i];
5251
5252 gfx_v8_0_inactive_hqd(adev, ring);
5253 }
5100 /* Disable MEC parsing/prefetching */ 5254 /* Disable MEC parsing/prefetching */
5101 gfx_v8_0_cp_compute_enable(adev, false); 5255 gfx_v8_0_cp_compute_enable(adev, false);
5256 }
5102 5257
5103 if (grbm_soft_reset || srbm_soft_reset) { 5258 return 0;
5104 tmp = RREG32(mmGMCON_DEBUG); 5259}
5105 tmp = REG_SET_FIELD(tmp,
5106 GMCON_DEBUG, GFX_STALL, 1);
5107 tmp = REG_SET_FIELD(tmp,
5108 GMCON_DEBUG, GFX_CLEAR, 1);
5109 WREG32(mmGMCON_DEBUG, tmp);
5110 5260
5111 udelay(50); 5261static int gfx_v8_0_soft_reset(void *handle)
5112 } 5262{
5263 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5264 u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
5265 u32 tmp;
5113 5266
5114 if (grbm_soft_reset) { 5267 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_GFX].hang)
5115 tmp = RREG32(mmGRBM_SOFT_RESET); 5268 return 0;
5116 tmp |= grbm_soft_reset;
5117 dev_info(adev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
5118 WREG32(mmGRBM_SOFT_RESET, tmp);
5119 tmp = RREG32(mmGRBM_SOFT_RESET);
5120 5269
5121 udelay(50); 5270 grbm_soft_reset = adev->gfx.grbm_soft_reset;
5271 srbm_soft_reset = adev->gfx.srbm_soft_reset;
5122 5272
5123 tmp &= ~grbm_soft_reset; 5273 if (grbm_soft_reset || srbm_soft_reset) {
5124 WREG32(mmGRBM_SOFT_RESET, tmp); 5274 tmp = RREG32(mmGMCON_DEBUG);
5125 tmp = RREG32(mmGRBM_SOFT_RESET); 5275 tmp = REG_SET_FIELD(tmp, GMCON_DEBUG, GFX_STALL, 1);
5126 } 5276 tmp = REG_SET_FIELD(tmp, GMCON_DEBUG, GFX_CLEAR, 1);
5277 WREG32(mmGMCON_DEBUG, tmp);
5278 udelay(50);
5279 }
5127 5280
5128 if (srbm_soft_reset) { 5281 if (grbm_soft_reset) {
5129 tmp = RREG32(mmSRBM_SOFT_RESET); 5282 tmp = RREG32(mmGRBM_SOFT_RESET);
5130 tmp |= srbm_soft_reset; 5283 tmp |= grbm_soft_reset;
5131 dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp); 5284 dev_info(adev->dev, "GRBM_SOFT_RESET=0x%08X\n", tmp);
5132 WREG32(mmSRBM_SOFT_RESET, tmp); 5285 WREG32(mmGRBM_SOFT_RESET, tmp);
5133 tmp = RREG32(mmSRBM_SOFT_RESET); 5286 tmp = RREG32(mmGRBM_SOFT_RESET);
5134 5287
5135 udelay(50); 5288 udelay(50);
5136 5289
5137 tmp &= ~srbm_soft_reset; 5290 tmp &= ~grbm_soft_reset;
5138 WREG32(mmSRBM_SOFT_RESET, tmp); 5291 WREG32(mmGRBM_SOFT_RESET, tmp);
5139 tmp = RREG32(mmSRBM_SOFT_RESET); 5292 tmp = RREG32(mmGRBM_SOFT_RESET);
5140 } 5293 }
5141 5294
5142 if (grbm_soft_reset || srbm_soft_reset) { 5295 if (srbm_soft_reset) {
5143 tmp = RREG32(mmGMCON_DEBUG); 5296 tmp = RREG32(mmSRBM_SOFT_RESET);
5144 tmp = REG_SET_FIELD(tmp, 5297 tmp |= srbm_soft_reset;
5145 GMCON_DEBUG, GFX_STALL, 0); 5298 dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
5146 tmp = REG_SET_FIELD(tmp, 5299 WREG32(mmSRBM_SOFT_RESET, tmp);
5147 GMCON_DEBUG, GFX_CLEAR, 0); 5300 tmp = RREG32(mmSRBM_SOFT_RESET);
5148 WREG32(mmGMCON_DEBUG, tmp);
5149 }
5150 5301
5151 /* Wait a little for things to settle down */
5152 udelay(50); 5302 udelay(50);
5303
5304 tmp &= ~srbm_soft_reset;
5305 WREG32(mmSRBM_SOFT_RESET, tmp);
5306 tmp = RREG32(mmSRBM_SOFT_RESET);
5307 }
5308
5309 if (grbm_soft_reset || srbm_soft_reset) {
5310 tmp = RREG32(mmGMCON_DEBUG);
5311 tmp = REG_SET_FIELD(tmp, GMCON_DEBUG, GFX_STALL, 0);
5312 tmp = REG_SET_FIELD(tmp, GMCON_DEBUG, GFX_CLEAR, 0);
5313 WREG32(mmGMCON_DEBUG, tmp);
5153 } 5314 }
5315
5316 /* Wait a little for things to settle down */
5317 udelay(50);
5318
5319 return 0;
5320}
5321
5322static void gfx_v8_0_init_hqd(struct amdgpu_device *adev,
5323 struct amdgpu_ring *ring)
5324{
5325 vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
5326 WREG32(mmCP_HQD_DEQUEUE_REQUEST, 0);
5327 WREG32(mmCP_HQD_PQ_RPTR, 0);
5328 WREG32(mmCP_HQD_PQ_WPTR, 0);
5329 vi_srbm_select(adev, 0, 0, 0, 0);
5330}
5331
5332static int gfx_v8_0_post_soft_reset(void *handle)
5333{
5334 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
5335 u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
5336
5337 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_GFX].hang)
5338 return 0;
5339
5340 grbm_soft_reset = adev->gfx.grbm_soft_reset;
5341 srbm_soft_reset = adev->gfx.srbm_soft_reset;
5342
5343 if (REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CP) ||
5344 REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_GFX))
5345 gfx_v8_0_cp_gfx_resume(adev);
5346
5347 if (REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CP) ||
5348 REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CPF) ||
5349 REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CPC) ||
5350 REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CPG)) {
5351 int i;
5352
5353 for (i = 0; i < adev->gfx.num_compute_rings; i++) {
5354 struct amdgpu_ring *ring = &adev->gfx.compute_ring[i];
5355
5356 gfx_v8_0_init_hqd(adev, ring);
5357 }
5358 gfx_v8_0_cp_compute_resume(adev);
5359 }
5360 gfx_v8_0_rlc_start(adev);
5361
5154 return 0; 5362 return 0;
5155} 5363}
5156 5364
@@ -5269,8 +5477,6 @@ static int gfx_v8_0_late_init(void *handle)
5269static void gfx_v8_0_enable_gfx_static_mg_power_gating(struct amdgpu_device *adev, 5477static void gfx_v8_0_enable_gfx_static_mg_power_gating(struct amdgpu_device *adev,
5270 bool enable) 5478 bool enable)
5271{ 5479{
5272 uint32_t data, temp;
5273
5274 if (adev->asic_type == CHIP_POLARIS11) 5480 if (adev->asic_type == CHIP_POLARIS11)
5275 /* Send msg to SMU via Powerplay */ 5481 /* Send msg to SMU via Powerplay */
5276 amdgpu_set_powergating_state(adev, 5482 amdgpu_set_powergating_state(adev,
@@ -5278,83 +5484,35 @@ static void gfx_v8_0_enable_gfx_static_mg_power_gating(struct amdgpu_device *ade
5278 enable ? 5484 enable ?
5279 AMD_PG_STATE_GATE : AMD_PG_STATE_UNGATE); 5485 AMD_PG_STATE_GATE : AMD_PG_STATE_UNGATE);
5280 5486
5281 temp = data = RREG32(mmRLC_PG_CNTL); 5487 WREG32_FIELD(RLC_PG_CNTL, STATIC_PER_CU_PG_ENABLE, enable ? 1 : 0);
5282 /* Enable static MGPG */
5283 if (enable)
5284 data |= RLC_PG_CNTL__STATIC_PER_CU_PG_ENABLE_MASK;
5285 else
5286 data &= ~RLC_PG_CNTL__STATIC_PER_CU_PG_ENABLE_MASK;
5287
5288 if (temp != data)
5289 WREG32(mmRLC_PG_CNTL, data);
5290} 5488}
5291 5489
5292static void gfx_v8_0_enable_gfx_dynamic_mg_power_gating(struct amdgpu_device *adev, 5490static void gfx_v8_0_enable_gfx_dynamic_mg_power_gating(struct amdgpu_device *adev,
5293 bool enable) 5491 bool enable)
5294{ 5492{
5295 uint32_t data, temp; 5493 WREG32_FIELD(RLC_PG_CNTL, DYN_PER_CU_PG_ENABLE, enable ? 1 : 0);
5296
5297 temp = data = RREG32(mmRLC_PG_CNTL);
5298 /* Enable dynamic MGPG */
5299 if (enable)
5300 data |= RLC_PG_CNTL__DYN_PER_CU_PG_ENABLE_MASK;
5301 else
5302 data &= ~RLC_PG_CNTL__DYN_PER_CU_PG_ENABLE_MASK;
5303
5304 if (temp != data)
5305 WREG32(mmRLC_PG_CNTL, data);
5306} 5494}
5307 5495
5308static void polaris11_enable_gfx_quick_mg_power_gating(struct amdgpu_device *adev, 5496static void polaris11_enable_gfx_quick_mg_power_gating(struct amdgpu_device *adev,
5309 bool enable) 5497 bool enable)
5310{ 5498{
5311 uint32_t data, temp; 5499 WREG32_FIELD(RLC_PG_CNTL, QUICK_PG_ENABLE, enable ? 1 : 0);
5312
5313 temp = data = RREG32(mmRLC_PG_CNTL);
5314 /* Enable quick PG */
5315 if (enable)
5316 data |= RLC_PG_CNTL__QUICK_PG_ENABLE_MASK;
5317 else
5318 data &= ~RLC_PG_CNTL__QUICK_PG_ENABLE_MASK;
5319
5320 if (temp != data)
5321 WREG32(mmRLC_PG_CNTL, data);
5322} 5500}
5323 5501
5324static void cz_enable_gfx_cg_power_gating(struct amdgpu_device *adev, 5502static void cz_enable_gfx_cg_power_gating(struct amdgpu_device *adev,
5325 bool enable) 5503 bool enable)
5326{ 5504{
5327 u32 data, orig; 5505 WREG32_FIELD(RLC_PG_CNTL, GFX_POWER_GATING_ENABLE, enable ? 1 : 0);
5328
5329 orig = data = RREG32(mmRLC_PG_CNTL);
5330
5331 if (enable)
5332 data |= RLC_PG_CNTL__GFX_POWER_GATING_ENABLE_MASK;
5333 else
5334 data &= ~RLC_PG_CNTL__GFX_POWER_GATING_ENABLE_MASK;
5335
5336 if (orig != data)
5337 WREG32(mmRLC_PG_CNTL, data);
5338} 5506}
5339 5507
5340static void cz_enable_gfx_pipeline_power_gating(struct amdgpu_device *adev, 5508static void cz_enable_gfx_pipeline_power_gating(struct amdgpu_device *adev,
5341 bool enable) 5509 bool enable)
5342{ 5510{
5343 u32 data, orig; 5511 WREG32_FIELD(RLC_PG_CNTL, GFX_PIPELINE_PG_ENABLE, enable ? 1 : 0);
5344
5345 orig = data = RREG32(mmRLC_PG_CNTL);
5346
5347 if (enable)
5348 data |= RLC_PG_CNTL__GFX_PIPELINE_PG_ENABLE_MASK;
5349 else
5350 data &= ~RLC_PG_CNTL__GFX_PIPELINE_PG_ENABLE_MASK;
5351
5352 if (orig != data)
5353 WREG32(mmRLC_PG_CNTL, data);
5354 5512
5355 /* Read any GFX register to wake up GFX. */ 5513 /* Read any GFX register to wake up GFX. */
5356 if (!enable) 5514 if (!enable)
5357 data = RREG32(mmDB_RENDER_CONTROL); 5515 RREG32(mmDB_RENDER_CONTROL);
5358} 5516}
5359 5517
5360static void cz_update_gfx_cg_power_gating(struct amdgpu_device *adev, 5518static void cz_update_gfx_cg_power_gating(struct amdgpu_device *adev,
@@ -5430,15 +5588,15 @@ static void gfx_v8_0_send_serdes_cmd(struct amdgpu_device *adev,
5430 5588
5431 data = RREG32(mmRLC_SERDES_WR_CTRL); 5589 data = RREG32(mmRLC_SERDES_WR_CTRL);
5432 if (adev->asic_type == CHIP_STONEY) 5590 if (adev->asic_type == CHIP_STONEY)
5433 data &= ~(RLC_SERDES_WR_CTRL__WRITE_COMMAND_MASK | 5591 data &= ~(RLC_SERDES_WR_CTRL__WRITE_COMMAND_MASK |
5434 RLC_SERDES_WR_CTRL__READ_COMMAND_MASK | 5592 RLC_SERDES_WR_CTRL__READ_COMMAND_MASK |
5435 RLC_SERDES_WR_CTRL__P1_SELECT_MASK | 5593 RLC_SERDES_WR_CTRL__P1_SELECT_MASK |
5436 RLC_SERDES_WR_CTRL__P2_SELECT_MASK | 5594 RLC_SERDES_WR_CTRL__P2_SELECT_MASK |
5437 RLC_SERDES_WR_CTRL__RDDATA_RESET_MASK | 5595 RLC_SERDES_WR_CTRL__RDDATA_RESET_MASK |
5438 RLC_SERDES_WR_CTRL__POWER_DOWN_MASK | 5596 RLC_SERDES_WR_CTRL__POWER_DOWN_MASK |
5439 RLC_SERDES_WR_CTRL__POWER_UP_MASK | 5597 RLC_SERDES_WR_CTRL__POWER_UP_MASK |
5440 RLC_SERDES_WR_CTRL__SHORT_FORMAT_MASK | 5598 RLC_SERDES_WR_CTRL__SHORT_FORMAT_MASK |
5441 RLC_SERDES_WR_CTRL__SRBM_OVERRIDE_MASK); 5599 RLC_SERDES_WR_CTRL__SRBM_OVERRIDE_MASK);
5442 else 5600 else
5443 data &= ~(RLC_SERDES_WR_CTRL__WRITE_COMMAND_MASK | 5601 data &= ~(RLC_SERDES_WR_CTRL__WRITE_COMMAND_MASK |
5444 RLC_SERDES_WR_CTRL__READ_COMMAND_MASK | 5602 RLC_SERDES_WR_CTRL__READ_COMMAND_MASK |
@@ -5461,10 +5619,10 @@ static void gfx_v8_0_send_serdes_cmd(struct amdgpu_device *adev,
5461 5619
5462#define MSG_ENTER_RLC_SAFE_MODE 1 5620#define MSG_ENTER_RLC_SAFE_MODE 1
5463#define MSG_EXIT_RLC_SAFE_MODE 0 5621#define MSG_EXIT_RLC_SAFE_MODE 0
5464 5622#define RLC_GPR_REG2__REQ_MASK 0x00000001
5465#define RLC_GPR_REG2__REQ_MASK 0x00000001 5623#define RLC_GPR_REG2__REQ__SHIFT 0
5466#define RLC_GPR_REG2__MESSAGE__SHIFT 0x00000001 5624#define RLC_GPR_REG2__MESSAGE__SHIFT 0x00000001
5467#define RLC_GPR_REG2__MESSAGE_MASK 0x0000001e 5625#define RLC_GPR_REG2__MESSAGE_MASK 0x0000001e
5468 5626
5469static void cz_enter_rlc_safe_mode(struct amdgpu_device *adev) 5627static void cz_enter_rlc_safe_mode(struct amdgpu_device *adev)
5470{ 5628{
@@ -5494,7 +5652,7 @@ static void cz_enter_rlc_safe_mode(struct amdgpu_device *adev)
5494 } 5652 }
5495 5653
5496 for (i = 0; i < adev->usec_timeout; i++) { 5654 for (i = 0; i < adev->usec_timeout; i++) {
5497 if ((RREG32(mmRLC_GPR_REG2) & RLC_GPR_REG2__REQ_MASK) == 0) 5655 if (!REG_GET_FIELD(RREG32(mmRLC_GPR_REG2), RLC_GPR_REG2, REQ))
5498 break; 5656 break;
5499 udelay(1); 5657 udelay(1);
5500 } 5658 }
@@ -5522,7 +5680,7 @@ static void cz_exit_rlc_safe_mode(struct amdgpu_device *adev)
5522 } 5680 }
5523 5681
5524 for (i = 0; i < adev->usec_timeout; i++) { 5682 for (i = 0; i < adev->usec_timeout; i++) {
5525 if ((RREG32(mmRLC_GPR_REG2) & RLC_GPR_REG2__REQ_MASK) == 0) 5683 if (!REG_GET_FIELD(RREG32(mmRLC_GPR_REG2), RLC_GPR_REG2, REQ))
5526 break; 5684 break;
5527 udelay(1); 5685 udelay(1);
5528 } 5686 }
@@ -5554,7 +5712,7 @@ static void iceland_enter_rlc_safe_mode(struct amdgpu_device *adev)
5554 } 5712 }
5555 5713
5556 for (i = 0; i < adev->usec_timeout; i++) { 5714 for (i = 0; i < adev->usec_timeout; i++) {
5557 if ((RREG32(mmRLC_SAFE_MODE) & RLC_SAFE_MODE__CMD_MASK) == 0) 5715 if (!REG_GET_FIELD(RREG32(mmRLC_SAFE_MODE), RLC_SAFE_MODE, CMD))
5558 break; 5716 break;
5559 udelay(1); 5717 udelay(1);
5560 } 5718 }
@@ -5581,7 +5739,7 @@ static void iceland_exit_rlc_safe_mode(struct amdgpu_device *adev)
5581 } 5739 }
5582 5740
5583 for (i = 0; i < adev->usec_timeout; i++) { 5741 for (i = 0; i < adev->usec_timeout; i++) {
5584 if ((RREG32(mmRLC_SAFE_MODE) & RLC_SAFE_MODE__CMD_MASK) == 0) 5742 if (!REG_GET_FIELD(RREG32(mmRLC_SAFE_MODE), RLC_SAFE_MODE, CMD))
5585 break; 5743 break;
5586 udelay(1); 5744 udelay(1);
5587 } 5745 }
@@ -5622,21 +5780,12 @@ static void gfx_v8_0_update_medium_grain_clock_gating(struct amdgpu_device *adev
5622 /* It is disabled by HW by default */ 5780 /* It is disabled by HW by default */
5623 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG)) { 5781 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG)) {
5624 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGLS) { 5782 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGLS) {
5625 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_RLC_LS) { 5783 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_RLC_LS)
5626 /* 1 - RLC memory Light sleep */ 5784 /* 1 - RLC memory Light sleep */
5627 temp = data = RREG32(mmRLC_MEM_SLP_CNTL); 5785 WREG32_FIELD(RLC_MEM_SLP_CNTL, RLC_MEM_LS_EN, 1);
5628 data |= RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK;
5629 if (temp != data)
5630 WREG32(mmRLC_MEM_SLP_CNTL, data);
5631 }
5632 5786
5633 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CP_LS) { 5787 if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CP_LS)
5634 /* 2 - CP memory Light sleep */ 5788 WREG32_FIELD(CP_MEM_SLP_CNTL, CP_MEM_LS_EN, 1);
5635 temp = data = RREG32(mmCP_MEM_SLP_CNTL);
5636 data |= CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK;
5637 if (temp != data)
5638 WREG32(mmCP_MEM_SLP_CNTL, data);
5639 }
5640 } 5789 }
5641 5790
5642 /* 3 - RLC_CGTT_MGCG_OVERRIDE */ 5791 /* 3 - RLC_CGTT_MGCG_OVERRIDE */
@@ -5834,6 +5983,76 @@ static int gfx_v8_0_update_gfx_clock_gating(struct amdgpu_device *adev,
5834 return 0; 5983 return 0;
5835} 5984}
5836 5985
5986static int gfx_v8_0_tonga_update_gfx_clock_gating(struct amdgpu_device *adev,
5987 enum amd_clockgating_state state)
5988{
5989 uint32_t msg_id, pp_state;
5990 void *pp_handle = adev->powerplay.pp_handle;
5991
5992 if (state == AMD_CG_STATE_UNGATE)
5993 pp_state = 0;
5994 else
5995 pp_state = PP_STATE_CG | PP_STATE_LS;
5996
5997 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
5998 PP_BLOCK_GFX_CG,
5999 PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
6000 pp_state);
6001 amd_set_clockgating_by_smu(pp_handle, msg_id);
6002
6003 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
6004 PP_BLOCK_GFX_MG,
6005 PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
6006 pp_state);
6007 amd_set_clockgating_by_smu(pp_handle, msg_id);
6008
6009 return 0;
6010}
6011
6012static int gfx_v8_0_polaris_update_gfx_clock_gating(struct amdgpu_device *adev,
6013 enum amd_clockgating_state state)
6014{
6015 uint32_t msg_id, pp_state;
6016 void *pp_handle = adev->powerplay.pp_handle;
6017
6018 if (state == AMD_CG_STATE_UNGATE)
6019 pp_state = 0;
6020 else
6021 pp_state = PP_STATE_CG | PP_STATE_LS;
6022
6023 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
6024 PP_BLOCK_GFX_CG,
6025 PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
6026 pp_state);
6027 amd_set_clockgating_by_smu(pp_handle, msg_id);
6028
6029 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
6030 PP_BLOCK_GFX_3D,
6031 PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
6032 pp_state);
6033 amd_set_clockgating_by_smu(pp_handle, msg_id);
6034
6035 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
6036 PP_BLOCK_GFX_MG,
6037 PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
6038 pp_state);
6039 amd_set_clockgating_by_smu(pp_handle, msg_id);
6040
6041 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
6042 PP_BLOCK_GFX_RLC,
6043 PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
6044 pp_state);
6045 amd_set_clockgating_by_smu(pp_handle, msg_id);
6046
6047 msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
6048 PP_BLOCK_GFX_CP,
6049 PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
6050 pp_state);
6051 amd_set_clockgating_by_smu(pp_handle, msg_id);
6052
6053 return 0;
6054}
6055
5837static int gfx_v8_0_set_clockgating_state(void *handle, 6056static int gfx_v8_0_set_clockgating_state(void *handle,
5838 enum amd_clockgating_state state) 6057 enum amd_clockgating_state state)
5839{ 6058{
@@ -5846,33 +6065,33 @@ static int gfx_v8_0_set_clockgating_state(void *handle,
5846 gfx_v8_0_update_gfx_clock_gating(adev, 6065 gfx_v8_0_update_gfx_clock_gating(adev,
5847 state == AMD_CG_STATE_GATE ? true : false); 6066 state == AMD_CG_STATE_GATE ? true : false);
5848 break; 6067 break;
6068 case CHIP_TONGA:
6069 gfx_v8_0_tonga_update_gfx_clock_gating(adev, state);
6070 break;
6071 case CHIP_POLARIS10:
6072 case CHIP_POLARIS11:
6073 gfx_v8_0_polaris_update_gfx_clock_gating(adev, state);
6074 break;
5849 default: 6075 default:
5850 break; 6076 break;
5851 } 6077 }
5852 return 0; 6078 return 0;
5853} 6079}
5854 6080
5855static u32 gfx_v8_0_ring_get_rptr_gfx(struct amdgpu_ring *ring) 6081static u32 gfx_v8_0_ring_get_rptr(struct amdgpu_ring *ring)
5856{ 6082{
5857 u32 rptr; 6083 return ring->adev->wb.wb[ring->rptr_offs];
5858
5859 rptr = ring->adev->wb.wb[ring->rptr_offs];
5860
5861 return rptr;
5862} 6084}
5863 6085
5864static u32 gfx_v8_0_ring_get_wptr_gfx(struct amdgpu_ring *ring) 6086static u32 gfx_v8_0_ring_get_wptr_gfx(struct amdgpu_ring *ring)
5865{ 6087{
5866 struct amdgpu_device *adev = ring->adev; 6088 struct amdgpu_device *adev = ring->adev;
5867 u32 wptr;
5868 6089
5869 if (ring->use_doorbell) 6090 if (ring->use_doorbell)
5870 /* XXX check if swapping is necessary on BE */ 6091 /* XXX check if swapping is necessary on BE */
5871 wptr = ring->adev->wb.wb[ring->wptr_offs]; 6092 return ring->adev->wb.wb[ring->wptr_offs];
5872 else 6093 else
5873 wptr = RREG32(mmCP_RB0_WPTR); 6094 return RREG32(mmCP_RB0_WPTR);
5874
5875 return wptr;
5876} 6095}
5877 6096
5878static void gfx_v8_0_ring_set_wptr_gfx(struct amdgpu_ring *ring) 6097static void gfx_v8_0_ring_set_wptr_gfx(struct amdgpu_ring *ring)
@@ -5939,12 +6158,6 @@ static void gfx_v8_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
5939{ 6158{
5940 u32 header, control = 0; 6159 u32 header, control = 0;
5941 6160
5942 /* insert SWITCH_BUFFER packet before first IB in the ring frame */
5943 if (ctx_switch) {
5944 amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
5945 amdgpu_ring_write(ring, 0);
5946 }
5947
5948 if (ib->flags & AMDGPU_IB_FLAG_CE) 6161 if (ib->flags & AMDGPU_IB_FLAG_CE)
5949 header = PACKET3(PACKET3_INDIRECT_BUFFER_CONST, 2); 6162 header = PACKET3(PACKET3_INDIRECT_BUFFER_CONST, 2);
5950 else 6163 else
@@ -5971,9 +6184,9 @@ static void gfx_v8_0_ring_emit_ib_compute(struct amdgpu_ring *ring,
5971 amdgpu_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2)); 6184 amdgpu_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
5972 amdgpu_ring_write(ring, 6185 amdgpu_ring_write(ring,
5973#ifdef __BIG_ENDIAN 6186#ifdef __BIG_ENDIAN
5974 (2 << 0) | 6187 (2 << 0) |
5975#endif 6188#endif
5976 (ib->gpu_addr & 0xFFFFFFFC)); 6189 (ib->gpu_addr & 0xFFFFFFFC));
5977 amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF); 6190 amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xFFFF);
5978 amdgpu_ring_write(ring, control); 6191 amdgpu_ring_write(ring, control);
5979} 6192}
@@ -6014,14 +6227,6 @@ static void gfx_v8_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
6014 amdgpu_ring_write(ring, seq); 6227 amdgpu_ring_write(ring, seq);
6015 amdgpu_ring_write(ring, 0xffffffff); 6228 amdgpu_ring_write(ring, 0xffffffff);
6016 amdgpu_ring_write(ring, 4); /* poll interval */ 6229 amdgpu_ring_write(ring, 4); /* poll interval */
6017
6018 if (usepfp) {
6019 /* synce CE with ME to prevent CE fetch CEIB before context switch done */
6020 amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
6021 amdgpu_ring_write(ring, 0);
6022 amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
6023 amdgpu_ring_write(ring, 0);
6024 }
6025} 6230}
6026 6231
6027static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring, 6232static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
@@ -6029,6 +6234,10 @@ static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
6029{ 6234{
6030 int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); 6235 int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
6031 6236
6237 /* GFX8 emits 128 dw nop to prevent DE do vm_flush before CE finish CEIB */
6238 if (usepfp)
6239 amdgpu_ring_insert_nop(ring, 128);
6240
6032 amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 6241 amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
6033 amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) | 6242 amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
6034 WRITE_DATA_DST_SEL(0)) | 6243 WRITE_DATA_DST_SEL(0)) |
@@ -6068,18 +6277,11 @@ static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
6068 /* sync PFP to ME, otherwise we might get invalid PFP reads */ 6277 /* sync PFP to ME, otherwise we might get invalid PFP reads */
6069 amdgpu_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); 6278 amdgpu_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
6070 amdgpu_ring_write(ring, 0x0); 6279 amdgpu_ring_write(ring, 0x0);
6071 amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0)); 6280 /* GFX8 emits 128 dw nop to prevent CE access VM before vm_flush finish */
6072 amdgpu_ring_write(ring, 0); 6281 amdgpu_ring_insert_nop(ring, 128);
6073 amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
6074 amdgpu_ring_write(ring, 0);
6075 } 6282 }
6076} 6283}
6077 6284
6078static u32 gfx_v8_0_ring_get_rptr_compute(struct amdgpu_ring *ring)
6079{
6080 return ring->adev->wb.wb[ring->rptr_offs];
6081}
6082
6083static u32 gfx_v8_0_ring_get_wptr_compute(struct amdgpu_ring *ring) 6285static u32 gfx_v8_0_ring_get_wptr_compute(struct amdgpu_ring *ring)
6084{ 6286{
6085 return ring->adev->wb.wb[ring->wptr_offs]; 6287 return ring->adev->wb.wb[ring->wptr_offs];
@@ -6115,36 +6317,88 @@ static void gfx_v8_0_ring_emit_fence_compute(struct amdgpu_ring *ring,
6115 amdgpu_ring_write(ring, upper_32_bits(seq)); 6317 amdgpu_ring_write(ring, upper_32_bits(seq));
6116} 6318}
6117 6319
6118static void gfx_v8_0_set_gfx_eop_interrupt_state(struct amdgpu_device *adev, 6320static void gfx_v8_ring_emit_sb(struct amdgpu_ring *ring)
6119 enum amdgpu_interrupt_state state)
6120{ 6321{
6121 u32 cp_int_cntl; 6322 amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
6323 amdgpu_ring_write(ring, 0);
6324}
6122 6325
6123 switch (state) { 6326static void gfx_v8_ring_emit_cntxcntl(struct amdgpu_ring *ring, uint32_t flags)
6124 case AMDGPU_IRQ_STATE_DISABLE: 6327{
6125 cp_int_cntl = RREG32(mmCP_INT_CNTL_RING0); 6328 uint32_t dw2 = 0;
6126 cp_int_cntl = REG_SET_FIELD(cp_int_cntl, CP_INT_CNTL_RING0, 6329
6127 TIME_STAMP_INT_ENABLE, 0); 6330 dw2 |= 0x80000000; /* set load_enable otherwise this package is just NOPs */
6128 WREG32(mmCP_INT_CNTL_RING0, cp_int_cntl); 6331 if (flags & AMDGPU_HAVE_CTX_SWITCH) {
6129 break; 6332 /* set load_global_config & load_global_uconfig */
6130 case AMDGPU_IRQ_STATE_ENABLE: 6333 dw2 |= 0x8001;
6131 cp_int_cntl = RREG32(mmCP_INT_CNTL_RING0); 6334 /* set load_cs_sh_regs */
6132 cp_int_cntl = 6335 dw2 |= 0x01000000;
6133 REG_SET_FIELD(cp_int_cntl, CP_INT_CNTL_RING0, 6336 /* set load_per_context_state & load_gfx_sh_regs for GFX */
6134 TIME_STAMP_INT_ENABLE, 1); 6337 dw2 |= 0x10002;
6135 WREG32(mmCP_INT_CNTL_RING0, cp_int_cntl); 6338
6136 break; 6339 /* set load_ce_ram if preamble presented */
6137 default: 6340 if (AMDGPU_PREAMBLE_IB_PRESENT & flags)
6138 break; 6341 dw2 |= 0x10000000;
6342 } else {
6343 /* still load_ce_ram if this is the first time preamble presented
6344 * although there is no context switch happens.
6345 */
6346 if (AMDGPU_PREAMBLE_IB_PRESENT_FIRST & flags)
6347 dw2 |= 0x10000000;
6139 } 6348 }
6349
6350 amdgpu_ring_write(ring, PACKET3(PACKET3_CONTEXT_CONTROL, 1));
6351 amdgpu_ring_write(ring, dw2);
6352 amdgpu_ring_write(ring, 0);
6353}
6354
6355static unsigned gfx_v8_0_ring_get_emit_ib_size_gfx(struct amdgpu_ring *ring)
6356{
6357 return
6358 4; /* gfx_v8_0_ring_emit_ib_gfx */
6359}
6360
6361static unsigned gfx_v8_0_ring_get_dma_frame_size_gfx(struct amdgpu_ring *ring)
6362{
6363 return
6364 20 + /* gfx_v8_0_ring_emit_gds_switch */
6365 7 + /* gfx_v8_0_ring_emit_hdp_flush */
6366 5 + /* gfx_v8_0_ring_emit_hdp_invalidate */
6367 6 + 6 + 6 +/* gfx_v8_0_ring_emit_fence_gfx x3 for user fence, vm fence */
6368 7 + /* gfx_v8_0_ring_emit_pipeline_sync */
6369 256 + 19 + /* gfx_v8_0_ring_emit_vm_flush */
6370 2 + /* gfx_v8_ring_emit_sb */
6371 3; /* gfx_v8_ring_emit_cntxcntl */
6372}
6373
6374static unsigned gfx_v8_0_ring_get_emit_ib_size_compute(struct amdgpu_ring *ring)
6375{
6376 return
6377 4; /* gfx_v8_0_ring_emit_ib_compute */
6378}
6379
6380static unsigned gfx_v8_0_ring_get_dma_frame_size_compute(struct amdgpu_ring *ring)
6381{
6382 return
6383 20 + /* gfx_v8_0_ring_emit_gds_switch */
6384 7 + /* gfx_v8_0_ring_emit_hdp_flush */
6385 5 + /* gfx_v8_0_ring_emit_hdp_invalidate */
6386 7 + /* gfx_v8_0_ring_emit_pipeline_sync */
6387 17 + /* gfx_v8_0_ring_emit_vm_flush */
6388 7 + 7 + 7; /* gfx_v8_0_ring_emit_fence_compute x3 for user fence, vm fence */
6389}
6390
6391static void gfx_v8_0_set_gfx_eop_interrupt_state(struct amdgpu_device *adev,
6392 enum amdgpu_interrupt_state state)
6393{
6394 WREG32_FIELD(CP_INT_CNTL_RING0, TIME_STAMP_INT_ENABLE,
6395 state == AMDGPU_IRQ_STATE_DISABLE ? 0 : 1);
6140} 6396}
6141 6397
6142static void gfx_v8_0_set_compute_eop_interrupt_state(struct amdgpu_device *adev, 6398static void gfx_v8_0_set_compute_eop_interrupt_state(struct amdgpu_device *adev,
6143 int me, int pipe, 6399 int me, int pipe,
6144 enum amdgpu_interrupt_state state) 6400 enum amdgpu_interrupt_state state)
6145{ 6401{
6146 u32 mec_int_cntl, mec_int_cntl_reg;
6147
6148 /* 6402 /*
6149 * amdgpu controls only pipe 0 of MEC1. That's why this function only 6403 * amdgpu controls only pipe 0 of MEC1. That's why this function only
6150 * handles the setting of interrupts for this specific pipe. All other 6404 * handles the setting of interrupts for this specific pipe. All other
@@ -6154,7 +6408,6 @@ static void gfx_v8_0_set_compute_eop_interrupt_state(struct amdgpu_device *adev,
6154 if (me == 1) { 6408 if (me == 1) {
6155 switch (pipe) { 6409 switch (pipe) {
6156 case 0: 6410 case 0:
6157 mec_int_cntl_reg = mmCP_ME1_PIPE0_INT_CNTL;
6158 break; 6411 break;
6159 default: 6412 default:
6160 DRM_DEBUG("invalid pipe %d\n", pipe); 6413 DRM_DEBUG("invalid pipe %d\n", pipe);
@@ -6165,22 +6418,8 @@ static void gfx_v8_0_set_compute_eop_interrupt_state(struct amdgpu_device *adev,
6165 return; 6418 return;
6166 } 6419 }
6167 6420
6168 switch (state) { 6421 WREG32_FIELD(CP_ME1_PIPE0_INT_CNTL, TIME_STAMP_INT_ENABLE,
6169 case AMDGPU_IRQ_STATE_DISABLE: 6422 state == AMDGPU_IRQ_STATE_DISABLE ? 0 : 1);
6170 mec_int_cntl = RREG32(mec_int_cntl_reg);
6171 mec_int_cntl = REG_SET_FIELD(mec_int_cntl, CP_ME1_PIPE0_INT_CNTL,
6172 TIME_STAMP_INT_ENABLE, 0);
6173 WREG32(mec_int_cntl_reg, mec_int_cntl);
6174 break;
6175 case AMDGPU_IRQ_STATE_ENABLE:
6176 mec_int_cntl = RREG32(mec_int_cntl_reg);
6177 mec_int_cntl = REG_SET_FIELD(mec_int_cntl, CP_ME1_PIPE0_INT_CNTL,
6178 TIME_STAMP_INT_ENABLE, 1);
6179 WREG32(mec_int_cntl_reg, mec_int_cntl);
6180 break;
6181 default:
6182 break;
6183 }
6184} 6423}
6185 6424
6186static int gfx_v8_0_set_priv_reg_fault_state(struct amdgpu_device *adev, 6425static int gfx_v8_0_set_priv_reg_fault_state(struct amdgpu_device *adev,
@@ -6188,24 +6427,8 @@ static int gfx_v8_0_set_priv_reg_fault_state(struct amdgpu_device *adev,
6188 unsigned type, 6427 unsigned type,
6189 enum amdgpu_interrupt_state state) 6428 enum amdgpu_interrupt_state state)
6190{ 6429{
6191 u32 cp_int_cntl; 6430 WREG32_FIELD(CP_INT_CNTL_RING0, PRIV_REG_INT_ENABLE,
6192 6431 state == AMDGPU_IRQ_STATE_DISABLE ? 0 : 1);
6193 switch (state) {
6194 case AMDGPU_IRQ_STATE_DISABLE:
6195 cp_int_cntl = RREG32(mmCP_INT_CNTL_RING0);
6196 cp_int_cntl = REG_SET_FIELD(cp_int_cntl, CP_INT_CNTL_RING0,
6197 PRIV_REG_INT_ENABLE, 0);
6198 WREG32(mmCP_INT_CNTL_RING0, cp_int_cntl);
6199 break;
6200 case AMDGPU_IRQ_STATE_ENABLE:
6201 cp_int_cntl = RREG32(mmCP_INT_CNTL_RING0);
6202 cp_int_cntl = REG_SET_FIELD(cp_int_cntl, CP_INT_CNTL_RING0,
6203 PRIV_REG_INT_ENABLE, 1);
6204 WREG32(mmCP_INT_CNTL_RING0, cp_int_cntl);
6205 break;
6206 default:
6207 break;
6208 }
6209 6432
6210 return 0; 6433 return 0;
6211} 6434}
@@ -6215,24 +6438,8 @@ static int gfx_v8_0_set_priv_inst_fault_state(struct amdgpu_device *adev,
6215 unsigned type, 6438 unsigned type,
6216 enum amdgpu_interrupt_state state) 6439 enum amdgpu_interrupt_state state)
6217{ 6440{
6218 u32 cp_int_cntl; 6441 WREG32_FIELD(CP_INT_CNTL_RING0, PRIV_INSTR_INT_ENABLE,
6219 6442 state == AMDGPU_IRQ_STATE_DISABLE ? 0 : 1);
6220 switch (state) {
6221 case AMDGPU_IRQ_STATE_DISABLE:
6222 cp_int_cntl = RREG32(mmCP_INT_CNTL_RING0);
6223 cp_int_cntl = REG_SET_FIELD(cp_int_cntl, CP_INT_CNTL_RING0,
6224 PRIV_INSTR_INT_ENABLE, 0);
6225 WREG32(mmCP_INT_CNTL_RING0, cp_int_cntl);
6226 break;
6227 case AMDGPU_IRQ_STATE_ENABLE:
6228 cp_int_cntl = RREG32(mmCP_INT_CNTL_RING0);
6229 cp_int_cntl = REG_SET_FIELD(cp_int_cntl, CP_INT_CNTL_RING0,
6230 PRIV_INSTR_INT_ENABLE, 1);
6231 WREG32(mmCP_INT_CNTL_RING0, cp_int_cntl);
6232 break;
6233 default:
6234 break;
6235 }
6236 6443
6237 return 0; 6444 return 0;
6238} 6445}
@@ -6338,13 +6545,16 @@ const struct amd_ip_funcs gfx_v8_0_ip_funcs = {
6338 .resume = gfx_v8_0_resume, 6545 .resume = gfx_v8_0_resume,
6339 .is_idle = gfx_v8_0_is_idle, 6546 .is_idle = gfx_v8_0_is_idle,
6340 .wait_for_idle = gfx_v8_0_wait_for_idle, 6547 .wait_for_idle = gfx_v8_0_wait_for_idle,
6548 .check_soft_reset = gfx_v8_0_check_soft_reset,
6549 .pre_soft_reset = gfx_v8_0_pre_soft_reset,
6341 .soft_reset = gfx_v8_0_soft_reset, 6550 .soft_reset = gfx_v8_0_soft_reset,
6551 .post_soft_reset = gfx_v8_0_post_soft_reset,
6342 .set_clockgating_state = gfx_v8_0_set_clockgating_state, 6552 .set_clockgating_state = gfx_v8_0_set_clockgating_state,
6343 .set_powergating_state = gfx_v8_0_set_powergating_state, 6553 .set_powergating_state = gfx_v8_0_set_powergating_state,
6344}; 6554};
6345 6555
6346static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = { 6556static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = {
6347 .get_rptr = gfx_v8_0_ring_get_rptr_gfx, 6557 .get_rptr = gfx_v8_0_ring_get_rptr,
6348 .get_wptr = gfx_v8_0_ring_get_wptr_gfx, 6558 .get_wptr = gfx_v8_0_ring_get_wptr_gfx,
6349 .set_wptr = gfx_v8_0_ring_set_wptr_gfx, 6559 .set_wptr = gfx_v8_0_ring_set_wptr_gfx,
6350 .parse_cs = NULL, 6560 .parse_cs = NULL,
@@ -6359,10 +6569,14 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = {
6359 .test_ib = gfx_v8_0_ring_test_ib, 6569 .test_ib = gfx_v8_0_ring_test_ib,
6360 .insert_nop = amdgpu_ring_insert_nop, 6570 .insert_nop = amdgpu_ring_insert_nop,
6361 .pad_ib = amdgpu_ring_generic_pad_ib, 6571 .pad_ib = amdgpu_ring_generic_pad_ib,
6572 .emit_switch_buffer = gfx_v8_ring_emit_sb,
6573 .emit_cntxcntl = gfx_v8_ring_emit_cntxcntl,
6574 .get_emit_ib_size = gfx_v8_0_ring_get_emit_ib_size_gfx,
6575 .get_dma_frame_size = gfx_v8_0_ring_get_dma_frame_size_gfx,
6362}; 6576};
6363 6577
6364static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = { 6578static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = {
6365 .get_rptr = gfx_v8_0_ring_get_rptr_compute, 6579 .get_rptr = gfx_v8_0_ring_get_rptr,
6366 .get_wptr = gfx_v8_0_ring_get_wptr_compute, 6580 .get_wptr = gfx_v8_0_ring_get_wptr_compute,
6367 .set_wptr = gfx_v8_0_ring_set_wptr_compute, 6581 .set_wptr = gfx_v8_0_ring_set_wptr_compute,
6368 .parse_cs = NULL, 6582 .parse_cs = NULL,
@@ -6377,6 +6591,8 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = {
6377 .test_ib = gfx_v8_0_ring_test_ib, 6591 .test_ib = gfx_v8_0_ring_test_ib,
6378 .insert_nop = amdgpu_ring_insert_nop, 6592 .insert_nop = amdgpu_ring_insert_nop,
6379 .pad_ib = amdgpu_ring_generic_pad_ib, 6593 .pad_ib = amdgpu_ring_generic_pad_ib,
6594 .get_emit_ib_size = gfx_v8_0_ring_get_emit_ib_size_compute,
6595 .get_dma_frame_size = gfx_v8_0_ring_get_dma_frame_size_compute,
6380}; 6596};
6381 6597
6382static void gfx_v8_0_set_ring_funcs(struct amdgpu_device *adev) 6598static void gfx_v8_0_set_ring_funcs(struct amdgpu_device *adev)
@@ -6479,15 +6695,12 @@ static u32 gfx_v8_0_get_cu_active_bitmap(struct amdgpu_device *adev)
6479{ 6695{
6480 u32 data, mask; 6696 u32 data, mask;
6481 6697
6482 data = RREG32(mmCC_GC_SHADER_ARRAY_CONFIG); 6698 data = RREG32(mmCC_GC_SHADER_ARRAY_CONFIG) |
6483 data |= RREG32(mmGC_USER_SHADER_ARRAY_CONFIG); 6699 RREG32(mmGC_USER_SHADER_ARRAY_CONFIG);
6484
6485 data &= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK;
6486 data >>= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT;
6487 6700
6488 mask = gfx_v8_0_create_bitmask(adev->gfx.config.max_cu_per_sh); 6701 mask = gfx_v8_0_create_bitmask(adev->gfx.config.max_cu_per_sh);
6489 6702
6490 return (~data) & mask; 6703 return ~REG_GET_FIELD(data, CC_GC_SHADER_ARRAY_CONFIG, INACTIVE_CUS) & mask;
6491} 6704}
6492 6705
6493static void gfx_v8_0_get_cu_info(struct amdgpu_device *adev) 6706static void gfx_v8_0_get_cu_info(struct amdgpu_device *adev)
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.h b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.h
index bc82c794312c..ebed1f829297 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.h
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.h
@@ -26,6 +26,4 @@
26 26
27extern const struct amd_ip_funcs gfx_v8_0_ip_funcs; 27extern const struct amd_ip_funcs gfx_v8_0_ip_funcs;
28 28
29void gfx_v8_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, u32 sh_num);
30
31#endif 29#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
new file mode 100644
index 000000000000..b13c8aaec078
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
@@ -0,0 +1,1071 @@
1
2/*
3 * Copyright 2014 Advanced Micro Devices, Inc.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21 * OTHER DEALINGS IN THE SOFTWARE.
22 *
23 */
24#include <linux/firmware.h>
25#include "drmP.h"
26#include "amdgpu.h"
27#include "gmc_v6_0.h"
28#include "amdgpu_ucode.h"
29#include "si/sid.h"
30
31static void gmc_v6_0_set_gart_funcs(struct amdgpu_device *adev);
32static void gmc_v6_0_set_irq_funcs(struct amdgpu_device *adev);
33static int gmc_v6_0_wait_for_idle(void *handle);
34
35MODULE_FIRMWARE("radeon/tahiti_mc.bin");
36MODULE_FIRMWARE("radeon/pitcairn_mc.bin");
37MODULE_FIRMWARE("radeon/verde_mc.bin");
38MODULE_FIRMWARE("radeon/oland_mc.bin");
39
40static const u32 crtc_offsets[6] =
41{
42 SI_CRTC0_REGISTER_OFFSET,
43 SI_CRTC1_REGISTER_OFFSET,
44 SI_CRTC2_REGISTER_OFFSET,
45 SI_CRTC3_REGISTER_OFFSET,
46 SI_CRTC4_REGISTER_OFFSET,
47 SI_CRTC5_REGISTER_OFFSET
48};
49
50static void gmc_v6_0_mc_stop(struct amdgpu_device *adev,
51 struct amdgpu_mode_mc_save *save)
52{
53 u32 blackout;
54
55 if (adev->mode_info.num_crtc)
56 amdgpu_display_stop_mc_access(adev, save);
57
58 gmc_v6_0_wait_for_idle((void *)adev);
59
60 blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
61 if (REG_GET_FIELD(blackout, mmMC_SHARED_BLACKOUT_CNTL, xxBLACKOUT_MODE) != 1) {
62 /* Block CPU access */
63 WREG32(BIF_FB_EN, 0);
64 /* blackout the MC */
65 blackout = REG_SET_FIELD(blackout,
66 mmMC_SHARED_BLACKOUT_CNTL, xxBLACKOUT_MODE, 0);
67 WREG32(MC_SHARED_BLACKOUT_CNTL, blackout | 1);
68 }
69 /* wait for the MC to settle */
70 udelay(100);
71
72}
73
74static void gmc_v6_0_mc_resume(struct amdgpu_device *adev,
75 struct amdgpu_mode_mc_save *save)
76{
77 u32 tmp;
78
79 /* unblackout the MC */
80 tmp = RREG32(MC_SHARED_BLACKOUT_CNTL);
81 tmp = REG_SET_FIELD(tmp, mmMC_SHARED_BLACKOUT_CNTL, xxBLACKOUT_MODE, 0);
82 WREG32(MC_SHARED_BLACKOUT_CNTL, tmp);
83 /* allow CPU access */
84 tmp = REG_SET_FIELD(0, mmBIF_FB_EN, xxFB_READ_EN, 1);
85 tmp = REG_SET_FIELD(tmp, mmBIF_FB_EN, xxFB_WRITE_EN, 1);
86 WREG32(BIF_FB_EN, tmp);
87
88 if (adev->mode_info.num_crtc)
89 amdgpu_display_resume_mc_access(adev, save);
90
91}
92
93static int gmc_v6_0_init_microcode(struct amdgpu_device *adev)
94{
95 const char *chip_name;
96 char fw_name[30];
97 int err;
98
99 DRM_DEBUG("\n");
100
101 switch (adev->asic_type) {
102 case CHIP_TAHITI:
103 chip_name = "tahiti";
104 break;
105 case CHIP_PITCAIRN:
106 chip_name = "pitcairn";
107 break;
108 case CHIP_VERDE:
109 chip_name = "verde";
110 break;
111 case CHIP_OLAND:
112 chip_name = "oland";
113 break;
114 case CHIP_HAINAN:
115 chip_name = "hainan";
116 break;
117 default: BUG();
118 }
119
120 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
121 err = request_firmware(&adev->mc.fw, fw_name, adev->dev);
122 if (err)
123 goto out;
124
125 err = amdgpu_ucode_validate(adev->mc.fw);
126
127out:
128 if (err) {
129 dev_err(adev->dev,
130 "si_mc: Failed to load firmware \"%s\"\n",
131 fw_name);
132 release_firmware(adev->mc.fw);
133 adev->mc.fw = NULL;
134 }
135 return err;
136}
137
138static int gmc_v6_0_mc_load_microcode(struct amdgpu_device *adev)
139{
140 const __le32 *new_fw_data = NULL;
141 u32 running;
142 const __le32 *new_io_mc_regs = NULL;
143 int i, regs_size, ucode_size;
144 const struct mc_firmware_header_v1_0 *hdr;
145
146 if (!adev->mc.fw)
147 return -EINVAL;
148
149 hdr = (const struct mc_firmware_header_v1_0 *)adev->mc.fw->data;
150
151 amdgpu_ucode_print_mc_hdr(&hdr->header);
152
153 adev->mc.fw_version = le32_to_cpu(hdr->header.ucode_version);
154 regs_size = le32_to_cpu(hdr->io_debug_size_bytes) / (4 * 2);
155 new_io_mc_regs = (const __le32 *)
156 (adev->mc.fw->data + le32_to_cpu(hdr->io_debug_array_offset_bytes));
157 ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes) / 4;
158 new_fw_data = (const __le32 *)
159 (adev->mc.fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
160
161 running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
162
163 if (running == 0) {
164
165 /* reset the engine and set to writable */
166 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
167 WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
168
169 /* load mc io regs */
170 for (i = 0; i < regs_size; i++) {
171 WREG32(MC_SEQ_IO_DEBUG_INDEX, le32_to_cpup(new_io_mc_regs++));
172 WREG32(MC_SEQ_IO_DEBUG_DATA, le32_to_cpup(new_io_mc_regs++));
173 }
174 /* load the MC ucode */
175 for (i = 0; i < ucode_size; i++) {
176 WREG32(MC_SEQ_SUP_PGM, le32_to_cpup(new_fw_data++));
177 }
178
179 /* put the engine back into the active state */
180 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
181 WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
182 WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
183
184 /* wait for training to complete */
185 for (i = 0; i < adev->usec_timeout; i++) {
186 if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D0)
187 break;
188 udelay(1);
189 }
190 for (i = 0; i < adev->usec_timeout; i++) {
191 if (RREG32(MC_SEQ_TRAIN_WAKEUP_CNTL) & TRAIN_DONE_D1)
192 break;
193 udelay(1);
194 }
195
196 }
197
198 return 0;
199}
200
201static void gmc_v6_0_vram_gtt_location(struct amdgpu_device *adev,
202 struct amdgpu_mc *mc)
203{
204 if (mc->mc_vram_size > 0xFFC0000000ULL) {
205 dev_warn(adev->dev, "limiting VRAM\n");
206 mc->real_vram_size = 0xFFC0000000ULL;
207 mc->mc_vram_size = 0xFFC0000000ULL;
208 }
209 amdgpu_vram_location(adev, &adev->mc, 0);
210 adev->mc.gtt_base_align = 0;
211 amdgpu_gtt_location(adev, mc);
212}
213
214static void gmc_v6_0_mc_program(struct amdgpu_device *adev)
215{
216 struct amdgpu_mode_mc_save save;
217 u32 tmp;
218 int i, j;
219
220 /* Initialize HDP */
221 for (i = 0, j = 0; i < 32; i++, j += 0x6) {
222 WREG32((0xb05 + j), 0x00000000);
223 WREG32((0xb06 + j), 0x00000000);
224 WREG32((0xb07 + j), 0x00000000);
225 WREG32((0xb08 + j), 0x00000000);
226 WREG32((0xb09 + j), 0x00000000);
227 }
228 WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
229
230 gmc_v6_0_mc_stop(adev, &save);
231
232 if (gmc_v6_0_wait_for_idle((void *)adev)) {
233 dev_warn(adev->dev, "Wait for MC idle timedout !\n");
234 }
235
236 WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
237 /* Update configuration */
238 WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
239 adev->mc.vram_start >> 12);
240 WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
241 adev->mc.vram_end >> 12);
242 WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR,
243 adev->vram_scratch.gpu_addr >> 12);
244 tmp = ((adev->mc.vram_end >> 24) & 0xFFFF) << 16;
245 tmp |= ((adev->mc.vram_start >> 24) & 0xFFFF);
246 WREG32(MC_VM_FB_LOCATION, tmp);
247 /* XXX double check these! */
248 WREG32(HDP_NONSURFACE_BASE, (adev->mc.vram_start >> 8));
249 WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
250 WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
251 WREG32(MC_VM_AGP_BASE, 0);
252 WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
253 WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
254
255 if (gmc_v6_0_wait_for_idle((void *)adev)) {
256 dev_warn(adev->dev, "Wait for MC idle timedout !\n");
257 }
258 gmc_v6_0_mc_resume(adev, &save);
259 amdgpu_display_set_vga_render_state(adev, false);
260}
261
262static int gmc_v6_0_mc_init(struct amdgpu_device *adev)
263{
264
265 u32 tmp;
266 int chansize, numchan;
267
268 tmp = RREG32(MC_ARB_RAMCFG);
269 if (tmp & CHANSIZE_OVERRIDE) {
270 chansize = 16;
271 } else if (tmp & CHANSIZE_MASK) {
272 chansize = 64;
273 } else {
274 chansize = 32;
275 }
276 tmp = RREG32(MC_SHARED_CHMAP);
277 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
278 case 0:
279 default:
280 numchan = 1;
281 break;
282 case 1:
283 numchan = 2;
284 break;
285 case 2:
286 numchan = 4;
287 break;
288 case 3:
289 numchan = 8;
290 break;
291 case 4:
292 numchan = 3;
293 break;
294 case 5:
295 numchan = 6;
296 break;
297 case 6:
298 numchan = 10;
299 break;
300 case 7:
301 numchan = 12;
302 break;
303 case 8:
304 numchan = 16;
305 break;
306 }
307 adev->mc.vram_width = numchan * chansize;
308 /* Could aper size report 0 ? */
309 adev->mc.aper_base = pci_resource_start(adev->pdev, 0);
310 adev->mc.aper_size = pci_resource_len(adev->pdev, 0);
311 /* size in MB on si */
312 adev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
313 adev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL;
314 adev->mc.visible_vram_size = adev->mc.aper_size;
315
316 /* unless the user had overridden it, set the gart
317 * size equal to the 1024 or vram, whichever is larger.
318 */
319 if (amdgpu_gart_size == -1)
320 adev->mc.gtt_size = amdgpu_ttm_get_gtt_mem_size(adev);
321 else
322 adev->mc.gtt_size = (uint64_t)amdgpu_gart_size << 20;
323
324 gmc_v6_0_vram_gtt_location(adev, &adev->mc);
325
326 return 0;
327}
328
329static void gmc_v6_0_gart_flush_gpu_tlb(struct amdgpu_device *adev,
330 uint32_t vmid)
331{
332 WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0);
333
334 WREG32(VM_INVALIDATE_REQUEST, 1 << vmid);
335}
336
337static int gmc_v6_0_gart_set_pte_pde(struct amdgpu_device *adev,
338 void *cpu_pt_addr,
339 uint32_t gpu_page_idx,
340 uint64_t addr,
341 uint32_t flags)
342{
343 void __iomem *ptr = (void *)cpu_pt_addr;
344 uint64_t value;
345
346 value = addr & 0xFFFFFFFFFFFFF000ULL;
347 value |= flags;
348 writeq(value, ptr + (gpu_page_idx * 8));
349
350 return 0;
351}
352
353static void gmc_v6_0_set_fault_enable_default(struct amdgpu_device *adev,
354 bool value)
355{
356 u32 tmp;
357
358 tmp = RREG32(VM_CONTEXT1_CNTL);
359 tmp = REG_SET_FIELD(tmp, mmVM_CONTEXT1_CNTL,
360 xxRANGE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
361 tmp = REG_SET_FIELD(tmp, mmVM_CONTEXT1_CNTL,
362 xxDUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
363 tmp = REG_SET_FIELD(tmp, mmVM_CONTEXT1_CNTL,
364 xxPDE0_PROTECTION_FAULT_ENABLE_DEFAULT, value);
365 tmp = REG_SET_FIELD(tmp, mmVM_CONTEXT1_CNTL,
366 xxVALID_PROTECTION_FAULT_ENABLE_DEFAULT, value);
367 tmp = REG_SET_FIELD(tmp, mmVM_CONTEXT1_CNTL,
368 xxREAD_PROTECTION_FAULT_ENABLE_DEFAULT, value);
369 tmp = REG_SET_FIELD(tmp, mmVM_CONTEXT1_CNTL,
370 xxWRITE_PROTECTION_FAULT_ENABLE_DEFAULT, value);
371 WREG32(VM_CONTEXT1_CNTL, tmp);
372}
373
374static int gmc_v6_0_gart_enable(struct amdgpu_device *adev)
375{
376 int r, i;
377
378 if (adev->gart.robj == NULL) {
379 dev_err(adev->dev, "No VRAM object for PCIE GART.\n");
380 return -EINVAL;
381 }
382 r = amdgpu_gart_table_vram_pin(adev);
383 if (r)
384 return r;
385 /* Setup TLB control */
386 WREG32(MC_VM_MX_L1_TLB_CNTL,
387 (0xA << 7) |
388 ENABLE_L1_TLB |
389 ENABLE_L1_FRAGMENT_PROCESSING |
390 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
391 ENABLE_ADVANCED_DRIVER_MODEL |
392 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
393 /* Setup L2 cache */
394 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
395 ENABLE_L2_FRAGMENT_PROCESSING |
396 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
397 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
398 EFFECTIVE_L2_QUEUE_SIZE(7) |
399 CONTEXT1_IDENTITY_ACCESS_MODE(1));
400 WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
401 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
402 BANK_SELECT(4) |
403 L2_CACHE_BIGK_FRAGMENT_SIZE(4));
404 /* setup context0 */
405 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, adev->mc.gtt_start >> 12);
406 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, adev->mc.gtt_end >> 12);
407 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, adev->gart.table_addr >> 12);
408 WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
409 (u32)(adev->dummy_page.addr >> 12));
410 WREG32(VM_CONTEXT0_CNTL2, 0);
411 WREG32(VM_CONTEXT0_CNTL, (ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
412 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT));
413
414 WREG32(0x575, 0);
415 WREG32(0x576, 0);
416 WREG32(0x577, 0);
417
418 /* empty context1-15 */
419 /* set vm size, must be a multiple of 4 */
420 WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR, 0);
421 WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR, adev->vm_manager.max_pfn - 1);
422 /* Assign the pt base to something valid for now; the pts used for
423 * the VMs are determined by the application and setup and assigned
424 * on the fly in the vm part of radeon_gart.c
425 */
426 for (i = 1; i < 16; i++) {
427 if (i < 8)
428 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + i,
429 adev->gart.table_addr >> 12);
430 else
431 WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + i - 8,
432 adev->gart.table_addr >> 12);
433 }
434
435 /* enable context1-15 */
436 WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
437 (u32)(adev->dummy_page.addr >> 12));
438 WREG32(VM_CONTEXT1_CNTL2, 4);
439 WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) |
440 PAGE_TABLE_BLOCK_SIZE(amdgpu_vm_block_size - 9) |
441 RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
442 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT |
443 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT |
444 DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT |
445 PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT |
446 PDE0_PROTECTION_FAULT_ENABLE_DEFAULT |
447 VALID_PROTECTION_FAULT_ENABLE_INTERRUPT |
448 VALID_PROTECTION_FAULT_ENABLE_DEFAULT |
449 READ_PROTECTION_FAULT_ENABLE_INTERRUPT |
450 READ_PROTECTION_FAULT_ENABLE_DEFAULT |
451 WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT |
452 WRITE_PROTECTION_FAULT_ENABLE_DEFAULT);
453
454 gmc_v6_0_gart_flush_gpu_tlb(adev, 0);
455 dev_info(adev->dev, "PCIE GART of %uM enabled (table at 0x%016llX).\n",
456 (unsigned)(adev->mc.gtt_size >> 20),
457 (unsigned long long)adev->gart.table_addr);
458 adev->gart.ready = true;
459 return 0;
460}
461
462static int gmc_v6_0_gart_init(struct amdgpu_device *adev)
463{
464 int r;
465
466 if (adev->gart.robj) {
467 dev_warn(adev->dev, "gmc_v6_0 PCIE GART already initialized\n");
468 return 0;
469 }
470 r = amdgpu_gart_init(adev);
471 if (r)
472 return r;
473 adev->gart.table_size = adev->gart.num_gpu_pages * 8;
474 return amdgpu_gart_table_vram_alloc(adev);
475}
476
477static void gmc_v6_0_gart_disable(struct amdgpu_device *adev)
478{
479 /*unsigned i;
480
481 for (i = 1; i < 16; ++i) {
482 uint32_t reg;
483 if (i < 8)
484 reg = VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + i ;
485 else
486 reg = VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + (i - 8);
487 adev->vm_manager.saved_table_addr[i] = RREG32(reg);
488 }*/
489
490 /* Disable all tables */
491 WREG32(VM_CONTEXT0_CNTL, 0);
492 WREG32(VM_CONTEXT1_CNTL, 0);
493 /* Setup TLB control */
494 WREG32(MC_VM_MX_L1_TLB_CNTL, SYSTEM_ACCESS_MODE_NOT_IN_SYS |
495 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
496 /* Setup L2 cache */
497 WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
498 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
499 EFFECTIVE_L2_QUEUE_SIZE(7) |
500 CONTEXT1_IDENTITY_ACCESS_MODE(1));
501 WREG32(VM_L2_CNTL2, 0);
502 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
503 L2_CACHE_BIGK_FRAGMENT_SIZE(0));
504 amdgpu_gart_table_vram_unpin(adev);
505}
506
507static void gmc_v6_0_gart_fini(struct amdgpu_device *adev)
508{
509 amdgpu_gart_table_vram_free(adev);
510 amdgpu_gart_fini(adev);
511}
512
513static int gmc_v6_0_vm_init(struct amdgpu_device *adev)
514{
515 /*
516 * number of VMs
517 * VMID 0 is reserved for System
518 * amdgpu graphics/compute will use VMIDs 1-7
519 * amdkfd will use VMIDs 8-15
520 */
521 adev->vm_manager.num_ids = AMDGPU_NUM_OF_VMIDS;
522 amdgpu_vm_manager_init(adev);
523
524 /* base offset of vram pages */
525 if (adev->flags & AMD_IS_APU) {
526 u64 tmp = RREG32(MC_VM_FB_OFFSET);
527 tmp <<= 22;
528 adev->vm_manager.vram_base_offset = tmp;
529 } else
530 adev->vm_manager.vram_base_offset = 0;
531
532 return 0;
533}
534
535static void gmc_v6_0_vm_fini(struct amdgpu_device *adev)
536{
537}
538
539static void gmc_v6_0_vm_decode_fault(struct amdgpu_device *adev,
540 u32 status, u32 addr, u32 mc_client)
541{
542 u32 mc_id;
543 u32 vmid = REG_GET_FIELD(status, mmVM_CONTEXT1_PROTECTION_FAULT_STATUS, xxVMID);
544 u32 protections = REG_GET_FIELD(status, mmVM_CONTEXT1_PROTECTION_FAULT_STATUS,
545 xxPROTECTIONS);
546 char block[5] = { mc_client >> 24, (mc_client >> 16) & 0xff,
547 (mc_client >> 8) & 0xff, mc_client & 0xff, 0 };
548
549 mc_id = REG_GET_FIELD(status, mmVM_CONTEXT1_PROTECTION_FAULT_STATUS,
550 xxMEMORY_CLIENT_ID);
551
552 dev_err(adev->dev, "VM fault (0x%02x, vmid %d) at page %u, %s from '%s' (0x%08x) (%d)\n",
553 protections, vmid, addr,
554 REG_GET_FIELD(status, mmVM_CONTEXT1_PROTECTION_FAULT_STATUS,
555 xxMEMORY_CLIENT_RW) ?
556 "write" : "read", block, mc_client, mc_id);
557}
558
559/*
560static const u32 mc_cg_registers[] = {
561 MC_HUB_MISC_HUB_CG,
562 MC_HUB_MISC_SIP_CG,
563 MC_HUB_MISC_VM_CG,
564 MC_XPB_CLK_GAT,
565 ATC_MISC_CG,
566 MC_CITF_MISC_WR_CG,
567 MC_CITF_MISC_RD_CG,
568 MC_CITF_MISC_VM_CG,
569 VM_L2_CG,
570};
571
572static const u32 mc_cg_ls_en[] = {
573 MC_HUB_MISC_HUB_CG__MEM_LS_ENABLE_MASK,
574 MC_HUB_MISC_SIP_CG__MEM_LS_ENABLE_MASK,
575 MC_HUB_MISC_VM_CG__MEM_LS_ENABLE_MASK,
576 MC_XPB_CLK_GAT__MEM_LS_ENABLE_MASK,
577 ATC_MISC_CG__MEM_LS_ENABLE_MASK,
578 MC_CITF_MISC_WR_CG__MEM_LS_ENABLE_MASK,
579 MC_CITF_MISC_RD_CG__MEM_LS_ENABLE_MASK,
580 MC_CITF_MISC_VM_CG__MEM_LS_ENABLE_MASK,
581 VM_L2_CG__MEM_LS_ENABLE_MASK,
582};
583
584static const u32 mc_cg_en[] = {
585 MC_HUB_MISC_HUB_CG__ENABLE_MASK,
586 MC_HUB_MISC_SIP_CG__ENABLE_MASK,
587 MC_HUB_MISC_VM_CG__ENABLE_MASK,
588 MC_XPB_CLK_GAT__ENABLE_MASK,
589 ATC_MISC_CG__ENABLE_MASK,
590 MC_CITF_MISC_WR_CG__ENABLE_MASK,
591 MC_CITF_MISC_RD_CG__ENABLE_MASK,
592 MC_CITF_MISC_VM_CG__ENABLE_MASK,
593 VM_L2_CG__ENABLE_MASK,
594};
595
596static void gmc_v6_0_enable_mc_ls(struct amdgpu_device *adev,
597 bool enable)
598{
599 int i;
600 u32 orig, data;
601
602 for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
603 orig = data = RREG32(mc_cg_registers[i]);
604 if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_MC_LS))
605 data |= mc_cg_ls_en[i];
606 else
607 data &= ~mc_cg_ls_en[i];
608 if (data != orig)
609 WREG32(mc_cg_registers[i], data);
610 }
611}
612
613static void gmc_v6_0_enable_mc_mgcg(struct amdgpu_device *adev,
614 bool enable)
615{
616 int i;
617 u32 orig, data;
618
619 for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
620 orig = data = RREG32(mc_cg_registers[i]);
621 if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_MC_MGCG))
622 data |= mc_cg_en[i];
623 else
624 data &= ~mc_cg_en[i];
625 if (data != orig)
626 WREG32(mc_cg_registers[i], data);
627 }
628}
629
630static void gmc_v6_0_enable_bif_mgls(struct amdgpu_device *adev,
631 bool enable)
632{
633 u32 orig, data;
634
635 orig = data = RREG32_PCIE(ixPCIE_CNTL2);
636
637 if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_BIF_LS)) {
638 data = REG_SET_FIELD(data, PCIE_CNTL2, SLV_MEM_LS_EN, 1);
639 data = REG_SET_FIELD(data, PCIE_CNTL2, MST_MEM_LS_EN, 1);
640 data = REG_SET_FIELD(data, PCIE_CNTL2, REPLAY_MEM_LS_EN, 1);
641 data = REG_SET_FIELD(data, PCIE_CNTL2, SLV_MEM_AGGRESSIVE_LS_EN, 1);
642 } else {
643 data = REG_SET_FIELD(data, PCIE_CNTL2, SLV_MEM_LS_EN, 0);
644 data = REG_SET_FIELD(data, PCIE_CNTL2, MST_MEM_LS_EN, 0);
645 data = REG_SET_FIELD(data, PCIE_CNTL2, REPLAY_MEM_LS_EN, 0);
646 data = REG_SET_FIELD(data, PCIE_CNTL2, SLV_MEM_AGGRESSIVE_LS_EN, 0);
647 }
648
649 if (orig != data)
650 WREG32_PCIE(ixPCIE_CNTL2, data);
651}
652
653static void gmc_v6_0_enable_hdp_mgcg(struct amdgpu_device *adev,
654 bool enable)
655{
656 u32 orig, data;
657
658 orig = data = RREG32(HDP_HOST_PATH_CNTL);
659
660 if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_HDP_MGCG))
661 data = REG_SET_FIELD(data, HDP_HOST_PATH_CNTL, CLOCK_GATING_DIS, 0);
662 else
663 data = REG_SET_FIELD(data, HDP_HOST_PATH_CNTL, CLOCK_GATING_DIS, 1);
664
665 if (orig != data)
666 WREG32(HDP_HOST_PATH_CNTL, data);
667}
668
669static void gmc_v6_0_enable_hdp_ls(struct amdgpu_device *adev,
670 bool enable)
671{
672 u32 orig, data;
673
674 orig = data = RREG32(HDP_MEM_POWER_LS);
675
676 if (enable && (adev->cg_flags & AMDGPU_CG_SUPPORT_HDP_LS))
677 data = REG_SET_FIELD(data, HDP_MEM_POWER_LS, LS_ENABLE, 1);
678 else
679 data = REG_SET_FIELD(data, HDP_MEM_POWER_LS, LS_ENABLE, 0);
680
681 if (orig != data)
682 WREG32(HDP_MEM_POWER_LS, data);
683}
684*/
685
686static int gmc_v6_0_convert_vram_type(int mc_seq_vram_type)
687{
688 switch (mc_seq_vram_type) {
689 case MC_SEQ_MISC0__MT__GDDR1:
690 return AMDGPU_VRAM_TYPE_GDDR1;
691 case MC_SEQ_MISC0__MT__DDR2:
692 return AMDGPU_VRAM_TYPE_DDR2;
693 case MC_SEQ_MISC0__MT__GDDR3:
694 return AMDGPU_VRAM_TYPE_GDDR3;
695 case MC_SEQ_MISC0__MT__GDDR4:
696 return AMDGPU_VRAM_TYPE_GDDR4;
697 case MC_SEQ_MISC0__MT__GDDR5:
698 return AMDGPU_VRAM_TYPE_GDDR5;
699 case MC_SEQ_MISC0__MT__DDR3:
700 return AMDGPU_VRAM_TYPE_DDR3;
701 default:
702 return AMDGPU_VRAM_TYPE_UNKNOWN;
703 }
704}
705
706static int gmc_v6_0_early_init(void *handle)
707{
708 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
709
710 gmc_v6_0_set_gart_funcs(adev);
711 gmc_v6_0_set_irq_funcs(adev);
712
713 if (adev->flags & AMD_IS_APU) {
714 adev->mc.vram_type = AMDGPU_VRAM_TYPE_UNKNOWN;
715 } else {
716 u32 tmp = RREG32(MC_SEQ_MISC0);
717 tmp &= MC_SEQ_MISC0__MT__MASK;
718 adev->mc.vram_type = gmc_v6_0_convert_vram_type(tmp);
719 }
720
721 return 0;
722}
723
724static int gmc_v6_0_late_init(void *handle)
725{
726 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
727
728 return amdgpu_irq_get(adev, &adev->mc.vm_fault, 0);
729}
730
731static int gmc_v6_0_sw_init(void *handle)
732{
733 int r;
734 int dma_bits;
735 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
736
737 r = amdgpu_irq_add_id(adev, 146, &adev->mc.vm_fault);
738 if (r)
739 return r;
740
741 r = amdgpu_irq_add_id(adev, 147, &adev->mc.vm_fault);
742 if (r)
743 return r;
744
745 adev->vm_manager.max_pfn = amdgpu_vm_size << 18;
746
747 adev->mc.mc_mask = 0xffffffffffULL;
748
749 adev->need_dma32 = false;
750 dma_bits = adev->need_dma32 ? 32 : 40;
751 r = pci_set_dma_mask(adev->pdev, DMA_BIT_MASK(dma_bits));
752 if (r) {
753 adev->need_dma32 = true;
754 dma_bits = 32;
755 dev_warn(adev->dev, "amdgpu: No suitable DMA available.\n");
756 }
757 r = pci_set_consistent_dma_mask(adev->pdev, DMA_BIT_MASK(dma_bits));
758 if (r) {
759 pci_set_consistent_dma_mask(adev->pdev, DMA_BIT_MASK(32));
760 dev_warn(adev->dev, "amdgpu: No coherent DMA available.\n");
761 }
762
763 r = gmc_v6_0_init_microcode(adev);
764 if (r) {
765 dev_err(adev->dev, "Failed to load mc firmware!\n");
766 return r;
767 }
768
769 r = amdgpu_ttm_global_init(adev);
770 if (r) {
771 return r;
772 }
773
774 r = gmc_v6_0_mc_init(adev);
775 if (r)
776 return r;
777
778 r = amdgpu_bo_init(adev);
779 if (r)
780 return r;
781
782 r = gmc_v6_0_gart_init(adev);
783 if (r)
784 return r;
785
786 if (!adev->vm_manager.enabled) {
787 r = gmc_v6_0_vm_init(adev);
788 if (r) {
789 dev_err(adev->dev, "vm manager initialization failed (%d).\n", r);
790 return r;
791 }
792 adev->vm_manager.enabled = true;
793 }
794
795 return r;
796}
797
798static int gmc_v6_0_sw_fini(void *handle)
799{
800 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
801
802 if (adev->vm_manager.enabled) {
803 gmc_v6_0_vm_fini(adev);
804 adev->vm_manager.enabled = false;
805 }
806 gmc_v6_0_gart_fini(adev);
807 amdgpu_gem_force_release(adev);
808 amdgpu_bo_fini(adev);
809
810 return 0;
811}
812
813static int gmc_v6_0_hw_init(void *handle)
814{
815 int r;
816 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
817
818 gmc_v6_0_mc_program(adev);
819
820 if (!(adev->flags & AMD_IS_APU)) {
821 r = gmc_v6_0_mc_load_microcode(adev);
822 if (r) {
823 dev_err(adev->dev, "Failed to load MC firmware!\n");
824 return r;
825 }
826 }
827
828 r = gmc_v6_0_gart_enable(adev);
829 if (r)
830 return r;
831
832 return r;
833}
834
835static int gmc_v6_0_hw_fini(void *handle)
836{
837 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
838
839 amdgpu_irq_put(adev, &adev->mc.vm_fault, 0);
840 gmc_v6_0_gart_disable(adev);
841
842 return 0;
843}
844
845static int gmc_v6_0_suspend(void *handle)
846{
847 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
848
849 if (adev->vm_manager.enabled) {
850 gmc_v6_0_vm_fini(adev);
851 adev->vm_manager.enabled = false;
852 }
853 gmc_v6_0_hw_fini(adev);
854
855 return 0;
856}
857
858static int gmc_v6_0_resume(void *handle)
859{
860 int r;
861 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
862
863 r = gmc_v6_0_hw_init(adev);
864 if (r)
865 return r;
866
867 if (!adev->vm_manager.enabled) {
868 r = gmc_v6_0_vm_init(adev);
869 if (r) {
870 dev_err(adev->dev, "vm manager initialization failed (%d).\n", r);
871 return r;
872 }
873 adev->vm_manager.enabled = true;
874 }
875
876 return r;
877}
878
879static bool gmc_v6_0_is_idle(void *handle)
880{
881 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
882 u32 tmp = RREG32(SRBM_STATUS);
883
884 if (tmp & (SRBM_STATUS__MCB_BUSY_MASK | SRBM_STATUS__MCB_NON_DISPLAY_BUSY_MASK |
885 SRBM_STATUS__MCC_BUSY_MASK | SRBM_STATUS__MCD_BUSY_MASK | SRBM_STATUS__VMC_BUSY_MASK))
886 return false;
887
888 return true;
889}
890
891static int gmc_v6_0_wait_for_idle(void *handle)
892{
893 unsigned i;
894 u32 tmp;
895 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
896
897 for (i = 0; i < adev->usec_timeout; i++) {
898 tmp = RREG32(SRBM_STATUS) & (SRBM_STATUS__MCB_BUSY_MASK |
899 SRBM_STATUS__MCB_NON_DISPLAY_BUSY_MASK |
900 SRBM_STATUS__MCC_BUSY_MASK |
901 SRBM_STATUS__MCD_BUSY_MASK |
902 SRBM_STATUS__VMC_BUSY_MASK);
903 if (!tmp)
904 return 0;
905 udelay(1);
906 }
907 return -ETIMEDOUT;
908
909}
910
911static int gmc_v6_0_soft_reset(void *handle)
912{
913 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
914 struct amdgpu_mode_mc_save save;
915 u32 srbm_soft_reset = 0;
916 u32 tmp = RREG32(SRBM_STATUS);
917
918 if (tmp & SRBM_STATUS__VMC_BUSY_MASK)
919 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset,
920 mmSRBM_SOFT_RESET, xxSOFT_RESET_VMC, 1);
921
922 if (tmp & (SRBM_STATUS__MCB_BUSY_MASK | SRBM_STATUS__MCB_NON_DISPLAY_BUSY_MASK |
923 SRBM_STATUS__MCC_BUSY_MASK | SRBM_STATUS__MCD_BUSY_MASK)) {
924 if (!(adev->flags & AMD_IS_APU))
925 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset,
926 mmSRBM_SOFT_RESET, xxSOFT_RESET_MC, 1);
927 }
928
929 if (srbm_soft_reset) {
930 gmc_v6_0_mc_stop(adev, &save);
931 if (gmc_v6_0_wait_for_idle(adev)) {
932 dev_warn(adev->dev, "Wait for GMC idle timed out !\n");
933 }
934
935
936 tmp = RREG32(SRBM_SOFT_RESET);
937 tmp |= srbm_soft_reset;
938 dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
939 WREG32(SRBM_SOFT_RESET, tmp);
940 tmp = RREG32(SRBM_SOFT_RESET);
941
942 udelay(50);
943
944 tmp &= ~srbm_soft_reset;
945 WREG32(SRBM_SOFT_RESET, tmp);
946 tmp = RREG32(SRBM_SOFT_RESET);
947
948 udelay(50);
949
950 gmc_v6_0_mc_resume(adev, &save);
951 udelay(50);
952 }
953
954 return 0;
955}
956
957static int gmc_v6_0_vm_fault_interrupt_state(struct amdgpu_device *adev,
958 struct amdgpu_irq_src *src,
959 unsigned type,
960 enum amdgpu_interrupt_state state)
961{
962 u32 tmp;
963 u32 bits = (VM_CONTEXT1_CNTL__RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
964 VM_CONTEXT1_CNTL__DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
965 VM_CONTEXT1_CNTL__PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
966 VM_CONTEXT1_CNTL__VALID_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
967 VM_CONTEXT1_CNTL__READ_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
968 VM_CONTEXT1_CNTL__WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK);
969
970 switch (state) {
971 case AMDGPU_IRQ_STATE_DISABLE:
972 tmp = RREG32(VM_CONTEXT0_CNTL);
973 tmp &= ~bits;
974 WREG32(VM_CONTEXT0_CNTL, tmp);
975 tmp = RREG32(VM_CONTEXT1_CNTL);
976 tmp &= ~bits;
977 WREG32(VM_CONTEXT1_CNTL, tmp);
978 break;
979 case AMDGPU_IRQ_STATE_ENABLE:
980 tmp = RREG32(VM_CONTEXT0_CNTL);
981 tmp |= bits;
982 WREG32(VM_CONTEXT0_CNTL, tmp);
983 tmp = RREG32(VM_CONTEXT1_CNTL);
984 tmp |= bits;
985 WREG32(VM_CONTEXT1_CNTL, tmp);
986 break;
987 default:
988 break;
989 }
990
991 return 0;
992}
993
994static int gmc_v6_0_process_interrupt(struct amdgpu_device *adev,
995 struct amdgpu_irq_src *source,
996 struct amdgpu_iv_entry *entry)
997{
998 u32 addr, status;
999
1000 addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR);
1001 status = RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS);
1002 WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1);
1003
1004 if (!addr && !status)
1005 return 0;
1006
1007 if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_FIRST)
1008 gmc_v6_0_set_fault_enable_default(adev, false);
1009
1010 dev_err(adev->dev, "GPU fault detected: %d 0x%08x\n",
1011 entry->src_id, entry->src_data);
1012 dev_err(adev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n",
1013 addr);
1014 dev_err(adev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
1015 status);
1016 gmc_v6_0_vm_decode_fault(adev, status, addr, 0);
1017
1018 return 0;
1019}
1020
1021static int gmc_v6_0_set_clockgating_state(void *handle,
1022 enum amd_clockgating_state state)
1023{
1024 return 0;
1025}
1026
1027static int gmc_v6_0_set_powergating_state(void *handle,
1028 enum amd_powergating_state state)
1029{
1030 return 0;
1031}
1032
1033const struct amd_ip_funcs gmc_v6_0_ip_funcs = {
1034 .name = "gmc_v6_0",
1035 .early_init = gmc_v6_0_early_init,
1036 .late_init = gmc_v6_0_late_init,
1037 .sw_init = gmc_v6_0_sw_init,
1038 .sw_fini = gmc_v6_0_sw_fini,
1039 .hw_init = gmc_v6_0_hw_init,
1040 .hw_fini = gmc_v6_0_hw_fini,
1041 .suspend = gmc_v6_0_suspend,
1042 .resume = gmc_v6_0_resume,
1043 .is_idle = gmc_v6_0_is_idle,
1044 .wait_for_idle = gmc_v6_0_wait_for_idle,
1045 .soft_reset = gmc_v6_0_soft_reset,
1046 .set_clockgating_state = gmc_v6_0_set_clockgating_state,
1047 .set_powergating_state = gmc_v6_0_set_powergating_state,
1048};
1049
1050static const struct amdgpu_gart_funcs gmc_v6_0_gart_funcs = {
1051 .flush_gpu_tlb = gmc_v6_0_gart_flush_gpu_tlb,
1052 .set_pte_pde = gmc_v6_0_gart_set_pte_pde,
1053};
1054
1055static const struct amdgpu_irq_src_funcs gmc_v6_0_irq_funcs = {
1056 .set = gmc_v6_0_vm_fault_interrupt_state,
1057 .process = gmc_v6_0_process_interrupt,
1058};
1059
1060static void gmc_v6_0_set_gart_funcs(struct amdgpu_device *adev)
1061{
1062 if (adev->gart.gart_funcs == NULL)
1063 adev->gart.gart_funcs = &gmc_v6_0_gart_funcs;
1064}
1065
1066static void gmc_v6_0_set_irq_funcs(struct amdgpu_device *adev)
1067{
1068 adev->mc.vm_fault.num_types = 1;
1069 adev->mc.vm_fault.funcs = &gmc_v6_0_irq_funcs;
1070}
1071
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.h b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.h
new file mode 100644
index 000000000000..42c4fc676cd4
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.h
@@ -0,0 +1,29 @@
1/*
2 * Copyright 2015 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23
24#ifndef __GMC_V6_0_H__
25#define __GMC_V6_0_H__
26
27extern const struct amd_ip_funcs gmc_v6_0_ip_funcs;
28
29#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
index 0b0f08641eed..aa0c4b964621 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
@@ -183,7 +183,7 @@ static int gmc_v7_0_mc_load_microcode(struct amdgpu_device *adev)
183 const struct mc_firmware_header_v1_0 *hdr; 183 const struct mc_firmware_header_v1_0 *hdr;
184 const __le32 *fw_data = NULL; 184 const __le32 *fw_data = NULL;
185 const __le32 *io_mc_regs = NULL; 185 const __le32 *io_mc_regs = NULL;
186 u32 running, blackout = 0; 186 u32 running;
187 int i, ucode_size, regs_size; 187 int i, ucode_size, regs_size;
188 188
189 if (!adev->mc.fw) 189 if (!adev->mc.fw)
@@ -203,11 +203,6 @@ static int gmc_v7_0_mc_load_microcode(struct amdgpu_device *adev)
203 running = REG_GET_FIELD(RREG32(mmMC_SEQ_SUP_CNTL), MC_SEQ_SUP_CNTL, RUN); 203 running = REG_GET_FIELD(RREG32(mmMC_SEQ_SUP_CNTL), MC_SEQ_SUP_CNTL, RUN);
204 204
205 if (running == 0) { 205 if (running == 0) {
206 if (running) {
207 blackout = RREG32(mmMC_SHARED_BLACKOUT_CNTL);
208 WREG32(mmMC_SHARED_BLACKOUT_CNTL, blackout | 1);
209 }
210
211 /* reset the engine and set to writable */ 206 /* reset the engine and set to writable */
212 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000008); 207 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000008);
213 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000010); 208 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000010);
@@ -239,9 +234,6 @@ static int gmc_v7_0_mc_load_microcode(struct amdgpu_device *adev)
239 break; 234 break;
240 udelay(1); 235 udelay(1);
241 } 236 }
242
243 if (running)
244 WREG32(mmMC_SHARED_BLACKOUT_CNTL, blackout);
245 } 237 }
246 238
247 return 0; 239 return 0;
@@ -393,7 +385,7 @@ static int gmc_v7_0_mc_init(struct amdgpu_device *adev)
393 * size equal to the 1024 or vram, whichever is larger. 385 * size equal to the 1024 or vram, whichever is larger.
394 */ 386 */
395 if (amdgpu_gart_size == -1) 387 if (amdgpu_gart_size == -1)
396 adev->mc.gtt_size = max((1024ULL << 20), adev->mc.mc_vram_size); 388 adev->mc.gtt_size = amdgpu_ttm_get_gtt_mem_size(adev);
397 else 389 else
398 adev->mc.gtt_size = (uint64_t)amdgpu_gart_size << 20; 390 adev->mc.gtt_size = (uint64_t)amdgpu_gart_size << 20;
399 391
@@ -953,6 +945,11 @@ static int gmc_v7_0_sw_init(void *handle)
953 return r; 945 return r;
954 } 946 }
955 947
948 r = amdgpu_ttm_global_init(adev);
949 if (r) {
950 return r;
951 }
952
956 r = gmc_v7_0_mc_init(adev); 953 r = gmc_v7_0_mc_init(adev);
957 if (r) 954 if (r)
958 return r; 955 return r;
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
index 2aee2c6f3cd5..1b319f5bc696 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
@@ -261,7 +261,7 @@ static int gmc_v8_0_mc_load_microcode(struct amdgpu_device *adev)
261 const struct mc_firmware_header_v1_0 *hdr; 261 const struct mc_firmware_header_v1_0 *hdr;
262 const __le32 *fw_data = NULL; 262 const __le32 *fw_data = NULL;
263 const __le32 *io_mc_regs = NULL; 263 const __le32 *io_mc_regs = NULL;
264 u32 running, blackout = 0; 264 u32 running;
265 int i, ucode_size, regs_size; 265 int i, ucode_size, regs_size;
266 266
267 if (!adev->mc.fw) 267 if (!adev->mc.fw)
@@ -269,8 +269,10 @@ static int gmc_v8_0_mc_load_microcode(struct amdgpu_device *adev)
269 269
270 /* Skip MC ucode loading on SR-IOV capable boards. 270 /* Skip MC ucode loading on SR-IOV capable boards.
271 * vbios does this for us in asic_init in that case. 271 * vbios does this for us in asic_init in that case.
272 * Skip MC ucode loading on VF, because hypervisor will do that
273 * for this adaptor.
272 */ 274 */
273 if (adev->virtualization.supports_sr_iov) 275 if (amdgpu_sriov_bios(adev))
274 return 0; 276 return 0;
275 277
276 hdr = (const struct mc_firmware_header_v1_0 *)adev->mc.fw->data; 278 hdr = (const struct mc_firmware_header_v1_0 *)adev->mc.fw->data;
@@ -287,11 +289,6 @@ static int gmc_v8_0_mc_load_microcode(struct amdgpu_device *adev)
287 running = REG_GET_FIELD(RREG32(mmMC_SEQ_SUP_CNTL), MC_SEQ_SUP_CNTL, RUN); 289 running = REG_GET_FIELD(RREG32(mmMC_SEQ_SUP_CNTL), MC_SEQ_SUP_CNTL, RUN);
288 290
289 if (running == 0) { 291 if (running == 0) {
290 if (running) {
291 blackout = RREG32(mmMC_SHARED_BLACKOUT_CNTL);
292 WREG32(mmMC_SHARED_BLACKOUT_CNTL, blackout | 1);
293 }
294
295 /* reset the engine and set to writable */ 292 /* reset the engine and set to writable */
296 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000008); 293 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000008);
297 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000010); 294 WREG32(mmMC_SEQ_SUP_CNTL, 0x00000010);
@@ -323,9 +320,6 @@ static int gmc_v8_0_mc_load_microcode(struct amdgpu_device *adev)
323 break; 320 break;
324 udelay(1); 321 udelay(1);
325 } 322 }
326
327 if (running)
328 WREG32(mmMC_SHARED_BLACKOUT_CNTL, blackout);
329 } 323 }
330 324
331 return 0; 325 return 0;
@@ -477,7 +471,7 @@ static int gmc_v8_0_mc_init(struct amdgpu_device *adev)
477 * size equal to the 1024 or vram, whichever is larger. 471 * size equal to the 1024 or vram, whichever is larger.
478 */ 472 */
479 if (amdgpu_gart_size == -1) 473 if (amdgpu_gart_size == -1)
480 adev->mc.gtt_size = max((1024ULL << 20), adev->mc.mc_vram_size); 474 adev->mc.gtt_size = amdgpu_ttm_get_gtt_mem_size(adev);
481 else 475 else
482 adev->mc.gtt_size = (uint64_t)amdgpu_gart_size << 20; 476 adev->mc.gtt_size = (uint64_t)amdgpu_gart_size << 20;
483 477
@@ -957,6 +951,11 @@ static int gmc_v8_0_sw_init(void *handle)
957 return r; 951 return r;
958 } 952 }
959 953
954 r = amdgpu_ttm_global_init(adev);
955 if (r) {
956 return r;
957 }
958
960 r = gmc_v8_0_mc_init(adev); 959 r = gmc_v8_0_mc_init(adev);
961 if (r) 960 if (r)
962 return r; 961 return r;
@@ -1100,9 +1099,8 @@ static int gmc_v8_0_wait_for_idle(void *handle)
1100 1099
1101} 1100}
1102 1101
1103static int gmc_v8_0_soft_reset(void *handle) 1102static int gmc_v8_0_check_soft_reset(void *handle)
1104{ 1103{
1105 struct amdgpu_mode_mc_save save;
1106 u32 srbm_soft_reset = 0; 1104 u32 srbm_soft_reset = 0;
1107 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1105 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1108 u32 tmp = RREG32(mmSRBM_STATUS); 1106 u32 tmp = RREG32(mmSRBM_STATUS);
@@ -1117,13 +1115,42 @@ static int gmc_v8_0_soft_reset(void *handle)
1117 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, 1115 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset,
1118 SRBM_SOFT_RESET, SOFT_RESET_MC, 1); 1116 SRBM_SOFT_RESET, SOFT_RESET_MC, 1);
1119 } 1117 }
1120
1121 if (srbm_soft_reset) { 1118 if (srbm_soft_reset) {
1122 gmc_v8_0_mc_stop(adev, &save); 1119 adev->ip_block_status[AMD_IP_BLOCK_TYPE_GMC].hang = true;
1123 if (gmc_v8_0_wait_for_idle((void *)adev)) { 1120 adev->mc.srbm_soft_reset = srbm_soft_reset;
1124 dev_warn(adev->dev, "Wait for GMC idle timed out !\n"); 1121 } else {
1125 } 1122 adev->ip_block_status[AMD_IP_BLOCK_TYPE_GMC].hang = false;
1123 adev->mc.srbm_soft_reset = 0;
1124 }
1125 return 0;
1126}
1126 1127
1128static int gmc_v8_0_pre_soft_reset(void *handle)
1129{
1130 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1131
1132 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_GMC].hang)
1133 return 0;
1134
1135 gmc_v8_0_mc_stop(adev, &adev->mc.save);
1136 if (gmc_v8_0_wait_for_idle(adev)) {
1137 dev_warn(adev->dev, "Wait for GMC idle timed out !\n");
1138 }
1139
1140 return 0;
1141}
1142
1143static int gmc_v8_0_soft_reset(void *handle)
1144{
1145 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1146 u32 srbm_soft_reset;
1147
1148 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_GMC].hang)
1149 return 0;
1150 srbm_soft_reset = adev->mc.srbm_soft_reset;
1151
1152 if (srbm_soft_reset) {
1153 u32 tmp;
1127 1154
1128 tmp = RREG32(mmSRBM_SOFT_RESET); 1155 tmp = RREG32(mmSRBM_SOFT_RESET);
1129 tmp |= srbm_soft_reset; 1156 tmp |= srbm_soft_reset;
@@ -1139,14 +1166,22 @@ static int gmc_v8_0_soft_reset(void *handle)
1139 1166
1140 /* Wait a little for things to settle down */ 1167 /* Wait a little for things to settle down */
1141 udelay(50); 1168 udelay(50);
1142
1143 gmc_v8_0_mc_resume(adev, &save);
1144 udelay(50);
1145 } 1169 }
1146 1170
1147 return 0; 1171 return 0;
1148} 1172}
1149 1173
1174static int gmc_v8_0_post_soft_reset(void *handle)
1175{
1176 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1177
1178 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_GMC].hang)
1179 return 0;
1180
1181 gmc_v8_0_mc_resume(adev, &adev->mc.save);
1182 return 0;
1183}
1184
1150static int gmc_v8_0_vm_fault_interrupt_state(struct amdgpu_device *adev, 1185static int gmc_v8_0_vm_fault_interrupt_state(struct amdgpu_device *adev,
1151 struct amdgpu_irq_src *src, 1186 struct amdgpu_irq_src *src,
1152 unsigned type, 1187 unsigned type,
@@ -1414,7 +1449,10 @@ const struct amd_ip_funcs gmc_v8_0_ip_funcs = {
1414 .resume = gmc_v8_0_resume, 1449 .resume = gmc_v8_0_resume,
1415 .is_idle = gmc_v8_0_is_idle, 1450 .is_idle = gmc_v8_0_is_idle,
1416 .wait_for_idle = gmc_v8_0_wait_for_idle, 1451 .wait_for_idle = gmc_v8_0_wait_for_idle,
1452 .check_soft_reset = gmc_v8_0_check_soft_reset,
1453 .pre_soft_reset = gmc_v8_0_pre_soft_reset,
1417 .soft_reset = gmc_v8_0_soft_reset, 1454 .soft_reset = gmc_v8_0_soft_reset,
1455 .post_soft_reset = gmc_v8_0_post_soft_reset,
1418 .set_clockgating_state = gmc_v8_0_set_clockgating_state, 1456 .set_clockgating_state = gmc_v8_0_set_clockgating_state,
1419 .set_powergating_state = gmc_v8_0_set_powergating_state, 1457 .set_powergating_state = gmc_v8_0_set_powergating_state,
1420}; 1458};
diff --git a/drivers/gpu/drm/amd/amdgpu/iceland_dpm.c b/drivers/gpu/drm/amd/amdgpu/iceland_dpm.c
deleted file mode 100644
index 2f078ad6095c..000000000000
--- a/drivers/gpu/drm/amd/amdgpu/iceland_dpm.c
+++ /dev/null
@@ -1,200 +0,0 @@
1/*
2 * Copyright 2014 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23
24#include <linux/firmware.h>
25#include "drmP.h"
26#include "amdgpu.h"
27#include "iceland_smum.h"
28
29MODULE_FIRMWARE("amdgpu/topaz_smc.bin");
30
31static void iceland_dpm_set_funcs(struct amdgpu_device *adev);
32
33static int iceland_dpm_early_init(void *handle)
34{
35 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
36
37 iceland_dpm_set_funcs(adev);
38
39 return 0;
40}
41
42static int iceland_dpm_init_microcode(struct amdgpu_device *adev)
43{
44 char fw_name[30] = "amdgpu/topaz_smc.bin";
45 int err;
46
47 err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
48 if (err)
49 goto out;
50 err = amdgpu_ucode_validate(adev->pm.fw);
51
52out:
53 if (err) {
54 DRM_ERROR("Failed to load firmware \"%s\"", fw_name);
55 release_firmware(adev->pm.fw);
56 adev->pm.fw = NULL;
57 }
58 return err;
59}
60
61static int iceland_dpm_sw_init(void *handle)
62{
63 int ret;
64 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
65
66 ret = iceland_dpm_init_microcode(adev);
67 if (ret)
68 return ret;
69
70 return 0;
71}
72
73static int iceland_dpm_sw_fini(void *handle)
74{
75 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
76
77 release_firmware(adev->pm.fw);
78 adev->pm.fw = NULL;
79
80 return 0;
81}
82
83static int iceland_dpm_hw_init(void *handle)
84{
85 int ret;
86 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
87
88 mutex_lock(&adev->pm.mutex);
89
90 /* smu init only needs to be called at startup, not resume.
91 * It should be in sw_init, but requires the fw info gathered
92 * in sw_init from other IP modules.
93 */
94 ret = iceland_smu_init(adev);
95 if (ret) {
96 DRM_ERROR("SMU initialization failed\n");
97 goto fail;
98 }
99
100 ret = iceland_smu_start(adev);
101 if (ret) {
102 DRM_ERROR("SMU start failed\n");
103 goto fail;
104 }
105
106 mutex_unlock(&adev->pm.mutex);
107 return 0;
108
109fail:
110 adev->firmware.smu_load = false;
111 mutex_unlock(&adev->pm.mutex);
112 return -EINVAL;
113}
114
115static int iceland_dpm_hw_fini(void *handle)
116{
117 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
118
119 mutex_lock(&adev->pm.mutex);
120 /* smu fini only needs to be called at teardown, not suspend.
121 * It should be in sw_fini, but we put it here for symmetry
122 * with smu init.
123 */
124 iceland_smu_fini(adev);
125 mutex_unlock(&adev->pm.mutex);
126 return 0;
127}
128
129static int iceland_dpm_suspend(void *handle)
130{
131 return 0;
132}
133
134static int iceland_dpm_resume(void *handle)
135{
136 int ret;
137 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
138
139 mutex_lock(&adev->pm.mutex);
140
141 ret = iceland_smu_start(adev);
142 if (ret) {
143 DRM_ERROR("SMU start failed\n");
144 goto fail;
145 }
146
147fail:
148 mutex_unlock(&adev->pm.mutex);
149 return ret;
150}
151
152static int iceland_dpm_set_clockgating_state(void *handle,
153 enum amd_clockgating_state state)
154{
155 return 0;
156}
157
158static int iceland_dpm_set_powergating_state(void *handle,
159 enum amd_powergating_state state)
160{
161 return 0;
162}
163
164const struct amd_ip_funcs iceland_dpm_ip_funcs = {
165 .name = "iceland_dpm",
166 .early_init = iceland_dpm_early_init,
167 .late_init = NULL,
168 .sw_init = iceland_dpm_sw_init,
169 .sw_fini = iceland_dpm_sw_fini,
170 .hw_init = iceland_dpm_hw_init,
171 .hw_fini = iceland_dpm_hw_fini,
172 .suspend = iceland_dpm_suspend,
173 .resume = iceland_dpm_resume,
174 .is_idle = NULL,
175 .wait_for_idle = NULL,
176 .soft_reset = NULL,
177 .set_clockgating_state = iceland_dpm_set_clockgating_state,
178 .set_powergating_state = iceland_dpm_set_powergating_state,
179};
180
181static const struct amdgpu_dpm_funcs iceland_dpm_funcs = {
182 .get_temperature = NULL,
183 .pre_set_power_state = NULL,
184 .set_power_state = NULL,
185 .post_set_power_state = NULL,
186 .display_configuration_changed = NULL,
187 .get_sclk = NULL,
188 .get_mclk = NULL,
189 .print_power_state = NULL,
190 .debugfs_print_current_performance_level = NULL,
191 .force_performance_level = NULL,
192 .vblank_too_short = NULL,
193 .powergate_uvd = NULL,
194};
195
196static void iceland_dpm_set_funcs(struct amdgpu_device *adev)
197{
198 if (NULL == adev->pm.funcs)
199 adev->pm.funcs = &iceland_dpm_funcs;
200}
diff --git a/drivers/gpu/drm/amd/amdgpu/iceland_smc.c b/drivers/gpu/drm/amd/amdgpu/iceland_smc.c
deleted file mode 100644
index 211839913728..000000000000
--- a/drivers/gpu/drm/amd/amdgpu/iceland_smc.c
+++ /dev/null
@@ -1,677 +0,0 @@
1/*
2 * Copyright 2014 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23
24#include <linux/firmware.h>
25#include "drmP.h"
26#include "amdgpu.h"
27#include "ppsmc.h"
28#include "iceland_smum.h"
29#include "smu_ucode_xfer_vi.h"
30#include "amdgpu_ucode.h"
31
32#include "smu/smu_7_1_1_d.h"
33#include "smu/smu_7_1_1_sh_mask.h"
34
35#define ICELAND_SMC_SIZE 0x20000
36
37static int iceland_set_smc_sram_address(struct amdgpu_device *adev,
38 uint32_t smc_address, uint32_t limit)
39{
40 uint32_t val;
41
42 if (smc_address & 3)
43 return -EINVAL;
44
45 if ((smc_address + 3) > limit)
46 return -EINVAL;
47
48 WREG32(mmSMC_IND_INDEX_0, smc_address);
49
50 val = RREG32(mmSMC_IND_ACCESS_CNTL);
51 val = REG_SET_FIELD(val, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, 0);
52 WREG32(mmSMC_IND_ACCESS_CNTL, val);
53
54 return 0;
55}
56
57static int iceland_copy_bytes_to_smc(struct amdgpu_device *adev,
58 uint32_t smc_start_address,
59 const uint8_t *src,
60 uint32_t byte_count, uint32_t limit)
61{
62 uint32_t addr;
63 uint32_t data, orig_data;
64 int result = 0;
65 uint32_t extra_shift;
66 unsigned long flags;
67
68 if (smc_start_address & 3)
69 return -EINVAL;
70
71 if ((smc_start_address + byte_count) > limit)
72 return -EINVAL;
73
74 addr = smc_start_address;
75
76 spin_lock_irqsave(&adev->smc_idx_lock, flags);
77 while (byte_count >= 4) {
78 /* Bytes are written into the SMC addres space with the MSB first */
79 data = (src[0] << 24) + (src[1] << 16) + (src[2] << 8) + src[3];
80
81 result = iceland_set_smc_sram_address(adev, addr, limit);
82
83 if (result)
84 goto out;
85
86 WREG32(mmSMC_IND_DATA_0, data);
87
88 src += 4;
89 byte_count -= 4;
90 addr += 4;
91 }
92
93 if (0 != byte_count) {
94 /* Now write odd bytes left, do a read modify write cycle */
95 data = 0;
96
97 result = iceland_set_smc_sram_address(adev, addr, limit);
98 if (result)
99 goto out;
100
101 orig_data = RREG32(mmSMC_IND_DATA_0);
102 extra_shift = 8 * (4 - byte_count);
103
104 while (byte_count > 0) {
105 data = (data << 8) + *src++;
106 byte_count--;
107 }
108
109 data <<= extra_shift;
110 data |= (orig_data & ~((~0UL) << extra_shift));
111
112 result = iceland_set_smc_sram_address(adev, addr, limit);
113 if (result)
114 goto out;
115
116 WREG32(mmSMC_IND_DATA_0, data);
117 }
118
119out:
120 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
121 return result;
122}
123
124void iceland_start_smc(struct amdgpu_device *adev)
125{
126 uint32_t val = RREG32_SMC(ixSMC_SYSCON_RESET_CNTL);
127
128 val = REG_SET_FIELD(val, SMC_SYSCON_RESET_CNTL, rst_reg, 0);
129 WREG32_SMC(ixSMC_SYSCON_RESET_CNTL, val);
130}
131
132void iceland_reset_smc(struct amdgpu_device *adev)
133{
134 uint32_t val = RREG32_SMC(ixSMC_SYSCON_RESET_CNTL);
135
136 val = REG_SET_FIELD(val, SMC_SYSCON_RESET_CNTL, rst_reg, 1);
137 WREG32_SMC(ixSMC_SYSCON_RESET_CNTL, val);
138}
139
140static int iceland_program_jump_on_start(struct amdgpu_device *adev)
141{
142 static unsigned char data[] = {0xE0, 0x00, 0x80, 0x40};
143 iceland_copy_bytes_to_smc(adev, 0x0, data, 4, sizeof(data)+1);
144
145 return 0;
146}
147
148void iceland_stop_smc_clock(struct amdgpu_device *adev)
149{
150 uint32_t val = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
151
152 val = REG_SET_FIELD(val, SMC_SYSCON_CLOCK_CNTL_0, ck_disable, 1);
153 WREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0, val);
154}
155
156void iceland_start_smc_clock(struct amdgpu_device *adev)
157{
158 uint32_t val = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
159
160 val = REG_SET_FIELD(val, SMC_SYSCON_CLOCK_CNTL_0, ck_disable, 0);
161 WREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0, val);
162}
163
164static bool iceland_is_smc_ram_running(struct amdgpu_device *adev)
165{
166 uint32_t val = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
167 val = REG_GET_FIELD(val, SMC_SYSCON_CLOCK_CNTL_0, ck_disable);
168
169 return ((0 == val) && (0x20100 <= RREG32_SMC(ixSMC_PC_C)));
170}
171
172static int wait_smu_response(struct amdgpu_device *adev)
173{
174 int i;
175 uint32_t val;
176
177 for (i = 0; i < adev->usec_timeout; i++) {
178 val = RREG32(mmSMC_RESP_0);
179 if (REG_GET_FIELD(val, SMC_RESP_0, SMC_RESP))
180 break;
181 udelay(1);
182 }
183
184 if (i == adev->usec_timeout)
185 return -EINVAL;
186
187 return 0;
188}
189
190static int iceland_send_msg_to_smc(struct amdgpu_device *adev, PPSMC_Msg msg)
191{
192 if (!iceland_is_smc_ram_running(adev))
193 return -EINVAL;
194
195 if (wait_smu_response(adev)) {
196 DRM_ERROR("Failed to send previous message\n");
197 return -EINVAL;
198 }
199
200 WREG32(mmSMC_MESSAGE_0, msg);
201
202 if (wait_smu_response(adev)) {
203 DRM_ERROR("Failed to send message\n");
204 return -EINVAL;
205 }
206
207 return 0;
208}
209
210static int iceland_send_msg_to_smc_without_waiting(struct amdgpu_device *adev,
211 PPSMC_Msg msg)
212{
213 if (!iceland_is_smc_ram_running(adev))
214 return -EINVAL;
215
216 if (wait_smu_response(adev)) {
217 DRM_ERROR("Failed to send previous message\n");
218 return -EINVAL;
219 }
220
221 WREG32(mmSMC_MESSAGE_0, msg);
222
223 return 0;
224}
225
226static int iceland_send_msg_to_smc_with_parameter(struct amdgpu_device *adev,
227 PPSMC_Msg msg,
228 uint32_t parameter)
229{
230 WREG32(mmSMC_MSG_ARG_0, parameter);
231
232 return iceland_send_msg_to_smc(adev, msg);
233}
234
235static int iceland_send_msg_to_smc_with_parameter_without_waiting(
236 struct amdgpu_device *adev,
237 PPSMC_Msg msg, uint32_t parameter)
238{
239 WREG32(mmSMC_MSG_ARG_0, parameter);
240
241 return iceland_send_msg_to_smc_without_waiting(adev, msg);
242}
243
244#if 0 /* not used yet */
245static int iceland_wait_for_smc_inactive(struct amdgpu_device *adev)
246{
247 int i;
248 uint32_t val;
249
250 if (!iceland_is_smc_ram_running(adev))
251 return -EINVAL;
252
253 for (i = 0; i < adev->usec_timeout; i++) {
254 val = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
255 if (REG_GET_FIELD(val, SMC_SYSCON_CLOCK_CNTL_0, cken) == 0)
256 break;
257 udelay(1);
258 }
259
260 if (i == adev->usec_timeout)
261 return -EINVAL;
262
263 return 0;
264}
265#endif
266
267static int iceland_smu_upload_firmware_image(struct amdgpu_device *adev)
268{
269 const struct smc_firmware_header_v1_0 *hdr;
270 uint32_t ucode_size;
271 uint32_t ucode_start_address;
272 const uint8_t *src;
273 uint32_t val;
274 uint32_t byte_count;
275 uint32_t data;
276 unsigned long flags;
277 int i;
278
279 if (!adev->pm.fw)
280 return -EINVAL;
281
282 /* Skip SMC ucode loading on SR-IOV capable boards.
283 * vbios does this for us in asic_init in that case.
284 */
285 if (adev->virtualization.supports_sr_iov)
286 return 0;
287
288 hdr = (const struct smc_firmware_header_v1_0 *)adev->pm.fw->data;
289 amdgpu_ucode_print_smc_hdr(&hdr->header);
290
291 adev->pm.fw_version = le32_to_cpu(hdr->header.ucode_version);
292 ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes);
293 ucode_start_address = le32_to_cpu(hdr->ucode_start_addr);
294 src = (const uint8_t *)
295 (adev->pm.fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
296
297 if (ucode_size & 3) {
298 DRM_ERROR("SMC ucode is not 4 bytes aligned\n");
299 return -EINVAL;
300 }
301
302 if (ucode_size > ICELAND_SMC_SIZE) {
303 DRM_ERROR("SMC address is beyond the SMC RAM area\n");
304 return -EINVAL;
305 }
306
307 for (i = 0; i < adev->usec_timeout; i++) {
308 val = RREG32_SMC(ixRCU_UC_EVENTS);
309 if (REG_GET_FIELD(val, RCU_UC_EVENTS, boot_seq_done) == 0)
310 break;
311 udelay(1);
312 }
313 val = RREG32_SMC(ixSMC_SYSCON_MISC_CNTL);
314 WREG32_SMC(ixSMC_SYSCON_MISC_CNTL, val | 1);
315
316 iceland_stop_smc_clock(adev);
317 iceland_reset_smc(adev);
318
319 spin_lock_irqsave(&adev->smc_idx_lock, flags);
320 WREG32(mmSMC_IND_INDEX_0, ucode_start_address);
321
322 val = RREG32(mmSMC_IND_ACCESS_CNTL);
323 val = REG_SET_FIELD(val, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, 1);
324 WREG32(mmSMC_IND_ACCESS_CNTL, val);
325
326 byte_count = ucode_size;
327 while (byte_count >= 4) {
328 data = (src[0] << 24) + (src[1] << 16) + (src[2] << 8) + src[3];
329 WREG32(mmSMC_IND_DATA_0, data);
330 src += 4;
331 byte_count -= 4;
332 }
333 val = RREG32(mmSMC_IND_ACCESS_CNTL);
334 val = REG_SET_FIELD(val, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, 0);
335 WREG32(mmSMC_IND_ACCESS_CNTL, val);
336 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
337
338 return 0;
339}
340
341#if 0 /* not used yet */
342static int iceland_read_smc_sram_dword(struct amdgpu_device *adev,
343 uint32_t smc_address,
344 uint32_t *value,
345 uint32_t limit)
346{
347 int result;
348 unsigned long flags;
349
350 spin_lock_irqsave(&adev->smc_idx_lock, flags);
351 result = iceland_set_smc_sram_address(adev, smc_address, limit);
352 if (result == 0)
353 *value = RREG32(mmSMC_IND_DATA_0);
354 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
355 return result;
356}
357
358static int iceland_write_smc_sram_dword(struct amdgpu_device *adev,
359 uint32_t smc_address,
360 uint32_t value,
361 uint32_t limit)
362{
363 int result;
364 unsigned long flags;
365
366 spin_lock_irqsave(&adev->smc_idx_lock, flags);
367 result = iceland_set_smc_sram_address(adev, smc_address, limit);
368 if (result == 0)
369 WREG32(mmSMC_IND_DATA_0, value);
370 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
371 return result;
372}
373
374static int iceland_smu_stop_smc(struct amdgpu_device *adev)
375{
376 iceland_reset_smc(adev);
377 iceland_stop_smc_clock(adev);
378
379 return 0;
380}
381#endif
382
383static int iceland_smu_start_smc(struct amdgpu_device *adev)
384{
385 int i;
386 uint32_t val;
387
388 iceland_program_jump_on_start(adev);
389 iceland_start_smc_clock(adev);
390 iceland_start_smc(adev);
391
392 for (i = 0; i < adev->usec_timeout; i++) {
393 val = RREG32_SMC(ixFIRMWARE_FLAGS);
394 if (REG_GET_FIELD(val, FIRMWARE_FLAGS, INTERRUPTS_ENABLED) == 1)
395 break;
396 udelay(1);
397 }
398 return 0;
399}
400
401static enum AMDGPU_UCODE_ID iceland_convert_fw_type(uint32_t fw_type)
402{
403 switch (fw_type) {
404 case UCODE_ID_SDMA0:
405 return AMDGPU_UCODE_ID_SDMA0;
406 case UCODE_ID_SDMA1:
407 return AMDGPU_UCODE_ID_SDMA1;
408 case UCODE_ID_CP_CE:
409 return AMDGPU_UCODE_ID_CP_CE;
410 case UCODE_ID_CP_PFP:
411 return AMDGPU_UCODE_ID_CP_PFP;
412 case UCODE_ID_CP_ME:
413 return AMDGPU_UCODE_ID_CP_ME;
414 case UCODE_ID_CP_MEC:
415 case UCODE_ID_CP_MEC_JT1:
416 return AMDGPU_UCODE_ID_CP_MEC1;
417 case UCODE_ID_CP_MEC_JT2:
418 return AMDGPU_UCODE_ID_CP_MEC2;
419 case UCODE_ID_RLC_G:
420 return AMDGPU_UCODE_ID_RLC_G;
421 default:
422 DRM_ERROR("ucode type is out of range!\n");
423 return AMDGPU_UCODE_ID_MAXIMUM;
424 }
425}
426
427static uint32_t iceland_smu_get_mask_for_fw_type(uint32_t fw_type)
428{
429 switch (fw_type) {
430 case AMDGPU_UCODE_ID_SDMA0:
431 return UCODE_ID_SDMA0_MASK;
432 case AMDGPU_UCODE_ID_SDMA1:
433 return UCODE_ID_SDMA1_MASK;
434 case AMDGPU_UCODE_ID_CP_CE:
435 return UCODE_ID_CP_CE_MASK;
436 case AMDGPU_UCODE_ID_CP_PFP:
437 return UCODE_ID_CP_PFP_MASK;
438 case AMDGPU_UCODE_ID_CP_ME:
439 return UCODE_ID_CP_ME_MASK;
440 case AMDGPU_UCODE_ID_CP_MEC1:
441 return UCODE_ID_CP_MEC_MASK | UCODE_ID_CP_MEC_JT1_MASK;
442 case AMDGPU_UCODE_ID_CP_MEC2:
443 return UCODE_ID_CP_MEC_MASK;
444 case AMDGPU_UCODE_ID_RLC_G:
445 return UCODE_ID_RLC_G_MASK;
446 default:
447 DRM_ERROR("ucode type is out of range!\n");
448 return 0;
449 }
450}
451
452static int iceland_smu_populate_single_firmware_entry(struct amdgpu_device *adev,
453 uint32_t fw_type,
454 struct SMU_Entry *entry)
455{
456 enum AMDGPU_UCODE_ID id = iceland_convert_fw_type(fw_type);
457 struct amdgpu_firmware_info *ucode = &adev->firmware.ucode[id];
458 const struct gfx_firmware_header_v1_0 *header = NULL;
459 uint64_t gpu_addr;
460 uint32_t data_size;
461
462 if (ucode->fw == NULL)
463 return -EINVAL;
464
465 gpu_addr = ucode->mc_addr;
466 header = (const struct gfx_firmware_header_v1_0 *)ucode->fw->data;
467 data_size = le32_to_cpu(header->header.ucode_size_bytes);
468
469 entry->version = (uint16_t)le32_to_cpu(header->header.ucode_version);
470 entry->id = (uint16_t)fw_type;
471 entry->image_addr_high = upper_32_bits(gpu_addr);
472 entry->image_addr_low = lower_32_bits(gpu_addr);
473 entry->meta_data_addr_high = 0;
474 entry->meta_data_addr_low = 0;
475 entry->data_size_byte = data_size;
476 entry->num_register_entries = 0;
477 entry->flags = 0;
478
479 return 0;
480}
481
482static int iceland_smu_request_load_fw(struct amdgpu_device *adev)
483{
484 struct iceland_smu_private_data *private = (struct iceland_smu_private_data *)adev->smu.priv;
485 struct SMU_DRAMData_TOC *toc;
486 uint32_t fw_to_load;
487
488 toc = (struct SMU_DRAMData_TOC *)private->header;
489 toc->num_entries = 0;
490 toc->structure_version = 1;
491
492 if (!adev->firmware.smu_load)
493 return 0;
494
495 if (iceland_smu_populate_single_firmware_entry(adev, UCODE_ID_RLC_G,
496 &toc->entry[toc->num_entries++])) {
497 DRM_ERROR("Failed to get firmware entry for RLC\n");
498 return -EINVAL;
499 }
500
501 if (iceland_smu_populate_single_firmware_entry(adev, UCODE_ID_CP_CE,
502 &toc->entry[toc->num_entries++])) {
503 DRM_ERROR("Failed to get firmware entry for CE\n");
504 return -EINVAL;
505 }
506
507 if (iceland_smu_populate_single_firmware_entry(adev, UCODE_ID_CP_PFP,
508 &toc->entry[toc->num_entries++])) {
509 DRM_ERROR("Failed to get firmware entry for PFP\n");
510 return -EINVAL;
511 }
512
513 if (iceland_smu_populate_single_firmware_entry(adev, UCODE_ID_CP_ME,
514 &toc->entry[toc->num_entries++])) {
515 DRM_ERROR("Failed to get firmware entry for ME\n");
516 return -EINVAL;
517 }
518
519 if (iceland_smu_populate_single_firmware_entry(adev, UCODE_ID_CP_MEC,
520 &toc->entry[toc->num_entries++])) {
521 DRM_ERROR("Failed to get firmware entry for MEC\n");
522 return -EINVAL;
523 }
524
525 if (iceland_smu_populate_single_firmware_entry(adev, UCODE_ID_CP_MEC_JT1,
526 &toc->entry[toc->num_entries++])) {
527 DRM_ERROR("Failed to get firmware entry for MEC_JT1\n");
528 return -EINVAL;
529 }
530
531 if (iceland_smu_populate_single_firmware_entry(adev, UCODE_ID_SDMA0,
532 &toc->entry[toc->num_entries++])) {
533 DRM_ERROR("Failed to get firmware entry for SDMA0\n");
534 return -EINVAL;
535 }
536
537 if (iceland_smu_populate_single_firmware_entry(adev, UCODE_ID_SDMA1,
538 &toc->entry[toc->num_entries++])) {
539 DRM_ERROR("Failed to get firmware entry for SDMA1\n");
540 return -EINVAL;
541 }
542
543 iceland_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_DRV_DRAM_ADDR_HI, private->header_addr_high);
544 iceland_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_DRV_DRAM_ADDR_LO, private->header_addr_low);
545
546 fw_to_load = UCODE_ID_RLC_G_MASK |
547 UCODE_ID_SDMA0_MASK |
548 UCODE_ID_SDMA1_MASK |
549 UCODE_ID_CP_CE_MASK |
550 UCODE_ID_CP_ME_MASK |
551 UCODE_ID_CP_PFP_MASK |
552 UCODE_ID_CP_MEC_MASK |
553 UCODE_ID_CP_MEC_JT1_MASK;
554
555
556 if (iceland_send_msg_to_smc_with_parameter_without_waiting(adev, PPSMC_MSG_LoadUcodes, fw_to_load)) {
557 DRM_ERROR("Fail to request SMU load ucode\n");
558 return -EINVAL;
559 }
560
561 return 0;
562}
563
564static int iceland_smu_check_fw_load_finish(struct amdgpu_device *adev,
565 uint32_t fw_type)
566{
567 uint32_t fw_mask = iceland_smu_get_mask_for_fw_type(fw_type);
568 int i;
569
570 for (i = 0; i < adev->usec_timeout; i++) {
571 if (fw_mask == (RREG32_SMC(ixSOFT_REGISTERS_TABLE_27) & fw_mask))
572 break;
573 udelay(1);
574 }
575
576 if (i == adev->usec_timeout) {
577 DRM_ERROR("check firmware loading failed\n");
578 return -EINVAL;
579 }
580
581 return 0;
582}
583
584int iceland_smu_start(struct amdgpu_device *adev)
585{
586 int result;
587
588 result = iceland_smu_upload_firmware_image(adev);
589 if (result)
590 return result;
591 result = iceland_smu_start_smc(adev);
592 if (result)
593 return result;
594
595 return iceland_smu_request_load_fw(adev);
596}
597
598static const struct amdgpu_smumgr_funcs iceland_smumgr_funcs = {
599 .check_fw_load_finish = iceland_smu_check_fw_load_finish,
600 .request_smu_load_fw = NULL,
601 .request_smu_specific_fw = NULL,
602};
603
604int iceland_smu_init(struct amdgpu_device *adev)
605{
606 struct iceland_smu_private_data *private;
607 uint32_t image_size = ((sizeof(struct SMU_DRAMData_TOC) / 4096) + 1) * 4096;
608 struct amdgpu_bo **toc_buf = &adev->smu.toc_buf;
609 uint64_t mc_addr;
610 void *toc_buf_ptr;
611 int ret;
612
613 private = kzalloc(sizeof(struct iceland_smu_private_data), GFP_KERNEL);
614 if (NULL == private)
615 return -ENOMEM;
616
617 /* allocate firmware buffers */
618 if (adev->firmware.smu_load)
619 amdgpu_ucode_init_bo(adev);
620
621 adev->smu.priv = private;
622 adev->smu.fw_flags = 0;
623
624 /* Allocate FW image data structure and header buffer */
625 ret = amdgpu_bo_create(adev, image_size, PAGE_SIZE,
626 true, AMDGPU_GEM_DOMAIN_VRAM,
627 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
628 NULL, NULL, toc_buf);
629 if (ret) {
630 DRM_ERROR("Failed to allocate memory for TOC buffer\n");
631 return -ENOMEM;
632 }
633
634 /* Retrieve GPU address for header buffer and internal buffer */
635 ret = amdgpu_bo_reserve(adev->smu.toc_buf, false);
636 if (ret) {
637 amdgpu_bo_unref(&adev->smu.toc_buf);
638 DRM_ERROR("Failed to reserve the TOC buffer\n");
639 return -EINVAL;
640 }
641
642 ret = amdgpu_bo_pin(adev->smu.toc_buf, AMDGPU_GEM_DOMAIN_VRAM, &mc_addr);
643 if (ret) {
644 amdgpu_bo_unreserve(adev->smu.toc_buf);
645 amdgpu_bo_unref(&adev->smu.toc_buf);
646 DRM_ERROR("Failed to pin the TOC buffer\n");
647 return -EINVAL;
648 }
649
650 ret = amdgpu_bo_kmap(*toc_buf, &toc_buf_ptr);
651 if (ret) {
652 amdgpu_bo_unreserve(adev->smu.toc_buf);
653 amdgpu_bo_unref(&adev->smu.toc_buf);
654 DRM_ERROR("Failed to map the TOC buffer\n");
655 return -EINVAL;
656 }
657
658 amdgpu_bo_unreserve(adev->smu.toc_buf);
659 private->header_addr_low = lower_32_bits(mc_addr);
660 private->header_addr_high = upper_32_bits(mc_addr);
661 private->header = toc_buf_ptr;
662
663 adev->smu.smumgr_funcs = &iceland_smumgr_funcs;
664
665 return 0;
666}
667
668int iceland_smu_fini(struct amdgpu_device *adev)
669{
670 amdgpu_bo_unref(&adev->smu.toc_buf);
671 kfree(adev->smu.priv);
672 adev->smu.priv = NULL;
673 if (adev->firmware.fw_buf)
674 amdgpu_ucode_fini_bo(adev);
675
676 return 0;
677}
diff --git a/drivers/gpu/drm/amd/amdgpu/kv_dpm.c b/drivers/gpu/drm/amd/amdgpu/kv_dpm.c
index a845e883f5fa..f8618a3881a8 100644
--- a/drivers/gpu/drm/amd/amdgpu/kv_dpm.c
+++ b/drivers/gpu/drm/amd/amdgpu/kv_dpm.c
@@ -2845,7 +2845,11 @@ static int kv_dpm_init(struct amdgpu_device *adev)
2845 pi->caps_tcp_ramping = true; 2845 pi->caps_tcp_ramping = true;
2846 } 2846 }
2847 2847
2848 pi->caps_sclk_ds = true; 2848 if (amdgpu_sclk_deep_sleep_en)
2849 pi->caps_sclk_ds = true;
2850 else
2851 pi->caps_sclk_ds = false;
2852
2849 pi->enable_auto_thermal_throttling = true; 2853 pi->enable_auto_thermal_throttling = true;
2850 pi->disable_nb_ps3_in_battery = false; 2854 pi->disable_nb_ps3_in_battery = false;
2851 if (amdgpu_bapm == 0) 2855 if (amdgpu_bapm == 0)
diff --git a/drivers/gpu/drm/amd/amdgpu/r600_dpm.h b/drivers/gpu/drm/amd/amdgpu/r600_dpm.h
new file mode 100644
index 000000000000..055321f61ca7
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/r600_dpm.h
@@ -0,0 +1,127 @@
1/*
2 * Copyright 2011 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23#ifndef __R600_DPM_H__
24#define __R600_DPM_H__
25
26#define R600_ASI_DFLT 10000
27#define R600_BSP_DFLT 0x41EB
28#define R600_BSU_DFLT 0x2
29#define R600_AH_DFLT 5
30#define R600_RLP_DFLT 25
31#define R600_RMP_DFLT 65
32#define R600_LHP_DFLT 40
33#define R600_LMP_DFLT 15
34#define R600_TD_DFLT 0
35#define R600_UTC_DFLT_00 0x24
36#define R600_UTC_DFLT_01 0x22
37#define R600_UTC_DFLT_02 0x22
38#define R600_UTC_DFLT_03 0x22
39#define R600_UTC_DFLT_04 0x22
40#define R600_UTC_DFLT_05 0x22
41#define R600_UTC_DFLT_06 0x22
42#define R600_UTC_DFLT_07 0x22
43#define R600_UTC_DFLT_08 0x22
44#define R600_UTC_DFLT_09 0x22
45#define R600_UTC_DFLT_10 0x22
46#define R600_UTC_DFLT_11 0x22
47#define R600_UTC_DFLT_12 0x22
48#define R600_UTC_DFLT_13 0x22
49#define R600_UTC_DFLT_14 0x22
50#define R600_DTC_DFLT_00 0x24
51#define R600_DTC_DFLT_01 0x22
52#define R600_DTC_DFLT_02 0x22
53#define R600_DTC_DFLT_03 0x22
54#define R600_DTC_DFLT_04 0x22
55#define R600_DTC_DFLT_05 0x22
56#define R600_DTC_DFLT_06 0x22
57#define R600_DTC_DFLT_07 0x22
58#define R600_DTC_DFLT_08 0x22
59#define R600_DTC_DFLT_09 0x22
60#define R600_DTC_DFLT_10 0x22
61#define R600_DTC_DFLT_11 0x22
62#define R600_DTC_DFLT_12 0x22
63#define R600_DTC_DFLT_13 0x22
64#define R600_DTC_DFLT_14 0x22
65#define R600_VRC_DFLT 0x0000C003
66#define R600_VOLTAGERESPONSETIME_DFLT 1000
67#define R600_BACKBIASRESPONSETIME_DFLT 1000
68#define R600_VRU_DFLT 0x3
69#define R600_SPLLSTEPTIME_DFLT 0x1000
70#define R600_SPLLSTEPUNIT_DFLT 0x3
71#define R600_TPU_DFLT 0
72#define R600_TPC_DFLT 0x200
73#define R600_SSTU_DFLT 0
74#define R600_SST_DFLT 0x00C8
75#define R600_GICST_DFLT 0x200
76#define R600_FCT_DFLT 0x0400
77#define R600_FCTU_DFLT 0
78#define R600_CTXCGTT3DRPHC_DFLT 0x20
79#define R600_CTXCGTT3DRSDC_DFLT 0x40
80#define R600_VDDC3DOORPHC_DFLT 0x100
81#define R600_VDDC3DOORSDC_DFLT 0x7
82#define R600_VDDC3DOORSU_DFLT 0
83#define R600_MPLLLOCKTIME_DFLT 100
84#define R600_MPLLRESETTIME_DFLT 150
85#define R600_VCOSTEPPCT_DFLT 20
86#define R600_ENDINGVCOSTEPPCT_DFLT 5
87#define R600_REFERENCEDIVIDER_DFLT 4
88
89#define R600_PM_NUMBER_OF_TC 15
90#define R600_PM_NUMBER_OF_SCLKS 20
91#define R600_PM_NUMBER_OF_MCLKS 4
92#define R600_PM_NUMBER_OF_VOLTAGE_LEVELS 4
93#define R600_PM_NUMBER_OF_ACTIVITY_LEVELS 3
94
95/* XXX are these ok? */
96#define R600_TEMP_RANGE_MIN (90 * 1000)
97#define R600_TEMP_RANGE_MAX (120 * 1000)
98
99#define FDO_PWM_MODE_STATIC 1
100#define FDO_PWM_MODE_STATIC_RPM 5
101
102enum r600_power_level {
103 R600_POWER_LEVEL_LOW = 0,
104 R600_POWER_LEVEL_MEDIUM = 1,
105 R600_POWER_LEVEL_HIGH = 2,
106 R600_POWER_LEVEL_CTXSW = 3,
107};
108
109enum r600_td {
110 R600_TD_AUTO,
111 R600_TD_UP,
112 R600_TD_DOWN,
113};
114
115enum r600_display_watermark {
116 R600_DISPLAY_WATERMARK_LOW = 0,
117 R600_DISPLAY_WATERMARK_HIGH = 1,
118};
119
120enum r600_display_gap
121{
122 R600_PM_DISPLAY_GAP_VBLANK_OR_WM = 0,
123 R600_PM_DISPLAY_GAP_VBLANK = 1,
124 R600_PM_DISPLAY_GAP_WATERMARK = 2,
125 R600_PM_DISPLAY_GAP_IGNORE = 3,
126};
127#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
index a64715d90503..565dab3c7218 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
@@ -190,12 +190,8 @@ out:
190 */ 190 */
191static uint32_t sdma_v2_4_ring_get_rptr(struct amdgpu_ring *ring) 191static uint32_t sdma_v2_4_ring_get_rptr(struct amdgpu_ring *ring)
192{ 192{
193 u32 rptr;
194
195 /* XXX check if swapping is necessary on BE */ 193 /* XXX check if swapping is necessary on BE */
196 rptr = ring->adev->wb.wb[ring->rptr_offs] >> 2; 194 return ring->adev->wb.wb[ring->rptr_offs] >> 2;
197
198 return rptr;
199} 195}
200 196
201/** 197/**
@@ -749,24 +745,16 @@ static void sdma_v2_4_vm_copy_pte(struct amdgpu_ib *ib,
749 uint64_t pe, uint64_t src, 745 uint64_t pe, uint64_t src,
750 unsigned count) 746 unsigned count)
751{ 747{
752 while (count) { 748 unsigned bytes = count * 8;
753 unsigned bytes = count * 8; 749
754 if (bytes > 0x1FFFF8) 750 ib->ptr[ib->length_dw++] = SDMA_PKT_HEADER_OP(SDMA_OP_COPY) |
755 bytes = 0x1FFFF8; 751 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_COPY_LINEAR);
756 752 ib->ptr[ib->length_dw++] = bytes;
757 ib->ptr[ib->length_dw++] = SDMA_PKT_HEADER_OP(SDMA_OP_COPY) | 753 ib->ptr[ib->length_dw++] = 0; /* src/dst endian swap */
758 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_COPY_LINEAR); 754 ib->ptr[ib->length_dw++] = lower_32_bits(src);
759 ib->ptr[ib->length_dw++] = bytes; 755 ib->ptr[ib->length_dw++] = upper_32_bits(src);
760 ib->ptr[ib->length_dw++] = 0; /* src/dst endian swap */ 756 ib->ptr[ib->length_dw++] = lower_32_bits(pe);
761 ib->ptr[ib->length_dw++] = lower_32_bits(src); 757 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
762 ib->ptr[ib->length_dw++] = upper_32_bits(src);
763 ib->ptr[ib->length_dw++] = lower_32_bits(pe);
764 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
765
766 pe += bytes;
767 src += bytes;
768 count -= bytes / 8;
769 }
770} 758}
771 759
772/** 760/**
@@ -774,39 +762,27 @@ static void sdma_v2_4_vm_copy_pte(struct amdgpu_ib *ib,
774 * 762 *
775 * @ib: indirect buffer to fill with commands 763 * @ib: indirect buffer to fill with commands
776 * @pe: addr of the page entry 764 * @pe: addr of the page entry
777 * @addr: dst addr to write into pe 765 * @value: dst addr to write into pe
778 * @count: number of page entries to update 766 * @count: number of page entries to update
779 * @incr: increase next addr by incr bytes 767 * @incr: increase next addr by incr bytes
780 * @flags: access flags
781 * 768 *
782 * Update PTEs by writing them manually using sDMA (CIK). 769 * Update PTEs by writing them manually using sDMA (CIK).
783 */ 770 */
784static void sdma_v2_4_vm_write_pte(struct amdgpu_ib *ib, 771static void sdma_v2_4_vm_write_pte(struct amdgpu_ib *ib, uint64_t pe,
785 const dma_addr_t *pages_addr, uint64_t pe, 772 uint64_t value, unsigned count,
786 uint64_t addr, unsigned count, 773 uint32_t incr)
787 uint32_t incr, uint32_t flags)
788{ 774{
789 uint64_t value; 775 unsigned ndw = count * 2;
790 unsigned ndw; 776
791 777 ib->ptr[ib->length_dw++] = SDMA_PKT_HEADER_OP(SDMA_OP_WRITE) |
792 while (count) { 778 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_COPY_LINEAR);
793 ndw = count * 2; 779 ib->ptr[ib->length_dw++] = pe;
794 if (ndw > 0xFFFFE) 780 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
795 ndw = 0xFFFFE; 781 ib->ptr[ib->length_dw++] = ndw;
796 782 for (; ndw > 0; ndw -= 2, --count, pe += 8) {
797 /* for non-physically contiguous pages (system) */ 783 ib->ptr[ib->length_dw++] = lower_32_bits(value);
798 ib->ptr[ib->length_dw++] = SDMA_PKT_HEADER_OP(SDMA_OP_WRITE) | 784 ib->ptr[ib->length_dw++] = upper_32_bits(value);
799 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_COPY_LINEAR); 785 value += incr;
800 ib->ptr[ib->length_dw++] = pe;
801 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
802 ib->ptr[ib->length_dw++] = ndw;
803 for (; ndw > 0; ndw -= 2, --count, pe += 8) {
804 value = amdgpu_vm_map_gart(pages_addr, addr);
805 addr += incr;
806 value |= flags;
807 ib->ptr[ib->length_dw++] = value;
808 ib->ptr[ib->length_dw++] = upper_32_bits(value);
809 }
810 } 786 }
811} 787}
812 788
@@ -822,40 +798,21 @@ static void sdma_v2_4_vm_write_pte(struct amdgpu_ib *ib,
822 * 798 *
823 * Update the page tables using sDMA (CIK). 799 * Update the page tables using sDMA (CIK).
824 */ 800 */
825static void sdma_v2_4_vm_set_pte_pde(struct amdgpu_ib *ib, 801static void sdma_v2_4_vm_set_pte_pde(struct amdgpu_ib *ib, uint64_t pe,
826 uint64_t pe,
827 uint64_t addr, unsigned count, 802 uint64_t addr, unsigned count,
828 uint32_t incr, uint32_t flags) 803 uint32_t incr, uint32_t flags)
829{ 804{
830 uint64_t value; 805 /* for physically contiguous pages (vram) */
831 unsigned ndw; 806 ib->ptr[ib->length_dw++] = SDMA_PKT_HEADER_OP(SDMA_OP_GEN_PTEPDE);
832 807 ib->ptr[ib->length_dw++] = lower_32_bits(pe); /* dst addr */
833 while (count) { 808 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
834 ndw = count; 809 ib->ptr[ib->length_dw++] = flags; /* mask */
835 if (ndw > 0x7FFFF) 810 ib->ptr[ib->length_dw++] = 0;
836 ndw = 0x7FFFF; 811 ib->ptr[ib->length_dw++] = lower_32_bits(addr); /* value */
837 812 ib->ptr[ib->length_dw++] = upper_32_bits(addr);
838 if (flags & AMDGPU_PTE_VALID) 813 ib->ptr[ib->length_dw++] = incr; /* increment size */
839 value = addr; 814 ib->ptr[ib->length_dw++] = 0;
840 else 815 ib->ptr[ib->length_dw++] = count; /* number of entries */
841 value = 0;
842
843 /* for physically contiguous pages (vram) */
844 ib->ptr[ib->length_dw++] = SDMA_PKT_HEADER_OP(SDMA_OP_GEN_PTEPDE);
845 ib->ptr[ib->length_dw++] = pe; /* dst addr */
846 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
847 ib->ptr[ib->length_dw++] = flags; /* mask */
848 ib->ptr[ib->length_dw++] = 0;
849 ib->ptr[ib->length_dw++] = value; /* value */
850 ib->ptr[ib->length_dw++] = upper_32_bits(value);
851 ib->ptr[ib->length_dw++] = incr; /* increment size */
852 ib->ptr[ib->length_dw++] = 0;
853 ib->ptr[ib->length_dw++] = ndw; /* number of entries */
854
855 pe += ndw * 8;
856 addr += ndw * incr;
857 count -= ndw;
858 }
859} 816}
860 817
861/** 818/**
@@ -945,6 +902,22 @@ static void sdma_v2_4_ring_emit_vm_flush(struct amdgpu_ring *ring,
945 SDMA_PKT_POLL_REGMEM_DW5_INTERVAL(10)); /* retry count, poll interval */ 902 SDMA_PKT_POLL_REGMEM_DW5_INTERVAL(10)); /* retry count, poll interval */
946} 903}
947 904
905static unsigned sdma_v2_4_ring_get_emit_ib_size(struct amdgpu_ring *ring)
906{
907 return
908 7 + 6; /* sdma_v2_4_ring_emit_ib */
909}
910
911static unsigned sdma_v2_4_ring_get_dma_frame_size(struct amdgpu_ring *ring)
912{
913 return
914 6 + /* sdma_v2_4_ring_emit_hdp_flush */
915 3 + /* sdma_v2_4_ring_emit_hdp_invalidate */
916 6 + /* sdma_v2_4_ring_emit_pipeline_sync */
917 12 + /* sdma_v2_4_ring_emit_vm_flush */
918 10 + 10 + 10; /* sdma_v2_4_ring_emit_fence x3 for user fence, vm fence */
919}
920
948static int sdma_v2_4_early_init(void *handle) 921static int sdma_v2_4_early_init(void *handle)
949{ 922{
950 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 923 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
@@ -1263,6 +1236,8 @@ static const struct amdgpu_ring_funcs sdma_v2_4_ring_funcs = {
1263 .test_ib = sdma_v2_4_ring_test_ib, 1236 .test_ib = sdma_v2_4_ring_test_ib,
1264 .insert_nop = sdma_v2_4_ring_insert_nop, 1237 .insert_nop = sdma_v2_4_ring_insert_nop,
1265 .pad_ib = sdma_v2_4_ring_pad_ib, 1238 .pad_ib = sdma_v2_4_ring_pad_ib,
1239 .get_emit_ib_size = sdma_v2_4_ring_get_emit_ib_size,
1240 .get_dma_frame_size = sdma_v2_4_ring_get_dma_frame_size,
1266}; 1241};
1267 1242
1268static void sdma_v2_4_set_ring_funcs(struct amdgpu_device *adev) 1243static void sdma_v2_4_set_ring_funcs(struct amdgpu_device *adev)
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
index 653ce5ed55ae..f325fd86430b 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
@@ -335,12 +335,8 @@ out:
335 */ 335 */
336static uint32_t sdma_v3_0_ring_get_rptr(struct amdgpu_ring *ring) 336static uint32_t sdma_v3_0_ring_get_rptr(struct amdgpu_ring *ring)
337{ 337{
338 u32 rptr;
339
340 /* XXX check if swapping is necessary on BE */ 338 /* XXX check if swapping is necessary on BE */
341 rptr = ring->adev->wb.wb[ring->rptr_offs] >> 2; 339 return ring->adev->wb.wb[ring->rptr_offs] >> 2;
342
343 return rptr;
344} 340}
345 341
346/** 342/**
@@ -499,31 +495,6 @@ static void sdma_v3_0_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 se
499 amdgpu_ring_write(ring, SDMA_PKT_TRAP_INT_CONTEXT_INT_CONTEXT(0)); 495 amdgpu_ring_write(ring, SDMA_PKT_TRAP_INT_CONTEXT_INT_CONTEXT(0));
500} 496}
501 497
502unsigned init_cond_exec(struct amdgpu_ring *ring)
503{
504 unsigned ret;
505 amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_COND_EXE));
506 amdgpu_ring_write(ring, lower_32_bits(ring->cond_exe_gpu_addr));
507 amdgpu_ring_write(ring, upper_32_bits(ring->cond_exe_gpu_addr));
508 amdgpu_ring_write(ring, 1);
509 ret = ring->wptr;/* this is the offset we need patch later */
510 amdgpu_ring_write(ring, 0x55aa55aa);/* insert dummy here and patch it later */
511 return ret;
512}
513
514void patch_cond_exec(struct amdgpu_ring *ring, unsigned offset)
515{
516 unsigned cur;
517 BUG_ON(ring->ring[offset] != 0x55aa55aa);
518
519 cur = ring->wptr - 1;
520 if (likely(cur > offset))
521 ring->ring[offset] = cur - offset;
522 else
523 ring->ring[offset] = (ring->ring_size>>2) - offset + cur;
524}
525
526
527/** 498/**
528 * sdma_v3_0_gfx_stop - stop the gfx async dma engines 499 * sdma_v3_0_gfx_stop - stop the gfx async dma engines
529 * 500 *
@@ -976,24 +947,16 @@ static void sdma_v3_0_vm_copy_pte(struct amdgpu_ib *ib,
976 uint64_t pe, uint64_t src, 947 uint64_t pe, uint64_t src,
977 unsigned count) 948 unsigned count)
978{ 949{
979 while (count) { 950 unsigned bytes = count * 8;
980 unsigned bytes = count * 8; 951
981 if (bytes > 0x1FFFF8) 952 ib->ptr[ib->length_dw++] = SDMA_PKT_HEADER_OP(SDMA_OP_COPY) |
982 bytes = 0x1FFFF8; 953 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_COPY_LINEAR);
983 954 ib->ptr[ib->length_dw++] = bytes;
984 ib->ptr[ib->length_dw++] = SDMA_PKT_HEADER_OP(SDMA_OP_COPY) | 955 ib->ptr[ib->length_dw++] = 0; /* src/dst endian swap */
985 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_COPY_LINEAR); 956 ib->ptr[ib->length_dw++] = lower_32_bits(src);
986 ib->ptr[ib->length_dw++] = bytes; 957 ib->ptr[ib->length_dw++] = upper_32_bits(src);
987 ib->ptr[ib->length_dw++] = 0; /* src/dst endian swap */ 958 ib->ptr[ib->length_dw++] = lower_32_bits(pe);
988 ib->ptr[ib->length_dw++] = lower_32_bits(src); 959 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
989 ib->ptr[ib->length_dw++] = upper_32_bits(src);
990 ib->ptr[ib->length_dw++] = lower_32_bits(pe);
991 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
992
993 pe += bytes;
994 src += bytes;
995 count -= bytes / 8;
996 }
997} 960}
998 961
999/** 962/**
@@ -1001,39 +964,27 @@ static void sdma_v3_0_vm_copy_pte(struct amdgpu_ib *ib,
1001 * 964 *
1002 * @ib: indirect buffer to fill with commands 965 * @ib: indirect buffer to fill with commands
1003 * @pe: addr of the page entry 966 * @pe: addr of the page entry
1004 * @addr: dst addr to write into pe 967 * @value: dst addr to write into pe
1005 * @count: number of page entries to update 968 * @count: number of page entries to update
1006 * @incr: increase next addr by incr bytes 969 * @incr: increase next addr by incr bytes
1007 * @flags: access flags
1008 * 970 *
1009 * Update PTEs by writing them manually using sDMA (CIK). 971 * Update PTEs by writing them manually using sDMA (CIK).
1010 */ 972 */
1011static void sdma_v3_0_vm_write_pte(struct amdgpu_ib *ib, 973static void sdma_v3_0_vm_write_pte(struct amdgpu_ib *ib, uint64_t pe,
1012 const dma_addr_t *pages_addr, uint64_t pe, 974 uint64_t value, unsigned count,
1013 uint64_t addr, unsigned count, 975 uint32_t incr)
1014 uint32_t incr, uint32_t flags) 976{
1015{ 977 unsigned ndw = count * 2;
1016 uint64_t value; 978
1017 unsigned ndw; 979 ib->ptr[ib->length_dw++] = SDMA_PKT_HEADER_OP(SDMA_OP_WRITE) |
1018 980 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_COPY_LINEAR);
1019 while (count) { 981 ib->ptr[ib->length_dw++] = lower_32_bits(pe);
1020 ndw = count * 2; 982 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
1021 if (ndw > 0xFFFFE) 983 ib->ptr[ib->length_dw++] = ndw;
1022 ndw = 0xFFFFE; 984 for (; ndw > 0; ndw -= 2, --count, pe += 8) {
1023 985 ib->ptr[ib->length_dw++] = lower_32_bits(value);
1024 /* for non-physically contiguous pages (system) */ 986 ib->ptr[ib->length_dw++] = upper_32_bits(value);
1025 ib->ptr[ib->length_dw++] = SDMA_PKT_HEADER_OP(SDMA_OP_WRITE) | 987 value += incr;
1026 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_COPY_LINEAR);
1027 ib->ptr[ib->length_dw++] = pe;
1028 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
1029 ib->ptr[ib->length_dw++] = ndw;
1030 for (; ndw > 0; ndw -= 2, --count, pe += 8) {
1031 value = amdgpu_vm_map_gart(pages_addr, addr);
1032 addr += incr;
1033 value |= flags;
1034 ib->ptr[ib->length_dw++] = value;
1035 ib->ptr[ib->length_dw++] = upper_32_bits(value);
1036 }
1037 } 988 }
1038} 989}
1039 990
@@ -1049,40 +1000,21 @@ static void sdma_v3_0_vm_write_pte(struct amdgpu_ib *ib,
1049 * 1000 *
1050 * Update the page tables using sDMA (CIK). 1001 * Update the page tables using sDMA (CIK).
1051 */ 1002 */
1052static void sdma_v3_0_vm_set_pte_pde(struct amdgpu_ib *ib, 1003static void sdma_v3_0_vm_set_pte_pde(struct amdgpu_ib *ib, uint64_t pe,
1053 uint64_t pe,
1054 uint64_t addr, unsigned count, 1004 uint64_t addr, unsigned count,
1055 uint32_t incr, uint32_t flags) 1005 uint32_t incr, uint32_t flags)
1056{ 1006{
1057 uint64_t value; 1007 /* for physically contiguous pages (vram) */
1058 unsigned ndw; 1008 ib->ptr[ib->length_dw++] = SDMA_PKT_HEADER_OP(SDMA_OP_GEN_PTEPDE);
1059 1009 ib->ptr[ib->length_dw++] = lower_32_bits(pe); /* dst addr */
1060 while (count) { 1010 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
1061 ndw = count; 1011 ib->ptr[ib->length_dw++] = flags; /* mask */
1062 if (ndw > 0x7FFFF) 1012 ib->ptr[ib->length_dw++] = 0;
1063 ndw = 0x7FFFF; 1013 ib->ptr[ib->length_dw++] = lower_32_bits(addr); /* value */
1064 1014 ib->ptr[ib->length_dw++] = upper_32_bits(addr);
1065 if (flags & AMDGPU_PTE_VALID) 1015 ib->ptr[ib->length_dw++] = incr; /* increment size */
1066 value = addr; 1016 ib->ptr[ib->length_dw++] = 0;
1067 else 1017 ib->ptr[ib->length_dw++] = count; /* number of entries */
1068 value = 0;
1069
1070 /* for physically contiguous pages (vram) */
1071 ib->ptr[ib->length_dw++] = SDMA_PKT_HEADER_OP(SDMA_OP_GEN_PTEPDE);
1072 ib->ptr[ib->length_dw++] = pe; /* dst addr */
1073 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
1074 ib->ptr[ib->length_dw++] = flags; /* mask */
1075 ib->ptr[ib->length_dw++] = 0;
1076 ib->ptr[ib->length_dw++] = value; /* value */
1077 ib->ptr[ib->length_dw++] = upper_32_bits(value);
1078 ib->ptr[ib->length_dw++] = incr; /* increment size */
1079 ib->ptr[ib->length_dw++] = 0;
1080 ib->ptr[ib->length_dw++] = ndw; /* number of entries */
1081
1082 pe += ndw * 8;
1083 addr += ndw * incr;
1084 count -= ndw;
1085 }
1086} 1018}
1087 1019
1088/** 1020/**
@@ -1172,6 +1104,22 @@ static void sdma_v3_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
1172 SDMA_PKT_POLL_REGMEM_DW5_INTERVAL(10)); /* retry count, poll interval */ 1104 SDMA_PKT_POLL_REGMEM_DW5_INTERVAL(10)); /* retry count, poll interval */
1173} 1105}
1174 1106
1107static unsigned sdma_v3_0_ring_get_emit_ib_size(struct amdgpu_ring *ring)
1108{
1109 return
1110 7 + 6; /* sdma_v3_0_ring_emit_ib */
1111}
1112
1113static unsigned sdma_v3_0_ring_get_dma_frame_size(struct amdgpu_ring *ring)
1114{
1115 return
1116 6 + /* sdma_v3_0_ring_emit_hdp_flush */
1117 3 + /* sdma_v3_0_ring_emit_hdp_invalidate */
1118 6 + /* sdma_v3_0_ring_emit_pipeline_sync */
1119 12 + /* sdma_v3_0_ring_emit_vm_flush */
1120 10 + 10 + 10; /* sdma_v3_0_ring_emit_fence x3 for user fence, vm fence */
1121}
1122
1175static int sdma_v3_0_early_init(void *handle) 1123static int sdma_v3_0_early_init(void *handle)
1176{ 1124{
1177 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1125 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
@@ -1320,28 +1268,79 @@ static int sdma_v3_0_wait_for_idle(void *handle)
1320 return -ETIMEDOUT; 1268 return -ETIMEDOUT;
1321} 1269}
1322 1270
1323static int sdma_v3_0_soft_reset(void *handle) 1271static int sdma_v3_0_check_soft_reset(void *handle)
1324{ 1272{
1325 u32 srbm_soft_reset = 0;
1326 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1273 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1274 u32 srbm_soft_reset = 0;
1327 u32 tmp = RREG32(mmSRBM_STATUS2); 1275 u32 tmp = RREG32(mmSRBM_STATUS2);
1328 1276
1329 if (tmp & SRBM_STATUS2__SDMA_BUSY_MASK) { 1277 if ((tmp & SRBM_STATUS2__SDMA_BUSY_MASK) ||
1330 /* sdma0 */ 1278 (tmp & SRBM_STATUS2__SDMA1_BUSY_MASK)) {
1331 tmp = RREG32(mmSDMA0_F32_CNTL + SDMA0_REGISTER_OFFSET);
1332 tmp = REG_SET_FIELD(tmp, SDMA0_F32_CNTL, HALT, 0);
1333 WREG32(mmSDMA0_F32_CNTL + SDMA0_REGISTER_OFFSET, tmp);
1334 srbm_soft_reset |= SRBM_SOFT_RESET__SOFT_RESET_SDMA_MASK; 1279 srbm_soft_reset |= SRBM_SOFT_RESET__SOFT_RESET_SDMA_MASK;
1335 }
1336 if (tmp & SRBM_STATUS2__SDMA1_BUSY_MASK) {
1337 /* sdma1 */
1338 tmp = RREG32(mmSDMA0_F32_CNTL + SDMA1_REGISTER_OFFSET);
1339 tmp = REG_SET_FIELD(tmp, SDMA0_F32_CNTL, HALT, 0);
1340 WREG32(mmSDMA0_F32_CNTL + SDMA1_REGISTER_OFFSET, tmp);
1341 srbm_soft_reset |= SRBM_SOFT_RESET__SOFT_RESET_SDMA1_MASK; 1280 srbm_soft_reset |= SRBM_SOFT_RESET__SOFT_RESET_SDMA1_MASK;
1342 } 1281 }
1343 1282
1344 if (srbm_soft_reset) { 1283 if (srbm_soft_reset) {
1284 adev->ip_block_status[AMD_IP_BLOCK_TYPE_SDMA].hang = true;
1285 adev->sdma.srbm_soft_reset = srbm_soft_reset;
1286 } else {
1287 adev->ip_block_status[AMD_IP_BLOCK_TYPE_SDMA].hang = false;
1288 adev->sdma.srbm_soft_reset = 0;
1289 }
1290
1291 return 0;
1292}
1293
1294static int sdma_v3_0_pre_soft_reset(void *handle)
1295{
1296 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1297 u32 srbm_soft_reset = 0;
1298
1299 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_SDMA].hang)
1300 return 0;
1301
1302 srbm_soft_reset = adev->sdma.srbm_soft_reset;
1303
1304 if (REG_GET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_SDMA) ||
1305 REG_GET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_SDMA1)) {
1306 sdma_v3_0_ctx_switch_enable(adev, false);
1307 sdma_v3_0_enable(adev, false);
1308 }
1309
1310 return 0;
1311}
1312
1313static int sdma_v3_0_post_soft_reset(void *handle)
1314{
1315 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1316 u32 srbm_soft_reset = 0;
1317
1318 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_SDMA].hang)
1319 return 0;
1320
1321 srbm_soft_reset = adev->sdma.srbm_soft_reset;
1322
1323 if (REG_GET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_SDMA) ||
1324 REG_GET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_SDMA1)) {
1325 sdma_v3_0_gfx_resume(adev);
1326 sdma_v3_0_rlc_resume(adev);
1327 }
1328
1329 return 0;
1330}
1331
1332static int sdma_v3_0_soft_reset(void *handle)
1333{
1334 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1335 u32 srbm_soft_reset = 0;
1336 u32 tmp;
1337
1338 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_SDMA].hang)
1339 return 0;
1340
1341 srbm_soft_reset = adev->sdma.srbm_soft_reset;
1342
1343 if (srbm_soft_reset) {
1345 tmp = RREG32(mmSRBM_SOFT_RESET); 1344 tmp = RREG32(mmSRBM_SOFT_RESET);
1346 tmp |= srbm_soft_reset; 1345 tmp |= srbm_soft_reset;
1347 dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp); 1346 dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
@@ -1559,6 +1558,9 @@ const struct amd_ip_funcs sdma_v3_0_ip_funcs = {
1559 .resume = sdma_v3_0_resume, 1558 .resume = sdma_v3_0_resume,
1560 .is_idle = sdma_v3_0_is_idle, 1559 .is_idle = sdma_v3_0_is_idle,
1561 .wait_for_idle = sdma_v3_0_wait_for_idle, 1560 .wait_for_idle = sdma_v3_0_wait_for_idle,
1561 .check_soft_reset = sdma_v3_0_check_soft_reset,
1562 .pre_soft_reset = sdma_v3_0_pre_soft_reset,
1563 .post_soft_reset = sdma_v3_0_post_soft_reset,
1562 .soft_reset = sdma_v3_0_soft_reset, 1564 .soft_reset = sdma_v3_0_soft_reset,
1563 .set_clockgating_state = sdma_v3_0_set_clockgating_state, 1565 .set_clockgating_state = sdma_v3_0_set_clockgating_state,
1564 .set_powergating_state = sdma_v3_0_set_powergating_state, 1566 .set_powergating_state = sdma_v3_0_set_powergating_state,
@@ -1579,6 +1581,8 @@ static const struct amdgpu_ring_funcs sdma_v3_0_ring_funcs = {
1579 .test_ib = sdma_v3_0_ring_test_ib, 1581 .test_ib = sdma_v3_0_ring_test_ib,
1580 .insert_nop = sdma_v3_0_ring_insert_nop, 1582 .insert_nop = sdma_v3_0_ring_insert_nop,
1581 .pad_ib = sdma_v3_0_ring_pad_ib, 1583 .pad_ib = sdma_v3_0_ring_pad_ib,
1584 .get_emit_ib_size = sdma_v3_0_ring_get_emit_ib_size,
1585 .get_dma_frame_size = sdma_v3_0_ring_get_dma_frame_size,
1582}; 1586};
1583 1587
1584static void sdma_v3_0_set_ring_funcs(struct amdgpu_device *adev) 1588static void sdma_v3_0_set_ring_funcs(struct amdgpu_device *adev)
diff --git a/drivers/gpu/drm/amd/amdgpu/si.c b/drivers/gpu/drm/amd/amdgpu/si.c
new file mode 100644
index 000000000000..dc9511c5ecb8
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/si.c
@@ -0,0 +1,1965 @@
1/*
2 * Copyright 2015 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23
24#include <linux/firmware.h>
25#include <linux/slab.h>
26#include <linux/module.h>
27#include "drmP.h"
28#include "amdgpu.h"
29#include "amdgpu_atombios.h"
30#include "amdgpu_ih.h"
31#include "amdgpu_uvd.h"
32#include "amdgpu_vce.h"
33#include "atom.h"
34#include "amdgpu_powerplay.h"
35#include "si/sid.h"
36#include "si_ih.h"
37#include "gfx_v6_0.h"
38#include "gmc_v6_0.h"
39#include "si_dma.h"
40#include "dce_v6_0.h"
41#include "si.h"
42
43static const u32 tahiti_golden_registers[] =
44{
45 0x2684, 0x00010000, 0x00018208,
46 0x260c, 0xffffffff, 0x00000000,
47 0x260d, 0xf00fffff, 0x00000400,
48 0x260e, 0x0002021c, 0x00020200,
49 0x031e, 0x00000080, 0x00000000,
50 0x340c, 0x000300c0, 0x00800040,
51 0x360c, 0x000300c0, 0x00800040,
52 0x16ec, 0x000000f0, 0x00000070,
53 0x16f0, 0x00200000, 0x50100000,
54 0x1c0c, 0x31000311, 0x00000011,
55 0x09df, 0x00000003, 0x000007ff,
56 0x0903, 0x000007ff, 0x00000000,
57 0x2285, 0xf000001f, 0x00000007,
58 0x22c9, 0xffffffff, 0x00ffffff,
59 0x22c4, 0x0000ff0f, 0x00000000,
60 0xa293, 0x07ffffff, 0x4e000000,
61 0xa0d4, 0x3f3f3fff, 0x2a00126a,
62 0x000c, 0x000000ff, 0x0040,
63 0x000d, 0x00000040, 0x00004040,
64 0x2440, 0x07ffffff, 0x03000000,
65 0x23a2, 0x01ff1f3f, 0x00000000,
66 0x23a1, 0x01ff1f3f, 0x00000000,
67 0x2418, 0x0000007f, 0x00000020,
68 0x2542, 0x00010000, 0x00010000,
69 0x2b05, 0x00000200, 0x000002fb,
70 0x2b04, 0xffffffff, 0x0000543b,
71 0x2b03, 0xffffffff, 0xa9210876,
72 0x2234, 0xffffffff, 0x000fff40,
73 0x2235, 0x0000001f, 0x00000010,
74 0x0504, 0x20000000, 0x20fffed8,
75 0x0570, 0x000c0fc0, 0x000c0400
76};
77
78static const u32 tahiti_golden_registers2[] =
79{
80 0x0319, 0x00000001, 0x00000001
81};
82
83static const u32 tahiti_golden_rlc_registers[] =
84{
85 0x3109, 0xffffffff, 0x00601005,
86 0x311f, 0xffffffff, 0x10104040,
87 0x3122, 0xffffffff, 0x0100000a,
88 0x30c5, 0xffffffff, 0x00000800,
89 0x30c3, 0xffffffff, 0x800000f4,
90 0x3d2a, 0xffffffff, 0x00000000
91};
92
93static const u32 pitcairn_golden_registers[] =
94{
95 0x2684, 0x00010000, 0x00018208,
96 0x260c, 0xffffffff, 0x00000000,
97 0x260d, 0xf00fffff, 0x00000400,
98 0x260e, 0x0002021c, 0x00020200,
99 0x031e, 0x00000080, 0x00000000,
100 0x340c, 0x000300c0, 0x00800040,
101 0x360c, 0x000300c0, 0x00800040,
102 0x16ec, 0x000000f0, 0x00000070,
103 0x16f0, 0x00200000, 0x50100000,
104 0x1c0c, 0x31000311, 0x00000011,
105 0x0ab9, 0x00073ffe, 0x000022a2,
106 0x0903, 0x000007ff, 0x00000000,
107 0x2285, 0xf000001f, 0x00000007,
108 0x22c9, 0xffffffff, 0x00ffffff,
109 0x22c4, 0x0000ff0f, 0x00000000,
110 0xa293, 0x07ffffff, 0x4e000000,
111 0xa0d4, 0x3f3f3fff, 0x2a00126a,
112 0x000c, 0x000000ff, 0x0040,
113 0x000d, 0x00000040, 0x00004040,
114 0x2440, 0x07ffffff, 0x03000000,
115 0x2418, 0x0000007f, 0x00000020,
116 0x2542, 0x00010000, 0x00010000,
117 0x2b05, 0x000003ff, 0x000000f7,
118 0x2b04, 0xffffffff, 0x00000000,
119 0x2b03, 0xffffffff, 0x32761054,
120 0x2235, 0x0000001f, 0x00000010,
121 0x0570, 0x000c0fc0, 0x000c0400
122};
123
124static const u32 pitcairn_golden_rlc_registers[] =
125{
126 0x3109, 0xffffffff, 0x00601004,
127 0x311f, 0xffffffff, 0x10102020,
128 0x3122, 0xffffffff, 0x01000020,
129 0x30c5, 0xffffffff, 0x00000800,
130 0x30c3, 0xffffffff, 0x800000a4
131};
132
133static const u32 verde_pg_init[] =
134{
135 0xd4f, 0xffffffff, 0x40000,
136 0xd4e, 0xffffffff, 0x200010ff,
137 0xd4f, 0xffffffff, 0x0,
138 0xd4f, 0xffffffff, 0x0,
139 0xd4f, 0xffffffff, 0x0,
140 0xd4f, 0xffffffff, 0x0,
141 0xd4f, 0xffffffff, 0x0,
142 0xd4f, 0xffffffff, 0x7007,
143 0xd4e, 0xffffffff, 0x300010ff,
144 0xd4f, 0xffffffff, 0x0,
145 0xd4f, 0xffffffff, 0x0,
146 0xd4f, 0xffffffff, 0x0,
147 0xd4f, 0xffffffff, 0x0,
148 0xd4f, 0xffffffff, 0x0,
149 0xd4f, 0xffffffff, 0x400000,
150 0xd4e, 0xffffffff, 0x100010ff,
151 0xd4f, 0xffffffff, 0x0,
152 0xd4f, 0xffffffff, 0x0,
153 0xd4f, 0xffffffff, 0x0,
154 0xd4f, 0xffffffff, 0x0,
155 0xd4f, 0xffffffff, 0x0,
156 0xd4f, 0xffffffff, 0x120200,
157 0xd4e, 0xffffffff, 0x500010ff,
158 0xd4f, 0xffffffff, 0x0,
159 0xd4f, 0xffffffff, 0x0,
160 0xd4f, 0xffffffff, 0x0,
161 0xd4f, 0xffffffff, 0x0,
162 0xd4f, 0xffffffff, 0x0,
163 0xd4f, 0xffffffff, 0x1e1e16,
164 0xd4e, 0xffffffff, 0x600010ff,
165 0xd4f, 0xffffffff, 0x0,
166 0xd4f, 0xffffffff, 0x0,
167 0xd4f, 0xffffffff, 0x0,
168 0xd4f, 0xffffffff, 0x0,
169 0xd4f, 0xffffffff, 0x0,
170 0xd4f, 0xffffffff, 0x171f1e,
171 0xd4e, 0xffffffff, 0x700010ff,
172 0xd4f, 0xffffffff, 0x0,
173 0xd4f, 0xffffffff, 0x0,
174 0xd4f, 0xffffffff, 0x0,
175 0xd4f, 0xffffffff, 0x0,
176 0xd4f, 0xffffffff, 0x0,
177 0xd4f, 0xffffffff, 0x0,
178 0xd4e, 0xffffffff, 0x9ff,
179 0xd40, 0xffffffff, 0x0,
180 0xd41, 0xffffffff, 0x10000800,
181 0xd41, 0xffffffff, 0xf,
182 0xd41, 0xffffffff, 0xf,
183 0xd40, 0xffffffff, 0x4,
184 0xd41, 0xffffffff, 0x1000051e,
185 0xd41, 0xffffffff, 0xffff,
186 0xd41, 0xffffffff, 0xffff,
187 0xd40, 0xffffffff, 0x8,
188 0xd41, 0xffffffff, 0x80500,
189 0xd40, 0xffffffff, 0x12,
190 0xd41, 0xffffffff, 0x9050c,
191 0xd40, 0xffffffff, 0x1d,
192 0xd41, 0xffffffff, 0xb052c,
193 0xd40, 0xffffffff, 0x2a,
194 0xd41, 0xffffffff, 0x1053e,
195 0xd40, 0xffffffff, 0x2d,
196 0xd41, 0xffffffff, 0x10546,
197 0xd40, 0xffffffff, 0x30,
198 0xd41, 0xffffffff, 0xa054e,
199 0xd40, 0xffffffff, 0x3c,
200 0xd41, 0xffffffff, 0x1055f,
201 0xd40, 0xffffffff, 0x3f,
202 0xd41, 0xffffffff, 0x10567,
203 0xd40, 0xffffffff, 0x42,
204 0xd41, 0xffffffff, 0x1056f,
205 0xd40, 0xffffffff, 0x45,
206 0xd41, 0xffffffff, 0x10572,
207 0xd40, 0xffffffff, 0x48,
208 0xd41, 0xffffffff, 0x20575,
209 0xd40, 0xffffffff, 0x4c,
210 0xd41, 0xffffffff, 0x190801,
211 0xd40, 0xffffffff, 0x67,
212 0xd41, 0xffffffff, 0x1082a,
213 0xd40, 0xffffffff, 0x6a,
214 0xd41, 0xffffffff, 0x1b082d,
215 0xd40, 0xffffffff, 0x87,
216 0xd41, 0xffffffff, 0x310851,
217 0xd40, 0xffffffff, 0xba,
218 0xd41, 0xffffffff, 0x891,
219 0xd40, 0xffffffff, 0xbc,
220 0xd41, 0xffffffff, 0x893,
221 0xd40, 0xffffffff, 0xbe,
222 0xd41, 0xffffffff, 0x20895,
223 0xd40, 0xffffffff, 0xc2,
224 0xd41, 0xffffffff, 0x20899,
225 0xd40, 0xffffffff, 0xc6,
226 0xd41, 0xffffffff, 0x2089d,
227 0xd40, 0xffffffff, 0xca,
228 0xd41, 0xffffffff, 0x8a1,
229 0xd40, 0xffffffff, 0xcc,
230 0xd41, 0xffffffff, 0x8a3,
231 0xd40, 0xffffffff, 0xce,
232 0xd41, 0xffffffff, 0x308a5,
233 0xd40, 0xffffffff, 0xd3,
234 0xd41, 0xffffffff, 0x6d08cd,
235 0xd40, 0xffffffff, 0x142,
236 0xd41, 0xffffffff, 0x2000095a,
237 0xd41, 0xffffffff, 0x1,
238 0xd40, 0xffffffff, 0x144,
239 0xd41, 0xffffffff, 0x301f095b,
240 0xd40, 0xffffffff, 0x165,
241 0xd41, 0xffffffff, 0xc094d,
242 0xd40, 0xffffffff, 0x173,
243 0xd41, 0xffffffff, 0xf096d,
244 0xd40, 0xffffffff, 0x184,
245 0xd41, 0xffffffff, 0x15097f,
246 0xd40, 0xffffffff, 0x19b,
247 0xd41, 0xffffffff, 0xc0998,
248 0xd40, 0xffffffff, 0x1a9,
249 0xd41, 0xffffffff, 0x409a7,
250 0xd40, 0xffffffff, 0x1af,
251 0xd41, 0xffffffff, 0xcdc,
252 0xd40, 0xffffffff, 0x1b1,
253 0xd41, 0xffffffff, 0x800,
254 0xd42, 0xffffffff, 0x6c9b2000,
255 0xd44, 0xfc00, 0x2000,
256 0xd51, 0xffffffff, 0xfc0,
257 0xa35, 0x00000100, 0x100
258};
259
260static const u32 verde_golden_rlc_registers[] =
261{
262 0x3109, 0xffffffff, 0x033f1005,
263 0x311f, 0xffffffff, 0x10808020,
264 0x3122, 0xffffffff, 0x00800008,
265 0x30c5, 0xffffffff, 0x00001000,
266 0x30c3, 0xffffffff, 0x80010014
267};
268
269static const u32 verde_golden_registers[] =
270{
271 0x2684, 0x00010000, 0x00018208,
272 0x260c, 0xffffffff, 0x00000000,
273 0x260d, 0xf00fffff, 0x00000400,
274 0x260e, 0x0002021c, 0x00020200,
275 0x031e, 0x00000080, 0x00000000,
276 0x340c, 0x000300c0, 0x00800040,
277 0x340c, 0x000300c0, 0x00800040,
278 0x360c, 0x000300c0, 0x00800040,
279 0x360c, 0x000300c0, 0x00800040,
280 0x16ec, 0x000000f0, 0x00000070,
281 0x16f0, 0x00200000, 0x50100000,
282
283 0x1c0c, 0x31000311, 0x00000011,
284 0x0ab9, 0x00073ffe, 0x000022a2,
285 0x0ab9, 0x00073ffe, 0x000022a2,
286 0x0ab9, 0x00073ffe, 0x000022a2,
287 0x0903, 0x000007ff, 0x00000000,
288 0x0903, 0x000007ff, 0x00000000,
289 0x0903, 0x000007ff, 0x00000000,
290 0x2285, 0xf000001f, 0x00000007,
291 0x2285, 0xf000001f, 0x00000007,
292 0x2285, 0xf000001f, 0x00000007,
293 0x2285, 0xffffffff, 0x00ffffff,
294 0x22c4, 0x0000ff0f, 0x00000000,
295
296 0xa293, 0x07ffffff, 0x4e000000,
297 0xa0d4, 0x3f3f3fff, 0x0000124a,
298 0xa0d4, 0x3f3f3fff, 0x0000124a,
299 0xa0d4, 0x3f3f3fff, 0x0000124a,
300 0x000c, 0x000000ff, 0x0040,
301 0x000d, 0x00000040, 0x00004040,
302 0x2440, 0x07ffffff, 0x03000000,
303 0x2440, 0x07ffffff, 0x03000000,
304 0x23a2, 0x01ff1f3f, 0x00000000,
305 0x23a3, 0x01ff1f3f, 0x00000000,
306 0x23a2, 0x01ff1f3f, 0x00000000,
307 0x23a1, 0x01ff1f3f, 0x00000000,
308 0x23a1, 0x01ff1f3f, 0x00000000,
309
310 0x23a1, 0x01ff1f3f, 0x00000000,
311 0x2418, 0x0000007f, 0x00000020,
312 0x2542, 0x00010000, 0x00010000,
313 0x2b01, 0x000003ff, 0x00000003,
314 0x2b05, 0x000003ff, 0x00000003,
315 0x2b05, 0x000003ff, 0x00000003,
316 0x2b04, 0xffffffff, 0x00000000,
317 0x2b04, 0xffffffff, 0x00000000,
318 0x2b04, 0xffffffff, 0x00000000,
319 0x2b03, 0xffffffff, 0x00001032,
320 0x2b03, 0xffffffff, 0x00001032,
321 0x2b03, 0xffffffff, 0x00001032,
322 0x2235, 0x0000001f, 0x00000010,
323 0x2235, 0x0000001f, 0x00000010,
324 0x2235, 0x0000001f, 0x00000010,
325 0x0570, 0x000c0fc0, 0x000c0400
326};
327
328static const u32 oland_golden_registers[] =
329{
330 0x2684, 0x00010000, 0x00018208,
331 0x260c, 0xffffffff, 0x00000000,
332 0x260d, 0xf00fffff, 0x00000400,
333 0x260e, 0x0002021c, 0x00020200,
334 0x031e, 0x00000080, 0x00000000,
335 0x340c, 0x000300c0, 0x00800040,
336 0x360c, 0x000300c0, 0x00800040,
337 0x16ec, 0x000000f0, 0x00000070,
338 0x16f9, 0x00200000, 0x50100000,
339 0x1c0c, 0x31000311, 0x00000011,
340 0x0ab9, 0x00073ffe, 0x000022a2,
341 0x0903, 0x000007ff, 0x00000000,
342 0x2285, 0xf000001f, 0x00000007,
343 0x22c9, 0xffffffff, 0x00ffffff,
344 0x22c4, 0x0000ff0f, 0x00000000,
345 0xa293, 0x07ffffff, 0x4e000000,
346 0xa0d4, 0x3f3f3fff, 0x00000082,
347 0x000c, 0x000000ff, 0x0040,
348 0x000d, 0x00000040, 0x00004040,
349 0x2440, 0x07ffffff, 0x03000000,
350 0x2418, 0x0000007f, 0x00000020,
351 0x2542, 0x00010000, 0x00010000,
352 0x2b05, 0x000003ff, 0x000000f3,
353 0x2b04, 0xffffffff, 0x00000000,
354 0x2b03, 0xffffffff, 0x00003210,
355 0x2235, 0x0000001f, 0x00000010,
356 0x0570, 0x000c0fc0, 0x000c0400
357};
358
359static const u32 oland_golden_rlc_registers[] =
360{
361 0x3109, 0xffffffff, 0x00601005,
362 0x311f, 0xffffffff, 0x10104040,
363 0x3122, 0xffffffff, 0x0100000a,
364 0x30c5, 0xffffffff, 0x00000800,
365 0x30c3, 0xffffffff, 0x800000f4
366};
367
368static const u32 hainan_golden_registers[] =
369{
370 0x2684, 0x00010000, 0x00018208,
371 0x260c, 0xffffffff, 0x00000000,
372 0x260d, 0xf00fffff, 0x00000400,
373 0x260e, 0x0002021c, 0x00020200,
374 0x4595, 0xff000fff, 0x00000100,
375 0x340c, 0x000300c0, 0x00800040,
376 0x3630, 0xff000fff, 0x00000100,
377 0x360c, 0x000300c0, 0x00800040,
378 0x0ab9, 0x00073ffe, 0x000022a2,
379 0x0903, 0x000007ff, 0x00000000,
380 0x2285, 0xf000001f, 0x00000007,
381 0x22c9, 0xffffffff, 0x00ffffff,
382 0x22c4, 0x0000ff0f, 0x00000000,
383 0xa393, 0x07ffffff, 0x4e000000,
384 0xa0d4, 0x3f3f3fff, 0x00000000,
385 0x000c, 0x000000ff, 0x0040,
386 0x000d, 0x00000040, 0x00004040,
387 0x2440, 0x03e00000, 0x03600000,
388 0x2418, 0x0000007f, 0x00000020,
389 0x2542, 0x00010000, 0x00010000,
390 0x2b05, 0x000003ff, 0x000000f1,
391 0x2b04, 0xffffffff, 0x00000000,
392 0x2b03, 0xffffffff, 0x00003210,
393 0x2235, 0x0000001f, 0x00000010,
394 0x0570, 0x000c0fc0, 0x000c0400
395};
396
397static const u32 hainan_golden_registers2[] =
398{
399 0x263e, 0xffffffff, 0x02010001
400};
401
402static const u32 tahiti_mgcg_cgcg_init[] =
403{
404 0x3100, 0xffffffff, 0xfffffffc,
405 0x200b, 0xffffffff, 0xe0000000,
406 0x2698, 0xffffffff, 0x00000100,
407 0x24a9, 0xffffffff, 0x00000100,
408 0x3059, 0xffffffff, 0x00000100,
409 0x25dd, 0xffffffff, 0x00000100,
410 0x2261, 0xffffffff, 0x06000100,
411 0x2286, 0xffffffff, 0x00000100,
412 0x24a8, 0xffffffff, 0x00000100,
413 0x30e0, 0xffffffff, 0x00000100,
414 0x22ca, 0xffffffff, 0x00000100,
415 0x2451, 0xffffffff, 0x00000100,
416 0x2362, 0xffffffff, 0x00000100,
417 0x2363, 0xffffffff, 0x00000100,
418 0x240c, 0xffffffff, 0x00000100,
419 0x240d, 0xffffffff, 0x00000100,
420 0x240e, 0xffffffff, 0x00000100,
421 0x240f, 0xffffffff, 0x00000100,
422 0x2b60, 0xffffffff, 0x00000100,
423 0x2b15, 0xffffffff, 0x00000100,
424 0x225f, 0xffffffff, 0x06000100,
425 0x261a, 0xffffffff, 0x00000100,
426 0x2544, 0xffffffff, 0x00000100,
427 0x2bc1, 0xffffffff, 0x00000100,
428 0x2b81, 0xffffffff, 0x00000100,
429 0x2527, 0xffffffff, 0x00000100,
430 0x200b, 0xffffffff, 0xe0000000,
431 0x2458, 0xffffffff, 0x00010000,
432 0x2459, 0xffffffff, 0x00030002,
433 0x245a, 0xffffffff, 0x00040007,
434 0x245b, 0xffffffff, 0x00060005,
435 0x245c, 0xffffffff, 0x00090008,
436 0x245d, 0xffffffff, 0x00020001,
437 0x245e, 0xffffffff, 0x00040003,
438 0x245f, 0xffffffff, 0x00000007,
439 0x2460, 0xffffffff, 0x00060005,
440 0x2461, 0xffffffff, 0x00090008,
441 0x2462, 0xffffffff, 0x00030002,
442 0x2463, 0xffffffff, 0x00050004,
443 0x2464, 0xffffffff, 0x00000008,
444 0x2465, 0xffffffff, 0x00070006,
445 0x2466, 0xffffffff, 0x000a0009,
446 0x2467, 0xffffffff, 0x00040003,
447 0x2468, 0xffffffff, 0x00060005,
448 0x2469, 0xffffffff, 0x00000009,
449 0x246a, 0xffffffff, 0x00080007,
450 0x246b, 0xffffffff, 0x000b000a,
451 0x246c, 0xffffffff, 0x00050004,
452 0x246d, 0xffffffff, 0x00070006,
453 0x246e, 0xffffffff, 0x0008000b,
454 0x246f, 0xffffffff, 0x000a0009,
455 0x2470, 0xffffffff, 0x000d000c,
456 0x2471, 0xffffffff, 0x00060005,
457 0x2472, 0xffffffff, 0x00080007,
458 0x2473, 0xffffffff, 0x0000000b,
459 0x2474, 0xffffffff, 0x000a0009,
460 0x2475, 0xffffffff, 0x000d000c,
461 0x2476, 0xffffffff, 0x00070006,
462 0x2477, 0xffffffff, 0x00090008,
463 0x2478, 0xffffffff, 0x0000000c,
464 0x2479, 0xffffffff, 0x000b000a,
465 0x247a, 0xffffffff, 0x000e000d,
466 0x247b, 0xffffffff, 0x00080007,
467 0x247c, 0xffffffff, 0x000a0009,
468 0x247d, 0xffffffff, 0x0000000d,
469 0x247e, 0xffffffff, 0x000c000b,
470 0x247f, 0xffffffff, 0x000f000e,
471 0x2480, 0xffffffff, 0x00090008,
472 0x2481, 0xffffffff, 0x000b000a,
473 0x2482, 0xffffffff, 0x000c000f,
474 0x2483, 0xffffffff, 0x000e000d,
475 0x2484, 0xffffffff, 0x00110010,
476 0x2485, 0xffffffff, 0x000a0009,
477 0x2486, 0xffffffff, 0x000c000b,
478 0x2487, 0xffffffff, 0x0000000f,
479 0x2488, 0xffffffff, 0x000e000d,
480 0x2489, 0xffffffff, 0x00110010,
481 0x248a, 0xffffffff, 0x000b000a,
482 0x248b, 0xffffffff, 0x000d000c,
483 0x248c, 0xffffffff, 0x00000010,
484 0x248d, 0xffffffff, 0x000f000e,
485 0x248e, 0xffffffff, 0x00120011,
486 0x248f, 0xffffffff, 0x000c000b,
487 0x2490, 0xffffffff, 0x000e000d,
488 0x2491, 0xffffffff, 0x00000011,
489 0x2492, 0xffffffff, 0x0010000f,
490 0x2493, 0xffffffff, 0x00130012,
491 0x2494, 0xffffffff, 0x000d000c,
492 0x2495, 0xffffffff, 0x000f000e,
493 0x2496, 0xffffffff, 0x00100013,
494 0x2497, 0xffffffff, 0x00120011,
495 0x2498, 0xffffffff, 0x00150014,
496 0x2499, 0xffffffff, 0x000e000d,
497 0x249a, 0xffffffff, 0x0010000f,
498 0x249b, 0xffffffff, 0x00000013,
499 0x249c, 0xffffffff, 0x00120011,
500 0x249d, 0xffffffff, 0x00150014,
501 0x249e, 0xffffffff, 0x000f000e,
502 0x249f, 0xffffffff, 0x00110010,
503 0x24a0, 0xffffffff, 0x00000014,
504 0x24a1, 0xffffffff, 0x00130012,
505 0x24a2, 0xffffffff, 0x00160015,
506 0x24a3, 0xffffffff, 0x0010000f,
507 0x24a4, 0xffffffff, 0x00120011,
508 0x24a5, 0xffffffff, 0x00000015,
509 0x24a6, 0xffffffff, 0x00140013,
510 0x24a7, 0xffffffff, 0x00170016,
511 0x2454, 0xffffffff, 0x96940200,
512 0x21c2, 0xffffffff, 0x00900100,
513 0x311e, 0xffffffff, 0x00000080,
514 0x3101, 0xffffffff, 0x0020003f,
515 0xc, 0xffffffff, 0x0000001c,
516 0xd, 0x000f0000, 0x000f0000,
517 0x583, 0xffffffff, 0x00000100,
518 0x409, 0xffffffff, 0x00000100,
519 0x40b, 0x00000101, 0x00000000,
520 0x82a, 0xffffffff, 0x00000104,
521 0x993, 0x000c0000, 0x000c0000,
522 0x992, 0x000c0000, 0x000c0000,
523 0x1579, 0xff000fff, 0x00000100,
524 0x157a, 0x00000001, 0x00000001,
525 0xbd4, 0x00000001, 0x00000001,
526 0xc33, 0xc0000fff, 0x00000104,
527 0x3079, 0x00000001, 0x00000001,
528 0x3430, 0xfffffff0, 0x00000100,
529 0x3630, 0xfffffff0, 0x00000100
530};
531static const u32 pitcairn_mgcg_cgcg_init[] =
532{
533 0x3100, 0xffffffff, 0xfffffffc,
534 0x200b, 0xffffffff, 0xe0000000,
535 0x2698, 0xffffffff, 0x00000100,
536 0x24a9, 0xffffffff, 0x00000100,
537 0x3059, 0xffffffff, 0x00000100,
538 0x25dd, 0xffffffff, 0x00000100,
539 0x2261, 0xffffffff, 0x06000100,
540 0x2286, 0xffffffff, 0x00000100,
541 0x24a8, 0xffffffff, 0x00000100,
542 0x30e0, 0xffffffff, 0x00000100,
543 0x22ca, 0xffffffff, 0x00000100,
544 0x2451, 0xffffffff, 0x00000100,
545 0x2362, 0xffffffff, 0x00000100,
546 0x2363, 0xffffffff, 0x00000100,
547 0x240c, 0xffffffff, 0x00000100,
548 0x240d, 0xffffffff, 0x00000100,
549 0x240e, 0xffffffff, 0x00000100,
550 0x240f, 0xffffffff, 0x00000100,
551 0x2b60, 0xffffffff, 0x00000100,
552 0x2b15, 0xffffffff, 0x00000100,
553 0x225f, 0xffffffff, 0x06000100,
554 0x261a, 0xffffffff, 0x00000100,
555 0x2544, 0xffffffff, 0x00000100,
556 0x2bc1, 0xffffffff, 0x00000100,
557 0x2b81, 0xffffffff, 0x00000100,
558 0x2527, 0xffffffff, 0x00000100,
559 0x200b, 0xffffffff, 0xe0000000,
560 0x2458, 0xffffffff, 0x00010000,
561 0x2459, 0xffffffff, 0x00030002,
562 0x245a, 0xffffffff, 0x00040007,
563 0x245b, 0xffffffff, 0x00060005,
564 0x245c, 0xffffffff, 0x00090008,
565 0x245d, 0xffffffff, 0x00020001,
566 0x245e, 0xffffffff, 0x00040003,
567 0x245f, 0xffffffff, 0x00000007,
568 0x2460, 0xffffffff, 0x00060005,
569 0x2461, 0xffffffff, 0x00090008,
570 0x2462, 0xffffffff, 0x00030002,
571 0x2463, 0xffffffff, 0x00050004,
572 0x2464, 0xffffffff, 0x00000008,
573 0x2465, 0xffffffff, 0x00070006,
574 0x2466, 0xffffffff, 0x000a0009,
575 0x2467, 0xffffffff, 0x00040003,
576 0x2468, 0xffffffff, 0x00060005,
577 0x2469, 0xffffffff, 0x00000009,
578 0x246a, 0xffffffff, 0x00080007,
579 0x246b, 0xffffffff, 0x000b000a,
580 0x246c, 0xffffffff, 0x00050004,
581 0x246d, 0xffffffff, 0x00070006,
582 0x246e, 0xffffffff, 0x0008000b,
583 0x246f, 0xffffffff, 0x000a0009,
584 0x2470, 0xffffffff, 0x000d000c,
585 0x2480, 0xffffffff, 0x00090008,
586 0x2481, 0xffffffff, 0x000b000a,
587 0x2482, 0xffffffff, 0x000c000f,
588 0x2483, 0xffffffff, 0x000e000d,
589 0x2484, 0xffffffff, 0x00110010,
590 0x2485, 0xffffffff, 0x000a0009,
591 0x2486, 0xffffffff, 0x000c000b,
592 0x2487, 0xffffffff, 0x0000000f,
593 0x2488, 0xffffffff, 0x000e000d,
594 0x2489, 0xffffffff, 0x00110010,
595 0x248a, 0xffffffff, 0x000b000a,
596 0x248b, 0xffffffff, 0x000d000c,
597 0x248c, 0xffffffff, 0x00000010,
598 0x248d, 0xffffffff, 0x000f000e,
599 0x248e, 0xffffffff, 0x00120011,
600 0x248f, 0xffffffff, 0x000c000b,
601 0x2490, 0xffffffff, 0x000e000d,
602 0x2491, 0xffffffff, 0x00000011,
603 0x2492, 0xffffffff, 0x0010000f,
604 0x2493, 0xffffffff, 0x00130012,
605 0x2494, 0xffffffff, 0x000d000c,
606 0x2495, 0xffffffff, 0x000f000e,
607 0x2496, 0xffffffff, 0x00100013,
608 0x2497, 0xffffffff, 0x00120011,
609 0x2498, 0xffffffff, 0x00150014,
610 0x2454, 0xffffffff, 0x96940200,
611 0x21c2, 0xffffffff, 0x00900100,
612 0x311e, 0xffffffff, 0x00000080,
613 0x3101, 0xffffffff, 0x0020003f,
614 0xc, 0xffffffff, 0x0000001c,
615 0xd, 0x000f0000, 0x000f0000,
616 0x583, 0xffffffff, 0x00000100,
617 0x409, 0xffffffff, 0x00000100,
618 0x40b, 0x00000101, 0x00000000,
619 0x82a, 0xffffffff, 0x00000104,
620 0x1579, 0xff000fff, 0x00000100,
621 0x157a, 0x00000001, 0x00000001,
622 0xbd4, 0x00000001, 0x00000001,
623 0xc33, 0xc0000fff, 0x00000104,
624 0x3079, 0x00000001, 0x00000001,
625 0x3430, 0xfffffff0, 0x00000100,
626 0x3630, 0xfffffff0, 0x00000100
627};
628static const u32 verde_mgcg_cgcg_init[] =
629{
630 0x3100, 0xffffffff, 0xfffffffc,
631 0x200b, 0xffffffff, 0xe0000000,
632 0x2698, 0xffffffff, 0x00000100,
633 0x24a9, 0xffffffff, 0x00000100,
634 0x3059, 0xffffffff, 0x00000100,
635 0x25dd, 0xffffffff, 0x00000100,
636 0x2261, 0xffffffff, 0x06000100,
637 0x2286, 0xffffffff, 0x00000100,
638 0x24a8, 0xffffffff, 0x00000100,
639 0x30e0, 0xffffffff, 0x00000100,
640 0x22ca, 0xffffffff, 0x00000100,
641 0x2451, 0xffffffff, 0x00000100,
642 0x2362, 0xffffffff, 0x00000100,
643 0x2363, 0xffffffff, 0x00000100,
644 0x240c, 0xffffffff, 0x00000100,
645 0x240d, 0xffffffff, 0x00000100,
646 0x240e, 0xffffffff, 0x00000100,
647 0x240f, 0xffffffff, 0x00000100,
648 0x2b60, 0xffffffff, 0x00000100,
649 0x2b15, 0xffffffff, 0x00000100,
650 0x225f, 0xffffffff, 0x06000100,
651 0x261a, 0xffffffff, 0x00000100,
652 0x2544, 0xffffffff, 0x00000100,
653 0x2bc1, 0xffffffff, 0x00000100,
654 0x2b81, 0xffffffff, 0x00000100,
655 0x2527, 0xffffffff, 0x00000100,
656 0x200b, 0xffffffff, 0xe0000000,
657 0x2458, 0xffffffff, 0x00010000,
658 0x2459, 0xffffffff, 0x00030002,
659 0x245a, 0xffffffff, 0x00040007,
660 0x245b, 0xffffffff, 0x00060005,
661 0x245c, 0xffffffff, 0x00090008,
662 0x245d, 0xffffffff, 0x00020001,
663 0x245e, 0xffffffff, 0x00040003,
664 0x245f, 0xffffffff, 0x00000007,
665 0x2460, 0xffffffff, 0x00060005,
666 0x2461, 0xffffffff, 0x00090008,
667 0x2462, 0xffffffff, 0x00030002,
668 0x2463, 0xffffffff, 0x00050004,
669 0x2464, 0xffffffff, 0x00000008,
670 0x2465, 0xffffffff, 0x00070006,
671 0x2466, 0xffffffff, 0x000a0009,
672 0x2467, 0xffffffff, 0x00040003,
673 0x2468, 0xffffffff, 0x00060005,
674 0x2469, 0xffffffff, 0x00000009,
675 0x246a, 0xffffffff, 0x00080007,
676 0x246b, 0xffffffff, 0x000b000a,
677 0x246c, 0xffffffff, 0x00050004,
678 0x246d, 0xffffffff, 0x00070006,
679 0x246e, 0xffffffff, 0x0008000b,
680 0x246f, 0xffffffff, 0x000a0009,
681 0x2470, 0xffffffff, 0x000d000c,
682 0x2480, 0xffffffff, 0x00090008,
683 0x2481, 0xffffffff, 0x000b000a,
684 0x2482, 0xffffffff, 0x000c000f,
685 0x2483, 0xffffffff, 0x000e000d,
686 0x2484, 0xffffffff, 0x00110010,
687 0x2485, 0xffffffff, 0x000a0009,
688 0x2486, 0xffffffff, 0x000c000b,
689 0x2487, 0xffffffff, 0x0000000f,
690 0x2488, 0xffffffff, 0x000e000d,
691 0x2489, 0xffffffff, 0x00110010,
692 0x248a, 0xffffffff, 0x000b000a,
693 0x248b, 0xffffffff, 0x000d000c,
694 0x248c, 0xffffffff, 0x00000010,
695 0x248d, 0xffffffff, 0x000f000e,
696 0x248e, 0xffffffff, 0x00120011,
697 0x248f, 0xffffffff, 0x000c000b,
698 0x2490, 0xffffffff, 0x000e000d,
699 0x2491, 0xffffffff, 0x00000011,
700 0x2492, 0xffffffff, 0x0010000f,
701 0x2493, 0xffffffff, 0x00130012,
702 0x2494, 0xffffffff, 0x000d000c,
703 0x2495, 0xffffffff, 0x000f000e,
704 0x2496, 0xffffffff, 0x00100013,
705 0x2497, 0xffffffff, 0x00120011,
706 0x2498, 0xffffffff, 0x00150014,
707 0x2454, 0xffffffff, 0x96940200,
708 0x21c2, 0xffffffff, 0x00900100,
709 0x311e, 0xffffffff, 0x00000080,
710 0x3101, 0xffffffff, 0x0020003f,
711 0xc, 0xffffffff, 0x0000001c,
712 0xd, 0x000f0000, 0x000f0000,
713 0x583, 0xffffffff, 0x00000100,
714 0x409, 0xffffffff, 0x00000100,
715 0x40b, 0x00000101, 0x00000000,
716 0x82a, 0xffffffff, 0x00000104,
717 0x993, 0x000c0000, 0x000c0000,
718 0x992, 0x000c0000, 0x000c0000,
719 0x1579, 0xff000fff, 0x00000100,
720 0x157a, 0x00000001, 0x00000001,
721 0xbd4, 0x00000001, 0x00000001,
722 0xc33, 0xc0000fff, 0x00000104,
723 0x3079, 0x00000001, 0x00000001,
724 0x3430, 0xfffffff0, 0x00000100,
725 0x3630, 0xfffffff0, 0x00000100
726};
727static const u32 oland_mgcg_cgcg_init[] =
728{
729 0x3100, 0xffffffff, 0xfffffffc,
730 0x200b, 0xffffffff, 0xe0000000,
731 0x2698, 0xffffffff, 0x00000100,
732 0x24a9, 0xffffffff, 0x00000100,
733 0x3059, 0xffffffff, 0x00000100,
734 0x25dd, 0xffffffff, 0x00000100,
735 0x2261, 0xffffffff, 0x06000100,
736 0x2286, 0xffffffff, 0x00000100,
737 0x24a8, 0xffffffff, 0x00000100,
738 0x30e0, 0xffffffff, 0x00000100,
739 0x22ca, 0xffffffff, 0x00000100,
740 0x2451, 0xffffffff, 0x00000100,
741 0x2362, 0xffffffff, 0x00000100,
742 0x2363, 0xffffffff, 0x00000100,
743 0x240c, 0xffffffff, 0x00000100,
744 0x240d, 0xffffffff, 0x00000100,
745 0x240e, 0xffffffff, 0x00000100,
746 0x240f, 0xffffffff, 0x00000100,
747 0x2b60, 0xffffffff, 0x00000100,
748 0x2b15, 0xffffffff, 0x00000100,
749 0x225f, 0xffffffff, 0x06000100,
750 0x261a, 0xffffffff, 0x00000100,
751 0x2544, 0xffffffff, 0x00000100,
752 0x2bc1, 0xffffffff, 0x00000100,
753 0x2b81, 0xffffffff, 0x00000100,
754 0x2527, 0xffffffff, 0x00000100,
755 0x200b, 0xffffffff, 0xe0000000,
756 0x2458, 0xffffffff, 0x00010000,
757 0x2459, 0xffffffff, 0x00030002,
758 0x245a, 0xffffffff, 0x00040007,
759 0x245b, 0xffffffff, 0x00060005,
760 0x245c, 0xffffffff, 0x00090008,
761 0x245d, 0xffffffff, 0x00020001,
762 0x245e, 0xffffffff, 0x00040003,
763 0x245f, 0xffffffff, 0x00000007,
764 0x2460, 0xffffffff, 0x00060005,
765 0x2461, 0xffffffff, 0x00090008,
766 0x2462, 0xffffffff, 0x00030002,
767 0x2463, 0xffffffff, 0x00050004,
768 0x2464, 0xffffffff, 0x00000008,
769 0x2465, 0xffffffff, 0x00070006,
770 0x2466, 0xffffffff, 0x000a0009,
771 0x2467, 0xffffffff, 0x00040003,
772 0x2468, 0xffffffff, 0x00060005,
773 0x2469, 0xffffffff, 0x00000009,
774 0x246a, 0xffffffff, 0x00080007,
775 0x246b, 0xffffffff, 0x000b000a,
776 0x246c, 0xffffffff, 0x00050004,
777 0x246d, 0xffffffff, 0x00070006,
778 0x246e, 0xffffffff, 0x0008000b,
779 0x246f, 0xffffffff, 0x000a0009,
780 0x2470, 0xffffffff, 0x000d000c,
781 0x2471, 0xffffffff, 0x00060005,
782 0x2472, 0xffffffff, 0x00080007,
783 0x2473, 0xffffffff, 0x0000000b,
784 0x2474, 0xffffffff, 0x000a0009,
785 0x2475, 0xffffffff, 0x000d000c,
786 0x2454, 0xffffffff, 0x96940200,
787 0x21c2, 0xffffffff, 0x00900100,
788 0x311e, 0xffffffff, 0x00000080,
789 0x3101, 0xffffffff, 0x0020003f,
790 0xc, 0xffffffff, 0x0000001c,
791 0xd, 0x000f0000, 0x000f0000,
792 0x583, 0xffffffff, 0x00000100,
793 0x409, 0xffffffff, 0x00000100,
794 0x40b, 0x00000101, 0x00000000,
795 0x82a, 0xffffffff, 0x00000104,
796 0x993, 0x000c0000, 0x000c0000,
797 0x992, 0x000c0000, 0x000c0000,
798 0x1579, 0xff000fff, 0x00000100,
799 0x157a, 0x00000001, 0x00000001,
800 0xbd4, 0x00000001, 0x00000001,
801 0xc33, 0xc0000fff, 0x00000104,
802 0x3079, 0x00000001, 0x00000001,
803 0x3430, 0xfffffff0, 0x00000100,
804 0x3630, 0xfffffff0, 0x00000100
805};
806static const u32 hainan_mgcg_cgcg_init[] =
807{
808 0x3100, 0xffffffff, 0xfffffffc,
809 0x200b, 0xffffffff, 0xe0000000,
810 0x2698, 0xffffffff, 0x00000100,
811 0x24a9, 0xffffffff, 0x00000100,
812 0x3059, 0xffffffff, 0x00000100,
813 0x25dd, 0xffffffff, 0x00000100,
814 0x2261, 0xffffffff, 0x06000100,
815 0x2286, 0xffffffff, 0x00000100,
816 0x24a8, 0xffffffff, 0x00000100,
817 0x30e0, 0xffffffff, 0x00000100,
818 0x22ca, 0xffffffff, 0x00000100,
819 0x2451, 0xffffffff, 0x00000100,
820 0x2362, 0xffffffff, 0x00000100,
821 0x2363, 0xffffffff, 0x00000100,
822 0x240c, 0xffffffff, 0x00000100,
823 0x240d, 0xffffffff, 0x00000100,
824 0x240e, 0xffffffff, 0x00000100,
825 0x240f, 0xffffffff, 0x00000100,
826 0x2b60, 0xffffffff, 0x00000100,
827 0x2b15, 0xffffffff, 0x00000100,
828 0x225f, 0xffffffff, 0x06000100,
829 0x261a, 0xffffffff, 0x00000100,
830 0x2544, 0xffffffff, 0x00000100,
831 0x2bc1, 0xffffffff, 0x00000100,
832 0x2b81, 0xffffffff, 0x00000100,
833 0x2527, 0xffffffff, 0x00000100,
834 0x200b, 0xffffffff, 0xe0000000,
835 0x2458, 0xffffffff, 0x00010000,
836 0x2459, 0xffffffff, 0x00030002,
837 0x245a, 0xffffffff, 0x00040007,
838 0x245b, 0xffffffff, 0x00060005,
839 0x245c, 0xffffffff, 0x00090008,
840 0x245d, 0xffffffff, 0x00020001,
841 0x245e, 0xffffffff, 0x00040003,
842 0x245f, 0xffffffff, 0x00000007,
843 0x2460, 0xffffffff, 0x00060005,
844 0x2461, 0xffffffff, 0x00090008,
845 0x2462, 0xffffffff, 0x00030002,
846 0x2463, 0xffffffff, 0x00050004,
847 0x2464, 0xffffffff, 0x00000008,
848 0x2465, 0xffffffff, 0x00070006,
849 0x2466, 0xffffffff, 0x000a0009,
850 0x2467, 0xffffffff, 0x00040003,
851 0x2468, 0xffffffff, 0x00060005,
852 0x2469, 0xffffffff, 0x00000009,
853 0x246a, 0xffffffff, 0x00080007,
854 0x246b, 0xffffffff, 0x000b000a,
855 0x246c, 0xffffffff, 0x00050004,
856 0x246d, 0xffffffff, 0x00070006,
857 0x246e, 0xffffffff, 0x0008000b,
858 0x246f, 0xffffffff, 0x000a0009,
859 0x2470, 0xffffffff, 0x000d000c,
860 0x2471, 0xffffffff, 0x00060005,
861 0x2472, 0xffffffff, 0x00080007,
862 0x2473, 0xffffffff, 0x0000000b,
863 0x2474, 0xffffffff, 0x000a0009,
864 0x2475, 0xffffffff, 0x000d000c,
865 0x2454, 0xffffffff, 0x96940200,
866 0x21c2, 0xffffffff, 0x00900100,
867 0x311e, 0xffffffff, 0x00000080,
868 0x3101, 0xffffffff, 0x0020003f,
869 0xc, 0xffffffff, 0x0000001c,
870 0xd, 0x000f0000, 0x000f0000,
871 0x583, 0xffffffff, 0x00000100,
872 0x409, 0xffffffff, 0x00000100,
873 0x82a, 0xffffffff, 0x00000104,
874 0x993, 0x000c0000, 0x000c0000,
875 0x992, 0x000c0000, 0x000c0000,
876 0xbd4, 0x00000001, 0x00000001,
877 0xc33, 0xc0000fff, 0x00000104,
878 0x3079, 0x00000001, 0x00000001,
879 0x3430, 0xfffffff0, 0x00000100,
880 0x3630, 0xfffffff0, 0x00000100
881};
882
883static u32 si_pcie_rreg(struct amdgpu_device *adev, u32 reg)
884{
885 unsigned long flags;
886 u32 r;
887
888 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
889 WREG32(AMDGPU_PCIE_INDEX, reg);
890 (void)RREG32(AMDGPU_PCIE_INDEX);
891 r = RREG32(AMDGPU_PCIE_DATA);
892 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
893 return r;
894}
895
896static void si_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
897{
898 unsigned long flags;
899
900 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
901 WREG32(AMDGPU_PCIE_INDEX, reg);
902 (void)RREG32(AMDGPU_PCIE_INDEX);
903 WREG32(AMDGPU_PCIE_DATA, v);
904 (void)RREG32(AMDGPU_PCIE_DATA);
905 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
906}
907
908u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg)
909{
910 unsigned long flags;
911 u32 r;
912
913 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
914 WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
915 (void)RREG32(PCIE_PORT_INDEX);
916 r = RREG32(PCIE_PORT_DATA);
917 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
918 return r;
919}
920
921void si_pciep_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
922{
923 unsigned long flags;
924
925 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
926 WREG32(PCIE_PORT_INDEX, ((reg) & 0xff));
927 (void)RREG32(PCIE_PORT_INDEX);
928 WREG32(PCIE_PORT_DATA, (v));
929 (void)RREG32(PCIE_PORT_DATA);
930 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
931}
932
933static u32 si_smc_rreg(struct amdgpu_device *adev, u32 reg)
934{
935 unsigned long flags;
936 u32 r;
937
938 spin_lock_irqsave(&adev->smc_idx_lock, flags);
939 WREG32(SMC_IND_INDEX_0, (reg));
940 r = RREG32(SMC_IND_DATA_0);
941 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
942 return r;
943}
944
945static void si_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
946{
947 unsigned long flags;
948
949 spin_lock_irqsave(&adev->smc_idx_lock, flags);
950 WREG32(SMC_IND_INDEX_0, (reg));
951 WREG32(SMC_IND_DATA_0, (v));
952 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
953}
954
955static struct amdgpu_allowed_register_entry si_allowed_read_registers[] = {
956 {GRBM_STATUS, false},
957 {GB_ADDR_CONFIG, false},
958 {MC_ARB_RAMCFG, false},
959 {GB_TILE_MODE0, false},
960 {GB_TILE_MODE1, false},
961 {GB_TILE_MODE2, false},
962 {GB_TILE_MODE3, false},
963 {GB_TILE_MODE4, false},
964 {GB_TILE_MODE5, false},
965 {GB_TILE_MODE6, false},
966 {GB_TILE_MODE7, false},
967 {GB_TILE_MODE8, false},
968 {GB_TILE_MODE9, false},
969 {GB_TILE_MODE10, false},
970 {GB_TILE_MODE11, false},
971 {GB_TILE_MODE12, false},
972 {GB_TILE_MODE13, false},
973 {GB_TILE_MODE14, false},
974 {GB_TILE_MODE15, false},
975 {GB_TILE_MODE16, false},
976 {GB_TILE_MODE17, false},
977 {GB_TILE_MODE18, false},
978 {GB_TILE_MODE19, false},
979 {GB_TILE_MODE20, false},
980 {GB_TILE_MODE21, false},
981 {GB_TILE_MODE22, false},
982 {GB_TILE_MODE23, false},
983 {GB_TILE_MODE24, false},
984 {GB_TILE_MODE25, false},
985 {GB_TILE_MODE26, false},
986 {GB_TILE_MODE27, false},
987 {GB_TILE_MODE28, false},
988 {GB_TILE_MODE29, false},
989 {GB_TILE_MODE30, false},
990 {GB_TILE_MODE31, false},
991 {CC_RB_BACKEND_DISABLE, false, true},
992 {GC_USER_RB_BACKEND_DISABLE, false, true},
993 {PA_SC_RASTER_CONFIG, false, true},
994};
995
996static uint32_t si_read_indexed_register(struct amdgpu_device *adev,
997 u32 se_num, u32 sh_num,
998 u32 reg_offset)
999{
1000 uint32_t val;
1001
1002 mutex_lock(&adev->grbm_idx_mutex);
1003 if (se_num != 0xffffffff || sh_num != 0xffffffff)
1004 amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff);
1005
1006 val = RREG32(reg_offset);
1007
1008 if (se_num != 0xffffffff || sh_num != 0xffffffff)
1009 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
1010 mutex_unlock(&adev->grbm_idx_mutex);
1011 return val;
1012}
1013
1014static int si_read_register(struct amdgpu_device *adev, u32 se_num,
1015 u32 sh_num, u32 reg_offset, u32 *value)
1016{
1017 uint32_t i;
1018
1019 *value = 0;
1020 for (i = 0; i < ARRAY_SIZE(si_allowed_read_registers); i++) {
1021 if (reg_offset != si_allowed_read_registers[i].reg_offset)
1022 continue;
1023
1024 if (!si_allowed_read_registers[i].untouched)
1025 *value = si_allowed_read_registers[i].grbm_indexed ?
1026 si_read_indexed_register(adev, se_num,
1027 sh_num, reg_offset) :
1028 RREG32(reg_offset);
1029 return 0;
1030 }
1031 return -EINVAL;
1032}
1033
1034static bool si_read_disabled_bios(struct amdgpu_device *adev)
1035{
1036 u32 bus_cntl;
1037 u32 d1vga_control = 0;
1038 u32 d2vga_control = 0;
1039 u32 vga_render_control = 0;
1040 u32 rom_cntl;
1041 bool r;
1042
1043 bus_cntl = RREG32(R600_BUS_CNTL);
1044 if (adev->mode_info.num_crtc) {
1045 d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
1046 d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
1047 vga_render_control = RREG32(VGA_RENDER_CONTROL);
1048 }
1049 rom_cntl = RREG32(R600_ROM_CNTL);
1050
1051 /* enable the rom */
1052 WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
1053 if (adev->mode_info.num_crtc) {
1054 /* Disable VGA mode */
1055 WREG32(AVIVO_D1VGA_CONTROL,
1056 (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1057 AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1058 WREG32(AVIVO_D2VGA_CONTROL,
1059 (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
1060 AVIVO_DVGA_CONTROL_TIMING_SELECT)));
1061 WREG32(VGA_RENDER_CONTROL,
1062 (vga_render_control & C_000300_VGA_VSTATUS_CNTL));
1063 }
1064 WREG32(R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE);
1065
1066 r = amdgpu_read_bios(adev);
1067
1068 /* restore regs */
1069 WREG32(R600_BUS_CNTL, bus_cntl);
1070 if (adev->mode_info.num_crtc) {
1071 WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
1072 WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
1073 WREG32(VGA_RENDER_CONTROL, vga_render_control);
1074 }
1075 WREG32(R600_ROM_CNTL, rom_cntl);
1076 return r;
1077}
1078
1079//xxx: not implemented
1080static int si_asic_reset(struct amdgpu_device *adev)
1081{
1082 return 0;
1083}
1084
1085static void si_vga_set_state(struct amdgpu_device *adev, bool state)
1086{
1087 uint32_t temp;
1088
1089 temp = RREG32(CONFIG_CNTL);
1090 if (state == false) {
1091 temp &= ~(1<<0);
1092 temp |= (1<<1);
1093 } else {
1094 temp &= ~(1<<1);
1095 }
1096 WREG32(CONFIG_CNTL, temp);
1097}
1098
1099static u32 si_get_xclk(struct amdgpu_device *adev)
1100{
1101 u32 reference_clock = adev->clock.spll.reference_freq;
1102 u32 tmp;
1103
1104 tmp = RREG32(CG_CLKPIN_CNTL_2);
1105 if (tmp & MUX_TCLK_TO_XCLK)
1106 return TCLK;
1107
1108 tmp = RREG32(CG_CLKPIN_CNTL);
1109 if (tmp & XTALIN_DIVIDE)
1110 return reference_clock / 4;
1111
1112 return reference_clock;
1113}
1114
1115//xxx:not implemented
1116static int si_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)
1117{
1118 return 0;
1119}
1120
1121static void si_detect_hw_virtualization(struct amdgpu_device *adev)
1122{
1123 if (is_virtual_machine()) /* passthrough mode */
1124 adev->virtualization.virtual_caps |= AMDGPU_PASSTHROUGH_MODE;
1125}
1126
1127static const struct amdgpu_asic_funcs si_asic_funcs =
1128{
1129 .read_disabled_bios = &si_read_disabled_bios,
1130 .detect_hw_virtualization = si_detect_hw_virtualization,
1131 .read_register = &si_read_register,
1132 .reset = &si_asic_reset,
1133 .set_vga_state = &si_vga_set_state,
1134 .get_xclk = &si_get_xclk,
1135 .set_uvd_clocks = &si_set_uvd_clocks,
1136 .set_vce_clocks = NULL,
1137};
1138
1139static uint32_t si_get_rev_id(struct amdgpu_device *adev)
1140{
1141 return (RREG32(CC_DRM_ID_STRAPS) & CC_DRM_ID_STRAPS__ATI_REV_ID_MASK)
1142 >> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;
1143}
1144
1145static int si_common_early_init(void *handle)
1146{
1147 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1148
1149 adev->smc_rreg = &si_smc_rreg;
1150 adev->smc_wreg = &si_smc_wreg;
1151 adev->pcie_rreg = &si_pcie_rreg;
1152 adev->pcie_wreg = &si_pcie_wreg;
1153 adev->pciep_rreg = &si_pciep_rreg;
1154 adev->pciep_wreg = &si_pciep_wreg;
1155 adev->uvd_ctx_rreg = NULL;
1156 adev->uvd_ctx_wreg = NULL;
1157 adev->didt_rreg = NULL;
1158 adev->didt_wreg = NULL;
1159
1160 adev->asic_funcs = &si_asic_funcs;
1161
1162 adev->rev_id = si_get_rev_id(adev);
1163 adev->external_rev_id = 0xFF;
1164 switch (adev->asic_type) {
1165 case CHIP_TAHITI:
1166 adev->cg_flags =
1167 AMD_CG_SUPPORT_GFX_MGCG |
1168 AMD_CG_SUPPORT_GFX_MGLS |
1169 /*AMD_CG_SUPPORT_GFX_CGCG |*/
1170 AMD_CG_SUPPORT_GFX_CGLS |
1171 AMD_CG_SUPPORT_GFX_CGTS |
1172 AMD_CG_SUPPORT_GFX_CP_LS |
1173 AMD_CG_SUPPORT_MC_MGCG |
1174 AMD_CG_SUPPORT_SDMA_MGCG |
1175 AMD_CG_SUPPORT_BIF_LS |
1176 AMD_CG_SUPPORT_VCE_MGCG |
1177 AMD_CG_SUPPORT_UVD_MGCG |
1178 AMD_CG_SUPPORT_HDP_LS |
1179 AMD_CG_SUPPORT_HDP_MGCG;
1180 adev->pg_flags = 0;
1181 break;
1182 case CHIP_PITCAIRN:
1183 adev->cg_flags =
1184 AMD_CG_SUPPORT_GFX_MGCG |
1185 AMD_CG_SUPPORT_GFX_MGLS |
1186 /*AMD_CG_SUPPORT_GFX_CGCG |*/
1187 AMD_CG_SUPPORT_GFX_CGLS |
1188 AMD_CG_SUPPORT_GFX_CGTS |
1189 AMD_CG_SUPPORT_GFX_CP_LS |
1190 AMD_CG_SUPPORT_GFX_RLC_LS |
1191 AMD_CG_SUPPORT_MC_LS |
1192 AMD_CG_SUPPORT_MC_MGCG |
1193 AMD_CG_SUPPORT_SDMA_MGCG |
1194 AMD_CG_SUPPORT_BIF_LS |
1195 AMD_CG_SUPPORT_VCE_MGCG |
1196 AMD_CG_SUPPORT_UVD_MGCG |
1197 AMD_CG_SUPPORT_HDP_LS |
1198 AMD_CG_SUPPORT_HDP_MGCG;
1199 adev->pg_flags = 0;
1200 break;
1201
1202 case CHIP_VERDE:
1203 adev->cg_flags =
1204 AMD_CG_SUPPORT_GFX_MGCG |
1205 AMD_CG_SUPPORT_GFX_MGLS |
1206 AMD_CG_SUPPORT_GFX_CGLS |
1207 AMD_CG_SUPPORT_GFX_CGTS |
1208 AMD_CG_SUPPORT_GFX_CGTS_LS |
1209 AMD_CG_SUPPORT_GFX_CP_LS |
1210 AMD_CG_SUPPORT_MC_LS |
1211 AMD_CG_SUPPORT_MC_MGCG |
1212 AMD_CG_SUPPORT_SDMA_MGCG |
1213 AMD_CG_SUPPORT_SDMA_LS |
1214 AMD_CG_SUPPORT_BIF_LS |
1215 AMD_CG_SUPPORT_VCE_MGCG |
1216 AMD_CG_SUPPORT_UVD_MGCG |
1217 AMD_CG_SUPPORT_HDP_LS |
1218 AMD_CG_SUPPORT_HDP_MGCG;
1219 adev->pg_flags = 0;
1220 //???
1221 adev->external_rev_id = adev->rev_id + 0x14;
1222 break;
1223 case CHIP_OLAND:
1224 adev->cg_flags =
1225 AMD_CG_SUPPORT_GFX_MGCG |
1226 AMD_CG_SUPPORT_GFX_MGLS |
1227 /*AMD_CG_SUPPORT_GFX_CGCG |*/
1228 AMD_CG_SUPPORT_GFX_CGLS |
1229 AMD_CG_SUPPORT_GFX_CGTS |
1230 AMD_CG_SUPPORT_GFX_CP_LS |
1231 AMD_CG_SUPPORT_GFX_RLC_LS |
1232 AMD_CG_SUPPORT_MC_LS |
1233 AMD_CG_SUPPORT_MC_MGCG |
1234 AMD_CG_SUPPORT_SDMA_MGCG |
1235 AMD_CG_SUPPORT_BIF_LS |
1236 AMD_CG_SUPPORT_UVD_MGCG |
1237 AMD_CG_SUPPORT_HDP_LS |
1238 AMD_CG_SUPPORT_HDP_MGCG;
1239 adev->pg_flags = 0;
1240 break;
1241 case CHIP_HAINAN:
1242 adev->cg_flags =
1243 AMD_CG_SUPPORT_GFX_MGCG |
1244 AMD_CG_SUPPORT_GFX_MGLS |
1245 /*AMD_CG_SUPPORT_GFX_CGCG |*/
1246 AMD_CG_SUPPORT_GFX_CGLS |
1247 AMD_CG_SUPPORT_GFX_CGTS |
1248 AMD_CG_SUPPORT_GFX_CP_LS |
1249 AMD_CG_SUPPORT_GFX_RLC_LS |
1250 AMD_CG_SUPPORT_MC_LS |
1251 AMD_CG_SUPPORT_MC_MGCG |
1252 AMD_CG_SUPPORT_SDMA_MGCG |
1253 AMD_CG_SUPPORT_BIF_LS |
1254 AMD_CG_SUPPORT_HDP_LS |
1255 AMD_CG_SUPPORT_HDP_MGCG;
1256 adev->pg_flags = 0;
1257 break;
1258
1259 default:
1260 return -EINVAL;
1261 }
1262
1263 return 0;
1264}
1265
1266static int si_common_sw_init(void *handle)
1267{
1268 return 0;
1269}
1270
1271static int si_common_sw_fini(void *handle)
1272{
1273 return 0;
1274}
1275
1276
1277static void si_init_golden_registers(struct amdgpu_device *adev)
1278{
1279 switch (adev->asic_type) {
1280 case CHIP_TAHITI:
1281 amdgpu_program_register_sequence(adev,
1282 tahiti_golden_registers,
1283 (const u32)ARRAY_SIZE(tahiti_golden_registers));
1284 amdgpu_program_register_sequence(adev,
1285 tahiti_golden_rlc_registers,
1286 (const u32)ARRAY_SIZE(tahiti_golden_rlc_registers));
1287 amdgpu_program_register_sequence(adev,
1288 tahiti_mgcg_cgcg_init,
1289 (const u32)ARRAY_SIZE(tahiti_mgcg_cgcg_init));
1290 amdgpu_program_register_sequence(adev,
1291 tahiti_golden_registers2,
1292 (const u32)ARRAY_SIZE(tahiti_golden_registers2));
1293 break;
1294 case CHIP_PITCAIRN:
1295 amdgpu_program_register_sequence(adev,
1296 pitcairn_golden_registers,
1297 (const u32)ARRAY_SIZE(pitcairn_golden_registers));
1298 amdgpu_program_register_sequence(adev,
1299 pitcairn_golden_rlc_registers,
1300 (const u32)ARRAY_SIZE(pitcairn_golden_rlc_registers));
1301 amdgpu_program_register_sequence(adev,
1302 pitcairn_mgcg_cgcg_init,
1303 (const u32)ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
1304 case CHIP_VERDE:
1305 amdgpu_program_register_sequence(adev,
1306 verde_golden_registers,
1307 (const u32)ARRAY_SIZE(verde_golden_registers));
1308 amdgpu_program_register_sequence(adev,
1309 verde_golden_rlc_registers,
1310 (const u32)ARRAY_SIZE(verde_golden_rlc_registers));
1311 amdgpu_program_register_sequence(adev,
1312 verde_mgcg_cgcg_init,
1313 (const u32)ARRAY_SIZE(verde_mgcg_cgcg_init));
1314 amdgpu_program_register_sequence(adev,
1315 verde_pg_init,
1316 (const u32)ARRAY_SIZE(verde_pg_init));
1317 break;
1318 case CHIP_OLAND:
1319 amdgpu_program_register_sequence(adev,
1320 oland_golden_registers,
1321 (const u32)ARRAY_SIZE(oland_golden_registers));
1322 amdgpu_program_register_sequence(adev,
1323 oland_golden_rlc_registers,
1324 (const u32)ARRAY_SIZE(oland_golden_rlc_registers));
1325 amdgpu_program_register_sequence(adev,
1326 oland_mgcg_cgcg_init,
1327 (const u32)ARRAY_SIZE(oland_mgcg_cgcg_init));
1328 case CHIP_HAINAN:
1329 amdgpu_program_register_sequence(adev,
1330 hainan_golden_registers,
1331 (const u32)ARRAY_SIZE(hainan_golden_registers));
1332 amdgpu_program_register_sequence(adev,
1333 hainan_golden_registers2,
1334 (const u32)ARRAY_SIZE(hainan_golden_registers2));
1335 amdgpu_program_register_sequence(adev,
1336 hainan_mgcg_cgcg_init,
1337 (const u32)ARRAY_SIZE(hainan_mgcg_cgcg_init));
1338 break;
1339
1340
1341 default:
1342 BUG();
1343 }
1344}
1345
1346static void si_pcie_gen3_enable(struct amdgpu_device *adev)
1347{
1348 struct pci_dev *root = adev->pdev->bus->self;
1349 int bridge_pos, gpu_pos;
1350 u32 speed_cntl, mask, current_data_rate;
1351 int ret, i;
1352 u16 tmp16;
1353
1354 if (pci_is_root_bus(adev->pdev->bus))
1355 return;
1356
1357 if (amdgpu_pcie_gen2 == 0)
1358 return;
1359
1360 if (adev->flags & AMD_IS_APU)
1361 return;
1362
1363 ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask);
1364 if (ret != 0)
1365 return;
1366
1367 if (!(mask & (DRM_PCIE_SPEED_50 | DRM_PCIE_SPEED_80)))
1368 return;
1369
1370 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1371 current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
1372 LC_CURRENT_DATA_RATE_SHIFT;
1373 if (mask & DRM_PCIE_SPEED_80) {
1374 if (current_data_rate == 2) {
1375 DRM_INFO("PCIE gen 3 link speeds already enabled\n");
1376 return;
1377 }
1378 DRM_INFO("enabling PCIE gen 3 link speeds, disable with amdgpu.pcie_gen2=0\n");
1379 } else if (mask & DRM_PCIE_SPEED_50) {
1380 if (current_data_rate == 1) {
1381 DRM_INFO("PCIE gen 2 link speeds already enabled\n");
1382 return;
1383 }
1384 DRM_INFO("enabling PCIE gen 2 link speeds, disable with amdgpu.pcie_gen2=0\n");
1385 }
1386
1387 bridge_pos = pci_pcie_cap(root);
1388 if (!bridge_pos)
1389 return;
1390
1391 gpu_pos = pci_pcie_cap(adev->pdev);
1392 if (!gpu_pos)
1393 return;
1394
1395 if (mask & DRM_PCIE_SPEED_80) {
1396 if (current_data_rate != 2) {
1397 u16 bridge_cfg, gpu_cfg;
1398 u16 bridge_cfg2, gpu_cfg2;
1399 u32 max_lw, current_lw, tmp;
1400
1401 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
1402 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
1403
1404 tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
1405 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
1406
1407 tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
1408 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
1409
1410 tmp = RREG32_PCIE(PCIE_LC_STATUS1);
1411 max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
1412 current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
1413
1414 if (current_lw < max_lw) {
1415 tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1416 if (tmp & LC_RENEGOTIATION_SUPPORT) {
1417 tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
1418 tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
1419 tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
1420 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
1421 }
1422 }
1423
1424 for (i = 0; i < 10; i++) {
1425 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16);
1426 if (tmp16 & PCI_EXP_DEVSTA_TRPND)
1427 break;
1428
1429 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
1430 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
1431
1432 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2);
1433 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2);
1434
1435 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1436 tmp |= LC_SET_QUIESCE;
1437 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1438
1439 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1440 tmp |= LC_REDO_EQ;
1441 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1442
1443 mdelay(100);
1444
1445 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16);
1446 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1447 tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
1448 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
1449
1450 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16);
1451 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
1452 tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
1453 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
1454
1455 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16);
1456 tmp16 &= ~((1 << 4) | (7 << 9));
1457 tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9)));
1458 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16);
1459
1460 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
1461 tmp16 &= ~((1 << 4) | (7 << 9));
1462 tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9)));
1463 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
1464
1465 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
1466 tmp &= ~LC_SET_QUIESCE;
1467 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
1468 }
1469 }
1470 }
1471
1472 speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
1473 speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
1474 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
1475
1476 pci_read_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
1477 tmp16 &= ~0xf;
1478 if (mask & DRM_PCIE_SPEED_80)
1479 tmp16 |= 3;
1480 else if (mask & DRM_PCIE_SPEED_50)
1481 tmp16 |= 2;
1482 else
1483 tmp16 |= 1;
1484 pci_write_config_word(adev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
1485
1486 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1487 speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
1488 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
1489
1490 for (i = 0; i < adev->usec_timeout; i++) {
1491 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
1492 if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
1493 break;
1494 udelay(1);
1495 }
1496}
1497
1498static inline u32 si_pif_phy0_rreg(struct amdgpu_device *adev, u32 reg)
1499{
1500 unsigned long flags;
1501 u32 r;
1502
1503 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1504 WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
1505 r = RREG32(EVERGREEN_PIF_PHY0_DATA);
1506 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1507 return r;
1508}
1509
1510static inline void si_pif_phy0_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1511{
1512 unsigned long flags;
1513
1514 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1515 WREG32(EVERGREEN_PIF_PHY0_INDEX, ((reg) & 0xffff));
1516 WREG32(EVERGREEN_PIF_PHY0_DATA, (v));
1517 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1518}
1519
1520static inline u32 si_pif_phy1_rreg(struct amdgpu_device *adev, u32 reg)
1521{
1522 unsigned long flags;
1523 u32 r;
1524
1525 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1526 WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
1527 r = RREG32(EVERGREEN_PIF_PHY1_DATA);
1528 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1529 return r;
1530}
1531
1532static inline void si_pif_phy1_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
1533{
1534 unsigned long flags;
1535
1536 spin_lock_irqsave(&adev->pcie_idx_lock, flags);
1537 WREG32(EVERGREEN_PIF_PHY1_INDEX, ((reg) & 0xffff));
1538 WREG32(EVERGREEN_PIF_PHY1_DATA, (v));
1539 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags);
1540}
1541static void si_program_aspm(struct amdgpu_device *adev)
1542{
1543 u32 data, orig;
1544 bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
1545 bool disable_clkreq = false;
1546
1547 if (amdgpu_aspm == 0)
1548 return;
1549
1550 if (adev->flags & AMD_IS_APU)
1551 return;
1552 orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
1553 data &= ~LC_XMIT_N_FTS_MASK;
1554 data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
1555 if (orig != data)
1556 WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
1557
1558 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
1559 data |= LC_GO_TO_RECOVERY;
1560 if (orig != data)
1561 WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
1562
1563 orig = data = RREG32_PCIE(PCIE_P_CNTL);
1564 data |= P_IGNORE_EDB_ERR;
1565 if (orig != data)
1566 WREG32_PCIE(PCIE_P_CNTL, data);
1567
1568 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
1569 data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
1570 data |= LC_PMI_TO_L1_DIS;
1571 if (!disable_l0s)
1572 data |= LC_L0S_INACTIVITY(7);
1573
1574 if (!disable_l1) {
1575 data |= LC_L1_INACTIVITY(7);
1576 data &= ~LC_PMI_TO_L1_DIS;
1577 if (orig != data)
1578 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
1579
1580 if (!disable_plloff_in_l1) {
1581 bool clk_req_support;
1582
1583 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
1584 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
1585 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
1586 if (orig != data)
1587 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
1588
1589 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
1590 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
1591 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
1592 if (orig != data)
1593 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
1594
1595 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
1596 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
1597 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
1598 if (orig != data)
1599 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
1600
1601 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
1602 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
1603 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
1604 if (orig != data)
1605 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
1606
1607 if ((adev->family != CHIP_OLAND) && (adev->family != CHIP_HAINAN)) {
1608 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_0);
1609 data &= ~PLL_RAMP_UP_TIME_0_MASK;
1610 if (orig != data)
1611 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_0, data);
1612
1613 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_1);
1614 data &= ~PLL_RAMP_UP_TIME_1_MASK;
1615 if (orig != data)
1616 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_1, data);
1617
1618 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_2);
1619 data &= ~PLL_RAMP_UP_TIME_2_MASK;
1620 if (orig != data)
1621 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_2, data);
1622
1623 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_PWRDOWN_3);
1624 data &= ~PLL_RAMP_UP_TIME_3_MASK;
1625 if (orig != data)
1626 si_pif_phy0_wreg(adev,PB0_PIF_PWRDOWN_3, data);
1627
1628 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_0);
1629 data &= ~PLL_RAMP_UP_TIME_0_MASK;
1630 if (orig != data)
1631 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_0, data);
1632
1633 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_1);
1634 data &= ~PLL_RAMP_UP_TIME_1_MASK;
1635 if (orig != data)
1636 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_1, data);
1637
1638 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_2);
1639 data &= ~PLL_RAMP_UP_TIME_2_MASK;
1640 if (orig != data)
1641 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_2, data);
1642
1643 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_PWRDOWN_3);
1644 data &= ~PLL_RAMP_UP_TIME_3_MASK;
1645 if (orig != data)
1646 si_pif_phy1_wreg(adev,PB1_PIF_PWRDOWN_3, data);
1647 }
1648 orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
1649 data &= ~LC_DYN_LANES_PWR_STATE_MASK;
1650 data |= LC_DYN_LANES_PWR_STATE(3);
1651 if (orig != data)
1652 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
1653
1654 orig = data = si_pif_phy0_rreg(adev,PB0_PIF_CNTL);
1655 data &= ~LS2_EXIT_TIME_MASK;
1656 if ((adev->family == CHIP_OLAND) || (adev->family == CHIP_HAINAN))
1657 data |= LS2_EXIT_TIME(5);
1658 if (orig != data)
1659 si_pif_phy0_wreg(adev,PB0_PIF_CNTL, data);
1660
1661 orig = data = si_pif_phy1_rreg(adev,PB1_PIF_CNTL);
1662 data &= ~LS2_EXIT_TIME_MASK;
1663 if ((adev->family == CHIP_OLAND) || (adev->family == CHIP_HAINAN))
1664 data |= LS2_EXIT_TIME(5);
1665 if (orig != data)
1666 si_pif_phy1_wreg(adev,PB1_PIF_CNTL, data);
1667
1668 if (!disable_clkreq &&
1669 !pci_is_root_bus(adev->pdev->bus)) {
1670 struct pci_dev *root = adev->pdev->bus->self;
1671 u32 lnkcap;
1672
1673 clk_req_support = false;
1674 pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
1675 if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
1676 clk_req_support = true;
1677 } else {
1678 clk_req_support = false;
1679 }
1680
1681 if (clk_req_support) {
1682 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
1683 data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
1684 if (orig != data)
1685 WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
1686
1687 orig = data = RREG32(THM_CLK_CNTL);
1688 data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
1689 data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
1690 if (orig != data)
1691 WREG32(THM_CLK_CNTL, data);
1692
1693 orig = data = RREG32(MISC_CLK_CNTL);
1694 data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
1695 data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
1696 if (orig != data)
1697 WREG32(MISC_CLK_CNTL, data);
1698
1699 orig = data = RREG32(CG_CLKPIN_CNTL);
1700 data &= ~BCLK_AS_XCLK;
1701 if (orig != data)
1702 WREG32(CG_CLKPIN_CNTL, data);
1703
1704 orig = data = RREG32(CG_CLKPIN_CNTL_2);
1705 data &= ~FORCE_BIF_REFCLK_EN;
1706 if (orig != data)
1707 WREG32(CG_CLKPIN_CNTL_2, data);
1708
1709 orig = data = RREG32(MPLL_BYPASSCLK_SEL);
1710 data &= ~MPLL_CLKOUT_SEL_MASK;
1711 data |= MPLL_CLKOUT_SEL(4);
1712 if (orig != data)
1713 WREG32(MPLL_BYPASSCLK_SEL, data);
1714
1715 orig = data = RREG32(SPLL_CNTL_MODE);
1716 data &= ~SPLL_REFCLK_SEL_MASK;
1717 if (orig != data)
1718 WREG32(SPLL_CNTL_MODE, data);
1719 }
1720 }
1721 } else {
1722 if (orig != data)
1723 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
1724 }
1725
1726 orig = data = RREG32_PCIE(PCIE_CNTL2);
1727 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
1728 if (orig != data)
1729 WREG32_PCIE(PCIE_CNTL2, data);
1730
1731 if (!disable_l0s) {
1732 data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
1733 if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
1734 data = RREG32_PCIE(PCIE_LC_STATUS1);
1735 if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
1736 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
1737 data &= ~LC_L0S_INACTIVITY_MASK;
1738 if (orig != data)
1739 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
1740 }
1741 }
1742 }
1743}
1744
1745static void si_fix_pci_max_read_req_size(struct amdgpu_device *adev)
1746{
1747 int readrq;
1748 u16 v;
1749
1750 readrq = pcie_get_readrq(adev->pdev);
1751 v = ffs(readrq) - 8;
1752 if ((v == 0) || (v == 6) || (v == 7))
1753 pcie_set_readrq(adev->pdev, 512);
1754}
1755
1756static int si_common_hw_init(void *handle)
1757{
1758 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1759
1760 si_fix_pci_max_read_req_size(adev);
1761 si_init_golden_registers(adev);
1762 si_pcie_gen3_enable(adev);
1763 si_program_aspm(adev);
1764
1765 return 0;
1766}
1767
1768static int si_common_hw_fini(void *handle)
1769{
1770 return 0;
1771}
1772
1773static int si_common_suspend(void *handle)
1774{
1775 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1776
1777 return si_common_hw_fini(adev);
1778}
1779
1780static int si_common_resume(void *handle)
1781{
1782 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1783
1784 return si_common_hw_init(adev);
1785}
1786
1787static bool si_common_is_idle(void *handle)
1788{
1789 return true;
1790}
1791
1792static int si_common_wait_for_idle(void *handle)
1793{
1794 return 0;
1795}
1796
1797static int si_common_soft_reset(void *handle)
1798{
1799 return 0;
1800}
1801
1802static int si_common_set_clockgating_state(void *handle,
1803 enum amd_clockgating_state state)
1804{
1805 return 0;
1806}
1807
1808static int si_common_set_powergating_state(void *handle,
1809 enum amd_powergating_state state)
1810{
1811 return 0;
1812}
1813
1814const struct amd_ip_funcs si_common_ip_funcs = {
1815 .name = "si_common",
1816 .early_init = si_common_early_init,
1817 .late_init = NULL,
1818 .sw_init = si_common_sw_init,
1819 .sw_fini = si_common_sw_fini,
1820 .hw_init = si_common_hw_init,
1821 .hw_fini = si_common_hw_fini,
1822 .suspend = si_common_suspend,
1823 .resume = si_common_resume,
1824 .is_idle = si_common_is_idle,
1825 .wait_for_idle = si_common_wait_for_idle,
1826 .soft_reset = si_common_soft_reset,
1827 .set_clockgating_state = si_common_set_clockgating_state,
1828 .set_powergating_state = si_common_set_powergating_state,
1829};
1830
1831static const struct amdgpu_ip_block_version verde_ip_blocks[] =
1832{
1833 {
1834 .type = AMD_IP_BLOCK_TYPE_COMMON,
1835 .major = 1,
1836 .minor = 0,
1837 .rev = 0,
1838 .funcs = &si_common_ip_funcs,
1839 },
1840 {
1841 .type = AMD_IP_BLOCK_TYPE_GMC,
1842 .major = 6,
1843 .minor = 0,
1844 .rev = 0,
1845 .funcs = &gmc_v6_0_ip_funcs,
1846 },
1847 {
1848 .type = AMD_IP_BLOCK_TYPE_IH,
1849 .major = 1,
1850 .minor = 0,
1851 .rev = 0,
1852 .funcs = &si_ih_ip_funcs,
1853 },
1854 {
1855 .type = AMD_IP_BLOCK_TYPE_SMC,
1856 .major = 6,
1857 .minor = 0,
1858 .rev = 0,
1859 .funcs = &amdgpu_pp_ip_funcs,
1860 },
1861 {
1862 .type = AMD_IP_BLOCK_TYPE_DCE,
1863 .major = 6,
1864 .minor = 0,
1865 .rev = 0,
1866 .funcs = &dce_v6_0_ip_funcs,
1867 },
1868 {
1869 .type = AMD_IP_BLOCK_TYPE_GFX,
1870 .major = 6,
1871 .minor = 0,
1872 .rev = 0,
1873 .funcs = &gfx_v6_0_ip_funcs,
1874 },
1875 {
1876 .type = AMD_IP_BLOCK_TYPE_SDMA,
1877 .major = 1,
1878 .minor = 0,
1879 .rev = 0,
1880 .funcs = &si_dma_ip_funcs,
1881 },
1882/* {
1883 .type = AMD_IP_BLOCK_TYPE_UVD,
1884 .major = 3,
1885 .minor = 1,
1886 .rev = 0,
1887 .funcs = &si_null_ip_funcs,
1888 },
1889 {
1890 .type = AMD_IP_BLOCK_TYPE_VCE,
1891 .major = 1,
1892 .minor = 0,
1893 .rev = 0,
1894 .funcs = &si_null_ip_funcs,
1895 },
1896 */
1897};
1898
1899
1900static const struct amdgpu_ip_block_version hainan_ip_blocks[] =
1901{
1902 {
1903 .type = AMD_IP_BLOCK_TYPE_COMMON,
1904 .major = 1,
1905 .minor = 0,
1906 .rev = 0,
1907 .funcs = &si_common_ip_funcs,
1908 },
1909 {
1910 .type = AMD_IP_BLOCK_TYPE_GMC,
1911 .major = 6,
1912 .minor = 0,
1913 .rev = 0,
1914 .funcs = &gmc_v6_0_ip_funcs,
1915 },
1916 {
1917 .type = AMD_IP_BLOCK_TYPE_IH,
1918 .major = 1,
1919 .minor = 0,
1920 .rev = 0,
1921 .funcs = &si_ih_ip_funcs,
1922 },
1923 {
1924 .type = AMD_IP_BLOCK_TYPE_SMC,
1925 .major = 6,
1926 .minor = 0,
1927 .rev = 0,
1928 .funcs = &amdgpu_pp_ip_funcs,
1929 },
1930 {
1931 .type = AMD_IP_BLOCK_TYPE_GFX,
1932 .major = 6,
1933 .minor = 0,
1934 .rev = 0,
1935 .funcs = &gfx_v6_0_ip_funcs,
1936 },
1937 {
1938 .type = AMD_IP_BLOCK_TYPE_SDMA,
1939 .major = 1,
1940 .minor = 0,
1941 .rev = 0,
1942 .funcs = &si_dma_ip_funcs,
1943 },
1944};
1945
1946int si_set_ip_blocks(struct amdgpu_device *adev)
1947{
1948 switch (adev->asic_type) {
1949 case CHIP_VERDE:
1950 case CHIP_TAHITI:
1951 case CHIP_PITCAIRN:
1952 case CHIP_OLAND:
1953 adev->ip_blocks = verde_ip_blocks;
1954 adev->num_ip_blocks = ARRAY_SIZE(verde_ip_blocks);
1955 break;
1956 case CHIP_HAINAN:
1957 adev->ip_blocks = hainan_ip_blocks;
1958 adev->num_ip_blocks = ARRAY_SIZE(hainan_ip_blocks);
1959 break;
1960 default:
1961 BUG();
1962 }
1963 return 0;
1964}
1965
diff --git a/drivers/gpu/drm/amd/amdgpu/fiji_smum.h b/drivers/gpu/drm/amd/amdgpu/si.h
index 1cef03deeac3..959d7b63e0e5 100644
--- a/drivers/gpu/drm/amd/amdgpu/fiji_smum.h
+++ b/drivers/gpu/drm/amd/amdgpu/si.h
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright 2014 Advanced Micro Devices, Inc. 2 * Copyright 2015 Advanced Micro Devices, Inc.
3 * 3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"), 5 * copy of this software and associated documentation files (the "Software"),
@@ -21,22 +21,13 @@
21 * 21 *
22 */ 22 */
23 23
24#ifndef FIJI_SMUMGR_H 24#ifndef __SI_H__
25#define FIJI_SMUMGR_H 25#define __SI_H__
26 26
27#include "fiji_ppsmc.h" 27extern const struct amd_ip_funcs si_common_ip_funcs;
28 28
29int fiji_smu_init(struct amdgpu_device *adev); 29void si_srbm_select(struct amdgpu_device *adev,
30int fiji_smu_fini(struct amdgpu_device *adev); 30 u32 me, u32 pipe, u32 queue, u32 vmid);
31int fiji_smu_start(struct amdgpu_device *adev); 31int si_set_ip_blocks(struct amdgpu_device *adev);
32
33struct fiji_smu_private_data
34{
35 uint8_t *header;
36 uint32_t smu_buffer_addr_high;
37 uint32_t smu_buffer_addr_low;
38 uint32_t header_addr_high;
39 uint32_t header_addr_low;
40};
41 32
42#endif 33#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/si_dma.c b/drivers/gpu/drm/amd/amdgpu/si_dma.c
new file mode 100644
index 000000000000..de358193a8f9
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/si_dma.c
@@ -0,0 +1,915 @@
1/*
2 * Copyright 2015 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 * Authors: Alex Deucher
23 */
24#include <drm/drmP.h>
25#include "amdgpu.h"
26#include "amdgpu_trace.h"
27#include "si/sid.h"
28
29const u32 sdma_offsets[SDMA_MAX_INSTANCE] =
30{
31 DMA0_REGISTER_OFFSET,
32 DMA1_REGISTER_OFFSET
33};
34
35static void si_dma_set_ring_funcs(struct amdgpu_device *adev);
36static void si_dma_set_buffer_funcs(struct amdgpu_device *adev);
37static void si_dma_set_vm_pte_funcs(struct amdgpu_device *adev);
38static void si_dma_set_irq_funcs(struct amdgpu_device *adev);
39
40static uint32_t si_dma_ring_get_rptr(struct amdgpu_ring *ring)
41{
42 return ring->adev->wb.wb[ring->rptr_offs>>2];
43}
44
45static uint32_t si_dma_ring_get_wptr(struct amdgpu_ring *ring)
46{
47 struct amdgpu_device *adev = ring->adev;
48 u32 me = (ring == &adev->sdma.instance[0].ring) ? 0 : 1;
49
50 return (RREG32(DMA_RB_WPTR + sdma_offsets[me]) & 0x3fffc) >> 2;
51}
52
53static void si_dma_ring_set_wptr(struct amdgpu_ring *ring)
54{
55 struct amdgpu_device *adev = ring->adev;
56 u32 me = (ring == &adev->sdma.instance[0].ring) ? 0 : 1;
57
58 WREG32(DMA_RB_WPTR + sdma_offsets[me], (ring->wptr << 2) & 0x3fffc);
59}
60
61static void si_dma_ring_emit_ib(struct amdgpu_ring *ring,
62 struct amdgpu_ib *ib,
63 unsigned vm_id, bool ctx_switch)
64{
65 /* The indirect buffer packet must end on an 8 DW boundary in the DMA ring.
66 * Pad as necessary with NOPs.
67 */
68 while ((ring->wptr & 7) != 5)
69 amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0));
70 amdgpu_ring_write(ring, DMA_IB_PACKET(DMA_PACKET_INDIRECT_BUFFER, vm_id, 0));
71 amdgpu_ring_write(ring, (ib->gpu_addr & 0xFFFFFFE0));
72 amdgpu_ring_write(ring, (ib->length_dw << 12) | (upper_32_bits(ib->gpu_addr) & 0xFF));
73
74}
75
76static void si_dma_ring_emit_hdp_flush(struct amdgpu_ring *ring)
77{
78 amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0));
79 amdgpu_ring_write(ring, (0xf << 16) | (HDP_MEM_COHERENCY_FLUSH_CNTL));
80 amdgpu_ring_write(ring, 1);
81}
82
83static void si_dma_ring_emit_hdp_invalidate(struct amdgpu_ring *ring)
84{
85 amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0));
86 amdgpu_ring_write(ring, (0xf << 16) | (HDP_DEBUG0));
87 amdgpu_ring_write(ring, 1);
88}
89
90/**
91 * si_dma_ring_emit_fence - emit a fence on the DMA ring
92 *
93 * @ring: amdgpu ring pointer
94 * @fence: amdgpu fence object
95 *
96 * Add a DMA fence packet to the ring to write
97 * the fence seq number and DMA trap packet to generate
98 * an interrupt if needed (VI).
99 */
100static void si_dma_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq,
101 unsigned flags)
102{
103
104 bool write64bit = flags & AMDGPU_FENCE_FLAG_64BIT;
105 /* write the fence */
106 amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_FENCE, 0, 0, 0, 0));
107 amdgpu_ring_write(ring, addr & 0xfffffffc);
108 amdgpu_ring_write(ring, (upper_32_bits(addr) & 0xff));
109 amdgpu_ring_write(ring, seq);
110 /* optionally write high bits as well */
111 if (write64bit) {
112 addr += 4;
113 amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_FENCE, 0, 0, 0, 0));
114 amdgpu_ring_write(ring, addr & 0xfffffffc);
115 amdgpu_ring_write(ring, (upper_32_bits(addr) & 0xff));
116 amdgpu_ring_write(ring, upper_32_bits(seq));
117 }
118 /* generate an interrupt */
119 amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_TRAP, 0, 0, 0, 0));
120}
121
122static void si_dma_stop(struct amdgpu_device *adev)
123{
124 struct amdgpu_ring *ring;
125 u32 rb_cntl;
126 unsigned i;
127
128 for (i = 0; i < adev->sdma.num_instances; i++) {
129 ring = &adev->sdma.instance[i].ring;
130 /* dma0 */
131 rb_cntl = RREG32(DMA_RB_CNTL + sdma_offsets[i]);
132 rb_cntl &= ~DMA_RB_ENABLE;
133 WREG32(DMA_RB_CNTL + sdma_offsets[i], rb_cntl);
134
135 if (adev->mman.buffer_funcs_ring == ring)
136 amdgpu_ttm_set_active_vram_size(adev, adev->mc.visible_vram_size);
137 ring->ready = false;
138 }
139}
140
141static int si_dma_start(struct amdgpu_device *adev)
142{
143 struct amdgpu_ring *ring;
144 u32 rb_cntl, dma_cntl, ib_cntl, rb_bufsz;
145 int i, r;
146 uint64_t rptr_addr;
147
148 for (i = 0; i < adev->sdma.num_instances; i++) {
149 ring = &adev->sdma.instance[i].ring;
150
151 WREG32(DMA_SEM_INCOMPLETE_TIMER_CNTL + sdma_offsets[i], 0);
152 WREG32(DMA_SEM_WAIT_FAIL_TIMER_CNTL + sdma_offsets[i], 0);
153
154 /* Set ring buffer size in dwords */
155 rb_bufsz = order_base_2(ring->ring_size / 4);
156 rb_cntl = rb_bufsz << 1;
157#ifdef __BIG_ENDIAN
158 rb_cntl |= DMA_RB_SWAP_ENABLE | DMA_RPTR_WRITEBACK_SWAP_ENABLE;
159#endif
160 WREG32(DMA_RB_CNTL + sdma_offsets[i], rb_cntl);
161
162 /* Initialize the ring buffer's read and write pointers */
163 WREG32(DMA_RB_RPTR + sdma_offsets[i], 0);
164 WREG32(DMA_RB_WPTR + sdma_offsets[i], 0);
165
166 rptr_addr = adev->wb.gpu_addr + (ring->rptr_offs * 4);
167
168 WREG32(DMA_RB_RPTR_ADDR_LO + sdma_offsets[i], lower_32_bits(rptr_addr));
169 WREG32(DMA_RB_RPTR_ADDR_HI + sdma_offsets[i], upper_32_bits(rptr_addr) & 0xFF);
170
171 rb_cntl |= DMA_RPTR_WRITEBACK_ENABLE;
172
173 WREG32(DMA_RB_BASE + sdma_offsets[i], ring->gpu_addr >> 8);
174
175 /* enable DMA IBs */
176 ib_cntl = DMA_IB_ENABLE | CMD_VMID_FORCE;
177#ifdef __BIG_ENDIAN
178 ib_cntl |= DMA_IB_SWAP_ENABLE;
179#endif
180 WREG32(DMA_IB_CNTL + sdma_offsets[i], ib_cntl);
181
182 dma_cntl = RREG32(DMA_CNTL + sdma_offsets[i]);
183 dma_cntl &= ~CTXEMPTY_INT_ENABLE;
184 WREG32(DMA_CNTL + sdma_offsets[i], dma_cntl);
185
186 ring->wptr = 0;
187 WREG32(DMA_RB_WPTR + sdma_offsets[i], ring->wptr << 2);
188 WREG32(DMA_RB_CNTL + sdma_offsets[i], rb_cntl | DMA_RB_ENABLE);
189
190 ring->ready = true;
191
192 r = amdgpu_ring_test_ring(ring);
193 if (r) {
194 ring->ready = false;
195 return r;
196 }
197
198 if (adev->mman.buffer_funcs_ring == ring)
199 amdgpu_ttm_set_active_vram_size(adev, adev->mc.real_vram_size);
200 }
201
202 return 0;
203}
204
205/**
206 * si_dma_ring_test_ring - simple async dma engine test
207 *
208 * @ring: amdgpu_ring structure holding ring information
209 *
210 * Test the DMA engine by writing using it to write an
211 * value to memory. (VI).
212 * Returns 0 for success, error for failure.
213 */
214static int si_dma_ring_test_ring(struct amdgpu_ring *ring)
215{
216 struct amdgpu_device *adev = ring->adev;
217 unsigned i;
218 unsigned index;
219 int r;
220 u32 tmp;
221 u64 gpu_addr;
222
223 r = amdgpu_wb_get(adev, &index);
224 if (r) {
225 dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
226 return r;
227 }
228
229 gpu_addr = adev->wb.gpu_addr + (index * 4);
230 tmp = 0xCAFEDEAD;
231 adev->wb.wb[index] = cpu_to_le32(tmp);
232
233 r = amdgpu_ring_alloc(ring, 4);
234 if (r) {
235 DRM_ERROR("amdgpu: dma failed to lock ring %d (%d).\n", ring->idx, r);
236 amdgpu_wb_free(adev, index);
237 return r;
238 }
239
240 amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 0, 1));
241 amdgpu_ring_write(ring, lower_32_bits(gpu_addr));
242 amdgpu_ring_write(ring, upper_32_bits(gpu_addr) & 0xff);
243 amdgpu_ring_write(ring, 0xDEADBEEF);
244 amdgpu_ring_commit(ring);
245
246 for (i = 0; i < adev->usec_timeout; i++) {
247 tmp = le32_to_cpu(adev->wb.wb[index]);
248 if (tmp == 0xDEADBEEF)
249 break;
250 DRM_UDELAY(1);
251 }
252
253 if (i < adev->usec_timeout) {
254 DRM_INFO("ring test on %d succeeded in %d usecs\n", ring->idx, i);
255 } else {
256 DRM_ERROR("amdgpu: ring %d test failed (0x%08X)\n",
257 ring->idx, tmp);
258 r = -EINVAL;
259 }
260 amdgpu_wb_free(adev, index);
261
262 return r;
263}
264
265/**
266 * si_dma_ring_test_ib - test an IB on the DMA engine
267 *
268 * @ring: amdgpu_ring structure holding ring information
269 *
270 * Test a simple IB in the DMA ring (VI).
271 * Returns 0 on success, error on failure.
272 */
273static int si_dma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
274{
275 struct amdgpu_device *adev = ring->adev;
276 struct amdgpu_ib ib;
277 struct fence *f = NULL;
278 unsigned index;
279 u32 tmp = 0;
280 u64 gpu_addr;
281 long r;
282
283 r = amdgpu_wb_get(adev, &index);
284 if (r) {
285 dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
286 return r;
287 }
288
289 gpu_addr = adev->wb.gpu_addr + (index * 4);
290 tmp = 0xCAFEDEAD;
291 adev->wb.wb[index] = cpu_to_le32(tmp);
292 memset(&ib, 0, sizeof(ib));
293 r = amdgpu_ib_get(adev, NULL, 256, &ib);
294 if (r) {
295 DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
296 goto err0;
297 }
298
299 ib.ptr[0] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 0, 1);
300 ib.ptr[1] = lower_32_bits(gpu_addr);
301 ib.ptr[2] = upper_32_bits(gpu_addr) & 0xff;
302 ib.ptr[3] = 0xDEADBEEF;
303 ib.length_dw = 4;
304 r = amdgpu_ib_schedule(ring, 1, &ib, NULL, NULL, &f);
305 if (r)
306 goto err1;
307
308 r = fence_wait_timeout(f, false, timeout);
309 if (r == 0) {
310 DRM_ERROR("amdgpu: IB test timed out\n");
311 r = -ETIMEDOUT;
312 goto err1;
313 } else if (r < 0) {
314 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
315 goto err1;
316 }
317 tmp = le32_to_cpu(adev->wb.wb[index]);
318 if (tmp == 0xDEADBEEF) {
319 DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
320 r = 0;
321 } else {
322 DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
323 r = -EINVAL;
324 }
325
326err1:
327 amdgpu_ib_free(adev, &ib, NULL);
328 fence_put(f);
329err0:
330 amdgpu_wb_free(adev, index);
331 return r;
332}
333
334/**
335 * cik_dma_vm_copy_pte - update PTEs by copying them from the GART
336 *
337 * @ib: indirect buffer to fill with commands
338 * @pe: addr of the page entry
339 * @src: src addr to copy from
340 * @count: number of page entries to update
341 *
342 * Update PTEs by copying them from the GART using DMA (SI).
343 */
344static void si_dma_vm_copy_pte(struct amdgpu_ib *ib,
345 uint64_t pe, uint64_t src,
346 unsigned count)
347{
348 unsigned bytes = count * 8;
349
350 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_COPY,
351 1, 0, 0, bytes);
352 ib->ptr[ib->length_dw++] = lower_32_bits(pe);
353 ib->ptr[ib->length_dw++] = lower_32_bits(src);
354 ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
355 ib->ptr[ib->length_dw++] = upper_32_bits(src) & 0xff;
356}
357
358/**
359 * si_dma_vm_write_pte - update PTEs by writing them manually
360 *
361 * @ib: indirect buffer to fill with commands
362 * @pe: addr of the page entry
363 * @value: dst addr to write into pe
364 * @count: number of page entries to update
365 * @incr: increase next addr by incr bytes
366 *
367 * Update PTEs by writing them manually using DMA (SI).
368 */
369static void si_dma_vm_write_pte(struct amdgpu_ib *ib, uint64_t pe,
370 uint64_t value, unsigned count,
371 uint32_t incr)
372{
373 unsigned ndw = count * 2;
374
375 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 0, ndw);
376 ib->ptr[ib->length_dw++] = lower_32_bits(pe);
377 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
378 for (; ndw > 0; ndw -= 2) {
379 ib->ptr[ib->length_dw++] = lower_32_bits(value);
380 ib->ptr[ib->length_dw++] = upper_32_bits(value);
381 value += incr;
382 }
383}
384
385/**
386 * si_dma_vm_set_pte_pde - update the page tables using sDMA
387 *
388 * @ib: indirect buffer to fill with commands
389 * @pe: addr of the page entry
390 * @addr: dst addr to write into pe
391 * @count: number of page entries to update
392 * @incr: increase next addr by incr bytes
393 * @flags: access flags
394 *
395 * Update the page tables using sDMA (CIK).
396 */
397static void si_dma_vm_set_pte_pde(struct amdgpu_ib *ib,
398 uint64_t pe,
399 uint64_t addr, unsigned count,
400 uint32_t incr, uint32_t flags)
401{
402 uint64_t value;
403 unsigned ndw;
404
405 while (count) {
406 ndw = count * 2;
407 if (ndw > 0xFFFFE)
408 ndw = 0xFFFFE;
409
410 if (flags & AMDGPU_PTE_VALID)
411 value = addr;
412 else
413 value = 0;
414
415 /* for physically contiguous pages (vram) */
416 ib->ptr[ib->length_dw++] = DMA_PTE_PDE_PACKET(ndw);
417 ib->ptr[ib->length_dw++] = pe; /* dst addr */
418 ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
419 ib->ptr[ib->length_dw++] = flags; /* mask */
420 ib->ptr[ib->length_dw++] = 0;
421 ib->ptr[ib->length_dw++] = value; /* value */
422 ib->ptr[ib->length_dw++] = upper_32_bits(value);
423 ib->ptr[ib->length_dw++] = incr; /* increment size */
424 ib->ptr[ib->length_dw++] = 0;
425 pe += ndw * 4;
426 addr += (ndw / 2) * incr;
427 count -= ndw / 2;
428 }
429}
430
431/**
432 * si_dma_pad_ib - pad the IB to the required number of dw
433 *
434 * @ib: indirect buffer to fill with padding
435 *
436 */
437static void si_dma_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib)
438{
439 while (ib->length_dw & 0x7)
440 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0);
441}
442
443/**
444 * cik_sdma_ring_emit_pipeline_sync - sync the pipeline
445 *
446 * @ring: amdgpu_ring pointer
447 *
448 * Make sure all previous operations are completed (CIK).
449 */
450static void si_dma_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
451{
452 uint32_t seq = ring->fence_drv.sync_seq;
453 uint64_t addr = ring->fence_drv.gpu_addr;
454
455 /* wait for idle */
456 amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_POLL_REG_MEM, 0, 0, 0, 0) |
457 (1 << 27)); /* Poll memory */
458 amdgpu_ring_write(ring, lower_32_bits(addr));
459 amdgpu_ring_write(ring, (0xff << 16) | upper_32_bits(addr)); /* retry, addr_hi */
460 amdgpu_ring_write(ring, 0xffffffff); /* mask */
461 amdgpu_ring_write(ring, seq); /* value */
462 amdgpu_ring_write(ring, (3 << 28) | 0x20); /* func(equal) | poll interval */
463}
464
465/**
466 * si_dma_ring_emit_vm_flush - cik vm flush using sDMA
467 *
468 * @ring: amdgpu_ring pointer
469 * @vm: amdgpu_vm pointer
470 *
471 * Update the page table base and flush the VM TLB
472 * using sDMA (VI).
473 */
474static void si_dma_ring_emit_vm_flush(struct amdgpu_ring *ring,
475 unsigned vm_id, uint64_t pd_addr)
476{
477 amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0));
478 if (vm_id < 8)
479 amdgpu_ring_write(ring, (0xf << 16) | (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + vm_id));
480 else
481 amdgpu_ring_write(ring, (0xf << 16) | (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + (vm_id - 8)));
482 amdgpu_ring_write(ring, pd_addr >> 12);
483
484 /* bits 0-7 are the VM contexts0-7 */
485 amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0));
486 amdgpu_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST));
487 amdgpu_ring_write(ring, 1 << vm_id);
488
489 /* wait for invalidate to complete */
490 amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_POLL_REG_MEM, 0, 0, 0, 0));
491 amdgpu_ring_write(ring, VM_INVALIDATE_REQUEST);
492 amdgpu_ring_write(ring, 0xff << 16); /* retry */
493 amdgpu_ring_write(ring, 1 << vm_id); /* mask */
494 amdgpu_ring_write(ring, 0); /* value */
495 amdgpu_ring_write(ring, (0 << 28) | 0x20); /* func(always) | poll interval */
496}
497
498static unsigned si_dma_ring_get_emit_ib_size(struct amdgpu_ring *ring)
499{
500 return
501 7 + 3; /* si_dma_ring_emit_ib */
502}
503
504static unsigned si_dma_ring_get_dma_frame_size(struct amdgpu_ring *ring)
505{
506 return
507 3 + /* si_dma_ring_emit_hdp_flush */
508 3 + /* si_dma_ring_emit_hdp_invalidate */
509 6 + /* si_dma_ring_emit_pipeline_sync */
510 12 + /* si_dma_ring_emit_vm_flush */
511 9 + 9 + 9; /* si_dma_ring_emit_fence x3 for user fence, vm fence */
512}
513
514static int si_dma_early_init(void *handle)
515{
516 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
517
518 adev->sdma.num_instances = 2;
519
520 si_dma_set_ring_funcs(adev);
521 si_dma_set_buffer_funcs(adev);
522 si_dma_set_vm_pte_funcs(adev);
523 si_dma_set_irq_funcs(adev);
524
525 return 0;
526}
527
528static int si_dma_sw_init(void *handle)
529{
530 struct amdgpu_ring *ring;
531 int r, i;
532 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
533
534 /* DMA0 trap event */
535 r = amdgpu_irq_add_id(adev, 224, &adev->sdma.trap_irq);
536 if (r)
537 return r;
538
539 /* DMA1 trap event */
540 r = amdgpu_irq_add_id(adev, 244, &adev->sdma.trap_irq_1);
541 if (r)
542 return r;
543
544 for (i = 0; i < adev->sdma.num_instances; i++) {
545 ring = &adev->sdma.instance[i].ring;
546 ring->ring_obj = NULL;
547 ring->use_doorbell = false;
548 sprintf(ring->name, "sdma%d", i);
549 r = amdgpu_ring_init(adev, ring, 1024,
550 DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0), 0xf,
551 &adev->sdma.trap_irq,
552 (i == 0) ?
553 AMDGPU_SDMA_IRQ_TRAP0 : AMDGPU_SDMA_IRQ_TRAP1,
554 AMDGPU_RING_TYPE_SDMA);
555 if (r)
556 return r;
557 }
558
559 return r;
560}
561
562static int si_dma_sw_fini(void *handle)
563{
564 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
565 int i;
566
567 for (i = 0; i < adev->sdma.num_instances; i++)
568 amdgpu_ring_fini(&adev->sdma.instance[i].ring);
569
570 return 0;
571}
572
573static int si_dma_hw_init(void *handle)
574{
575 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
576
577 return si_dma_start(adev);
578}
579
580static int si_dma_hw_fini(void *handle)
581{
582 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
583
584 si_dma_stop(adev);
585
586 return 0;
587}
588
589static int si_dma_suspend(void *handle)
590{
591 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
592
593 return si_dma_hw_fini(adev);
594}
595
596static int si_dma_resume(void *handle)
597{
598 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
599
600 return si_dma_hw_init(adev);
601}
602
603static bool si_dma_is_idle(void *handle)
604{
605 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
606 u32 tmp = RREG32(SRBM_STATUS2);
607
608 if (tmp & (DMA_BUSY_MASK | DMA1_BUSY_MASK))
609 return false;
610
611 return true;
612}
613
614static int si_dma_wait_for_idle(void *handle)
615{
616 unsigned i;
617 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
618
619 for (i = 0; i < adev->usec_timeout; i++) {
620 if (si_dma_is_idle(handle))
621 return 0;
622 udelay(1);
623 }
624 return -ETIMEDOUT;
625}
626
627static int si_dma_soft_reset(void *handle)
628{
629 DRM_INFO("si_dma_soft_reset --- not implemented !!!!!!!\n");
630 return 0;
631}
632
633static int si_dma_set_trap_irq_state(struct amdgpu_device *adev,
634 struct amdgpu_irq_src *src,
635 unsigned type,
636 enum amdgpu_interrupt_state state)
637{
638 u32 sdma_cntl;
639
640 switch (type) {
641 case AMDGPU_SDMA_IRQ_TRAP0:
642 switch (state) {
643 case AMDGPU_IRQ_STATE_DISABLE:
644 sdma_cntl = RREG32(DMA_CNTL + DMA0_REGISTER_OFFSET);
645 sdma_cntl &= ~TRAP_ENABLE;
646 WREG32(DMA_CNTL + DMA0_REGISTER_OFFSET, sdma_cntl);
647 break;
648 case AMDGPU_IRQ_STATE_ENABLE:
649 sdma_cntl = RREG32(DMA_CNTL + DMA0_REGISTER_OFFSET);
650 sdma_cntl |= TRAP_ENABLE;
651 WREG32(DMA_CNTL + DMA0_REGISTER_OFFSET, sdma_cntl);
652 break;
653 default:
654 break;
655 }
656 break;
657 case AMDGPU_SDMA_IRQ_TRAP1:
658 switch (state) {
659 case AMDGPU_IRQ_STATE_DISABLE:
660 sdma_cntl = RREG32(DMA_CNTL + DMA1_REGISTER_OFFSET);
661 sdma_cntl &= ~TRAP_ENABLE;
662 WREG32(DMA_CNTL + DMA1_REGISTER_OFFSET, sdma_cntl);
663 break;
664 case AMDGPU_IRQ_STATE_ENABLE:
665 sdma_cntl = RREG32(DMA_CNTL + DMA1_REGISTER_OFFSET);
666 sdma_cntl |= TRAP_ENABLE;
667 WREG32(DMA_CNTL + DMA1_REGISTER_OFFSET, sdma_cntl);
668 break;
669 default:
670 break;
671 }
672 break;
673 default:
674 break;
675 }
676 return 0;
677}
678
679static int si_dma_process_trap_irq(struct amdgpu_device *adev,
680 struct amdgpu_irq_src *source,
681 struct amdgpu_iv_entry *entry)
682{
683 amdgpu_fence_process(&adev->sdma.instance[0].ring);
684
685 return 0;
686}
687
688static int si_dma_process_trap_irq_1(struct amdgpu_device *adev,
689 struct amdgpu_irq_src *source,
690 struct amdgpu_iv_entry *entry)
691{
692 amdgpu_fence_process(&adev->sdma.instance[1].ring);
693
694 return 0;
695}
696
697static int si_dma_process_illegal_inst_irq(struct amdgpu_device *adev,
698 struct amdgpu_irq_src *source,
699 struct amdgpu_iv_entry *entry)
700{
701 DRM_ERROR("Illegal instruction in SDMA command stream\n");
702 schedule_work(&adev->reset_work);
703 return 0;
704}
705
706static int si_dma_set_clockgating_state(void *handle,
707 enum amd_clockgating_state state)
708{
709 u32 orig, data, offset;
710 int i;
711 bool enable;
712 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
713
714 enable = (state == AMD_CG_STATE_GATE) ? true : false;
715
716 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_SDMA_MGCG)) {
717 for (i = 0; i < adev->sdma.num_instances; i++) {
718 if (i == 0)
719 offset = DMA0_REGISTER_OFFSET;
720 else
721 offset = DMA1_REGISTER_OFFSET;
722 orig = data = RREG32(DMA_POWER_CNTL + offset);
723 data &= ~MEM_POWER_OVERRIDE;
724 if (data != orig)
725 WREG32(DMA_POWER_CNTL + offset, data);
726 WREG32(DMA_CLK_CTRL + offset, 0x00000100);
727 }
728 } else {
729 for (i = 0; i < adev->sdma.num_instances; i++) {
730 if (i == 0)
731 offset = DMA0_REGISTER_OFFSET;
732 else
733 offset = DMA1_REGISTER_OFFSET;
734 orig = data = RREG32(DMA_POWER_CNTL + offset);
735 data |= MEM_POWER_OVERRIDE;
736 if (data != orig)
737 WREG32(DMA_POWER_CNTL + offset, data);
738
739 orig = data = RREG32(DMA_CLK_CTRL + offset);
740 data = 0xff000000;
741 if (data != orig)
742 WREG32(DMA_CLK_CTRL + offset, data);
743 }
744 }
745
746 return 0;
747}
748
749static int si_dma_set_powergating_state(void *handle,
750 enum amd_powergating_state state)
751{
752 u32 tmp;
753
754 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
755
756 WREG32(DMA_PGFSM_WRITE, 0x00002000);
757 WREG32(DMA_PGFSM_CONFIG, 0x100010ff);
758
759 for (tmp = 0; tmp < 5; tmp++)
760 WREG32(DMA_PGFSM_WRITE, 0);
761
762 return 0;
763}
764
765const struct amd_ip_funcs si_dma_ip_funcs = {
766 .name = "si_dma",
767 .early_init = si_dma_early_init,
768 .late_init = NULL,
769 .sw_init = si_dma_sw_init,
770 .sw_fini = si_dma_sw_fini,
771 .hw_init = si_dma_hw_init,
772 .hw_fini = si_dma_hw_fini,
773 .suspend = si_dma_suspend,
774 .resume = si_dma_resume,
775 .is_idle = si_dma_is_idle,
776 .wait_for_idle = si_dma_wait_for_idle,
777 .soft_reset = si_dma_soft_reset,
778 .set_clockgating_state = si_dma_set_clockgating_state,
779 .set_powergating_state = si_dma_set_powergating_state,
780};
781
782static const struct amdgpu_ring_funcs si_dma_ring_funcs = {
783 .get_rptr = si_dma_ring_get_rptr,
784 .get_wptr = si_dma_ring_get_wptr,
785 .set_wptr = si_dma_ring_set_wptr,
786 .parse_cs = NULL,
787 .emit_ib = si_dma_ring_emit_ib,
788 .emit_fence = si_dma_ring_emit_fence,
789 .emit_pipeline_sync = si_dma_ring_emit_pipeline_sync,
790 .emit_vm_flush = si_dma_ring_emit_vm_flush,
791 .emit_hdp_flush = si_dma_ring_emit_hdp_flush,
792 .emit_hdp_invalidate = si_dma_ring_emit_hdp_invalidate,
793 .test_ring = si_dma_ring_test_ring,
794 .test_ib = si_dma_ring_test_ib,
795 .insert_nop = amdgpu_ring_insert_nop,
796 .pad_ib = si_dma_ring_pad_ib,
797 .get_emit_ib_size = si_dma_ring_get_emit_ib_size,
798 .get_dma_frame_size = si_dma_ring_get_dma_frame_size,
799};
800
801static void si_dma_set_ring_funcs(struct amdgpu_device *adev)
802{
803 int i;
804
805 for (i = 0; i < adev->sdma.num_instances; i++)
806 adev->sdma.instance[i].ring.funcs = &si_dma_ring_funcs;
807}
808
809static const struct amdgpu_irq_src_funcs si_dma_trap_irq_funcs = {
810 .set = si_dma_set_trap_irq_state,
811 .process = si_dma_process_trap_irq,
812};
813
814static const struct amdgpu_irq_src_funcs si_dma_trap_irq_funcs_1 = {
815 .set = si_dma_set_trap_irq_state,
816 .process = si_dma_process_trap_irq_1,
817};
818
819static const struct amdgpu_irq_src_funcs si_dma_illegal_inst_irq_funcs = {
820 .process = si_dma_process_illegal_inst_irq,
821};
822
823static void si_dma_set_irq_funcs(struct amdgpu_device *adev)
824{
825 adev->sdma.trap_irq.num_types = AMDGPU_SDMA_IRQ_LAST;
826 adev->sdma.trap_irq.funcs = &si_dma_trap_irq_funcs;
827 adev->sdma.trap_irq_1.funcs = &si_dma_trap_irq_funcs_1;
828 adev->sdma.illegal_inst_irq.funcs = &si_dma_illegal_inst_irq_funcs;
829}
830
831/**
832 * si_dma_emit_copy_buffer - copy buffer using the sDMA engine
833 *
834 * @ring: amdgpu_ring structure holding ring information
835 * @src_offset: src GPU address
836 * @dst_offset: dst GPU address
837 * @byte_count: number of bytes to xfer
838 *
839 * Copy GPU buffers using the DMA engine (VI).
840 * Used by the amdgpu ttm implementation to move pages if
841 * registered as the asic copy callback.
842 */
843static void si_dma_emit_copy_buffer(struct amdgpu_ib *ib,
844 uint64_t src_offset,
845 uint64_t dst_offset,
846 uint32_t byte_count)
847{
848 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_COPY,
849 1, 0, 0, byte_count);
850 ib->ptr[ib->length_dw++] = lower_32_bits(dst_offset);
851 ib->ptr[ib->length_dw++] = lower_32_bits(src_offset);
852 ib->ptr[ib->length_dw++] = upper_32_bits(dst_offset) & 0xff;
853 ib->ptr[ib->length_dw++] = upper_32_bits(src_offset) & 0xff;
854}
855
856/**
857 * si_dma_emit_fill_buffer - fill buffer using the sDMA engine
858 *
859 * @ring: amdgpu_ring structure holding ring information
860 * @src_data: value to write to buffer
861 * @dst_offset: dst GPU address
862 * @byte_count: number of bytes to xfer
863 *
864 * Fill GPU buffers using the DMA engine (VI).
865 */
866static void si_dma_emit_fill_buffer(struct amdgpu_ib *ib,
867 uint32_t src_data,
868 uint64_t dst_offset,
869 uint32_t byte_count)
870{
871 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_CONSTANT_FILL,
872 0, 0, 0, byte_count / 4);
873 ib->ptr[ib->length_dw++] = lower_32_bits(dst_offset);
874 ib->ptr[ib->length_dw++] = src_data;
875 ib->ptr[ib->length_dw++] = upper_32_bits(dst_offset) << 16;
876}
877
878
879static const struct amdgpu_buffer_funcs si_dma_buffer_funcs = {
880 .copy_max_bytes = 0xffff8,
881 .copy_num_dw = 5,
882 .emit_copy_buffer = si_dma_emit_copy_buffer,
883
884 .fill_max_bytes = 0xffff8,
885 .fill_num_dw = 4,
886 .emit_fill_buffer = si_dma_emit_fill_buffer,
887};
888
889static void si_dma_set_buffer_funcs(struct amdgpu_device *adev)
890{
891 if (adev->mman.buffer_funcs == NULL) {
892 adev->mman.buffer_funcs = &si_dma_buffer_funcs;
893 adev->mman.buffer_funcs_ring = &adev->sdma.instance[0].ring;
894 }
895}
896
897static const struct amdgpu_vm_pte_funcs si_dma_vm_pte_funcs = {
898 .copy_pte = si_dma_vm_copy_pte,
899 .write_pte = si_dma_vm_write_pte,
900 .set_pte_pde = si_dma_vm_set_pte_pde,
901};
902
903static void si_dma_set_vm_pte_funcs(struct amdgpu_device *adev)
904{
905 unsigned i;
906
907 if (adev->vm_manager.vm_pte_funcs == NULL) {
908 adev->vm_manager.vm_pte_funcs = &si_dma_vm_pte_funcs;
909 for (i = 0; i < adev->sdma.num_instances; i++)
910 adev->vm_manager.vm_pte_rings[i] =
911 &adev->sdma.instance[i].ring;
912
913 adev->vm_manager.vm_pte_num_rings = adev->sdma.num_instances;
914 }
915}
diff --git a/drivers/gpu/drm/amd/amdgpu/si_dma.h b/drivers/gpu/drm/amd/amdgpu/si_dma.h
new file mode 100644
index 000000000000..3a3e0c78a54b
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/si_dma.h
@@ -0,0 +1,29 @@
1/*
2 * Copyright 2015 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23
24#ifndef __SI_DMA_H__
25#define __SI_DMA_H__
26
27extern const struct amd_ip_funcs si_dma_ip_funcs;
28
29#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
new file mode 100644
index 000000000000..8bd08925b370
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c
@@ -0,0 +1,8006 @@
1/*
2 * Copyright 2013 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23
24#include "drmP.h"
25#include "amdgpu.h"
26#include "amdgpu_pm.h"
27#include "amdgpu_dpm.h"
28#include "amdgpu_atombios.h"
29#include "si/sid.h"
30#include "r600_dpm.h"
31#include "si_dpm.h"
32#include "atom.h"
33#include "../include/pptable.h"
34#include <linux/math64.h>
35#include <linux/seq_file.h>
36#include <linux/firmware.h>
37
38#define MC_CG_ARB_FREQ_F0 0x0a
39#define MC_CG_ARB_FREQ_F1 0x0b
40#define MC_CG_ARB_FREQ_F2 0x0c
41#define MC_CG_ARB_FREQ_F3 0x0d
42
43#define SMC_RAM_END 0x20000
44
45#define SCLK_MIN_DEEPSLEEP_FREQ 1350
46
47
48/* sizeof(ATOM_PPLIB_EXTENDEDHEADER) */
49#define SIZE_OF_ATOM_PPLIB_EXTENDEDHEADER_V2 12
50#define SIZE_OF_ATOM_PPLIB_EXTENDEDHEADER_V3 14
51#define SIZE_OF_ATOM_PPLIB_EXTENDEDHEADER_V4 16
52#define SIZE_OF_ATOM_PPLIB_EXTENDEDHEADER_V5 18
53#define SIZE_OF_ATOM_PPLIB_EXTENDEDHEADER_V6 20
54#define SIZE_OF_ATOM_PPLIB_EXTENDEDHEADER_V7 22
55
56#define BIOS_SCRATCH_4 0x5cd
57
58MODULE_FIRMWARE("radeon/tahiti_smc.bin");
59MODULE_FIRMWARE("radeon/tahiti_k_smc.bin");
60MODULE_FIRMWARE("radeon/pitcairn_smc.bin");
61MODULE_FIRMWARE("radeon/pitcairn_k_smc.bin");
62MODULE_FIRMWARE("radeon/verde_smc.bin");
63MODULE_FIRMWARE("radeon/verde_k_smc.bin");
64MODULE_FIRMWARE("radeon/oland_smc.bin");
65MODULE_FIRMWARE("radeon/oland_k_smc.bin");
66MODULE_FIRMWARE("radeon/hainan_smc.bin");
67MODULE_FIRMWARE("radeon/hainan_k_smc.bin");
68
69union power_info {
70 struct _ATOM_POWERPLAY_INFO info;
71 struct _ATOM_POWERPLAY_INFO_V2 info_2;
72 struct _ATOM_POWERPLAY_INFO_V3 info_3;
73 struct _ATOM_PPLIB_POWERPLAYTABLE pplib;
74 struct _ATOM_PPLIB_POWERPLAYTABLE2 pplib2;
75 struct _ATOM_PPLIB_POWERPLAYTABLE3 pplib3;
76 struct _ATOM_PPLIB_POWERPLAYTABLE4 pplib4;
77 struct _ATOM_PPLIB_POWERPLAYTABLE5 pplib5;
78};
79
80union fan_info {
81 struct _ATOM_PPLIB_FANTABLE fan;
82 struct _ATOM_PPLIB_FANTABLE2 fan2;
83 struct _ATOM_PPLIB_FANTABLE3 fan3;
84};
85
86union pplib_clock_info {
87 struct _ATOM_PPLIB_R600_CLOCK_INFO r600;
88 struct _ATOM_PPLIB_RS780_CLOCK_INFO rs780;
89 struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO evergreen;
90 struct _ATOM_PPLIB_SUMO_CLOCK_INFO sumo;
91 struct _ATOM_PPLIB_SI_CLOCK_INFO si;
92};
93
94static const u32 r600_utc[R600_PM_NUMBER_OF_TC] =
95{
96 R600_UTC_DFLT_00,
97 R600_UTC_DFLT_01,
98 R600_UTC_DFLT_02,
99 R600_UTC_DFLT_03,
100 R600_UTC_DFLT_04,
101 R600_UTC_DFLT_05,
102 R600_UTC_DFLT_06,
103 R600_UTC_DFLT_07,
104 R600_UTC_DFLT_08,
105 R600_UTC_DFLT_09,
106 R600_UTC_DFLT_10,
107 R600_UTC_DFLT_11,
108 R600_UTC_DFLT_12,
109 R600_UTC_DFLT_13,
110 R600_UTC_DFLT_14,
111};
112
113static const u32 r600_dtc[R600_PM_NUMBER_OF_TC] =
114{
115 R600_DTC_DFLT_00,
116 R600_DTC_DFLT_01,
117 R600_DTC_DFLT_02,
118 R600_DTC_DFLT_03,
119 R600_DTC_DFLT_04,
120 R600_DTC_DFLT_05,
121 R600_DTC_DFLT_06,
122 R600_DTC_DFLT_07,
123 R600_DTC_DFLT_08,
124 R600_DTC_DFLT_09,
125 R600_DTC_DFLT_10,
126 R600_DTC_DFLT_11,
127 R600_DTC_DFLT_12,
128 R600_DTC_DFLT_13,
129 R600_DTC_DFLT_14,
130};
131
132static const struct si_cac_config_reg cac_weights_tahiti[] =
133{
134 { 0x0, 0x0000ffff, 0, 0xc, SISLANDS_CACCONFIG_CGIND },
135 { 0x0, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
136 { 0x1, 0x0000ffff, 0, 0x101, SISLANDS_CACCONFIG_CGIND },
137 { 0x1, 0xffff0000, 16, 0xc, SISLANDS_CACCONFIG_CGIND },
138 { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
139 { 0x3, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
140 { 0x3, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
141 { 0x4, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
142 { 0x4, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
143 { 0x5, 0x0000ffff, 0, 0x8fc, SISLANDS_CACCONFIG_CGIND },
144 { 0x5, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
145 { 0x6, 0x0000ffff, 0, 0x95, SISLANDS_CACCONFIG_CGIND },
146 { 0x6, 0xffff0000, 16, 0x34e, SISLANDS_CACCONFIG_CGIND },
147 { 0x18f, 0x0000ffff, 0, 0x1a1, SISLANDS_CACCONFIG_CGIND },
148 { 0x7, 0x0000ffff, 0, 0xda, SISLANDS_CACCONFIG_CGIND },
149 { 0x7, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
150 { 0x8, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
151 { 0x8, 0xffff0000, 16, 0x46, SISLANDS_CACCONFIG_CGIND },
152 { 0x9, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
153 { 0xa, 0x0000ffff, 0, 0x208, SISLANDS_CACCONFIG_CGIND },
154 { 0xb, 0x0000ffff, 0, 0xe7, SISLANDS_CACCONFIG_CGIND },
155 { 0xb, 0xffff0000, 16, 0x948, SISLANDS_CACCONFIG_CGIND },
156 { 0xc, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
157 { 0xd, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
158 { 0xd, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
159 { 0xe, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
160 { 0xf, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
161 { 0xf, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
162 { 0x10, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
163 { 0x10, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
164 { 0x11, 0x0000ffff, 0, 0x167, SISLANDS_CACCONFIG_CGIND },
165 { 0x11, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
166 { 0x12, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
167 { 0x13, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
168 { 0x13, 0xffff0000, 16, 0x35, SISLANDS_CACCONFIG_CGIND },
169 { 0x14, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
170 { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
171 { 0x15, 0xffff0000, 16, 0x2, SISLANDS_CACCONFIG_CGIND },
172 { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
173 { 0x16, 0x0000ffff, 0, 0x31, SISLANDS_CACCONFIG_CGIND },
174 { 0x16, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
175 { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
176 { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
177 { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
178 { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
179 { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
180 { 0x1a, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
181 { 0x1a, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
182 { 0x1b, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
183 { 0x1b, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
184 { 0x1c, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
185 { 0x1c, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
186 { 0x1d, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
187 { 0x1d, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
188 { 0x1e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
189 { 0x1e, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
190 { 0x1f, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
191 { 0x1f, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
192 { 0x20, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
193 { 0x6d, 0x0000ffff, 0, 0x18e, SISLANDS_CACCONFIG_CGIND },
194 { 0xFFFFFFFF }
195};
196
197static const struct si_cac_config_reg lcac_tahiti[] =
198{
199 { 0x143, 0x0001fffe, 1, 0x3, SISLANDS_CACCONFIG_CGIND },
200 { 0x143, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
201 { 0x146, 0x0001fffe, 1, 0x3, SISLANDS_CACCONFIG_CGIND },
202 { 0x146, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
203 { 0x149, 0x0001fffe, 1, 0x3, SISLANDS_CACCONFIG_CGIND },
204 { 0x149, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
205 { 0x14c, 0x0001fffe, 1, 0x3, SISLANDS_CACCONFIG_CGIND },
206 { 0x14c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
207 { 0x98, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
208 { 0x98, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
209 { 0x9b, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
210 { 0x9b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
211 { 0x9e, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
212 { 0x9e, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
213 { 0x101, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
214 { 0x101, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
215 { 0x104, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
216 { 0x104, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
217 { 0x107, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
218 { 0x107, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
219 { 0x10a, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
220 { 0x10a, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
221 { 0x10d, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
222 { 0x10d, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
223 { 0x8c, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND },
224 { 0x8c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
225 { 0x8f, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND },
226 { 0x8f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
227 { 0x92, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND },
228 { 0x92, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
229 { 0x95, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND },
230 { 0x95, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
231 { 0x14f, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND },
232 { 0x14f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
233 { 0x152, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND },
234 { 0x152, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
235 { 0x155, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND },
236 { 0x155, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
237 { 0x158, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND },
238 { 0x158, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
239 { 0x110, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND },
240 { 0x110, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
241 { 0x113, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND },
242 { 0x113, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
243 { 0x116, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND },
244 { 0x116, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
245 { 0x119, 0x0001fffe, 1, 0x8, SISLANDS_CACCONFIG_CGIND },
246 { 0x119, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
247 { 0x11c, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
248 { 0x11c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
249 { 0x11f, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
250 { 0x11f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
251 { 0x122, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
252 { 0x122, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
253 { 0x125, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
254 { 0x125, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
255 { 0x128, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
256 { 0x128, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
257 { 0x12b, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
258 { 0x12b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
259 { 0x15b, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND },
260 { 0x15b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
261 { 0x15e, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND },
262 { 0x15e, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
263 { 0x161, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND },
264 { 0x161, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
265 { 0x164, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND },
266 { 0x164, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
267 { 0x167, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND },
268 { 0x167, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
269 { 0x16a, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND },
270 { 0x16a, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
271 { 0x16d, 0x0001fffe, 1, 0x6, SISLANDS_CACCONFIG_CGIND },
272 { 0x16d, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
273 { 0x170, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
274 { 0x170, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
275 { 0x173, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
276 { 0x173, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
277 { 0x176, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
278 { 0x176, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
279 { 0x179, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
280 { 0x179, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
281 { 0x17c, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
282 { 0x17c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
283 { 0x17f, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
284 { 0x17f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
285 { 0xFFFFFFFF }
286
287};
288
289static const struct si_cac_config_reg cac_override_tahiti[] =
290{
291 { 0xFFFFFFFF }
292};
293
294static const struct si_powertune_data powertune_data_tahiti =
295{
296 ((1 << 16) | 27027),
297 6,
298 0,
299 4,
300 95,
301 {
302 0UL,
303 0UL,
304 4521550UL,
305 309631529UL,
306 -1270850L,
307 4513710L,
308 40
309 },
310 595000000UL,
311 12,
312 {
313 0,
314 0,
315 0,
316 0,
317 0,
318 0,
319 0,
320 0
321 },
322 true
323};
324
325static const struct si_dte_data dte_data_tahiti =
326{
327 { 1159409, 0, 0, 0, 0 },
328 { 777, 0, 0, 0, 0 },
329 2,
330 54000,
331 127000,
332 25,
333 2,
334 10,
335 13,
336 { 27, 31, 35, 39, 43, 47, 54, 61, 67, 74, 81, 88, 95, 0, 0, 0 },
337 { 240888759, 221057860, 235370597, 162287531, 158510299, 131423027, 116673180, 103067515, 87941937, 76209048, 68209175, 64090048, 58301890, 0, 0, 0 },
338 { 12024, 11189, 11451, 8411, 7939, 6666, 5681, 4905, 4241, 3720, 3354, 3122, 2890, 0, 0, 0 },
339 85,
340 false
341};
342
343#if 0
344static const struct si_dte_data dte_data_tahiti_le =
345{
346 { 0x1E8480, 0x7A1200, 0x2160EC0, 0x3938700, 0 },
347 { 0x7D, 0x7D, 0x4E4, 0xB00, 0 },
348 0x5,
349 0xAFC8,
350 0x64,
351 0x32,
352 1,
353 0,
354 0x10,
355 { 0x78, 0x7C, 0x82, 0x88, 0x8E, 0x94, 0x9A, 0xA0, 0xA6, 0xAC, 0xB0, 0xB4, 0xB8, 0xBC, 0xC0, 0xC4 },
356 { 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700 },
357 { 0x2AF8, 0x2AF8, 0x29BB, 0x27F9, 0x2637, 0x2475, 0x22B3, 0x20F1, 0x1F2F, 0x1D6D, 0x1734, 0x1414, 0x10F4, 0xDD4, 0xAB4, 0x794 },
358 85,
359 true
360};
361#endif
362
363static const struct si_dte_data dte_data_tahiti_pro =
364{
365 { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 },
366 { 0x0, 0x0, 0x0, 0x0, 0x0 },
367 5,
368 45000,
369 100,
370 0xA,
371 1,
372 0,
373 0x10,
374 { 0x96, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
375 { 0x895440, 0x3D0900, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680 },
376 { 0x7D0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },
377 90,
378 true
379};
380
381static const struct si_dte_data dte_data_new_zealand =
382{
383 { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0 },
384 { 0x29B, 0x3E9, 0x537, 0x7D2, 0 },
385 0x5,
386 0xAFC8,
387 0x69,
388 0x32,
389 1,
390 0,
391 0x10,
392 { 0x82, 0xA0, 0xB4, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE },
393 { 0x895440, 0x3D0900, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680 },
394 { 0xDAC, 0x1388, 0x685, 0x685, 0x685, 0x685, 0x685, 0x685, 0x685, 0x685, 0x685, 0x685, 0x685, 0x685, 0x685, 0x685 },
395 85,
396 true
397};
398
399static const struct si_dte_data dte_data_aruba_pro =
400{
401 { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 },
402 { 0x0, 0x0, 0x0, 0x0, 0x0 },
403 5,
404 45000,
405 100,
406 0xA,
407 1,
408 0,
409 0x10,
410 { 0x96, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
411 { 0x895440, 0x3D0900, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680 },
412 { 0x1000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },
413 90,
414 true
415};
416
417static const struct si_dte_data dte_data_malta =
418{
419 { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 },
420 { 0x0, 0x0, 0x0, 0x0, 0x0 },
421 5,
422 45000,
423 100,
424 0xA,
425 1,
426 0,
427 0x10,
428 { 0x96, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
429 { 0x895440, 0x3D0900, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680 },
430 { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },
431 90,
432 true
433};
434
435static const struct si_cac_config_reg cac_weights_pitcairn[] =
436{
437 { 0x0, 0x0000ffff, 0, 0x8a, SISLANDS_CACCONFIG_CGIND },
438 { 0x0, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
439 { 0x1, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
440 { 0x1, 0xffff0000, 16, 0x24d, SISLANDS_CACCONFIG_CGIND },
441 { 0x2, 0x0000ffff, 0, 0x19, SISLANDS_CACCONFIG_CGIND },
442 { 0x3, 0x0000ffff, 0, 0x118, SISLANDS_CACCONFIG_CGIND },
443 { 0x3, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
444 { 0x4, 0x0000ffff, 0, 0x76, SISLANDS_CACCONFIG_CGIND },
445 { 0x4, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
446 { 0x5, 0x0000ffff, 0, 0xc11, SISLANDS_CACCONFIG_CGIND },
447 { 0x5, 0xffff0000, 16, 0x7f3, SISLANDS_CACCONFIG_CGIND },
448 { 0x6, 0x0000ffff, 0, 0x403, SISLANDS_CACCONFIG_CGIND },
449 { 0x6, 0xffff0000, 16, 0x367, SISLANDS_CACCONFIG_CGIND },
450 { 0x18f, 0x0000ffff, 0, 0x4c9, SISLANDS_CACCONFIG_CGIND },
451 { 0x7, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
452 { 0x7, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
453 { 0x8, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
454 { 0x8, 0xffff0000, 16, 0x45d, SISLANDS_CACCONFIG_CGIND },
455 { 0x9, 0x0000ffff, 0, 0x36d, SISLANDS_CACCONFIG_CGIND },
456 { 0xa, 0x0000ffff, 0, 0x534, SISLANDS_CACCONFIG_CGIND },
457 { 0xb, 0x0000ffff, 0, 0x5da, SISLANDS_CACCONFIG_CGIND },
458 { 0xb, 0xffff0000, 16, 0x880, SISLANDS_CACCONFIG_CGIND },
459 { 0xc, 0x0000ffff, 0, 0x201, SISLANDS_CACCONFIG_CGIND },
460 { 0xd, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
461 { 0xd, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
462 { 0xe, 0x0000ffff, 0, 0x9f, SISLANDS_CACCONFIG_CGIND },
463 { 0xf, 0x0000ffff, 0, 0x1f, SISLANDS_CACCONFIG_CGIND },
464 { 0xf, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
465 { 0x10, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
466 { 0x10, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
467 { 0x11, 0x0000ffff, 0, 0x5de, SISLANDS_CACCONFIG_CGIND },
468 { 0x11, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
469 { 0x12, 0x0000ffff, 0, 0x7b, SISLANDS_CACCONFIG_CGIND },
470 { 0x13, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
471 { 0x13, 0xffff0000, 16, 0x13, SISLANDS_CACCONFIG_CGIND },
472 { 0x14, 0x0000ffff, 0, 0xf9, SISLANDS_CACCONFIG_CGIND },
473 { 0x15, 0x0000ffff, 0, 0x66, SISLANDS_CACCONFIG_CGIND },
474 { 0x15, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
475 { 0x4e, 0x0000ffff, 0, 0x13, SISLANDS_CACCONFIG_CGIND },
476 { 0x16, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
477 { 0x16, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
478 { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
479 { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
480 { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
481 { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
482 { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
483 { 0x1a, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
484 { 0x1a, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
485 { 0x1b, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
486 { 0x1b, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
487 { 0x1c, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
488 { 0x1c, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
489 { 0x1d, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
490 { 0x1d, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
491 { 0x1e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
492 { 0x1e, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
493 { 0x1f, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
494 { 0x1f, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
495 { 0x20, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
496 { 0x6d, 0x0000ffff, 0, 0x186, SISLANDS_CACCONFIG_CGIND },
497 { 0xFFFFFFFF }
498};
499
500static const struct si_cac_config_reg lcac_pitcairn[] =
501{
502 { 0x98, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
503 { 0x98, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
504 { 0x104, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
505 { 0x104, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
506 { 0x110, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND },
507 { 0x110, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
508 { 0x14f, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND },
509 { 0x14f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
510 { 0x8c, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND },
511 { 0x8c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
512 { 0x143, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
513 { 0x143, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
514 { 0x9b, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
515 { 0x9b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
516 { 0x107, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
517 { 0x107, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
518 { 0x113, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND },
519 { 0x113, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
520 { 0x152, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND },
521 { 0x152, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
522 { 0x8f, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND },
523 { 0x8f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
524 { 0x146, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
525 { 0x146, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
526 { 0x9e, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
527 { 0x9e, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
528 { 0x10a, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
529 { 0x10a, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
530 { 0x116, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND },
531 { 0x116, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
532 { 0x155, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND },
533 { 0x155, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
534 { 0x92, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND },
535 { 0x92, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
536 { 0x149, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
537 { 0x149, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
538 { 0x101, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
539 { 0x101, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
540 { 0x10d, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
541 { 0x10d, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
542 { 0x119, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND },
543 { 0x119, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
544 { 0x158, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND },
545 { 0x158, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
546 { 0x95, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND },
547 { 0x95, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
548 { 0x14c, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
549 { 0x14c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
550 { 0x11c, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
551 { 0x11c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
552 { 0x11f, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
553 { 0x11f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
554 { 0x122, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
555 { 0x122, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
556 { 0x125, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
557 { 0x125, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
558 { 0x128, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
559 { 0x128, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
560 { 0x12b, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
561 { 0x12b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
562 { 0x164, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND },
563 { 0x164, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
564 { 0x167, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND },
565 { 0x167, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
566 { 0x16a, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND },
567 { 0x16a, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
568 { 0x15e, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND },
569 { 0x15e, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
570 { 0x161, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND },
571 { 0x161, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
572 { 0x15b, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND },
573 { 0x15b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
574 { 0x16d, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND },
575 { 0x16d, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
576 { 0x170, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
577 { 0x170, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
578 { 0x173, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
579 { 0x173, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
580 { 0x176, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
581 { 0x176, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
582 { 0x179, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
583 { 0x179, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
584 { 0x17c, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
585 { 0x17c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
586 { 0x17f, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
587 { 0x17f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
588 { 0xFFFFFFFF }
589};
590
591static const struct si_cac_config_reg cac_override_pitcairn[] =
592{
593 { 0xFFFFFFFF }
594};
595
596static const struct si_powertune_data powertune_data_pitcairn =
597{
598 ((1 << 16) | 27027),
599 5,
600 0,
601 6,
602 100,
603 {
604 51600000UL,
605 1800000UL,
606 7194395UL,
607 309631529UL,
608 -1270850L,
609 4513710L,
610 100
611 },
612 117830498UL,
613 12,
614 {
615 0,
616 0,
617 0,
618 0,
619 0,
620 0,
621 0,
622 0
623 },
624 true
625};
626
627static const struct si_dte_data dte_data_pitcairn =
628{
629 { 0, 0, 0, 0, 0 },
630 { 0, 0, 0, 0, 0 },
631 0,
632 0,
633 0,
634 0,
635 0,
636 0,
637 0,
638 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
639 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
640 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
641 0,
642 false
643};
644
645static const struct si_dte_data dte_data_curacao_xt =
646{
647 { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 },
648 { 0x0, 0x0, 0x0, 0x0, 0x0 },
649 5,
650 45000,
651 100,
652 0xA,
653 1,
654 0,
655 0x10,
656 { 0x96, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
657 { 0x895440, 0x3D0900, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680 },
658 { 0x1D17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },
659 90,
660 true
661};
662
663static const struct si_dte_data dte_data_curacao_pro =
664{
665 { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 },
666 { 0x0, 0x0, 0x0, 0x0, 0x0 },
667 5,
668 45000,
669 100,
670 0xA,
671 1,
672 0,
673 0x10,
674 { 0x96, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
675 { 0x895440, 0x3D0900, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680 },
676 { 0x1D17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },
677 90,
678 true
679};
680
681static const struct si_dte_data dte_data_neptune_xt =
682{
683 { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 },
684 { 0x0, 0x0, 0x0, 0x0, 0x0 },
685 5,
686 45000,
687 100,
688 0xA,
689 1,
690 0,
691 0x10,
692 { 0x96, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
693 { 0x895440, 0x3D0900, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680 },
694 { 0x3A2F, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },
695 90,
696 true
697};
698
699static const struct si_cac_config_reg cac_weights_chelsea_pro[] =
700{
701 { 0x0, 0x0000ffff, 0, 0x82, SISLANDS_CACCONFIG_CGIND },
702 { 0x0, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND },
703 { 0x1, 0x0000ffff, 0, 0x153, SISLANDS_CACCONFIG_CGIND },
704 { 0x1, 0xffff0000, 16, 0x52, SISLANDS_CACCONFIG_CGIND },
705 { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
706 { 0x3, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND },
707 { 0x3, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND },
708 { 0x4, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND },
709 { 0x4, 0xffff0000, 16, 0xAC, SISLANDS_CACCONFIG_CGIND },
710 { 0x5, 0x0000ffff, 0, 0x118, SISLANDS_CACCONFIG_CGIND },
711 { 0x5, 0xffff0000, 16, 0xBE, SISLANDS_CACCONFIG_CGIND },
712 { 0x6, 0x0000ffff, 0, 0x110, SISLANDS_CACCONFIG_CGIND },
713 { 0x6, 0xffff0000, 16, 0x4CD, SISLANDS_CACCONFIG_CGIND },
714 { 0x18f, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND },
715 { 0x7, 0x0000ffff, 0, 0x37, SISLANDS_CACCONFIG_CGIND },
716 { 0x7, 0xffff0000, 16, 0x27, SISLANDS_CACCONFIG_CGIND },
717 { 0x8, 0x0000ffff, 0, 0xC3, SISLANDS_CACCONFIG_CGIND },
718 { 0x8, 0xffff0000, 16, 0x35, SISLANDS_CACCONFIG_CGIND },
719 { 0x9, 0x0000ffff, 0, 0x28, SISLANDS_CACCONFIG_CGIND },
720 { 0xa, 0x0000ffff, 0, 0x26C, SISLANDS_CACCONFIG_CGIND },
721 { 0xb, 0x0000ffff, 0, 0x3B2, SISLANDS_CACCONFIG_CGIND },
722 { 0xb, 0xffff0000, 16, 0x99D, SISLANDS_CACCONFIG_CGIND },
723 { 0xc, 0x0000ffff, 0, 0xA3F, SISLANDS_CACCONFIG_CGIND },
724 { 0xd, 0x0000ffff, 0, 0xA, SISLANDS_CACCONFIG_CGIND },
725 { 0xd, 0xffff0000, 16, 0xA, SISLANDS_CACCONFIG_CGIND },
726 { 0xe, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND },
727 { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND },
728 { 0xf, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
729 { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
730 { 0x10, 0xffff0000, 16, 0x1, SISLANDS_CACCONFIG_CGIND },
731 { 0x11, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND },
732 { 0x11, 0xffff0000, 16, 0x15, SISLANDS_CACCONFIG_CGIND },
733 { 0x12, 0x0000ffff, 0, 0x34, SISLANDS_CACCONFIG_CGIND },
734 { 0x13, 0x0000ffff, 0, 0x4, SISLANDS_CACCONFIG_CGIND },
735 { 0x13, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND },
736 { 0x14, 0x0000ffff, 0, 0x2BD, SISLANDS_CACCONFIG_CGIND },
737 { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
738 { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND },
739 { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
740 { 0x16, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND },
741 { 0x16, 0xffff0000, 16, 0x7A, SISLANDS_CACCONFIG_CGIND },
742 { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
743 { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
744 { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
745 { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
746 { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
747 { 0x1a, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
748 { 0x1a, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
749 { 0x1b, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
750 { 0x1b, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
751 { 0x1c, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
752 { 0x1c, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
753 { 0x1d, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
754 { 0x1d, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
755 { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
756 { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
757 { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
758 { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
759 { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
760 { 0x6d, 0x0000ffff, 0, 0x100, SISLANDS_CACCONFIG_CGIND },
761 { 0xFFFFFFFF }
762};
763
764static const struct si_cac_config_reg cac_weights_chelsea_xt[] =
765{
766 { 0x0, 0x0000ffff, 0, 0x82, SISLANDS_CACCONFIG_CGIND },
767 { 0x0, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND },
768 { 0x1, 0x0000ffff, 0, 0x153, SISLANDS_CACCONFIG_CGIND },
769 { 0x1, 0xffff0000, 16, 0x52, SISLANDS_CACCONFIG_CGIND },
770 { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
771 { 0x3, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND },
772 { 0x3, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND },
773 { 0x4, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND },
774 { 0x4, 0xffff0000, 16, 0xAC, SISLANDS_CACCONFIG_CGIND },
775 { 0x5, 0x0000ffff, 0, 0x118, SISLANDS_CACCONFIG_CGIND },
776 { 0x5, 0xffff0000, 16, 0xBE, SISLANDS_CACCONFIG_CGIND },
777 { 0x6, 0x0000ffff, 0, 0x110, SISLANDS_CACCONFIG_CGIND },
778 { 0x6, 0xffff0000, 16, 0x4CD, SISLANDS_CACCONFIG_CGIND },
779 { 0x18f, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND },
780 { 0x7, 0x0000ffff, 0, 0x37, SISLANDS_CACCONFIG_CGIND },
781 { 0x7, 0xffff0000, 16, 0x27, SISLANDS_CACCONFIG_CGIND },
782 { 0x8, 0x0000ffff, 0, 0xC3, SISLANDS_CACCONFIG_CGIND },
783 { 0x8, 0xffff0000, 16, 0x35, SISLANDS_CACCONFIG_CGIND },
784 { 0x9, 0x0000ffff, 0, 0x28, SISLANDS_CACCONFIG_CGIND },
785 { 0xa, 0x0000ffff, 0, 0x26C, SISLANDS_CACCONFIG_CGIND },
786 { 0xb, 0x0000ffff, 0, 0x3B2, SISLANDS_CACCONFIG_CGIND },
787 { 0xb, 0xffff0000, 16, 0x99D, SISLANDS_CACCONFIG_CGIND },
788 { 0xc, 0x0000ffff, 0, 0xA3F, SISLANDS_CACCONFIG_CGIND },
789 { 0xd, 0x0000ffff, 0, 0xA, SISLANDS_CACCONFIG_CGIND },
790 { 0xd, 0xffff0000, 16, 0xA, SISLANDS_CACCONFIG_CGIND },
791 { 0xe, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND },
792 { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND },
793 { 0xf, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
794 { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
795 { 0x10, 0xffff0000, 16, 0x1, SISLANDS_CACCONFIG_CGIND },
796 { 0x11, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND },
797 { 0x11, 0xffff0000, 16, 0x15, SISLANDS_CACCONFIG_CGIND },
798 { 0x12, 0x0000ffff, 0, 0x34, SISLANDS_CACCONFIG_CGIND },
799 { 0x13, 0x0000ffff, 0, 0x4, SISLANDS_CACCONFIG_CGIND },
800 { 0x13, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND },
801 { 0x14, 0x0000ffff, 0, 0x30A, SISLANDS_CACCONFIG_CGIND },
802 { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
803 { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND },
804 { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
805 { 0x16, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND },
806 { 0x16, 0xffff0000, 16, 0x7A, SISLANDS_CACCONFIG_CGIND },
807 { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
808 { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
809 { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
810 { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
811 { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
812 { 0x1a, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
813 { 0x1a, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
814 { 0x1b, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
815 { 0x1b, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
816 { 0x1c, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
817 { 0x1c, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
818 { 0x1d, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
819 { 0x1d, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
820 { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
821 { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
822 { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
823 { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
824 { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
825 { 0x6d, 0x0000ffff, 0, 0x100, SISLANDS_CACCONFIG_CGIND },
826 { 0xFFFFFFFF }
827};
828
829static const struct si_cac_config_reg cac_weights_heathrow[] =
830{
831 { 0x0, 0x0000ffff, 0, 0x82, SISLANDS_CACCONFIG_CGIND },
832 { 0x0, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND },
833 { 0x1, 0x0000ffff, 0, 0x153, SISLANDS_CACCONFIG_CGIND },
834 { 0x1, 0xffff0000, 16, 0x52, SISLANDS_CACCONFIG_CGIND },
835 { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
836 { 0x3, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND },
837 { 0x3, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND },
838 { 0x4, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND },
839 { 0x4, 0xffff0000, 16, 0xAC, SISLANDS_CACCONFIG_CGIND },
840 { 0x5, 0x0000ffff, 0, 0x118, SISLANDS_CACCONFIG_CGIND },
841 { 0x5, 0xffff0000, 16, 0xBE, SISLANDS_CACCONFIG_CGIND },
842 { 0x6, 0x0000ffff, 0, 0x110, SISLANDS_CACCONFIG_CGIND },
843 { 0x6, 0xffff0000, 16, 0x4CD, SISLANDS_CACCONFIG_CGIND },
844 { 0x18f, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND },
845 { 0x7, 0x0000ffff, 0, 0x37, SISLANDS_CACCONFIG_CGIND },
846 { 0x7, 0xffff0000, 16, 0x27, SISLANDS_CACCONFIG_CGIND },
847 { 0x8, 0x0000ffff, 0, 0xC3, SISLANDS_CACCONFIG_CGIND },
848 { 0x8, 0xffff0000, 16, 0x35, SISLANDS_CACCONFIG_CGIND },
849 { 0x9, 0x0000ffff, 0, 0x28, SISLANDS_CACCONFIG_CGIND },
850 { 0xa, 0x0000ffff, 0, 0x26C, SISLANDS_CACCONFIG_CGIND },
851 { 0xb, 0x0000ffff, 0, 0x3B2, SISLANDS_CACCONFIG_CGIND },
852 { 0xb, 0xffff0000, 16, 0x99D, SISLANDS_CACCONFIG_CGIND },
853 { 0xc, 0x0000ffff, 0, 0xA3F, SISLANDS_CACCONFIG_CGIND },
854 { 0xd, 0x0000ffff, 0, 0xA, SISLANDS_CACCONFIG_CGIND },
855 { 0xd, 0xffff0000, 16, 0xA, SISLANDS_CACCONFIG_CGIND },
856 { 0xe, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND },
857 { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND },
858 { 0xf, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
859 { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
860 { 0x10, 0xffff0000, 16, 0x1, SISLANDS_CACCONFIG_CGIND },
861 { 0x11, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND },
862 { 0x11, 0xffff0000, 16, 0x15, SISLANDS_CACCONFIG_CGIND },
863 { 0x12, 0x0000ffff, 0, 0x34, SISLANDS_CACCONFIG_CGIND },
864 { 0x13, 0x0000ffff, 0, 0x4, SISLANDS_CACCONFIG_CGIND },
865 { 0x13, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND },
866 { 0x14, 0x0000ffff, 0, 0x362, SISLANDS_CACCONFIG_CGIND },
867 { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
868 { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND },
869 { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
870 { 0x16, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND },
871 { 0x16, 0xffff0000, 16, 0x7A, SISLANDS_CACCONFIG_CGIND },
872 { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
873 { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
874 { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
875 { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
876 { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
877 { 0x1a, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
878 { 0x1a, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
879 { 0x1b, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
880 { 0x1b, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
881 { 0x1c, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
882 { 0x1c, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
883 { 0x1d, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
884 { 0x1d, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
885 { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
886 { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
887 { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
888 { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
889 { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
890 { 0x6d, 0x0000ffff, 0, 0x100, SISLANDS_CACCONFIG_CGIND },
891 { 0xFFFFFFFF }
892};
893
894static const struct si_cac_config_reg cac_weights_cape_verde_pro[] =
895{
896 { 0x0, 0x0000ffff, 0, 0x82, SISLANDS_CACCONFIG_CGIND },
897 { 0x0, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND },
898 { 0x1, 0x0000ffff, 0, 0x153, SISLANDS_CACCONFIG_CGIND },
899 { 0x1, 0xffff0000, 16, 0x52, SISLANDS_CACCONFIG_CGIND },
900 { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
901 { 0x3, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND },
902 { 0x3, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND },
903 { 0x4, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND },
904 { 0x4, 0xffff0000, 16, 0xAC, SISLANDS_CACCONFIG_CGIND },
905 { 0x5, 0x0000ffff, 0, 0x118, SISLANDS_CACCONFIG_CGIND },
906 { 0x5, 0xffff0000, 16, 0xBE, SISLANDS_CACCONFIG_CGIND },
907 { 0x6, 0x0000ffff, 0, 0x110, SISLANDS_CACCONFIG_CGIND },
908 { 0x6, 0xffff0000, 16, 0x4CD, SISLANDS_CACCONFIG_CGIND },
909 { 0x18f, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND },
910 { 0x7, 0x0000ffff, 0, 0x37, SISLANDS_CACCONFIG_CGIND },
911 { 0x7, 0xffff0000, 16, 0x27, SISLANDS_CACCONFIG_CGIND },
912 { 0x8, 0x0000ffff, 0, 0xC3, SISLANDS_CACCONFIG_CGIND },
913 { 0x8, 0xffff0000, 16, 0x35, SISLANDS_CACCONFIG_CGIND },
914 { 0x9, 0x0000ffff, 0, 0x28, SISLANDS_CACCONFIG_CGIND },
915 { 0xa, 0x0000ffff, 0, 0x26C, SISLANDS_CACCONFIG_CGIND },
916 { 0xb, 0x0000ffff, 0, 0x3B2, SISLANDS_CACCONFIG_CGIND },
917 { 0xb, 0xffff0000, 16, 0x99D, SISLANDS_CACCONFIG_CGIND },
918 { 0xc, 0x0000ffff, 0, 0xA3F, SISLANDS_CACCONFIG_CGIND },
919 { 0xd, 0x0000ffff, 0, 0xA, SISLANDS_CACCONFIG_CGIND },
920 { 0xd, 0xffff0000, 16, 0xA, SISLANDS_CACCONFIG_CGIND },
921 { 0xe, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND },
922 { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND },
923 { 0xf, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
924 { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
925 { 0x10, 0xffff0000, 16, 0x1, SISLANDS_CACCONFIG_CGIND },
926 { 0x11, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND },
927 { 0x11, 0xffff0000, 16, 0x15, SISLANDS_CACCONFIG_CGIND },
928 { 0x12, 0x0000ffff, 0, 0x34, SISLANDS_CACCONFIG_CGIND },
929 { 0x13, 0x0000ffff, 0, 0x4, SISLANDS_CACCONFIG_CGIND },
930 { 0x13, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND },
931 { 0x14, 0x0000ffff, 0, 0x315, SISLANDS_CACCONFIG_CGIND },
932 { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
933 { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND },
934 { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
935 { 0x16, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND },
936 { 0x16, 0xffff0000, 16, 0x7A, SISLANDS_CACCONFIG_CGIND },
937 { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
938 { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
939 { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
940 { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
941 { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
942 { 0x1a, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
943 { 0x1a, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
944 { 0x1b, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
945 { 0x1b, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
946 { 0x1c, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
947 { 0x1c, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
948 { 0x1d, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
949 { 0x1d, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
950 { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
951 { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
952 { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
953 { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
954 { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
955 { 0x6d, 0x0000ffff, 0, 0x100, SISLANDS_CACCONFIG_CGIND },
956 { 0xFFFFFFFF }
957};
958
959static const struct si_cac_config_reg cac_weights_cape_verde[] =
960{
961 { 0x0, 0x0000ffff, 0, 0x82, SISLANDS_CACCONFIG_CGIND },
962 { 0x0, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND },
963 { 0x1, 0x0000ffff, 0, 0x153, SISLANDS_CACCONFIG_CGIND },
964 { 0x1, 0xffff0000, 16, 0x52, SISLANDS_CACCONFIG_CGIND },
965 { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
966 { 0x3, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND },
967 { 0x3, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND },
968 { 0x4, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND },
969 { 0x4, 0xffff0000, 16, 0xAC, SISLANDS_CACCONFIG_CGIND },
970 { 0x5, 0x0000ffff, 0, 0x118, SISLANDS_CACCONFIG_CGIND },
971 { 0x5, 0xffff0000, 16, 0xBE, SISLANDS_CACCONFIG_CGIND },
972 { 0x6, 0x0000ffff, 0, 0x110, SISLANDS_CACCONFIG_CGIND },
973 { 0x6, 0xffff0000, 16, 0x4CD, SISLANDS_CACCONFIG_CGIND },
974 { 0x18f, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND },
975 { 0x7, 0x0000ffff, 0, 0x37, SISLANDS_CACCONFIG_CGIND },
976 { 0x7, 0xffff0000, 16, 0x27, SISLANDS_CACCONFIG_CGIND },
977 { 0x8, 0x0000ffff, 0, 0xC3, SISLANDS_CACCONFIG_CGIND },
978 { 0x8, 0xffff0000, 16, 0x35, SISLANDS_CACCONFIG_CGIND },
979 { 0x9, 0x0000ffff, 0, 0x28, SISLANDS_CACCONFIG_CGIND },
980 { 0xa, 0x0000ffff, 0, 0x26C, SISLANDS_CACCONFIG_CGIND },
981 { 0xb, 0x0000ffff, 0, 0x3B2, SISLANDS_CACCONFIG_CGIND },
982 { 0xb, 0xffff0000, 16, 0x99D, SISLANDS_CACCONFIG_CGIND },
983 { 0xc, 0x0000ffff, 0, 0xA3F, SISLANDS_CACCONFIG_CGIND },
984 { 0xd, 0x0000ffff, 0, 0xA, SISLANDS_CACCONFIG_CGIND },
985 { 0xd, 0xffff0000, 16, 0xA, SISLANDS_CACCONFIG_CGIND },
986 { 0xe, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND },
987 { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND },
988 { 0xf, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
989 { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
990 { 0x10, 0xffff0000, 16, 0x1, SISLANDS_CACCONFIG_CGIND },
991 { 0x11, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND },
992 { 0x11, 0xffff0000, 16, 0x15, SISLANDS_CACCONFIG_CGIND },
993 { 0x12, 0x0000ffff, 0, 0x34, SISLANDS_CACCONFIG_CGIND },
994 { 0x13, 0x0000ffff, 0, 0x4, SISLANDS_CACCONFIG_CGIND },
995 { 0x13, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND },
996 { 0x14, 0x0000ffff, 0, 0x3BA, SISLANDS_CACCONFIG_CGIND },
997 { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
998 { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND },
999 { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1000 { 0x16, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND },
1001 { 0x16, 0xffff0000, 16, 0x7A, SISLANDS_CACCONFIG_CGIND },
1002 { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1003 { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1004 { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1005 { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1006 { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1007 { 0x1a, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1008 { 0x1a, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1009 { 0x1b, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1010 { 0x1b, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1011 { 0x1c, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1012 { 0x1c, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1013 { 0x1d, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1014 { 0x1d, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1015 { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1016 { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1017 { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1018 { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1019 { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1020 { 0x6d, 0x0000ffff, 0, 0x100, SISLANDS_CACCONFIG_CGIND },
1021 { 0xFFFFFFFF }
1022};
1023
1024static const struct si_cac_config_reg lcac_cape_verde[] =
1025{
1026 { 0x98, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1027 { 0x98, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1028 { 0x104, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1029 { 0x104, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1030 { 0x110, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND },
1031 { 0x110, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1032 { 0x14f, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND },
1033 { 0x14f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1034 { 0x8c, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND },
1035 { 0x8c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1036 { 0x143, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1037 { 0x143, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1038 { 0x9b, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1039 { 0x9b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1040 { 0x107, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1041 { 0x107, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1042 { 0x113, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND },
1043 { 0x113, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1044 { 0x152, 0x0001fffe, 1, 0x5, SISLANDS_CACCONFIG_CGIND },
1045 { 0x152, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1046 { 0x8f, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1047 { 0x8f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1048 { 0x146, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1049 { 0x146, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1050 { 0x11c, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1051 { 0x11c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1052 { 0x11f, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1053 { 0x11f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1054 { 0x164, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1055 { 0x164, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1056 { 0x167, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1057 { 0x167, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1058 { 0x16a, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1059 { 0x16a, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1060 { 0x15e, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1061 { 0x15e, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1062 { 0x161, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1063 { 0x161, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1064 { 0x15b, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1065 { 0x15b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1066 { 0x16d, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1067 { 0x16d, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1068 { 0x170, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1069 { 0x170, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1070 { 0x173, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1071 { 0x173, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1072 { 0x176, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1073 { 0x176, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1074 { 0x179, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1075 { 0x179, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1076 { 0x17c, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1077 { 0x17c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1078 { 0x17f, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1079 { 0x17f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1080 { 0xFFFFFFFF }
1081};
1082
1083static const struct si_cac_config_reg cac_override_cape_verde[] =
1084{
1085 { 0xFFFFFFFF }
1086};
1087
1088static const struct si_powertune_data powertune_data_cape_verde =
1089{
1090 ((1 << 16) | 0x6993),
1091 5,
1092 0,
1093 7,
1094 105,
1095 {
1096 0UL,
1097 0UL,
1098 7194395UL,
1099 309631529UL,
1100 -1270850L,
1101 4513710L,
1102 100
1103 },
1104 117830498UL,
1105 12,
1106 {
1107 0,
1108 0,
1109 0,
1110 0,
1111 0,
1112 0,
1113 0,
1114 0
1115 },
1116 true
1117};
1118
1119static const struct si_dte_data dte_data_cape_verde =
1120{
1121 { 0, 0, 0, 0, 0 },
1122 { 0, 0, 0, 0, 0 },
1123 0,
1124 0,
1125 0,
1126 0,
1127 0,
1128 0,
1129 0,
1130 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
1131 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
1132 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
1133 0,
1134 false
1135};
1136
1137static const struct si_dte_data dte_data_venus_xtx =
1138{
1139 { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 },
1140 { 0x71C, 0xAAB, 0xE39, 0x11C7, 0x0 },
1141 5,
1142 55000,
1143 0x69,
1144 0xA,
1145 1,
1146 0,
1147 0x3,
1148 { 0x96, 0xB4, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },
1149 { 0x895440, 0x3D0900, 0x989680, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },
1150 { 0xD6D8, 0x88B8, 0x1555, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },
1151 90,
1152 true
1153};
1154
1155static const struct si_dte_data dte_data_venus_xt =
1156{
1157 { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 },
1158 { 0xBDA, 0x11C7, 0x17B4, 0x1DA1, 0x0 },
1159 5,
1160 55000,
1161 0x69,
1162 0xA,
1163 1,
1164 0,
1165 0x3,
1166 { 0x96, 0xB4, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },
1167 { 0x895440, 0x3D0900, 0x989680, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },
1168 { 0xAFC8, 0x88B8, 0x238E, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },
1169 90,
1170 true
1171};
1172
1173static const struct si_dte_data dte_data_venus_pro =
1174{
1175 { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 },
1176 { 0x11C7, 0x1AAB, 0x238E, 0x2C72, 0x0 },
1177 5,
1178 55000,
1179 0x69,
1180 0xA,
1181 1,
1182 0,
1183 0x3,
1184 { 0x96, 0xB4, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },
1185 { 0x895440, 0x3D0900, 0x989680, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },
1186 { 0x88B8, 0x88B8, 0x3555, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },
1187 90,
1188 true
1189};
1190
1191static const struct si_cac_config_reg cac_weights_oland[] =
1192{
1193 { 0x0, 0x0000ffff, 0, 0x82, SISLANDS_CACCONFIG_CGIND },
1194 { 0x0, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND },
1195 { 0x1, 0x0000ffff, 0, 0x153, SISLANDS_CACCONFIG_CGIND },
1196 { 0x1, 0xffff0000, 16, 0x52, SISLANDS_CACCONFIG_CGIND },
1197 { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1198 { 0x3, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND },
1199 { 0x3, 0xffff0000, 16, 0x4F, SISLANDS_CACCONFIG_CGIND },
1200 { 0x4, 0x0000ffff, 0, 0x135, SISLANDS_CACCONFIG_CGIND },
1201 { 0x4, 0xffff0000, 16, 0xAC, SISLANDS_CACCONFIG_CGIND },
1202 { 0x5, 0x0000ffff, 0, 0x118, SISLANDS_CACCONFIG_CGIND },
1203 { 0x5, 0xffff0000, 16, 0xBE, SISLANDS_CACCONFIG_CGIND },
1204 { 0x6, 0x0000ffff, 0, 0x110, SISLANDS_CACCONFIG_CGIND },
1205 { 0x6, 0xffff0000, 16, 0x4CD, SISLANDS_CACCONFIG_CGIND },
1206 { 0x18f, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND },
1207 { 0x7, 0x0000ffff, 0, 0x37, SISLANDS_CACCONFIG_CGIND },
1208 { 0x7, 0xffff0000, 16, 0x27, SISLANDS_CACCONFIG_CGIND },
1209 { 0x8, 0x0000ffff, 0, 0xC3, SISLANDS_CACCONFIG_CGIND },
1210 { 0x8, 0xffff0000, 16, 0x35, SISLANDS_CACCONFIG_CGIND },
1211 { 0x9, 0x0000ffff, 0, 0x28, SISLANDS_CACCONFIG_CGIND },
1212 { 0xa, 0x0000ffff, 0, 0x26C, SISLANDS_CACCONFIG_CGIND },
1213 { 0xb, 0x0000ffff, 0, 0x3B2, SISLANDS_CACCONFIG_CGIND },
1214 { 0xb, 0xffff0000, 16, 0x99D, SISLANDS_CACCONFIG_CGIND },
1215 { 0xc, 0x0000ffff, 0, 0xA3F, SISLANDS_CACCONFIG_CGIND },
1216 { 0xd, 0x0000ffff, 0, 0xA, SISLANDS_CACCONFIG_CGIND },
1217 { 0xd, 0xffff0000, 16, 0xA, SISLANDS_CACCONFIG_CGIND },
1218 { 0xe, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND },
1219 { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND },
1220 { 0xf, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1221 { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1222 { 0x10, 0xffff0000, 16, 0x1, SISLANDS_CACCONFIG_CGIND },
1223 { 0x11, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND },
1224 { 0x11, 0xffff0000, 16, 0x15, SISLANDS_CACCONFIG_CGIND },
1225 { 0x12, 0x0000ffff, 0, 0x34, SISLANDS_CACCONFIG_CGIND },
1226 { 0x13, 0x0000ffff, 0, 0x4, SISLANDS_CACCONFIG_CGIND },
1227 { 0x13, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND },
1228 { 0x14, 0x0000ffff, 0, 0x3BA, SISLANDS_CACCONFIG_CGIND },
1229 { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1230 { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND },
1231 { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1232 { 0x16, 0x0000ffff, 0, 0x30, SISLANDS_CACCONFIG_CGIND },
1233 { 0x16, 0xffff0000, 16, 0x7A, SISLANDS_CACCONFIG_CGIND },
1234 { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1235 { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1236 { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1237 { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1238 { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1239 { 0x1a, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1240 { 0x1a, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1241 { 0x1b, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1242 { 0x1b, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1243 { 0x1c, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1244 { 0x1c, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1245 { 0x1d, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1246 { 0x1d, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1247 { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1248 { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1249 { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1250 { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1251 { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1252 { 0x6d, 0x0000ffff, 0, 0x100, SISLANDS_CACCONFIG_CGIND },
1253 { 0xFFFFFFFF }
1254};
1255
1256static const struct si_cac_config_reg cac_weights_mars_pro[] =
1257{
1258 { 0x0, 0x0000ffff, 0, 0x43, SISLANDS_CACCONFIG_CGIND },
1259 { 0x0, 0xffff0000, 16, 0x29, SISLANDS_CACCONFIG_CGIND },
1260 { 0x1, 0x0000ffff, 0, 0xAF, SISLANDS_CACCONFIG_CGIND },
1261 { 0x1, 0xffff0000, 16, 0x2A, SISLANDS_CACCONFIG_CGIND },
1262 { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1263 { 0x3, 0x0000ffff, 0, 0xA0, SISLANDS_CACCONFIG_CGIND },
1264 { 0x3, 0xffff0000, 16, 0x29, SISLANDS_CACCONFIG_CGIND },
1265 { 0x4, 0x0000ffff, 0, 0xA0, SISLANDS_CACCONFIG_CGIND },
1266 { 0x4, 0xffff0000, 16, 0x59, SISLANDS_CACCONFIG_CGIND },
1267 { 0x5, 0x0000ffff, 0, 0x1A5, SISLANDS_CACCONFIG_CGIND },
1268 { 0x5, 0xffff0000, 16, 0x1D6, SISLANDS_CACCONFIG_CGIND },
1269 { 0x6, 0x0000ffff, 0, 0x2A3, SISLANDS_CACCONFIG_CGIND },
1270 { 0x6, 0xffff0000, 16, 0x8FD, SISLANDS_CACCONFIG_CGIND },
1271 { 0x18f, 0x0000ffff, 0, 0x76, SISLANDS_CACCONFIG_CGIND },
1272 { 0x7, 0x0000ffff, 0, 0x8A, SISLANDS_CACCONFIG_CGIND },
1273 { 0x7, 0xffff0000, 16, 0xA3, SISLANDS_CACCONFIG_CGIND },
1274 { 0x8, 0x0000ffff, 0, 0x71, SISLANDS_CACCONFIG_CGIND },
1275 { 0x8, 0xffff0000, 16, 0x36, SISLANDS_CACCONFIG_CGIND },
1276 { 0x9, 0x0000ffff, 0, 0xA6, SISLANDS_CACCONFIG_CGIND },
1277 { 0xa, 0x0000ffff, 0, 0x81, SISLANDS_CACCONFIG_CGIND },
1278 { 0xb, 0x0000ffff, 0, 0x3D2, SISLANDS_CACCONFIG_CGIND },
1279 { 0xb, 0xffff0000, 16, 0x27C, SISLANDS_CACCONFIG_CGIND },
1280 { 0xc, 0x0000ffff, 0, 0xA96, SISLANDS_CACCONFIG_CGIND },
1281 { 0xd, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND },
1282 { 0xd, 0xffff0000, 16, 0x5, SISLANDS_CACCONFIG_CGIND },
1283 { 0xe, 0x0000ffff, 0, 0xB, SISLANDS_CACCONFIG_CGIND },
1284 { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND },
1285 { 0xf, 0xffff0000, 16, 0x2, SISLANDS_CACCONFIG_CGIND },
1286 { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1287 { 0x10, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND },
1288 { 0x11, 0x0000ffff, 0, 0x15, SISLANDS_CACCONFIG_CGIND },
1289 { 0x11, 0xffff0000, 16, 0x7, SISLANDS_CACCONFIG_CGIND },
1290 { 0x12, 0x0000ffff, 0, 0x36, SISLANDS_CACCONFIG_CGIND },
1291 { 0x13, 0x0000ffff, 0, 0x10, SISLANDS_CACCONFIG_CGIND },
1292 { 0x13, 0xffff0000, 16, 0x10, SISLANDS_CACCONFIG_CGIND },
1293 { 0x14, 0x0000ffff, 0, 0x2, SISLANDS_CACCONFIG_CGIND },
1294 { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1295 { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND },
1296 { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1297 { 0x16, 0x0000ffff, 0, 0x32, SISLANDS_CACCONFIG_CGIND },
1298 { 0x16, 0xffff0000, 16, 0x7E, SISLANDS_CACCONFIG_CGIND },
1299 { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1300 { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1301 { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1302 { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1303 { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1304 { 0x1a, 0x0000ffff, 0, 0x280, SISLANDS_CACCONFIG_CGIND },
1305 { 0x1a, 0xffff0000, 16, 0x7, SISLANDS_CACCONFIG_CGIND },
1306 { 0x1b, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1307 { 0x1b, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1308 { 0x1c, 0x0000ffff, 0, 0x3C, SISLANDS_CACCONFIG_CGIND },
1309 { 0x1c, 0xffff0000, 16, 0x203, SISLANDS_CACCONFIG_CGIND },
1310 { 0x1d, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1311 { 0x1d, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1312 { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1313 { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1314 { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1315 { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1316 { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1317 { 0x6d, 0x0000ffff, 0, 0xB4, SISLANDS_CACCONFIG_CGIND },
1318 { 0xFFFFFFFF }
1319};
1320
1321static const struct si_cac_config_reg cac_weights_mars_xt[] =
1322{
1323 { 0x0, 0x0000ffff, 0, 0x43, SISLANDS_CACCONFIG_CGIND },
1324 { 0x0, 0xffff0000, 16, 0x29, SISLANDS_CACCONFIG_CGIND },
1325 { 0x1, 0x0000ffff, 0, 0xAF, SISLANDS_CACCONFIG_CGIND },
1326 { 0x1, 0xffff0000, 16, 0x2A, SISLANDS_CACCONFIG_CGIND },
1327 { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1328 { 0x3, 0x0000ffff, 0, 0xA0, SISLANDS_CACCONFIG_CGIND },
1329 { 0x3, 0xffff0000, 16, 0x29, SISLANDS_CACCONFIG_CGIND },
1330 { 0x4, 0x0000ffff, 0, 0xA0, SISLANDS_CACCONFIG_CGIND },
1331 { 0x4, 0xffff0000, 16, 0x59, SISLANDS_CACCONFIG_CGIND },
1332 { 0x5, 0x0000ffff, 0, 0x1A5, SISLANDS_CACCONFIG_CGIND },
1333 { 0x5, 0xffff0000, 16, 0x1D6, SISLANDS_CACCONFIG_CGIND },
1334 { 0x6, 0x0000ffff, 0, 0x2A3, SISLANDS_CACCONFIG_CGIND },
1335 { 0x6, 0xffff0000, 16, 0x8FD, SISLANDS_CACCONFIG_CGIND },
1336 { 0x18f, 0x0000ffff, 0, 0x76, SISLANDS_CACCONFIG_CGIND },
1337 { 0x7, 0x0000ffff, 0, 0x8A, SISLANDS_CACCONFIG_CGIND },
1338 { 0x7, 0xffff0000, 16, 0xA3, SISLANDS_CACCONFIG_CGIND },
1339 { 0x8, 0x0000ffff, 0, 0x71, SISLANDS_CACCONFIG_CGIND },
1340 { 0x8, 0xffff0000, 16, 0x36, SISLANDS_CACCONFIG_CGIND },
1341 { 0x9, 0x0000ffff, 0, 0xA6, SISLANDS_CACCONFIG_CGIND },
1342 { 0xa, 0x0000ffff, 0, 0x81, SISLANDS_CACCONFIG_CGIND },
1343 { 0xb, 0x0000ffff, 0, 0x3D2, SISLANDS_CACCONFIG_CGIND },
1344 { 0xb, 0xffff0000, 16, 0x27C, SISLANDS_CACCONFIG_CGIND },
1345 { 0xc, 0x0000ffff, 0, 0xA96, SISLANDS_CACCONFIG_CGIND },
1346 { 0xd, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND },
1347 { 0xd, 0xffff0000, 16, 0x5, SISLANDS_CACCONFIG_CGIND },
1348 { 0xe, 0x0000ffff, 0, 0xB, SISLANDS_CACCONFIG_CGIND },
1349 { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND },
1350 { 0xf, 0xffff0000, 16, 0x2, SISLANDS_CACCONFIG_CGIND },
1351 { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1352 { 0x10, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND },
1353 { 0x11, 0x0000ffff, 0, 0x15, SISLANDS_CACCONFIG_CGIND },
1354 { 0x11, 0xffff0000, 16, 0x7, SISLANDS_CACCONFIG_CGIND },
1355 { 0x12, 0x0000ffff, 0, 0x36, SISLANDS_CACCONFIG_CGIND },
1356 { 0x13, 0x0000ffff, 0, 0x10, SISLANDS_CACCONFIG_CGIND },
1357 { 0x13, 0xffff0000, 16, 0x10, SISLANDS_CACCONFIG_CGIND },
1358 { 0x14, 0x0000ffff, 0, 0x60, SISLANDS_CACCONFIG_CGIND },
1359 { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1360 { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND },
1361 { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1362 { 0x16, 0x0000ffff, 0, 0x32, SISLANDS_CACCONFIG_CGIND },
1363 { 0x16, 0xffff0000, 16, 0x7E, SISLANDS_CACCONFIG_CGIND },
1364 { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1365 { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1366 { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1367 { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1368 { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1369 { 0x1a, 0x0000ffff, 0, 0x280, SISLANDS_CACCONFIG_CGIND },
1370 { 0x1a, 0xffff0000, 16, 0x7, SISLANDS_CACCONFIG_CGIND },
1371 { 0x1b, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1372 { 0x1b, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1373 { 0x1c, 0x0000ffff, 0, 0x3C, SISLANDS_CACCONFIG_CGIND },
1374 { 0x1c, 0xffff0000, 16, 0x203, SISLANDS_CACCONFIG_CGIND },
1375 { 0x1d, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1376 { 0x1d, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1377 { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1378 { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1379 { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1380 { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1381 { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1382 { 0x6d, 0x0000ffff, 0, 0xB4, SISLANDS_CACCONFIG_CGIND },
1383 { 0xFFFFFFFF }
1384};
1385
1386static const struct si_cac_config_reg cac_weights_oland_pro[] =
1387{
1388 { 0x0, 0x0000ffff, 0, 0x43, SISLANDS_CACCONFIG_CGIND },
1389 { 0x0, 0xffff0000, 16, 0x29, SISLANDS_CACCONFIG_CGIND },
1390 { 0x1, 0x0000ffff, 0, 0xAF, SISLANDS_CACCONFIG_CGIND },
1391 { 0x1, 0xffff0000, 16, 0x2A, SISLANDS_CACCONFIG_CGIND },
1392 { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1393 { 0x3, 0x0000ffff, 0, 0xA0, SISLANDS_CACCONFIG_CGIND },
1394 { 0x3, 0xffff0000, 16, 0x29, SISLANDS_CACCONFIG_CGIND },
1395 { 0x4, 0x0000ffff, 0, 0xA0, SISLANDS_CACCONFIG_CGIND },
1396 { 0x4, 0xffff0000, 16, 0x59, SISLANDS_CACCONFIG_CGIND },
1397 { 0x5, 0x0000ffff, 0, 0x1A5, SISLANDS_CACCONFIG_CGIND },
1398 { 0x5, 0xffff0000, 16, 0x1D6, SISLANDS_CACCONFIG_CGIND },
1399 { 0x6, 0x0000ffff, 0, 0x2A3, SISLANDS_CACCONFIG_CGIND },
1400 { 0x6, 0xffff0000, 16, 0x8FD, SISLANDS_CACCONFIG_CGIND },
1401 { 0x18f, 0x0000ffff, 0, 0x76, SISLANDS_CACCONFIG_CGIND },
1402 { 0x7, 0x0000ffff, 0, 0x8A, SISLANDS_CACCONFIG_CGIND },
1403 { 0x7, 0xffff0000, 16, 0xA3, SISLANDS_CACCONFIG_CGIND },
1404 { 0x8, 0x0000ffff, 0, 0x71, SISLANDS_CACCONFIG_CGIND },
1405 { 0x8, 0xffff0000, 16, 0x36, SISLANDS_CACCONFIG_CGIND },
1406 { 0x9, 0x0000ffff, 0, 0xA6, SISLANDS_CACCONFIG_CGIND },
1407 { 0xa, 0x0000ffff, 0, 0x81, SISLANDS_CACCONFIG_CGIND },
1408 { 0xb, 0x0000ffff, 0, 0x3D2, SISLANDS_CACCONFIG_CGIND },
1409 { 0xb, 0xffff0000, 16, 0x27C, SISLANDS_CACCONFIG_CGIND },
1410 { 0xc, 0x0000ffff, 0, 0xA96, SISLANDS_CACCONFIG_CGIND },
1411 { 0xd, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND },
1412 { 0xd, 0xffff0000, 16, 0x5, SISLANDS_CACCONFIG_CGIND },
1413 { 0xe, 0x0000ffff, 0, 0xB, SISLANDS_CACCONFIG_CGIND },
1414 { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND },
1415 { 0xf, 0xffff0000, 16, 0x2, SISLANDS_CACCONFIG_CGIND },
1416 { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1417 { 0x10, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND },
1418 { 0x11, 0x0000ffff, 0, 0x15, SISLANDS_CACCONFIG_CGIND },
1419 { 0x11, 0xffff0000, 16, 0x7, SISLANDS_CACCONFIG_CGIND },
1420 { 0x12, 0x0000ffff, 0, 0x36, SISLANDS_CACCONFIG_CGIND },
1421 { 0x13, 0x0000ffff, 0, 0x10, SISLANDS_CACCONFIG_CGIND },
1422 { 0x13, 0xffff0000, 16, 0x10, SISLANDS_CACCONFIG_CGIND },
1423 { 0x14, 0x0000ffff, 0, 0x90, SISLANDS_CACCONFIG_CGIND },
1424 { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1425 { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND },
1426 { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1427 { 0x16, 0x0000ffff, 0, 0x32, SISLANDS_CACCONFIG_CGIND },
1428 { 0x16, 0xffff0000, 16, 0x7E, SISLANDS_CACCONFIG_CGIND },
1429 { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1430 { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1431 { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1432 { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1433 { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1434 { 0x1a, 0x0000ffff, 0, 0x280, SISLANDS_CACCONFIG_CGIND },
1435 { 0x1a, 0xffff0000, 16, 0x7, SISLANDS_CACCONFIG_CGIND },
1436 { 0x1b, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1437 { 0x1b, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1438 { 0x1c, 0x0000ffff, 0, 0x3C, SISLANDS_CACCONFIG_CGIND },
1439 { 0x1c, 0xffff0000, 16, 0x203, SISLANDS_CACCONFIG_CGIND },
1440 { 0x1d, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1441 { 0x1d, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1442 { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1443 { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1444 { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1445 { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1446 { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1447 { 0x6d, 0x0000ffff, 0, 0xB4, SISLANDS_CACCONFIG_CGIND },
1448 { 0xFFFFFFFF }
1449};
1450
1451static const struct si_cac_config_reg cac_weights_oland_xt[] =
1452{
1453 { 0x0, 0x0000ffff, 0, 0x43, SISLANDS_CACCONFIG_CGIND },
1454 { 0x0, 0xffff0000, 16, 0x29, SISLANDS_CACCONFIG_CGIND },
1455 { 0x1, 0x0000ffff, 0, 0xAF, SISLANDS_CACCONFIG_CGIND },
1456 { 0x1, 0xffff0000, 16, 0x2A, SISLANDS_CACCONFIG_CGIND },
1457 { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1458 { 0x3, 0x0000ffff, 0, 0xA0, SISLANDS_CACCONFIG_CGIND },
1459 { 0x3, 0xffff0000, 16, 0x29, SISLANDS_CACCONFIG_CGIND },
1460 { 0x4, 0x0000ffff, 0, 0xA0, SISLANDS_CACCONFIG_CGIND },
1461 { 0x4, 0xffff0000, 16, 0x59, SISLANDS_CACCONFIG_CGIND },
1462 { 0x5, 0x0000ffff, 0, 0x1A5, SISLANDS_CACCONFIG_CGIND },
1463 { 0x5, 0xffff0000, 16, 0x1D6, SISLANDS_CACCONFIG_CGIND },
1464 { 0x6, 0x0000ffff, 0, 0x2A3, SISLANDS_CACCONFIG_CGIND },
1465 { 0x6, 0xffff0000, 16, 0x8FD, SISLANDS_CACCONFIG_CGIND },
1466 { 0x18f, 0x0000ffff, 0, 0x76, SISLANDS_CACCONFIG_CGIND },
1467 { 0x7, 0x0000ffff, 0, 0x8A, SISLANDS_CACCONFIG_CGIND },
1468 { 0x7, 0xffff0000, 16, 0xA3, SISLANDS_CACCONFIG_CGIND },
1469 { 0x8, 0x0000ffff, 0, 0x71, SISLANDS_CACCONFIG_CGIND },
1470 { 0x8, 0xffff0000, 16, 0x36, SISLANDS_CACCONFIG_CGIND },
1471 { 0x9, 0x0000ffff, 0, 0xA6, SISLANDS_CACCONFIG_CGIND },
1472 { 0xa, 0x0000ffff, 0, 0x81, SISLANDS_CACCONFIG_CGIND },
1473 { 0xb, 0x0000ffff, 0, 0x3D2, SISLANDS_CACCONFIG_CGIND },
1474 { 0xb, 0xffff0000, 16, 0x27C, SISLANDS_CACCONFIG_CGIND },
1475 { 0xc, 0x0000ffff, 0, 0xA96, SISLANDS_CACCONFIG_CGIND },
1476 { 0xd, 0x0000ffff, 0, 0x5, SISLANDS_CACCONFIG_CGIND },
1477 { 0xd, 0xffff0000, 16, 0x5, SISLANDS_CACCONFIG_CGIND },
1478 { 0xe, 0x0000ffff, 0, 0xB, SISLANDS_CACCONFIG_CGIND },
1479 { 0xf, 0x0000ffff, 0, 0x3, SISLANDS_CACCONFIG_CGIND },
1480 { 0xf, 0xffff0000, 16, 0x2, SISLANDS_CACCONFIG_CGIND },
1481 { 0x10, 0x0000ffff, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1482 { 0x10, 0xffff0000, 16, 0x4, SISLANDS_CACCONFIG_CGIND },
1483 { 0x11, 0x0000ffff, 0, 0x15, SISLANDS_CACCONFIG_CGIND },
1484 { 0x11, 0xffff0000, 16, 0x7, SISLANDS_CACCONFIG_CGIND },
1485 { 0x12, 0x0000ffff, 0, 0x36, SISLANDS_CACCONFIG_CGIND },
1486 { 0x13, 0x0000ffff, 0, 0x10, SISLANDS_CACCONFIG_CGIND },
1487 { 0x13, 0xffff0000, 16, 0x10, SISLANDS_CACCONFIG_CGIND },
1488 { 0x14, 0x0000ffff, 0, 0x120, SISLANDS_CACCONFIG_CGIND },
1489 { 0x15, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1490 { 0x15, 0xffff0000, 16, 0x6, SISLANDS_CACCONFIG_CGIND },
1491 { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1492 { 0x16, 0x0000ffff, 0, 0x32, SISLANDS_CACCONFIG_CGIND },
1493 { 0x16, 0xffff0000, 16, 0x7E, SISLANDS_CACCONFIG_CGIND },
1494 { 0x17, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1495 { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1496 { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1497 { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1498 { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1499 { 0x1a, 0x0000ffff, 0, 0x280, SISLANDS_CACCONFIG_CGIND },
1500 { 0x1a, 0xffff0000, 16, 0x7, SISLANDS_CACCONFIG_CGIND },
1501 { 0x1b, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1502 { 0x1b, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1503 { 0x1c, 0x0000ffff, 0, 0x3C, SISLANDS_CACCONFIG_CGIND },
1504 { 0x1c, 0xffff0000, 16, 0x203, SISLANDS_CACCONFIG_CGIND },
1505 { 0x1d, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1506 { 0x1d, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1507 { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1508 { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1509 { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1510 { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1511 { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1512 { 0x6d, 0x0000ffff, 0, 0xB4, SISLANDS_CACCONFIG_CGIND },
1513 { 0xFFFFFFFF }
1514};
1515
1516static const struct si_cac_config_reg lcac_oland[] =
1517{
1518 { 0x98, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1519 { 0x98, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1520 { 0x104, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1521 { 0x104, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1522 { 0x110, 0x0001fffe, 1, 0x6, SISLANDS_CACCONFIG_CGIND },
1523 { 0x110, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1524 { 0x14f, 0x0001fffe, 1, 0x6, SISLANDS_CACCONFIG_CGIND },
1525 { 0x14f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1526 { 0x8c, 0x0001fffe, 1, 0x6, SISLANDS_CACCONFIG_CGIND },
1527 { 0x8c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1528 { 0x143, 0x0001fffe, 1, 0x4, SISLANDS_CACCONFIG_CGIND },
1529 { 0x143, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1530 { 0x11c, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1531 { 0x11c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1532 { 0x11f, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1533 { 0x11f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1534 { 0x164, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1535 { 0x164, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1536 { 0x167, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1537 { 0x167, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1538 { 0x16a, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1539 { 0x16a, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1540 { 0x15e, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1541 { 0x15e, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1542 { 0x161, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1543 { 0x161, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1544 { 0x15b, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1545 { 0x15b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1546 { 0x16d, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1547 { 0x16d, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1548 { 0x170, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1549 { 0x170, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1550 { 0x173, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1551 { 0x173, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1552 { 0x176, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1553 { 0x176, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1554 { 0x179, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1555 { 0x179, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1556 { 0x17c, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1557 { 0x17c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1558 { 0x17f, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1559 { 0x17f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1560 { 0xFFFFFFFF }
1561};
1562
1563static const struct si_cac_config_reg lcac_mars_pro[] =
1564{
1565 { 0x98, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1566 { 0x98, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1567 { 0x104, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1568 { 0x104, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1569 { 0x110, 0x0001fffe, 1, 0x6, SISLANDS_CACCONFIG_CGIND },
1570 { 0x110, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1571 { 0x14f, 0x0001fffe, 1, 0x6, SISLANDS_CACCONFIG_CGIND },
1572 { 0x14f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1573 { 0x8c, 0x0001fffe, 1, 0x6, SISLANDS_CACCONFIG_CGIND },
1574 { 0x8c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1575 { 0x143, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1576 { 0x143, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1577 { 0x11c, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1578 { 0x11c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1579 { 0x11f, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1580 { 0x11f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1581 { 0x164, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1582 { 0x164, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1583 { 0x167, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1584 { 0x167, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1585 { 0x16a, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1586 { 0x16a, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1587 { 0x15e, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1588 { 0x15e, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1589 { 0x161, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1590 { 0x161, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1591 { 0x15b, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1592 { 0x15b, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1593 { 0x16d, 0x0001fffe, 1, 0x2, SISLANDS_CACCONFIG_CGIND },
1594 { 0x16d, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1595 { 0x170, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1596 { 0x170, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1597 { 0x173, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1598 { 0x173, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1599 { 0x176, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1600 { 0x176, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1601 { 0x179, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1602 { 0x179, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1603 { 0x17c, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1604 { 0x17c, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1605 { 0x17f, 0x0001fffe, 1, 0x1, SISLANDS_CACCONFIG_CGIND },
1606 { 0x17f, 0x00000001, 0, 0x1, SISLANDS_CACCONFIG_CGIND },
1607 { 0xFFFFFFFF }
1608};
1609
1610static const struct si_cac_config_reg cac_override_oland[] =
1611{
1612 { 0xFFFFFFFF }
1613};
1614
1615static const struct si_powertune_data powertune_data_oland =
1616{
1617 ((1 << 16) | 0x6993),
1618 5,
1619 0,
1620 7,
1621 105,
1622 {
1623 0UL,
1624 0UL,
1625 7194395UL,
1626 309631529UL,
1627 -1270850L,
1628 4513710L,
1629 100
1630 },
1631 117830498UL,
1632 12,
1633 {
1634 0,
1635 0,
1636 0,
1637 0,
1638 0,
1639 0,
1640 0,
1641 0
1642 },
1643 true
1644};
1645
1646static const struct si_powertune_data powertune_data_mars_pro =
1647{
1648 ((1 << 16) | 0x6993),
1649 5,
1650 0,
1651 7,
1652 105,
1653 {
1654 0UL,
1655 0UL,
1656 7194395UL,
1657 309631529UL,
1658 -1270850L,
1659 4513710L,
1660 100
1661 },
1662 117830498UL,
1663 12,
1664 {
1665 0,
1666 0,
1667 0,
1668 0,
1669 0,
1670 0,
1671 0,
1672 0
1673 },
1674 true
1675};
1676
1677static const struct si_dte_data dte_data_oland =
1678{
1679 { 0, 0, 0, 0, 0 },
1680 { 0, 0, 0, 0, 0 },
1681 0,
1682 0,
1683 0,
1684 0,
1685 0,
1686 0,
1687 0,
1688 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
1689 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
1690 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
1691 0,
1692 false
1693};
1694
1695static const struct si_dte_data dte_data_mars_pro =
1696{
1697 { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 },
1698 { 0x0, 0x0, 0x0, 0x0, 0x0 },
1699 5,
1700 55000,
1701 105,
1702 0xA,
1703 1,
1704 0,
1705 0x10,
1706 { 0x96, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
1707 { 0x895440, 0x3D0900, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680 },
1708 { 0xF627, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },
1709 90,
1710 true
1711};
1712
1713static const struct si_dte_data dte_data_sun_xt =
1714{
1715 { 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 },
1716 { 0x0, 0x0, 0x0, 0x0, 0x0 },
1717 5,
1718 55000,
1719 105,
1720 0xA,
1721 1,
1722 0,
1723 0x10,
1724 { 0x96, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
1725 { 0x895440, 0x3D0900, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680, 0x989680 },
1726 { 0xD555, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },
1727 90,
1728 true
1729};
1730
1731
1732static const struct si_cac_config_reg cac_weights_hainan[] =
1733{
1734 { 0x0, 0x0000ffff, 0, 0x2d9, SISLANDS_CACCONFIG_CGIND },
1735 { 0x0, 0xffff0000, 16, 0x22b, SISLANDS_CACCONFIG_CGIND },
1736 { 0x1, 0x0000ffff, 0, 0x21c, SISLANDS_CACCONFIG_CGIND },
1737 { 0x1, 0xffff0000, 16, 0x1dc, SISLANDS_CACCONFIG_CGIND },
1738 { 0x2, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1739 { 0x3, 0x0000ffff, 0, 0x24e, SISLANDS_CACCONFIG_CGIND },
1740 { 0x3, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1741 { 0x4, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1742 { 0x4, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1743 { 0x5, 0x0000ffff, 0, 0x35e, SISLANDS_CACCONFIG_CGIND },
1744 { 0x5, 0xffff0000, 16, 0x1143, SISLANDS_CACCONFIG_CGIND },
1745 { 0x6, 0x0000ffff, 0, 0xe17, SISLANDS_CACCONFIG_CGIND },
1746 { 0x6, 0xffff0000, 16, 0x441, SISLANDS_CACCONFIG_CGIND },
1747 { 0x18f, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1748 { 0x7, 0x0000ffff, 0, 0x28b, SISLANDS_CACCONFIG_CGIND },
1749 { 0x7, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1750 { 0x8, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1751 { 0x8, 0xffff0000, 16, 0xabe, SISLANDS_CACCONFIG_CGIND },
1752 { 0x9, 0x0000ffff, 0, 0xf11, SISLANDS_CACCONFIG_CGIND },
1753 { 0xa, 0x0000ffff, 0, 0x907, SISLANDS_CACCONFIG_CGIND },
1754 { 0xb, 0x0000ffff, 0, 0xb45, SISLANDS_CACCONFIG_CGIND },
1755 { 0xb, 0xffff0000, 16, 0xd1e, SISLANDS_CACCONFIG_CGIND },
1756 { 0xc, 0x0000ffff, 0, 0xa2c, SISLANDS_CACCONFIG_CGIND },
1757 { 0xd, 0x0000ffff, 0, 0x62, SISLANDS_CACCONFIG_CGIND },
1758 { 0xd, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1759 { 0xe, 0x0000ffff, 0, 0x1f3, SISLANDS_CACCONFIG_CGIND },
1760 { 0xf, 0x0000ffff, 0, 0x42, SISLANDS_CACCONFIG_CGIND },
1761 { 0xf, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1762 { 0x10, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1763 { 0x10, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1764 { 0x11, 0x0000ffff, 0, 0x709, SISLANDS_CACCONFIG_CGIND },
1765 { 0x11, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1766 { 0x12, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1767 { 0x13, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1768 { 0x13, 0xffff0000, 16, 0x3a, SISLANDS_CACCONFIG_CGIND },
1769 { 0x14, 0x0000ffff, 0, 0x357, SISLANDS_CACCONFIG_CGIND },
1770 { 0x15, 0x0000ffff, 0, 0x9f, SISLANDS_CACCONFIG_CGIND },
1771 { 0x15, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1772 { 0x4e, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1773 { 0x16, 0x0000ffff, 0, 0x314, SISLANDS_CACCONFIG_CGIND },
1774 { 0x16, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1775 { 0x17, 0x0000ffff, 0, 0x6d, SISLANDS_CACCONFIG_CGIND },
1776 { 0x18, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1777 { 0x18, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1778 { 0x19, 0x0000ffff, 0, 0x0, SISLANDS_CACCONFIG_CGIND },
1779 { 0x19, 0xffff0000, 16, 0x0, SISLANDS_CACCONFIG_CGIND },
1780 { 0x1a, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1781 { 0x1a, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1782 { 0x1b, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1783 { 0x1b, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1784 { 0x1c, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1785 { 0x1c, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1786 { 0x1d, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1787 { 0x1d, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1788 { 0x1e, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1789 { 0x1e, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1790 { 0x1f, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1791 { 0x1f, 0xffff0000, 16, 0, SISLANDS_CACCONFIG_CGIND },
1792 { 0x20, 0x0000ffff, 0, 0, SISLANDS_CACCONFIG_CGIND },
1793 { 0x6d, 0x0000ffff, 0, 0x1b9, SISLANDS_CACCONFIG_CGIND },
1794 { 0xFFFFFFFF }
1795};
1796
1797static const struct si_powertune_data powertune_data_hainan =
1798{
1799 ((1 << 16) | 0x6993),
1800 5,
1801 0,
1802 9,
1803 105,
1804 {
1805 0UL,
1806 0UL,
1807 7194395UL,
1808 309631529UL,
1809 -1270850L,
1810 4513710L,
1811 100
1812 },
1813 117830498UL,
1814 12,
1815 {
1816 0,
1817 0,
1818 0,
1819 0,
1820 0,
1821 0,
1822 0,
1823 0
1824 },
1825 true
1826};
1827
1828static struct rv7xx_power_info *rv770_get_pi(struct amdgpu_device *adev);
1829static struct evergreen_power_info *evergreen_get_pi(struct amdgpu_device *adev);
1830static struct ni_power_info *ni_get_pi(struct amdgpu_device *adev);
1831static struct si_ps *si_get_ps(struct amdgpu_ps *rps);
1832
1833static int si_populate_voltage_value(struct amdgpu_device *adev,
1834 const struct atom_voltage_table *table,
1835 u16 value, SISLANDS_SMC_VOLTAGE_VALUE *voltage);
1836static int si_get_std_voltage_value(struct amdgpu_device *adev,
1837 SISLANDS_SMC_VOLTAGE_VALUE *voltage,
1838 u16 *std_voltage);
1839static int si_write_smc_soft_register(struct amdgpu_device *adev,
1840 u16 reg_offset, u32 value);
1841static int si_convert_power_level_to_smc(struct amdgpu_device *adev,
1842 struct rv7xx_pl *pl,
1843 SISLANDS_SMC_HW_PERFORMANCE_LEVEL *level);
1844static int si_calculate_sclk_params(struct amdgpu_device *adev,
1845 u32 engine_clock,
1846 SISLANDS_SMC_SCLK_VALUE *sclk);
1847
1848static void si_thermal_start_smc_fan_control(struct amdgpu_device *adev);
1849static void si_fan_ctrl_set_default_mode(struct amdgpu_device *adev);
1850static void si_dpm_set_dpm_funcs(struct amdgpu_device *adev);
1851static void si_dpm_set_irq_funcs(struct amdgpu_device *adev);
1852
1853static struct si_power_info *si_get_pi(struct amdgpu_device *adev)
1854{
1855 struct si_power_info *pi = adev->pm.dpm.priv;
1856 return pi;
1857}
1858
1859static void si_calculate_leakage_for_v_and_t_formula(const struct ni_leakage_coeffients *coeff,
1860 u16 v, s32 t, u32 ileakage, u32 *leakage)
1861{
1862 s64 kt, kv, leakage_w, i_leakage, vddc;
1863 s64 temperature, t_slope, t_intercept, av, bv, t_ref;
1864 s64 tmp;
1865
1866 i_leakage = div64_s64(drm_int2fixp(ileakage), 100);
1867 vddc = div64_s64(drm_int2fixp(v), 1000);
1868 temperature = div64_s64(drm_int2fixp(t), 1000);
1869
1870 t_slope = div64_s64(drm_int2fixp(coeff->t_slope), 100000000);
1871 t_intercept = div64_s64(drm_int2fixp(coeff->t_intercept), 100000000);
1872 av = div64_s64(drm_int2fixp(coeff->av), 100000000);
1873 bv = div64_s64(drm_int2fixp(coeff->bv), 100000000);
1874 t_ref = drm_int2fixp(coeff->t_ref);
1875
1876 tmp = drm_fixp_mul(t_slope, vddc) + t_intercept;
1877 kt = drm_fixp_exp(drm_fixp_mul(tmp, temperature));
1878 kt = drm_fixp_div(kt, drm_fixp_exp(drm_fixp_mul(tmp, t_ref)));
1879 kv = drm_fixp_mul(av, drm_fixp_exp(drm_fixp_mul(bv, vddc)));
1880
1881 leakage_w = drm_fixp_mul(drm_fixp_mul(drm_fixp_mul(i_leakage, kt), kv), vddc);
1882
1883 *leakage = drm_fixp2int(leakage_w * 1000);
1884}
1885
1886static void si_calculate_leakage_for_v_and_t(struct amdgpu_device *adev,
1887 const struct ni_leakage_coeffients *coeff,
1888 u16 v,
1889 s32 t,
1890 u32 i_leakage,
1891 u32 *leakage)
1892{
1893 si_calculate_leakage_for_v_and_t_formula(coeff, v, t, i_leakage, leakage);
1894}
1895
1896static void si_calculate_leakage_for_v_formula(const struct ni_leakage_coeffients *coeff,
1897 const u32 fixed_kt, u16 v,
1898 u32 ileakage, u32 *leakage)
1899{
1900 s64 kt, kv, leakage_w, i_leakage, vddc;
1901
1902 i_leakage = div64_s64(drm_int2fixp(ileakage), 100);
1903 vddc = div64_s64(drm_int2fixp(v), 1000);
1904
1905 kt = div64_s64(drm_int2fixp(fixed_kt), 100000000);
1906 kv = drm_fixp_mul(div64_s64(drm_int2fixp(coeff->av), 100000000),
1907 drm_fixp_exp(drm_fixp_mul(div64_s64(drm_int2fixp(coeff->bv), 100000000), vddc)));
1908
1909 leakage_w = drm_fixp_mul(drm_fixp_mul(drm_fixp_mul(i_leakage, kt), kv), vddc);
1910
1911 *leakage = drm_fixp2int(leakage_w * 1000);
1912}
1913
1914static void si_calculate_leakage_for_v(struct amdgpu_device *adev,
1915 const struct ni_leakage_coeffients *coeff,
1916 const u32 fixed_kt,
1917 u16 v,
1918 u32 i_leakage,
1919 u32 *leakage)
1920{
1921 si_calculate_leakage_for_v_formula(coeff, fixed_kt, v, i_leakage, leakage);
1922}
1923
1924
1925static void si_update_dte_from_pl2(struct amdgpu_device *adev,
1926 struct si_dte_data *dte_data)
1927{
1928 u32 p_limit1 = adev->pm.dpm.tdp_limit;
1929 u32 p_limit2 = adev->pm.dpm.near_tdp_limit;
1930 u32 k = dte_data->k;
1931 u32 t_max = dte_data->max_t;
1932 u32 t_split[5] = { 10, 15, 20, 25, 30 };
1933 u32 t_0 = dte_data->t0;
1934 u32 i;
1935
1936 if (p_limit2 != 0 && p_limit2 <= p_limit1) {
1937 dte_data->tdep_count = 3;
1938
1939 for (i = 0; i < k; i++) {
1940 dte_data->r[i] =
1941 (t_split[i] * (t_max - t_0/(u32)1000) * (1 << 14)) /
1942 (p_limit2 * (u32)100);
1943 }
1944
1945 dte_data->tdep_r[1] = dte_data->r[4] * 2;
1946
1947 for (i = 2; i < SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE; i++) {
1948 dte_data->tdep_r[i] = dte_data->r[4];
1949 }
1950 } else {
1951 DRM_ERROR("Invalid PL2! DTE will not be updated.\n");
1952 }
1953}
1954
1955static struct rv7xx_power_info *rv770_get_pi(struct amdgpu_device *adev)
1956{
1957 struct rv7xx_power_info *pi = adev->pm.dpm.priv;
1958
1959 return pi;
1960}
1961
1962static struct ni_power_info *ni_get_pi(struct amdgpu_device *adev)
1963{
1964 struct ni_power_info *pi = adev->pm.dpm.priv;
1965
1966 return pi;
1967}
1968
1969static struct si_ps *si_get_ps(struct amdgpu_ps *aps)
1970{
1971 struct si_ps *ps = aps->ps_priv;
1972
1973 return ps;
1974}
1975
1976static void si_initialize_powertune_defaults(struct amdgpu_device *adev)
1977{
1978 struct ni_power_info *ni_pi = ni_get_pi(adev);
1979 struct si_power_info *si_pi = si_get_pi(adev);
1980 bool update_dte_from_pl2 = false;
1981
1982 if (adev->asic_type == CHIP_TAHITI) {
1983 si_pi->cac_weights = cac_weights_tahiti;
1984 si_pi->lcac_config = lcac_tahiti;
1985 si_pi->cac_override = cac_override_tahiti;
1986 si_pi->powertune_data = &powertune_data_tahiti;
1987 si_pi->dte_data = dte_data_tahiti;
1988
1989 switch (adev->pdev->device) {
1990 case 0x6798:
1991 si_pi->dte_data.enable_dte_by_default = true;
1992 break;
1993 case 0x6799:
1994 si_pi->dte_data = dte_data_new_zealand;
1995 break;
1996 case 0x6790:
1997 case 0x6791:
1998 case 0x6792:
1999 case 0x679E:
2000 si_pi->dte_data = dte_data_aruba_pro;
2001 update_dte_from_pl2 = true;
2002 break;
2003 case 0x679B:
2004 si_pi->dte_data = dte_data_malta;
2005 update_dte_from_pl2 = true;
2006 break;
2007 case 0x679A:
2008 si_pi->dte_data = dte_data_tahiti_pro;
2009 update_dte_from_pl2 = true;
2010 break;
2011 default:
2012 if (si_pi->dte_data.enable_dte_by_default == true)
2013 DRM_ERROR("DTE is not enabled!\n");
2014 break;
2015 }
2016 } else if (adev->asic_type == CHIP_PITCAIRN) {
2017 si_pi->cac_weights = cac_weights_pitcairn;
2018 si_pi->lcac_config = lcac_pitcairn;
2019 si_pi->cac_override = cac_override_pitcairn;
2020 si_pi->powertune_data = &powertune_data_pitcairn;
2021
2022 switch (adev->pdev->device) {
2023 case 0x6810:
2024 case 0x6818:
2025 si_pi->dte_data = dte_data_curacao_xt;
2026 update_dte_from_pl2 = true;
2027 break;
2028 case 0x6819:
2029 case 0x6811:
2030 si_pi->dte_data = dte_data_curacao_pro;
2031 update_dte_from_pl2 = true;
2032 break;
2033 case 0x6800:
2034 case 0x6806:
2035 si_pi->dte_data = dte_data_neptune_xt;
2036 update_dte_from_pl2 = true;
2037 break;
2038 default:
2039 si_pi->dte_data = dte_data_pitcairn;
2040 break;
2041 }
2042 } else if (adev->asic_type == CHIP_VERDE) {
2043 si_pi->lcac_config = lcac_cape_verde;
2044 si_pi->cac_override = cac_override_cape_verde;
2045 si_pi->powertune_data = &powertune_data_cape_verde;
2046
2047 switch (adev->pdev->device) {
2048 case 0x683B:
2049 case 0x683F:
2050 case 0x6829:
2051 case 0x6835:
2052 si_pi->cac_weights = cac_weights_cape_verde_pro;
2053 si_pi->dte_data = dte_data_cape_verde;
2054 break;
2055 case 0x682C:
2056 si_pi->cac_weights = cac_weights_cape_verde_pro;
2057 si_pi->dte_data = dte_data_sun_xt;
2058 break;
2059 case 0x6825:
2060 case 0x6827:
2061 si_pi->cac_weights = cac_weights_heathrow;
2062 si_pi->dte_data = dte_data_cape_verde;
2063 break;
2064 case 0x6824:
2065 case 0x682D:
2066 si_pi->cac_weights = cac_weights_chelsea_xt;
2067 si_pi->dte_data = dte_data_cape_verde;
2068 break;
2069 case 0x682F:
2070 si_pi->cac_weights = cac_weights_chelsea_pro;
2071 si_pi->dte_data = dte_data_cape_verde;
2072 break;
2073 case 0x6820:
2074 si_pi->cac_weights = cac_weights_heathrow;
2075 si_pi->dte_data = dte_data_venus_xtx;
2076 break;
2077 case 0x6821:
2078 si_pi->cac_weights = cac_weights_heathrow;
2079 si_pi->dte_data = dte_data_venus_xt;
2080 break;
2081 case 0x6823:
2082 case 0x682B:
2083 case 0x6822:
2084 case 0x682A:
2085 si_pi->cac_weights = cac_weights_chelsea_pro;
2086 si_pi->dte_data = dte_data_venus_pro;
2087 break;
2088 default:
2089 si_pi->cac_weights = cac_weights_cape_verde;
2090 si_pi->dte_data = dte_data_cape_verde;
2091 break;
2092 }
2093 } else if (adev->asic_type == CHIP_OLAND) {
2094 si_pi->lcac_config = lcac_mars_pro;
2095 si_pi->cac_override = cac_override_oland;
2096 si_pi->powertune_data = &powertune_data_mars_pro;
2097 si_pi->dte_data = dte_data_mars_pro;
2098
2099 switch (adev->pdev->device) {
2100 case 0x6601:
2101 case 0x6621:
2102 case 0x6603:
2103 case 0x6605:
2104 si_pi->cac_weights = cac_weights_mars_pro;
2105 update_dte_from_pl2 = true;
2106 break;
2107 case 0x6600:
2108 case 0x6606:
2109 case 0x6620:
2110 case 0x6604:
2111 si_pi->cac_weights = cac_weights_mars_xt;
2112 update_dte_from_pl2 = true;
2113 break;
2114 case 0x6611:
2115 case 0x6613:
2116 case 0x6608:
2117 si_pi->cac_weights = cac_weights_oland_pro;
2118 update_dte_from_pl2 = true;
2119 break;
2120 case 0x6610:
2121 si_pi->cac_weights = cac_weights_oland_xt;
2122 update_dte_from_pl2 = true;
2123 break;
2124 default:
2125 si_pi->cac_weights = cac_weights_oland;
2126 si_pi->lcac_config = lcac_oland;
2127 si_pi->cac_override = cac_override_oland;
2128 si_pi->powertune_data = &powertune_data_oland;
2129 si_pi->dte_data = dte_data_oland;
2130 break;
2131 }
2132 } else if (adev->asic_type == CHIP_HAINAN) {
2133 si_pi->cac_weights = cac_weights_hainan;
2134 si_pi->lcac_config = lcac_oland;
2135 si_pi->cac_override = cac_override_oland;
2136 si_pi->powertune_data = &powertune_data_hainan;
2137 si_pi->dte_data = dte_data_sun_xt;
2138 update_dte_from_pl2 = true;
2139 } else {
2140 DRM_ERROR("Unknown SI asic revision, failed to initialize PowerTune!\n");
2141 return;
2142 }
2143
2144 ni_pi->enable_power_containment = false;
2145 ni_pi->enable_cac = false;
2146 ni_pi->enable_sq_ramping = false;
2147 si_pi->enable_dte = false;
2148
2149 if (si_pi->powertune_data->enable_powertune_by_default) {
2150 ni_pi->enable_power_containment = true;
2151 ni_pi->enable_cac = true;
2152 if (si_pi->dte_data.enable_dte_by_default) {
2153 si_pi->enable_dte = true;
2154 if (update_dte_from_pl2)
2155 si_update_dte_from_pl2(adev, &si_pi->dte_data);
2156
2157 }
2158 ni_pi->enable_sq_ramping = true;
2159 }
2160
2161 ni_pi->driver_calculate_cac_leakage = true;
2162 ni_pi->cac_configuration_required = true;
2163
2164 if (ni_pi->cac_configuration_required) {
2165 ni_pi->support_cac_long_term_average = true;
2166 si_pi->dyn_powertune_data.l2_lta_window_size =
2167 si_pi->powertune_data->l2_lta_window_size_default;
2168 si_pi->dyn_powertune_data.lts_truncate =
2169 si_pi->powertune_data->lts_truncate_default;
2170 } else {
2171 ni_pi->support_cac_long_term_average = false;
2172 si_pi->dyn_powertune_data.l2_lta_window_size = 0;
2173 si_pi->dyn_powertune_data.lts_truncate = 0;
2174 }
2175
2176 si_pi->dyn_powertune_data.disable_uvd_powertune = false;
2177}
2178
2179static u32 si_get_smc_power_scaling_factor(struct amdgpu_device *adev)
2180{
2181 return 1;
2182}
2183
2184static u32 si_calculate_cac_wintime(struct amdgpu_device *adev)
2185{
2186 u32 xclk;
2187 u32 wintime;
2188 u32 cac_window;
2189 u32 cac_window_size;
2190
2191 xclk = amdgpu_asic_get_xclk(adev);
2192
2193 if (xclk == 0)
2194 return 0;
2195
2196 cac_window = RREG32(CG_CAC_CTRL) & CAC_WINDOW_MASK;
2197 cac_window_size = ((cac_window & 0xFFFF0000) >> 16) * (cac_window & 0x0000FFFF);
2198
2199 wintime = (cac_window_size * 100) / xclk;
2200
2201 return wintime;
2202}
2203
2204static u32 si_scale_power_for_smc(u32 power_in_watts, u32 scaling_factor)
2205{
2206 return power_in_watts;
2207}
2208
2209static int si_calculate_adjusted_tdp_limits(struct amdgpu_device *adev,
2210 bool adjust_polarity,
2211 u32 tdp_adjustment,
2212 u32 *tdp_limit,
2213 u32 *near_tdp_limit)
2214{
2215 u32 adjustment_delta, max_tdp_limit;
2216
2217 if (tdp_adjustment > (u32)adev->pm.dpm.tdp_od_limit)
2218 return -EINVAL;
2219
2220 max_tdp_limit = ((100 + 100) * adev->pm.dpm.tdp_limit) / 100;
2221
2222 if (adjust_polarity) {
2223 *tdp_limit = ((100 + tdp_adjustment) * adev->pm.dpm.tdp_limit) / 100;
2224 *near_tdp_limit = adev->pm.dpm.near_tdp_limit_adjusted + (*tdp_limit - adev->pm.dpm.tdp_limit);
2225 } else {
2226 *tdp_limit = ((100 - tdp_adjustment) * adev->pm.dpm.tdp_limit) / 100;
2227 adjustment_delta = adev->pm.dpm.tdp_limit - *tdp_limit;
2228 if (adjustment_delta < adev->pm.dpm.near_tdp_limit_adjusted)
2229 *near_tdp_limit = adev->pm.dpm.near_tdp_limit_adjusted - adjustment_delta;
2230 else
2231 *near_tdp_limit = 0;
2232 }
2233
2234 if ((*tdp_limit <= 0) || (*tdp_limit > max_tdp_limit))
2235 return -EINVAL;
2236 if ((*near_tdp_limit <= 0) || (*near_tdp_limit > *tdp_limit))
2237 return -EINVAL;
2238
2239 return 0;
2240}
2241
2242static int si_populate_smc_tdp_limits(struct amdgpu_device *adev,
2243 struct amdgpu_ps *amdgpu_state)
2244{
2245 struct ni_power_info *ni_pi = ni_get_pi(adev);
2246 struct si_power_info *si_pi = si_get_pi(adev);
2247
2248 if (ni_pi->enable_power_containment) {
2249 SISLANDS_SMC_STATETABLE *smc_table = &si_pi->smc_statetable;
2250 PP_SIslands_PAPMParameters *papm_parm;
2251 struct amdgpu_ppm_table *ppm = adev->pm.dpm.dyn_state.ppm_table;
2252 u32 scaling_factor = si_get_smc_power_scaling_factor(adev);
2253 u32 tdp_limit;
2254 u32 near_tdp_limit;
2255 int ret;
2256
2257 if (scaling_factor == 0)
2258 return -EINVAL;
2259
2260 memset(smc_table, 0, sizeof(SISLANDS_SMC_STATETABLE));
2261
2262 ret = si_calculate_adjusted_tdp_limits(adev,
2263 false, /* ??? */
2264 adev->pm.dpm.tdp_adjustment,
2265 &tdp_limit,
2266 &near_tdp_limit);
2267 if (ret)
2268 return ret;
2269
2270 smc_table->dpm2Params.TDPLimit =
2271 cpu_to_be32(si_scale_power_for_smc(tdp_limit, scaling_factor) * 1000);
2272 smc_table->dpm2Params.NearTDPLimit =
2273 cpu_to_be32(si_scale_power_for_smc(near_tdp_limit, scaling_factor) * 1000);
2274 smc_table->dpm2Params.SafePowerLimit =
2275 cpu_to_be32(si_scale_power_for_smc((near_tdp_limit * SISLANDS_DPM2_TDP_SAFE_LIMIT_PERCENT) / 100, scaling_factor) * 1000);
2276
2277 ret = amdgpu_si_copy_bytes_to_smc(adev,
2278 (si_pi->state_table_start + offsetof(SISLANDS_SMC_STATETABLE, dpm2Params) +
2279 offsetof(PP_SIslands_DPM2Parameters, TDPLimit)),
2280 (u8 *)(&(smc_table->dpm2Params.TDPLimit)),
2281 sizeof(u32) * 3,
2282 si_pi->sram_end);
2283 if (ret)
2284 return ret;
2285
2286 if (si_pi->enable_ppm) {
2287 papm_parm = &si_pi->papm_parm;
2288 memset(papm_parm, 0, sizeof(PP_SIslands_PAPMParameters));
2289 papm_parm->NearTDPLimitTherm = cpu_to_be32(ppm->dgpu_tdp);
2290 papm_parm->dGPU_T_Limit = cpu_to_be32(ppm->tj_max);
2291 papm_parm->dGPU_T_Warning = cpu_to_be32(95);
2292 papm_parm->dGPU_T_Hysteresis = cpu_to_be32(5);
2293 papm_parm->PlatformPowerLimit = 0xffffffff;
2294 papm_parm->NearTDPLimitPAPM = 0xffffffff;
2295
2296 ret = amdgpu_si_copy_bytes_to_smc(adev, si_pi->papm_cfg_table_start,
2297 (u8 *)papm_parm,
2298 sizeof(PP_SIslands_PAPMParameters),
2299 si_pi->sram_end);
2300 if (ret)
2301 return ret;
2302 }
2303 }
2304 return 0;
2305}
2306
2307static int si_populate_smc_tdp_limits_2(struct amdgpu_device *adev,
2308 struct amdgpu_ps *amdgpu_state)
2309{
2310 struct ni_power_info *ni_pi = ni_get_pi(adev);
2311 struct si_power_info *si_pi = si_get_pi(adev);
2312
2313 if (ni_pi->enable_power_containment) {
2314 SISLANDS_SMC_STATETABLE *smc_table = &si_pi->smc_statetable;
2315 u32 scaling_factor = si_get_smc_power_scaling_factor(adev);
2316 int ret;
2317
2318 memset(smc_table, 0, sizeof(SISLANDS_SMC_STATETABLE));
2319
2320 smc_table->dpm2Params.NearTDPLimit =
2321 cpu_to_be32(si_scale_power_for_smc(adev->pm.dpm.near_tdp_limit_adjusted, scaling_factor) * 1000);
2322 smc_table->dpm2Params.SafePowerLimit =
2323 cpu_to_be32(si_scale_power_for_smc((adev->pm.dpm.near_tdp_limit_adjusted * SISLANDS_DPM2_TDP_SAFE_LIMIT_PERCENT) / 100, scaling_factor) * 1000);
2324
2325 ret = amdgpu_si_copy_bytes_to_smc(adev,
2326 (si_pi->state_table_start +
2327 offsetof(SISLANDS_SMC_STATETABLE, dpm2Params) +
2328 offsetof(PP_SIslands_DPM2Parameters, NearTDPLimit)),
2329 (u8 *)(&(smc_table->dpm2Params.NearTDPLimit)),
2330 sizeof(u32) * 2,
2331 si_pi->sram_end);
2332 if (ret)
2333 return ret;
2334 }
2335
2336 return 0;
2337}
2338
2339static u16 si_calculate_power_efficiency_ratio(struct amdgpu_device *adev,
2340 const u16 prev_std_vddc,
2341 const u16 curr_std_vddc)
2342{
2343 u64 margin = (u64)SISLANDS_DPM2_PWREFFICIENCYRATIO_MARGIN;
2344 u64 prev_vddc = (u64)prev_std_vddc;
2345 u64 curr_vddc = (u64)curr_std_vddc;
2346 u64 pwr_efficiency_ratio, n, d;
2347
2348 if ((prev_vddc == 0) || (curr_vddc == 0))
2349 return 0;
2350
2351 n = div64_u64((u64)1024 * curr_vddc * curr_vddc * ((u64)1000 + margin), (u64)1000);
2352 d = prev_vddc * prev_vddc;
2353 pwr_efficiency_ratio = div64_u64(n, d);
2354
2355 if (pwr_efficiency_ratio > (u64)0xFFFF)
2356 return 0;
2357
2358 return (u16)pwr_efficiency_ratio;
2359}
2360
2361static bool si_should_disable_uvd_powertune(struct amdgpu_device *adev,
2362 struct amdgpu_ps *amdgpu_state)
2363{
2364 struct si_power_info *si_pi = si_get_pi(adev);
2365
2366 if (si_pi->dyn_powertune_data.disable_uvd_powertune &&
2367 amdgpu_state->vclk && amdgpu_state->dclk)
2368 return true;
2369
2370 return false;
2371}
2372
2373struct evergreen_power_info *evergreen_get_pi(struct amdgpu_device *adev)
2374{
2375 struct evergreen_power_info *pi = adev->pm.dpm.priv;
2376
2377 return pi;
2378}
2379
2380static int si_populate_power_containment_values(struct amdgpu_device *adev,
2381 struct amdgpu_ps *amdgpu_state,
2382 SISLANDS_SMC_SWSTATE *smc_state)
2383{
2384 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
2385 struct ni_power_info *ni_pi = ni_get_pi(adev);
2386 struct si_ps *state = si_get_ps(amdgpu_state);
2387 SISLANDS_SMC_VOLTAGE_VALUE vddc;
2388 u32 prev_sclk;
2389 u32 max_sclk;
2390 u32 min_sclk;
2391 u16 prev_std_vddc;
2392 u16 curr_std_vddc;
2393 int i;
2394 u16 pwr_efficiency_ratio;
2395 u8 max_ps_percent;
2396 bool disable_uvd_power_tune;
2397 int ret;
2398
2399 if (ni_pi->enable_power_containment == false)
2400 return 0;
2401
2402 if (state->performance_level_count == 0)
2403 return -EINVAL;
2404
2405 if (smc_state->levelCount != state->performance_level_count)
2406 return -EINVAL;
2407
2408 disable_uvd_power_tune = si_should_disable_uvd_powertune(adev, amdgpu_state);
2409
2410 smc_state->levels[0].dpm2.MaxPS = 0;
2411 smc_state->levels[0].dpm2.NearTDPDec = 0;
2412 smc_state->levels[0].dpm2.AboveSafeInc = 0;
2413 smc_state->levels[0].dpm2.BelowSafeInc = 0;
2414 smc_state->levels[0].dpm2.PwrEfficiencyRatio = 0;
2415
2416 for (i = 1; i < state->performance_level_count; i++) {
2417 prev_sclk = state->performance_levels[i-1].sclk;
2418 max_sclk = state->performance_levels[i].sclk;
2419 if (i == 1)
2420 max_ps_percent = SISLANDS_DPM2_MAXPS_PERCENT_M;
2421 else
2422 max_ps_percent = SISLANDS_DPM2_MAXPS_PERCENT_H;
2423
2424 if (prev_sclk > max_sclk)
2425 return -EINVAL;
2426
2427 if ((max_ps_percent == 0) ||
2428 (prev_sclk == max_sclk) ||
2429 disable_uvd_power_tune)
2430 min_sclk = max_sclk;
2431 else if (i == 1)
2432 min_sclk = prev_sclk;
2433 else
2434 min_sclk = (prev_sclk * (u32)max_ps_percent) / 100;
2435
2436 if (min_sclk < state->performance_levels[0].sclk)
2437 min_sclk = state->performance_levels[0].sclk;
2438
2439 if (min_sclk == 0)
2440 return -EINVAL;
2441
2442 ret = si_populate_voltage_value(adev, &eg_pi->vddc_voltage_table,
2443 state->performance_levels[i-1].vddc, &vddc);
2444 if (ret)
2445 return ret;
2446
2447 ret = si_get_std_voltage_value(adev, &vddc, &prev_std_vddc);
2448 if (ret)
2449 return ret;
2450
2451 ret = si_populate_voltage_value(adev, &eg_pi->vddc_voltage_table,
2452 state->performance_levels[i].vddc, &vddc);
2453 if (ret)
2454 return ret;
2455
2456 ret = si_get_std_voltage_value(adev, &vddc, &curr_std_vddc);
2457 if (ret)
2458 return ret;
2459
2460 pwr_efficiency_ratio = si_calculate_power_efficiency_ratio(adev,
2461 prev_std_vddc, curr_std_vddc);
2462
2463 smc_state->levels[i].dpm2.MaxPS = (u8)((SISLANDS_DPM2_MAX_PULSE_SKIP * (max_sclk - min_sclk)) / max_sclk);
2464 smc_state->levels[i].dpm2.NearTDPDec = SISLANDS_DPM2_NEAR_TDP_DEC;
2465 smc_state->levels[i].dpm2.AboveSafeInc = SISLANDS_DPM2_ABOVE_SAFE_INC;
2466 smc_state->levels[i].dpm2.BelowSafeInc = SISLANDS_DPM2_BELOW_SAFE_INC;
2467 smc_state->levels[i].dpm2.PwrEfficiencyRatio = cpu_to_be16(pwr_efficiency_ratio);
2468 }
2469
2470 return 0;
2471}
2472
2473static int si_populate_sq_ramping_values(struct amdgpu_device *adev,
2474 struct amdgpu_ps *amdgpu_state,
2475 SISLANDS_SMC_SWSTATE *smc_state)
2476{
2477 struct ni_power_info *ni_pi = ni_get_pi(adev);
2478 struct si_ps *state = si_get_ps(amdgpu_state);
2479 u32 sq_power_throttle, sq_power_throttle2;
2480 bool enable_sq_ramping = ni_pi->enable_sq_ramping;
2481 int i;
2482
2483 if (state->performance_level_count == 0)
2484 return -EINVAL;
2485
2486 if (smc_state->levelCount != state->performance_level_count)
2487 return -EINVAL;
2488
2489 if (adev->pm.dpm.sq_ramping_threshold == 0)
2490 return -EINVAL;
2491
2492 if (SISLANDS_DPM2_SQ_RAMP_MAX_POWER > (MAX_POWER_MASK >> MAX_POWER_SHIFT))
2493 enable_sq_ramping = false;
2494
2495 if (SISLANDS_DPM2_SQ_RAMP_MIN_POWER > (MIN_POWER_MASK >> MIN_POWER_SHIFT))
2496 enable_sq_ramping = false;
2497
2498 if (SISLANDS_DPM2_SQ_RAMP_MAX_POWER_DELTA > (MAX_POWER_DELTA_MASK >> MAX_POWER_DELTA_SHIFT))
2499 enable_sq_ramping = false;
2500
2501 if (SISLANDS_DPM2_SQ_RAMP_STI_SIZE > (STI_SIZE_MASK >> STI_SIZE_SHIFT))
2502 enable_sq_ramping = false;
2503
2504 if (SISLANDS_DPM2_SQ_RAMP_LTI_RATIO > (LTI_RATIO_MASK >> LTI_RATIO_SHIFT))
2505 enable_sq_ramping = false;
2506
2507 for (i = 0; i < state->performance_level_count; i++) {
2508 sq_power_throttle = 0;
2509 sq_power_throttle2 = 0;
2510
2511 if ((state->performance_levels[i].sclk >= adev->pm.dpm.sq_ramping_threshold) &&
2512 enable_sq_ramping) {
2513 sq_power_throttle |= MAX_POWER(SISLANDS_DPM2_SQ_RAMP_MAX_POWER);
2514 sq_power_throttle |= MIN_POWER(SISLANDS_DPM2_SQ_RAMP_MIN_POWER);
2515 sq_power_throttle2 |= MAX_POWER_DELTA(SISLANDS_DPM2_SQ_RAMP_MAX_POWER_DELTA);
2516 sq_power_throttle2 |= STI_SIZE(SISLANDS_DPM2_SQ_RAMP_STI_SIZE);
2517 sq_power_throttle2 |= LTI_RATIO(SISLANDS_DPM2_SQ_RAMP_LTI_RATIO);
2518 } else {
2519 sq_power_throttle |= MAX_POWER_MASK | MIN_POWER_MASK;
2520 sq_power_throttle2 |= MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK;
2521 }
2522
2523 smc_state->levels[i].SQPowerThrottle = cpu_to_be32(sq_power_throttle);
2524 smc_state->levels[i].SQPowerThrottle_2 = cpu_to_be32(sq_power_throttle2);
2525 }
2526
2527 return 0;
2528}
2529
2530static int si_enable_power_containment(struct amdgpu_device *adev,
2531 struct amdgpu_ps *amdgpu_new_state,
2532 bool enable)
2533{
2534 struct ni_power_info *ni_pi = ni_get_pi(adev);
2535 PPSMC_Result smc_result;
2536 int ret = 0;
2537
2538 if (ni_pi->enable_power_containment) {
2539 if (enable) {
2540 if (!si_should_disable_uvd_powertune(adev, amdgpu_new_state)) {
2541 smc_result = amdgpu_si_send_msg_to_smc(adev, PPSMC_TDPClampingActive);
2542 if (smc_result != PPSMC_Result_OK) {
2543 ret = -EINVAL;
2544 ni_pi->pc_enabled = false;
2545 } else {
2546 ni_pi->pc_enabled = true;
2547 }
2548 }
2549 } else {
2550 smc_result = amdgpu_si_send_msg_to_smc(adev, PPSMC_TDPClampingInactive);
2551 if (smc_result != PPSMC_Result_OK)
2552 ret = -EINVAL;
2553 ni_pi->pc_enabled = false;
2554 }
2555 }
2556
2557 return ret;
2558}
2559
2560static int si_initialize_smc_dte_tables(struct amdgpu_device *adev)
2561{
2562 struct si_power_info *si_pi = si_get_pi(adev);
2563 int ret = 0;
2564 struct si_dte_data *dte_data = &si_pi->dte_data;
2565 Smc_SIslands_DTE_Configuration *dte_tables = NULL;
2566 u32 table_size;
2567 u8 tdep_count;
2568 u32 i;
2569
2570 if (dte_data == NULL)
2571 si_pi->enable_dte = false;
2572
2573 if (si_pi->enable_dte == false)
2574 return 0;
2575
2576 if (dte_data->k <= 0)
2577 return -EINVAL;
2578
2579 dte_tables = kzalloc(sizeof(Smc_SIslands_DTE_Configuration), GFP_KERNEL);
2580 if (dte_tables == NULL) {
2581 si_pi->enable_dte = false;
2582 return -ENOMEM;
2583 }
2584
2585 table_size = dte_data->k;
2586
2587 if (table_size > SMC_SISLANDS_DTE_MAX_FILTER_STAGES)
2588 table_size = SMC_SISLANDS_DTE_MAX_FILTER_STAGES;
2589
2590 tdep_count = dte_data->tdep_count;
2591 if (tdep_count > SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE)
2592 tdep_count = SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE;
2593
2594 dte_tables->K = cpu_to_be32(table_size);
2595 dte_tables->T0 = cpu_to_be32(dte_data->t0);
2596 dte_tables->MaxT = cpu_to_be32(dte_data->max_t);
2597 dte_tables->WindowSize = dte_data->window_size;
2598 dte_tables->temp_select = dte_data->temp_select;
2599 dte_tables->DTE_mode = dte_data->dte_mode;
2600 dte_tables->Tthreshold = cpu_to_be32(dte_data->t_threshold);
2601
2602 if (tdep_count > 0)
2603 table_size--;
2604
2605 for (i = 0; i < table_size; i++) {
2606 dte_tables->tau[i] = cpu_to_be32(dte_data->tau[i]);
2607 dte_tables->R[i] = cpu_to_be32(dte_data->r[i]);
2608 }
2609
2610 dte_tables->Tdep_count = tdep_count;
2611
2612 for (i = 0; i < (u32)tdep_count; i++) {
2613 dte_tables->T_limits[i] = dte_data->t_limits[i];
2614 dte_tables->Tdep_tau[i] = cpu_to_be32(dte_data->tdep_tau[i]);
2615 dte_tables->Tdep_R[i] = cpu_to_be32(dte_data->tdep_r[i]);
2616 }
2617
2618 ret = amdgpu_si_copy_bytes_to_smc(adev, si_pi->dte_table_start,
2619 (u8 *)dte_tables,
2620 sizeof(Smc_SIslands_DTE_Configuration),
2621 si_pi->sram_end);
2622 kfree(dte_tables);
2623
2624 return ret;
2625}
2626
2627static int si_get_cac_std_voltage_max_min(struct amdgpu_device *adev,
2628 u16 *max, u16 *min)
2629{
2630 struct si_power_info *si_pi = si_get_pi(adev);
2631 struct amdgpu_cac_leakage_table *table =
2632 &adev->pm.dpm.dyn_state.cac_leakage_table;
2633 u32 i;
2634 u32 v0_loadline;
2635
2636 if (table == NULL)
2637 return -EINVAL;
2638
2639 *max = 0;
2640 *min = 0xFFFF;
2641
2642 for (i = 0; i < table->count; i++) {
2643 if (table->entries[i].vddc > *max)
2644 *max = table->entries[i].vddc;
2645 if (table->entries[i].vddc < *min)
2646 *min = table->entries[i].vddc;
2647 }
2648
2649 if (si_pi->powertune_data->lkge_lut_v0_percent > 100)
2650 return -EINVAL;
2651
2652 v0_loadline = (*min) * (100 - si_pi->powertune_data->lkge_lut_v0_percent) / 100;
2653
2654 if (v0_loadline > 0xFFFFUL)
2655 return -EINVAL;
2656
2657 *min = (u16)v0_loadline;
2658
2659 if ((*min > *max) || (*max == 0) || (*min == 0))
2660 return -EINVAL;
2661
2662 return 0;
2663}
2664
2665static u16 si_get_cac_std_voltage_step(u16 max, u16 min)
2666{
2667 return ((max - min) + (SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES - 1)) /
2668 SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES;
2669}
2670
2671static int si_init_dte_leakage_table(struct amdgpu_device *adev,
2672 PP_SIslands_CacConfig *cac_tables,
2673 u16 vddc_max, u16 vddc_min, u16 vddc_step,
2674 u16 t0, u16 t_step)
2675{
2676 struct si_power_info *si_pi = si_get_pi(adev);
2677 u32 leakage;
2678 unsigned int i, j;
2679 s32 t;
2680 u32 smc_leakage;
2681 u32 scaling_factor;
2682 u16 voltage;
2683
2684 scaling_factor = si_get_smc_power_scaling_factor(adev);
2685
2686 for (i = 0; i < SMC_SISLANDS_LKGE_LUT_NUM_OF_TEMP_ENTRIES ; i++) {
2687 t = (1000 * (i * t_step + t0));
2688
2689 for (j = 0; j < SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES; j++) {
2690 voltage = vddc_max - (vddc_step * j);
2691
2692 si_calculate_leakage_for_v_and_t(adev,
2693 &si_pi->powertune_data->leakage_coefficients,
2694 voltage,
2695 t,
2696 si_pi->dyn_powertune_data.cac_leakage,
2697 &leakage);
2698
2699 smc_leakage = si_scale_power_for_smc(leakage, scaling_factor) / 4;
2700
2701 if (smc_leakage > 0xFFFF)
2702 smc_leakage = 0xFFFF;
2703
2704 cac_tables->cac_lkge_lut[i][SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES-1-j] =
2705 cpu_to_be16((u16)smc_leakage);
2706 }
2707 }
2708 return 0;
2709}
2710
2711static int si_init_simplified_leakage_table(struct amdgpu_device *adev,
2712 PP_SIslands_CacConfig *cac_tables,
2713 u16 vddc_max, u16 vddc_min, u16 vddc_step)
2714{
2715 struct si_power_info *si_pi = si_get_pi(adev);
2716 u32 leakage;
2717 unsigned int i, j;
2718 u32 smc_leakage;
2719 u32 scaling_factor;
2720 u16 voltage;
2721
2722 scaling_factor = si_get_smc_power_scaling_factor(adev);
2723
2724 for (j = 0; j < SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES; j++) {
2725 voltage = vddc_max - (vddc_step * j);
2726
2727 si_calculate_leakage_for_v(adev,
2728 &si_pi->powertune_data->leakage_coefficients,
2729 si_pi->powertune_data->fixed_kt,
2730 voltage,
2731 si_pi->dyn_powertune_data.cac_leakage,
2732 &leakage);
2733
2734 smc_leakage = si_scale_power_for_smc(leakage, scaling_factor) / 4;
2735
2736 if (smc_leakage > 0xFFFF)
2737 smc_leakage = 0xFFFF;
2738
2739 for (i = 0; i < SMC_SISLANDS_LKGE_LUT_NUM_OF_TEMP_ENTRIES ; i++)
2740 cac_tables->cac_lkge_lut[i][SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES-1-j] =
2741 cpu_to_be16((u16)smc_leakage);
2742 }
2743 return 0;
2744}
2745
2746static int si_initialize_smc_cac_tables(struct amdgpu_device *adev)
2747{
2748 struct ni_power_info *ni_pi = ni_get_pi(adev);
2749 struct si_power_info *si_pi = si_get_pi(adev);
2750 PP_SIslands_CacConfig *cac_tables = NULL;
2751 u16 vddc_max, vddc_min, vddc_step;
2752 u16 t0, t_step;
2753 u32 load_line_slope, reg;
2754 int ret = 0;
2755 u32 ticks_per_us = amdgpu_asic_get_xclk(adev) / 100;
2756
2757 if (ni_pi->enable_cac == false)
2758 return 0;
2759
2760 cac_tables = kzalloc(sizeof(PP_SIslands_CacConfig), GFP_KERNEL);
2761 if (!cac_tables)
2762 return -ENOMEM;
2763
2764 reg = RREG32(CG_CAC_CTRL) & ~CAC_WINDOW_MASK;
2765 reg |= CAC_WINDOW(si_pi->powertune_data->cac_window);
2766 WREG32(CG_CAC_CTRL, reg);
2767
2768 si_pi->dyn_powertune_data.cac_leakage = adev->pm.dpm.cac_leakage;
2769 si_pi->dyn_powertune_data.dc_pwr_value =
2770 si_pi->powertune_data->dc_cac[NISLANDS_DCCAC_LEVEL_0];
2771 si_pi->dyn_powertune_data.wintime = si_calculate_cac_wintime(adev);
2772 si_pi->dyn_powertune_data.shift_n = si_pi->powertune_data->shift_n_default;
2773
2774 si_pi->dyn_powertune_data.leakage_minimum_temperature = 80 * 1000;
2775
2776 ret = si_get_cac_std_voltage_max_min(adev, &vddc_max, &vddc_min);
2777 if (ret)
2778 goto done_free;
2779
2780 vddc_step = si_get_cac_std_voltage_step(vddc_max, vddc_min);
2781 vddc_min = vddc_max - (vddc_step * (SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES - 1));
2782 t_step = 4;
2783 t0 = 60;
2784
2785 if (si_pi->enable_dte || ni_pi->driver_calculate_cac_leakage)
2786 ret = si_init_dte_leakage_table(adev, cac_tables,
2787 vddc_max, vddc_min, vddc_step,
2788 t0, t_step);
2789 else
2790 ret = si_init_simplified_leakage_table(adev, cac_tables,
2791 vddc_max, vddc_min, vddc_step);
2792 if (ret)
2793 goto done_free;
2794
2795 load_line_slope = ((u32)adev->pm.dpm.load_line_slope << SMC_SISLANDS_SCALE_R) / 100;
2796
2797 cac_tables->l2numWin_TDP = cpu_to_be32(si_pi->dyn_powertune_data.l2_lta_window_size);
2798 cac_tables->lts_truncate_n = si_pi->dyn_powertune_data.lts_truncate;
2799 cac_tables->SHIFT_N = si_pi->dyn_powertune_data.shift_n;
2800 cac_tables->lkge_lut_V0 = cpu_to_be32((u32)vddc_min);
2801 cac_tables->lkge_lut_Vstep = cpu_to_be32((u32)vddc_step);
2802 cac_tables->R_LL = cpu_to_be32(load_line_slope);
2803 cac_tables->WinTime = cpu_to_be32(si_pi->dyn_powertune_data.wintime);
2804 cac_tables->calculation_repeats = cpu_to_be32(2);
2805 cac_tables->dc_cac = cpu_to_be32(0);
2806 cac_tables->log2_PG_LKG_SCALE = 12;
2807 cac_tables->cac_temp = si_pi->powertune_data->operating_temp;
2808 cac_tables->lkge_lut_T0 = cpu_to_be32((u32)t0);
2809 cac_tables->lkge_lut_Tstep = cpu_to_be32((u32)t_step);
2810
2811 ret = amdgpu_si_copy_bytes_to_smc(adev, si_pi->cac_table_start,
2812 (u8 *)cac_tables,
2813 sizeof(PP_SIslands_CacConfig),
2814 si_pi->sram_end);
2815
2816 if (ret)
2817 goto done_free;
2818
2819 ret = si_write_smc_soft_register(adev, SI_SMC_SOFT_REGISTER_ticks_per_us, ticks_per_us);
2820
2821done_free:
2822 if (ret) {
2823 ni_pi->enable_cac = false;
2824 ni_pi->enable_power_containment = false;
2825 }
2826
2827 kfree(cac_tables);
2828
2829 return ret;
2830}
2831
2832static int si_program_cac_config_registers(struct amdgpu_device *adev,
2833 const struct si_cac_config_reg *cac_config_regs)
2834{
2835 const struct si_cac_config_reg *config_regs = cac_config_regs;
2836 u32 data = 0, offset;
2837
2838 if (!config_regs)
2839 return -EINVAL;
2840
2841 while (config_regs->offset != 0xFFFFFFFF) {
2842 switch (config_regs->type) {
2843 case SISLANDS_CACCONFIG_CGIND:
2844 offset = SMC_CG_IND_START + config_regs->offset;
2845 if (offset < SMC_CG_IND_END)
2846 data = RREG32_SMC(offset);
2847 break;
2848 default:
2849 data = RREG32(config_regs->offset);
2850 break;
2851 }
2852
2853 data &= ~config_regs->mask;
2854 data |= ((config_regs->value << config_regs->shift) & config_regs->mask);
2855
2856 switch (config_regs->type) {
2857 case SISLANDS_CACCONFIG_CGIND:
2858 offset = SMC_CG_IND_START + config_regs->offset;
2859 if (offset < SMC_CG_IND_END)
2860 WREG32_SMC(offset, data);
2861 break;
2862 default:
2863 WREG32(config_regs->offset, data);
2864 break;
2865 }
2866 config_regs++;
2867 }
2868 return 0;
2869}
2870
2871static int si_initialize_hardware_cac_manager(struct amdgpu_device *adev)
2872{
2873 struct ni_power_info *ni_pi = ni_get_pi(adev);
2874 struct si_power_info *si_pi = si_get_pi(adev);
2875 int ret;
2876
2877 if ((ni_pi->enable_cac == false) ||
2878 (ni_pi->cac_configuration_required == false))
2879 return 0;
2880
2881 ret = si_program_cac_config_registers(adev, si_pi->lcac_config);
2882 if (ret)
2883 return ret;
2884 ret = si_program_cac_config_registers(adev, si_pi->cac_override);
2885 if (ret)
2886 return ret;
2887 ret = si_program_cac_config_registers(adev, si_pi->cac_weights);
2888 if (ret)
2889 return ret;
2890
2891 return 0;
2892}
2893
2894static int si_enable_smc_cac(struct amdgpu_device *adev,
2895 struct amdgpu_ps *amdgpu_new_state,
2896 bool enable)
2897{
2898 struct ni_power_info *ni_pi = ni_get_pi(adev);
2899 struct si_power_info *si_pi = si_get_pi(adev);
2900 PPSMC_Result smc_result;
2901 int ret = 0;
2902
2903 if (ni_pi->enable_cac) {
2904 if (enable) {
2905 if (!si_should_disable_uvd_powertune(adev, amdgpu_new_state)) {
2906 if (ni_pi->support_cac_long_term_average) {
2907 smc_result = amdgpu_si_send_msg_to_smc(adev, PPSMC_CACLongTermAvgEnable);
2908 if (smc_result != PPSMC_Result_OK)
2909 ni_pi->support_cac_long_term_average = false;
2910 }
2911
2912 smc_result = amdgpu_si_send_msg_to_smc(adev, PPSMC_MSG_EnableCac);
2913 if (smc_result != PPSMC_Result_OK) {
2914 ret = -EINVAL;
2915 ni_pi->cac_enabled = false;
2916 } else {
2917 ni_pi->cac_enabled = true;
2918 }
2919
2920 if (si_pi->enable_dte) {
2921 smc_result = amdgpu_si_send_msg_to_smc(adev, PPSMC_MSG_EnableDTE);
2922 if (smc_result != PPSMC_Result_OK)
2923 ret = -EINVAL;
2924 }
2925 }
2926 } else if (ni_pi->cac_enabled) {
2927 if (si_pi->enable_dte)
2928 smc_result = amdgpu_si_send_msg_to_smc(adev, PPSMC_MSG_DisableDTE);
2929
2930 smc_result = amdgpu_si_send_msg_to_smc(adev, PPSMC_MSG_DisableCac);
2931
2932 ni_pi->cac_enabled = false;
2933
2934 if (ni_pi->support_cac_long_term_average)
2935 smc_result = amdgpu_si_send_msg_to_smc(adev, PPSMC_CACLongTermAvgDisable);
2936 }
2937 }
2938 return ret;
2939}
2940
2941static int si_init_smc_spll_table(struct amdgpu_device *adev)
2942{
2943 struct ni_power_info *ni_pi = ni_get_pi(adev);
2944 struct si_power_info *si_pi = si_get_pi(adev);
2945 SMC_SISLANDS_SPLL_DIV_TABLE *spll_table;
2946 SISLANDS_SMC_SCLK_VALUE sclk_params;
2947 u32 fb_div, p_div;
2948 u32 clk_s, clk_v;
2949 u32 sclk = 0;
2950 int ret = 0;
2951 u32 tmp;
2952 int i;
2953
2954 if (si_pi->spll_table_start == 0)
2955 return -EINVAL;
2956
2957 spll_table = kzalloc(sizeof(SMC_SISLANDS_SPLL_DIV_TABLE), GFP_KERNEL);
2958 if (spll_table == NULL)
2959 return -ENOMEM;
2960
2961 for (i = 0; i < 256; i++) {
2962 ret = si_calculate_sclk_params(adev, sclk, &sclk_params);
2963 if (ret)
2964 break;
2965 p_div = (sclk_params.vCG_SPLL_FUNC_CNTL & SPLL_PDIV_A_MASK) >> SPLL_PDIV_A_SHIFT;
2966 fb_div = (sclk_params.vCG_SPLL_FUNC_CNTL_3 & SPLL_FB_DIV_MASK) >> SPLL_FB_DIV_SHIFT;
2967 clk_s = (sclk_params.vCG_SPLL_SPREAD_SPECTRUM & CLK_S_MASK) >> CLK_S_SHIFT;
2968 clk_v = (sclk_params.vCG_SPLL_SPREAD_SPECTRUM_2 & CLK_V_MASK) >> CLK_V_SHIFT;
2969
2970 fb_div &= ~0x00001FFF;
2971 fb_div >>= 1;
2972 clk_v >>= 6;
2973
2974 if (p_div & ~(SMC_SISLANDS_SPLL_DIV_TABLE_PDIV_MASK >> SMC_SISLANDS_SPLL_DIV_TABLE_PDIV_SHIFT))
2975 ret = -EINVAL;
2976 if (fb_div & ~(SMC_SISLANDS_SPLL_DIV_TABLE_FBDIV_MASK >> SMC_SISLANDS_SPLL_DIV_TABLE_FBDIV_SHIFT))
2977 ret = -EINVAL;
2978 if (clk_s & ~(SMC_SISLANDS_SPLL_DIV_TABLE_CLKS_MASK >> SMC_SISLANDS_SPLL_DIV_TABLE_CLKS_SHIFT))
2979 ret = -EINVAL;
2980 if (clk_v & ~(SMC_SISLANDS_SPLL_DIV_TABLE_CLKV_MASK >> SMC_SISLANDS_SPLL_DIV_TABLE_CLKV_SHIFT))
2981 ret = -EINVAL;
2982
2983 if (ret)
2984 break;
2985
2986 tmp = ((fb_div << SMC_SISLANDS_SPLL_DIV_TABLE_FBDIV_SHIFT) & SMC_SISLANDS_SPLL_DIV_TABLE_FBDIV_MASK) |
2987 ((p_div << SMC_SISLANDS_SPLL_DIV_TABLE_PDIV_SHIFT) & SMC_SISLANDS_SPLL_DIV_TABLE_PDIV_MASK);
2988 spll_table->freq[i] = cpu_to_be32(tmp);
2989
2990 tmp = ((clk_v << SMC_SISLANDS_SPLL_DIV_TABLE_CLKV_SHIFT) & SMC_SISLANDS_SPLL_DIV_TABLE_CLKV_MASK) |
2991 ((clk_s << SMC_SISLANDS_SPLL_DIV_TABLE_CLKS_SHIFT) & SMC_SISLANDS_SPLL_DIV_TABLE_CLKS_MASK);
2992 spll_table->ss[i] = cpu_to_be32(tmp);
2993
2994 sclk += 512;
2995 }
2996
2997
2998 if (!ret)
2999 ret = amdgpu_si_copy_bytes_to_smc(adev, si_pi->spll_table_start,
3000 (u8 *)spll_table,
3001 sizeof(SMC_SISLANDS_SPLL_DIV_TABLE),
3002 si_pi->sram_end);
3003
3004 if (ret)
3005 ni_pi->enable_power_containment = false;
3006
3007 kfree(spll_table);
3008
3009 return ret;
3010}
3011
3012struct si_dpm_quirk {
3013 u32 chip_vendor;
3014 u32 chip_device;
3015 u32 subsys_vendor;
3016 u32 subsys_device;
3017 u32 max_sclk;
3018 u32 max_mclk;
3019};
3020
3021/* cards with dpm stability problems */
3022static struct si_dpm_quirk si_dpm_quirk_list[] = {
3023 /* PITCAIRN - https://bugs.freedesktop.org/show_bug.cgi?id=76490 */
3024 { PCI_VENDOR_ID_ATI, 0x6810, 0x1462, 0x3036, 0, 120000 },
3025 { PCI_VENDOR_ID_ATI, 0x6811, 0x174b, 0xe271, 0, 120000 },
3026 { PCI_VENDOR_ID_ATI, 0x6811, 0x174b, 0x2015, 0, 120000 },
3027 { PCI_VENDOR_ID_ATI, 0x6810, 0x174b, 0xe271, 85000, 90000 },
3028 { PCI_VENDOR_ID_ATI, 0x6811, 0x1462, 0x2015, 0, 120000 },
3029 { PCI_VENDOR_ID_ATI, 0x6811, 0x1043, 0x2015, 0, 120000 },
3030 { PCI_VENDOR_ID_ATI, 0x6811, 0x148c, 0x2015, 0, 120000 },
3031 { PCI_VENDOR_ID_ATI, 0x6810, 0x1682, 0x9275, 0, 120000 },
3032 { 0, 0, 0, 0 },
3033};
3034
3035static u16 si_get_lower_of_leakage_and_vce_voltage(struct amdgpu_device *adev,
3036 u16 vce_voltage)
3037{
3038 u16 highest_leakage = 0;
3039 struct si_power_info *si_pi = si_get_pi(adev);
3040 int i;
3041
3042 for (i = 0; i < si_pi->leakage_voltage.count; i++){
3043 if (highest_leakage < si_pi->leakage_voltage.entries[i].voltage)
3044 highest_leakage = si_pi->leakage_voltage.entries[i].voltage;
3045 }
3046
3047 if (si_pi->leakage_voltage.count && (highest_leakage < vce_voltage))
3048 return highest_leakage;
3049
3050 return vce_voltage;
3051}
3052
3053static int si_get_vce_clock_voltage(struct amdgpu_device *adev,
3054 u32 evclk, u32 ecclk, u16 *voltage)
3055{
3056 u32 i;
3057 int ret = -EINVAL;
3058 struct amdgpu_vce_clock_voltage_dependency_table *table =
3059 &adev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table;
3060
3061 if (((evclk == 0) && (ecclk == 0)) ||
3062 (table && (table->count == 0))) {
3063 *voltage = 0;
3064 return 0;
3065 }
3066
3067 for (i = 0; i < table->count; i++) {
3068 if ((evclk <= table->entries[i].evclk) &&
3069 (ecclk <= table->entries[i].ecclk)) {
3070 *voltage = table->entries[i].v;
3071 ret = 0;
3072 break;
3073 }
3074 }
3075
3076 /* if no match return the highest voltage */
3077 if (ret)
3078 *voltage = table->entries[table->count - 1].v;
3079
3080 *voltage = si_get_lower_of_leakage_and_vce_voltage(adev, *voltage);
3081
3082 return ret;
3083}
3084
3085static bool si_dpm_vblank_too_short(struct amdgpu_device *adev)
3086{
3087
3088 u32 vblank_time = amdgpu_dpm_get_vblank_time(adev);
3089 /* we never hit the non-gddr5 limit so disable it */
3090 u32 switch_limit = adev->mc.vram_type == AMDGPU_VRAM_TYPE_GDDR5 ? 450 : 0;
3091
3092 if (vblank_time < switch_limit)
3093 return true;
3094 else
3095 return false;
3096
3097}
3098
3099static int ni_copy_and_switch_arb_sets(struct amdgpu_device *adev,
3100 u32 arb_freq_src, u32 arb_freq_dest)
3101{
3102 u32 mc_arb_dram_timing;
3103 u32 mc_arb_dram_timing2;
3104 u32 burst_time;
3105 u32 mc_cg_config;
3106
3107 switch (arb_freq_src) {
3108 case MC_CG_ARB_FREQ_F0:
3109 mc_arb_dram_timing = RREG32(MC_ARB_DRAM_TIMING);
3110 mc_arb_dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2);
3111 burst_time = (RREG32(MC_ARB_BURST_TIME) & STATE0_MASK) >> STATE0_SHIFT;
3112 break;
3113 case MC_CG_ARB_FREQ_F1:
3114 mc_arb_dram_timing = RREG32(MC_ARB_DRAM_TIMING_1);
3115 mc_arb_dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2_1);
3116 burst_time = (RREG32(MC_ARB_BURST_TIME) & STATE1_MASK) >> STATE1_SHIFT;
3117 break;
3118 case MC_CG_ARB_FREQ_F2:
3119 mc_arb_dram_timing = RREG32(MC_ARB_DRAM_TIMING_2);
3120 mc_arb_dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2_2);
3121 burst_time = (RREG32(MC_ARB_BURST_TIME) & STATE2_MASK) >> STATE2_SHIFT;
3122 break;
3123 case MC_CG_ARB_FREQ_F3:
3124 mc_arb_dram_timing = RREG32(MC_ARB_DRAM_TIMING_3);
3125 mc_arb_dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2_3);
3126 burst_time = (RREG32(MC_ARB_BURST_TIME) & STATE3_MASK) >> STATE3_SHIFT;
3127 break;
3128 default:
3129 return -EINVAL;
3130 }
3131
3132 switch (arb_freq_dest) {
3133 case MC_CG_ARB_FREQ_F0:
3134 WREG32(MC_ARB_DRAM_TIMING, mc_arb_dram_timing);
3135 WREG32(MC_ARB_DRAM_TIMING2, mc_arb_dram_timing2);
3136 WREG32_P(MC_ARB_BURST_TIME, STATE0(burst_time), ~STATE0_MASK);
3137 break;
3138 case MC_CG_ARB_FREQ_F1:
3139 WREG32(MC_ARB_DRAM_TIMING_1, mc_arb_dram_timing);
3140 WREG32(MC_ARB_DRAM_TIMING2_1, mc_arb_dram_timing2);
3141 WREG32_P(MC_ARB_BURST_TIME, STATE1(burst_time), ~STATE1_MASK);
3142 break;
3143 case MC_CG_ARB_FREQ_F2:
3144 WREG32(MC_ARB_DRAM_TIMING_2, mc_arb_dram_timing);
3145 WREG32(MC_ARB_DRAM_TIMING2_2, mc_arb_dram_timing2);
3146 WREG32_P(MC_ARB_BURST_TIME, STATE2(burst_time), ~STATE2_MASK);
3147 break;
3148 case MC_CG_ARB_FREQ_F3:
3149 WREG32(MC_ARB_DRAM_TIMING_3, mc_arb_dram_timing);
3150 WREG32(MC_ARB_DRAM_TIMING2_3, mc_arb_dram_timing2);
3151 WREG32_P(MC_ARB_BURST_TIME, STATE3(burst_time), ~STATE3_MASK);
3152 break;
3153 default:
3154 return -EINVAL;
3155 }
3156
3157 mc_cg_config = RREG32(MC_CG_CONFIG) | 0x0000000F;
3158 WREG32(MC_CG_CONFIG, mc_cg_config);
3159 WREG32_P(MC_ARB_CG, CG_ARB_REQ(arb_freq_dest), ~CG_ARB_REQ_MASK);
3160
3161 return 0;
3162}
3163
3164static void ni_update_current_ps(struct amdgpu_device *adev,
3165 struct amdgpu_ps *rps)
3166{
3167 struct si_ps *new_ps = si_get_ps(rps);
3168 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
3169 struct ni_power_info *ni_pi = ni_get_pi(adev);
3170
3171 eg_pi->current_rps = *rps;
3172 ni_pi->current_ps = *new_ps;
3173 eg_pi->current_rps.ps_priv = &ni_pi->current_ps;
3174}
3175
3176static void ni_update_requested_ps(struct amdgpu_device *adev,
3177 struct amdgpu_ps *rps)
3178{
3179 struct si_ps *new_ps = si_get_ps(rps);
3180 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
3181 struct ni_power_info *ni_pi = ni_get_pi(adev);
3182
3183 eg_pi->requested_rps = *rps;
3184 ni_pi->requested_ps = *new_ps;
3185 eg_pi->requested_rps.ps_priv = &ni_pi->requested_ps;
3186}
3187
3188static void ni_set_uvd_clock_before_set_eng_clock(struct amdgpu_device *adev,
3189 struct amdgpu_ps *new_ps,
3190 struct amdgpu_ps *old_ps)
3191{
3192 struct si_ps *new_state = si_get_ps(new_ps);
3193 struct si_ps *current_state = si_get_ps(old_ps);
3194
3195 if ((new_ps->vclk == old_ps->vclk) &&
3196 (new_ps->dclk == old_ps->dclk))
3197 return;
3198
3199 if (new_state->performance_levels[new_state->performance_level_count - 1].sclk >=
3200 current_state->performance_levels[current_state->performance_level_count - 1].sclk)
3201 return;
3202
3203 amdgpu_asic_set_uvd_clocks(adev, new_ps->vclk, new_ps->dclk);
3204}
3205
3206static void ni_set_uvd_clock_after_set_eng_clock(struct amdgpu_device *adev,
3207 struct amdgpu_ps *new_ps,
3208 struct amdgpu_ps *old_ps)
3209{
3210 struct si_ps *new_state = si_get_ps(new_ps);
3211 struct si_ps *current_state = si_get_ps(old_ps);
3212
3213 if ((new_ps->vclk == old_ps->vclk) &&
3214 (new_ps->dclk == old_ps->dclk))
3215 return;
3216
3217 if (new_state->performance_levels[new_state->performance_level_count - 1].sclk <
3218 current_state->performance_levels[current_state->performance_level_count - 1].sclk)
3219 return;
3220
3221 amdgpu_asic_set_uvd_clocks(adev, new_ps->vclk, new_ps->dclk);
3222}
3223
3224static u16 btc_find_voltage(struct atom_voltage_table *table, u16 voltage)
3225{
3226 unsigned int i;
3227
3228 for (i = 0; i < table->count; i++)
3229 if (voltage <= table->entries[i].value)
3230 return table->entries[i].value;
3231
3232 return table->entries[table->count - 1].value;
3233}
3234
3235static u32 btc_find_valid_clock(struct amdgpu_clock_array *clocks,
3236 u32 max_clock, u32 requested_clock)
3237{
3238 unsigned int i;
3239
3240 if ((clocks == NULL) || (clocks->count == 0))
3241 return (requested_clock < max_clock) ? requested_clock : max_clock;
3242
3243 for (i = 0; i < clocks->count; i++) {
3244 if (clocks->values[i] >= requested_clock)
3245 return (clocks->values[i] < max_clock) ? clocks->values[i] : max_clock;
3246 }
3247
3248 return (clocks->values[clocks->count - 1] < max_clock) ?
3249 clocks->values[clocks->count - 1] : max_clock;
3250}
3251
3252static u32 btc_get_valid_mclk(struct amdgpu_device *adev,
3253 u32 max_mclk, u32 requested_mclk)
3254{
3255 return btc_find_valid_clock(&adev->pm.dpm.dyn_state.valid_mclk_values,
3256 max_mclk, requested_mclk);
3257}
3258
3259static u32 btc_get_valid_sclk(struct amdgpu_device *adev,
3260 u32 max_sclk, u32 requested_sclk)
3261{
3262 return btc_find_valid_clock(&adev->pm.dpm.dyn_state.valid_sclk_values,
3263 max_sclk, requested_sclk);
3264}
3265
3266static void btc_get_max_clock_from_voltage_dependency_table(struct amdgpu_clock_voltage_dependency_table *table,
3267 u32 *max_clock)
3268{
3269 u32 i, clock = 0;
3270
3271 if ((table == NULL) || (table->count == 0)) {
3272 *max_clock = clock;
3273 return;
3274 }
3275
3276 for (i = 0; i < table->count; i++) {
3277 if (clock < table->entries[i].clk)
3278 clock = table->entries[i].clk;
3279 }
3280 *max_clock = clock;
3281}
3282
3283static void btc_apply_voltage_dependency_rules(struct amdgpu_clock_voltage_dependency_table *table,
3284 u32 clock, u16 max_voltage, u16 *voltage)
3285{
3286 u32 i;
3287
3288 if ((table == NULL) || (table->count == 0))
3289 return;
3290
3291 for (i= 0; i < table->count; i++) {
3292 if (clock <= table->entries[i].clk) {
3293 if (*voltage < table->entries[i].v)
3294 *voltage = (u16)((table->entries[i].v < max_voltage) ?
3295 table->entries[i].v : max_voltage);
3296 return;
3297 }
3298 }
3299
3300 *voltage = (*voltage > max_voltage) ? *voltage : max_voltage;
3301}
3302
3303static void btc_adjust_clock_combinations(struct amdgpu_device *adev,
3304 const struct amdgpu_clock_and_voltage_limits *max_limits,
3305 struct rv7xx_pl *pl)
3306{
3307
3308 if ((pl->mclk == 0) || (pl->sclk == 0))
3309 return;
3310
3311 if (pl->mclk == pl->sclk)
3312 return;
3313
3314 if (pl->mclk > pl->sclk) {
3315 if (((pl->mclk + (pl->sclk - 1)) / pl->sclk) > adev->pm.dpm.dyn_state.mclk_sclk_ratio)
3316 pl->sclk = btc_get_valid_sclk(adev,
3317 max_limits->sclk,
3318 (pl->mclk +
3319 (adev->pm.dpm.dyn_state.mclk_sclk_ratio - 1)) /
3320 adev->pm.dpm.dyn_state.mclk_sclk_ratio);
3321 } else {
3322 if ((pl->sclk - pl->mclk) > adev->pm.dpm.dyn_state.sclk_mclk_delta)
3323 pl->mclk = btc_get_valid_mclk(adev,
3324 max_limits->mclk,
3325 pl->sclk -
3326 adev->pm.dpm.dyn_state.sclk_mclk_delta);
3327 }
3328}
3329
3330static void btc_apply_voltage_delta_rules(struct amdgpu_device *adev,
3331 u16 max_vddc, u16 max_vddci,
3332 u16 *vddc, u16 *vddci)
3333{
3334 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
3335 u16 new_voltage;
3336
3337 if ((0 == *vddc) || (0 == *vddci))
3338 return;
3339
3340 if (*vddc > *vddci) {
3341 if ((*vddc - *vddci) > adev->pm.dpm.dyn_state.vddc_vddci_delta) {
3342 new_voltage = btc_find_voltage(&eg_pi->vddci_voltage_table,
3343 (*vddc - adev->pm.dpm.dyn_state.vddc_vddci_delta));
3344 *vddci = (new_voltage < max_vddci) ? new_voltage : max_vddci;
3345 }
3346 } else {
3347 if ((*vddci - *vddc) > adev->pm.dpm.dyn_state.vddc_vddci_delta) {
3348 new_voltage = btc_find_voltage(&eg_pi->vddc_voltage_table,
3349 (*vddci - adev->pm.dpm.dyn_state.vddc_vddci_delta));
3350 *vddc = (new_voltage < max_vddc) ? new_voltage : max_vddc;
3351 }
3352 }
3353}
3354
3355static enum amdgpu_pcie_gen r600_get_pcie_gen_support(struct amdgpu_device *adev,
3356 u32 sys_mask,
3357 enum amdgpu_pcie_gen asic_gen,
3358 enum amdgpu_pcie_gen default_gen)
3359{
3360 switch (asic_gen) {
3361 case AMDGPU_PCIE_GEN1:
3362 return AMDGPU_PCIE_GEN1;
3363 case AMDGPU_PCIE_GEN2:
3364 return AMDGPU_PCIE_GEN2;
3365 case AMDGPU_PCIE_GEN3:
3366 return AMDGPU_PCIE_GEN3;
3367 default:
3368 if ((sys_mask & DRM_PCIE_SPEED_80) && (default_gen == AMDGPU_PCIE_GEN3))
3369 return AMDGPU_PCIE_GEN3;
3370 else if ((sys_mask & DRM_PCIE_SPEED_50) && (default_gen == AMDGPU_PCIE_GEN2))
3371 return AMDGPU_PCIE_GEN2;
3372 else
3373 return AMDGPU_PCIE_GEN1;
3374 }
3375 return AMDGPU_PCIE_GEN1;
3376}
3377
3378static void r600_calculate_u_and_p(u32 i, u32 r_c, u32 p_b,
3379 u32 *p, u32 *u)
3380{
3381 u32 b_c = 0;
3382 u32 i_c;
3383 u32 tmp;
3384
3385 i_c = (i * r_c) / 100;
3386 tmp = i_c >> p_b;
3387
3388 while (tmp) {
3389 b_c++;
3390 tmp >>= 1;
3391 }
3392
3393 *u = (b_c + 1) / 2;
3394 *p = i_c / (1 << (2 * (*u)));
3395}
3396
3397static int r600_calculate_at(u32 t, u32 h, u32 fh, u32 fl, u32 *tl, u32 *th)
3398{
3399 u32 k, a, ah, al;
3400 u32 t1;
3401
3402 if ((fl == 0) || (fh == 0) || (fl > fh))
3403 return -EINVAL;
3404
3405 k = (100 * fh) / fl;
3406 t1 = (t * (k - 100));
3407 a = (1000 * (100 * h + t1)) / (10000 + (t1 / 100));
3408 a = (a + 5) / 10;
3409 ah = ((a * t) + 5000) / 10000;
3410 al = a - ah;
3411
3412 *th = t - ah;
3413 *tl = t + al;
3414
3415 return 0;
3416}
3417
3418static bool r600_is_uvd_state(u32 class, u32 class2)
3419{
3420 if (class & ATOM_PPLIB_CLASSIFICATION_UVDSTATE)
3421 return true;
3422 if (class & ATOM_PPLIB_CLASSIFICATION_HD2STATE)
3423 return true;
3424 if (class & ATOM_PPLIB_CLASSIFICATION_HDSTATE)
3425 return true;
3426 if (class & ATOM_PPLIB_CLASSIFICATION_SDSTATE)
3427 return true;
3428 if (class2 & ATOM_PPLIB_CLASSIFICATION2_MVC)
3429 return true;
3430 return false;
3431}
3432
3433static u8 rv770_get_memory_module_index(struct amdgpu_device *adev)
3434{
3435 return (u8) ((RREG32(BIOS_SCRATCH_4) >> 16) & 0xff);
3436}
3437
3438static void rv770_get_max_vddc(struct amdgpu_device *adev)
3439{
3440 struct rv7xx_power_info *pi = rv770_get_pi(adev);
3441 u16 vddc;
3442
3443 if (amdgpu_atombios_get_max_vddc(adev, 0, 0, &vddc))
3444 pi->max_vddc = 0;
3445 else
3446 pi->max_vddc = vddc;
3447}
3448
3449static void rv770_get_engine_memory_ss(struct amdgpu_device *adev)
3450{
3451 struct rv7xx_power_info *pi = rv770_get_pi(adev);
3452 struct amdgpu_atom_ss ss;
3453
3454 pi->sclk_ss = amdgpu_atombios_get_asic_ss_info(adev, &ss,
3455 ASIC_INTERNAL_ENGINE_SS, 0);
3456 pi->mclk_ss = amdgpu_atombios_get_asic_ss_info(adev, &ss,
3457 ASIC_INTERNAL_MEMORY_SS, 0);
3458
3459 if (pi->sclk_ss || pi->mclk_ss)
3460 pi->dynamic_ss = true;
3461 else
3462 pi->dynamic_ss = false;
3463}
3464
3465
3466static void si_apply_state_adjust_rules(struct amdgpu_device *adev,
3467 struct amdgpu_ps *rps)
3468{
3469 struct si_ps *ps = si_get_ps(rps);
3470 struct amdgpu_clock_and_voltage_limits *max_limits;
3471 bool disable_mclk_switching = false;
3472 bool disable_sclk_switching = false;
3473 u32 mclk, sclk;
3474 u16 vddc, vddci, min_vce_voltage = 0;
3475 u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;
3476 u32 max_sclk = 0, max_mclk = 0;
3477 int i;
3478 struct si_dpm_quirk *p = si_dpm_quirk_list;
3479
3480 /* Apply dpm quirks */
3481 while (p && p->chip_device != 0) {
3482 if (adev->pdev->vendor == p->chip_vendor &&
3483 adev->pdev->device == p->chip_device &&
3484 adev->pdev->subsystem_vendor == p->subsys_vendor &&
3485 adev->pdev->subsystem_device == p->subsys_device) {
3486 max_sclk = p->max_sclk;
3487 max_mclk = p->max_mclk;
3488 break;
3489 }
3490 ++p;
3491 }
3492 /* limit mclk on all R7 370 parts for stability */
3493 if (adev->pdev->device == 0x6811 &&
3494 adev->pdev->revision == 0x81)
3495 max_mclk = 120000;
3496 /* limit sclk/mclk on Jet parts for stability */
3497 if (adev->pdev->device == 0x6665 &&
3498 adev->pdev->revision == 0xc3) {
3499 max_sclk = 75000;
3500 max_mclk = 80000;
3501 }
3502
3503 if (rps->vce_active) {
3504 rps->evclk = adev->pm.dpm.vce_states[adev->pm.dpm.vce_level].evclk;
3505 rps->ecclk = adev->pm.dpm.vce_states[adev->pm.dpm.vce_level].ecclk;
3506 si_get_vce_clock_voltage(adev, rps->evclk, rps->ecclk,
3507 &min_vce_voltage);
3508 } else {
3509 rps->evclk = 0;
3510 rps->ecclk = 0;
3511 }
3512
3513 if ((adev->pm.dpm.new_active_crtc_count > 1) ||
3514 si_dpm_vblank_too_short(adev))
3515 disable_mclk_switching = true;
3516
3517 if (rps->vclk || rps->dclk) {
3518 disable_mclk_switching = true;
3519 disable_sclk_switching = true;
3520 }
3521
3522 if (adev->pm.dpm.ac_power)
3523 max_limits = &adev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
3524 else
3525 max_limits = &adev->pm.dpm.dyn_state.max_clock_voltage_on_dc;
3526
3527 for (i = ps->performance_level_count - 2; i >= 0; i--) {
3528 if (ps->performance_levels[i].vddc > ps->performance_levels[i+1].vddc)
3529 ps->performance_levels[i].vddc = ps->performance_levels[i+1].vddc;
3530 }
3531 if (adev->pm.dpm.ac_power == false) {
3532 for (i = 0; i < ps->performance_level_count; i++) {
3533 if (ps->performance_levels[i].mclk > max_limits->mclk)
3534 ps->performance_levels[i].mclk = max_limits->mclk;
3535 if (ps->performance_levels[i].sclk > max_limits->sclk)
3536 ps->performance_levels[i].sclk = max_limits->sclk;
3537 if (ps->performance_levels[i].vddc > max_limits->vddc)
3538 ps->performance_levels[i].vddc = max_limits->vddc;
3539 if (ps->performance_levels[i].vddci > max_limits->vddci)
3540 ps->performance_levels[i].vddci = max_limits->vddci;
3541 }
3542 }
3543
3544 /* limit clocks to max supported clocks based on voltage dependency tables */
3545 btc_get_max_clock_from_voltage_dependency_table(&adev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
3546 &max_sclk_vddc);
3547 btc_get_max_clock_from_voltage_dependency_table(&adev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
3548 &max_mclk_vddci);
3549 btc_get_max_clock_from_voltage_dependency_table(&adev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
3550 &max_mclk_vddc);
3551
3552 for (i = 0; i < ps->performance_level_count; i++) {
3553 if (max_sclk_vddc) {
3554 if (ps->performance_levels[i].sclk > max_sclk_vddc)
3555 ps->performance_levels[i].sclk = max_sclk_vddc;
3556 }
3557 if (max_mclk_vddci) {
3558 if (ps->performance_levels[i].mclk > max_mclk_vddci)
3559 ps->performance_levels[i].mclk = max_mclk_vddci;
3560 }
3561 if (max_mclk_vddc) {
3562 if (ps->performance_levels[i].mclk > max_mclk_vddc)
3563 ps->performance_levels[i].mclk = max_mclk_vddc;
3564 }
3565 if (max_mclk) {
3566 if (ps->performance_levels[i].mclk > max_mclk)
3567 ps->performance_levels[i].mclk = max_mclk;
3568 }
3569 if (max_sclk) {
3570 if (ps->performance_levels[i].sclk > max_sclk)
3571 ps->performance_levels[i].sclk = max_sclk;
3572 }
3573 }
3574
3575 /* XXX validate the min clocks required for display */
3576
3577 if (disable_mclk_switching) {
3578 mclk = ps->performance_levels[ps->performance_level_count - 1].mclk;
3579 vddci = ps->performance_levels[ps->performance_level_count - 1].vddci;
3580 } else {
3581 mclk = ps->performance_levels[0].mclk;
3582 vddci = ps->performance_levels[0].vddci;
3583 }
3584
3585 if (disable_sclk_switching) {
3586 sclk = ps->performance_levels[ps->performance_level_count - 1].sclk;
3587 vddc = ps->performance_levels[ps->performance_level_count - 1].vddc;
3588 } else {
3589 sclk = ps->performance_levels[0].sclk;
3590 vddc = ps->performance_levels[0].vddc;
3591 }
3592
3593 if (rps->vce_active) {
3594 if (sclk < adev->pm.dpm.vce_states[adev->pm.dpm.vce_level].sclk)
3595 sclk = adev->pm.dpm.vce_states[adev->pm.dpm.vce_level].sclk;
3596 if (mclk < adev->pm.dpm.vce_states[adev->pm.dpm.vce_level].mclk)
3597 mclk = adev->pm.dpm.vce_states[adev->pm.dpm.vce_level].mclk;
3598 }
3599
3600 /* adjusted low state */
3601 ps->performance_levels[0].sclk = sclk;
3602 ps->performance_levels[0].mclk = mclk;
3603 ps->performance_levels[0].vddc = vddc;
3604 ps->performance_levels[0].vddci = vddci;
3605
3606 if (disable_sclk_switching) {
3607 sclk = ps->performance_levels[0].sclk;
3608 for (i = 1; i < ps->performance_level_count; i++) {
3609 if (sclk < ps->performance_levels[i].sclk)
3610 sclk = ps->performance_levels[i].sclk;
3611 }
3612 for (i = 0; i < ps->performance_level_count; i++) {
3613 ps->performance_levels[i].sclk = sclk;
3614 ps->performance_levels[i].vddc = vddc;
3615 }
3616 } else {
3617 for (i = 1; i < ps->performance_level_count; i++) {
3618 if (ps->performance_levels[i].sclk < ps->performance_levels[i - 1].sclk)
3619 ps->performance_levels[i].sclk = ps->performance_levels[i - 1].sclk;
3620 if (ps->performance_levels[i].vddc < ps->performance_levels[i - 1].vddc)
3621 ps->performance_levels[i].vddc = ps->performance_levels[i - 1].vddc;
3622 }
3623 }
3624
3625 if (disable_mclk_switching) {
3626 mclk = ps->performance_levels[0].mclk;
3627 for (i = 1; i < ps->performance_level_count; i++) {
3628 if (mclk < ps->performance_levels[i].mclk)
3629 mclk = ps->performance_levels[i].mclk;
3630 }
3631 for (i = 0; i < ps->performance_level_count; i++) {
3632 ps->performance_levels[i].mclk = mclk;
3633 ps->performance_levels[i].vddci = vddci;
3634 }
3635 } else {
3636 for (i = 1; i < ps->performance_level_count; i++) {
3637 if (ps->performance_levels[i].mclk < ps->performance_levels[i - 1].mclk)
3638 ps->performance_levels[i].mclk = ps->performance_levels[i - 1].mclk;
3639 if (ps->performance_levels[i].vddci < ps->performance_levels[i - 1].vddci)
3640 ps->performance_levels[i].vddci = ps->performance_levels[i - 1].vddci;
3641 }
3642 }
3643
3644 for (i = 0; i < ps->performance_level_count; i++)
3645 btc_adjust_clock_combinations(adev, max_limits,
3646 &ps->performance_levels[i]);
3647
3648 for (i = 0; i < ps->performance_level_count; i++) {
3649 if (ps->performance_levels[i].vddc < min_vce_voltage)
3650 ps->performance_levels[i].vddc = min_vce_voltage;
3651 btc_apply_voltage_dependency_rules(&adev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
3652 ps->performance_levels[i].sclk,
3653 max_limits->vddc, &ps->performance_levels[i].vddc);
3654 btc_apply_voltage_dependency_rules(&adev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
3655 ps->performance_levels[i].mclk,
3656 max_limits->vddci, &ps->performance_levels[i].vddci);
3657 btc_apply_voltage_dependency_rules(&adev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
3658 ps->performance_levels[i].mclk,
3659 max_limits->vddc, &ps->performance_levels[i].vddc);
3660 btc_apply_voltage_dependency_rules(&adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk,
3661 adev->clock.current_dispclk,
3662 max_limits->vddc, &ps->performance_levels[i].vddc);
3663 }
3664
3665 for (i = 0; i < ps->performance_level_count; i++) {
3666 btc_apply_voltage_delta_rules(adev,
3667 max_limits->vddc, max_limits->vddci,
3668 &ps->performance_levels[i].vddc,
3669 &ps->performance_levels[i].vddci);
3670 }
3671
3672 ps->dc_compatible = true;
3673 for (i = 0; i < ps->performance_level_count; i++) {
3674 if (ps->performance_levels[i].vddc > adev->pm.dpm.dyn_state.max_clock_voltage_on_dc.vddc)
3675 ps->dc_compatible = false;
3676 }
3677}
3678
3679#if 0
3680static int si_read_smc_soft_register(struct amdgpu_device *adev,
3681 u16 reg_offset, u32 *value)
3682{
3683 struct si_power_info *si_pi = si_get_pi(adev);
3684
3685 return amdgpu_si_read_smc_sram_dword(adev,
3686 si_pi->soft_regs_start + reg_offset, value,
3687 si_pi->sram_end);
3688}
3689#endif
3690
3691static int si_write_smc_soft_register(struct amdgpu_device *adev,
3692 u16 reg_offset, u32 value)
3693{
3694 struct si_power_info *si_pi = si_get_pi(adev);
3695
3696 return amdgpu_si_write_smc_sram_dword(adev,
3697 si_pi->soft_regs_start + reg_offset,
3698 value, si_pi->sram_end);
3699}
3700
3701static bool si_is_special_1gb_platform(struct amdgpu_device *adev)
3702{
3703 bool ret = false;
3704 u32 tmp, width, row, column, bank, density;
3705 bool is_memory_gddr5, is_special;
3706
3707 tmp = RREG32(MC_SEQ_MISC0);
3708 is_memory_gddr5 = (MC_SEQ_MISC0_GDDR5_VALUE == ((tmp & MC_SEQ_MISC0_GDDR5_MASK) >> MC_SEQ_MISC0_GDDR5_SHIFT));
3709 is_special = (MC_SEQ_MISC0_REV_ID_VALUE == ((tmp & MC_SEQ_MISC0_REV_ID_MASK) >> MC_SEQ_MISC0_REV_ID_SHIFT))
3710 & (MC_SEQ_MISC0_VEN_ID_VALUE == ((tmp & MC_SEQ_MISC0_VEN_ID_MASK) >> MC_SEQ_MISC0_VEN_ID_SHIFT));
3711
3712 WREG32(MC_SEQ_IO_DEBUG_INDEX, 0xb);
3713 width = ((RREG32(MC_SEQ_IO_DEBUG_DATA) >> 1) & 1) ? 16 : 32;
3714
3715 tmp = RREG32(MC_ARB_RAMCFG);
3716 row = ((tmp & NOOFROWS_MASK) >> NOOFROWS_SHIFT) + 10;
3717 column = ((tmp & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT) + 8;
3718 bank = ((tmp & NOOFBANK_MASK) >> NOOFBANK_SHIFT) + 2;
3719
3720 density = (1 << (row + column - 20 + bank)) * width;
3721
3722 if ((adev->pdev->device == 0x6819) &&
3723 is_memory_gddr5 && is_special && (density == 0x400))
3724 ret = true;
3725
3726 return ret;
3727}
3728
3729static void si_get_leakage_vddc(struct amdgpu_device *adev)
3730{
3731 struct si_power_info *si_pi = si_get_pi(adev);
3732 u16 vddc, count = 0;
3733 int i, ret;
3734
3735 for (i = 0; i < SISLANDS_MAX_LEAKAGE_COUNT; i++) {
3736 ret = amdgpu_atombios_get_leakage_vddc_based_on_leakage_idx(adev, &vddc, SISLANDS_LEAKAGE_INDEX0 + i);
3737
3738 if (!ret && (vddc > 0) && (vddc != (SISLANDS_LEAKAGE_INDEX0 + i))) {
3739 si_pi->leakage_voltage.entries[count].voltage = vddc;
3740 si_pi->leakage_voltage.entries[count].leakage_index =
3741 SISLANDS_LEAKAGE_INDEX0 + i;
3742 count++;
3743 }
3744 }
3745 si_pi->leakage_voltage.count = count;
3746}
3747
3748static int si_get_leakage_voltage_from_leakage_index(struct amdgpu_device *adev,
3749 u32 index, u16 *leakage_voltage)
3750{
3751 struct si_power_info *si_pi = si_get_pi(adev);
3752 int i;
3753
3754 if (leakage_voltage == NULL)
3755 return -EINVAL;
3756
3757 if ((index & 0xff00) != 0xff00)
3758 return -EINVAL;
3759
3760 if ((index & 0xff) > SISLANDS_MAX_LEAKAGE_COUNT + 1)
3761 return -EINVAL;
3762
3763 if (index < SISLANDS_LEAKAGE_INDEX0)
3764 return -EINVAL;
3765
3766 for (i = 0; i < si_pi->leakage_voltage.count; i++) {
3767 if (si_pi->leakage_voltage.entries[i].leakage_index == index) {
3768 *leakage_voltage = si_pi->leakage_voltage.entries[i].voltage;
3769 return 0;
3770 }
3771 }
3772 return -EAGAIN;
3773}
3774
3775static void si_set_dpm_event_sources(struct amdgpu_device *adev, u32 sources)
3776{
3777 struct rv7xx_power_info *pi = rv770_get_pi(adev);
3778 bool want_thermal_protection;
3779 enum amdgpu_dpm_event_src dpm_event_src;
3780
3781 switch (sources) {
3782 case 0:
3783 default:
3784 want_thermal_protection = false;
3785 break;
3786 case (1 << AMDGPU_DPM_AUTO_THROTTLE_SRC_THERMAL):
3787 want_thermal_protection = true;
3788 dpm_event_src = AMDGPU_DPM_EVENT_SRC_DIGITAL;
3789 break;
3790 case (1 << AMDGPU_DPM_AUTO_THROTTLE_SRC_EXTERNAL):
3791 want_thermal_protection = true;
3792 dpm_event_src = AMDGPU_DPM_EVENT_SRC_EXTERNAL;
3793 break;
3794 case ((1 << AMDGPU_DPM_AUTO_THROTTLE_SRC_EXTERNAL) |
3795 (1 << AMDGPU_DPM_AUTO_THROTTLE_SRC_THERMAL)):
3796 want_thermal_protection = true;
3797 dpm_event_src = AMDGPU_DPM_EVENT_SRC_DIGIAL_OR_EXTERNAL;
3798 break;
3799 }
3800
3801 if (want_thermal_protection) {
3802 WREG32_P(CG_THERMAL_CTRL, DPM_EVENT_SRC(dpm_event_src), ~DPM_EVENT_SRC_MASK);
3803 if (pi->thermal_protection)
3804 WREG32_P(GENERAL_PWRMGT, 0, ~THERMAL_PROTECTION_DIS);
3805 } else {
3806 WREG32_P(GENERAL_PWRMGT, THERMAL_PROTECTION_DIS, ~THERMAL_PROTECTION_DIS);
3807 }
3808}
3809
3810static void si_enable_auto_throttle_source(struct amdgpu_device *adev,
3811 enum amdgpu_dpm_auto_throttle_src source,
3812 bool enable)
3813{
3814 struct rv7xx_power_info *pi = rv770_get_pi(adev);
3815
3816 if (enable) {
3817 if (!(pi->active_auto_throttle_sources & (1 << source))) {
3818 pi->active_auto_throttle_sources |= 1 << source;
3819 si_set_dpm_event_sources(adev, pi->active_auto_throttle_sources);
3820 }
3821 } else {
3822 if (pi->active_auto_throttle_sources & (1 << source)) {
3823 pi->active_auto_throttle_sources &= ~(1 << source);
3824 si_set_dpm_event_sources(adev, pi->active_auto_throttle_sources);
3825 }
3826 }
3827}
3828
3829static void si_start_dpm(struct amdgpu_device *adev)
3830{
3831 WREG32_P(GENERAL_PWRMGT, GLOBAL_PWRMGT_EN, ~GLOBAL_PWRMGT_EN);
3832}
3833
3834static void si_stop_dpm(struct amdgpu_device *adev)
3835{
3836 WREG32_P(GENERAL_PWRMGT, 0, ~GLOBAL_PWRMGT_EN);
3837}
3838
3839static void si_enable_sclk_control(struct amdgpu_device *adev, bool enable)
3840{
3841 if (enable)
3842 WREG32_P(SCLK_PWRMGT_CNTL, 0, ~SCLK_PWRMGT_OFF);
3843 else
3844 WREG32_P(SCLK_PWRMGT_CNTL, SCLK_PWRMGT_OFF, ~SCLK_PWRMGT_OFF);
3845
3846}
3847
3848#if 0
3849static int si_notify_hardware_of_thermal_state(struct amdgpu_device *adev,
3850 u32 thermal_level)
3851{
3852 PPSMC_Result ret;
3853
3854 if (thermal_level == 0) {
3855 ret = amdgpu_si_send_msg_to_smc(adev, PPSMC_MSG_EnableThermalInterrupt);
3856 if (ret == PPSMC_Result_OK)
3857 return 0;
3858 else
3859 return -EINVAL;
3860 }
3861 return 0;
3862}
3863
3864static void si_notify_hardware_vpu_recovery_event(struct amdgpu_device *adev)
3865{
3866 si_write_smc_soft_register(adev, SI_SMC_SOFT_REGISTER_tdr_is_about_to_happen, true);
3867}
3868#endif
3869
3870#if 0
3871static int si_notify_hw_of_powersource(struct amdgpu_device *adev, bool ac_power)
3872{
3873 if (ac_power)
3874 return (amdgpu_si_send_msg_to_smc(adev, PPSMC_MSG_RunningOnAC) == PPSMC_Result_OK) ?
3875 0 : -EINVAL;
3876
3877 return 0;
3878}
3879#endif
3880
3881static PPSMC_Result si_send_msg_to_smc_with_parameter(struct amdgpu_device *adev,
3882 PPSMC_Msg msg, u32 parameter)
3883{
3884 WREG32(SMC_SCRATCH0, parameter);
3885 return amdgpu_si_send_msg_to_smc(adev, msg);
3886}
3887
3888static int si_restrict_performance_levels_before_switch(struct amdgpu_device *adev)
3889{
3890 if (amdgpu_si_send_msg_to_smc(adev, PPSMC_MSG_NoForcedLevel) != PPSMC_Result_OK)
3891 return -EINVAL;
3892
3893 return (si_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_SetEnabledLevels, 1) == PPSMC_Result_OK) ?
3894 0 : -EINVAL;
3895}
3896
3897static int si_dpm_force_performance_level(struct amdgpu_device *adev,
3898 enum amdgpu_dpm_forced_level level)
3899{
3900 struct amdgpu_ps *rps = adev->pm.dpm.current_ps;
3901 struct si_ps *ps = si_get_ps(rps);
3902 u32 levels = ps->performance_level_count;
3903
3904 if (level == AMDGPU_DPM_FORCED_LEVEL_HIGH) {
3905 if (si_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_SetEnabledLevels, levels) != PPSMC_Result_OK)
3906 return -EINVAL;
3907
3908 if (si_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_SetForcedLevels, 1) != PPSMC_Result_OK)
3909 return -EINVAL;
3910 } else if (level == AMDGPU_DPM_FORCED_LEVEL_LOW) {
3911 if (si_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK)
3912 return -EINVAL;
3913
3914 if (si_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_SetEnabledLevels, 1) != PPSMC_Result_OK)
3915 return -EINVAL;
3916 } else if (level == AMDGPU_DPM_FORCED_LEVEL_AUTO) {
3917 if (si_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK)
3918 return -EINVAL;
3919
3920 if (si_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_SetEnabledLevels, levels) != PPSMC_Result_OK)
3921 return -EINVAL;
3922 }
3923
3924 adev->pm.dpm.forced_level = level;
3925
3926 return 0;
3927}
3928
3929#if 0
3930static int si_set_boot_state(struct amdgpu_device *adev)
3931{
3932 return (amdgpu_si_send_msg_to_smc(adev, PPSMC_MSG_SwitchToInitialState) == PPSMC_Result_OK) ?
3933 0 : -EINVAL;
3934}
3935#endif
3936
3937static int si_set_sw_state(struct amdgpu_device *adev)
3938{
3939 return (amdgpu_si_send_msg_to_smc(adev, PPSMC_MSG_SwitchToSwState) == PPSMC_Result_OK) ?
3940 0 : -EINVAL;
3941}
3942
3943static int si_halt_smc(struct amdgpu_device *adev)
3944{
3945 if (amdgpu_si_send_msg_to_smc(adev, PPSMC_MSG_Halt) != PPSMC_Result_OK)
3946 return -EINVAL;
3947
3948 return (amdgpu_si_wait_for_smc_inactive(adev) == PPSMC_Result_OK) ?
3949 0 : -EINVAL;
3950}
3951
3952static int si_resume_smc(struct amdgpu_device *adev)
3953{
3954 if (amdgpu_si_send_msg_to_smc(adev, PPSMC_FlushDataCache) != PPSMC_Result_OK)
3955 return -EINVAL;
3956
3957 return (amdgpu_si_send_msg_to_smc(adev, PPSMC_MSG_Resume) == PPSMC_Result_OK) ?
3958 0 : -EINVAL;
3959}
3960
3961static void si_dpm_start_smc(struct amdgpu_device *adev)
3962{
3963 amdgpu_si_program_jump_on_start(adev);
3964 amdgpu_si_start_smc(adev);
3965 amdgpu_si_smc_clock(adev, true);
3966}
3967
3968static void si_dpm_stop_smc(struct amdgpu_device *adev)
3969{
3970 amdgpu_si_reset_smc(adev);
3971 amdgpu_si_smc_clock(adev, false);
3972}
3973
3974static int si_process_firmware_header(struct amdgpu_device *adev)
3975{
3976 struct si_power_info *si_pi = si_get_pi(adev);
3977 u32 tmp;
3978 int ret;
3979
3980 ret = amdgpu_si_read_smc_sram_dword(adev,
3981 SISLANDS_SMC_FIRMWARE_HEADER_LOCATION +
3982 SISLANDS_SMC_FIRMWARE_HEADER_stateTable,
3983 &tmp, si_pi->sram_end);
3984 if (ret)
3985 return ret;
3986
3987 si_pi->state_table_start = tmp;
3988
3989 ret = amdgpu_si_read_smc_sram_dword(adev,
3990 SISLANDS_SMC_FIRMWARE_HEADER_LOCATION +
3991 SISLANDS_SMC_FIRMWARE_HEADER_softRegisters,
3992 &tmp, si_pi->sram_end);
3993 if (ret)
3994 return ret;
3995
3996 si_pi->soft_regs_start = tmp;
3997
3998 ret = amdgpu_si_read_smc_sram_dword(adev,
3999 SISLANDS_SMC_FIRMWARE_HEADER_LOCATION +
4000 SISLANDS_SMC_FIRMWARE_HEADER_mcRegisterTable,
4001 &tmp, si_pi->sram_end);
4002 if (ret)
4003 return ret;
4004
4005 si_pi->mc_reg_table_start = tmp;
4006
4007 ret = amdgpu_si_read_smc_sram_dword(adev,
4008 SISLANDS_SMC_FIRMWARE_HEADER_LOCATION +
4009 SISLANDS_SMC_FIRMWARE_HEADER_fanTable,
4010 &tmp, si_pi->sram_end);
4011 if (ret)
4012 return ret;
4013
4014 si_pi->fan_table_start = tmp;
4015
4016 ret = amdgpu_si_read_smc_sram_dword(adev,
4017 SISLANDS_SMC_FIRMWARE_HEADER_LOCATION +
4018 SISLANDS_SMC_FIRMWARE_HEADER_mcArbDramAutoRefreshTable,
4019 &tmp, si_pi->sram_end);
4020 if (ret)
4021 return ret;
4022
4023 si_pi->arb_table_start = tmp;
4024
4025 ret = amdgpu_si_read_smc_sram_dword(adev,
4026 SISLANDS_SMC_FIRMWARE_HEADER_LOCATION +
4027 SISLANDS_SMC_FIRMWARE_HEADER_CacConfigTable,
4028 &tmp, si_pi->sram_end);
4029 if (ret)
4030 return ret;
4031
4032 si_pi->cac_table_start = tmp;
4033
4034 ret = amdgpu_si_read_smc_sram_dword(adev,
4035 SISLANDS_SMC_FIRMWARE_HEADER_LOCATION +
4036 SISLANDS_SMC_FIRMWARE_HEADER_DteConfiguration,
4037 &tmp, si_pi->sram_end);
4038 if (ret)
4039 return ret;
4040
4041 si_pi->dte_table_start = tmp;
4042
4043 ret = amdgpu_si_read_smc_sram_dword(adev,
4044 SISLANDS_SMC_FIRMWARE_HEADER_LOCATION +
4045 SISLANDS_SMC_FIRMWARE_HEADER_spllTable,
4046 &tmp, si_pi->sram_end);
4047 if (ret)
4048 return ret;
4049
4050 si_pi->spll_table_start = tmp;
4051
4052 ret = amdgpu_si_read_smc_sram_dword(adev,
4053 SISLANDS_SMC_FIRMWARE_HEADER_LOCATION +
4054 SISLANDS_SMC_FIRMWARE_HEADER_PAPMParameters,
4055 &tmp, si_pi->sram_end);
4056 if (ret)
4057 return ret;
4058
4059 si_pi->papm_cfg_table_start = tmp;
4060
4061 return ret;
4062}
4063
4064static void si_read_clock_registers(struct amdgpu_device *adev)
4065{
4066 struct si_power_info *si_pi = si_get_pi(adev);
4067
4068 si_pi->clock_registers.cg_spll_func_cntl = RREG32(CG_SPLL_FUNC_CNTL);
4069 si_pi->clock_registers.cg_spll_func_cntl_2 = RREG32(CG_SPLL_FUNC_CNTL_2);
4070 si_pi->clock_registers.cg_spll_func_cntl_3 = RREG32(CG_SPLL_FUNC_CNTL_3);
4071 si_pi->clock_registers.cg_spll_func_cntl_4 = RREG32(CG_SPLL_FUNC_CNTL_4);
4072 si_pi->clock_registers.cg_spll_spread_spectrum = RREG32(CG_SPLL_SPREAD_SPECTRUM);
4073 si_pi->clock_registers.cg_spll_spread_spectrum_2 = RREG32(CG_SPLL_SPREAD_SPECTRUM_2);
4074 si_pi->clock_registers.dll_cntl = RREG32(DLL_CNTL);
4075 si_pi->clock_registers.mclk_pwrmgt_cntl = RREG32(MCLK_PWRMGT_CNTL);
4076 si_pi->clock_registers.mpll_ad_func_cntl = RREG32(MPLL_AD_FUNC_CNTL);
4077 si_pi->clock_registers.mpll_dq_func_cntl = RREG32(MPLL_DQ_FUNC_CNTL);
4078 si_pi->clock_registers.mpll_func_cntl = RREG32(MPLL_FUNC_CNTL);
4079 si_pi->clock_registers.mpll_func_cntl_1 = RREG32(MPLL_FUNC_CNTL_1);
4080 si_pi->clock_registers.mpll_func_cntl_2 = RREG32(MPLL_FUNC_CNTL_2);
4081 si_pi->clock_registers.mpll_ss1 = RREG32(MPLL_SS1);
4082 si_pi->clock_registers.mpll_ss2 = RREG32(MPLL_SS2);
4083}
4084
4085static void si_enable_thermal_protection(struct amdgpu_device *adev,
4086 bool enable)
4087{
4088 if (enable)
4089 WREG32_P(GENERAL_PWRMGT, 0, ~THERMAL_PROTECTION_DIS);
4090 else
4091 WREG32_P(GENERAL_PWRMGT, THERMAL_PROTECTION_DIS, ~THERMAL_PROTECTION_DIS);
4092}
4093
4094static void si_enable_acpi_power_management(struct amdgpu_device *adev)
4095{
4096 WREG32_P(GENERAL_PWRMGT, STATIC_PM_EN, ~STATIC_PM_EN);
4097}
4098
4099#if 0
4100static int si_enter_ulp_state(struct amdgpu_device *adev)
4101{
4102 WREG32(SMC_MESSAGE_0, PPSMC_MSG_SwitchToMinimumPower);
4103
4104 udelay(25000);
4105
4106 return 0;
4107}
4108
4109static int si_exit_ulp_state(struct amdgpu_device *adev)
4110{
4111 int i;
4112
4113 WREG32(SMC_MESSAGE_0, PPSMC_MSG_ResumeFromMinimumPower);
4114
4115 udelay(7000);
4116
4117 for (i = 0; i < adev->usec_timeout; i++) {
4118 if (RREG32(SMC_RESP_0) == 1)
4119 break;
4120 udelay(1000);
4121 }
4122
4123 return 0;
4124}
4125#endif
4126
4127static int si_notify_smc_display_change(struct amdgpu_device *adev,
4128 bool has_display)
4129{
4130 PPSMC_Msg msg = has_display ?
4131 PPSMC_MSG_HasDisplay : PPSMC_MSG_NoDisplay;
4132
4133 return (amdgpu_si_send_msg_to_smc(adev, msg) == PPSMC_Result_OK) ?
4134 0 : -EINVAL;
4135}
4136
4137static void si_program_response_times(struct amdgpu_device *adev)
4138{
4139 u32 voltage_response_time, backbias_response_time, acpi_delay_time, vbi_time_out;
4140 u32 vddc_dly, acpi_dly, vbi_dly;
4141 u32 reference_clock;
4142
4143 si_write_smc_soft_register(adev, SI_SMC_SOFT_REGISTER_mvdd_chg_time, 1);
4144
4145 voltage_response_time = (u32)adev->pm.dpm.voltage_response_time;
4146 backbias_response_time = (u32)adev->pm.dpm.backbias_response_time;
4147
4148 if (voltage_response_time == 0)
4149 voltage_response_time = 1000;
4150
4151 acpi_delay_time = 15000;
4152 vbi_time_out = 100000;
4153
4154 reference_clock = amdgpu_asic_get_xclk(adev);
4155
4156 vddc_dly = (voltage_response_time * reference_clock) / 100;
4157 acpi_dly = (acpi_delay_time * reference_clock) / 100;
4158 vbi_dly = (vbi_time_out * reference_clock) / 100;
4159
4160 si_write_smc_soft_register(adev, SI_SMC_SOFT_REGISTER_delay_vreg, vddc_dly);
4161 si_write_smc_soft_register(adev, SI_SMC_SOFT_REGISTER_delay_acpi, acpi_dly);
4162 si_write_smc_soft_register(adev, SI_SMC_SOFT_REGISTER_mclk_chg_timeout, vbi_dly);
4163 si_write_smc_soft_register(adev, SI_SMC_SOFT_REGISTER_mc_block_delay, 0xAA);
4164}
4165
4166static void si_program_ds_registers(struct amdgpu_device *adev)
4167{
4168 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
4169 u32 tmp;
4170
4171 /* DEEP_SLEEP_CLK_SEL field should be 0x10 on tahiti A0 */
4172 if (adev->asic_type == CHIP_TAHITI && adev->rev_id == 0x0)
4173 tmp = 0x10;
4174 else
4175 tmp = 0x1;
4176
4177 if (eg_pi->sclk_deep_sleep) {
4178 WREG32_P(MISC_CLK_CNTL, DEEP_SLEEP_CLK_SEL(tmp), ~DEEP_SLEEP_CLK_SEL_MASK);
4179 WREG32_P(CG_SPLL_AUTOSCALE_CNTL, AUTOSCALE_ON_SS_CLEAR,
4180 ~AUTOSCALE_ON_SS_CLEAR);
4181 }
4182}
4183
4184static void si_program_display_gap(struct amdgpu_device *adev)
4185{
4186 u32 tmp, pipe;
4187 int i;
4188
4189 tmp = RREG32(CG_DISPLAY_GAP_CNTL) & ~(DISP1_GAP_MASK | DISP2_GAP_MASK);
4190 if (adev->pm.dpm.new_active_crtc_count > 0)
4191 tmp |= DISP1_GAP(R600_PM_DISPLAY_GAP_VBLANK_OR_WM);
4192 else
4193 tmp |= DISP1_GAP(R600_PM_DISPLAY_GAP_IGNORE);
4194
4195 if (adev->pm.dpm.new_active_crtc_count > 1)
4196 tmp |= DISP2_GAP(R600_PM_DISPLAY_GAP_VBLANK_OR_WM);
4197 else
4198 tmp |= DISP2_GAP(R600_PM_DISPLAY_GAP_IGNORE);
4199
4200 WREG32(CG_DISPLAY_GAP_CNTL, tmp);
4201
4202 tmp = RREG32(DCCG_DISP_SLOW_SELECT_REG);
4203 pipe = (tmp & DCCG_DISP1_SLOW_SELECT_MASK) >> DCCG_DISP1_SLOW_SELECT_SHIFT;
4204
4205 if ((adev->pm.dpm.new_active_crtc_count > 0) &&
4206 (!(adev->pm.dpm.new_active_crtcs & (1 << pipe)))) {
4207 /* find the first active crtc */
4208 for (i = 0; i < adev->mode_info.num_crtc; i++) {
4209 if (adev->pm.dpm.new_active_crtcs & (1 << i))
4210 break;
4211 }
4212 if (i == adev->mode_info.num_crtc)
4213 pipe = 0;
4214 else
4215 pipe = i;
4216
4217 tmp &= ~DCCG_DISP1_SLOW_SELECT_MASK;
4218 tmp |= DCCG_DISP1_SLOW_SELECT(pipe);
4219 WREG32(DCCG_DISP_SLOW_SELECT_REG, tmp);
4220 }
4221
4222 /* Setting this to false forces the performance state to low if the crtcs are disabled.
4223 * This can be a problem on PowerXpress systems or if you want to use the card
4224 * for offscreen rendering or compute if there are no crtcs enabled.
4225 */
4226 si_notify_smc_display_change(adev, adev->pm.dpm.new_active_crtc_count > 0);
4227}
4228
4229static void si_enable_spread_spectrum(struct amdgpu_device *adev, bool enable)
4230{
4231 struct rv7xx_power_info *pi = rv770_get_pi(adev);
4232
4233 if (enable) {
4234 if (pi->sclk_ss)
4235 WREG32_P(GENERAL_PWRMGT, DYN_SPREAD_SPECTRUM_EN, ~DYN_SPREAD_SPECTRUM_EN);
4236 } else {
4237 WREG32_P(CG_SPLL_SPREAD_SPECTRUM, 0, ~SSEN);
4238 WREG32_P(GENERAL_PWRMGT, 0, ~DYN_SPREAD_SPECTRUM_EN);
4239 }
4240}
4241
4242static void si_setup_bsp(struct amdgpu_device *adev)
4243{
4244 struct rv7xx_power_info *pi = rv770_get_pi(adev);
4245 u32 xclk = amdgpu_asic_get_xclk(adev);
4246
4247 r600_calculate_u_and_p(pi->asi,
4248 xclk,
4249 16,
4250 &pi->bsp,
4251 &pi->bsu);
4252
4253 r600_calculate_u_and_p(pi->pasi,
4254 xclk,
4255 16,
4256 &pi->pbsp,
4257 &pi->pbsu);
4258
4259
4260 pi->dsp = BSP(pi->bsp) | BSU(pi->bsu);
4261 pi->psp = BSP(pi->pbsp) | BSU(pi->pbsu);
4262
4263 WREG32(CG_BSP, pi->dsp);
4264}
4265
4266static void si_program_git(struct amdgpu_device *adev)
4267{
4268 WREG32_P(CG_GIT, CG_GICST(R600_GICST_DFLT), ~CG_GICST_MASK);
4269}
4270
4271static void si_program_tp(struct amdgpu_device *adev)
4272{
4273 int i;
4274 enum r600_td td = R600_TD_DFLT;
4275
4276 for (i = 0; i < R600_PM_NUMBER_OF_TC; i++)
4277 WREG32(CG_FFCT_0 + i, (UTC_0(r600_utc[i]) | DTC_0(r600_dtc[i])));
4278
4279 if (td == R600_TD_AUTO)
4280 WREG32_P(SCLK_PWRMGT_CNTL, 0, ~FIR_FORCE_TREND_SEL);
4281 else
4282 WREG32_P(SCLK_PWRMGT_CNTL, FIR_FORCE_TREND_SEL, ~FIR_FORCE_TREND_SEL);
4283
4284 if (td == R600_TD_UP)
4285 WREG32_P(SCLK_PWRMGT_CNTL, 0, ~FIR_TREND_MODE);
4286
4287 if (td == R600_TD_DOWN)
4288 WREG32_P(SCLK_PWRMGT_CNTL, FIR_TREND_MODE, ~FIR_TREND_MODE);
4289}
4290
4291static void si_program_tpp(struct amdgpu_device *adev)
4292{
4293 WREG32(CG_TPC, R600_TPC_DFLT);
4294}
4295
4296static void si_program_sstp(struct amdgpu_device *adev)
4297{
4298 WREG32(CG_SSP, (SSTU(R600_SSTU_DFLT) | SST(R600_SST_DFLT)));
4299}
4300
4301static void si_enable_display_gap(struct amdgpu_device *adev)
4302{
4303 u32 tmp = RREG32(CG_DISPLAY_GAP_CNTL);
4304
4305 tmp &= ~(DISP1_GAP_MASK | DISP2_GAP_MASK);
4306 tmp |= (DISP1_GAP(R600_PM_DISPLAY_GAP_IGNORE) |
4307 DISP2_GAP(R600_PM_DISPLAY_GAP_IGNORE));
4308
4309 tmp &= ~(DISP1_GAP_MCHG_MASK | DISP2_GAP_MCHG_MASK);
4310 tmp |= (DISP1_GAP_MCHG(R600_PM_DISPLAY_GAP_VBLANK) |
4311 DISP2_GAP_MCHG(R600_PM_DISPLAY_GAP_IGNORE));
4312 WREG32(CG_DISPLAY_GAP_CNTL, tmp);
4313}
4314
4315static void si_program_vc(struct amdgpu_device *adev)
4316{
4317 struct rv7xx_power_info *pi = rv770_get_pi(adev);
4318
4319 WREG32(CG_FTV, pi->vrc);
4320}
4321
4322static void si_clear_vc(struct amdgpu_device *adev)
4323{
4324 WREG32(CG_FTV, 0);
4325}
4326
4327static u8 si_get_ddr3_mclk_frequency_ratio(u32 memory_clock)
4328{
4329 u8 mc_para_index;
4330
4331 if (memory_clock < 10000)
4332 mc_para_index = 0;
4333 else if (memory_clock >= 80000)
4334 mc_para_index = 0x0f;
4335 else
4336 mc_para_index = (u8)((memory_clock - 10000) / 5000 + 1);
4337 return mc_para_index;
4338}
4339
4340static u8 si_get_mclk_frequency_ratio(u32 memory_clock, bool strobe_mode)
4341{
4342 u8 mc_para_index;
4343
4344 if (strobe_mode) {
4345 if (memory_clock < 12500)
4346 mc_para_index = 0x00;
4347 else if (memory_clock > 47500)
4348 mc_para_index = 0x0f;
4349 else
4350 mc_para_index = (u8)((memory_clock - 10000) / 2500);
4351 } else {
4352 if (memory_clock < 65000)
4353 mc_para_index = 0x00;
4354 else if (memory_clock > 135000)
4355 mc_para_index = 0x0f;
4356 else
4357 mc_para_index = (u8)((memory_clock - 60000) / 5000);
4358 }
4359 return mc_para_index;
4360}
4361
4362static u8 si_get_strobe_mode_settings(struct amdgpu_device *adev, u32 mclk)
4363{
4364 struct rv7xx_power_info *pi = rv770_get_pi(adev);
4365 bool strobe_mode = false;
4366 u8 result = 0;
4367
4368 if (mclk <= pi->mclk_strobe_mode_threshold)
4369 strobe_mode = true;
4370
4371 if (adev->mc.vram_type == AMDGPU_VRAM_TYPE_GDDR5)
4372 result = si_get_mclk_frequency_ratio(mclk, strobe_mode);
4373 else
4374 result = si_get_ddr3_mclk_frequency_ratio(mclk);
4375
4376 if (strobe_mode)
4377 result |= SISLANDS_SMC_STROBE_ENABLE;
4378
4379 return result;
4380}
4381
4382static int si_upload_firmware(struct amdgpu_device *adev)
4383{
4384 struct si_power_info *si_pi = si_get_pi(adev);
4385
4386 amdgpu_si_reset_smc(adev);
4387 amdgpu_si_smc_clock(adev, false);
4388
4389 return amdgpu_si_load_smc_ucode(adev, si_pi->sram_end);
4390}
4391
4392static bool si_validate_phase_shedding_tables(struct amdgpu_device *adev,
4393 const struct atom_voltage_table *table,
4394 const struct amdgpu_phase_shedding_limits_table *limits)
4395{
4396 u32 data, num_bits, num_levels;
4397
4398 if ((table == NULL) || (limits == NULL))
4399 return false;
4400
4401 data = table->mask_low;
4402
4403 num_bits = hweight32(data);
4404
4405 if (num_bits == 0)
4406 return false;
4407
4408 num_levels = (1 << num_bits);
4409
4410 if (table->count != num_levels)
4411 return false;
4412
4413 if (limits->count != (num_levels - 1))
4414 return false;
4415
4416 return true;
4417}
4418
4419static void si_trim_voltage_table_to_fit_state_table(struct amdgpu_device *adev,
4420 u32 max_voltage_steps,
4421 struct atom_voltage_table *voltage_table)
4422{
4423 unsigned int i, diff;
4424
4425 if (voltage_table->count <= max_voltage_steps)
4426 return;
4427
4428 diff = voltage_table->count - max_voltage_steps;
4429
4430 for (i= 0; i < max_voltage_steps; i++)
4431 voltage_table->entries[i] = voltage_table->entries[i + diff];
4432
4433 voltage_table->count = max_voltage_steps;
4434}
4435
4436static int si_get_svi2_voltage_table(struct amdgpu_device *adev,
4437 struct amdgpu_clock_voltage_dependency_table *voltage_dependency_table,
4438 struct atom_voltage_table *voltage_table)
4439{
4440 u32 i;
4441
4442 if (voltage_dependency_table == NULL)
4443 return -EINVAL;
4444
4445 voltage_table->mask_low = 0;
4446 voltage_table->phase_delay = 0;
4447
4448 voltage_table->count = voltage_dependency_table->count;
4449 for (i = 0; i < voltage_table->count; i++) {
4450 voltage_table->entries[i].value = voltage_dependency_table->entries[i].v;
4451 voltage_table->entries[i].smio_low = 0;
4452 }
4453
4454 return 0;
4455}
4456
4457static int si_construct_voltage_tables(struct amdgpu_device *adev)
4458{
4459 struct rv7xx_power_info *pi = rv770_get_pi(adev);
4460 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
4461 struct si_power_info *si_pi = si_get_pi(adev);
4462 int ret;
4463
4464 if (pi->voltage_control) {
4465 ret = amdgpu_atombios_get_voltage_table(adev, VOLTAGE_TYPE_VDDC,
4466 VOLTAGE_OBJ_GPIO_LUT, &eg_pi->vddc_voltage_table);
4467 if (ret)
4468 return ret;
4469
4470 if (eg_pi->vddc_voltage_table.count > SISLANDS_MAX_NO_VREG_STEPS)
4471 si_trim_voltage_table_to_fit_state_table(adev,
4472 SISLANDS_MAX_NO_VREG_STEPS,
4473 &eg_pi->vddc_voltage_table);
4474 } else if (si_pi->voltage_control_svi2) {
4475 ret = si_get_svi2_voltage_table(adev,
4476 &adev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
4477 &eg_pi->vddc_voltage_table);
4478 if (ret)
4479 return ret;
4480 } else {
4481 return -EINVAL;
4482 }
4483
4484 if (eg_pi->vddci_control) {
4485 ret = amdgpu_atombios_get_voltage_table(adev, VOLTAGE_TYPE_VDDCI,
4486 VOLTAGE_OBJ_GPIO_LUT, &eg_pi->vddci_voltage_table);
4487 if (ret)
4488 return ret;
4489
4490 if (eg_pi->vddci_voltage_table.count > SISLANDS_MAX_NO_VREG_STEPS)
4491 si_trim_voltage_table_to_fit_state_table(adev,
4492 SISLANDS_MAX_NO_VREG_STEPS,
4493 &eg_pi->vddci_voltage_table);
4494 }
4495 if (si_pi->vddci_control_svi2) {
4496 ret = si_get_svi2_voltage_table(adev,
4497 &adev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
4498 &eg_pi->vddci_voltage_table);
4499 if (ret)
4500 return ret;
4501 }
4502
4503 if (pi->mvdd_control) {
4504 ret = amdgpu_atombios_get_voltage_table(adev, VOLTAGE_TYPE_MVDDC,
4505 VOLTAGE_OBJ_GPIO_LUT, &si_pi->mvdd_voltage_table);
4506
4507 if (ret) {
4508 pi->mvdd_control = false;
4509 return ret;
4510 }
4511
4512 if (si_pi->mvdd_voltage_table.count == 0) {
4513 pi->mvdd_control = false;
4514 return -EINVAL;
4515 }
4516
4517 if (si_pi->mvdd_voltage_table.count > SISLANDS_MAX_NO_VREG_STEPS)
4518 si_trim_voltage_table_to_fit_state_table(adev,
4519 SISLANDS_MAX_NO_VREG_STEPS,
4520 &si_pi->mvdd_voltage_table);
4521 }
4522
4523 if (si_pi->vddc_phase_shed_control) {
4524 ret = amdgpu_atombios_get_voltage_table(adev, VOLTAGE_TYPE_VDDC,
4525 VOLTAGE_OBJ_PHASE_LUT, &si_pi->vddc_phase_shed_table);
4526 if (ret)
4527 si_pi->vddc_phase_shed_control = false;
4528
4529 if ((si_pi->vddc_phase_shed_table.count == 0) ||
4530 (si_pi->vddc_phase_shed_table.count > SISLANDS_MAX_NO_VREG_STEPS))
4531 si_pi->vddc_phase_shed_control = false;
4532 }
4533
4534 return 0;
4535}
4536
4537static void si_populate_smc_voltage_table(struct amdgpu_device *adev,
4538 const struct atom_voltage_table *voltage_table,
4539 SISLANDS_SMC_STATETABLE *table)
4540{
4541 unsigned int i;
4542
4543 for (i = 0; i < voltage_table->count; i++)
4544 table->lowSMIO[i] |= cpu_to_be32(voltage_table->entries[i].smio_low);
4545}
4546
4547static int si_populate_smc_voltage_tables(struct amdgpu_device *adev,
4548 SISLANDS_SMC_STATETABLE *table)
4549{
4550 struct rv7xx_power_info *pi = rv770_get_pi(adev);
4551 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
4552 struct si_power_info *si_pi = si_get_pi(adev);
4553 u8 i;
4554
4555 if (si_pi->voltage_control_svi2) {
4556 si_write_smc_soft_register(adev, SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svc,
4557 si_pi->svc_gpio_id);
4558 si_write_smc_soft_register(adev, SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svd,
4559 si_pi->svd_gpio_id);
4560 si_write_smc_soft_register(adev, SI_SMC_SOFT_REGISTER_svi_rework_plat_type,
4561 2);
4562 } else {
4563 if (eg_pi->vddc_voltage_table.count) {
4564 si_populate_smc_voltage_table(adev, &eg_pi->vddc_voltage_table, table);
4565 table->voltageMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDC] =
4566 cpu_to_be32(eg_pi->vddc_voltage_table.mask_low);
4567
4568 for (i = 0; i < eg_pi->vddc_voltage_table.count; i++) {
4569 if (pi->max_vddc_in_table <= eg_pi->vddc_voltage_table.entries[i].value) {
4570 table->maxVDDCIndexInPPTable = i;
4571 break;
4572 }
4573 }
4574 }
4575
4576 if (eg_pi->vddci_voltage_table.count) {
4577 si_populate_smc_voltage_table(adev, &eg_pi->vddci_voltage_table, table);
4578
4579 table->voltageMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDCI] =
4580 cpu_to_be32(eg_pi->vddci_voltage_table.mask_low);
4581 }
4582
4583
4584 if (si_pi->mvdd_voltage_table.count) {
4585 si_populate_smc_voltage_table(adev, &si_pi->mvdd_voltage_table, table);
4586
4587 table->voltageMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_MVDD] =
4588 cpu_to_be32(si_pi->mvdd_voltage_table.mask_low);
4589 }
4590
4591 if (si_pi->vddc_phase_shed_control) {
4592 if (si_validate_phase_shedding_tables(adev, &si_pi->vddc_phase_shed_table,
4593 &adev->pm.dpm.dyn_state.phase_shedding_limits_table)) {
4594 si_populate_smc_voltage_table(adev, &si_pi->vddc_phase_shed_table, table);
4595
4596 table->phaseMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDC_PHASE_SHEDDING] =
4597 cpu_to_be32(si_pi->vddc_phase_shed_table.mask_low);
4598
4599 si_write_smc_soft_register(adev, SI_SMC_SOFT_REGISTER_phase_shedding_delay,
4600 (u32)si_pi->vddc_phase_shed_table.phase_delay);
4601 } else {
4602 si_pi->vddc_phase_shed_control = false;
4603 }
4604 }
4605 }
4606
4607 return 0;
4608}
4609
4610static int si_populate_voltage_value(struct amdgpu_device *adev,
4611 const struct atom_voltage_table *table,
4612 u16 value, SISLANDS_SMC_VOLTAGE_VALUE *voltage)
4613{
4614 unsigned int i;
4615
4616 for (i = 0; i < table->count; i++) {
4617 if (value <= table->entries[i].value) {
4618 voltage->index = (u8)i;
4619 voltage->value = cpu_to_be16(table->entries[i].value);
4620 break;
4621 }
4622 }
4623
4624 if (i >= table->count)
4625 return -EINVAL;
4626
4627 return 0;
4628}
4629
4630static int si_populate_mvdd_value(struct amdgpu_device *adev, u32 mclk,
4631 SISLANDS_SMC_VOLTAGE_VALUE *voltage)
4632{
4633 struct rv7xx_power_info *pi = rv770_get_pi(adev);
4634 struct si_power_info *si_pi = si_get_pi(adev);
4635
4636 if (pi->mvdd_control) {
4637 if (mclk <= pi->mvdd_split_frequency)
4638 voltage->index = 0;
4639 else
4640 voltage->index = (u8)(si_pi->mvdd_voltage_table.count) - 1;
4641
4642 voltage->value = cpu_to_be16(si_pi->mvdd_voltage_table.entries[voltage->index].value);
4643 }
4644 return 0;
4645}
4646
4647static int si_get_std_voltage_value(struct amdgpu_device *adev,
4648 SISLANDS_SMC_VOLTAGE_VALUE *voltage,
4649 u16 *std_voltage)
4650{
4651 u16 v_index;
4652 bool voltage_found = false;
4653 *std_voltage = be16_to_cpu(voltage->value);
4654
4655 if (adev->pm.dpm.dyn_state.cac_leakage_table.entries) {
4656 if (adev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_NEW_CAC_VOLTAGE) {
4657 if (adev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries == NULL)
4658 return -EINVAL;
4659
4660 for (v_index = 0; (u32)v_index < adev->pm.dpm.dyn_state.vddc_dependency_on_sclk.count; v_index++) {
4661 if (be16_to_cpu(voltage->value) ==
4662 (u16)adev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[v_index].v) {
4663 voltage_found = true;
4664 if ((u32)v_index < adev->pm.dpm.dyn_state.cac_leakage_table.count)
4665 *std_voltage =
4666 adev->pm.dpm.dyn_state.cac_leakage_table.entries[v_index].vddc;
4667 else
4668 *std_voltage =
4669 adev->pm.dpm.dyn_state.cac_leakage_table.entries[adev->pm.dpm.dyn_state.cac_leakage_table.count-1].vddc;
4670 break;
4671 }
4672 }
4673
4674 if (!voltage_found) {
4675 for (v_index = 0; (u32)v_index < adev->pm.dpm.dyn_state.vddc_dependency_on_sclk.count; v_index++) {
4676 if (be16_to_cpu(voltage->value) <=
4677 (u16)adev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[v_index].v) {
4678 voltage_found = true;
4679 if ((u32)v_index < adev->pm.dpm.dyn_state.cac_leakage_table.count)
4680 *std_voltage =
4681 adev->pm.dpm.dyn_state.cac_leakage_table.entries[v_index].vddc;
4682 else
4683 *std_voltage =
4684 adev->pm.dpm.dyn_state.cac_leakage_table.entries[adev->pm.dpm.dyn_state.cac_leakage_table.count-1].vddc;
4685 break;
4686 }
4687 }
4688 }
4689 } else {
4690 if ((u32)voltage->index < adev->pm.dpm.dyn_state.cac_leakage_table.count)
4691 *std_voltage = adev->pm.dpm.dyn_state.cac_leakage_table.entries[voltage->index].vddc;
4692 }
4693 }
4694
4695 return 0;
4696}
4697
4698static int si_populate_std_voltage_value(struct amdgpu_device *adev,
4699 u16 value, u8 index,
4700 SISLANDS_SMC_VOLTAGE_VALUE *voltage)
4701{
4702 voltage->index = index;
4703 voltage->value = cpu_to_be16(value);
4704
4705 return 0;
4706}
4707
4708static int si_populate_phase_shedding_value(struct amdgpu_device *adev,
4709 const struct amdgpu_phase_shedding_limits_table *limits,
4710 u16 voltage, u32 sclk, u32 mclk,
4711 SISLANDS_SMC_VOLTAGE_VALUE *smc_voltage)
4712{
4713 unsigned int i;
4714
4715 for (i = 0; i < limits->count; i++) {
4716 if ((voltage <= limits->entries[i].voltage) &&
4717 (sclk <= limits->entries[i].sclk) &&
4718 (mclk <= limits->entries[i].mclk))
4719 break;
4720 }
4721
4722 smc_voltage->phase_settings = (u8)i;
4723
4724 return 0;
4725}
4726
4727static int si_init_arb_table_index(struct amdgpu_device *adev)
4728{
4729 struct si_power_info *si_pi = si_get_pi(adev);
4730 u32 tmp;
4731 int ret;
4732
4733 ret = amdgpu_si_read_smc_sram_dword(adev, si_pi->arb_table_start,
4734 &tmp, si_pi->sram_end);
4735 if (ret)
4736 return ret;
4737
4738 tmp &= 0x00FFFFFF;
4739 tmp |= MC_CG_ARB_FREQ_F1 << 24;
4740
4741 return amdgpu_si_write_smc_sram_dword(adev, si_pi->arb_table_start,
4742 tmp, si_pi->sram_end);
4743}
4744
4745static int si_initial_switch_from_arb_f0_to_f1(struct amdgpu_device *adev)
4746{
4747 return ni_copy_and_switch_arb_sets(adev, MC_CG_ARB_FREQ_F0, MC_CG_ARB_FREQ_F1);
4748}
4749
4750static int si_reset_to_default(struct amdgpu_device *adev)
4751{
4752 return (amdgpu_si_send_msg_to_smc(adev, PPSMC_MSG_ResetToDefaults) == PPSMC_Result_OK) ?
4753 0 : -EINVAL;
4754}
4755
4756static int si_force_switch_to_arb_f0(struct amdgpu_device *adev)
4757{
4758 struct si_power_info *si_pi = si_get_pi(adev);
4759 u32 tmp;
4760 int ret;
4761
4762 ret = amdgpu_si_read_smc_sram_dword(adev, si_pi->arb_table_start,
4763 &tmp, si_pi->sram_end);
4764 if (ret)
4765 return ret;
4766
4767 tmp = (tmp >> 24) & 0xff;
4768
4769 if (tmp == MC_CG_ARB_FREQ_F0)
4770 return 0;
4771
4772 return ni_copy_and_switch_arb_sets(adev, tmp, MC_CG_ARB_FREQ_F0);
4773}
4774
4775static u32 si_calculate_memory_refresh_rate(struct amdgpu_device *adev,
4776 u32 engine_clock)
4777{
4778 u32 dram_rows;
4779 u32 dram_refresh_rate;
4780 u32 mc_arb_rfsh_rate;
4781 u32 tmp = (RREG32(MC_ARB_RAMCFG) & NOOFROWS_MASK) >> NOOFROWS_SHIFT;
4782
4783 if (tmp >= 4)
4784 dram_rows = 16384;
4785 else
4786 dram_rows = 1 << (tmp + 10);
4787
4788 dram_refresh_rate = 1 << ((RREG32(MC_SEQ_MISC0) & 0x3) + 3);
4789 mc_arb_rfsh_rate = ((engine_clock * 10) * dram_refresh_rate / dram_rows - 32) / 64;
4790
4791 return mc_arb_rfsh_rate;
4792}
4793
4794static int si_populate_memory_timing_parameters(struct amdgpu_device *adev,
4795 struct rv7xx_pl *pl,
4796 SMC_SIslands_MCArbDramTimingRegisterSet *arb_regs)
4797{
4798 u32 dram_timing;
4799 u32 dram_timing2;
4800 u32 burst_time;
4801
4802 arb_regs->mc_arb_rfsh_rate =
4803 (u8)si_calculate_memory_refresh_rate(adev, pl->sclk);
4804
4805 amdgpu_atombios_set_engine_dram_timings(adev,
4806 pl->sclk,
4807 pl->mclk);
4808
4809 dram_timing = RREG32(MC_ARB_DRAM_TIMING);
4810 dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2);
4811 burst_time = RREG32(MC_ARB_BURST_TIME) & STATE0_MASK;
4812
4813 arb_regs->mc_arb_dram_timing = cpu_to_be32(dram_timing);
4814 arb_regs->mc_arb_dram_timing2 = cpu_to_be32(dram_timing2);
4815 arb_regs->mc_arb_burst_time = (u8)burst_time;
4816
4817 return 0;
4818}
4819
4820static int si_do_program_memory_timing_parameters(struct amdgpu_device *adev,
4821 struct amdgpu_ps *amdgpu_state,
4822 unsigned int first_arb_set)
4823{
4824 struct si_power_info *si_pi = si_get_pi(adev);
4825 struct si_ps *state = si_get_ps(amdgpu_state);
4826 SMC_SIslands_MCArbDramTimingRegisterSet arb_regs = { 0 };
4827 int i, ret = 0;
4828
4829 for (i = 0; i < state->performance_level_count; i++) {
4830 ret = si_populate_memory_timing_parameters(adev, &state->performance_levels[i], &arb_regs);
4831 if (ret)
4832 break;
4833 ret = amdgpu_si_copy_bytes_to_smc(adev,
4834 si_pi->arb_table_start +
4835 offsetof(SMC_SIslands_MCArbDramTimingRegisters, data) +
4836 sizeof(SMC_SIslands_MCArbDramTimingRegisterSet) * (first_arb_set + i),
4837 (u8 *)&arb_regs,
4838 sizeof(SMC_SIslands_MCArbDramTimingRegisterSet),
4839 si_pi->sram_end);
4840 if (ret)
4841 break;
4842 }
4843
4844 return ret;
4845}
4846
4847static int si_program_memory_timing_parameters(struct amdgpu_device *adev,
4848 struct amdgpu_ps *amdgpu_new_state)
4849{
4850 return si_do_program_memory_timing_parameters(adev, amdgpu_new_state,
4851 SISLANDS_DRIVER_STATE_ARB_INDEX);
4852}
4853
4854static int si_populate_initial_mvdd_value(struct amdgpu_device *adev,
4855 struct SISLANDS_SMC_VOLTAGE_VALUE *voltage)
4856{
4857 struct rv7xx_power_info *pi = rv770_get_pi(adev);
4858 struct si_power_info *si_pi = si_get_pi(adev);
4859
4860 if (pi->mvdd_control)
4861 return si_populate_voltage_value(adev, &si_pi->mvdd_voltage_table,
4862 si_pi->mvdd_bootup_value, voltage);
4863
4864 return 0;
4865}
4866
4867static int si_populate_smc_initial_state(struct amdgpu_device *adev,
4868 struct amdgpu_ps *amdgpu_initial_state,
4869 SISLANDS_SMC_STATETABLE *table)
4870{
4871 struct si_ps *initial_state = si_get_ps(amdgpu_initial_state);
4872 struct rv7xx_power_info *pi = rv770_get_pi(adev);
4873 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
4874 struct si_power_info *si_pi = si_get_pi(adev);
4875 u32 reg;
4876 int ret;
4877
4878 table->initialState.levels[0].mclk.vDLL_CNTL =
4879 cpu_to_be32(si_pi->clock_registers.dll_cntl);
4880 table->initialState.levels[0].mclk.vMCLK_PWRMGT_CNTL =
4881 cpu_to_be32(si_pi->clock_registers.mclk_pwrmgt_cntl);
4882 table->initialState.levels[0].mclk.vMPLL_AD_FUNC_CNTL =
4883 cpu_to_be32(si_pi->clock_registers.mpll_ad_func_cntl);
4884 table->initialState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL =
4885 cpu_to_be32(si_pi->clock_registers.mpll_dq_func_cntl);
4886 table->initialState.levels[0].mclk.vMPLL_FUNC_CNTL =
4887 cpu_to_be32(si_pi->clock_registers.mpll_func_cntl);
4888 table->initialState.levels[0].mclk.vMPLL_FUNC_CNTL_1 =
4889 cpu_to_be32(si_pi->clock_registers.mpll_func_cntl_1);
4890 table->initialState.levels[0].mclk.vMPLL_FUNC_CNTL_2 =
4891 cpu_to_be32(si_pi->clock_registers.mpll_func_cntl_2);
4892 table->initialState.levels[0].mclk.vMPLL_SS =
4893 cpu_to_be32(si_pi->clock_registers.mpll_ss1);
4894 table->initialState.levels[0].mclk.vMPLL_SS2 =
4895 cpu_to_be32(si_pi->clock_registers.mpll_ss2);
4896
4897 table->initialState.levels[0].mclk.mclk_value =
4898 cpu_to_be32(initial_state->performance_levels[0].mclk);
4899
4900 table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL =
4901 cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl);
4902 table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_2 =
4903 cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl_2);
4904 table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_3 =
4905 cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl_3);
4906 table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_4 =
4907 cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl_4);
4908 table->initialState.levels[0].sclk.vCG_SPLL_SPREAD_SPECTRUM =
4909 cpu_to_be32(si_pi->clock_registers.cg_spll_spread_spectrum);
4910 table->initialState.levels[0].sclk.vCG_SPLL_SPREAD_SPECTRUM_2 =
4911 cpu_to_be32(si_pi->clock_registers.cg_spll_spread_spectrum_2);
4912
4913 table->initialState.levels[0].sclk.sclk_value =
4914 cpu_to_be32(initial_state->performance_levels[0].sclk);
4915
4916 table->initialState.levels[0].arbRefreshState =
4917 SISLANDS_INITIAL_STATE_ARB_INDEX;
4918
4919 table->initialState.levels[0].ACIndex = 0;
4920
4921 ret = si_populate_voltage_value(adev, &eg_pi->vddc_voltage_table,
4922 initial_state->performance_levels[0].vddc,
4923 &table->initialState.levels[0].vddc);
4924
4925 if (!ret) {
4926 u16 std_vddc;
4927
4928 ret = si_get_std_voltage_value(adev,
4929 &table->initialState.levels[0].vddc,
4930 &std_vddc);
4931 if (!ret)
4932 si_populate_std_voltage_value(adev, std_vddc,
4933 table->initialState.levels[0].vddc.index,
4934 &table->initialState.levels[0].std_vddc);
4935 }
4936
4937 if (eg_pi->vddci_control)
4938 si_populate_voltage_value(adev,
4939 &eg_pi->vddci_voltage_table,
4940 initial_state->performance_levels[0].vddci,
4941 &table->initialState.levels[0].vddci);
4942
4943 if (si_pi->vddc_phase_shed_control)
4944 si_populate_phase_shedding_value(adev,
4945 &adev->pm.dpm.dyn_state.phase_shedding_limits_table,
4946 initial_state->performance_levels[0].vddc,
4947 initial_state->performance_levels[0].sclk,
4948 initial_state->performance_levels[0].mclk,
4949 &table->initialState.levels[0].vddc);
4950
4951 si_populate_initial_mvdd_value(adev, &table->initialState.levels[0].mvdd);
4952
4953 reg = CG_R(0xffff) | CG_L(0);
4954 table->initialState.levels[0].aT = cpu_to_be32(reg);
4955 table->initialState.levels[0].bSP = cpu_to_be32(pi->dsp);
4956 table->initialState.levels[0].gen2PCIE = (u8)si_pi->boot_pcie_gen;
4957
4958 if (adev->mc.vram_type == AMDGPU_VRAM_TYPE_GDDR5) {
4959 table->initialState.levels[0].strobeMode =
4960 si_get_strobe_mode_settings(adev,
4961 initial_state->performance_levels[0].mclk);
4962
4963 if (initial_state->performance_levels[0].mclk > pi->mclk_edc_enable_threshold)
4964 table->initialState.levels[0].mcFlags = SISLANDS_SMC_MC_EDC_RD_FLAG | SISLANDS_SMC_MC_EDC_WR_FLAG;
4965 else
4966 table->initialState.levels[0].mcFlags = 0;
4967 }
4968
4969 table->initialState.levelCount = 1;
4970
4971 table->initialState.flags |= PPSMC_SWSTATE_FLAG_DC;
4972
4973 table->initialState.levels[0].dpm2.MaxPS = 0;
4974 table->initialState.levels[0].dpm2.NearTDPDec = 0;
4975 table->initialState.levels[0].dpm2.AboveSafeInc = 0;
4976 table->initialState.levels[0].dpm2.BelowSafeInc = 0;
4977 table->initialState.levels[0].dpm2.PwrEfficiencyRatio = 0;
4978
4979 reg = MIN_POWER_MASK | MAX_POWER_MASK;
4980 table->initialState.levels[0].SQPowerThrottle = cpu_to_be32(reg);
4981
4982 reg = MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK;
4983 table->initialState.levels[0].SQPowerThrottle_2 = cpu_to_be32(reg);
4984
4985 return 0;
4986}
4987
4988static int si_populate_smc_acpi_state(struct amdgpu_device *adev,
4989 SISLANDS_SMC_STATETABLE *table)
4990{
4991 struct rv7xx_power_info *pi = rv770_get_pi(adev);
4992 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
4993 struct si_power_info *si_pi = si_get_pi(adev);
4994 u32 spll_func_cntl = si_pi->clock_registers.cg_spll_func_cntl;
4995 u32 spll_func_cntl_2 = si_pi->clock_registers.cg_spll_func_cntl_2;
4996 u32 spll_func_cntl_3 = si_pi->clock_registers.cg_spll_func_cntl_3;
4997 u32 spll_func_cntl_4 = si_pi->clock_registers.cg_spll_func_cntl_4;
4998 u32 dll_cntl = si_pi->clock_registers.dll_cntl;
4999 u32 mclk_pwrmgt_cntl = si_pi->clock_registers.mclk_pwrmgt_cntl;
5000 u32 mpll_ad_func_cntl = si_pi->clock_registers.mpll_ad_func_cntl;
5001 u32 mpll_dq_func_cntl = si_pi->clock_registers.mpll_dq_func_cntl;
5002 u32 mpll_func_cntl = si_pi->clock_registers.mpll_func_cntl;
5003 u32 mpll_func_cntl_1 = si_pi->clock_registers.mpll_func_cntl_1;
5004 u32 mpll_func_cntl_2 = si_pi->clock_registers.mpll_func_cntl_2;
5005 u32 reg;
5006 int ret;
5007
5008 table->ACPIState = table->initialState;
5009
5010 table->ACPIState.flags &= ~PPSMC_SWSTATE_FLAG_DC;
5011
5012 if (pi->acpi_vddc) {
5013 ret = si_populate_voltage_value(adev, &eg_pi->vddc_voltage_table,
5014 pi->acpi_vddc, &table->ACPIState.levels[0].vddc);
5015 if (!ret) {
5016 u16 std_vddc;
5017
5018 ret = si_get_std_voltage_value(adev,
5019 &table->ACPIState.levels[0].vddc, &std_vddc);
5020 if (!ret)
5021 si_populate_std_voltage_value(adev, std_vddc,
5022 table->ACPIState.levels[0].vddc.index,
5023 &table->ACPIState.levels[0].std_vddc);
5024 }
5025 table->ACPIState.levels[0].gen2PCIE = si_pi->acpi_pcie_gen;
5026
5027 if (si_pi->vddc_phase_shed_control) {
5028 si_populate_phase_shedding_value(adev,
5029 &adev->pm.dpm.dyn_state.phase_shedding_limits_table,
5030 pi->acpi_vddc,
5031 0,
5032 0,
5033 &table->ACPIState.levels[0].vddc);
5034 }
5035 } else {
5036 ret = si_populate_voltage_value(adev, &eg_pi->vddc_voltage_table,
5037 pi->min_vddc_in_table, &table->ACPIState.levels[0].vddc);
5038 if (!ret) {
5039 u16 std_vddc;
5040
5041 ret = si_get_std_voltage_value(adev,
5042 &table->ACPIState.levels[0].vddc, &std_vddc);
5043
5044 if (!ret)
5045 si_populate_std_voltage_value(adev, std_vddc,
5046 table->ACPIState.levels[0].vddc.index,
5047 &table->ACPIState.levels[0].std_vddc);
5048 }
5049 table->ACPIState.levels[0].gen2PCIE = (u8)r600_get_pcie_gen_support(adev,
5050 si_pi->sys_pcie_mask,
5051 si_pi->boot_pcie_gen,
5052 AMDGPU_PCIE_GEN1);
5053
5054 if (si_pi->vddc_phase_shed_control)
5055 si_populate_phase_shedding_value(adev,
5056 &adev->pm.dpm.dyn_state.phase_shedding_limits_table,
5057 pi->min_vddc_in_table,
5058 0,
5059 0,
5060 &table->ACPIState.levels[0].vddc);
5061 }
5062
5063 if (pi->acpi_vddc) {
5064 if (eg_pi->acpi_vddci)
5065 si_populate_voltage_value(adev, &eg_pi->vddci_voltage_table,
5066 eg_pi->acpi_vddci,
5067 &table->ACPIState.levels[0].vddci);
5068 }
5069
5070 mclk_pwrmgt_cntl |= MRDCK0_RESET | MRDCK1_RESET;
5071 mclk_pwrmgt_cntl &= ~(MRDCK0_PDNB | MRDCK1_PDNB);
5072
5073 dll_cntl &= ~(MRDCK0_BYPASS | MRDCK1_BYPASS);
5074
5075 spll_func_cntl_2 &= ~SCLK_MUX_SEL_MASK;
5076 spll_func_cntl_2 |= SCLK_MUX_SEL(4);
5077
5078 table->ACPIState.levels[0].mclk.vDLL_CNTL =
5079 cpu_to_be32(dll_cntl);
5080 table->ACPIState.levels[0].mclk.vMCLK_PWRMGT_CNTL =
5081 cpu_to_be32(mclk_pwrmgt_cntl);
5082 table->ACPIState.levels[0].mclk.vMPLL_AD_FUNC_CNTL =
5083 cpu_to_be32(mpll_ad_func_cntl);
5084 table->ACPIState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL =
5085 cpu_to_be32(mpll_dq_func_cntl);
5086 table->ACPIState.levels[0].mclk.vMPLL_FUNC_CNTL =
5087 cpu_to_be32(mpll_func_cntl);
5088 table->ACPIState.levels[0].mclk.vMPLL_FUNC_CNTL_1 =
5089 cpu_to_be32(mpll_func_cntl_1);
5090 table->ACPIState.levels[0].mclk.vMPLL_FUNC_CNTL_2 =
5091 cpu_to_be32(mpll_func_cntl_2);
5092 table->ACPIState.levels[0].mclk.vMPLL_SS =
5093 cpu_to_be32(si_pi->clock_registers.mpll_ss1);
5094 table->ACPIState.levels[0].mclk.vMPLL_SS2 =
5095 cpu_to_be32(si_pi->clock_registers.mpll_ss2);
5096
5097 table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL =
5098 cpu_to_be32(spll_func_cntl);
5099 table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_2 =
5100 cpu_to_be32(spll_func_cntl_2);
5101 table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_3 =
5102 cpu_to_be32(spll_func_cntl_3);
5103 table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_4 =
5104 cpu_to_be32(spll_func_cntl_4);
5105
5106 table->ACPIState.levels[0].mclk.mclk_value = 0;
5107 table->ACPIState.levels[0].sclk.sclk_value = 0;
5108
5109 si_populate_mvdd_value(adev, 0, &table->ACPIState.levels[0].mvdd);
5110
5111 if (eg_pi->dynamic_ac_timing)
5112 table->ACPIState.levels[0].ACIndex = 0;
5113
5114 table->ACPIState.levels[0].dpm2.MaxPS = 0;
5115 table->ACPIState.levels[0].dpm2.NearTDPDec = 0;
5116 table->ACPIState.levels[0].dpm2.AboveSafeInc = 0;
5117 table->ACPIState.levels[0].dpm2.BelowSafeInc = 0;
5118 table->ACPIState.levels[0].dpm2.PwrEfficiencyRatio = 0;
5119
5120 reg = MIN_POWER_MASK | MAX_POWER_MASK;
5121 table->ACPIState.levels[0].SQPowerThrottle = cpu_to_be32(reg);
5122
5123 reg = MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK;
5124 table->ACPIState.levels[0].SQPowerThrottle_2 = cpu_to_be32(reg);
5125
5126 return 0;
5127}
5128
5129static int si_populate_ulv_state(struct amdgpu_device *adev,
5130 SISLANDS_SMC_SWSTATE *state)
5131{
5132 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
5133 struct si_power_info *si_pi = si_get_pi(adev);
5134 struct si_ulv_param *ulv = &si_pi->ulv;
5135 u32 sclk_in_sr = 1350; /* ??? */
5136 int ret;
5137
5138 ret = si_convert_power_level_to_smc(adev, &ulv->pl,
5139 &state->levels[0]);
5140 if (!ret) {
5141 if (eg_pi->sclk_deep_sleep) {
5142 if (sclk_in_sr <= SCLK_MIN_DEEPSLEEP_FREQ)
5143 state->levels[0].stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_BYPASS;
5144 else
5145 state->levels[0].stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_THROTTLE;
5146 }
5147 if (ulv->one_pcie_lane_in_ulv)
5148 state->flags |= PPSMC_SWSTATE_FLAG_PCIE_X1;
5149 state->levels[0].arbRefreshState = (u8)(SISLANDS_ULV_STATE_ARB_INDEX);
5150 state->levels[0].ACIndex = 1;
5151 state->levels[0].std_vddc = state->levels[0].vddc;
5152 state->levelCount = 1;
5153
5154 state->flags |= PPSMC_SWSTATE_FLAG_DC;
5155 }
5156
5157 return ret;
5158}
5159
5160static int si_program_ulv_memory_timing_parameters(struct amdgpu_device *adev)
5161{
5162 struct si_power_info *si_pi = si_get_pi(adev);
5163 struct si_ulv_param *ulv = &si_pi->ulv;
5164 SMC_SIslands_MCArbDramTimingRegisterSet arb_regs = { 0 };
5165 int ret;
5166
5167 ret = si_populate_memory_timing_parameters(adev, &ulv->pl,
5168 &arb_regs);
5169 if (ret)
5170 return ret;
5171
5172 si_write_smc_soft_register(adev, SI_SMC_SOFT_REGISTER_ulv_volt_change_delay,
5173 ulv->volt_change_delay);
5174
5175 ret = amdgpu_si_copy_bytes_to_smc(adev,
5176 si_pi->arb_table_start +
5177 offsetof(SMC_SIslands_MCArbDramTimingRegisters, data) +
5178 sizeof(SMC_SIslands_MCArbDramTimingRegisterSet) * SISLANDS_ULV_STATE_ARB_INDEX,
5179 (u8 *)&arb_regs,
5180 sizeof(SMC_SIslands_MCArbDramTimingRegisterSet),
5181 si_pi->sram_end);
5182
5183 return ret;
5184}
5185
5186static void si_get_mvdd_configuration(struct amdgpu_device *adev)
5187{
5188 struct rv7xx_power_info *pi = rv770_get_pi(adev);
5189
5190 pi->mvdd_split_frequency = 30000;
5191}
5192
5193static int si_init_smc_table(struct amdgpu_device *adev)
5194{
5195 struct si_power_info *si_pi = si_get_pi(adev);
5196 struct amdgpu_ps *amdgpu_boot_state = adev->pm.dpm.boot_ps;
5197 const struct si_ulv_param *ulv = &si_pi->ulv;
5198 SISLANDS_SMC_STATETABLE *table = &si_pi->smc_statetable;
5199 int ret;
5200 u32 lane_width;
5201 u32 vr_hot_gpio;
5202
5203 si_populate_smc_voltage_tables(adev, table);
5204
5205 switch (adev->pm.int_thermal_type) {
5206 case THERMAL_TYPE_SI:
5207 case THERMAL_TYPE_EMC2103_WITH_INTERNAL:
5208 table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_INTERNAL;
5209 break;
5210 case THERMAL_TYPE_NONE:
5211 table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_NONE;
5212 break;
5213 default:
5214 table->thermalProtectType = PPSMC_THERMAL_PROTECT_TYPE_EXTERNAL;
5215 break;
5216 }
5217
5218 if (adev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_HARDWAREDC)
5219 table->systemFlags |= PPSMC_SYSTEMFLAG_GPIO_DC;
5220
5221 if (adev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_REGULATOR_HOT) {
5222 if ((adev->pdev->device != 0x6818) && (adev->pdev->device != 0x6819))
5223 table->systemFlags |= PPSMC_SYSTEMFLAG_REGULATOR_HOT;
5224 }
5225
5226 if (adev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_STEPVDDC)
5227 table->systemFlags |= PPSMC_SYSTEMFLAG_STEPVDDC;
5228
5229 if (adev->mc.vram_type == AMDGPU_VRAM_TYPE_GDDR5)
5230 table->systemFlags |= PPSMC_SYSTEMFLAG_GDDR5;
5231
5232 if (adev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_REVERT_GPIO5_POLARITY)
5233 table->extraFlags |= PPSMC_EXTRAFLAGS_AC2DC_GPIO5_POLARITY_HIGH;
5234
5235 if (adev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_VRHOT_GPIO_CONFIGURABLE) {
5236 table->systemFlags |= PPSMC_SYSTEMFLAG_REGULATOR_HOT_PROG_GPIO;
5237 vr_hot_gpio = adev->pm.dpm.backbias_response_time;
5238 si_write_smc_soft_register(adev, SI_SMC_SOFT_REGISTER_vr_hot_gpio,
5239 vr_hot_gpio);
5240 }
5241
5242 ret = si_populate_smc_initial_state(adev, amdgpu_boot_state, table);
5243 if (ret)
5244 return ret;
5245
5246 ret = si_populate_smc_acpi_state(adev, table);
5247 if (ret)
5248 return ret;
5249
5250 table->driverState = table->initialState;
5251
5252 ret = si_do_program_memory_timing_parameters(adev, amdgpu_boot_state,
5253 SISLANDS_INITIAL_STATE_ARB_INDEX);
5254 if (ret)
5255 return ret;
5256
5257 if (ulv->supported && ulv->pl.vddc) {
5258 ret = si_populate_ulv_state(adev, &table->ULVState);
5259 if (ret)
5260 return ret;
5261
5262 ret = si_program_ulv_memory_timing_parameters(adev);
5263 if (ret)
5264 return ret;
5265
5266 WREG32(CG_ULV_CONTROL, ulv->cg_ulv_control);
5267 WREG32(CG_ULV_PARAMETER, ulv->cg_ulv_parameter);
5268
5269 lane_width = amdgpu_get_pcie_lanes(adev);
5270 si_write_smc_soft_register(adev, SI_SMC_SOFT_REGISTER_non_ulv_pcie_link_width, lane_width);
5271 } else {
5272 table->ULVState = table->initialState;
5273 }
5274
5275 return amdgpu_si_copy_bytes_to_smc(adev, si_pi->state_table_start,
5276 (u8 *)table, sizeof(SISLANDS_SMC_STATETABLE),
5277 si_pi->sram_end);
5278}
5279
5280static int si_calculate_sclk_params(struct amdgpu_device *adev,
5281 u32 engine_clock,
5282 SISLANDS_SMC_SCLK_VALUE *sclk)
5283{
5284 struct rv7xx_power_info *pi = rv770_get_pi(adev);
5285 struct si_power_info *si_pi = si_get_pi(adev);
5286 struct atom_clock_dividers dividers;
5287 u32 spll_func_cntl = si_pi->clock_registers.cg_spll_func_cntl;
5288 u32 spll_func_cntl_2 = si_pi->clock_registers.cg_spll_func_cntl_2;
5289 u32 spll_func_cntl_3 = si_pi->clock_registers.cg_spll_func_cntl_3;
5290 u32 spll_func_cntl_4 = si_pi->clock_registers.cg_spll_func_cntl_4;
5291 u32 cg_spll_spread_spectrum = si_pi->clock_registers.cg_spll_spread_spectrum;
5292 u32 cg_spll_spread_spectrum_2 = si_pi->clock_registers.cg_spll_spread_spectrum_2;
5293 u64 tmp;
5294 u32 reference_clock = adev->clock.spll.reference_freq;
5295 u32 reference_divider;
5296 u32 fbdiv;
5297 int ret;
5298
5299 ret = amdgpu_atombios_get_clock_dividers(adev, COMPUTE_ENGINE_PLL_PARAM,
5300 engine_clock, false, &dividers);
5301 if (ret)
5302 return ret;
5303
5304 reference_divider = 1 + dividers.ref_div;
5305
5306 tmp = (u64) engine_clock * reference_divider * dividers.post_div * 16384;
5307 do_div(tmp, reference_clock);
5308 fbdiv = (u32) tmp;
5309
5310 spll_func_cntl &= ~(SPLL_PDIV_A_MASK | SPLL_REF_DIV_MASK);
5311 spll_func_cntl |= SPLL_REF_DIV(dividers.ref_div);
5312 spll_func_cntl |= SPLL_PDIV_A(dividers.post_div);
5313
5314 spll_func_cntl_2 &= ~SCLK_MUX_SEL_MASK;
5315 spll_func_cntl_2 |= SCLK_MUX_SEL(2);
5316
5317 spll_func_cntl_3 &= ~SPLL_FB_DIV_MASK;
5318 spll_func_cntl_3 |= SPLL_FB_DIV(fbdiv);
5319 spll_func_cntl_3 |= SPLL_DITHEN;
5320
5321 if (pi->sclk_ss) {
5322 struct amdgpu_atom_ss ss;
5323 u32 vco_freq = engine_clock * dividers.post_div;
5324
5325 if (amdgpu_atombios_get_asic_ss_info(adev, &ss,
5326 ASIC_INTERNAL_ENGINE_SS, vco_freq)) {
5327 u32 clk_s = reference_clock * 5 / (reference_divider * ss.rate);
5328 u32 clk_v = 4 * ss.percentage * fbdiv / (clk_s * 10000);
5329
5330 cg_spll_spread_spectrum &= ~CLK_S_MASK;
5331 cg_spll_spread_spectrum |= CLK_S(clk_s);
5332 cg_spll_spread_spectrum |= SSEN;
5333
5334 cg_spll_spread_spectrum_2 &= ~CLK_V_MASK;
5335 cg_spll_spread_spectrum_2 |= CLK_V(clk_v);
5336 }
5337 }
5338
5339 sclk->sclk_value = engine_clock;
5340 sclk->vCG_SPLL_FUNC_CNTL = spll_func_cntl;
5341 sclk->vCG_SPLL_FUNC_CNTL_2 = spll_func_cntl_2;
5342 sclk->vCG_SPLL_FUNC_CNTL_3 = spll_func_cntl_3;
5343 sclk->vCG_SPLL_FUNC_CNTL_4 = spll_func_cntl_4;
5344 sclk->vCG_SPLL_SPREAD_SPECTRUM = cg_spll_spread_spectrum;
5345 sclk->vCG_SPLL_SPREAD_SPECTRUM_2 = cg_spll_spread_spectrum_2;
5346
5347 return 0;
5348}
5349
5350static int si_populate_sclk_value(struct amdgpu_device *adev,
5351 u32 engine_clock,
5352 SISLANDS_SMC_SCLK_VALUE *sclk)
5353{
5354 SISLANDS_SMC_SCLK_VALUE sclk_tmp;
5355 int ret;
5356
5357 ret = si_calculate_sclk_params(adev, engine_clock, &sclk_tmp);
5358 if (!ret) {
5359 sclk->sclk_value = cpu_to_be32(sclk_tmp.sclk_value);
5360 sclk->vCG_SPLL_FUNC_CNTL = cpu_to_be32(sclk_tmp.vCG_SPLL_FUNC_CNTL);
5361 sclk->vCG_SPLL_FUNC_CNTL_2 = cpu_to_be32(sclk_tmp.vCG_SPLL_FUNC_CNTL_2);
5362 sclk->vCG_SPLL_FUNC_CNTL_3 = cpu_to_be32(sclk_tmp.vCG_SPLL_FUNC_CNTL_3);
5363 sclk->vCG_SPLL_FUNC_CNTL_4 = cpu_to_be32(sclk_tmp.vCG_SPLL_FUNC_CNTL_4);
5364 sclk->vCG_SPLL_SPREAD_SPECTRUM = cpu_to_be32(sclk_tmp.vCG_SPLL_SPREAD_SPECTRUM);
5365 sclk->vCG_SPLL_SPREAD_SPECTRUM_2 = cpu_to_be32(sclk_tmp.vCG_SPLL_SPREAD_SPECTRUM_2);
5366 }
5367
5368 return ret;
5369}
5370
5371static int si_populate_mclk_value(struct amdgpu_device *adev,
5372 u32 engine_clock,
5373 u32 memory_clock,
5374 SISLANDS_SMC_MCLK_VALUE *mclk,
5375 bool strobe_mode,
5376 bool dll_state_on)
5377{
5378 struct rv7xx_power_info *pi = rv770_get_pi(adev);
5379 struct si_power_info *si_pi = si_get_pi(adev);
5380 u32 dll_cntl = si_pi->clock_registers.dll_cntl;
5381 u32 mclk_pwrmgt_cntl = si_pi->clock_registers.mclk_pwrmgt_cntl;
5382 u32 mpll_ad_func_cntl = si_pi->clock_registers.mpll_ad_func_cntl;
5383 u32 mpll_dq_func_cntl = si_pi->clock_registers.mpll_dq_func_cntl;
5384 u32 mpll_func_cntl = si_pi->clock_registers.mpll_func_cntl;
5385 u32 mpll_func_cntl_1 = si_pi->clock_registers.mpll_func_cntl_1;
5386 u32 mpll_func_cntl_2 = si_pi->clock_registers.mpll_func_cntl_2;
5387 u32 mpll_ss1 = si_pi->clock_registers.mpll_ss1;
5388 u32 mpll_ss2 = si_pi->clock_registers.mpll_ss2;
5389 struct atom_mpll_param mpll_param;
5390 int ret;
5391
5392 ret = amdgpu_atombios_get_memory_pll_dividers(adev, memory_clock, strobe_mode, &mpll_param);
5393 if (ret)
5394 return ret;
5395
5396 mpll_func_cntl &= ~BWCTRL_MASK;
5397 mpll_func_cntl |= BWCTRL(mpll_param.bwcntl);
5398
5399 mpll_func_cntl_1 &= ~(CLKF_MASK | CLKFRAC_MASK | VCO_MODE_MASK);
5400 mpll_func_cntl_1 |= CLKF(mpll_param.clkf) |
5401 CLKFRAC(mpll_param.clkfrac) | VCO_MODE(mpll_param.vco_mode);
5402
5403 mpll_ad_func_cntl &= ~YCLK_POST_DIV_MASK;
5404 mpll_ad_func_cntl |= YCLK_POST_DIV(mpll_param.post_div);
5405
5406 if (adev->mc.vram_type == AMDGPU_VRAM_TYPE_GDDR5) {
5407 mpll_dq_func_cntl &= ~(YCLK_SEL_MASK | YCLK_POST_DIV_MASK);
5408 mpll_dq_func_cntl |= YCLK_SEL(mpll_param.yclk_sel) |
5409 YCLK_POST_DIV(mpll_param.post_div);
5410 }
5411
5412 if (pi->mclk_ss) {
5413 struct amdgpu_atom_ss ss;
5414 u32 freq_nom;
5415 u32 tmp;
5416 u32 reference_clock = adev->clock.mpll.reference_freq;
5417
5418 if (adev->mc.vram_type == AMDGPU_VRAM_TYPE_GDDR5)
5419 freq_nom = memory_clock * 4;
5420 else
5421 freq_nom = memory_clock * 2;
5422
5423 tmp = freq_nom / reference_clock;
5424 tmp = tmp * tmp;
5425 if (amdgpu_atombios_get_asic_ss_info(adev, &ss,
5426 ASIC_INTERNAL_MEMORY_SS, freq_nom)) {
5427 u32 clks = reference_clock * 5 / ss.rate;
5428 u32 clkv = (u32)((((131 * ss.percentage * ss.rate) / 100) * tmp) / freq_nom);
5429
5430 mpll_ss1 &= ~CLKV_MASK;
5431 mpll_ss1 |= CLKV(clkv);
5432
5433 mpll_ss2 &= ~CLKS_MASK;
5434 mpll_ss2 |= CLKS(clks);
5435 }
5436 }
5437
5438 mclk_pwrmgt_cntl &= ~DLL_SPEED_MASK;
5439 mclk_pwrmgt_cntl |= DLL_SPEED(mpll_param.dll_speed);
5440
5441 if (dll_state_on)
5442 mclk_pwrmgt_cntl |= MRDCK0_PDNB | MRDCK1_PDNB;
5443 else
5444 mclk_pwrmgt_cntl &= ~(MRDCK0_PDNB | MRDCK1_PDNB);
5445
5446 mclk->mclk_value = cpu_to_be32(memory_clock);
5447 mclk->vMPLL_FUNC_CNTL = cpu_to_be32(mpll_func_cntl);
5448 mclk->vMPLL_FUNC_CNTL_1 = cpu_to_be32(mpll_func_cntl_1);
5449 mclk->vMPLL_FUNC_CNTL_2 = cpu_to_be32(mpll_func_cntl_2);
5450 mclk->vMPLL_AD_FUNC_CNTL = cpu_to_be32(mpll_ad_func_cntl);
5451 mclk->vMPLL_DQ_FUNC_CNTL = cpu_to_be32(mpll_dq_func_cntl);
5452 mclk->vMCLK_PWRMGT_CNTL = cpu_to_be32(mclk_pwrmgt_cntl);
5453 mclk->vDLL_CNTL = cpu_to_be32(dll_cntl);
5454 mclk->vMPLL_SS = cpu_to_be32(mpll_ss1);
5455 mclk->vMPLL_SS2 = cpu_to_be32(mpll_ss2);
5456
5457 return 0;
5458}
5459
5460static void si_populate_smc_sp(struct amdgpu_device *adev,
5461 struct amdgpu_ps *amdgpu_state,
5462 SISLANDS_SMC_SWSTATE *smc_state)
5463{
5464 struct si_ps *ps = si_get_ps(amdgpu_state);
5465 struct rv7xx_power_info *pi = rv770_get_pi(adev);
5466 int i;
5467
5468 for (i = 0; i < ps->performance_level_count - 1; i++)
5469 smc_state->levels[i].bSP = cpu_to_be32(pi->dsp);
5470
5471 smc_state->levels[ps->performance_level_count - 1].bSP =
5472 cpu_to_be32(pi->psp);
5473}
5474
5475static int si_convert_power_level_to_smc(struct amdgpu_device *adev,
5476 struct rv7xx_pl *pl,
5477 SISLANDS_SMC_HW_PERFORMANCE_LEVEL *level)
5478{
5479 struct rv7xx_power_info *pi = rv770_get_pi(adev);
5480 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
5481 struct si_power_info *si_pi = si_get_pi(adev);
5482 int ret;
5483 bool dll_state_on;
5484 u16 std_vddc;
5485 bool gmc_pg = false;
5486
5487 if (eg_pi->pcie_performance_request &&
5488 (si_pi->force_pcie_gen != AMDGPU_PCIE_GEN_INVALID))
5489 level->gen2PCIE = (u8)si_pi->force_pcie_gen;
5490 else
5491 level->gen2PCIE = (u8)pl->pcie_gen;
5492
5493 ret = si_populate_sclk_value(adev, pl->sclk, &level->sclk);
5494 if (ret)
5495 return ret;
5496
5497 level->mcFlags = 0;
5498
5499 if (pi->mclk_stutter_mode_threshold &&
5500 (pl->mclk <= pi->mclk_stutter_mode_threshold) &&
5501 !eg_pi->uvd_enabled &&
5502 (RREG32(DPG_PIPE_STUTTER_CONTROL) & STUTTER_ENABLE) &&
5503 (adev->pm.dpm.new_active_crtc_count <= 2)) {
5504 level->mcFlags |= SISLANDS_SMC_MC_STUTTER_EN;
5505
5506 if (gmc_pg)
5507 level->mcFlags |= SISLANDS_SMC_MC_PG_EN;
5508 }
5509
5510 if (adev->mc.vram_type == AMDGPU_VRAM_TYPE_GDDR5) {
5511 if (pl->mclk > pi->mclk_edc_enable_threshold)
5512 level->mcFlags |= SISLANDS_SMC_MC_EDC_RD_FLAG;
5513
5514 if (pl->mclk > eg_pi->mclk_edc_wr_enable_threshold)
5515 level->mcFlags |= SISLANDS_SMC_MC_EDC_WR_FLAG;
5516
5517 level->strobeMode = si_get_strobe_mode_settings(adev, pl->mclk);
5518
5519 if (level->strobeMode & SISLANDS_SMC_STROBE_ENABLE) {
5520 if (si_get_mclk_frequency_ratio(pl->mclk, true) >=
5521 ((RREG32(MC_SEQ_MISC7) >> 16) & 0xf))
5522 dll_state_on = ((RREG32(MC_SEQ_MISC5) >> 1) & 0x1) ? true : false;
5523 else
5524 dll_state_on = ((RREG32(MC_SEQ_MISC6) >> 1) & 0x1) ? true : false;
5525 } else {
5526 dll_state_on = false;
5527 }
5528 } else {
5529 level->strobeMode = si_get_strobe_mode_settings(adev,
5530 pl->mclk);
5531
5532 dll_state_on = ((RREG32(MC_SEQ_MISC5) >> 1) & 0x1) ? true : false;
5533 }
5534
5535 ret = si_populate_mclk_value(adev,
5536 pl->sclk,
5537 pl->mclk,
5538 &level->mclk,
5539 (level->strobeMode & SISLANDS_SMC_STROBE_ENABLE) != 0, dll_state_on);
5540 if (ret)
5541 return ret;
5542
5543 ret = si_populate_voltage_value(adev,
5544 &eg_pi->vddc_voltage_table,
5545 pl->vddc, &level->vddc);
5546 if (ret)
5547 return ret;
5548
5549
5550 ret = si_get_std_voltage_value(adev, &level->vddc, &std_vddc);
5551 if (ret)
5552 return ret;
5553
5554 ret = si_populate_std_voltage_value(adev, std_vddc,
5555 level->vddc.index, &level->std_vddc);
5556 if (ret)
5557 return ret;
5558
5559 if (eg_pi->vddci_control) {
5560 ret = si_populate_voltage_value(adev, &eg_pi->vddci_voltage_table,
5561 pl->vddci, &level->vddci);
5562 if (ret)
5563 return ret;
5564 }
5565
5566 if (si_pi->vddc_phase_shed_control) {
5567 ret = si_populate_phase_shedding_value(adev,
5568 &adev->pm.dpm.dyn_state.phase_shedding_limits_table,
5569 pl->vddc,
5570 pl->sclk,
5571 pl->mclk,
5572 &level->vddc);
5573 if (ret)
5574 return ret;
5575 }
5576
5577 level->MaxPoweredUpCU = si_pi->max_cu;
5578
5579 ret = si_populate_mvdd_value(adev, pl->mclk, &level->mvdd);
5580
5581 return ret;
5582}
5583
5584static int si_populate_smc_t(struct amdgpu_device *adev,
5585 struct amdgpu_ps *amdgpu_state,
5586 SISLANDS_SMC_SWSTATE *smc_state)
5587{
5588 struct rv7xx_power_info *pi = rv770_get_pi(adev);
5589 struct si_ps *state = si_get_ps(amdgpu_state);
5590 u32 a_t;
5591 u32 t_l, t_h;
5592 u32 high_bsp;
5593 int i, ret;
5594
5595 if (state->performance_level_count >= 9)
5596 return -EINVAL;
5597
5598 if (state->performance_level_count < 2) {
5599 a_t = CG_R(0xffff) | CG_L(0);
5600 smc_state->levels[0].aT = cpu_to_be32(a_t);
5601 return 0;
5602 }
5603
5604 smc_state->levels[0].aT = cpu_to_be32(0);
5605
5606 for (i = 0; i <= state->performance_level_count - 2; i++) {
5607 ret = r600_calculate_at(
5608 (50 / SISLANDS_MAX_HARDWARE_POWERLEVELS) * 100 * (i + 1),
5609 100 * R600_AH_DFLT,
5610 state->performance_levels[i + 1].sclk,
5611 state->performance_levels[i].sclk,
5612 &t_l,
5613 &t_h);
5614
5615 if (ret) {
5616 t_h = (i + 1) * 1000 - 50 * R600_AH_DFLT;
5617 t_l = (i + 1) * 1000 + 50 * R600_AH_DFLT;
5618 }
5619
5620 a_t = be32_to_cpu(smc_state->levels[i].aT) & ~CG_R_MASK;
5621 a_t |= CG_R(t_l * pi->bsp / 20000);
5622 smc_state->levels[i].aT = cpu_to_be32(a_t);
5623
5624 high_bsp = (i == state->performance_level_count - 2) ?
5625 pi->pbsp : pi->bsp;
5626 a_t = CG_R(0xffff) | CG_L(t_h * high_bsp / 20000);
5627 smc_state->levels[i + 1].aT = cpu_to_be32(a_t);
5628 }
5629
5630 return 0;
5631}
5632
5633static int si_disable_ulv(struct amdgpu_device *adev)
5634{
5635 struct si_power_info *si_pi = si_get_pi(adev);
5636 struct si_ulv_param *ulv = &si_pi->ulv;
5637
5638 if (ulv->supported)
5639 return (amdgpu_si_send_msg_to_smc(adev, PPSMC_MSG_DisableULV) == PPSMC_Result_OK) ?
5640 0 : -EINVAL;
5641
5642 return 0;
5643}
5644
5645static bool si_is_state_ulv_compatible(struct amdgpu_device *adev,
5646 struct amdgpu_ps *amdgpu_state)
5647{
5648 const struct si_power_info *si_pi = si_get_pi(adev);
5649 const struct si_ulv_param *ulv = &si_pi->ulv;
5650 const struct si_ps *state = si_get_ps(amdgpu_state);
5651 int i;
5652
5653 if (state->performance_levels[0].mclk != ulv->pl.mclk)
5654 return false;
5655
5656 /* XXX validate against display requirements! */
5657
5658 for (i = 0; i < adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.count; i++) {
5659 if (adev->clock.current_dispclk <=
5660 adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[i].clk) {
5661 if (ulv->pl.vddc <
5662 adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[i].v)
5663 return false;
5664 }
5665 }
5666
5667 if ((amdgpu_state->vclk != 0) || (amdgpu_state->dclk != 0))
5668 return false;
5669
5670 return true;
5671}
5672
5673static int si_set_power_state_conditionally_enable_ulv(struct amdgpu_device *adev,
5674 struct amdgpu_ps *amdgpu_new_state)
5675{
5676 const struct si_power_info *si_pi = si_get_pi(adev);
5677 const struct si_ulv_param *ulv = &si_pi->ulv;
5678
5679 if (ulv->supported) {
5680 if (si_is_state_ulv_compatible(adev, amdgpu_new_state))
5681 return (amdgpu_si_send_msg_to_smc(adev, PPSMC_MSG_EnableULV) == PPSMC_Result_OK) ?
5682 0 : -EINVAL;
5683 }
5684 return 0;
5685}
5686
5687static int si_convert_power_state_to_smc(struct amdgpu_device *adev,
5688 struct amdgpu_ps *amdgpu_state,
5689 SISLANDS_SMC_SWSTATE *smc_state)
5690{
5691 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
5692 struct ni_power_info *ni_pi = ni_get_pi(adev);
5693 struct si_power_info *si_pi = si_get_pi(adev);
5694 struct si_ps *state = si_get_ps(amdgpu_state);
5695 int i, ret;
5696 u32 threshold;
5697 u32 sclk_in_sr = 1350; /* ??? */
5698
5699 if (state->performance_level_count > SISLANDS_MAX_HARDWARE_POWERLEVELS)
5700 return -EINVAL;
5701
5702 threshold = state->performance_levels[state->performance_level_count-1].sclk * 100 / 100;
5703
5704 if (amdgpu_state->vclk && amdgpu_state->dclk) {
5705 eg_pi->uvd_enabled = true;
5706 if (eg_pi->smu_uvd_hs)
5707 smc_state->flags |= PPSMC_SWSTATE_FLAG_UVD;
5708 } else {
5709 eg_pi->uvd_enabled = false;
5710 }
5711
5712 if (state->dc_compatible)
5713 smc_state->flags |= PPSMC_SWSTATE_FLAG_DC;
5714
5715 smc_state->levelCount = 0;
5716 for (i = 0; i < state->performance_level_count; i++) {
5717 if (eg_pi->sclk_deep_sleep) {
5718 if ((i == 0) || si_pi->sclk_deep_sleep_above_low) {
5719 if (sclk_in_sr <= SCLK_MIN_DEEPSLEEP_FREQ)
5720 smc_state->levels[i].stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_BYPASS;
5721 else
5722 smc_state->levels[i].stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_THROTTLE;
5723 }
5724 }
5725
5726 ret = si_convert_power_level_to_smc(adev, &state->performance_levels[i],
5727 &smc_state->levels[i]);
5728 smc_state->levels[i].arbRefreshState =
5729 (u8)(SISLANDS_DRIVER_STATE_ARB_INDEX + i);
5730
5731 if (ret)
5732 return ret;
5733
5734 if (ni_pi->enable_power_containment)
5735 smc_state->levels[i].displayWatermark =
5736 (state->performance_levels[i].sclk < threshold) ?
5737 PPSMC_DISPLAY_WATERMARK_LOW : PPSMC_DISPLAY_WATERMARK_HIGH;
5738 else
5739 smc_state->levels[i].displayWatermark = (i < 2) ?
5740 PPSMC_DISPLAY_WATERMARK_LOW : PPSMC_DISPLAY_WATERMARK_HIGH;
5741
5742 if (eg_pi->dynamic_ac_timing)
5743 smc_state->levels[i].ACIndex = SISLANDS_MCREGISTERTABLE_FIRST_DRIVERSTATE_SLOT + i;
5744 else
5745 smc_state->levels[i].ACIndex = 0;
5746
5747 smc_state->levelCount++;
5748 }
5749
5750 si_write_smc_soft_register(adev,
5751 SI_SMC_SOFT_REGISTER_watermark_threshold,
5752 threshold / 512);
5753
5754 si_populate_smc_sp(adev, amdgpu_state, smc_state);
5755
5756 ret = si_populate_power_containment_values(adev, amdgpu_state, smc_state);
5757 if (ret)
5758 ni_pi->enable_power_containment = false;
5759
5760 ret = si_populate_sq_ramping_values(adev, amdgpu_state, smc_state);
5761 if (ret)
5762 ni_pi->enable_sq_ramping = false;
5763
5764 return si_populate_smc_t(adev, amdgpu_state, smc_state);
5765}
5766
5767static int si_upload_sw_state(struct amdgpu_device *adev,
5768 struct amdgpu_ps *amdgpu_new_state)
5769{
5770 struct si_power_info *si_pi = si_get_pi(adev);
5771 struct si_ps *new_state = si_get_ps(amdgpu_new_state);
5772 int ret;
5773 u32 address = si_pi->state_table_start +
5774 offsetof(SISLANDS_SMC_STATETABLE, driverState);
5775 u32 state_size = sizeof(SISLANDS_SMC_SWSTATE) +
5776 ((new_state->performance_level_count - 1) *
5777 sizeof(SISLANDS_SMC_HW_PERFORMANCE_LEVEL));
5778 SISLANDS_SMC_SWSTATE *smc_state = &si_pi->smc_statetable.driverState;
5779
5780 memset(smc_state, 0, state_size);
5781
5782 ret = si_convert_power_state_to_smc(adev, amdgpu_new_state, smc_state);
5783 if (ret)
5784 return ret;
5785
5786 return amdgpu_si_copy_bytes_to_smc(adev, address, (u8 *)smc_state,
5787 state_size, si_pi->sram_end);
5788}
5789
5790static int si_upload_ulv_state(struct amdgpu_device *adev)
5791{
5792 struct si_power_info *si_pi = si_get_pi(adev);
5793 struct si_ulv_param *ulv = &si_pi->ulv;
5794 int ret = 0;
5795
5796 if (ulv->supported && ulv->pl.vddc) {
5797 u32 address = si_pi->state_table_start +
5798 offsetof(SISLANDS_SMC_STATETABLE, ULVState);
5799 SISLANDS_SMC_SWSTATE *smc_state = &si_pi->smc_statetable.ULVState;
5800 u32 state_size = sizeof(SISLANDS_SMC_SWSTATE);
5801
5802 memset(smc_state, 0, state_size);
5803
5804 ret = si_populate_ulv_state(adev, smc_state);
5805 if (!ret)
5806 ret = amdgpu_si_copy_bytes_to_smc(adev, address, (u8 *)smc_state,
5807 state_size, si_pi->sram_end);
5808 }
5809
5810 return ret;
5811}
5812
5813static int si_upload_smc_data(struct amdgpu_device *adev)
5814{
5815 struct amdgpu_crtc *amdgpu_crtc = NULL;
5816 int i;
5817
5818 if (adev->pm.dpm.new_active_crtc_count == 0)
5819 return 0;
5820
5821 for (i = 0; i < adev->mode_info.num_crtc; i++) {
5822 if (adev->pm.dpm.new_active_crtcs & (1 << i)) {
5823 amdgpu_crtc = adev->mode_info.crtcs[i];
5824 break;
5825 }
5826 }
5827
5828 if (amdgpu_crtc == NULL)
5829 return 0;
5830
5831 if (amdgpu_crtc->line_time <= 0)
5832 return 0;
5833
5834 if (si_write_smc_soft_register(adev,
5835 SI_SMC_SOFT_REGISTER_crtc_index,
5836 amdgpu_crtc->crtc_id) != PPSMC_Result_OK)
5837 return 0;
5838
5839 if (si_write_smc_soft_register(adev,
5840 SI_SMC_SOFT_REGISTER_mclk_change_block_cp_min,
5841 amdgpu_crtc->wm_high / amdgpu_crtc->line_time) != PPSMC_Result_OK)
5842 return 0;
5843
5844 if (si_write_smc_soft_register(adev,
5845 SI_SMC_SOFT_REGISTER_mclk_change_block_cp_max,
5846 amdgpu_crtc->wm_low / amdgpu_crtc->line_time) != PPSMC_Result_OK)
5847 return 0;
5848
5849 return 0;
5850}
5851
5852static int si_set_mc_special_registers(struct amdgpu_device *adev,
5853 struct si_mc_reg_table *table)
5854{
5855 u8 i, j, k;
5856 u32 temp_reg;
5857
5858 for (i = 0, j = table->last; i < table->last; i++) {
5859 if (j >= SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE)
5860 return -EINVAL;
5861 switch (table->mc_reg_address[i].s1) {
5862 case MC_SEQ_MISC1:
5863 temp_reg = RREG32(MC_PMG_CMD_EMRS);
5864 table->mc_reg_address[j].s1 = MC_PMG_CMD_EMRS;
5865 table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_EMRS_LP;
5866 for (k = 0; k < table->num_entries; k++)
5867 table->mc_reg_table_entry[k].mc_data[j] =
5868 ((temp_reg & 0xffff0000)) |
5869 ((table->mc_reg_table_entry[k].mc_data[i] & 0xffff0000) >> 16);
5870 j++;
5871 if (j >= SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE)
5872 return -EINVAL;
5873
5874 temp_reg = RREG32(MC_PMG_CMD_MRS);
5875 table->mc_reg_address[j].s1 = MC_PMG_CMD_MRS;
5876 table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_MRS_LP;
5877 for (k = 0; k < table->num_entries; k++) {
5878 table->mc_reg_table_entry[k].mc_data[j] =
5879 (temp_reg & 0xffff0000) |
5880 (table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff);
5881 if (adev->mc.vram_type != AMDGPU_VRAM_TYPE_GDDR5)
5882 table->mc_reg_table_entry[k].mc_data[j] |= 0x100;
5883 }
5884 j++;
5885 if (j >= SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE)
5886 return -EINVAL;
5887
5888 if (adev->mc.vram_type != AMDGPU_VRAM_TYPE_GDDR5) {
5889 table->mc_reg_address[j].s1 = MC_PMG_AUTO_CMD;
5890 table->mc_reg_address[j].s0 = MC_PMG_AUTO_CMD;
5891 for (k = 0; k < table->num_entries; k++)
5892 table->mc_reg_table_entry[k].mc_data[j] =
5893 (table->mc_reg_table_entry[k].mc_data[i] & 0xffff0000) >> 16;
5894 j++;
5895 if (j >= SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE)
5896 return -EINVAL;
5897 }
5898 break;
5899 case MC_SEQ_RESERVE_M:
5900 temp_reg = RREG32(MC_PMG_CMD_MRS1);
5901 table->mc_reg_address[j].s1 = MC_PMG_CMD_MRS1;
5902 table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_MRS1_LP;
5903 for(k = 0; k < table->num_entries; k++)
5904 table->mc_reg_table_entry[k].mc_data[j] =
5905 (temp_reg & 0xffff0000) |
5906 (table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff);
5907 j++;
5908 if (j >= SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE)
5909 return -EINVAL;
5910 break;
5911 default:
5912 break;
5913 }
5914 }
5915
5916 table->last = j;
5917
5918 return 0;
5919}
5920
5921static bool si_check_s0_mc_reg_index(u16 in_reg, u16 *out_reg)
5922{
5923 bool result = true;
5924 switch (in_reg) {
5925 case MC_SEQ_RAS_TIMING:
5926 *out_reg = MC_SEQ_RAS_TIMING_LP;
5927 break;
5928 case MC_SEQ_CAS_TIMING:
5929 *out_reg = MC_SEQ_CAS_TIMING_LP;
5930 break;
5931 case MC_SEQ_MISC_TIMING:
5932 *out_reg = MC_SEQ_MISC_TIMING_LP;
5933 break;
5934 case MC_SEQ_MISC_TIMING2:
5935 *out_reg = MC_SEQ_MISC_TIMING2_LP;
5936 break;
5937 case MC_SEQ_RD_CTL_D0:
5938 *out_reg = MC_SEQ_RD_CTL_D0_LP;
5939 break;
5940 case MC_SEQ_RD_CTL_D1:
5941 *out_reg = MC_SEQ_RD_CTL_D1_LP;
5942 break;
5943 case MC_SEQ_WR_CTL_D0:
5944 *out_reg = MC_SEQ_WR_CTL_D0_LP;
5945 break;
5946 case MC_SEQ_WR_CTL_D1:
5947 *out_reg = MC_SEQ_WR_CTL_D1_LP;
5948 break;
5949 case MC_PMG_CMD_EMRS:
5950 *out_reg = MC_SEQ_PMG_CMD_EMRS_LP;
5951 break;
5952 case MC_PMG_CMD_MRS:
5953 *out_reg = MC_SEQ_PMG_CMD_MRS_LP;
5954 break;
5955 case MC_PMG_CMD_MRS1:
5956 *out_reg = MC_SEQ_PMG_CMD_MRS1_LP;
5957 break;
5958 case MC_SEQ_PMG_TIMING:
5959 *out_reg = MC_SEQ_PMG_TIMING_LP;
5960 break;
5961 case MC_PMG_CMD_MRS2:
5962 *out_reg = MC_SEQ_PMG_CMD_MRS2_LP;
5963 break;
5964 case MC_SEQ_WR_CTL_2:
5965 *out_reg = MC_SEQ_WR_CTL_2_LP;
5966 break;
5967 default:
5968 result = false;
5969 break;
5970 }
5971
5972 return result;
5973}
5974
5975static void si_set_valid_flag(struct si_mc_reg_table *table)
5976{
5977 u8 i, j;
5978
5979 for (i = 0; i < table->last; i++) {
5980 for (j = 1; j < table->num_entries; j++) {
5981 if (table->mc_reg_table_entry[j-1].mc_data[i] != table->mc_reg_table_entry[j].mc_data[i]) {
5982 table->valid_flag |= 1 << i;
5983 break;
5984 }
5985 }
5986 }
5987}
5988
5989static void si_set_s0_mc_reg_index(struct si_mc_reg_table *table)
5990{
5991 u32 i;
5992 u16 address;
5993
5994 for (i = 0; i < table->last; i++)
5995 table->mc_reg_address[i].s0 = si_check_s0_mc_reg_index(table->mc_reg_address[i].s1, &address) ?
5996 address : table->mc_reg_address[i].s1;
5997
5998}
5999
6000static int si_copy_vbios_mc_reg_table(struct atom_mc_reg_table *table,
6001 struct si_mc_reg_table *si_table)
6002{
6003 u8 i, j;
6004
6005 if (table->last > SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE)
6006 return -EINVAL;
6007 if (table->num_entries > MAX_AC_TIMING_ENTRIES)
6008 return -EINVAL;
6009
6010 for (i = 0; i < table->last; i++)
6011 si_table->mc_reg_address[i].s1 = table->mc_reg_address[i].s1;
6012 si_table->last = table->last;
6013
6014 for (i = 0; i < table->num_entries; i++) {
6015 si_table->mc_reg_table_entry[i].mclk_max =
6016 table->mc_reg_table_entry[i].mclk_max;
6017 for (j = 0; j < table->last; j++) {
6018 si_table->mc_reg_table_entry[i].mc_data[j] =
6019 table->mc_reg_table_entry[i].mc_data[j];
6020 }
6021 }
6022 si_table->num_entries = table->num_entries;
6023
6024 return 0;
6025}
6026
6027static int si_initialize_mc_reg_table(struct amdgpu_device *adev)
6028{
6029 struct si_power_info *si_pi = si_get_pi(adev);
6030 struct atom_mc_reg_table *table;
6031 struct si_mc_reg_table *si_table = &si_pi->mc_reg_table;
6032 u8 module_index = rv770_get_memory_module_index(adev);
6033 int ret;
6034
6035 table = kzalloc(sizeof(struct atom_mc_reg_table), GFP_KERNEL);
6036 if (!table)
6037 return -ENOMEM;
6038
6039 WREG32(MC_SEQ_RAS_TIMING_LP, RREG32(MC_SEQ_RAS_TIMING));
6040 WREG32(MC_SEQ_CAS_TIMING_LP, RREG32(MC_SEQ_CAS_TIMING));
6041 WREG32(MC_SEQ_MISC_TIMING_LP, RREG32(MC_SEQ_MISC_TIMING));
6042 WREG32(MC_SEQ_MISC_TIMING2_LP, RREG32(MC_SEQ_MISC_TIMING2));
6043 WREG32(MC_SEQ_PMG_CMD_EMRS_LP, RREG32(MC_PMG_CMD_EMRS));
6044 WREG32(MC_SEQ_PMG_CMD_MRS_LP, RREG32(MC_PMG_CMD_MRS));
6045 WREG32(MC_SEQ_PMG_CMD_MRS1_LP, RREG32(MC_PMG_CMD_MRS1));
6046 WREG32(MC_SEQ_WR_CTL_D0_LP, RREG32(MC_SEQ_WR_CTL_D0));
6047 WREG32(MC_SEQ_WR_CTL_D1_LP, RREG32(MC_SEQ_WR_CTL_D1));
6048 WREG32(MC_SEQ_RD_CTL_D0_LP, RREG32(MC_SEQ_RD_CTL_D0));
6049 WREG32(MC_SEQ_RD_CTL_D1_LP, RREG32(MC_SEQ_RD_CTL_D1));
6050 WREG32(MC_SEQ_PMG_TIMING_LP, RREG32(MC_SEQ_PMG_TIMING));
6051 WREG32(MC_SEQ_PMG_CMD_MRS2_LP, RREG32(MC_PMG_CMD_MRS2));
6052 WREG32(MC_SEQ_WR_CTL_2_LP, RREG32(MC_SEQ_WR_CTL_2));
6053
6054 ret = amdgpu_atombios_init_mc_reg_table(adev, module_index, table);
6055 if (ret)
6056 goto init_mc_done;
6057
6058 ret = si_copy_vbios_mc_reg_table(table, si_table);
6059 if (ret)
6060 goto init_mc_done;
6061
6062 si_set_s0_mc_reg_index(si_table);
6063
6064 ret = si_set_mc_special_registers(adev, si_table);
6065 if (ret)
6066 goto init_mc_done;
6067
6068 si_set_valid_flag(si_table);
6069
6070init_mc_done:
6071 kfree(table);
6072
6073 return ret;
6074
6075}
6076
6077static void si_populate_mc_reg_addresses(struct amdgpu_device *adev,
6078 SMC_SIslands_MCRegisters *mc_reg_table)
6079{
6080 struct si_power_info *si_pi = si_get_pi(adev);
6081 u32 i, j;
6082
6083 for (i = 0, j = 0; j < si_pi->mc_reg_table.last; j++) {
6084 if (si_pi->mc_reg_table.valid_flag & (1 << j)) {
6085 if (i >= SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE)
6086 break;
6087 mc_reg_table->address[i].s0 =
6088 cpu_to_be16(si_pi->mc_reg_table.mc_reg_address[j].s0);
6089 mc_reg_table->address[i].s1 =
6090 cpu_to_be16(si_pi->mc_reg_table.mc_reg_address[j].s1);
6091 i++;
6092 }
6093 }
6094 mc_reg_table->last = (u8)i;
6095}
6096
6097static void si_convert_mc_registers(const struct si_mc_reg_entry *entry,
6098 SMC_SIslands_MCRegisterSet *data,
6099 u32 num_entries, u32 valid_flag)
6100{
6101 u32 i, j;
6102
6103 for(i = 0, j = 0; j < num_entries; j++) {
6104 if (valid_flag & (1 << j)) {
6105 data->value[i] = cpu_to_be32(entry->mc_data[j]);
6106 i++;
6107 }
6108 }
6109}
6110
6111static void si_convert_mc_reg_table_entry_to_smc(struct amdgpu_device *adev,
6112 struct rv7xx_pl *pl,
6113 SMC_SIslands_MCRegisterSet *mc_reg_table_data)
6114{
6115 struct si_power_info *si_pi = si_get_pi(adev);
6116 u32 i = 0;
6117
6118 for (i = 0; i < si_pi->mc_reg_table.num_entries; i++) {
6119 if (pl->mclk <= si_pi->mc_reg_table.mc_reg_table_entry[i].mclk_max)
6120 break;
6121 }
6122
6123 if ((i == si_pi->mc_reg_table.num_entries) && (i > 0))
6124 --i;
6125
6126 si_convert_mc_registers(&si_pi->mc_reg_table.mc_reg_table_entry[i],
6127 mc_reg_table_data, si_pi->mc_reg_table.last,
6128 si_pi->mc_reg_table.valid_flag);
6129}
6130
6131static void si_convert_mc_reg_table_to_smc(struct amdgpu_device *adev,
6132 struct amdgpu_ps *amdgpu_state,
6133 SMC_SIslands_MCRegisters *mc_reg_table)
6134{
6135 struct si_ps *state = si_get_ps(amdgpu_state);
6136 int i;
6137
6138 for (i = 0; i < state->performance_level_count; i++) {
6139 si_convert_mc_reg_table_entry_to_smc(adev,
6140 &state->performance_levels[i],
6141 &mc_reg_table->data[SISLANDS_MCREGISTERTABLE_FIRST_DRIVERSTATE_SLOT + i]);
6142 }
6143}
6144
6145static int si_populate_mc_reg_table(struct amdgpu_device *adev,
6146 struct amdgpu_ps *amdgpu_boot_state)
6147{
6148 struct si_ps *boot_state = si_get_ps(amdgpu_boot_state);
6149 struct si_power_info *si_pi = si_get_pi(adev);
6150 struct si_ulv_param *ulv = &si_pi->ulv;
6151 SMC_SIslands_MCRegisters *smc_mc_reg_table = &si_pi->smc_mc_reg_table;
6152
6153 memset(smc_mc_reg_table, 0, sizeof(SMC_SIslands_MCRegisters));
6154
6155 si_write_smc_soft_register(adev, SI_SMC_SOFT_REGISTER_seq_index, 1);
6156
6157 si_populate_mc_reg_addresses(adev, smc_mc_reg_table);
6158
6159 si_convert_mc_reg_table_entry_to_smc(adev, &boot_state->performance_levels[0],
6160 &smc_mc_reg_table->data[SISLANDS_MCREGISTERTABLE_INITIAL_SLOT]);
6161
6162 si_convert_mc_registers(&si_pi->mc_reg_table.mc_reg_table_entry[0],
6163 &smc_mc_reg_table->data[SISLANDS_MCREGISTERTABLE_ACPI_SLOT],
6164 si_pi->mc_reg_table.last,
6165 si_pi->mc_reg_table.valid_flag);
6166
6167 if (ulv->supported && ulv->pl.vddc != 0)
6168 si_convert_mc_reg_table_entry_to_smc(adev, &ulv->pl,
6169 &smc_mc_reg_table->data[SISLANDS_MCREGISTERTABLE_ULV_SLOT]);
6170 else
6171 si_convert_mc_registers(&si_pi->mc_reg_table.mc_reg_table_entry[0],
6172 &smc_mc_reg_table->data[SISLANDS_MCREGISTERTABLE_ULV_SLOT],
6173 si_pi->mc_reg_table.last,
6174 si_pi->mc_reg_table.valid_flag);
6175
6176 si_convert_mc_reg_table_to_smc(adev, amdgpu_boot_state, smc_mc_reg_table);
6177
6178 return amdgpu_si_copy_bytes_to_smc(adev, si_pi->mc_reg_table_start,
6179 (u8 *)smc_mc_reg_table,
6180 sizeof(SMC_SIslands_MCRegisters), si_pi->sram_end);
6181}
6182
6183static int si_upload_mc_reg_table(struct amdgpu_device *adev,
6184 struct amdgpu_ps *amdgpu_new_state)
6185{
6186 struct si_ps *new_state = si_get_ps(amdgpu_new_state);
6187 struct si_power_info *si_pi = si_get_pi(adev);
6188 u32 address = si_pi->mc_reg_table_start +
6189 offsetof(SMC_SIslands_MCRegisters,
6190 data[SISLANDS_MCREGISTERTABLE_FIRST_DRIVERSTATE_SLOT]);
6191 SMC_SIslands_MCRegisters *smc_mc_reg_table = &si_pi->smc_mc_reg_table;
6192
6193 memset(smc_mc_reg_table, 0, sizeof(SMC_SIslands_MCRegisters));
6194
6195 si_convert_mc_reg_table_to_smc(adev, amdgpu_new_state, smc_mc_reg_table);
6196
6197 return amdgpu_si_copy_bytes_to_smc(adev, address,
6198 (u8 *)&smc_mc_reg_table->data[SISLANDS_MCREGISTERTABLE_FIRST_DRIVERSTATE_SLOT],
6199 sizeof(SMC_SIslands_MCRegisterSet) * new_state->performance_level_count,
6200 si_pi->sram_end);
6201}
6202
6203static void si_enable_voltage_control(struct amdgpu_device *adev, bool enable)
6204{
6205 if (enable)
6206 WREG32_P(GENERAL_PWRMGT, VOLT_PWRMGT_EN, ~VOLT_PWRMGT_EN);
6207 else
6208 WREG32_P(GENERAL_PWRMGT, 0, ~VOLT_PWRMGT_EN);
6209}
6210
6211static enum amdgpu_pcie_gen si_get_maximum_link_speed(struct amdgpu_device *adev,
6212 struct amdgpu_ps *amdgpu_state)
6213{
6214 struct si_ps *state = si_get_ps(amdgpu_state);
6215 int i;
6216 u16 pcie_speed, max_speed = 0;
6217
6218 for (i = 0; i < state->performance_level_count; i++) {
6219 pcie_speed = state->performance_levels[i].pcie_gen;
6220 if (max_speed < pcie_speed)
6221 max_speed = pcie_speed;
6222 }
6223 return max_speed;
6224}
6225
6226static u16 si_get_current_pcie_speed(struct amdgpu_device *adev)
6227{
6228 u32 speed_cntl;
6229
6230 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL) & LC_CURRENT_DATA_RATE_MASK;
6231 speed_cntl >>= LC_CURRENT_DATA_RATE_SHIFT;
6232
6233 return (u16)speed_cntl;
6234}
6235
6236static void si_request_link_speed_change_before_state_change(struct amdgpu_device *adev,
6237 struct amdgpu_ps *amdgpu_new_state,
6238 struct amdgpu_ps *amdgpu_current_state)
6239{
6240 struct si_power_info *si_pi = si_get_pi(adev);
6241 enum amdgpu_pcie_gen target_link_speed = si_get_maximum_link_speed(adev, amdgpu_new_state);
6242 enum amdgpu_pcie_gen current_link_speed;
6243
6244 if (si_pi->force_pcie_gen == AMDGPU_PCIE_GEN_INVALID)
6245 current_link_speed = si_get_maximum_link_speed(adev, amdgpu_current_state);
6246 else
6247 current_link_speed = si_pi->force_pcie_gen;
6248
6249 si_pi->force_pcie_gen = AMDGPU_PCIE_GEN_INVALID;
6250 si_pi->pspp_notify_required = false;
6251 if (target_link_speed > current_link_speed) {
6252 switch (target_link_speed) {
6253#if defined(CONFIG_ACPI)
6254 case AMDGPU_PCIE_GEN3:
6255 if (amdgpu_acpi_pcie_performance_request(adev, PCIE_PERF_REQ_PECI_GEN3, false) == 0)
6256 break;
6257 si_pi->force_pcie_gen = AMDGPU_PCIE_GEN2;
6258 if (current_link_speed == AMDGPU_PCIE_GEN2)
6259 break;
6260 case AMDGPU_PCIE_GEN2:
6261 if (amdgpu_acpi_pcie_performance_request(adev, PCIE_PERF_REQ_PECI_GEN2, false) == 0)
6262 break;
6263#endif
6264 default:
6265 si_pi->force_pcie_gen = si_get_current_pcie_speed(adev);
6266 break;
6267 }
6268 } else {
6269 if (target_link_speed < current_link_speed)
6270 si_pi->pspp_notify_required = true;
6271 }
6272}
6273
6274static void si_notify_link_speed_change_after_state_change(struct amdgpu_device *adev,
6275 struct amdgpu_ps *amdgpu_new_state,
6276 struct amdgpu_ps *amdgpu_current_state)
6277{
6278 struct si_power_info *si_pi = si_get_pi(adev);
6279 enum amdgpu_pcie_gen target_link_speed = si_get_maximum_link_speed(adev, amdgpu_new_state);
6280 u8 request;
6281
6282 if (si_pi->pspp_notify_required) {
6283 if (target_link_speed == AMDGPU_PCIE_GEN3)
6284 request = PCIE_PERF_REQ_PECI_GEN3;
6285 else if (target_link_speed == AMDGPU_PCIE_GEN2)
6286 request = PCIE_PERF_REQ_PECI_GEN2;
6287 else
6288 request = PCIE_PERF_REQ_PECI_GEN1;
6289
6290 if ((request == PCIE_PERF_REQ_PECI_GEN1) &&
6291 (si_get_current_pcie_speed(adev) > 0))
6292 return;
6293
6294#if defined(CONFIG_ACPI)
6295 amdgpu_acpi_pcie_performance_request(adev, request, false);
6296#endif
6297 }
6298}
6299
6300#if 0
6301static int si_ds_request(struct amdgpu_device *adev,
6302 bool ds_status_on, u32 count_write)
6303{
6304 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
6305
6306 if (eg_pi->sclk_deep_sleep) {
6307 if (ds_status_on)
6308 return (amdgpu_si_send_msg_to_smc(adev, PPSMC_MSG_CancelThrottleOVRDSCLKDS) ==
6309 PPSMC_Result_OK) ?
6310 0 : -EINVAL;
6311 else
6312 return (amdgpu_si_send_msg_to_smc(adev, PPSMC_MSG_ThrottleOVRDSCLKDS) ==
6313 PPSMC_Result_OK) ? 0 : -EINVAL;
6314 }
6315 return 0;
6316}
6317#endif
6318
6319static void si_set_max_cu_value(struct amdgpu_device *adev)
6320{
6321 struct si_power_info *si_pi = si_get_pi(adev);
6322
6323 if (adev->asic_type == CHIP_VERDE) {
6324 switch (adev->pdev->device) {
6325 case 0x6820:
6326 case 0x6825:
6327 case 0x6821:
6328 case 0x6823:
6329 case 0x6827:
6330 si_pi->max_cu = 10;
6331 break;
6332 case 0x682D:
6333 case 0x6824:
6334 case 0x682F:
6335 case 0x6826:
6336 si_pi->max_cu = 8;
6337 break;
6338 case 0x6828:
6339 case 0x6830:
6340 case 0x6831:
6341 case 0x6838:
6342 case 0x6839:
6343 case 0x683D:
6344 si_pi->max_cu = 10;
6345 break;
6346 case 0x683B:
6347 case 0x683F:
6348 case 0x6829:
6349 si_pi->max_cu = 8;
6350 break;
6351 default:
6352 si_pi->max_cu = 0;
6353 break;
6354 }
6355 } else {
6356 si_pi->max_cu = 0;
6357 }
6358}
6359
6360static int si_patch_single_dependency_table_based_on_leakage(struct amdgpu_device *adev,
6361 struct amdgpu_clock_voltage_dependency_table *table)
6362{
6363 u32 i;
6364 int j;
6365 u16 leakage_voltage;
6366
6367 if (table) {
6368 for (i = 0; i < table->count; i++) {
6369 switch (si_get_leakage_voltage_from_leakage_index(adev,
6370 table->entries[i].v,
6371 &leakage_voltage)) {
6372 case 0:
6373 table->entries[i].v = leakage_voltage;
6374 break;
6375 case -EAGAIN:
6376 return -EINVAL;
6377 case -EINVAL:
6378 default:
6379 break;
6380 }
6381 }
6382
6383 for (j = (table->count - 2); j >= 0; j--) {
6384 table->entries[j].v = (table->entries[j].v <= table->entries[j + 1].v) ?
6385 table->entries[j].v : table->entries[j + 1].v;
6386 }
6387 }
6388 return 0;
6389}
6390
6391static int si_patch_dependency_tables_based_on_leakage(struct amdgpu_device *adev)
6392{
6393 int ret = 0;
6394
6395 ret = si_patch_single_dependency_table_based_on_leakage(adev,
6396 &adev->pm.dpm.dyn_state.vddc_dependency_on_sclk);
6397 if (ret)
6398 DRM_ERROR("Could not patch vddc_on_sclk leakage table\n");
6399 ret = si_patch_single_dependency_table_based_on_leakage(adev,
6400 &adev->pm.dpm.dyn_state.vddc_dependency_on_mclk);
6401 if (ret)
6402 DRM_ERROR("Could not patch vddc_on_mclk leakage table\n");
6403 ret = si_patch_single_dependency_table_based_on_leakage(adev,
6404 &adev->pm.dpm.dyn_state.vddci_dependency_on_mclk);
6405 if (ret)
6406 DRM_ERROR("Could not patch vddci_on_mclk leakage table\n");
6407 return ret;
6408}
6409
6410static void si_set_pcie_lane_width_in_smc(struct amdgpu_device *adev,
6411 struct amdgpu_ps *amdgpu_new_state,
6412 struct amdgpu_ps *amdgpu_current_state)
6413{
6414 u32 lane_width;
6415 u32 new_lane_width =
6416 (amdgpu_new_state->caps & ATOM_PPLIB_PCIE_LINK_WIDTH_MASK) >> ATOM_PPLIB_PCIE_LINK_WIDTH_SHIFT;
6417 u32 current_lane_width =
6418 (amdgpu_current_state->caps & ATOM_PPLIB_PCIE_LINK_WIDTH_MASK) >> ATOM_PPLIB_PCIE_LINK_WIDTH_SHIFT;
6419
6420 if (new_lane_width != current_lane_width) {
6421 amdgpu_set_pcie_lanes(adev, new_lane_width);
6422 lane_width = amdgpu_get_pcie_lanes(adev);
6423 si_write_smc_soft_register(adev, SI_SMC_SOFT_REGISTER_non_ulv_pcie_link_width, lane_width);
6424 }
6425}
6426
6427static void si_dpm_setup_asic(struct amdgpu_device *adev)
6428{
6429 si_read_clock_registers(adev);
6430 si_enable_acpi_power_management(adev);
6431}
6432
6433static int si_thermal_enable_alert(struct amdgpu_device *adev,
6434 bool enable)
6435{
6436 u32 thermal_int = RREG32(CG_THERMAL_INT);
6437
6438 if (enable) {
6439 PPSMC_Result result;
6440
6441 thermal_int &= ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
6442 WREG32(CG_THERMAL_INT, thermal_int);
6443 result = amdgpu_si_send_msg_to_smc(adev, PPSMC_MSG_EnableThermalInterrupt);
6444 if (result != PPSMC_Result_OK) {
6445 DRM_DEBUG_KMS("Could not enable thermal interrupts.\n");
6446 return -EINVAL;
6447 }
6448 } else {
6449 thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
6450 WREG32(CG_THERMAL_INT, thermal_int);
6451 }
6452
6453 return 0;
6454}
6455
6456static int si_thermal_set_temperature_range(struct amdgpu_device *adev,
6457 int min_temp, int max_temp)
6458{
6459 int low_temp = 0 * 1000;
6460 int high_temp = 255 * 1000;
6461
6462 if (low_temp < min_temp)
6463 low_temp = min_temp;
6464 if (high_temp > max_temp)
6465 high_temp = max_temp;
6466 if (high_temp < low_temp) {
6467 DRM_ERROR("invalid thermal range: %d - %d\n", low_temp, high_temp);
6468 return -EINVAL;
6469 }
6470
6471 WREG32_P(CG_THERMAL_INT, DIG_THERM_INTH(high_temp / 1000), ~DIG_THERM_INTH_MASK);
6472 WREG32_P(CG_THERMAL_INT, DIG_THERM_INTL(low_temp / 1000), ~DIG_THERM_INTL_MASK);
6473 WREG32_P(CG_THERMAL_CTRL, DIG_THERM_DPM(high_temp / 1000), ~DIG_THERM_DPM_MASK);
6474
6475 adev->pm.dpm.thermal.min_temp = low_temp;
6476 adev->pm.dpm.thermal.max_temp = high_temp;
6477
6478 return 0;
6479}
6480
6481static void si_fan_ctrl_set_static_mode(struct amdgpu_device *adev, u32 mode)
6482{
6483 struct si_power_info *si_pi = si_get_pi(adev);
6484 u32 tmp;
6485
6486 if (si_pi->fan_ctrl_is_in_default_mode) {
6487 tmp = (RREG32(CG_FDO_CTRL2) & FDO_PWM_MODE_MASK) >> FDO_PWM_MODE_SHIFT;
6488 si_pi->fan_ctrl_default_mode = tmp;
6489 tmp = (RREG32(CG_FDO_CTRL2) & TMIN_MASK) >> TMIN_SHIFT;
6490 si_pi->t_min = tmp;
6491 si_pi->fan_ctrl_is_in_default_mode = false;
6492 }
6493
6494 tmp = RREG32(CG_FDO_CTRL2) & ~TMIN_MASK;
6495 tmp |= TMIN(0);
6496 WREG32(CG_FDO_CTRL2, tmp);
6497
6498 tmp = RREG32(CG_FDO_CTRL2) & ~FDO_PWM_MODE_MASK;
6499 tmp |= FDO_PWM_MODE(mode);
6500 WREG32(CG_FDO_CTRL2, tmp);
6501}
6502
6503static int si_thermal_setup_fan_table(struct amdgpu_device *adev)
6504{
6505 struct si_power_info *si_pi = si_get_pi(adev);
6506 PP_SIslands_FanTable fan_table = { FDO_MODE_HARDWARE };
6507 u32 duty100;
6508 u32 t_diff1, t_diff2, pwm_diff1, pwm_diff2;
6509 u16 fdo_min, slope1, slope2;
6510 u32 reference_clock, tmp;
6511 int ret;
6512 u64 tmp64;
6513
6514 if (!si_pi->fan_table_start) {
6515 adev->pm.dpm.fan.ucode_fan_control = false;
6516 return 0;
6517 }
6518
6519 duty100 = (RREG32(CG_FDO_CTRL1) & FMAX_DUTY100_MASK) >> FMAX_DUTY100_SHIFT;
6520
6521 if (duty100 == 0) {
6522 adev->pm.dpm.fan.ucode_fan_control = false;
6523 return 0;
6524 }
6525
6526 tmp64 = (u64)adev->pm.dpm.fan.pwm_min * duty100;
6527 do_div(tmp64, 10000);
6528 fdo_min = (u16)tmp64;
6529
6530 t_diff1 = adev->pm.dpm.fan.t_med - adev->pm.dpm.fan.t_min;
6531 t_diff2 = adev->pm.dpm.fan.t_high - adev->pm.dpm.fan.t_med;
6532
6533 pwm_diff1 = adev->pm.dpm.fan.pwm_med - adev->pm.dpm.fan.pwm_min;
6534 pwm_diff2 = adev->pm.dpm.fan.pwm_high - adev->pm.dpm.fan.pwm_med;
6535
6536 slope1 = (u16)((50 + ((16 * duty100 * pwm_diff1) / t_diff1)) / 100);
6537 slope2 = (u16)((50 + ((16 * duty100 * pwm_diff2) / t_diff2)) / 100);
6538
6539 fan_table.temp_min = cpu_to_be16((50 + adev->pm.dpm.fan.t_min) / 100);
6540 fan_table.temp_med = cpu_to_be16((50 + adev->pm.dpm.fan.t_med) / 100);
6541 fan_table.temp_max = cpu_to_be16((50 + adev->pm.dpm.fan.t_max) / 100);
6542 fan_table.slope1 = cpu_to_be16(slope1);
6543 fan_table.slope2 = cpu_to_be16(slope2);
6544 fan_table.fdo_min = cpu_to_be16(fdo_min);
6545 fan_table.hys_down = cpu_to_be16(adev->pm.dpm.fan.t_hyst);
6546 fan_table.hys_up = cpu_to_be16(1);
6547 fan_table.hys_slope = cpu_to_be16(1);
6548 fan_table.temp_resp_lim = cpu_to_be16(5);
6549 reference_clock = amdgpu_asic_get_xclk(adev);
6550
6551 fan_table.refresh_period = cpu_to_be32((adev->pm.dpm.fan.cycle_delay *
6552 reference_clock) / 1600);
6553 fan_table.fdo_max = cpu_to_be16((u16)duty100);
6554
6555 tmp = (RREG32(CG_MULT_THERMAL_CTRL) & TEMP_SEL_MASK) >> TEMP_SEL_SHIFT;
6556 fan_table.temp_src = (uint8_t)tmp;
6557
6558 ret = amdgpu_si_copy_bytes_to_smc(adev,
6559 si_pi->fan_table_start,
6560 (u8 *)(&fan_table),
6561 sizeof(fan_table),
6562 si_pi->sram_end);
6563
6564 if (ret) {
6565 DRM_ERROR("Failed to load fan table to the SMC.");
6566 adev->pm.dpm.fan.ucode_fan_control = false;
6567 }
6568
6569 return ret;
6570}
6571
6572static int si_fan_ctrl_start_smc_fan_control(struct amdgpu_device *adev)
6573{
6574 struct si_power_info *si_pi = si_get_pi(adev);
6575 PPSMC_Result ret;
6576
6577 ret = amdgpu_si_send_msg_to_smc(adev, PPSMC_StartFanControl);
6578 if (ret == PPSMC_Result_OK) {
6579 si_pi->fan_is_controlled_by_smc = true;
6580 return 0;
6581 } else {
6582 return -EINVAL;
6583 }
6584}
6585
6586static int si_fan_ctrl_stop_smc_fan_control(struct amdgpu_device *adev)
6587{
6588 struct si_power_info *si_pi = si_get_pi(adev);
6589 PPSMC_Result ret;
6590
6591 ret = amdgpu_si_send_msg_to_smc(adev, PPSMC_StopFanControl);
6592
6593 if (ret == PPSMC_Result_OK) {
6594 si_pi->fan_is_controlled_by_smc = false;
6595 return 0;
6596 } else {
6597 return -EINVAL;
6598 }
6599}
6600
6601static int si_dpm_get_fan_speed_percent(struct amdgpu_device *adev,
6602 u32 *speed)
6603{
6604 u32 duty, duty100;
6605 u64 tmp64;
6606
6607 if (adev->pm.no_fan)
6608 return -ENOENT;
6609
6610 duty100 = (RREG32(CG_FDO_CTRL1) & FMAX_DUTY100_MASK) >> FMAX_DUTY100_SHIFT;
6611 duty = (RREG32(CG_THERMAL_STATUS) & FDO_PWM_DUTY_MASK) >> FDO_PWM_DUTY_SHIFT;
6612
6613 if (duty100 == 0)
6614 return -EINVAL;
6615
6616 tmp64 = (u64)duty * 100;
6617 do_div(tmp64, duty100);
6618 *speed = (u32)tmp64;
6619
6620 if (*speed > 100)
6621 *speed = 100;
6622
6623 return 0;
6624}
6625
6626static int si_dpm_set_fan_speed_percent(struct amdgpu_device *adev,
6627 u32 speed)
6628{
6629 struct si_power_info *si_pi = si_get_pi(adev);
6630 u32 tmp;
6631 u32 duty, duty100;
6632 u64 tmp64;
6633
6634 if (adev->pm.no_fan)
6635 return -ENOENT;
6636
6637 if (si_pi->fan_is_controlled_by_smc)
6638 return -EINVAL;
6639
6640 if (speed > 100)
6641 return -EINVAL;
6642
6643 duty100 = (RREG32(CG_FDO_CTRL1) & FMAX_DUTY100_MASK) >> FMAX_DUTY100_SHIFT;
6644
6645 if (duty100 == 0)
6646 return -EINVAL;
6647
6648 tmp64 = (u64)speed * duty100;
6649 do_div(tmp64, 100);
6650 duty = (u32)tmp64;
6651
6652 tmp = RREG32(CG_FDO_CTRL0) & ~FDO_STATIC_DUTY_MASK;
6653 tmp |= FDO_STATIC_DUTY(duty);
6654 WREG32(CG_FDO_CTRL0, tmp);
6655
6656 return 0;
6657}
6658
6659static void si_dpm_set_fan_control_mode(struct amdgpu_device *adev, u32 mode)
6660{
6661 if (mode) {
6662 /* stop auto-manage */
6663 if (adev->pm.dpm.fan.ucode_fan_control)
6664 si_fan_ctrl_stop_smc_fan_control(adev);
6665 si_fan_ctrl_set_static_mode(adev, mode);
6666 } else {
6667 /* restart auto-manage */
6668 if (adev->pm.dpm.fan.ucode_fan_control)
6669 si_thermal_start_smc_fan_control(adev);
6670 else
6671 si_fan_ctrl_set_default_mode(adev);
6672 }
6673}
6674
6675static u32 si_dpm_get_fan_control_mode(struct amdgpu_device *adev)
6676{
6677 struct si_power_info *si_pi = si_get_pi(adev);
6678 u32 tmp;
6679
6680 if (si_pi->fan_is_controlled_by_smc)
6681 return 0;
6682
6683 tmp = RREG32(CG_FDO_CTRL2) & FDO_PWM_MODE_MASK;
6684 return (tmp >> FDO_PWM_MODE_SHIFT);
6685}
6686
6687#if 0
6688static int si_fan_ctrl_get_fan_speed_rpm(struct amdgpu_device *adev,
6689 u32 *speed)
6690{
6691 u32 tach_period;
6692 u32 xclk = amdgpu_asic_get_xclk(adev);
6693
6694 if (adev->pm.no_fan)
6695 return -ENOENT;
6696
6697 if (adev->pm.fan_pulses_per_revolution == 0)
6698 return -ENOENT;
6699
6700 tach_period = (RREG32(CG_TACH_STATUS) & TACH_PERIOD_MASK) >> TACH_PERIOD_SHIFT;
6701 if (tach_period == 0)
6702 return -ENOENT;
6703
6704 *speed = 60 * xclk * 10000 / tach_period;
6705
6706 return 0;
6707}
6708
6709static int si_fan_ctrl_set_fan_speed_rpm(struct amdgpu_device *adev,
6710 u32 speed)
6711{
6712 u32 tach_period, tmp;
6713 u32 xclk = amdgpu_asic_get_xclk(adev);
6714
6715 if (adev->pm.no_fan)
6716 return -ENOENT;
6717
6718 if (adev->pm.fan_pulses_per_revolution == 0)
6719 return -ENOENT;
6720
6721 if ((speed < adev->pm.fan_min_rpm) ||
6722 (speed > adev->pm.fan_max_rpm))
6723 return -EINVAL;
6724
6725 if (adev->pm.dpm.fan.ucode_fan_control)
6726 si_fan_ctrl_stop_smc_fan_control(adev);
6727
6728 tach_period = 60 * xclk * 10000 / (8 * speed);
6729 tmp = RREG32(CG_TACH_CTRL) & ~TARGET_PERIOD_MASK;
6730 tmp |= TARGET_PERIOD(tach_period);
6731 WREG32(CG_TACH_CTRL, tmp);
6732
6733 si_fan_ctrl_set_static_mode(adev, FDO_PWM_MODE_STATIC_RPM);
6734
6735 return 0;
6736}
6737#endif
6738
6739static void si_fan_ctrl_set_default_mode(struct amdgpu_device *adev)
6740{
6741 struct si_power_info *si_pi = si_get_pi(adev);
6742 u32 tmp;
6743
6744 if (!si_pi->fan_ctrl_is_in_default_mode) {
6745 tmp = RREG32(CG_FDO_CTRL2) & ~FDO_PWM_MODE_MASK;
6746 tmp |= FDO_PWM_MODE(si_pi->fan_ctrl_default_mode);
6747 WREG32(CG_FDO_CTRL2, tmp);
6748
6749 tmp = RREG32(CG_FDO_CTRL2) & ~TMIN_MASK;
6750 tmp |= TMIN(si_pi->t_min);
6751 WREG32(CG_FDO_CTRL2, tmp);
6752 si_pi->fan_ctrl_is_in_default_mode = true;
6753 }
6754}
6755
6756static void si_thermal_start_smc_fan_control(struct amdgpu_device *adev)
6757{
6758 if (adev->pm.dpm.fan.ucode_fan_control) {
6759 si_fan_ctrl_start_smc_fan_control(adev);
6760 si_fan_ctrl_set_static_mode(adev, FDO_PWM_MODE_STATIC);
6761 }
6762}
6763
6764static void si_thermal_initialize(struct amdgpu_device *adev)
6765{
6766 u32 tmp;
6767
6768 if (adev->pm.fan_pulses_per_revolution) {
6769 tmp = RREG32(CG_TACH_CTRL) & ~EDGE_PER_REV_MASK;
6770 tmp |= EDGE_PER_REV(adev->pm.fan_pulses_per_revolution -1);
6771 WREG32(CG_TACH_CTRL, tmp);
6772 }
6773
6774 tmp = RREG32(CG_FDO_CTRL2) & ~TACH_PWM_RESP_RATE_MASK;
6775 tmp |= TACH_PWM_RESP_RATE(0x28);
6776 WREG32(CG_FDO_CTRL2, tmp);
6777}
6778
6779static int si_thermal_start_thermal_controller(struct amdgpu_device *adev)
6780{
6781 int ret;
6782
6783 si_thermal_initialize(adev);
6784 ret = si_thermal_set_temperature_range(adev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX);
6785 if (ret)
6786 return ret;
6787 ret = si_thermal_enable_alert(adev, true);
6788 if (ret)
6789 return ret;
6790 if (adev->pm.dpm.fan.ucode_fan_control) {
6791 ret = si_halt_smc(adev);
6792 if (ret)
6793 return ret;
6794 ret = si_thermal_setup_fan_table(adev);
6795 if (ret)
6796 return ret;
6797 ret = si_resume_smc(adev);
6798 if (ret)
6799 return ret;
6800 si_thermal_start_smc_fan_control(adev);
6801 }
6802
6803 return 0;
6804}
6805
6806static void si_thermal_stop_thermal_controller(struct amdgpu_device *adev)
6807{
6808 if (!adev->pm.no_fan) {
6809 si_fan_ctrl_set_default_mode(adev);
6810 si_fan_ctrl_stop_smc_fan_control(adev);
6811 }
6812}
6813
6814static int si_dpm_enable(struct amdgpu_device *adev)
6815{
6816 struct rv7xx_power_info *pi = rv770_get_pi(adev);
6817 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
6818 struct si_power_info *si_pi = si_get_pi(adev);
6819 struct amdgpu_ps *boot_ps = adev->pm.dpm.boot_ps;
6820 int ret;
6821
6822 if (amdgpu_si_is_smc_running(adev))
6823 return -EINVAL;
6824 if (pi->voltage_control || si_pi->voltage_control_svi2)
6825 si_enable_voltage_control(adev, true);
6826 if (pi->mvdd_control)
6827 si_get_mvdd_configuration(adev);
6828 if (pi->voltage_control || si_pi->voltage_control_svi2) {
6829 ret = si_construct_voltage_tables(adev);
6830 if (ret) {
6831 DRM_ERROR("si_construct_voltage_tables failed\n");
6832 return ret;
6833 }
6834 }
6835 if (eg_pi->dynamic_ac_timing) {
6836 ret = si_initialize_mc_reg_table(adev);
6837 if (ret)
6838 eg_pi->dynamic_ac_timing = false;
6839 }
6840 if (pi->dynamic_ss)
6841 si_enable_spread_spectrum(adev, true);
6842 if (pi->thermal_protection)
6843 si_enable_thermal_protection(adev, true);
6844 si_setup_bsp(adev);
6845 si_program_git(adev);
6846 si_program_tp(adev);
6847 si_program_tpp(adev);
6848 si_program_sstp(adev);
6849 si_enable_display_gap(adev);
6850 si_program_vc(adev);
6851 ret = si_upload_firmware(adev);
6852 if (ret) {
6853 DRM_ERROR("si_upload_firmware failed\n");
6854 return ret;
6855 }
6856 ret = si_process_firmware_header(adev);
6857 if (ret) {
6858 DRM_ERROR("si_process_firmware_header failed\n");
6859 return ret;
6860 }
6861 ret = si_initial_switch_from_arb_f0_to_f1(adev);
6862 if (ret) {
6863 DRM_ERROR("si_initial_switch_from_arb_f0_to_f1 failed\n");
6864 return ret;
6865 }
6866 ret = si_init_smc_table(adev);
6867 if (ret) {
6868 DRM_ERROR("si_init_smc_table failed\n");
6869 return ret;
6870 }
6871 ret = si_init_smc_spll_table(adev);
6872 if (ret) {
6873 DRM_ERROR("si_init_smc_spll_table failed\n");
6874 return ret;
6875 }
6876 ret = si_init_arb_table_index(adev);
6877 if (ret) {
6878 DRM_ERROR("si_init_arb_table_index failed\n");
6879 return ret;
6880 }
6881 if (eg_pi->dynamic_ac_timing) {
6882 ret = si_populate_mc_reg_table(adev, boot_ps);
6883 if (ret) {
6884 DRM_ERROR("si_populate_mc_reg_table failed\n");
6885 return ret;
6886 }
6887 }
6888 ret = si_initialize_smc_cac_tables(adev);
6889 if (ret) {
6890 DRM_ERROR("si_initialize_smc_cac_tables failed\n");
6891 return ret;
6892 }
6893 ret = si_initialize_hardware_cac_manager(adev);
6894 if (ret) {
6895 DRM_ERROR("si_initialize_hardware_cac_manager failed\n");
6896 return ret;
6897 }
6898 ret = si_initialize_smc_dte_tables(adev);
6899 if (ret) {
6900 DRM_ERROR("si_initialize_smc_dte_tables failed\n");
6901 return ret;
6902 }
6903 ret = si_populate_smc_tdp_limits(adev, boot_ps);
6904 if (ret) {
6905 DRM_ERROR("si_populate_smc_tdp_limits failed\n");
6906 return ret;
6907 }
6908 ret = si_populate_smc_tdp_limits_2(adev, boot_ps);
6909 if (ret) {
6910 DRM_ERROR("si_populate_smc_tdp_limits_2 failed\n");
6911 return ret;
6912 }
6913 si_program_response_times(adev);
6914 si_program_ds_registers(adev);
6915 si_dpm_start_smc(adev);
6916 ret = si_notify_smc_display_change(adev, false);
6917 if (ret) {
6918 DRM_ERROR("si_notify_smc_display_change failed\n");
6919 return ret;
6920 }
6921 si_enable_sclk_control(adev, true);
6922 si_start_dpm(adev);
6923
6924 si_enable_auto_throttle_source(adev, AMDGPU_DPM_AUTO_THROTTLE_SRC_THERMAL, true);
6925 si_thermal_start_thermal_controller(adev);
6926 ni_update_current_ps(adev, boot_ps);
6927
6928 return 0;
6929}
6930
6931static int si_set_temperature_range(struct amdgpu_device *adev)
6932{
6933 int ret;
6934
6935 ret = si_thermal_enable_alert(adev, false);
6936 if (ret)
6937 return ret;
6938 ret = si_thermal_set_temperature_range(adev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX);
6939 if (ret)
6940 return ret;
6941 ret = si_thermal_enable_alert(adev, true);
6942 if (ret)
6943 return ret;
6944
6945 return ret;
6946}
6947
6948static void si_dpm_disable(struct amdgpu_device *adev)
6949{
6950 struct rv7xx_power_info *pi = rv770_get_pi(adev);
6951 struct amdgpu_ps *boot_ps = adev->pm.dpm.boot_ps;
6952
6953 if (!amdgpu_si_is_smc_running(adev))
6954 return;
6955 si_thermal_stop_thermal_controller(adev);
6956 si_disable_ulv(adev);
6957 si_clear_vc(adev);
6958 if (pi->thermal_protection)
6959 si_enable_thermal_protection(adev, false);
6960 si_enable_power_containment(adev, boot_ps, false);
6961 si_enable_smc_cac(adev, boot_ps, false);
6962 si_enable_spread_spectrum(adev, false);
6963 si_enable_auto_throttle_source(adev, AMDGPU_DPM_AUTO_THROTTLE_SRC_THERMAL, false);
6964 si_stop_dpm(adev);
6965 si_reset_to_default(adev);
6966 si_dpm_stop_smc(adev);
6967 si_force_switch_to_arb_f0(adev);
6968
6969 ni_update_current_ps(adev, boot_ps);
6970}
6971
6972static int si_dpm_pre_set_power_state(struct amdgpu_device *adev)
6973{
6974 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
6975 struct amdgpu_ps requested_ps = *adev->pm.dpm.requested_ps;
6976 struct amdgpu_ps *new_ps = &requested_ps;
6977
6978 ni_update_requested_ps(adev, new_ps);
6979 si_apply_state_adjust_rules(adev, &eg_pi->requested_rps);
6980
6981 return 0;
6982}
6983
6984static int si_power_control_set_level(struct amdgpu_device *adev)
6985{
6986 struct amdgpu_ps *new_ps = adev->pm.dpm.requested_ps;
6987 int ret;
6988
6989 ret = si_restrict_performance_levels_before_switch(adev);
6990 if (ret)
6991 return ret;
6992 ret = si_halt_smc(adev);
6993 if (ret)
6994 return ret;
6995 ret = si_populate_smc_tdp_limits(adev, new_ps);
6996 if (ret)
6997 return ret;
6998 ret = si_populate_smc_tdp_limits_2(adev, new_ps);
6999 if (ret)
7000 return ret;
7001 ret = si_resume_smc(adev);
7002 if (ret)
7003 return ret;
7004 ret = si_set_sw_state(adev);
7005 if (ret)
7006 return ret;
7007 return 0;
7008}
7009
7010static int si_dpm_set_power_state(struct amdgpu_device *adev)
7011{
7012 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
7013 struct amdgpu_ps *new_ps = &eg_pi->requested_rps;
7014 struct amdgpu_ps *old_ps = &eg_pi->current_rps;
7015 int ret;
7016
7017 ret = si_disable_ulv(adev);
7018 if (ret) {
7019 DRM_ERROR("si_disable_ulv failed\n");
7020 return ret;
7021 }
7022 ret = si_restrict_performance_levels_before_switch(adev);
7023 if (ret) {
7024 DRM_ERROR("si_restrict_performance_levels_before_switch failed\n");
7025 return ret;
7026 }
7027 if (eg_pi->pcie_performance_request)
7028 si_request_link_speed_change_before_state_change(adev, new_ps, old_ps);
7029 ni_set_uvd_clock_before_set_eng_clock(adev, new_ps, old_ps);
7030 ret = si_enable_power_containment(adev, new_ps, false);
7031 if (ret) {
7032 DRM_ERROR("si_enable_power_containment failed\n");
7033 return ret;
7034 }
7035 ret = si_enable_smc_cac(adev, new_ps, false);
7036 if (ret) {
7037 DRM_ERROR("si_enable_smc_cac failed\n");
7038 return ret;
7039 }
7040 ret = si_halt_smc(adev);
7041 if (ret) {
7042 DRM_ERROR("si_halt_smc failed\n");
7043 return ret;
7044 }
7045 ret = si_upload_sw_state(adev, new_ps);
7046 if (ret) {
7047 DRM_ERROR("si_upload_sw_state failed\n");
7048 return ret;
7049 }
7050 ret = si_upload_smc_data(adev);
7051 if (ret) {
7052 DRM_ERROR("si_upload_smc_data failed\n");
7053 return ret;
7054 }
7055 ret = si_upload_ulv_state(adev);
7056 if (ret) {
7057 DRM_ERROR("si_upload_ulv_state failed\n");
7058 return ret;
7059 }
7060 if (eg_pi->dynamic_ac_timing) {
7061 ret = si_upload_mc_reg_table(adev, new_ps);
7062 if (ret) {
7063 DRM_ERROR("si_upload_mc_reg_table failed\n");
7064 return ret;
7065 }
7066 }
7067 ret = si_program_memory_timing_parameters(adev, new_ps);
7068 if (ret) {
7069 DRM_ERROR("si_program_memory_timing_parameters failed\n");
7070 return ret;
7071 }
7072 si_set_pcie_lane_width_in_smc(adev, new_ps, old_ps);
7073
7074 ret = si_resume_smc(adev);
7075 if (ret) {
7076 DRM_ERROR("si_resume_smc failed\n");
7077 return ret;
7078 }
7079 ret = si_set_sw_state(adev);
7080 if (ret) {
7081 DRM_ERROR("si_set_sw_state failed\n");
7082 return ret;
7083 }
7084 ni_set_uvd_clock_after_set_eng_clock(adev, new_ps, old_ps);
7085 if (eg_pi->pcie_performance_request)
7086 si_notify_link_speed_change_after_state_change(adev, new_ps, old_ps);
7087 ret = si_set_power_state_conditionally_enable_ulv(adev, new_ps);
7088 if (ret) {
7089 DRM_ERROR("si_set_power_state_conditionally_enable_ulv failed\n");
7090 return ret;
7091 }
7092 ret = si_enable_smc_cac(adev, new_ps, true);
7093 if (ret) {
7094 DRM_ERROR("si_enable_smc_cac failed\n");
7095 return ret;
7096 }
7097 ret = si_enable_power_containment(adev, new_ps, true);
7098 if (ret) {
7099 DRM_ERROR("si_enable_power_containment failed\n");
7100 return ret;
7101 }
7102
7103 ret = si_power_control_set_level(adev);
7104 if (ret) {
7105 DRM_ERROR("si_power_control_set_level failed\n");
7106 return ret;
7107 }
7108
7109 return 0;
7110}
7111
7112static void si_dpm_post_set_power_state(struct amdgpu_device *adev)
7113{
7114 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
7115 struct amdgpu_ps *new_ps = &eg_pi->requested_rps;
7116
7117 ni_update_current_ps(adev, new_ps);
7118}
7119
7120#if 0
7121void si_dpm_reset_asic(struct amdgpu_device *adev)
7122{
7123 si_restrict_performance_levels_before_switch(adev);
7124 si_disable_ulv(adev);
7125 si_set_boot_state(adev);
7126}
7127#endif
7128
7129static void si_dpm_display_configuration_changed(struct amdgpu_device *adev)
7130{
7131 si_program_display_gap(adev);
7132}
7133
7134
7135static void si_parse_pplib_non_clock_info(struct amdgpu_device *adev,
7136 struct amdgpu_ps *rps,
7137 struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info,
7138 u8 table_rev)
7139{
7140 rps->caps = le32_to_cpu(non_clock_info->ulCapsAndSettings);
7141 rps->class = le16_to_cpu(non_clock_info->usClassification);
7142 rps->class2 = le16_to_cpu(non_clock_info->usClassification2);
7143
7144 if (ATOM_PPLIB_NONCLOCKINFO_VER1 < table_rev) {
7145 rps->vclk = le32_to_cpu(non_clock_info->ulVCLK);
7146 rps->dclk = le32_to_cpu(non_clock_info->ulDCLK);
7147 } else if (r600_is_uvd_state(rps->class, rps->class2)) {
7148 rps->vclk = RV770_DEFAULT_VCLK_FREQ;
7149 rps->dclk = RV770_DEFAULT_DCLK_FREQ;
7150 } else {
7151 rps->vclk = 0;
7152 rps->dclk = 0;
7153 }
7154
7155 if (rps->class & ATOM_PPLIB_CLASSIFICATION_BOOT)
7156 adev->pm.dpm.boot_ps = rps;
7157 if (rps->class & ATOM_PPLIB_CLASSIFICATION_UVDSTATE)
7158 adev->pm.dpm.uvd_ps = rps;
7159}
7160
7161static void si_parse_pplib_clock_info(struct amdgpu_device *adev,
7162 struct amdgpu_ps *rps, int index,
7163 union pplib_clock_info *clock_info)
7164{
7165 struct rv7xx_power_info *pi = rv770_get_pi(adev);
7166 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
7167 struct si_power_info *si_pi = si_get_pi(adev);
7168 struct si_ps *ps = si_get_ps(rps);
7169 u16 leakage_voltage;
7170 struct rv7xx_pl *pl = &ps->performance_levels[index];
7171 int ret;
7172
7173 ps->performance_level_count = index + 1;
7174
7175 pl->sclk = le16_to_cpu(clock_info->si.usEngineClockLow);
7176 pl->sclk |= clock_info->si.ucEngineClockHigh << 16;
7177 pl->mclk = le16_to_cpu(clock_info->si.usMemoryClockLow);
7178 pl->mclk |= clock_info->si.ucMemoryClockHigh << 16;
7179
7180 pl->vddc = le16_to_cpu(clock_info->si.usVDDC);
7181 pl->vddci = le16_to_cpu(clock_info->si.usVDDCI);
7182 pl->flags = le32_to_cpu(clock_info->si.ulFlags);
7183 pl->pcie_gen = r600_get_pcie_gen_support(adev,
7184 si_pi->sys_pcie_mask,
7185 si_pi->boot_pcie_gen,
7186 clock_info->si.ucPCIEGen);
7187
7188 /* patch up vddc if necessary */
7189 ret = si_get_leakage_voltage_from_leakage_index(adev, pl->vddc,
7190 &leakage_voltage);
7191 if (ret == 0)
7192 pl->vddc = leakage_voltage;
7193
7194 if (rps->class & ATOM_PPLIB_CLASSIFICATION_ACPI) {
7195 pi->acpi_vddc = pl->vddc;
7196 eg_pi->acpi_vddci = pl->vddci;
7197 si_pi->acpi_pcie_gen = pl->pcie_gen;
7198 }
7199
7200 if ((rps->class2 & ATOM_PPLIB_CLASSIFICATION2_ULV) &&
7201 index == 0) {
7202 /* XXX disable for A0 tahiti */
7203 si_pi->ulv.supported = false;
7204 si_pi->ulv.pl = *pl;
7205 si_pi->ulv.one_pcie_lane_in_ulv = false;
7206 si_pi->ulv.volt_change_delay = SISLANDS_ULVVOLTAGECHANGEDELAY_DFLT;
7207 si_pi->ulv.cg_ulv_parameter = SISLANDS_CGULVPARAMETER_DFLT;
7208 si_pi->ulv.cg_ulv_control = SISLANDS_CGULVCONTROL_DFLT;
7209 }
7210
7211 if (pi->min_vddc_in_table > pl->vddc)
7212 pi->min_vddc_in_table = pl->vddc;
7213
7214 if (pi->max_vddc_in_table < pl->vddc)
7215 pi->max_vddc_in_table = pl->vddc;
7216
7217 /* patch up boot state */
7218 if (rps->class & ATOM_PPLIB_CLASSIFICATION_BOOT) {
7219 u16 vddc, vddci, mvdd;
7220 amdgpu_atombios_get_default_voltages(adev, &vddc, &vddci, &mvdd);
7221 pl->mclk = adev->clock.default_mclk;
7222 pl->sclk = adev->clock.default_sclk;
7223 pl->vddc = vddc;
7224 pl->vddci = vddci;
7225 si_pi->mvdd_bootup_value = mvdd;
7226 }
7227
7228 if ((rps->class & ATOM_PPLIB_CLASSIFICATION_UI_MASK) ==
7229 ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE) {
7230 adev->pm.dpm.dyn_state.max_clock_voltage_on_ac.sclk = pl->sclk;
7231 adev->pm.dpm.dyn_state.max_clock_voltage_on_ac.mclk = pl->mclk;
7232 adev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddc = pl->vddc;
7233 adev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddci = pl->vddci;
7234 }
7235}
7236
7237union pplib_power_state {
7238 struct _ATOM_PPLIB_STATE v1;
7239 struct _ATOM_PPLIB_STATE_V2 v2;
7240};
7241
7242static int si_parse_power_table(struct amdgpu_device *adev)
7243{
7244 struct amdgpu_mode_info *mode_info = &adev->mode_info;
7245 struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
7246 union pplib_power_state *power_state;
7247 int i, j, k, non_clock_array_index, clock_array_index;
7248 union pplib_clock_info *clock_info;
7249 struct _StateArray *state_array;
7250 struct _ClockInfoArray *clock_info_array;
7251 struct _NonClockInfoArray *non_clock_info_array;
7252 union power_info *power_info;
7253 int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
7254 u16 data_offset;
7255 u8 frev, crev;
7256 u8 *power_state_offset;
7257 struct si_ps *ps;
7258
7259 if (!amdgpu_atom_parse_data_header(mode_info->atom_context, index, NULL,
7260 &frev, &crev, &data_offset))
7261 return -EINVAL;
7262 power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
7263
7264 amdgpu_add_thermal_controller(adev);
7265
7266 state_array = (struct _StateArray *)
7267 (mode_info->atom_context->bios + data_offset +
7268 le16_to_cpu(power_info->pplib.usStateArrayOffset));
7269 clock_info_array = (struct _ClockInfoArray *)
7270 (mode_info->atom_context->bios + data_offset +
7271 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset));
7272 non_clock_info_array = (struct _NonClockInfoArray *)
7273 (mode_info->atom_context->bios + data_offset +
7274 le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset));
7275
7276 adev->pm.dpm.ps = kzalloc(sizeof(struct amdgpu_ps) *
7277 state_array->ucNumEntries, GFP_KERNEL);
7278 if (!adev->pm.dpm.ps)
7279 return -ENOMEM;
7280 power_state_offset = (u8 *)state_array->states;
7281 for (i = 0; i < state_array->ucNumEntries; i++) {
7282 u8 *idx;
7283 power_state = (union pplib_power_state *)power_state_offset;
7284 non_clock_array_index = power_state->v2.nonClockInfoIndex;
7285 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
7286 &non_clock_info_array->nonClockInfo[non_clock_array_index];
7287 ps = kzalloc(sizeof(struct si_ps), GFP_KERNEL);
7288 if (ps == NULL) {
7289 kfree(adev->pm.dpm.ps);
7290 return -ENOMEM;
7291 }
7292 adev->pm.dpm.ps[i].ps_priv = ps;
7293 si_parse_pplib_non_clock_info(adev, &adev->pm.dpm.ps[i],
7294 non_clock_info,
7295 non_clock_info_array->ucEntrySize);
7296 k = 0;
7297 idx = (u8 *)&power_state->v2.clockInfoIndex[0];
7298 for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) {
7299 clock_array_index = idx[j];
7300 if (clock_array_index >= clock_info_array->ucNumEntries)
7301 continue;
7302 if (k >= SISLANDS_MAX_HARDWARE_POWERLEVELS)
7303 break;
7304 clock_info = (union pplib_clock_info *)
7305 ((u8 *)&clock_info_array->clockInfo[0] +
7306 (clock_array_index * clock_info_array->ucEntrySize));
7307 si_parse_pplib_clock_info(adev,
7308 &adev->pm.dpm.ps[i], k,
7309 clock_info);
7310 k++;
7311 }
7312 power_state_offset += 2 + power_state->v2.ucNumDPMLevels;
7313 }
7314 adev->pm.dpm.num_ps = state_array->ucNumEntries;
7315
7316 /* fill in the vce power states */
7317 for (i = 0; i < AMDGPU_MAX_VCE_LEVELS; i++) {
7318 u32 sclk, mclk;
7319 clock_array_index = adev->pm.dpm.vce_states[i].clk_idx;
7320 clock_info = (union pplib_clock_info *)
7321 &clock_info_array->clockInfo[clock_array_index * clock_info_array->ucEntrySize];
7322 sclk = le16_to_cpu(clock_info->si.usEngineClockLow);
7323 sclk |= clock_info->si.ucEngineClockHigh << 16;
7324 mclk = le16_to_cpu(clock_info->si.usMemoryClockLow);
7325 mclk |= clock_info->si.ucMemoryClockHigh << 16;
7326 adev->pm.dpm.vce_states[i].sclk = sclk;
7327 adev->pm.dpm.vce_states[i].mclk = mclk;
7328 }
7329
7330 return 0;
7331}
7332
7333static int si_dpm_init(struct amdgpu_device *adev)
7334{
7335 struct rv7xx_power_info *pi;
7336 struct evergreen_power_info *eg_pi;
7337 struct ni_power_info *ni_pi;
7338 struct si_power_info *si_pi;
7339 struct atom_clock_dividers dividers;
7340 int ret;
7341 u32 mask;
7342
7343 si_pi = kzalloc(sizeof(struct si_power_info), GFP_KERNEL);
7344 if (si_pi == NULL)
7345 return -ENOMEM;
7346 adev->pm.dpm.priv = si_pi;
7347 ni_pi = &si_pi->ni;
7348 eg_pi = &ni_pi->eg;
7349 pi = &eg_pi->rv7xx;
7350
7351 ret = drm_pcie_get_speed_cap_mask(adev->ddev, &mask);
7352 if (ret)
7353 si_pi->sys_pcie_mask = 0;
7354 else
7355 si_pi->sys_pcie_mask = mask;
7356 si_pi->force_pcie_gen = AMDGPU_PCIE_GEN_INVALID;
7357 si_pi->boot_pcie_gen = si_get_current_pcie_speed(adev);
7358
7359 si_set_max_cu_value(adev);
7360
7361 rv770_get_max_vddc(adev);
7362 si_get_leakage_vddc(adev);
7363 si_patch_dependency_tables_based_on_leakage(adev);
7364
7365 pi->acpi_vddc = 0;
7366 eg_pi->acpi_vddci = 0;
7367 pi->min_vddc_in_table = 0;
7368 pi->max_vddc_in_table = 0;
7369
7370 ret = amdgpu_get_platform_caps(adev);
7371 if (ret)
7372 return ret;
7373
7374 ret = amdgpu_parse_extended_power_table(adev);
7375 if (ret)
7376 return ret;
7377
7378 ret = si_parse_power_table(adev);
7379 if (ret)
7380 return ret;
7381
7382 adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries =
7383 kzalloc(4 * sizeof(struct amdgpu_clock_voltage_dependency_entry), GFP_KERNEL);
7384 if (!adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries) {
7385 amdgpu_free_extended_power_table(adev);
7386 return -ENOMEM;
7387 }
7388 adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.count = 4;
7389 adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].clk = 0;
7390 adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].v = 0;
7391 adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].clk = 36000;
7392 adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].v = 720;
7393 adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].clk = 54000;
7394 adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].v = 810;
7395 adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].clk = 72000;
7396 adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].v = 900;
7397
7398 if (adev->pm.dpm.voltage_response_time == 0)
7399 adev->pm.dpm.voltage_response_time = R600_VOLTAGERESPONSETIME_DFLT;
7400 if (adev->pm.dpm.backbias_response_time == 0)
7401 adev->pm.dpm.backbias_response_time = R600_BACKBIASRESPONSETIME_DFLT;
7402
7403 ret = amdgpu_atombios_get_clock_dividers(adev, COMPUTE_ENGINE_PLL_PARAM,
7404 0, false, &dividers);
7405 if (ret)
7406 pi->ref_div = dividers.ref_div + 1;
7407 else
7408 pi->ref_div = R600_REFERENCEDIVIDER_DFLT;
7409
7410 eg_pi->smu_uvd_hs = false;
7411
7412 pi->mclk_strobe_mode_threshold = 40000;
7413 if (si_is_special_1gb_platform(adev))
7414 pi->mclk_stutter_mode_threshold = 0;
7415 else
7416 pi->mclk_stutter_mode_threshold = pi->mclk_strobe_mode_threshold;
7417 pi->mclk_edc_enable_threshold = 40000;
7418 eg_pi->mclk_edc_wr_enable_threshold = 40000;
7419
7420 ni_pi->mclk_rtt_mode_threshold = eg_pi->mclk_edc_wr_enable_threshold;
7421
7422 pi->voltage_control =
7423 amdgpu_atombios_is_voltage_gpio(adev, SET_VOLTAGE_TYPE_ASIC_VDDC,
7424 VOLTAGE_OBJ_GPIO_LUT);
7425 if (!pi->voltage_control) {
7426 si_pi->voltage_control_svi2 =
7427 amdgpu_atombios_is_voltage_gpio(adev, SET_VOLTAGE_TYPE_ASIC_VDDC,
7428 VOLTAGE_OBJ_SVID2);
7429 if (si_pi->voltage_control_svi2)
7430 amdgpu_atombios_get_svi2_info(adev, SET_VOLTAGE_TYPE_ASIC_VDDC,
7431 &si_pi->svd_gpio_id, &si_pi->svc_gpio_id);
7432 }
7433
7434 pi->mvdd_control =
7435 amdgpu_atombios_is_voltage_gpio(adev, SET_VOLTAGE_TYPE_ASIC_MVDDC,
7436 VOLTAGE_OBJ_GPIO_LUT);
7437
7438 eg_pi->vddci_control =
7439 amdgpu_atombios_is_voltage_gpio(adev, SET_VOLTAGE_TYPE_ASIC_VDDCI,
7440 VOLTAGE_OBJ_GPIO_LUT);
7441 if (!eg_pi->vddci_control)
7442 si_pi->vddci_control_svi2 =
7443 amdgpu_atombios_is_voltage_gpio(adev, SET_VOLTAGE_TYPE_ASIC_VDDCI,
7444 VOLTAGE_OBJ_SVID2);
7445
7446 si_pi->vddc_phase_shed_control =
7447 amdgpu_atombios_is_voltage_gpio(adev, SET_VOLTAGE_TYPE_ASIC_VDDC,
7448 VOLTAGE_OBJ_PHASE_LUT);
7449
7450 rv770_get_engine_memory_ss(adev);
7451
7452 pi->asi = RV770_ASI_DFLT;
7453 pi->pasi = CYPRESS_HASI_DFLT;
7454 pi->vrc = SISLANDS_VRC_DFLT;
7455
7456 pi->gfx_clock_gating = true;
7457
7458 eg_pi->sclk_deep_sleep = true;
7459 si_pi->sclk_deep_sleep_above_low = false;
7460
7461 if (adev->pm.int_thermal_type != THERMAL_TYPE_NONE)
7462 pi->thermal_protection = true;
7463 else
7464 pi->thermal_protection = false;
7465
7466 eg_pi->dynamic_ac_timing = true;
7467
7468 eg_pi->light_sleep = true;
7469#if defined(CONFIG_ACPI)
7470 eg_pi->pcie_performance_request =
7471 amdgpu_acpi_is_pcie_performance_request_supported(adev);
7472#else
7473 eg_pi->pcie_performance_request = false;
7474#endif
7475
7476 si_pi->sram_end = SMC_RAM_END;
7477
7478 adev->pm.dpm.dyn_state.mclk_sclk_ratio = 4;
7479 adev->pm.dpm.dyn_state.sclk_mclk_delta = 15000;
7480 adev->pm.dpm.dyn_state.vddc_vddci_delta = 200;
7481 adev->pm.dpm.dyn_state.valid_sclk_values.count = 0;
7482 adev->pm.dpm.dyn_state.valid_sclk_values.values = NULL;
7483 adev->pm.dpm.dyn_state.valid_mclk_values.count = 0;
7484 adev->pm.dpm.dyn_state.valid_mclk_values.values = NULL;
7485
7486 si_initialize_powertune_defaults(adev);
7487
7488 /* make sure dc limits are valid */
7489 if ((adev->pm.dpm.dyn_state.max_clock_voltage_on_dc.sclk == 0) ||
7490 (adev->pm.dpm.dyn_state.max_clock_voltage_on_dc.mclk == 0))
7491 adev->pm.dpm.dyn_state.max_clock_voltage_on_dc =
7492 adev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
7493
7494 si_pi->fan_ctrl_is_in_default_mode = true;
7495
7496 return 0;
7497}
7498
7499static void si_dpm_fini(struct amdgpu_device *adev)
7500{
7501 int i;
7502
7503 if (adev->pm.dpm.ps)
7504 for (i = 0; i < adev->pm.dpm.num_ps; i++)
7505 kfree(adev->pm.dpm.ps[i].ps_priv);
7506 kfree(adev->pm.dpm.ps);
7507 kfree(adev->pm.dpm.priv);
7508 kfree(adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries);
7509 amdgpu_free_extended_power_table(adev);
7510}
7511
7512static void si_dpm_debugfs_print_current_performance_level(struct amdgpu_device *adev,
7513 struct seq_file *m)
7514{
7515 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
7516 struct amdgpu_ps *rps = &eg_pi->current_rps;
7517 struct si_ps *ps = si_get_ps(rps);
7518 struct rv7xx_pl *pl;
7519 u32 current_index =
7520 (RREG32(TARGET_AND_CURRENT_PROFILE_INDEX) & CURRENT_STATE_INDEX_MASK) >>
7521 CURRENT_STATE_INDEX_SHIFT;
7522
7523 if (current_index >= ps->performance_level_count) {
7524 seq_printf(m, "invalid dpm profile %d\n", current_index);
7525 } else {
7526 pl = &ps->performance_levels[current_index];
7527 seq_printf(m, "uvd vclk: %d dclk: %d\n", rps->vclk, rps->dclk);
7528 seq_printf(m, "power level %d sclk: %u mclk: %u vddc: %u vddci: %u pcie gen: %u\n",
7529 current_index, pl->sclk, pl->mclk, pl->vddc, pl->vddci, pl->pcie_gen + 1);
7530 }
7531}
7532
7533static int si_dpm_set_interrupt_state(struct amdgpu_device *adev,
7534 struct amdgpu_irq_src *source,
7535 unsigned type,
7536 enum amdgpu_interrupt_state state)
7537{
7538 u32 cg_thermal_int;
7539
7540 switch (type) {
7541 case AMDGPU_THERMAL_IRQ_LOW_TO_HIGH:
7542 switch (state) {
7543 case AMDGPU_IRQ_STATE_DISABLE:
7544 cg_thermal_int = RREG32_SMC(CG_THERMAL_INT);
7545 cg_thermal_int |= THERM_INT_MASK_HIGH;
7546 WREG32_SMC(CG_THERMAL_INT, cg_thermal_int);
7547 break;
7548 case AMDGPU_IRQ_STATE_ENABLE:
7549 cg_thermal_int = RREG32_SMC(CG_THERMAL_INT);
7550 cg_thermal_int &= ~THERM_INT_MASK_HIGH;
7551 WREG32_SMC(CG_THERMAL_INT, cg_thermal_int);
7552 break;
7553 default:
7554 break;
7555 }
7556 break;
7557
7558 case AMDGPU_THERMAL_IRQ_HIGH_TO_LOW:
7559 switch (state) {
7560 case AMDGPU_IRQ_STATE_DISABLE:
7561 cg_thermal_int = RREG32_SMC(CG_THERMAL_INT);
7562 cg_thermal_int |= THERM_INT_MASK_LOW;
7563 WREG32_SMC(CG_THERMAL_INT, cg_thermal_int);
7564 break;
7565 case AMDGPU_IRQ_STATE_ENABLE:
7566 cg_thermal_int = RREG32_SMC(CG_THERMAL_INT);
7567 cg_thermal_int &= ~THERM_INT_MASK_LOW;
7568 WREG32_SMC(CG_THERMAL_INT, cg_thermal_int);
7569 break;
7570 default:
7571 break;
7572 }
7573 break;
7574
7575 default:
7576 break;
7577 }
7578 return 0;
7579}
7580
7581static int si_dpm_process_interrupt(struct amdgpu_device *adev,
7582 struct amdgpu_irq_src *source,
7583 struct amdgpu_iv_entry *entry)
7584{
7585 bool queue_thermal = false;
7586
7587 if (entry == NULL)
7588 return -EINVAL;
7589
7590 switch (entry->src_id) {
7591 case 230: /* thermal low to high */
7592 DRM_DEBUG("IH: thermal low to high\n");
7593 adev->pm.dpm.thermal.high_to_low = false;
7594 queue_thermal = true;
7595 break;
7596 case 231: /* thermal high to low */
7597 DRM_DEBUG("IH: thermal high to low\n");
7598 adev->pm.dpm.thermal.high_to_low = true;
7599 queue_thermal = true;
7600 break;
7601 default:
7602 break;
7603 }
7604
7605 if (queue_thermal)
7606 schedule_work(&adev->pm.dpm.thermal.work);
7607
7608 return 0;
7609}
7610
7611static int si_dpm_late_init(void *handle)
7612{
7613 int ret;
7614 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
7615
7616 if (!amdgpu_dpm)
7617 return 0;
7618
7619 /* init the sysfs and debugfs files late */
7620 ret = amdgpu_pm_sysfs_init(adev);
7621 if (ret)
7622 return ret;
7623
7624 ret = si_set_temperature_range(adev);
7625 if (ret)
7626 return ret;
7627#if 0 //TODO ?
7628 si_dpm_powergate_uvd(adev, true);
7629#endif
7630 return 0;
7631}
7632
7633/**
7634 * si_dpm_init_microcode - load ucode images from disk
7635 *
7636 * @adev: amdgpu_device pointer
7637 *
7638 * Use the firmware interface to load the ucode images into
7639 * the driver (not loaded into hw).
7640 * Returns 0 on success, error on failure.
7641 */
7642static int si_dpm_init_microcode(struct amdgpu_device *adev)
7643{
7644 const char *chip_name;
7645 char fw_name[30];
7646 int err;
7647
7648 DRM_DEBUG("\n");
7649 switch (adev->asic_type) {
7650 case CHIP_TAHITI:
7651 chip_name = "tahiti";
7652 break;
7653 case CHIP_PITCAIRN:
7654 if ((adev->pdev->revision == 0x81) ||
7655 (adev->pdev->device == 0x6810) ||
7656 (adev->pdev->device == 0x6811) ||
7657 (adev->pdev->device == 0x6816) ||
7658 (adev->pdev->device == 0x6817) ||
7659 (adev->pdev->device == 0x6806))
7660 chip_name = "pitcairn_k";
7661 else
7662 chip_name = "pitcairn";
7663 break;
7664 case CHIP_VERDE:
7665 if ((adev->pdev->revision == 0x81) ||
7666 (adev->pdev->revision == 0x83) ||
7667 (adev->pdev->revision == 0x87) ||
7668 (adev->pdev->device == 0x6820) ||
7669 (adev->pdev->device == 0x6821) ||
7670 (adev->pdev->device == 0x6822) ||
7671 (adev->pdev->device == 0x6823) ||
7672 (adev->pdev->device == 0x682A) ||
7673 (adev->pdev->device == 0x682B))
7674 chip_name = "verde_k";
7675 else
7676 chip_name = "verde";
7677 break;
7678 case CHIP_OLAND:
7679 if ((adev->pdev->revision == 0xC7) ||
7680 (adev->pdev->revision == 0x80) ||
7681 (adev->pdev->revision == 0x81) ||
7682 (adev->pdev->revision == 0x83) ||
7683 (adev->pdev->device == 0x6604) ||
7684 (adev->pdev->device == 0x6605))
7685 chip_name = "oland_k";
7686 else
7687 chip_name = "oland";
7688 break;
7689 case CHIP_HAINAN:
7690 if ((adev->pdev->revision == 0x81) ||
7691 (adev->pdev->revision == 0x83) ||
7692 (adev->pdev->revision == 0xC3) ||
7693 (adev->pdev->device == 0x6664) ||
7694 (adev->pdev->device == 0x6665) ||
7695 (adev->pdev->device == 0x6667))
7696 chip_name = "hainan_k";
7697 else
7698 chip_name = "hainan";
7699 break;
7700 default: BUG();
7701 }
7702
7703 snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
7704 err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
7705 if (err)
7706 goto out;
7707 err = amdgpu_ucode_validate(adev->pm.fw);
7708
7709out:
7710 if (err) {
7711 DRM_ERROR("si_smc: Failed to load firmware. err = %d\"%s\"\n",
7712 err, fw_name);
7713 release_firmware(adev->pm.fw);
7714 adev->pm.fw = NULL;
7715 }
7716 return err;
7717
7718}
7719
7720static int si_dpm_sw_init(void *handle)
7721{
7722 int ret;
7723 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
7724
7725 ret = amdgpu_irq_add_id(adev, 230, &adev->pm.dpm.thermal.irq);
7726 if (ret)
7727 return ret;
7728
7729 ret = amdgpu_irq_add_id(adev, 231, &adev->pm.dpm.thermal.irq);
7730 if (ret)
7731 return ret;
7732
7733 /* default to balanced state */
7734 adev->pm.dpm.state = POWER_STATE_TYPE_BALANCED;
7735 adev->pm.dpm.user_state = POWER_STATE_TYPE_BALANCED;
7736 adev->pm.dpm.forced_level = AMDGPU_DPM_FORCED_LEVEL_AUTO;
7737 adev->pm.default_sclk = adev->clock.default_sclk;
7738 adev->pm.default_mclk = adev->clock.default_mclk;
7739 adev->pm.current_sclk = adev->clock.default_sclk;
7740 adev->pm.current_mclk = adev->clock.default_mclk;
7741 adev->pm.int_thermal_type = THERMAL_TYPE_NONE;
7742
7743 if (amdgpu_dpm == 0)
7744 return 0;
7745
7746 ret = si_dpm_init_microcode(adev);
7747 if (ret)
7748 return ret;
7749
7750 INIT_WORK(&adev->pm.dpm.thermal.work, amdgpu_dpm_thermal_work_handler);
7751 mutex_lock(&adev->pm.mutex);
7752 ret = si_dpm_init(adev);
7753 if (ret)
7754 goto dpm_failed;
7755 adev->pm.dpm.current_ps = adev->pm.dpm.requested_ps = adev->pm.dpm.boot_ps;
7756 if (amdgpu_dpm == 1)
7757 amdgpu_pm_print_power_states(adev);
7758 mutex_unlock(&adev->pm.mutex);
7759 DRM_INFO("amdgpu: dpm initialized\n");
7760
7761 return 0;
7762
7763dpm_failed:
7764 si_dpm_fini(adev);
7765 mutex_unlock(&adev->pm.mutex);
7766 DRM_ERROR("amdgpu: dpm initialization failed\n");
7767 return ret;
7768}
7769
7770static int si_dpm_sw_fini(void *handle)
7771{
7772 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
7773
7774 mutex_lock(&adev->pm.mutex);
7775 amdgpu_pm_sysfs_fini(adev);
7776 si_dpm_fini(adev);
7777 mutex_unlock(&adev->pm.mutex);
7778
7779 return 0;
7780}
7781
7782static int si_dpm_hw_init(void *handle)
7783{
7784 int ret;
7785
7786 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
7787
7788 if (!amdgpu_dpm)
7789 return 0;
7790
7791 mutex_lock(&adev->pm.mutex);
7792 si_dpm_setup_asic(adev);
7793 ret = si_dpm_enable(adev);
7794 if (ret)
7795 adev->pm.dpm_enabled = false;
7796 else
7797 adev->pm.dpm_enabled = true;
7798 mutex_unlock(&adev->pm.mutex);
7799
7800 return ret;
7801}
7802
7803static int si_dpm_hw_fini(void *handle)
7804{
7805 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
7806
7807 if (adev->pm.dpm_enabled) {
7808 mutex_lock(&adev->pm.mutex);
7809 si_dpm_disable(adev);
7810 mutex_unlock(&adev->pm.mutex);
7811 }
7812
7813 return 0;
7814}
7815
7816static int si_dpm_suspend(void *handle)
7817{
7818 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
7819
7820 if (adev->pm.dpm_enabled) {
7821 mutex_lock(&adev->pm.mutex);
7822 /* disable dpm */
7823 si_dpm_disable(adev);
7824 /* reset the power state */
7825 adev->pm.dpm.current_ps = adev->pm.dpm.requested_ps = adev->pm.dpm.boot_ps;
7826 mutex_unlock(&adev->pm.mutex);
7827 }
7828 return 0;
7829}
7830
7831static int si_dpm_resume(void *handle)
7832{
7833 int ret;
7834 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
7835
7836 if (adev->pm.dpm_enabled) {
7837 /* asic init will reset to the boot state */
7838 mutex_lock(&adev->pm.mutex);
7839 si_dpm_setup_asic(adev);
7840 ret = si_dpm_enable(adev);
7841 if (ret)
7842 adev->pm.dpm_enabled = false;
7843 else
7844 adev->pm.dpm_enabled = true;
7845 mutex_unlock(&adev->pm.mutex);
7846 if (adev->pm.dpm_enabled)
7847 amdgpu_pm_compute_clocks(adev);
7848 }
7849 return 0;
7850}
7851
7852static bool si_dpm_is_idle(void *handle)
7853{
7854 /* XXX */
7855 return true;
7856}
7857
7858static int si_dpm_wait_for_idle(void *handle)
7859{
7860 /* XXX */
7861 return 0;
7862}
7863
7864static int si_dpm_soft_reset(void *handle)
7865{
7866 return 0;
7867}
7868
7869static int si_dpm_set_clockgating_state(void *handle,
7870 enum amd_clockgating_state state)
7871{
7872 return 0;
7873}
7874
7875static int si_dpm_set_powergating_state(void *handle,
7876 enum amd_powergating_state state)
7877{
7878 return 0;
7879}
7880
7881/* get temperature in millidegrees */
7882static int si_dpm_get_temp(struct amdgpu_device *adev)
7883{
7884 u32 temp;
7885 int actual_temp = 0;
7886
7887 temp = (RREG32(CG_MULT_THERMAL_STATUS) & CTF_TEMP_MASK) >>
7888 CTF_TEMP_SHIFT;
7889
7890 if (temp & 0x200)
7891 actual_temp = 255;
7892 else
7893 actual_temp = temp & 0x1ff;
7894
7895 actual_temp = (actual_temp * 1000);
7896
7897 return actual_temp;
7898}
7899
7900static u32 si_dpm_get_sclk(struct amdgpu_device *adev, bool low)
7901{
7902 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
7903 struct si_ps *requested_state = si_get_ps(&eg_pi->requested_rps);
7904
7905 if (low)
7906 return requested_state->performance_levels[0].sclk;
7907 else
7908 return requested_state->performance_levels[requested_state->performance_level_count - 1].sclk;
7909}
7910
7911static u32 si_dpm_get_mclk(struct amdgpu_device *adev, bool low)
7912{
7913 struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
7914 struct si_ps *requested_state = si_get_ps(&eg_pi->requested_rps);
7915
7916 if (low)
7917 return requested_state->performance_levels[0].mclk;
7918 else
7919 return requested_state->performance_levels[requested_state->performance_level_count - 1].mclk;
7920}
7921
7922static void si_dpm_print_power_state(struct amdgpu_device *adev,
7923 struct amdgpu_ps *rps)
7924{
7925 struct si_ps *ps = si_get_ps(rps);
7926 struct rv7xx_pl *pl;
7927 int i;
7928
7929 amdgpu_dpm_print_class_info(rps->class, rps->class2);
7930 amdgpu_dpm_print_cap_info(rps->caps);
7931 DRM_INFO("\tuvd vclk: %d dclk: %d\n", rps->vclk, rps->dclk);
7932 for (i = 0; i < ps->performance_level_count; i++) {
7933 pl = &ps->performance_levels[i];
7934 if (adev->asic_type >= CHIP_TAHITI)
7935 DRM_INFO("\t\tpower level %d sclk: %u mclk: %u vddc: %u vddci: %u pcie gen: %u\n",
7936 i, pl->sclk, pl->mclk, pl->vddc, pl->vddci, pl->pcie_gen + 1);
7937 else
7938 DRM_INFO("\t\tpower level %d sclk: %u mclk: %u vddc: %u vddci: %u\n",
7939 i, pl->sclk, pl->mclk, pl->vddc, pl->vddci);
7940 }
7941 amdgpu_dpm_print_ps_status(adev, rps);
7942}
7943
7944static int si_dpm_early_init(void *handle)
7945{
7946
7947 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
7948
7949 si_dpm_set_dpm_funcs(adev);
7950 si_dpm_set_irq_funcs(adev);
7951 return 0;
7952}
7953
7954
7955const struct amd_ip_funcs si_dpm_ip_funcs = {
7956 .name = "si_dpm",
7957 .early_init = si_dpm_early_init,
7958 .late_init = si_dpm_late_init,
7959 .sw_init = si_dpm_sw_init,
7960 .sw_fini = si_dpm_sw_fini,
7961 .hw_init = si_dpm_hw_init,
7962 .hw_fini = si_dpm_hw_fini,
7963 .suspend = si_dpm_suspend,
7964 .resume = si_dpm_resume,
7965 .is_idle = si_dpm_is_idle,
7966 .wait_for_idle = si_dpm_wait_for_idle,
7967 .soft_reset = si_dpm_soft_reset,
7968 .set_clockgating_state = si_dpm_set_clockgating_state,
7969 .set_powergating_state = si_dpm_set_powergating_state,
7970};
7971
7972static const struct amdgpu_dpm_funcs si_dpm_funcs = {
7973 .get_temperature = &si_dpm_get_temp,
7974 .pre_set_power_state = &si_dpm_pre_set_power_state,
7975 .set_power_state = &si_dpm_set_power_state,
7976 .post_set_power_state = &si_dpm_post_set_power_state,
7977 .display_configuration_changed = &si_dpm_display_configuration_changed,
7978 .get_sclk = &si_dpm_get_sclk,
7979 .get_mclk = &si_dpm_get_mclk,
7980 .print_power_state = &si_dpm_print_power_state,
7981 .debugfs_print_current_performance_level = &si_dpm_debugfs_print_current_performance_level,
7982 .force_performance_level = &si_dpm_force_performance_level,
7983 .vblank_too_short = &si_dpm_vblank_too_short,
7984 .set_fan_control_mode = &si_dpm_set_fan_control_mode,
7985 .get_fan_control_mode = &si_dpm_get_fan_control_mode,
7986 .set_fan_speed_percent = &si_dpm_set_fan_speed_percent,
7987 .get_fan_speed_percent = &si_dpm_get_fan_speed_percent,
7988};
7989
7990static void si_dpm_set_dpm_funcs(struct amdgpu_device *adev)
7991{
7992 if (adev->pm.funcs == NULL)
7993 adev->pm.funcs = &si_dpm_funcs;
7994}
7995
7996static const struct amdgpu_irq_src_funcs si_dpm_irq_funcs = {
7997 .set = si_dpm_set_interrupt_state,
7998 .process = si_dpm_process_interrupt,
7999};
8000
8001static void si_dpm_set_irq_funcs(struct amdgpu_device *adev)
8002{
8003 adev->pm.dpm.thermal.irq.num_types = AMDGPU_THERMAL_IRQ_LAST;
8004 adev->pm.dpm.thermal.irq.funcs = &si_dpm_irq_funcs;
8005}
8006
diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.h b/drivers/gpu/drm/amd/amdgpu/si_dpm.h
new file mode 100644
index 000000000000..51ce21c5f4fb
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.h
@@ -0,0 +1,1015 @@
1/*
2 * Copyright 2012 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23#ifndef __SI_DPM_H__
24#define __SI_DPM_H__
25
26#include "amdgpu_atombios.h"
27#include "sislands_smc.h"
28
29#define MC_CG_CONFIG 0x96f
30#define MC_ARB_CG 0x9fa
31#define CG_ARB_REQ(x) ((x) << 0)
32#define CG_ARB_REQ_MASK (0xff << 0)
33
34#define MC_ARB_DRAM_TIMING_1 0x9fc
35#define MC_ARB_DRAM_TIMING_2 0x9fd
36#define MC_ARB_DRAM_TIMING_3 0x9fe
37#define MC_ARB_DRAM_TIMING2_1 0x9ff
38#define MC_ARB_DRAM_TIMING2_2 0xa00
39#define MC_ARB_DRAM_TIMING2_3 0xa01
40
41#define MAX_NO_OF_MVDD_VALUES 2
42#define MAX_NO_VREG_STEPS 32
43#define NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE 16
44#define SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE 32
45#define SMC_NISLANDS_MC_REGISTER_ARRAY_SET_COUNT 20
46#define RV770_ASI_DFLT 1000
47#define CYPRESS_HASI_DFLT 400000
48#define PCIE_PERF_REQ_PECI_GEN1 2
49#define PCIE_PERF_REQ_PECI_GEN2 3
50#define PCIE_PERF_REQ_PECI_GEN3 4
51#define RV770_DEFAULT_VCLK_FREQ 53300 /* 10 khz */
52#define RV770_DEFAULT_DCLK_FREQ 40000 /* 10 khz */
53
54#define SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE 16
55
56#define RV770_SMC_TABLE_ADDRESS 0xB000
57#define RV770_SMC_PERFORMANCE_LEVELS_PER_SWSTATE 3
58
59#define SMC_STROBE_RATIO 0x0F
60#define SMC_STROBE_ENABLE 0x10
61
62#define SMC_MC_EDC_RD_FLAG 0x01
63#define SMC_MC_EDC_WR_FLAG 0x02
64#define SMC_MC_RTT_ENABLE 0x04
65#define SMC_MC_STUTTER_EN 0x08
66
67#define RV770_SMC_VOLTAGEMASK_VDDC 0
68#define RV770_SMC_VOLTAGEMASK_MVDD 1
69#define RV770_SMC_VOLTAGEMASK_VDDCI 2
70#define RV770_SMC_VOLTAGEMASK_MAX 4
71
72#define NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE 16
73#define NISLANDS_SMC_STROBE_RATIO 0x0F
74#define NISLANDS_SMC_STROBE_ENABLE 0x10
75
76#define NISLANDS_SMC_MC_EDC_RD_FLAG 0x01
77#define NISLANDS_SMC_MC_EDC_WR_FLAG 0x02
78#define NISLANDS_SMC_MC_RTT_ENABLE 0x04
79#define NISLANDS_SMC_MC_STUTTER_EN 0x08
80
81#define MAX_NO_VREG_STEPS 32
82
83#define NISLANDS_SMC_VOLTAGEMASK_VDDC 0
84#define NISLANDS_SMC_VOLTAGEMASK_MVDD 1
85#define NISLANDS_SMC_VOLTAGEMASK_VDDCI 2
86#define NISLANDS_SMC_VOLTAGEMASK_MAX 4
87
88#define SISLANDS_MCREGISTERTABLE_INITIAL_SLOT 0
89#define SISLANDS_MCREGISTERTABLE_ACPI_SLOT 1
90#define SISLANDS_MCREGISTERTABLE_ULV_SLOT 2
91#define SISLANDS_MCREGISTERTABLE_FIRST_DRIVERSTATE_SLOT 3
92
93#define SISLANDS_LEAKAGE_INDEX0 0xff01
94#define SISLANDS_MAX_LEAKAGE_COUNT 4
95
96#define SISLANDS_MAX_HARDWARE_POWERLEVELS 5
97#define SISLANDS_INITIAL_STATE_ARB_INDEX 0
98#define SISLANDS_ACPI_STATE_ARB_INDEX 1
99#define SISLANDS_ULV_STATE_ARB_INDEX 2
100#define SISLANDS_DRIVER_STATE_ARB_INDEX 3
101
102#define SISLANDS_DPM2_MAX_PULSE_SKIP 256
103
104#define SISLANDS_DPM2_NEAR_TDP_DEC 10
105#define SISLANDS_DPM2_ABOVE_SAFE_INC 5
106#define SISLANDS_DPM2_BELOW_SAFE_INC 20
107
108#define SISLANDS_DPM2_TDP_SAFE_LIMIT_PERCENT 80
109
110#define SISLANDS_DPM2_MAXPS_PERCENT_H 99
111#define SISLANDS_DPM2_MAXPS_PERCENT_M 99
112
113#define SISLANDS_DPM2_SQ_RAMP_MAX_POWER 0x3FFF
114#define SISLANDS_DPM2_SQ_RAMP_MIN_POWER 0x12
115#define SISLANDS_DPM2_SQ_RAMP_MAX_POWER_DELTA 0x15
116#define SISLANDS_DPM2_SQ_RAMP_STI_SIZE 0x1E
117#define SISLANDS_DPM2_SQ_RAMP_LTI_RATIO 0xF
118
119#define SISLANDS_DPM2_PWREFFICIENCYRATIO_MARGIN 10
120
121#define SISLANDS_VRC_DFLT 0xC000B3
122#define SISLANDS_ULVVOLTAGECHANGEDELAY_DFLT 1687
123#define SISLANDS_CGULVPARAMETER_DFLT 0x00040035
124#define SISLANDS_CGULVCONTROL_DFLT 0x1f007550
125
126#define SI_ASI_DFLT 10000
127#define SI_BSP_DFLT 0x41EB
128#define SI_BSU_DFLT 0x2
129#define SI_AH_DFLT 5
130#define SI_RLP_DFLT 25
131#define SI_RMP_DFLT 65
132#define SI_LHP_DFLT 40
133#define SI_LMP_DFLT 15
134#define SI_TD_DFLT 0
135#define SI_UTC_DFLT_00 0x24
136#define SI_UTC_DFLT_01 0x22
137#define SI_UTC_DFLT_02 0x22
138#define SI_UTC_DFLT_03 0x22
139#define SI_UTC_DFLT_04 0x22
140#define SI_UTC_DFLT_05 0x22
141#define SI_UTC_DFLT_06 0x22
142#define SI_UTC_DFLT_07 0x22
143#define SI_UTC_DFLT_08 0x22
144#define SI_UTC_DFLT_09 0x22
145#define SI_UTC_DFLT_10 0x22
146#define SI_UTC_DFLT_11 0x22
147#define SI_UTC_DFLT_12 0x22
148#define SI_UTC_DFLT_13 0x22
149#define SI_UTC_DFLT_14 0x22
150#define SI_DTC_DFLT_00 0x24
151#define SI_DTC_DFLT_01 0x22
152#define SI_DTC_DFLT_02 0x22
153#define SI_DTC_DFLT_03 0x22
154#define SI_DTC_DFLT_04 0x22
155#define SI_DTC_DFLT_05 0x22
156#define SI_DTC_DFLT_06 0x22
157#define SI_DTC_DFLT_07 0x22
158#define SI_DTC_DFLT_08 0x22
159#define SI_DTC_DFLT_09 0x22
160#define SI_DTC_DFLT_10 0x22
161#define SI_DTC_DFLT_11 0x22
162#define SI_DTC_DFLT_12 0x22
163#define SI_DTC_DFLT_13 0x22
164#define SI_DTC_DFLT_14 0x22
165#define SI_VRC_DFLT 0x0000C003
166#define SI_VOLTAGERESPONSETIME_DFLT 1000
167#define SI_BACKBIASRESPONSETIME_DFLT 1000
168#define SI_VRU_DFLT 0x3
169#define SI_SPLLSTEPTIME_DFLT 0x1000
170#define SI_SPLLSTEPUNIT_DFLT 0x3
171#define SI_TPU_DFLT 0
172#define SI_TPC_DFLT 0x200
173#define SI_SSTU_DFLT 0
174#define SI_SST_DFLT 0x00C8
175#define SI_GICST_DFLT 0x200
176#define SI_FCT_DFLT 0x0400
177#define SI_FCTU_DFLT 0
178#define SI_CTXCGTT3DRPHC_DFLT 0x20
179#define SI_CTXCGTT3DRSDC_DFLT 0x40
180#define SI_VDDC3DOORPHC_DFLT 0x100
181#define SI_VDDC3DOORSDC_DFLT 0x7
182#define SI_VDDC3DOORSU_DFLT 0
183#define SI_MPLLLOCKTIME_DFLT 100
184#define SI_MPLLRESETTIME_DFLT 150
185#define SI_VCOSTEPPCT_DFLT 20
186#define SI_ENDINGVCOSTEPPCT_DFLT 5
187#define SI_REFERENCEDIVIDER_DFLT 4
188
189#define SI_PM_NUMBER_OF_TC 15
190#define SI_PM_NUMBER_OF_SCLKS 20
191#define SI_PM_NUMBER_OF_MCLKS 4
192#define SI_PM_NUMBER_OF_VOLTAGE_LEVELS 4
193#define SI_PM_NUMBER_OF_ACTIVITY_LEVELS 3
194
195/* XXX are these ok? */
196#define SI_TEMP_RANGE_MIN (90 * 1000)
197#define SI_TEMP_RANGE_MAX (120 * 1000)
198
199#define FDO_PWM_MODE_STATIC 1
200#define FDO_PWM_MODE_STATIC_RPM 5
201
202enum ni_dc_cac_level
203{
204 NISLANDS_DCCAC_LEVEL_0 = 0,
205 NISLANDS_DCCAC_LEVEL_1,
206 NISLANDS_DCCAC_LEVEL_2,
207 NISLANDS_DCCAC_LEVEL_3,
208 NISLANDS_DCCAC_LEVEL_4,
209 NISLANDS_DCCAC_LEVEL_5,
210 NISLANDS_DCCAC_LEVEL_6,
211 NISLANDS_DCCAC_LEVEL_7,
212 NISLANDS_DCCAC_MAX_LEVELS
213};
214
215enum si_cac_config_reg_type
216{
217 SISLANDS_CACCONFIG_MMR = 0,
218 SISLANDS_CACCONFIG_CGIND,
219 SISLANDS_CACCONFIG_MAX
220};
221
222enum si_power_level {
223 SI_POWER_LEVEL_LOW = 0,
224 SI_POWER_LEVEL_MEDIUM = 1,
225 SI_POWER_LEVEL_HIGH = 2,
226 SI_POWER_LEVEL_CTXSW = 3,
227};
228
229enum si_td {
230 SI_TD_AUTO,
231 SI_TD_UP,
232 SI_TD_DOWN,
233};
234
235enum si_display_watermark {
236 SI_DISPLAY_WATERMARK_LOW = 0,
237 SI_DISPLAY_WATERMARK_HIGH = 1,
238};
239
240enum si_display_gap
241{
242 SI_PM_DISPLAY_GAP_VBLANK_OR_WM = 0,
243 SI_PM_DISPLAY_GAP_VBLANK = 1,
244 SI_PM_DISPLAY_GAP_WATERMARK = 2,
245 SI_PM_DISPLAY_GAP_IGNORE = 3,
246};
247
248extern const struct amd_ip_funcs si_dpm_ip_funcs;
249
250struct ni_leakage_coeffients
251{
252 u32 at;
253 u32 bt;
254 u32 av;
255 u32 bv;
256 s32 t_slope;
257 s32 t_intercept;
258 u32 t_ref;
259};
260
261struct SMC_Evergreen_MCRegisterAddress
262{
263 uint16_t s0;
264 uint16_t s1;
265};
266
267typedef struct SMC_Evergreen_MCRegisterAddress SMC_Evergreen_MCRegisterAddress;
268
269struct evergreen_mc_reg_entry {
270 u32 mclk_max;
271 u32 mc_data[SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE];
272};
273
274struct evergreen_mc_reg_table {
275 u8 last;
276 u8 num_entries;
277 u16 valid_flag;
278 struct evergreen_mc_reg_entry mc_reg_table_entry[MAX_AC_TIMING_ENTRIES];
279 SMC_Evergreen_MCRegisterAddress mc_reg_address[SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE];
280};
281
282struct SMC_Evergreen_MCRegisterSet
283{
284 uint32_t value[SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE];
285};
286
287typedef struct SMC_Evergreen_MCRegisterSet SMC_Evergreen_MCRegisterSet;
288
289struct SMC_Evergreen_MCRegisters
290{
291 uint8_t last;
292 uint8_t reserved[3];
293 SMC_Evergreen_MCRegisterAddress address[SMC_EVERGREEN_MC_REGISTER_ARRAY_SIZE];
294 SMC_Evergreen_MCRegisterSet data[5];
295};
296
297typedef struct SMC_Evergreen_MCRegisters SMC_Evergreen_MCRegisters;
298
299struct SMC_NIslands_MCRegisterSet
300{
301 uint32_t value[SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE];
302};
303
304typedef struct SMC_NIslands_MCRegisterSet SMC_NIslands_MCRegisterSet;
305
306struct ni_mc_reg_entry {
307 u32 mclk_max;
308 u32 mc_data[SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE];
309};
310
311struct SMC_NIslands_MCRegisterAddress
312{
313 uint16_t s0;
314 uint16_t s1;
315};
316
317typedef struct SMC_NIslands_MCRegisterAddress SMC_NIslands_MCRegisterAddress;
318
319struct SMC_NIslands_MCRegisters
320{
321 uint8_t last;
322 uint8_t reserved[3];
323 SMC_NIslands_MCRegisterAddress address[SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE];
324 SMC_NIslands_MCRegisterSet data[SMC_NISLANDS_MC_REGISTER_ARRAY_SET_COUNT];
325};
326
327typedef struct SMC_NIslands_MCRegisters SMC_NIslands_MCRegisters;
328
329struct evergreen_ulv_param {
330 bool supported;
331 struct rv7xx_pl *pl;
332};
333
334struct evergreen_arb_registers {
335 u32 mc_arb_dram_timing;
336 u32 mc_arb_dram_timing2;
337 u32 mc_arb_rfsh_rate;
338 u32 mc_arb_burst_time;
339};
340
341struct at {
342 u32 rlp;
343 u32 rmp;
344 u32 lhp;
345 u32 lmp;
346};
347
348struct ni_clock_registers {
349 u32 cg_spll_func_cntl;
350 u32 cg_spll_func_cntl_2;
351 u32 cg_spll_func_cntl_3;
352 u32 cg_spll_func_cntl_4;
353 u32 cg_spll_spread_spectrum;
354 u32 cg_spll_spread_spectrum_2;
355 u32 mclk_pwrmgt_cntl;
356 u32 dll_cntl;
357 u32 mpll_ad_func_cntl;
358 u32 mpll_ad_func_cntl_2;
359 u32 mpll_dq_func_cntl;
360 u32 mpll_dq_func_cntl_2;
361 u32 mpll_ss1;
362 u32 mpll_ss2;
363};
364
365struct RV770_SMC_SCLK_VALUE
366{
367 uint32_t vCG_SPLL_FUNC_CNTL;
368 uint32_t vCG_SPLL_FUNC_CNTL_2;
369 uint32_t vCG_SPLL_FUNC_CNTL_3;
370 uint32_t vCG_SPLL_SPREAD_SPECTRUM;
371 uint32_t vCG_SPLL_SPREAD_SPECTRUM_2;
372 uint32_t sclk_value;
373};
374
375typedef struct RV770_SMC_SCLK_VALUE RV770_SMC_SCLK_VALUE;
376
377struct RV770_SMC_MCLK_VALUE
378{
379 uint32_t vMPLL_AD_FUNC_CNTL;
380 uint32_t vMPLL_AD_FUNC_CNTL_2;
381 uint32_t vMPLL_DQ_FUNC_CNTL;
382 uint32_t vMPLL_DQ_FUNC_CNTL_2;
383 uint32_t vMCLK_PWRMGT_CNTL;
384 uint32_t vDLL_CNTL;
385 uint32_t vMPLL_SS;
386 uint32_t vMPLL_SS2;
387 uint32_t mclk_value;
388};
389
390typedef struct RV770_SMC_MCLK_VALUE RV770_SMC_MCLK_VALUE;
391
392
393struct RV730_SMC_MCLK_VALUE
394{
395 uint32_t vMCLK_PWRMGT_CNTL;
396 uint32_t vDLL_CNTL;
397 uint32_t vMPLL_FUNC_CNTL;
398 uint32_t vMPLL_FUNC_CNTL2;
399 uint32_t vMPLL_FUNC_CNTL3;
400 uint32_t vMPLL_SS;
401 uint32_t vMPLL_SS2;
402 uint32_t mclk_value;
403};
404
405typedef struct RV730_SMC_MCLK_VALUE RV730_SMC_MCLK_VALUE;
406
407struct RV770_SMC_VOLTAGE_VALUE
408{
409 uint16_t value;
410 uint8_t index;
411 uint8_t padding;
412};
413
414typedef struct RV770_SMC_VOLTAGE_VALUE RV770_SMC_VOLTAGE_VALUE;
415
416union RV7XX_SMC_MCLK_VALUE
417{
418 RV770_SMC_MCLK_VALUE mclk770;
419 RV730_SMC_MCLK_VALUE mclk730;
420};
421
422typedef union RV7XX_SMC_MCLK_VALUE RV7XX_SMC_MCLK_VALUE, *LPRV7XX_SMC_MCLK_VALUE;
423
424struct RV770_SMC_HW_PERFORMANCE_LEVEL
425{
426 uint8_t arbValue;
427 union{
428 uint8_t seqValue;
429 uint8_t ACIndex;
430 };
431 uint8_t displayWatermark;
432 uint8_t gen2PCIE;
433 uint8_t gen2XSP;
434 uint8_t backbias;
435 uint8_t strobeMode;
436 uint8_t mcFlags;
437 uint32_t aT;
438 uint32_t bSP;
439 RV770_SMC_SCLK_VALUE sclk;
440 RV7XX_SMC_MCLK_VALUE mclk;
441 RV770_SMC_VOLTAGE_VALUE vddc;
442 RV770_SMC_VOLTAGE_VALUE mvdd;
443 RV770_SMC_VOLTAGE_VALUE vddci;
444 uint8_t reserved1;
445 uint8_t reserved2;
446 uint8_t stateFlags;
447 uint8_t padding;
448};
449
450typedef struct RV770_SMC_HW_PERFORMANCE_LEVEL RV770_SMC_HW_PERFORMANCE_LEVEL;
451
452struct RV770_SMC_SWSTATE
453{
454 uint8_t flags;
455 uint8_t padding1;
456 uint8_t padding2;
457 uint8_t padding3;
458 RV770_SMC_HW_PERFORMANCE_LEVEL levels[RV770_SMC_PERFORMANCE_LEVELS_PER_SWSTATE];
459};
460
461typedef struct RV770_SMC_SWSTATE RV770_SMC_SWSTATE;
462
463struct RV770_SMC_VOLTAGEMASKTABLE
464{
465 uint8_t highMask[RV770_SMC_VOLTAGEMASK_MAX];
466 uint32_t lowMask[RV770_SMC_VOLTAGEMASK_MAX];
467};
468
469typedef struct RV770_SMC_VOLTAGEMASKTABLE RV770_SMC_VOLTAGEMASKTABLE;
470
471struct RV770_SMC_STATETABLE
472{
473 uint8_t thermalProtectType;
474 uint8_t systemFlags;
475 uint8_t maxVDDCIndexInPPTable;
476 uint8_t extraFlags;
477 uint8_t highSMIO[MAX_NO_VREG_STEPS];
478 uint32_t lowSMIO[MAX_NO_VREG_STEPS];
479 RV770_SMC_VOLTAGEMASKTABLE voltageMaskTable;
480 RV770_SMC_SWSTATE initialState;
481 RV770_SMC_SWSTATE ACPIState;
482 RV770_SMC_SWSTATE driverState;
483 RV770_SMC_SWSTATE ULVState;
484};
485
486typedef struct RV770_SMC_STATETABLE RV770_SMC_STATETABLE;
487
488struct vddc_table_entry {
489 u16 vddc;
490 u8 vddc_index;
491 u8 high_smio;
492 u32 low_smio;
493};
494
495struct rv770_clock_registers {
496 u32 cg_spll_func_cntl;
497 u32 cg_spll_func_cntl_2;
498 u32 cg_spll_func_cntl_3;
499 u32 cg_spll_spread_spectrum;
500 u32 cg_spll_spread_spectrum_2;
501 u32 mpll_ad_func_cntl;
502 u32 mpll_ad_func_cntl_2;
503 u32 mpll_dq_func_cntl;
504 u32 mpll_dq_func_cntl_2;
505 u32 mclk_pwrmgt_cntl;
506 u32 dll_cntl;
507 u32 mpll_ss1;
508 u32 mpll_ss2;
509};
510
511struct rv730_clock_registers {
512 u32 cg_spll_func_cntl;
513 u32 cg_spll_func_cntl_2;
514 u32 cg_spll_func_cntl_3;
515 u32 cg_spll_spread_spectrum;
516 u32 cg_spll_spread_spectrum_2;
517 u32 mclk_pwrmgt_cntl;
518 u32 dll_cntl;
519 u32 mpll_func_cntl;
520 u32 mpll_func_cntl2;
521 u32 mpll_func_cntl3;
522 u32 mpll_ss;
523 u32 mpll_ss2;
524};
525
526union r7xx_clock_registers {
527 struct rv770_clock_registers rv770;
528 struct rv730_clock_registers rv730;
529};
530
531struct rv7xx_power_info {
532 /* flags */
533 bool mem_gddr5;
534 bool pcie_gen2;
535 bool dynamic_pcie_gen2;
536 bool acpi_pcie_gen2;
537 bool boot_in_gen2;
538 bool voltage_control; /* vddc */
539 bool mvdd_control;
540 bool sclk_ss;
541 bool mclk_ss;
542 bool dynamic_ss;
543 bool gfx_clock_gating;
544 bool mg_clock_gating;
545 bool mgcgtssm;
546 bool power_gating;
547 bool thermal_protection;
548 bool display_gap;
549 bool dcodt;
550 bool ulps;
551 /* registers */
552 union r7xx_clock_registers clk_regs;
553 u32 s0_vid_lower_smio_cntl;
554 /* voltage */
555 u32 vddc_mask_low;
556 u32 mvdd_mask_low;
557 u32 mvdd_split_frequency;
558 u32 mvdd_low_smio[MAX_NO_OF_MVDD_VALUES];
559 u16 max_vddc;
560 u16 max_vddc_in_table;
561 u16 min_vddc_in_table;
562 struct vddc_table_entry vddc_table[MAX_NO_VREG_STEPS];
563 u8 valid_vddc_entries;
564 /* dc odt */
565 u32 mclk_odt_threshold;
566 u8 odt_value_0[2];
567 u8 odt_value_1[2];
568 /* stored values */
569 u32 boot_sclk;
570 u16 acpi_vddc;
571 u32 ref_div;
572 u32 active_auto_throttle_sources;
573 u32 mclk_stutter_mode_threshold;
574 u32 mclk_strobe_mode_threshold;
575 u32 mclk_edc_enable_threshold;
576 u32 bsp;
577 u32 bsu;
578 u32 pbsp;
579 u32 pbsu;
580 u32 dsp;
581 u32 psp;
582 u32 asi;
583 u32 pasi;
584 u32 vrc;
585 u32 restricted_levels;
586 u32 rlp;
587 u32 rmp;
588 u32 lhp;
589 u32 lmp;
590 /* smc offsets */
591 u16 state_table_start;
592 u16 soft_regs_start;
593 u16 sram_end;
594 /* scratch structs */
595 RV770_SMC_STATETABLE smc_statetable;
596};
597
598struct rv7xx_pl {
599 u32 sclk;
600 u32 mclk;
601 u16 vddc;
602 u16 vddci; /* eg+ only */
603 u32 flags;
604 enum amdgpu_pcie_gen pcie_gen; /* si+ only */
605};
606
607struct rv7xx_ps {
608 struct rv7xx_pl high;
609 struct rv7xx_pl medium;
610 struct rv7xx_pl low;
611 bool dc_compatible;
612};
613
614struct si_ps {
615 u16 performance_level_count;
616 bool dc_compatible;
617 struct rv7xx_pl performance_levels[NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE];
618};
619
620struct ni_mc_reg_table {
621 u8 last;
622 u8 num_entries;
623 u16 valid_flag;
624 struct ni_mc_reg_entry mc_reg_table_entry[MAX_AC_TIMING_ENTRIES];
625 SMC_NIslands_MCRegisterAddress mc_reg_address[SMC_NISLANDS_MC_REGISTER_ARRAY_SIZE];
626};
627
628struct ni_cac_data
629{
630 struct ni_leakage_coeffients leakage_coefficients;
631 u32 i_leakage;
632 s32 leakage_minimum_temperature;
633 u32 pwr_const;
634 u32 dc_cac_value;
635 u32 bif_cac_value;
636 u32 lkge_pwr;
637 u8 mc_wr_weight;
638 u8 mc_rd_weight;
639 u8 allow_ovrflw;
640 u8 num_win_tdp;
641 u8 l2num_win_tdp;
642 u8 lts_truncate_n;
643};
644
645struct evergreen_power_info {
646 /* must be first! */
647 struct rv7xx_power_info rv7xx;
648 /* flags */
649 bool vddci_control;
650 bool dynamic_ac_timing;
651 bool abm;
652 bool mcls;
653 bool light_sleep;
654 bool memory_transition;
655 bool pcie_performance_request;
656 bool pcie_performance_request_registered;
657 bool sclk_deep_sleep;
658 bool dll_default_on;
659 bool ls_clock_gating;
660 bool smu_uvd_hs;
661 bool uvd_enabled;
662 /* stored values */
663 u16 acpi_vddci;
664 u8 mvdd_high_index;
665 u8 mvdd_low_index;
666 u32 mclk_edc_wr_enable_threshold;
667 struct evergreen_mc_reg_table mc_reg_table;
668 struct atom_voltage_table vddc_voltage_table;
669 struct atom_voltage_table vddci_voltage_table;
670 struct evergreen_arb_registers bootup_arb_registers;
671 struct evergreen_ulv_param ulv;
672 struct at ats[2];
673 /* smc offsets */
674 u16 mc_reg_table_start;
675 struct amdgpu_ps current_rps;
676 struct rv7xx_ps current_ps;
677 struct amdgpu_ps requested_rps;
678 struct rv7xx_ps requested_ps;
679};
680
681struct PP_NIslands_Dpm2PerfLevel
682{
683 uint8_t MaxPS;
684 uint8_t TgtAct;
685 uint8_t MaxPS_StepInc;
686 uint8_t MaxPS_StepDec;
687 uint8_t PSST;
688 uint8_t NearTDPDec;
689 uint8_t AboveSafeInc;
690 uint8_t BelowSafeInc;
691 uint8_t PSDeltaLimit;
692 uint8_t PSDeltaWin;
693 uint8_t Reserved[6];
694};
695
696typedef struct PP_NIslands_Dpm2PerfLevel PP_NIslands_Dpm2PerfLevel;
697
698struct PP_NIslands_DPM2Parameters
699{
700 uint32_t TDPLimit;
701 uint32_t NearTDPLimit;
702 uint32_t SafePowerLimit;
703 uint32_t PowerBoostLimit;
704};
705typedef struct PP_NIslands_DPM2Parameters PP_NIslands_DPM2Parameters;
706
707struct NISLANDS_SMC_SCLK_VALUE
708{
709 uint32_t vCG_SPLL_FUNC_CNTL;
710 uint32_t vCG_SPLL_FUNC_CNTL_2;
711 uint32_t vCG_SPLL_FUNC_CNTL_3;
712 uint32_t vCG_SPLL_FUNC_CNTL_4;
713 uint32_t vCG_SPLL_SPREAD_SPECTRUM;
714 uint32_t vCG_SPLL_SPREAD_SPECTRUM_2;
715 uint32_t sclk_value;
716};
717
718typedef struct NISLANDS_SMC_SCLK_VALUE NISLANDS_SMC_SCLK_VALUE;
719
720struct NISLANDS_SMC_MCLK_VALUE
721{
722 uint32_t vMPLL_FUNC_CNTL;
723 uint32_t vMPLL_FUNC_CNTL_1;
724 uint32_t vMPLL_FUNC_CNTL_2;
725 uint32_t vMPLL_AD_FUNC_CNTL;
726 uint32_t vMPLL_AD_FUNC_CNTL_2;
727 uint32_t vMPLL_DQ_FUNC_CNTL;
728 uint32_t vMPLL_DQ_FUNC_CNTL_2;
729 uint32_t vMCLK_PWRMGT_CNTL;
730 uint32_t vDLL_CNTL;
731 uint32_t vMPLL_SS;
732 uint32_t vMPLL_SS2;
733 uint32_t mclk_value;
734};
735
736typedef struct NISLANDS_SMC_MCLK_VALUE NISLANDS_SMC_MCLK_VALUE;
737
738struct NISLANDS_SMC_VOLTAGE_VALUE
739{
740 uint16_t value;
741 uint8_t index;
742 uint8_t padding;
743};
744
745typedef struct NISLANDS_SMC_VOLTAGE_VALUE NISLANDS_SMC_VOLTAGE_VALUE;
746
747struct NISLANDS_SMC_HW_PERFORMANCE_LEVEL
748{
749 uint8_t arbValue;
750 uint8_t ACIndex;
751 uint8_t displayWatermark;
752 uint8_t gen2PCIE;
753 uint8_t reserved1;
754 uint8_t reserved2;
755 uint8_t strobeMode;
756 uint8_t mcFlags;
757 uint32_t aT;
758 uint32_t bSP;
759 NISLANDS_SMC_SCLK_VALUE sclk;
760 NISLANDS_SMC_MCLK_VALUE mclk;
761 NISLANDS_SMC_VOLTAGE_VALUE vddc;
762 NISLANDS_SMC_VOLTAGE_VALUE mvdd;
763 NISLANDS_SMC_VOLTAGE_VALUE vddci;
764 NISLANDS_SMC_VOLTAGE_VALUE std_vddc;
765 uint32_t powergate_en;
766 uint8_t hUp;
767 uint8_t hDown;
768 uint8_t stateFlags;
769 uint8_t arbRefreshState;
770 uint32_t SQPowerThrottle;
771 uint32_t SQPowerThrottle_2;
772 uint32_t reserved[2];
773 PP_NIslands_Dpm2PerfLevel dpm2;
774};
775
776typedef struct NISLANDS_SMC_HW_PERFORMANCE_LEVEL NISLANDS_SMC_HW_PERFORMANCE_LEVEL;
777
778struct NISLANDS_SMC_SWSTATE
779{
780 uint8_t flags;
781 uint8_t levelCount;
782 uint8_t padding2;
783 uint8_t padding3;
784 NISLANDS_SMC_HW_PERFORMANCE_LEVEL levels[1];
785};
786
787typedef struct NISLANDS_SMC_SWSTATE NISLANDS_SMC_SWSTATE;
788
789struct NISLANDS_SMC_VOLTAGEMASKTABLE
790{
791 uint8_t highMask[NISLANDS_SMC_VOLTAGEMASK_MAX];
792 uint32_t lowMask[NISLANDS_SMC_VOLTAGEMASK_MAX];
793};
794
795typedef struct NISLANDS_SMC_VOLTAGEMASKTABLE NISLANDS_SMC_VOLTAGEMASKTABLE;
796
797#define NISLANDS_MAX_NO_VREG_STEPS 32
798
799struct NISLANDS_SMC_STATETABLE
800{
801 uint8_t thermalProtectType;
802 uint8_t systemFlags;
803 uint8_t maxVDDCIndexInPPTable;
804 uint8_t extraFlags;
805 uint8_t highSMIO[NISLANDS_MAX_NO_VREG_STEPS];
806 uint32_t lowSMIO[NISLANDS_MAX_NO_VREG_STEPS];
807 NISLANDS_SMC_VOLTAGEMASKTABLE voltageMaskTable;
808 PP_NIslands_DPM2Parameters dpm2Params;
809 NISLANDS_SMC_SWSTATE initialState;
810 NISLANDS_SMC_SWSTATE ACPIState;
811 NISLANDS_SMC_SWSTATE ULVState;
812 NISLANDS_SMC_SWSTATE driverState;
813 NISLANDS_SMC_HW_PERFORMANCE_LEVEL dpmLevels[NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE - 1];
814};
815
816typedef struct NISLANDS_SMC_STATETABLE NISLANDS_SMC_STATETABLE;
817
818struct ni_power_info {
819 /* must be first! */
820 struct evergreen_power_info eg;
821 struct ni_clock_registers clock_registers;
822 struct ni_mc_reg_table mc_reg_table;
823 u32 mclk_rtt_mode_threshold;
824 /* flags */
825 bool use_power_boost_limit;
826 bool support_cac_long_term_average;
827 bool cac_enabled;
828 bool cac_configuration_required;
829 bool driver_calculate_cac_leakage;
830 bool pc_enabled;
831 bool enable_power_containment;
832 bool enable_cac;
833 bool enable_sq_ramping;
834 /* smc offsets */
835 u16 arb_table_start;
836 u16 fan_table_start;
837 u16 cac_table_start;
838 u16 spll_table_start;
839 /* CAC stuff */
840 struct ni_cac_data cac_data;
841 u32 dc_cac_table[NISLANDS_DCCAC_MAX_LEVELS];
842 const struct ni_cac_weights *cac_weights;
843 u8 lta_window_size;
844 u8 lts_truncate;
845 struct si_ps current_ps;
846 struct si_ps requested_ps;
847 /* scratch structs */
848 SMC_NIslands_MCRegisters smc_mc_reg_table;
849 NISLANDS_SMC_STATETABLE smc_statetable;
850};
851
852struct si_cac_config_reg
853{
854 u32 offset;
855 u32 mask;
856 u32 shift;
857 u32 value;
858 enum si_cac_config_reg_type type;
859};
860
861struct si_powertune_data
862{
863 u32 cac_window;
864 u32 l2_lta_window_size_default;
865 u8 lts_truncate_default;
866 u8 shift_n_default;
867 u8 operating_temp;
868 struct ni_leakage_coeffients leakage_coefficients;
869 u32 fixed_kt;
870 u32 lkge_lut_v0_percent;
871 u8 dc_cac[NISLANDS_DCCAC_MAX_LEVELS];
872 bool enable_powertune_by_default;
873};
874
875struct si_dyn_powertune_data
876{
877 u32 cac_leakage;
878 s32 leakage_minimum_temperature;
879 u32 wintime;
880 u32 l2_lta_window_size;
881 u8 lts_truncate;
882 u8 shift_n;
883 u8 dc_pwr_value;
884 bool disable_uvd_powertune;
885};
886
887struct si_dte_data
888{
889 u32 tau[SMC_SISLANDS_DTE_MAX_FILTER_STAGES];
890 u32 r[SMC_SISLANDS_DTE_MAX_FILTER_STAGES];
891 u32 k;
892 u32 t0;
893 u32 max_t;
894 u8 window_size;
895 u8 temp_select;
896 u8 dte_mode;
897 u8 tdep_count;
898 u8 t_limits[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
899 u32 tdep_tau[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
900 u32 tdep_r[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
901 u32 t_threshold;
902 bool enable_dte_by_default;
903};
904
905struct si_clock_registers {
906 u32 cg_spll_func_cntl;
907 u32 cg_spll_func_cntl_2;
908 u32 cg_spll_func_cntl_3;
909 u32 cg_spll_func_cntl_4;
910 u32 cg_spll_spread_spectrum;
911 u32 cg_spll_spread_spectrum_2;
912 u32 dll_cntl;
913 u32 mclk_pwrmgt_cntl;
914 u32 mpll_ad_func_cntl;
915 u32 mpll_dq_func_cntl;
916 u32 mpll_func_cntl;
917 u32 mpll_func_cntl_1;
918 u32 mpll_func_cntl_2;
919 u32 mpll_ss1;
920 u32 mpll_ss2;
921};
922
923struct si_mc_reg_entry {
924 u32 mclk_max;
925 u32 mc_data[SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE];
926};
927
928struct si_mc_reg_table {
929 u8 last;
930 u8 num_entries;
931 u16 valid_flag;
932 struct si_mc_reg_entry mc_reg_table_entry[MAX_AC_TIMING_ENTRIES];
933 SMC_NIslands_MCRegisterAddress mc_reg_address[SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE];
934};
935
936struct si_leakage_voltage_entry
937{
938 u16 voltage;
939 u16 leakage_index;
940};
941
942struct si_leakage_voltage
943{
944 u16 count;
945 struct si_leakage_voltage_entry entries[SISLANDS_MAX_LEAKAGE_COUNT];
946};
947
948
949struct si_ulv_param {
950 bool supported;
951 u32 cg_ulv_control;
952 u32 cg_ulv_parameter;
953 u32 volt_change_delay;
954 struct rv7xx_pl pl;
955 bool one_pcie_lane_in_ulv;
956};
957
958struct si_power_info {
959 /* must be first! */
960 struct ni_power_info ni;
961 struct si_clock_registers clock_registers;
962 struct si_mc_reg_table mc_reg_table;
963 struct atom_voltage_table mvdd_voltage_table;
964 struct atom_voltage_table vddc_phase_shed_table;
965 struct si_leakage_voltage leakage_voltage;
966 u16 mvdd_bootup_value;
967 struct si_ulv_param ulv;
968 u32 max_cu;
969 /* pcie gen */
970 enum amdgpu_pcie_gen force_pcie_gen;
971 enum amdgpu_pcie_gen boot_pcie_gen;
972 enum amdgpu_pcie_gen acpi_pcie_gen;
973 u32 sys_pcie_mask;
974 /* flags */
975 bool enable_dte;
976 bool enable_ppm;
977 bool vddc_phase_shed_control;
978 bool pspp_notify_required;
979 bool sclk_deep_sleep_above_low;
980 bool voltage_control_svi2;
981 bool vddci_control_svi2;
982 /* smc offsets */
983 u32 sram_end;
984 u32 state_table_start;
985 u32 soft_regs_start;
986 u32 mc_reg_table_start;
987 u32 arb_table_start;
988 u32 cac_table_start;
989 u32 dte_table_start;
990 u32 spll_table_start;
991 u32 papm_cfg_table_start;
992 u32 fan_table_start;
993 /* CAC stuff */
994 const struct si_cac_config_reg *cac_weights;
995 const struct si_cac_config_reg *lcac_config;
996 const struct si_cac_config_reg *cac_override;
997 const struct si_powertune_data *powertune_data;
998 struct si_dyn_powertune_data dyn_powertune_data;
999 /* DTE stuff */
1000 struct si_dte_data dte_data;
1001 /* scratch structs */
1002 SMC_SIslands_MCRegisters smc_mc_reg_table;
1003 SISLANDS_SMC_STATETABLE smc_statetable;
1004 PP_SIslands_PAPMParameters papm_parm;
1005 /* SVI2 */
1006 u8 svd_gpio_id;
1007 u8 svc_gpio_id;
1008 /* fan control */
1009 bool fan_ctrl_is_in_default_mode;
1010 u32 t_min;
1011 u32 fan_ctrl_default_mode;
1012 bool fan_is_controlled_by_smc;
1013};
1014
1015#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/si_ih.c b/drivers/gpu/drm/amd/amdgpu/si_ih.c
new file mode 100644
index 000000000000..8fae3d4a2360
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/si_ih.c
@@ -0,0 +1,299 @@
1/*
2 * Copyright 2015 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23#include "drmP.h"
24#include "amdgpu.h"
25#include "amdgpu_ih.h"
26#include "si/sid.h"
27#include "si_ih.h"
28
29static void si_ih_set_interrupt_funcs(struct amdgpu_device *adev);
30
31static void si_ih_enable_interrupts(struct amdgpu_device *adev)
32{
33 u32 ih_cntl = RREG32(IH_CNTL);
34 u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
35
36 ih_cntl |= ENABLE_INTR;
37 ih_rb_cntl |= IH_RB_ENABLE;
38 WREG32(IH_CNTL, ih_cntl);
39 WREG32(IH_RB_CNTL, ih_rb_cntl);
40 adev->irq.ih.enabled = true;
41}
42
43static void si_ih_disable_interrupts(struct amdgpu_device *adev)
44{
45 u32 ih_rb_cntl = RREG32(IH_RB_CNTL);
46 u32 ih_cntl = RREG32(IH_CNTL);
47
48 ih_rb_cntl &= ~IH_RB_ENABLE;
49 ih_cntl &= ~ENABLE_INTR;
50 WREG32(IH_RB_CNTL, ih_rb_cntl);
51 WREG32(IH_CNTL, ih_cntl);
52 WREG32(IH_RB_RPTR, 0);
53 WREG32(IH_RB_WPTR, 0);
54 adev->irq.ih.enabled = false;
55 adev->irq.ih.rptr = 0;
56}
57
58static int si_ih_irq_init(struct amdgpu_device *adev)
59{
60 int rb_bufsz;
61 u32 interrupt_cntl, ih_cntl, ih_rb_cntl;
62 u64 wptr_off;
63
64 si_ih_disable_interrupts(adev);
65 WREG32(INTERRUPT_CNTL2, adev->irq.ih.gpu_addr >> 8);
66 interrupt_cntl = RREG32(INTERRUPT_CNTL);
67 interrupt_cntl &= ~IH_DUMMY_RD_OVERRIDE;
68 interrupt_cntl &= ~IH_REQ_NONSNOOP_EN;
69 WREG32(INTERRUPT_CNTL, interrupt_cntl);
70
71 WREG32(IH_RB_BASE, adev->irq.ih.gpu_addr >> 8);
72 rb_bufsz = order_base_2(adev->irq.ih.ring_size / 4);
73
74 ih_rb_cntl = IH_WPTR_OVERFLOW_ENABLE |
75 IH_WPTR_OVERFLOW_CLEAR |
76 (rb_bufsz << 1) |
77 IH_WPTR_WRITEBACK_ENABLE;
78
79 wptr_off = adev->wb.gpu_addr + (adev->irq.ih.wptr_offs * 4);
80 WREG32(IH_RB_WPTR_ADDR_LO, lower_32_bits(wptr_off));
81 WREG32(IH_RB_WPTR_ADDR_HI, upper_32_bits(wptr_off) & 0xFF);
82 WREG32(IH_RB_CNTL, ih_rb_cntl);
83 WREG32(IH_RB_RPTR, 0);
84 WREG32(IH_RB_WPTR, 0);
85
86 ih_cntl = MC_WRREQ_CREDIT(0x10) | MC_WR_CLEAN_CNT(0x10) | MC_VMID(0);
87 if (adev->irq.msi_enabled)
88 ih_cntl |= RPTR_REARM;
89 WREG32(IH_CNTL, ih_cntl);
90
91 pci_set_master(adev->pdev);
92 si_ih_enable_interrupts(adev);
93
94 return 0;
95}
96
97static void si_ih_irq_disable(struct amdgpu_device *adev)
98{
99 si_ih_disable_interrupts(adev);
100 mdelay(1);
101}
102
103static u32 si_ih_get_wptr(struct amdgpu_device *adev)
104{
105 u32 wptr, tmp;
106
107 wptr = le32_to_cpu(adev->wb.wb[adev->irq.ih.wptr_offs]);
108
109 if (wptr & IH_RB_WPTR__RB_OVERFLOW_MASK) {
110 wptr &= ~IH_RB_WPTR__RB_OVERFLOW_MASK;
111 dev_warn(adev->dev, "IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n",
112 wptr, adev->irq.ih.rptr, (wptr + 16) & adev->irq.ih.ptr_mask);
113 adev->irq.ih.rptr = (wptr + 16) & adev->irq.ih.ptr_mask;
114 tmp = RREG32(IH_RB_CNTL);
115 tmp |= IH_RB_CNTL__WPTR_OVERFLOW_CLEAR_MASK;
116 WREG32(IH_RB_CNTL, tmp);
117 }
118 return (wptr & adev->irq.ih.ptr_mask);
119}
120
121static void si_ih_decode_iv(struct amdgpu_device *adev,
122 struct amdgpu_iv_entry *entry)
123{
124 u32 ring_index = adev->irq.ih.rptr >> 2;
125 uint32_t dw[4];
126
127 dw[0] = le32_to_cpu(adev->irq.ih.ring[ring_index + 0]);
128 dw[1] = le32_to_cpu(adev->irq.ih.ring[ring_index + 1]);
129 dw[2] = le32_to_cpu(adev->irq.ih.ring[ring_index + 2]);
130 dw[3] = le32_to_cpu(adev->irq.ih.ring[ring_index + 3]);
131
132 entry->src_id = dw[0] & 0xff;
133 entry->src_data = dw[1] & 0xfffffff;
134 entry->ring_id = dw[2] & 0xff;
135 entry->vm_id = (dw[2] >> 8) & 0xff;
136
137 adev->irq.ih.rptr += 16;
138}
139
140static void si_ih_set_rptr(struct amdgpu_device *adev)
141{
142 WREG32(IH_RB_RPTR, adev->irq.ih.rptr);
143}
144
145static int si_ih_early_init(void *handle)
146{
147 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
148
149 si_ih_set_interrupt_funcs(adev);
150
151 return 0;
152}
153
154static int si_ih_sw_init(void *handle)
155{
156 int r;
157 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
158
159 r = amdgpu_ih_ring_init(adev, 64 * 1024, false);
160 if (r)
161 return r;
162
163 return amdgpu_irq_init(adev);
164}
165
166static int si_ih_sw_fini(void *handle)
167{
168 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
169
170 amdgpu_irq_fini(adev);
171 amdgpu_ih_ring_fini(adev);
172
173 return 0;
174}
175
176static int si_ih_hw_init(void *handle)
177{
178 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
179
180 return si_ih_irq_init(adev);
181}
182
183static int si_ih_hw_fini(void *handle)
184{
185 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
186
187 si_ih_irq_disable(adev);
188
189 return 0;
190}
191
192static int si_ih_suspend(void *handle)
193{
194 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
195
196 return si_ih_hw_fini(adev);
197}
198
199static int si_ih_resume(void *handle)
200{
201 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
202
203 return si_ih_hw_init(adev);
204}
205
206static bool si_ih_is_idle(void *handle)
207{
208 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
209 u32 tmp = RREG32(SRBM_STATUS);
210
211 if (tmp & SRBM_STATUS__IH_BUSY_MASK)
212 return false;
213
214 return true;
215}
216
217static int si_ih_wait_for_idle(void *handle)
218{
219 unsigned i;
220 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
221
222 for (i = 0; i < adev->usec_timeout; i++) {
223 if (si_ih_is_idle(handle))
224 return 0;
225 udelay(1);
226 }
227 return -ETIMEDOUT;
228}
229
230static int si_ih_soft_reset(void *handle)
231{
232 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
233
234 u32 srbm_soft_reset = 0;
235 u32 tmp = RREG32(SRBM_STATUS);
236
237 if (tmp & SRBM_STATUS__IH_BUSY_MASK)
238 srbm_soft_reset |= SRBM_SOFT_RESET__SOFT_RESET_IH_MASK;
239
240 if (srbm_soft_reset) {
241 tmp = RREG32(SRBM_SOFT_RESET);
242 tmp |= srbm_soft_reset;
243 dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
244 WREG32(SRBM_SOFT_RESET, tmp);
245 tmp = RREG32(SRBM_SOFT_RESET);
246
247 udelay(50);
248
249 tmp &= ~srbm_soft_reset;
250 WREG32(SRBM_SOFT_RESET, tmp);
251 tmp = RREG32(SRBM_SOFT_RESET);
252
253 udelay(50);
254 }
255
256 return 0;
257}
258
259static int si_ih_set_clockgating_state(void *handle,
260 enum amd_clockgating_state state)
261{
262 return 0;
263}
264
265static int si_ih_set_powergating_state(void *handle,
266 enum amd_powergating_state state)
267{
268 return 0;
269}
270
271const struct amd_ip_funcs si_ih_ip_funcs = {
272 .name = "si_ih",
273 .early_init = si_ih_early_init,
274 .late_init = NULL,
275 .sw_init = si_ih_sw_init,
276 .sw_fini = si_ih_sw_fini,
277 .hw_init = si_ih_hw_init,
278 .hw_fini = si_ih_hw_fini,
279 .suspend = si_ih_suspend,
280 .resume = si_ih_resume,
281 .is_idle = si_ih_is_idle,
282 .wait_for_idle = si_ih_wait_for_idle,
283 .soft_reset = si_ih_soft_reset,
284 .set_clockgating_state = si_ih_set_clockgating_state,
285 .set_powergating_state = si_ih_set_powergating_state,
286};
287
288static const struct amdgpu_ih_funcs si_ih_funcs = {
289 .get_wptr = si_ih_get_wptr,
290 .decode_iv = si_ih_decode_iv,
291 .set_rptr = si_ih_set_rptr
292};
293
294static void si_ih_set_interrupt_funcs(struct amdgpu_device *adev)
295{
296 if (adev->irq.ih_funcs == NULL)
297 adev->irq.ih_funcs = &si_ih_funcs;
298}
299
diff --git a/drivers/gpu/drm/amd/amdgpu/si_ih.h b/drivers/gpu/drm/amd/amdgpu/si_ih.h
new file mode 100644
index 000000000000..f3e3a954369c
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/si_ih.h
@@ -0,0 +1,29 @@
1/*
2 * Copyright 2015 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23
24#ifndef __SI_IH_H__
25#define __SI_IH_H__
26
27extern const struct amd_ip_funcs si_ih_ip_funcs;
28
29#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/si_smc.c b/drivers/gpu/drm/amd/amdgpu/si_smc.c
new file mode 100644
index 000000000000..668ba99d6c05
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/si_smc.c
@@ -0,0 +1,273 @@
1/*
2 * Copyright 2011 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 * Authors: Alex Deucher
23 */
24
25#include <linux/firmware.h>
26#include "drmP.h"
27#include "amdgpu.h"
28#include "si/sid.h"
29#include "ppsmc.h"
30#include "amdgpu_ucode.h"
31#include "sislands_smc.h"
32
33static int si_set_smc_sram_address(struct amdgpu_device *adev,
34 u32 smc_address, u32 limit)
35{
36 if (smc_address & 3)
37 return -EINVAL;
38 if ((smc_address + 3) > limit)
39 return -EINVAL;
40
41 WREG32(SMC_IND_INDEX_0, smc_address);
42 WREG32_P(SMC_IND_ACCESS_CNTL, 0, ~AUTO_INCREMENT_IND_0);
43
44 return 0;
45}
46
47int amdgpu_si_copy_bytes_to_smc(struct amdgpu_device *adev,
48 u32 smc_start_address,
49 const u8 *src, u32 byte_count, u32 limit)
50{
51 unsigned long flags;
52 int ret = 0;
53 u32 data, original_data, addr, extra_shift;
54
55 if (smc_start_address & 3)
56 return -EINVAL;
57 if ((smc_start_address + byte_count) > limit)
58 return -EINVAL;
59
60 addr = smc_start_address;
61
62 spin_lock_irqsave(&adev->smc_idx_lock, flags);
63 while (byte_count >= 4) {
64 /* SMC address space is BE */
65 data = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
66
67 ret = si_set_smc_sram_address(adev, addr, limit);
68 if (ret)
69 goto done;
70
71 WREG32(SMC_IND_DATA_0, data);
72
73 src += 4;
74 byte_count -= 4;
75 addr += 4;
76 }
77
78 /* RMW for the final bytes */
79 if (byte_count > 0) {
80 data = 0;
81
82 ret = si_set_smc_sram_address(adev, addr, limit);
83 if (ret)
84 goto done;
85
86 original_data = RREG32(SMC_IND_DATA_0);
87 extra_shift = 8 * (4 - byte_count);
88
89 while (byte_count > 0) {
90 /* SMC address space is BE */
91 data = (data << 8) + *src++;
92 byte_count--;
93 }
94
95 data <<= extra_shift;
96 data |= (original_data & ~((~0UL) << extra_shift));
97
98 ret = si_set_smc_sram_address(adev, addr, limit);
99 if (ret)
100 goto done;
101
102 WREG32(SMC_IND_DATA_0, data);
103 }
104
105done:
106 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
107
108 return ret;
109}
110
111void amdgpu_si_start_smc(struct amdgpu_device *adev)
112{
113 u32 tmp = RREG32_SMC(SMC_SYSCON_RESET_CNTL);
114
115 tmp &= ~RST_REG;
116
117 WREG32_SMC(SMC_SYSCON_RESET_CNTL, tmp);
118}
119
120void amdgpu_si_reset_smc(struct amdgpu_device *adev)
121{
122 u32 tmp;
123
124 RREG32(CB_CGTT_SCLK_CTRL);
125 RREG32(CB_CGTT_SCLK_CTRL);
126 RREG32(CB_CGTT_SCLK_CTRL);
127 RREG32(CB_CGTT_SCLK_CTRL);
128
129 tmp = RREG32_SMC(SMC_SYSCON_RESET_CNTL) |
130 RST_REG;
131 WREG32_SMC(SMC_SYSCON_RESET_CNTL, tmp);
132}
133
134int amdgpu_si_program_jump_on_start(struct amdgpu_device *adev)
135{
136 static const u8 data[] = { 0x0E, 0x00, 0x40, 0x40 };
137
138 return amdgpu_si_copy_bytes_to_smc(adev, 0x0, data, 4, sizeof(data)+1);
139}
140
141void amdgpu_si_smc_clock(struct amdgpu_device *adev, bool enable)
142{
143 u32 tmp = RREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0);
144
145 if (enable)
146 tmp &= ~CK_DISABLE;
147 else
148 tmp |= CK_DISABLE;
149
150 WREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0, tmp);
151}
152
153bool amdgpu_si_is_smc_running(struct amdgpu_device *adev)
154{
155 u32 rst = RREG32_SMC(SMC_SYSCON_RESET_CNTL);
156 u32 clk = RREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0);
157
158 if (!(rst & RST_REG) && !(clk & CK_DISABLE))
159 return true;
160
161 return false;
162}
163
164PPSMC_Result amdgpu_si_send_msg_to_smc(struct amdgpu_device *adev,
165 PPSMC_Msg msg)
166{
167 u32 tmp;
168 int i;
169
170 if (!amdgpu_si_is_smc_running(adev))
171 return PPSMC_Result_Failed;
172
173 WREG32(SMC_MESSAGE_0, msg);
174
175 for (i = 0; i < adev->usec_timeout; i++) {
176 tmp = RREG32(SMC_RESP_0);
177 if (tmp != 0)
178 break;
179 udelay(1);
180 }
181
182 return (PPSMC_Result)RREG32(SMC_RESP_0);
183}
184
185PPSMC_Result amdgpu_si_wait_for_smc_inactive(struct amdgpu_device *adev)
186{
187 u32 tmp;
188 int i;
189
190 if (!amdgpu_si_is_smc_running(adev))
191 return PPSMC_Result_OK;
192
193 for (i = 0; i < adev->usec_timeout; i++) {
194 tmp = RREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0);
195 if ((tmp & CKEN) == 0)
196 break;
197 udelay(1);
198 }
199
200 return PPSMC_Result_OK;
201}
202
203int amdgpu_si_load_smc_ucode(struct amdgpu_device *adev, u32 limit)
204{
205 const struct smc_firmware_header_v1_0 *hdr;
206 unsigned long flags;
207 u32 ucode_start_address;
208 u32 ucode_size;
209 const u8 *src;
210 u32 data;
211
212 if (!adev->pm.fw)
213 return -EINVAL;
214
215 hdr = (const struct smc_firmware_header_v1_0 *)adev->pm.fw->data;
216
217 amdgpu_ucode_print_smc_hdr(&hdr->header);
218
219 adev->pm.fw_version = le32_to_cpu(hdr->header.ucode_version);
220 ucode_start_address = le32_to_cpu(hdr->ucode_start_addr);
221 ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes);
222 src = (const u8 *)
223 (adev->pm.fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
224 if (ucode_size & 3)
225 return -EINVAL;
226
227 spin_lock_irqsave(&adev->smc_idx_lock, flags);
228 WREG32(SMC_IND_INDEX_0, ucode_start_address);
229 WREG32_P(SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, ~AUTO_INCREMENT_IND_0);
230 while (ucode_size >= 4) {
231 /* SMC address space is BE */
232 data = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
233
234 WREG32(SMC_IND_DATA_0, data);
235
236 src += 4;
237 ucode_size -= 4;
238 }
239 WREG32_P(SMC_IND_ACCESS_CNTL, 0, ~AUTO_INCREMENT_IND_0);
240 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
241
242 return 0;
243}
244
245int amdgpu_si_read_smc_sram_dword(struct amdgpu_device *adev, u32 smc_address,
246 u32 *value, u32 limit)
247{
248 unsigned long flags;
249 int ret;
250
251 spin_lock_irqsave(&adev->smc_idx_lock, flags);
252 ret = si_set_smc_sram_address(adev, smc_address, limit);
253 if (ret == 0)
254 *value = RREG32(SMC_IND_DATA_0);
255 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
256
257 return ret;
258}
259
260int amdgpu_si_write_smc_sram_dword(struct amdgpu_device *adev, u32 smc_address,
261 u32 value, u32 limit)
262{
263 unsigned long flags;
264 int ret;
265
266 spin_lock_irqsave(&adev->smc_idx_lock, flags);
267 ret = si_set_smc_sram_address(adev, smc_address, limit);
268 if (ret == 0)
269 WREG32(SMC_IND_DATA_0, value);
270 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
271
272 return ret;
273}
diff --git a/drivers/gpu/drm/amd/amdgpu/sislands_smc.h b/drivers/gpu/drm/amd/amdgpu/sislands_smc.h
new file mode 100644
index 000000000000..d2930eceaf3c
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/sislands_smc.h
@@ -0,0 +1,423 @@
1/*
2 * Copyright 2013 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23#ifndef PP_SISLANDS_SMC_H
24#define PP_SISLANDS_SMC_H
25
26#include "ppsmc.h"
27
28#pragma pack(push, 1)
29
30#define SISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE 16
31
32struct PP_SIslands_Dpm2PerfLevel
33{
34 uint8_t MaxPS;
35 uint8_t TgtAct;
36 uint8_t MaxPS_StepInc;
37 uint8_t MaxPS_StepDec;
38 uint8_t PSSamplingTime;
39 uint8_t NearTDPDec;
40 uint8_t AboveSafeInc;
41 uint8_t BelowSafeInc;
42 uint8_t PSDeltaLimit;
43 uint8_t PSDeltaWin;
44 uint16_t PwrEfficiencyRatio;
45 uint8_t Reserved[4];
46};
47
48typedef struct PP_SIslands_Dpm2PerfLevel PP_SIslands_Dpm2PerfLevel;
49
50struct PP_SIslands_DPM2Status
51{
52 uint32_t dpm2Flags;
53 uint8_t CurrPSkip;
54 uint8_t CurrPSkipPowerShift;
55 uint8_t CurrPSkipTDP;
56 uint8_t CurrPSkipOCP;
57 uint8_t MaxSPLLIndex;
58 uint8_t MinSPLLIndex;
59 uint8_t CurrSPLLIndex;
60 uint8_t InfSweepMode;
61 uint8_t InfSweepDir;
62 uint8_t TDPexceeded;
63 uint8_t reserved;
64 uint8_t SwitchDownThreshold;
65 uint32_t SwitchDownCounter;
66 uint32_t SysScalingFactor;
67};
68
69typedef struct PP_SIslands_DPM2Status PP_SIslands_DPM2Status;
70
71struct PP_SIslands_DPM2Parameters
72{
73 uint32_t TDPLimit;
74 uint32_t NearTDPLimit;
75 uint32_t SafePowerLimit;
76 uint32_t PowerBoostLimit;
77 uint32_t MinLimitDelta;
78};
79typedef struct PP_SIslands_DPM2Parameters PP_SIslands_DPM2Parameters;
80
81struct PP_SIslands_PAPMStatus
82{
83 uint32_t EstimatedDGPU_T;
84 uint32_t EstimatedDGPU_P;
85 uint32_t EstimatedAPU_T;
86 uint32_t EstimatedAPU_P;
87 uint8_t dGPU_T_Limit_Exceeded;
88 uint8_t reserved[3];
89};
90typedef struct PP_SIslands_PAPMStatus PP_SIslands_PAPMStatus;
91
92struct PP_SIslands_PAPMParameters
93{
94 uint32_t NearTDPLimitTherm;
95 uint32_t NearTDPLimitPAPM;
96 uint32_t PlatformPowerLimit;
97 uint32_t dGPU_T_Limit;
98 uint32_t dGPU_T_Warning;
99 uint32_t dGPU_T_Hysteresis;
100};
101typedef struct PP_SIslands_PAPMParameters PP_SIslands_PAPMParameters;
102
103struct SISLANDS_SMC_SCLK_VALUE
104{
105 uint32_t vCG_SPLL_FUNC_CNTL;
106 uint32_t vCG_SPLL_FUNC_CNTL_2;
107 uint32_t vCG_SPLL_FUNC_CNTL_3;
108 uint32_t vCG_SPLL_FUNC_CNTL_4;
109 uint32_t vCG_SPLL_SPREAD_SPECTRUM;
110 uint32_t vCG_SPLL_SPREAD_SPECTRUM_2;
111 uint32_t sclk_value;
112};
113
114typedef struct SISLANDS_SMC_SCLK_VALUE SISLANDS_SMC_SCLK_VALUE;
115
116struct SISLANDS_SMC_MCLK_VALUE
117{
118 uint32_t vMPLL_FUNC_CNTL;
119 uint32_t vMPLL_FUNC_CNTL_1;
120 uint32_t vMPLL_FUNC_CNTL_2;
121 uint32_t vMPLL_AD_FUNC_CNTL;
122 uint32_t vMPLL_DQ_FUNC_CNTL;
123 uint32_t vMCLK_PWRMGT_CNTL;
124 uint32_t vDLL_CNTL;
125 uint32_t vMPLL_SS;
126 uint32_t vMPLL_SS2;
127 uint32_t mclk_value;
128};
129
130typedef struct SISLANDS_SMC_MCLK_VALUE SISLANDS_SMC_MCLK_VALUE;
131
132struct SISLANDS_SMC_VOLTAGE_VALUE
133{
134 uint16_t value;
135 uint8_t index;
136 uint8_t phase_settings;
137};
138
139typedef struct SISLANDS_SMC_VOLTAGE_VALUE SISLANDS_SMC_VOLTAGE_VALUE;
140
141struct SISLANDS_SMC_HW_PERFORMANCE_LEVEL
142{
143 uint8_t ACIndex;
144 uint8_t displayWatermark;
145 uint8_t gen2PCIE;
146 uint8_t UVDWatermark;
147 uint8_t VCEWatermark;
148 uint8_t strobeMode;
149 uint8_t mcFlags;
150 uint8_t padding;
151 uint32_t aT;
152 uint32_t bSP;
153 SISLANDS_SMC_SCLK_VALUE sclk;
154 SISLANDS_SMC_MCLK_VALUE mclk;
155 SISLANDS_SMC_VOLTAGE_VALUE vddc;
156 SISLANDS_SMC_VOLTAGE_VALUE mvdd;
157 SISLANDS_SMC_VOLTAGE_VALUE vddci;
158 SISLANDS_SMC_VOLTAGE_VALUE std_vddc;
159 uint8_t hysteresisUp;
160 uint8_t hysteresisDown;
161 uint8_t stateFlags;
162 uint8_t arbRefreshState;
163 uint32_t SQPowerThrottle;
164 uint32_t SQPowerThrottle_2;
165 uint32_t MaxPoweredUpCU;
166 SISLANDS_SMC_VOLTAGE_VALUE high_temp_vddc;
167 SISLANDS_SMC_VOLTAGE_VALUE low_temp_vddc;
168 uint32_t reserved[2];
169 PP_SIslands_Dpm2PerfLevel dpm2;
170};
171
172#define SISLANDS_SMC_STROBE_RATIO 0x0F
173#define SISLANDS_SMC_STROBE_ENABLE 0x10
174
175#define SISLANDS_SMC_MC_EDC_RD_FLAG 0x01
176#define SISLANDS_SMC_MC_EDC_WR_FLAG 0x02
177#define SISLANDS_SMC_MC_RTT_ENABLE 0x04
178#define SISLANDS_SMC_MC_STUTTER_EN 0x08
179#define SISLANDS_SMC_MC_PG_EN 0x10
180
181typedef struct SISLANDS_SMC_HW_PERFORMANCE_LEVEL SISLANDS_SMC_HW_PERFORMANCE_LEVEL;
182
183struct SISLANDS_SMC_SWSTATE
184{
185 uint8_t flags;
186 uint8_t levelCount;
187 uint8_t padding2;
188 uint8_t padding3;
189 SISLANDS_SMC_HW_PERFORMANCE_LEVEL levels[1];
190};
191
192typedef struct SISLANDS_SMC_SWSTATE SISLANDS_SMC_SWSTATE;
193
194#define SISLANDS_SMC_VOLTAGEMASK_VDDC 0
195#define SISLANDS_SMC_VOLTAGEMASK_MVDD 1
196#define SISLANDS_SMC_VOLTAGEMASK_VDDCI 2
197#define SISLANDS_SMC_VOLTAGEMASK_VDDC_PHASE_SHEDDING 3
198#define SISLANDS_SMC_VOLTAGEMASK_MAX 4
199
200struct SISLANDS_SMC_VOLTAGEMASKTABLE
201{
202 uint32_t lowMask[SISLANDS_SMC_VOLTAGEMASK_MAX];
203};
204
205typedef struct SISLANDS_SMC_VOLTAGEMASKTABLE SISLANDS_SMC_VOLTAGEMASKTABLE;
206
207#define SISLANDS_MAX_NO_VREG_STEPS 32
208
209struct SISLANDS_SMC_STATETABLE
210{
211 uint8_t thermalProtectType;
212 uint8_t systemFlags;
213 uint8_t maxVDDCIndexInPPTable;
214 uint8_t extraFlags;
215 uint32_t lowSMIO[SISLANDS_MAX_NO_VREG_STEPS];
216 SISLANDS_SMC_VOLTAGEMASKTABLE voltageMaskTable;
217 SISLANDS_SMC_VOLTAGEMASKTABLE phaseMaskTable;
218 PP_SIslands_DPM2Parameters dpm2Params;
219 SISLANDS_SMC_SWSTATE initialState;
220 SISLANDS_SMC_SWSTATE ACPIState;
221 SISLANDS_SMC_SWSTATE ULVState;
222 SISLANDS_SMC_SWSTATE driverState;
223 SISLANDS_SMC_HW_PERFORMANCE_LEVEL dpmLevels[SISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE - 1];
224};
225
226typedef struct SISLANDS_SMC_STATETABLE SISLANDS_SMC_STATETABLE;
227
228#define SI_SMC_SOFT_REGISTER_mclk_chg_timeout 0x0
229#define SI_SMC_SOFT_REGISTER_delay_vreg 0xC
230#define SI_SMC_SOFT_REGISTER_delay_acpi 0x28
231#define SI_SMC_SOFT_REGISTER_seq_index 0x5C
232#define SI_SMC_SOFT_REGISTER_mvdd_chg_time 0x60
233#define SI_SMC_SOFT_REGISTER_mclk_switch_lim 0x70
234#define SI_SMC_SOFT_REGISTER_watermark_threshold 0x78
235#define SI_SMC_SOFT_REGISTER_phase_shedding_delay 0x88
236#define SI_SMC_SOFT_REGISTER_ulv_volt_change_delay 0x8C
237#define SI_SMC_SOFT_REGISTER_mc_block_delay 0x98
238#define SI_SMC_SOFT_REGISTER_ticks_per_us 0xA8
239#define SI_SMC_SOFT_REGISTER_crtc_index 0xC4
240#define SI_SMC_SOFT_REGISTER_mclk_change_block_cp_min 0xC8
241#define SI_SMC_SOFT_REGISTER_mclk_change_block_cp_max 0xCC
242#define SI_SMC_SOFT_REGISTER_non_ulv_pcie_link_width 0xF4
243#define SI_SMC_SOFT_REGISTER_tdr_is_about_to_happen 0xFC
244#define SI_SMC_SOFT_REGISTER_vr_hot_gpio 0x100
245#define SI_SMC_SOFT_REGISTER_svi_rework_plat_type 0x118
246#define SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svd 0x11c
247#define SI_SMC_SOFT_REGISTER_svi_rework_gpio_id_svc 0x120
248
249struct PP_SIslands_FanTable
250{
251 uint8_t fdo_mode;
252 uint8_t padding;
253 int16_t temp_min;
254 int16_t temp_med;
255 int16_t temp_max;
256 int16_t slope1;
257 int16_t slope2;
258 int16_t fdo_min;
259 int16_t hys_up;
260 int16_t hys_down;
261 int16_t hys_slope;
262 int16_t temp_resp_lim;
263 int16_t temp_curr;
264 int16_t slope_curr;
265 int16_t pwm_curr;
266 uint32_t refresh_period;
267 int16_t fdo_max;
268 uint8_t temp_src;
269 int8_t padding2;
270};
271
272typedef struct PP_SIslands_FanTable PP_SIslands_FanTable;
273
274#define SMC_SISLANDS_LKGE_LUT_NUM_OF_TEMP_ENTRIES 16
275#define SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES 32
276
277#define SMC_SISLANDS_SCALE_I 7
278#define SMC_SISLANDS_SCALE_R 12
279
280struct PP_SIslands_CacConfig
281{
282 uint16_t cac_lkge_lut[SMC_SISLANDS_LKGE_LUT_NUM_OF_TEMP_ENTRIES][SMC_SISLANDS_LKGE_LUT_NUM_OF_VOLT_ENTRIES];
283 uint32_t lkge_lut_V0;
284 uint32_t lkge_lut_Vstep;
285 uint32_t WinTime;
286 uint32_t R_LL;
287 uint32_t calculation_repeats;
288 uint32_t l2numWin_TDP;
289 uint32_t dc_cac;
290 uint8_t lts_truncate_n;
291 uint8_t SHIFT_N;
292 uint8_t log2_PG_LKG_SCALE;
293 uint8_t cac_temp;
294 uint32_t lkge_lut_T0;
295 uint32_t lkge_lut_Tstep;
296};
297
298typedef struct PP_SIslands_CacConfig PP_SIslands_CacConfig;
299
300#define SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE 16
301#define SMC_SISLANDS_MC_REGISTER_ARRAY_SET_COUNT 20
302
303struct SMC_SIslands_MCRegisterAddress
304{
305 uint16_t s0;
306 uint16_t s1;
307};
308
309typedef struct SMC_SIslands_MCRegisterAddress SMC_SIslands_MCRegisterAddress;
310
311struct SMC_SIslands_MCRegisterSet
312{
313 uint32_t value[SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE];
314};
315
316typedef struct SMC_SIslands_MCRegisterSet SMC_SIslands_MCRegisterSet;
317
318struct SMC_SIslands_MCRegisters
319{
320 uint8_t last;
321 uint8_t reserved[3];
322 SMC_SIslands_MCRegisterAddress address[SMC_SISLANDS_MC_REGISTER_ARRAY_SIZE];
323 SMC_SIslands_MCRegisterSet data[SMC_SISLANDS_MC_REGISTER_ARRAY_SET_COUNT];
324};
325
326typedef struct SMC_SIslands_MCRegisters SMC_SIslands_MCRegisters;
327
328struct SMC_SIslands_MCArbDramTimingRegisterSet
329{
330 uint32_t mc_arb_dram_timing;
331 uint32_t mc_arb_dram_timing2;
332 uint8_t mc_arb_rfsh_rate;
333 uint8_t mc_arb_burst_time;
334 uint8_t padding[2];
335};
336
337typedef struct SMC_SIslands_MCArbDramTimingRegisterSet SMC_SIslands_MCArbDramTimingRegisterSet;
338
339struct SMC_SIslands_MCArbDramTimingRegisters
340{
341 uint8_t arb_current;
342 uint8_t reserved[3];
343 SMC_SIslands_MCArbDramTimingRegisterSet data[16];
344};
345
346typedef struct SMC_SIslands_MCArbDramTimingRegisters SMC_SIslands_MCArbDramTimingRegisters;
347
348struct SMC_SISLANDS_SPLL_DIV_TABLE
349{
350 uint32_t freq[256];
351 uint32_t ss[256];
352};
353
354#define SMC_SISLANDS_SPLL_DIV_TABLE_FBDIV_MASK 0x01ffffff
355#define SMC_SISLANDS_SPLL_DIV_TABLE_FBDIV_SHIFT 0
356#define SMC_SISLANDS_SPLL_DIV_TABLE_PDIV_MASK 0xfe000000
357#define SMC_SISLANDS_SPLL_DIV_TABLE_PDIV_SHIFT 25
358#define SMC_SISLANDS_SPLL_DIV_TABLE_CLKV_MASK 0x000fffff
359#define SMC_SISLANDS_SPLL_DIV_TABLE_CLKV_SHIFT 0
360#define SMC_SISLANDS_SPLL_DIV_TABLE_CLKS_MASK 0xfff00000
361#define SMC_SISLANDS_SPLL_DIV_TABLE_CLKS_SHIFT 20
362
363typedef struct SMC_SISLANDS_SPLL_DIV_TABLE SMC_SISLANDS_SPLL_DIV_TABLE;
364
365#define SMC_SISLANDS_DTE_MAX_FILTER_STAGES 5
366
367#define SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE 16
368
369struct Smc_SIslands_DTE_Configuration
370{
371 uint32_t tau[SMC_SISLANDS_DTE_MAX_FILTER_STAGES];
372 uint32_t R[SMC_SISLANDS_DTE_MAX_FILTER_STAGES];
373 uint32_t K;
374 uint32_t T0;
375 uint32_t MaxT;
376 uint8_t WindowSize;
377 uint8_t Tdep_count;
378 uint8_t temp_select;
379 uint8_t DTE_mode;
380 uint8_t T_limits[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
381 uint32_t Tdep_tau[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
382 uint32_t Tdep_R[SMC_SISLANDS_DTE_MAX_TEMPERATURE_DEPENDENT_ARRAY_SIZE];
383 uint32_t Tthreshold;
384};
385
386typedef struct Smc_SIslands_DTE_Configuration Smc_SIslands_DTE_Configuration;
387
388#define SMC_SISLANDS_DTE_STATUS_FLAG_DTE_ON 1
389
390#define SISLANDS_SMC_FIRMWARE_HEADER_LOCATION 0x10000
391
392#define SISLANDS_SMC_FIRMWARE_HEADER_version 0x0
393#define SISLANDS_SMC_FIRMWARE_HEADER_flags 0x4
394#define SISLANDS_SMC_FIRMWARE_HEADER_softRegisters 0xC
395#define SISLANDS_SMC_FIRMWARE_HEADER_stateTable 0x10
396#define SISLANDS_SMC_FIRMWARE_HEADER_fanTable 0x14
397#define SISLANDS_SMC_FIRMWARE_HEADER_CacConfigTable 0x18
398#define SISLANDS_SMC_FIRMWARE_HEADER_mcRegisterTable 0x24
399#define SISLANDS_SMC_FIRMWARE_HEADER_mcArbDramAutoRefreshTable 0x30
400#define SISLANDS_SMC_FIRMWARE_HEADER_spllTable 0x38
401#define SISLANDS_SMC_FIRMWARE_HEADER_DteConfiguration 0x40
402#define SISLANDS_SMC_FIRMWARE_HEADER_PAPMParameters 0x48
403
404#pragma pack(pop)
405
406int amdgpu_si_copy_bytes_to_smc(struct amdgpu_device *adev,
407 u32 smc_start_address,
408 const u8 *src, u32 byte_count, u32 limit);
409void amdgpu_si_start_smc(struct amdgpu_device *adev);
410void amdgpu_si_reset_smc(struct amdgpu_device *adev);
411int amdgpu_si_program_jump_on_start(struct amdgpu_device *adev);
412void amdgpu_si_smc_clock(struct amdgpu_device *adev, bool enable);
413bool amdgpu_si_is_smc_running(struct amdgpu_device *adev);
414PPSMC_Result amdgpu_si_send_msg_to_smc(struct amdgpu_device *adev, PPSMC_Msg msg);
415PPSMC_Result amdgpu_si_wait_for_smc_inactive(struct amdgpu_device *adev);
416int amdgpu_si_load_smc_ucode(struct amdgpu_device *adev, u32 limit);
417int amdgpu_si_read_smc_sram_dword(struct amdgpu_device *adev, u32 smc_address,
418 u32 *value, u32 limit);
419int amdgpu_si_write_smc_sram_dword(struct amdgpu_device *adev, u32 smc_address,
420 u32 value, u32 limit);
421
422#endif
423
diff --git a/drivers/gpu/drm/amd/amdgpu/tonga_dpm.c b/drivers/gpu/drm/amd/amdgpu/tonga_dpm.c
deleted file mode 100644
index f06f6f4dc3a8..000000000000
--- a/drivers/gpu/drm/amd/amdgpu/tonga_dpm.c
+++ /dev/null
@@ -1,186 +0,0 @@
1/*
2 * Copyright 2014 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23
24#include <linux/firmware.h>
25#include "drmP.h"
26#include "amdgpu.h"
27#include "tonga_smum.h"
28
29MODULE_FIRMWARE("amdgpu/tonga_smc.bin");
30
31static void tonga_dpm_set_funcs(struct amdgpu_device *adev);
32
33static int tonga_dpm_early_init(void *handle)
34{
35 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
36
37 tonga_dpm_set_funcs(adev);
38
39 return 0;
40}
41
42static int tonga_dpm_init_microcode(struct amdgpu_device *adev)
43{
44 char fw_name[30] = "amdgpu/tonga_smc.bin";
45 int err;
46 err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
47 if (err)
48 goto out;
49 err = amdgpu_ucode_validate(adev->pm.fw);
50
51out:
52 if (err) {
53 DRM_ERROR("Failed to load firmware \"%s\"", fw_name);
54 release_firmware(adev->pm.fw);
55 adev->pm.fw = NULL;
56 }
57 return err;
58}
59
60static int tonga_dpm_sw_init(void *handle)
61{
62 int ret;
63 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
64
65 ret = tonga_dpm_init_microcode(adev);
66 if (ret)
67 return ret;
68
69 return 0;
70}
71
72static int tonga_dpm_sw_fini(void *handle)
73{
74 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
75
76 release_firmware(adev->pm.fw);
77 adev->pm.fw = NULL;
78
79 return 0;
80}
81
82static int tonga_dpm_hw_init(void *handle)
83{
84 int ret;
85 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
86
87 mutex_lock(&adev->pm.mutex);
88
89 /* smu init only needs to be called at startup, not resume.
90 * It should be in sw_init, but requires the fw info gathered
91 * in sw_init from other IP modules.
92 */
93 ret = tonga_smu_init(adev);
94 if (ret) {
95 DRM_ERROR("SMU initialization failed\n");
96 goto fail;
97 }
98
99 ret = tonga_smu_start(adev);
100 if (ret) {
101 DRM_ERROR("SMU start failed\n");
102 goto fail;
103 }
104
105 mutex_unlock(&adev->pm.mutex);
106 return 0;
107
108fail:
109 adev->firmware.smu_load = false;
110 mutex_unlock(&adev->pm.mutex);
111 return -EINVAL;
112}
113
114static int tonga_dpm_hw_fini(void *handle)
115{
116 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
117
118 mutex_lock(&adev->pm.mutex);
119 /* smu fini only needs to be called at teardown, not suspend.
120 * It should be in sw_fini, but we put it here for symmetry
121 * with smu init.
122 */
123 tonga_smu_fini(adev);
124 mutex_unlock(&adev->pm.mutex);
125 return 0;
126}
127
128static int tonga_dpm_suspend(void *handle)
129{
130 return tonga_dpm_hw_fini(handle);
131}
132
133static int tonga_dpm_resume(void *handle)
134{
135 return tonga_dpm_hw_init(handle);
136}
137
138static int tonga_dpm_set_clockgating_state(void *handle,
139 enum amd_clockgating_state state)
140{
141 return 0;
142}
143
144static int tonga_dpm_set_powergating_state(void *handle,
145 enum amd_powergating_state state)
146{
147 return 0;
148}
149
150const struct amd_ip_funcs tonga_dpm_ip_funcs = {
151 .name = "tonga_dpm",
152 .early_init = tonga_dpm_early_init,
153 .late_init = NULL,
154 .sw_init = tonga_dpm_sw_init,
155 .sw_fini = tonga_dpm_sw_fini,
156 .hw_init = tonga_dpm_hw_init,
157 .hw_fini = tonga_dpm_hw_fini,
158 .suspend = tonga_dpm_suspend,
159 .resume = tonga_dpm_resume,
160 .is_idle = NULL,
161 .wait_for_idle = NULL,
162 .soft_reset = NULL,
163 .set_clockgating_state = tonga_dpm_set_clockgating_state,
164 .set_powergating_state = tonga_dpm_set_powergating_state,
165};
166
167static const struct amdgpu_dpm_funcs tonga_dpm_funcs = {
168 .get_temperature = NULL,
169 .pre_set_power_state = NULL,
170 .set_power_state = NULL,
171 .post_set_power_state = NULL,
172 .display_configuration_changed = NULL,
173 .get_sclk = NULL,
174 .get_mclk = NULL,
175 .print_power_state = NULL,
176 .debugfs_print_current_performance_level = NULL,
177 .force_performance_level = NULL,
178 .vblank_too_short = NULL,
179 .powergate_uvd = NULL,
180};
181
182static void tonga_dpm_set_funcs(struct amdgpu_device *adev)
183{
184 if (NULL == adev->pm.funcs)
185 adev->pm.funcs = &tonga_dpm_funcs;
186}
diff --git a/drivers/gpu/drm/amd/amdgpu/tonga_ih.c b/drivers/gpu/drm/amd/amdgpu/tonga_ih.c
index c92055805a45..d127d59f953a 100644
--- a/drivers/gpu/drm/amd/amdgpu/tonga_ih.c
+++ b/drivers/gpu/drm/amd/amdgpu/tonga_ih.c
@@ -373,10 +373,10 @@ static int tonga_ih_wait_for_idle(void *handle)
373 return -ETIMEDOUT; 373 return -ETIMEDOUT;
374} 374}
375 375
376static int tonga_ih_soft_reset(void *handle) 376static int tonga_ih_check_soft_reset(void *handle)
377{ 377{
378 u32 srbm_soft_reset = 0;
379 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 378 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
379 u32 srbm_soft_reset = 0;
380 u32 tmp = RREG32(mmSRBM_STATUS); 380 u32 tmp = RREG32(mmSRBM_STATUS);
381 381
382 if (tmp & SRBM_STATUS__IH_BUSY_MASK) 382 if (tmp & SRBM_STATUS__IH_BUSY_MASK)
@@ -384,6 +384,48 @@ static int tonga_ih_soft_reset(void *handle)
384 SOFT_RESET_IH, 1); 384 SOFT_RESET_IH, 1);
385 385
386 if (srbm_soft_reset) { 386 if (srbm_soft_reset) {
387 adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang = true;
388 adev->irq.srbm_soft_reset = srbm_soft_reset;
389 } else {
390 adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang = false;
391 adev->irq.srbm_soft_reset = 0;
392 }
393
394 return 0;
395}
396
397static int tonga_ih_pre_soft_reset(void *handle)
398{
399 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
400
401 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang)
402 return 0;
403
404 return tonga_ih_hw_fini(adev);
405}
406
407static int tonga_ih_post_soft_reset(void *handle)
408{
409 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
410
411 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang)
412 return 0;
413
414 return tonga_ih_hw_init(adev);
415}
416
417static int tonga_ih_soft_reset(void *handle)
418{
419 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
420 u32 srbm_soft_reset;
421
422 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_IH].hang)
423 return 0;
424 srbm_soft_reset = adev->irq.srbm_soft_reset;
425
426 if (srbm_soft_reset) {
427 u32 tmp;
428
387 tmp = RREG32(mmSRBM_SOFT_RESET); 429 tmp = RREG32(mmSRBM_SOFT_RESET);
388 tmp |= srbm_soft_reset; 430 tmp |= srbm_soft_reset;
389 dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp); 431 dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
@@ -427,7 +469,10 @@ const struct amd_ip_funcs tonga_ih_ip_funcs = {
427 .resume = tonga_ih_resume, 469 .resume = tonga_ih_resume,
428 .is_idle = tonga_ih_is_idle, 470 .is_idle = tonga_ih_is_idle,
429 .wait_for_idle = tonga_ih_wait_for_idle, 471 .wait_for_idle = tonga_ih_wait_for_idle,
472 .check_soft_reset = tonga_ih_check_soft_reset,
473 .pre_soft_reset = tonga_ih_pre_soft_reset,
430 .soft_reset = tonga_ih_soft_reset, 474 .soft_reset = tonga_ih_soft_reset,
475 .post_soft_reset = tonga_ih_post_soft_reset,
431 .set_clockgating_state = tonga_ih_set_clockgating_state, 476 .set_clockgating_state = tonga_ih_set_clockgating_state,
432 .set_powergating_state = tonga_ih_set_powergating_state, 477 .set_powergating_state = tonga_ih_set_powergating_state,
433}; 478};
diff --git a/drivers/gpu/drm/amd/amdgpu/tonga_smc.c b/drivers/gpu/drm/amd/amdgpu/tonga_smc.c
deleted file mode 100644
index 940de1836f8f..000000000000
--- a/drivers/gpu/drm/amd/amdgpu/tonga_smc.c
+++ /dev/null
@@ -1,862 +0,0 @@
1/*
2 * Copyright 2014 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23
24#include <linux/firmware.h>
25#include "drmP.h"
26#include "amdgpu.h"
27#include "tonga_ppsmc.h"
28#include "tonga_smum.h"
29#include "smu_ucode_xfer_vi.h"
30#include "amdgpu_ucode.h"
31
32#include "smu/smu_7_1_2_d.h"
33#include "smu/smu_7_1_2_sh_mask.h"
34
35#define TONGA_SMC_SIZE 0x20000
36
37static int tonga_set_smc_sram_address(struct amdgpu_device *adev, uint32_t smc_address, uint32_t limit)
38{
39 uint32_t val;
40
41 if (smc_address & 3)
42 return -EINVAL;
43
44 if ((smc_address + 3) > limit)
45 return -EINVAL;
46
47 WREG32(mmSMC_IND_INDEX_0, smc_address);
48
49 val = RREG32(mmSMC_IND_ACCESS_CNTL);
50 val = REG_SET_FIELD(val, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, 0);
51 WREG32(mmSMC_IND_ACCESS_CNTL, val);
52
53 return 0;
54}
55
56static int tonga_copy_bytes_to_smc(struct amdgpu_device *adev, uint32_t smc_start_address, const uint8_t *src, uint32_t byte_count, uint32_t limit)
57{
58 uint32_t addr;
59 uint32_t data, orig_data;
60 int result = 0;
61 uint32_t extra_shift;
62 unsigned long flags;
63
64 if (smc_start_address & 3)
65 return -EINVAL;
66
67 if ((smc_start_address + byte_count) > limit)
68 return -EINVAL;
69
70 addr = smc_start_address;
71
72 spin_lock_irqsave(&adev->smc_idx_lock, flags);
73 while (byte_count >= 4) {
74 /* Bytes are written into the SMC addres space with the MSB first */
75 data = (src[0] << 24) + (src[1] << 16) + (src[2] << 8) + src[3];
76
77 result = tonga_set_smc_sram_address(adev, addr, limit);
78
79 if (result)
80 goto out;
81
82 WREG32(mmSMC_IND_DATA_0, data);
83
84 src += 4;
85 byte_count -= 4;
86 addr += 4;
87 }
88
89 if (0 != byte_count) {
90 /* Now write odd bytes left, do a read modify write cycle */
91 data = 0;
92
93 result = tonga_set_smc_sram_address(adev, addr, limit);
94 if (result)
95 goto out;
96
97 orig_data = RREG32(mmSMC_IND_DATA_0);
98 extra_shift = 8 * (4 - byte_count);
99
100 while (byte_count > 0) {
101 data = (data << 8) + *src++;
102 byte_count--;
103 }
104
105 data <<= extra_shift;
106 data |= (orig_data & ~((~0UL) << extra_shift));
107
108 result = tonga_set_smc_sram_address(adev, addr, limit);
109 if (result)
110 goto out;
111
112 WREG32(mmSMC_IND_DATA_0, data);
113 }
114
115out:
116 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
117 return result;
118}
119
120static int tonga_program_jump_on_start(struct amdgpu_device *adev)
121{
122 static unsigned char data[] = {0xE0, 0x00, 0x80, 0x40};
123 tonga_copy_bytes_to_smc(adev, 0x0, data, 4, sizeof(data)+1);
124
125 return 0;
126}
127
128static bool tonga_is_smc_ram_running(struct amdgpu_device *adev)
129{
130 uint32_t val = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
131 val = REG_GET_FIELD(val, SMC_SYSCON_CLOCK_CNTL_0, ck_disable);
132
133 return ((0 == val) && (0x20100 <= RREG32_SMC(ixSMC_PC_C)));
134}
135
136static int wait_smu_response(struct amdgpu_device *adev)
137{
138 int i;
139 uint32_t val;
140
141 for (i = 0; i < adev->usec_timeout; i++) {
142 val = RREG32(mmSMC_RESP_0);
143 if (REG_GET_FIELD(val, SMC_RESP_0, SMC_RESP))
144 break;
145 udelay(1);
146 }
147
148 if (i == adev->usec_timeout)
149 return -EINVAL;
150
151 return 0;
152}
153
154static int tonga_send_msg_to_smc_offset(struct amdgpu_device *adev)
155{
156 if (wait_smu_response(adev)) {
157 DRM_ERROR("Failed to send previous message\n");
158 return -EINVAL;
159 }
160
161 WREG32(mmSMC_MSG_ARG_0, 0x20000);
162 WREG32(mmSMC_MESSAGE_0, PPSMC_MSG_Test);
163
164 if (wait_smu_response(adev)) {
165 DRM_ERROR("Failed to send message\n");
166 return -EINVAL;
167 }
168
169 return 0;
170}
171
172static int tonga_send_msg_to_smc(struct amdgpu_device *adev, PPSMC_Msg msg)
173{
174 if (!tonga_is_smc_ram_running(adev))
175 {
176 return -EINVAL;
177 }
178
179 if (wait_smu_response(adev)) {
180 DRM_ERROR("Failed to send previous message\n");
181 return -EINVAL;
182 }
183
184 WREG32(mmSMC_MESSAGE_0, msg);
185
186 if (wait_smu_response(adev)) {
187 DRM_ERROR("Failed to send message\n");
188 return -EINVAL;
189 }
190
191 return 0;
192}
193
194static int tonga_send_msg_to_smc_without_waiting(struct amdgpu_device *adev,
195 PPSMC_Msg msg)
196{
197 if (wait_smu_response(adev)) {
198 DRM_ERROR("Failed to send previous message\n");
199 return -EINVAL;
200 }
201
202 WREG32(mmSMC_MESSAGE_0, msg);
203
204 return 0;
205}
206
207static int tonga_send_msg_to_smc_with_parameter(struct amdgpu_device *adev,
208 PPSMC_Msg msg,
209 uint32_t parameter)
210{
211 if (!tonga_is_smc_ram_running(adev))
212 return -EINVAL;
213
214 if (wait_smu_response(adev)) {
215 DRM_ERROR("Failed to send previous message\n");
216 return -EINVAL;
217 }
218
219 WREG32(mmSMC_MSG_ARG_0, parameter);
220
221 return tonga_send_msg_to_smc(adev, msg);
222}
223
224static int tonga_send_msg_to_smc_with_parameter_without_waiting(
225 struct amdgpu_device *adev,
226 PPSMC_Msg msg, uint32_t parameter)
227{
228 if (wait_smu_response(adev)) {
229 DRM_ERROR("Failed to send previous message\n");
230 return -EINVAL;
231 }
232
233 WREG32(mmSMC_MSG_ARG_0, parameter);
234
235 return tonga_send_msg_to_smc_without_waiting(adev, msg);
236}
237
238#if 0 /* not used yet */
239static int tonga_wait_for_smc_inactive(struct amdgpu_device *adev)
240{
241 int i;
242 uint32_t val;
243
244 if (!tonga_is_smc_ram_running(adev))
245 return -EINVAL;
246
247 for (i = 0; i < adev->usec_timeout; i++) {
248 val = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
249 if (REG_GET_FIELD(val, SMC_SYSCON_CLOCK_CNTL_0, cken) == 0)
250 break;
251 udelay(1);
252 }
253
254 if (i == adev->usec_timeout)
255 return -EINVAL;
256
257 return 0;
258}
259#endif
260
261static int tonga_smu_upload_firmware_image(struct amdgpu_device *adev)
262{
263 const struct smc_firmware_header_v1_0 *hdr;
264 uint32_t ucode_size;
265 uint32_t ucode_start_address;
266 const uint8_t *src;
267 uint32_t val;
268 uint32_t byte_count;
269 uint32_t *data;
270 unsigned long flags;
271
272 if (!adev->pm.fw)
273 return -EINVAL;
274
275 /* Skip SMC ucode loading on SR-IOV capable boards.
276 * vbios does this for us in asic_init in that case.
277 */
278 if (adev->virtualization.supports_sr_iov)
279 return 0;
280
281 hdr = (const struct smc_firmware_header_v1_0 *)adev->pm.fw->data;
282 amdgpu_ucode_print_smc_hdr(&hdr->header);
283
284 adev->pm.fw_version = le32_to_cpu(hdr->header.ucode_version);
285 ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes);
286 ucode_start_address = le32_to_cpu(hdr->ucode_start_addr);
287 src = (const uint8_t *)
288 (adev->pm.fw->data + le32_to_cpu(hdr->header.ucode_array_offset_bytes));
289
290 if (ucode_size & 3) {
291 DRM_ERROR("SMC ucode is not 4 bytes aligned\n");
292 return -EINVAL;
293 }
294
295 if (ucode_size > TONGA_SMC_SIZE) {
296 DRM_ERROR("SMC address is beyond the SMC RAM area\n");
297 return -EINVAL;
298 }
299
300 spin_lock_irqsave(&adev->smc_idx_lock, flags);
301 WREG32(mmSMC_IND_INDEX_0, ucode_start_address);
302
303 val = RREG32(mmSMC_IND_ACCESS_CNTL);
304 val = REG_SET_FIELD(val, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, 1);
305 WREG32(mmSMC_IND_ACCESS_CNTL, val);
306
307 byte_count = ucode_size;
308 data = (uint32_t *)src;
309 for (; byte_count >= 4; data++, byte_count -= 4)
310 WREG32(mmSMC_IND_DATA_0, data[0]);
311
312 val = RREG32(mmSMC_IND_ACCESS_CNTL);
313 val = REG_SET_FIELD(val, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, 0);
314 WREG32(mmSMC_IND_ACCESS_CNTL, val);
315 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
316
317 return 0;
318}
319
320#if 0 /* not used yet */
321static int tonga_read_smc_sram_dword(struct amdgpu_device *adev,
322 uint32_t smc_address,
323 uint32_t *value,
324 uint32_t limit)
325{
326 int result;
327 unsigned long flags;
328
329 spin_lock_irqsave(&adev->smc_idx_lock, flags);
330 result = tonga_set_smc_sram_address(adev, smc_address, limit);
331 if (result == 0)
332 *value = RREG32(mmSMC_IND_DATA_0);
333 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
334 return result;
335}
336
337static int tonga_write_smc_sram_dword(struct amdgpu_device *adev,
338 uint32_t smc_address,
339 uint32_t value,
340 uint32_t limit)
341{
342 int result;
343 unsigned long flags;
344
345 spin_lock_irqsave(&adev->smc_idx_lock, flags);
346 result = tonga_set_smc_sram_address(adev, smc_address, limit);
347 if (result == 0)
348 WREG32(mmSMC_IND_DATA_0, value);
349 spin_unlock_irqrestore(&adev->smc_idx_lock, flags);
350 return result;
351}
352
353static int tonga_smu_stop_smc(struct amdgpu_device *adev)
354{
355 uint32_t val = RREG32_SMC(ixSMC_SYSCON_RESET_CNTL);
356 val = REG_SET_FIELD(val, SMC_SYSCON_RESET_CNTL, rst_reg, 1);
357 WREG32_SMC(ixSMC_SYSCON_RESET_CNTL, val);
358
359 val = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
360 val = REG_SET_FIELD(val, SMC_SYSCON_CLOCK_CNTL_0, ck_disable, 1);
361 WREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0, val);
362
363 return 0;
364}
365#endif
366
367static enum AMDGPU_UCODE_ID tonga_convert_fw_type(uint32_t fw_type)
368{
369 switch (fw_type) {
370 case UCODE_ID_SDMA0:
371 return AMDGPU_UCODE_ID_SDMA0;
372 case UCODE_ID_SDMA1:
373 return AMDGPU_UCODE_ID_SDMA1;
374 case UCODE_ID_CP_CE:
375 return AMDGPU_UCODE_ID_CP_CE;
376 case UCODE_ID_CP_PFP:
377 return AMDGPU_UCODE_ID_CP_PFP;
378 case UCODE_ID_CP_ME:
379 return AMDGPU_UCODE_ID_CP_ME;
380 case UCODE_ID_CP_MEC:
381 case UCODE_ID_CP_MEC_JT1:
382 return AMDGPU_UCODE_ID_CP_MEC1;
383 case UCODE_ID_CP_MEC_JT2:
384 return AMDGPU_UCODE_ID_CP_MEC2;
385 case UCODE_ID_RLC_G:
386 return AMDGPU_UCODE_ID_RLC_G;
387 default:
388 DRM_ERROR("ucode type is out of range!\n");
389 return AMDGPU_UCODE_ID_MAXIMUM;
390 }
391}
392
393static int tonga_smu_populate_single_firmware_entry(struct amdgpu_device *adev,
394 uint32_t fw_type,
395 struct SMU_Entry *entry)
396{
397 enum AMDGPU_UCODE_ID id = tonga_convert_fw_type(fw_type);
398 struct amdgpu_firmware_info *ucode = &adev->firmware.ucode[id];
399 const struct gfx_firmware_header_v1_0 *header = NULL;
400 uint64_t gpu_addr;
401 uint32_t data_size;
402
403 if (ucode->fw == NULL)
404 return -EINVAL;
405
406 gpu_addr = ucode->mc_addr;
407 header = (const struct gfx_firmware_header_v1_0 *)ucode->fw->data;
408 data_size = le32_to_cpu(header->header.ucode_size_bytes);
409
410 if ((fw_type == UCODE_ID_CP_MEC_JT1) ||
411 (fw_type == UCODE_ID_CP_MEC_JT2)) {
412 gpu_addr += le32_to_cpu(header->jt_offset) << 2;
413 data_size = le32_to_cpu(header->jt_size) << 2;
414 }
415
416 entry->version = (uint16_t)le32_to_cpu(header->header.ucode_version);
417 entry->id = (uint16_t)fw_type;
418 entry->image_addr_high = upper_32_bits(gpu_addr);
419 entry->image_addr_low = lower_32_bits(gpu_addr);
420 entry->meta_data_addr_high = 0;
421 entry->meta_data_addr_low = 0;
422 entry->data_size_byte = data_size;
423 entry->num_register_entries = 0;
424
425 if (fw_type == UCODE_ID_RLC_G)
426 entry->flags = 1;
427 else
428 entry->flags = 0;
429
430 return 0;
431}
432
433static int tonga_smu_request_load_fw(struct amdgpu_device *adev)
434{
435 struct tonga_smu_private_data *private = (struct tonga_smu_private_data *)adev->smu.priv;
436 struct SMU_DRAMData_TOC *toc;
437 uint32_t fw_to_load;
438
439 WREG32_SMC(ixSOFT_REGISTERS_TABLE_28, 0);
440
441 tonga_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_SMU_DRAM_ADDR_HI, private->smu_buffer_addr_high);
442 tonga_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_SMU_DRAM_ADDR_LO, private->smu_buffer_addr_low);
443
444 toc = (struct SMU_DRAMData_TOC *)private->header;
445 toc->num_entries = 0;
446 toc->structure_version = 1;
447
448 if (!adev->firmware.smu_load)
449 return 0;
450
451 if (tonga_smu_populate_single_firmware_entry(adev, UCODE_ID_RLC_G,
452 &toc->entry[toc->num_entries++])) {
453 DRM_ERROR("Failed to get firmware entry for RLC\n");
454 return -EINVAL;
455 }
456
457 if (tonga_smu_populate_single_firmware_entry(adev, UCODE_ID_CP_CE,
458 &toc->entry[toc->num_entries++])) {
459 DRM_ERROR("Failed to get firmware entry for CE\n");
460 return -EINVAL;
461 }
462
463 if (tonga_smu_populate_single_firmware_entry(adev, UCODE_ID_CP_PFP,
464 &toc->entry[toc->num_entries++])) {
465 DRM_ERROR("Failed to get firmware entry for PFP\n");
466 return -EINVAL;
467 }
468
469 if (tonga_smu_populate_single_firmware_entry(adev, UCODE_ID_CP_ME,
470 &toc->entry[toc->num_entries++])) {
471 DRM_ERROR("Failed to get firmware entry for ME\n");
472 return -EINVAL;
473 }
474
475 if (tonga_smu_populate_single_firmware_entry(adev, UCODE_ID_CP_MEC,
476 &toc->entry[toc->num_entries++])) {
477 DRM_ERROR("Failed to get firmware entry for MEC\n");
478 return -EINVAL;
479 }
480
481 if (tonga_smu_populate_single_firmware_entry(adev, UCODE_ID_CP_MEC_JT1,
482 &toc->entry[toc->num_entries++])) {
483 DRM_ERROR("Failed to get firmware entry for MEC_JT1\n");
484 return -EINVAL;
485 }
486
487 if (tonga_smu_populate_single_firmware_entry(adev, UCODE_ID_CP_MEC_JT2,
488 &toc->entry[toc->num_entries++])) {
489 DRM_ERROR("Failed to get firmware entry for MEC_JT2\n");
490 return -EINVAL;
491 }
492
493 if (tonga_smu_populate_single_firmware_entry(adev, UCODE_ID_SDMA0,
494 &toc->entry[toc->num_entries++])) {
495 DRM_ERROR("Failed to get firmware entry for SDMA0\n");
496 return -EINVAL;
497 }
498
499 if (tonga_smu_populate_single_firmware_entry(adev, UCODE_ID_SDMA1,
500 &toc->entry[toc->num_entries++])) {
501 DRM_ERROR("Failed to get firmware entry for SDMA1\n");
502 return -EINVAL;
503 }
504
505 tonga_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_DRV_DRAM_ADDR_HI, private->header_addr_high);
506 tonga_send_msg_to_smc_with_parameter(adev, PPSMC_MSG_DRV_DRAM_ADDR_LO, private->header_addr_low);
507
508 fw_to_load = UCODE_ID_RLC_G_MASK |
509 UCODE_ID_SDMA0_MASK |
510 UCODE_ID_SDMA1_MASK |
511 UCODE_ID_CP_CE_MASK |
512 UCODE_ID_CP_ME_MASK |
513 UCODE_ID_CP_PFP_MASK |
514 UCODE_ID_CP_MEC_MASK;
515
516 if (tonga_send_msg_to_smc_with_parameter_without_waiting(adev, PPSMC_MSG_LoadUcodes, fw_to_load)) {
517 DRM_ERROR("Fail to request SMU load ucode\n");
518 return -EINVAL;
519 }
520
521 return 0;
522}
523
524static uint32_t tonga_smu_get_mask_for_fw_type(uint32_t fw_type)
525{
526 switch (fw_type) {
527 case AMDGPU_UCODE_ID_SDMA0:
528 return UCODE_ID_SDMA0_MASK;
529 case AMDGPU_UCODE_ID_SDMA1:
530 return UCODE_ID_SDMA1_MASK;
531 case AMDGPU_UCODE_ID_CP_CE:
532 return UCODE_ID_CP_CE_MASK;
533 case AMDGPU_UCODE_ID_CP_PFP:
534 return UCODE_ID_CP_PFP_MASK;
535 case AMDGPU_UCODE_ID_CP_ME:
536 return UCODE_ID_CP_ME_MASK;
537 case AMDGPU_UCODE_ID_CP_MEC1:
538 return UCODE_ID_CP_MEC_MASK;
539 case AMDGPU_UCODE_ID_CP_MEC2:
540 return UCODE_ID_CP_MEC_MASK;
541 case AMDGPU_UCODE_ID_RLC_G:
542 return UCODE_ID_RLC_G_MASK;
543 default:
544 DRM_ERROR("ucode type is out of range!\n");
545 return 0;
546 }
547}
548
549static int tonga_smu_check_fw_load_finish(struct amdgpu_device *adev,
550 uint32_t fw_type)
551{
552 uint32_t fw_mask = tonga_smu_get_mask_for_fw_type(fw_type);
553 int i;
554
555 for (i = 0; i < adev->usec_timeout; i++) {
556 if (fw_mask == (RREG32_SMC(ixSOFT_REGISTERS_TABLE_28) & fw_mask))
557 break;
558 udelay(1);
559 }
560
561 if (i == adev->usec_timeout) {
562 DRM_ERROR("check firmware loading failed\n");
563 return -EINVAL;
564 }
565
566 return 0;
567}
568
569static int tonga_smu_start_in_protection_mode(struct amdgpu_device *adev)
570{
571 int result;
572 uint32_t val;
573 int i;
574
575 /* Assert reset */
576 val = RREG32_SMC(ixSMC_SYSCON_RESET_CNTL);
577 val = REG_SET_FIELD(val, SMC_SYSCON_RESET_CNTL, rst_reg, 1);
578 WREG32_SMC(ixSMC_SYSCON_RESET_CNTL, val);
579
580 result = tonga_smu_upload_firmware_image(adev);
581 if (result)
582 return result;
583
584 /* Clear status */
585 WREG32_SMC(ixSMU_STATUS, 0);
586
587 /* Enable clock */
588 val = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
589 val = REG_SET_FIELD(val, SMC_SYSCON_CLOCK_CNTL_0, ck_disable, 0);
590 WREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0, val);
591
592 /* De-assert reset */
593 val = RREG32_SMC(ixSMC_SYSCON_RESET_CNTL);
594 val = REG_SET_FIELD(val, SMC_SYSCON_RESET_CNTL, rst_reg, 0);
595 WREG32_SMC(ixSMC_SYSCON_RESET_CNTL, val);
596
597 /* Set SMU Auto Start */
598 val = RREG32_SMC(ixSMU_INPUT_DATA);
599 val = REG_SET_FIELD(val, SMU_INPUT_DATA, AUTO_START, 1);
600 WREG32_SMC(ixSMU_INPUT_DATA, val);
601
602 /* Clear firmware interrupt enable flag */
603 WREG32_SMC(ixFIRMWARE_FLAGS, 0);
604
605 for (i = 0; i < adev->usec_timeout; i++) {
606 val = RREG32_SMC(ixRCU_UC_EVENTS);
607 if (REG_GET_FIELD(val, RCU_UC_EVENTS, INTERRUPTS_ENABLED))
608 break;
609 udelay(1);
610 }
611
612 if (i == adev->usec_timeout) {
613 DRM_ERROR("Interrupt is not enabled by firmware\n");
614 return -EINVAL;
615 }
616
617 /* Call Test SMU message with 0x20000 offset
618 * to trigger SMU start
619 */
620 tonga_send_msg_to_smc_offset(adev);
621
622 /* Wait for done bit to be set */
623 for (i = 0; i < adev->usec_timeout; i++) {
624 val = RREG32_SMC(ixSMU_STATUS);
625 if (REG_GET_FIELD(val, SMU_STATUS, SMU_DONE))
626 break;
627 udelay(1);
628 }
629
630 if (i == adev->usec_timeout) {
631 DRM_ERROR("Timeout for SMU start\n");
632 return -EINVAL;
633 }
634
635 /* Check pass/failed indicator */
636 val = RREG32_SMC(ixSMU_STATUS);
637 if (!REG_GET_FIELD(val, SMU_STATUS, SMU_PASS)) {
638 DRM_ERROR("SMU Firmware start failed\n");
639 return -EINVAL;
640 }
641
642 /* Wait for firmware to initialize */
643 for (i = 0; i < adev->usec_timeout; i++) {
644 val = RREG32_SMC(ixFIRMWARE_FLAGS);
645 if(REG_GET_FIELD(val, FIRMWARE_FLAGS, INTERRUPTS_ENABLED))
646 break;
647 udelay(1);
648 }
649
650 if (i == adev->usec_timeout) {
651 DRM_ERROR("SMU firmware initialization failed\n");
652 return -EINVAL;
653 }
654
655 return 0;
656}
657
658static int tonga_smu_start_in_non_protection_mode(struct amdgpu_device *adev)
659{
660 int i, result;
661 uint32_t val;
662
663 /* wait for smc boot up */
664 for (i = 0; i < adev->usec_timeout; i++) {
665 val = RREG32_SMC(ixRCU_UC_EVENTS);
666 val = REG_GET_FIELD(val, RCU_UC_EVENTS, boot_seq_done);
667 if (val)
668 break;
669 udelay(1);
670 }
671
672 if (i == adev->usec_timeout) {
673 DRM_ERROR("SMC boot sequence is not completed\n");
674 return -EINVAL;
675 }
676
677 /* Clear firmware interrupt enable flag */
678 WREG32_SMC(ixFIRMWARE_FLAGS, 0);
679
680 /* Assert reset */
681 val = RREG32_SMC(ixSMC_SYSCON_RESET_CNTL);
682 val = REG_SET_FIELD(val, SMC_SYSCON_RESET_CNTL, rst_reg, 1);
683 WREG32_SMC(ixSMC_SYSCON_RESET_CNTL, val);
684
685 result = tonga_smu_upload_firmware_image(adev);
686 if (result)
687 return result;
688
689 /* Set smc instruct start point at 0x0 */
690 tonga_program_jump_on_start(adev);
691
692 /* Enable clock */
693 val = RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0);
694 val = REG_SET_FIELD(val, SMC_SYSCON_CLOCK_CNTL_0, ck_disable, 0);
695 WREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0, val);
696
697 /* De-assert reset */
698 val = RREG32_SMC(ixSMC_SYSCON_RESET_CNTL);
699 val = REG_SET_FIELD(val, SMC_SYSCON_RESET_CNTL, rst_reg, 0);
700 WREG32_SMC(ixSMC_SYSCON_RESET_CNTL, val);
701
702 /* Wait for firmware to initialize */
703 for (i = 0; i < adev->usec_timeout; i++) {
704 val = RREG32_SMC(ixFIRMWARE_FLAGS);
705 if (REG_GET_FIELD(val, FIRMWARE_FLAGS, INTERRUPTS_ENABLED))
706 break;
707 udelay(1);
708 }
709
710 if (i == adev->usec_timeout) {
711 DRM_ERROR("Timeout for SMC firmware initialization\n");
712 return -EINVAL;
713 }
714
715 return 0;
716}
717
718int tonga_smu_start(struct amdgpu_device *adev)
719{
720 int result;
721 uint32_t val;
722
723 if (!tonga_is_smc_ram_running(adev)) {
724 val = RREG32_SMC(ixSMU_FIRMWARE);
725 if (!REG_GET_FIELD(val, SMU_FIRMWARE, SMU_MODE)) {
726 result = tonga_smu_start_in_non_protection_mode(adev);
727 if (result)
728 return result;
729 } else {
730 result = tonga_smu_start_in_protection_mode(adev);
731 if (result)
732 return result;
733 }
734 }
735
736 return tonga_smu_request_load_fw(adev);
737}
738
739static const struct amdgpu_smumgr_funcs tonga_smumgr_funcs = {
740 .check_fw_load_finish = tonga_smu_check_fw_load_finish,
741 .request_smu_load_fw = NULL,
742 .request_smu_specific_fw = NULL,
743};
744
745int tonga_smu_init(struct amdgpu_device *adev)
746{
747 struct tonga_smu_private_data *private;
748 uint32_t image_size = ((sizeof(struct SMU_DRAMData_TOC) / 4096) + 1) * 4096;
749 uint32_t smu_internal_buffer_size = 200*4096;
750 struct amdgpu_bo **toc_buf = &adev->smu.toc_buf;
751 struct amdgpu_bo **smu_buf = &adev->smu.smu_buf;
752 uint64_t mc_addr;
753 void *toc_buf_ptr;
754 void *smu_buf_ptr;
755 int ret;
756
757 private = kzalloc(sizeof(struct tonga_smu_private_data), GFP_KERNEL);
758 if (NULL == private)
759 return -ENOMEM;
760
761 /* allocate firmware buffers */
762 if (adev->firmware.smu_load)
763 amdgpu_ucode_init_bo(adev);
764
765 adev->smu.priv = private;
766 adev->smu.fw_flags = 0;
767
768 /* Allocate FW image data structure and header buffer */
769 ret = amdgpu_bo_create(adev, image_size, PAGE_SIZE,
770 true, AMDGPU_GEM_DOMAIN_VRAM,
771 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
772 NULL, NULL, toc_buf);
773 if (ret) {
774 DRM_ERROR("Failed to allocate memory for TOC buffer\n");
775 return -ENOMEM;
776 }
777
778 /* Allocate buffer for SMU internal buffer */
779 ret = amdgpu_bo_create(adev, smu_internal_buffer_size, PAGE_SIZE,
780 true, AMDGPU_GEM_DOMAIN_VRAM,
781 AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
782 NULL, NULL, smu_buf);
783 if (ret) {
784 DRM_ERROR("Failed to allocate memory for SMU internal buffer\n");
785 return -ENOMEM;
786 }
787
788 /* Retrieve GPU address for header buffer and internal buffer */
789 ret = amdgpu_bo_reserve(adev->smu.toc_buf, false);
790 if (ret) {
791 amdgpu_bo_unref(&adev->smu.toc_buf);
792 DRM_ERROR("Failed to reserve the TOC buffer\n");
793 return -EINVAL;
794 }
795
796 ret = amdgpu_bo_pin(adev->smu.toc_buf, AMDGPU_GEM_DOMAIN_VRAM, &mc_addr);
797 if (ret) {
798 amdgpu_bo_unreserve(adev->smu.toc_buf);
799 amdgpu_bo_unref(&adev->smu.toc_buf);
800 DRM_ERROR("Failed to pin the TOC buffer\n");
801 return -EINVAL;
802 }
803
804 ret = amdgpu_bo_kmap(*toc_buf, &toc_buf_ptr);
805 if (ret) {
806 amdgpu_bo_unreserve(adev->smu.toc_buf);
807 amdgpu_bo_unref(&adev->smu.toc_buf);
808 DRM_ERROR("Failed to map the TOC buffer\n");
809 return -EINVAL;
810 }
811
812 amdgpu_bo_unreserve(adev->smu.toc_buf);
813 private->header_addr_low = lower_32_bits(mc_addr);
814 private->header_addr_high = upper_32_bits(mc_addr);
815 private->header = toc_buf_ptr;
816
817 ret = amdgpu_bo_reserve(adev->smu.smu_buf, false);
818 if (ret) {
819 amdgpu_bo_unref(&adev->smu.smu_buf);
820 amdgpu_bo_unref(&adev->smu.toc_buf);
821 DRM_ERROR("Failed to reserve the SMU internal buffer\n");
822 return -EINVAL;
823 }
824
825 ret = amdgpu_bo_pin(adev->smu.smu_buf, AMDGPU_GEM_DOMAIN_VRAM, &mc_addr);
826 if (ret) {
827 amdgpu_bo_unreserve(adev->smu.smu_buf);
828 amdgpu_bo_unref(&adev->smu.smu_buf);
829 amdgpu_bo_unref(&adev->smu.toc_buf);
830 DRM_ERROR("Failed to pin the SMU internal buffer\n");
831 return -EINVAL;
832 }
833
834 ret = amdgpu_bo_kmap(*smu_buf, &smu_buf_ptr);
835 if (ret) {
836 amdgpu_bo_unreserve(adev->smu.smu_buf);
837 amdgpu_bo_unref(&adev->smu.smu_buf);
838 amdgpu_bo_unref(&adev->smu.toc_buf);
839 DRM_ERROR("Failed to map the SMU internal buffer\n");
840 return -EINVAL;
841 }
842
843 amdgpu_bo_unreserve(adev->smu.smu_buf);
844 private->smu_buffer_addr_low = lower_32_bits(mc_addr);
845 private->smu_buffer_addr_high = upper_32_bits(mc_addr);
846
847 adev->smu.smumgr_funcs = &tonga_smumgr_funcs;
848
849 return 0;
850}
851
852int tonga_smu_fini(struct amdgpu_device *adev)
853{
854 amdgpu_bo_unref(&adev->smu.toc_buf);
855 amdgpu_bo_unref(&adev->smu.smu_buf);
856 kfree(adev->smu.priv);
857 adev->smu.priv = NULL;
858 if (adev->firmware.fw_buf)
859 amdgpu_ucode_fini_bo(adev);
860
861 return 0;
862}
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
index 132e613ed674..f6c941550b8f 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
@@ -116,7 +116,7 @@ static int uvd_v4_2_sw_init(void *handle)
116 116
117 ring = &adev->uvd.ring; 117 ring = &adev->uvd.ring;
118 sprintf(ring->name, "uvd"); 118 sprintf(ring->name, "uvd");
119 r = amdgpu_ring_init(adev, ring, 512, CP_PACKET2, 0xf, 119 r = amdgpu_ring_init(adev, ring, 512, PACKET0(mmUVD_NO_OP, 0), 0xf,
120 &adev->uvd.irq, 0, AMDGPU_RING_TYPE_UVD); 120 &adev->uvd.irq, 0, AMDGPU_RING_TYPE_UVD);
121 121
122 return r; 122 return r;
@@ -526,6 +526,20 @@ static void uvd_v4_2_ring_emit_ib(struct amdgpu_ring *ring,
526 amdgpu_ring_write(ring, ib->length_dw); 526 amdgpu_ring_write(ring, ib->length_dw);
527} 527}
528 528
529static unsigned uvd_v4_2_ring_get_emit_ib_size(struct amdgpu_ring *ring)
530{
531 return
532 4; /* uvd_v4_2_ring_emit_ib */
533}
534
535static unsigned uvd_v4_2_ring_get_dma_frame_size(struct amdgpu_ring *ring)
536{
537 return
538 2 + /* uvd_v4_2_ring_emit_hdp_flush */
539 2 + /* uvd_v4_2_ring_emit_hdp_invalidate */
540 14; /* uvd_v4_2_ring_emit_fence x1 no user fence */
541}
542
529/** 543/**
530 * uvd_v4_2_mc_resume - memory controller programming 544 * uvd_v4_2_mc_resume - memory controller programming
531 * 545 *
@@ -756,6 +770,8 @@ static const struct amdgpu_ring_funcs uvd_v4_2_ring_funcs = {
756 .pad_ib = amdgpu_ring_generic_pad_ib, 770 .pad_ib = amdgpu_ring_generic_pad_ib,
757 .begin_use = amdgpu_uvd_ring_begin_use, 771 .begin_use = amdgpu_uvd_ring_begin_use,
758 .end_use = amdgpu_uvd_ring_end_use, 772 .end_use = amdgpu_uvd_ring_end_use,
773 .get_emit_ib_size = uvd_v4_2_ring_get_emit_ib_size,
774 .get_dma_frame_size = uvd_v4_2_ring_get_dma_frame_size,
759}; 775};
760 776
761static void uvd_v4_2_set_ring_funcs(struct amdgpu_device *adev) 777static void uvd_v4_2_set_ring_funcs(struct amdgpu_device *adev)
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
index 101de136ba63..400c16fe579e 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
@@ -112,7 +112,7 @@ static int uvd_v5_0_sw_init(void *handle)
112 112
113 ring = &adev->uvd.ring; 113 ring = &adev->uvd.ring;
114 sprintf(ring->name, "uvd"); 114 sprintf(ring->name, "uvd");
115 r = amdgpu_ring_init(adev, ring, 512, CP_PACKET2, 0xf, 115 r = amdgpu_ring_init(adev, ring, 512, PACKET0(mmUVD_NO_OP, 0), 0xf,
116 &adev->uvd.irq, 0, AMDGPU_RING_TYPE_UVD); 116 &adev->uvd.irq, 0, AMDGPU_RING_TYPE_UVD);
117 117
118 return r; 118 return r;
@@ -577,6 +577,20 @@ static void uvd_v5_0_ring_emit_ib(struct amdgpu_ring *ring,
577 amdgpu_ring_write(ring, ib->length_dw); 577 amdgpu_ring_write(ring, ib->length_dw);
578} 578}
579 579
580static unsigned uvd_v5_0_ring_get_emit_ib_size(struct amdgpu_ring *ring)
581{
582 return
583 6; /* uvd_v5_0_ring_emit_ib */
584}
585
586static unsigned uvd_v5_0_ring_get_dma_frame_size(struct amdgpu_ring *ring)
587{
588 return
589 2 + /* uvd_v5_0_ring_emit_hdp_flush */
590 2 + /* uvd_v5_0_ring_emit_hdp_invalidate */
591 14; /* uvd_v5_0_ring_emit_fence x1 no user fence */
592}
593
580static bool uvd_v5_0_is_idle(void *handle) 594static bool uvd_v5_0_is_idle(void *handle)
581{ 595{
582 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 596 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
@@ -807,6 +821,8 @@ static const struct amdgpu_ring_funcs uvd_v5_0_ring_funcs = {
807 .pad_ib = amdgpu_ring_generic_pad_ib, 821 .pad_ib = amdgpu_ring_generic_pad_ib,
808 .begin_use = amdgpu_uvd_ring_begin_use, 822 .begin_use = amdgpu_uvd_ring_begin_use,
809 .end_use = amdgpu_uvd_ring_end_use, 823 .end_use = amdgpu_uvd_ring_end_use,
824 .get_emit_ib_size = uvd_v5_0_ring_get_emit_ib_size,
825 .get_dma_frame_size = uvd_v5_0_ring_get_dma_frame_size,
810}; 826};
811 827
812static void uvd_v5_0_set_ring_funcs(struct amdgpu_device *adev) 828static void uvd_v5_0_set_ring_funcs(struct amdgpu_device *adev)
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
index 7f21102bfb99..e0fd9f21ed95 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
@@ -116,7 +116,7 @@ static int uvd_v6_0_sw_init(void *handle)
116 116
117 ring = &adev->uvd.ring; 117 ring = &adev->uvd.ring;
118 sprintf(ring->name, "uvd"); 118 sprintf(ring->name, "uvd");
119 r = amdgpu_ring_init(adev, ring, 512, CP_PACKET2, 0xf, 119 r = amdgpu_ring_init(adev, ring, 512, PACKET0(mmUVD_NO_OP, 0), 0xf,
120 &adev->uvd.irq, 0, AMDGPU_RING_TYPE_UVD); 120 &adev->uvd.irq, 0, AMDGPU_RING_TYPE_UVD);
121 121
122 return r; 122 return r;
@@ -396,21 +396,14 @@ static int uvd_v6_0_start(struct amdgpu_device *adev)
396 396
397 uvd_v6_0_mc_resume(adev); 397 uvd_v6_0_mc_resume(adev);
398 398
399 /* Set dynamic clock gating in S/W control mode */ 399 /* disable clock gating */
400 if (adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG) { 400 WREG32_FIELD(UVD_CGC_CTRL, DYN_CLOCK_MODE, 0);
401 uvd_v6_0_set_sw_clock_gating(adev);
402 } else {
403 /* disable clock gating */
404 uint32_t data = RREG32(mmUVD_CGC_CTRL);
405 data &= ~UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK;
406 WREG32(mmUVD_CGC_CTRL, data);
407 }
408 401
409 /* disable interupt */ 402 /* disable interupt */
410 WREG32_P(mmUVD_MASTINT_EN, 0, ~UVD_MASTINT_EN__VCPU_EN_MASK); 403 WREG32_FIELD(UVD_MASTINT_EN, VCPU_EN, 0);
411 404
412 /* stall UMC and register bus before resetting VCPU */ 405 /* stall UMC and register bus before resetting VCPU */
413 WREG32_P(mmUVD_LMI_CTRL2, UVD_LMI_CTRL2__STALL_ARB_UMC_MASK, ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK); 406 WREG32_FIELD(UVD_LMI_CTRL2, STALL_ARB_UMC, 1);
414 mdelay(1); 407 mdelay(1);
415 408
416 /* put LMI, VCPU, RBC etc... into reset */ 409 /* put LMI, VCPU, RBC etc... into reset */
@@ -426,7 +419,7 @@ static int uvd_v6_0_start(struct amdgpu_device *adev)
426 mdelay(5); 419 mdelay(5);
427 420
428 /* take UVD block out of reset */ 421 /* take UVD block out of reset */
429 WREG32_P(mmSRBM_SOFT_RESET, 0, ~SRBM_SOFT_RESET__SOFT_RESET_UVD_MASK); 422 WREG32_FIELD(SRBM_SOFT_RESET, SOFT_RESET_UVD, 0);
430 mdelay(5); 423 mdelay(5);
431 424
432 /* initialize UVD memory controller */ 425 /* initialize UVD memory controller */
@@ -461,7 +454,7 @@ static int uvd_v6_0_start(struct amdgpu_device *adev)
461 WREG32(mmUVD_VCPU_CNTL, UVD_VCPU_CNTL__CLK_EN_MASK); 454 WREG32(mmUVD_VCPU_CNTL, UVD_VCPU_CNTL__CLK_EN_MASK);
462 455
463 /* enable UMC */ 456 /* enable UMC */
464 WREG32_P(mmUVD_LMI_CTRL2, 0, ~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK); 457 WREG32_FIELD(UVD_LMI_CTRL2, STALL_ARB_UMC, 0);
465 458
466 /* boot up the VCPU */ 459 /* boot up the VCPU */
467 WREG32(mmUVD_SOFT_RESET, 0); 460 WREG32(mmUVD_SOFT_RESET, 0);
@@ -481,11 +474,9 @@ static int uvd_v6_0_start(struct amdgpu_device *adev)
481 break; 474 break;
482 475
483 DRM_ERROR("UVD not responding, trying to reset the VCPU!!!\n"); 476 DRM_ERROR("UVD not responding, trying to reset the VCPU!!!\n");
484 WREG32_P(mmUVD_SOFT_RESET, UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK, 477 WREG32_FIELD(UVD_SOFT_RESET, VCPU_SOFT_RESET, 1);
485 ~UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK);
486 mdelay(10); 478 mdelay(10);
487 WREG32_P(mmUVD_SOFT_RESET, 0, 479 WREG32_FIELD(UVD_SOFT_RESET, VCPU_SOFT_RESET, 0);
488 ~UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK);
489 mdelay(10); 480 mdelay(10);
490 r = -1; 481 r = -1;
491 } 482 }
@@ -502,15 +493,14 @@ static int uvd_v6_0_start(struct amdgpu_device *adev)
502 /* clear the bit 4 of UVD_STATUS */ 493 /* clear the bit 4 of UVD_STATUS */
503 WREG32_P(mmUVD_STATUS, 0, ~(2 << UVD_STATUS__VCPU_REPORT__SHIFT)); 494 WREG32_P(mmUVD_STATUS, 0, ~(2 << UVD_STATUS__VCPU_REPORT__SHIFT));
504 495
496 /* force RBC into idle state */
505 rb_bufsz = order_base_2(ring->ring_size); 497 rb_bufsz = order_base_2(ring->ring_size);
506 tmp = 0; 498 tmp = REG_SET_FIELD(0, UVD_RBC_RB_CNTL, RB_BUFSZ, rb_bufsz);
507 tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_BUFSZ, rb_bufsz);
508 tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_BLKSZ, 1); 499 tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_BLKSZ, 1);
509 tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_FETCH, 1); 500 tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_FETCH, 1);
510 tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_WPTR_POLL_EN, 0); 501 tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_WPTR_POLL_EN, 0);
511 tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_UPDATE, 1); 502 tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_UPDATE, 1);
512 tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1); 503 tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1);
513 /* force RBC into idle state */
514 WREG32(mmUVD_RBC_RB_CNTL, tmp); 504 WREG32(mmUVD_RBC_RB_CNTL, tmp);
515 505
516 /* set the write pointer delay */ 506 /* set the write pointer delay */
@@ -531,7 +521,7 @@ static int uvd_v6_0_start(struct amdgpu_device *adev)
531 ring->wptr = RREG32(mmUVD_RBC_RB_RPTR); 521 ring->wptr = RREG32(mmUVD_RBC_RB_RPTR);
532 WREG32(mmUVD_RBC_RB_WPTR, ring->wptr); 522 WREG32(mmUVD_RBC_RB_WPTR, ring->wptr);
533 523
534 WREG32_P(mmUVD_RBC_RB_CNTL, 0, ~UVD_RBC_RB_CNTL__RB_NO_FETCH_MASK); 524 WREG32_FIELD(UVD_RBC_RB_CNTL, RB_NO_FETCH, 0);
535 525
536 return 0; 526 return 0;
537} 527}
@@ -735,6 +725,31 @@ static void uvd_v6_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
735 amdgpu_ring_write(ring, 0xE); 725 amdgpu_ring_write(ring, 0xE);
736} 726}
737 727
728static unsigned uvd_v6_0_ring_get_emit_ib_size(struct amdgpu_ring *ring)
729{
730 return
731 8; /* uvd_v6_0_ring_emit_ib */
732}
733
734static unsigned uvd_v6_0_ring_get_dma_frame_size(struct amdgpu_ring *ring)
735{
736 return
737 2 + /* uvd_v6_0_ring_emit_hdp_flush */
738 2 + /* uvd_v6_0_ring_emit_hdp_invalidate */
739 10 + /* uvd_v6_0_ring_emit_pipeline_sync */
740 14; /* uvd_v6_0_ring_emit_fence x1 no user fence */
741}
742
743static unsigned uvd_v6_0_ring_get_dma_frame_size_vm(struct amdgpu_ring *ring)
744{
745 return
746 2 + /* uvd_v6_0_ring_emit_hdp_flush */
747 2 + /* uvd_v6_0_ring_emit_hdp_invalidate */
748 10 + /* uvd_v6_0_ring_emit_pipeline_sync */
749 20 + /* uvd_v6_0_ring_emit_vm_flush */
750 14 + 14; /* uvd_v6_0_ring_emit_fence x2 vm fence */
751}
752
738static bool uvd_v6_0_is_idle(void *handle) 753static bool uvd_v6_0_is_idle(void *handle)
739{ 754{
740 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 755 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
@@ -748,20 +763,82 @@ static int uvd_v6_0_wait_for_idle(void *handle)
748 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 763 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
749 764
750 for (i = 0; i < adev->usec_timeout; i++) { 765 for (i = 0; i < adev->usec_timeout; i++) {
751 if (!(RREG32(mmSRBM_STATUS) & SRBM_STATUS__UVD_BUSY_MASK)) 766 if (uvd_v6_0_is_idle(handle))
752 return 0; 767 return 0;
753 } 768 }
754 return -ETIMEDOUT; 769 return -ETIMEDOUT;
755} 770}
756 771
757static int uvd_v6_0_soft_reset(void *handle) 772#define AMDGPU_UVD_STATUS_BUSY_MASK 0xfd
773static int uvd_v6_0_check_soft_reset(void *handle)
758{ 774{
759 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 775 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
776 u32 srbm_soft_reset = 0;
777 u32 tmp = RREG32(mmSRBM_STATUS);
778
779 if (REG_GET_FIELD(tmp, SRBM_STATUS, UVD_RQ_PENDING) ||
780 REG_GET_FIELD(tmp, SRBM_STATUS, UVD_BUSY) ||
781 (RREG32(mmUVD_STATUS) & AMDGPU_UVD_STATUS_BUSY_MASK))
782 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_UVD, 1);
783
784 if (srbm_soft_reset) {
785 adev->ip_block_status[AMD_IP_BLOCK_TYPE_UVD].hang = true;
786 adev->uvd.srbm_soft_reset = srbm_soft_reset;
787 } else {
788 adev->ip_block_status[AMD_IP_BLOCK_TYPE_UVD].hang = false;
789 adev->uvd.srbm_soft_reset = 0;
790 }
791 return 0;
792}
793static int uvd_v6_0_pre_soft_reset(void *handle)
794{
795 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
796
797 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_UVD].hang)
798 return 0;
760 799
761 uvd_v6_0_stop(adev); 800 uvd_v6_0_stop(adev);
801 return 0;
802}
803
804static int uvd_v6_0_soft_reset(void *handle)
805{
806 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
807 u32 srbm_soft_reset;
808
809 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_UVD].hang)
810 return 0;
811 srbm_soft_reset = adev->uvd.srbm_soft_reset;
812
813 if (srbm_soft_reset) {
814 u32 tmp;
815
816 tmp = RREG32(mmSRBM_SOFT_RESET);
817 tmp |= srbm_soft_reset;
818 dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
819 WREG32(mmSRBM_SOFT_RESET, tmp);
820 tmp = RREG32(mmSRBM_SOFT_RESET);
821
822 udelay(50);
823
824 tmp &= ~srbm_soft_reset;
825 WREG32(mmSRBM_SOFT_RESET, tmp);
826 tmp = RREG32(mmSRBM_SOFT_RESET);
827
828 /* Wait a little for things to settle down */
829 udelay(50);
830 }
831
832 return 0;
833}
834
835static int uvd_v6_0_post_soft_reset(void *handle)
836{
837 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
838
839 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_UVD].hang)
840 return 0;
762 841
763 WREG32_P(mmSRBM_SOFT_RESET, SRBM_SOFT_RESET__SOFT_RESET_UVD_MASK,
764 ~SRBM_SOFT_RESET__SOFT_RESET_UVD_MASK);
765 mdelay(5); 842 mdelay(5);
766 843
767 return uvd_v6_0_start(adev); 844 return uvd_v6_0_start(adev);
@@ -902,21 +979,15 @@ static int uvd_v6_0_set_clockgating_state(void *handle,
902 enum amd_clockgating_state state) 979 enum amd_clockgating_state state)
903{ 980{
904 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 981 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
905 bool enable = (state == AMD_CG_STATE_GATE) ? true : false;
906 static int curstate = -1;
907 982
908 if (adev->asic_type == CHIP_FIJI || 983 if (adev->asic_type == CHIP_FIJI ||
909 adev->asic_type == CHIP_POLARIS10) 984 adev->asic_type == CHIP_POLARIS10)
910 uvd_v6_set_bypass_mode(adev, enable); 985 uvd_v6_set_bypass_mode(adev, state == AMD_CG_STATE_GATE ? true : false);
911 986
912 if (!(adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG)) 987 if (!(adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG))
913 return 0; 988 return 0;
914 989
915 if (curstate == state) 990 if (state == AMD_CG_STATE_GATE) {
916 return 0;
917
918 curstate = state;
919 if (enable) {
920 /* disable HW gating and enable Sw gating */ 991 /* disable HW gating and enable Sw gating */
921 uvd_v6_0_set_sw_clock_gating(adev); 992 uvd_v6_0_set_sw_clock_gating(adev);
922 } else { 993 } else {
@@ -946,6 +1017,8 @@ static int uvd_v6_0_set_powergating_state(void *handle,
946 if (!(adev->pg_flags & AMD_PG_SUPPORT_UVD)) 1017 if (!(adev->pg_flags & AMD_PG_SUPPORT_UVD))
947 return 0; 1018 return 0;
948 1019
1020 WREG32(mmUVD_POWER_STATUS, UVD_POWER_STATUS__UVD_PG_EN_MASK);
1021
949 if (state == AMD_PG_STATE_GATE) { 1022 if (state == AMD_PG_STATE_GATE) {
950 uvd_v6_0_stop(adev); 1023 uvd_v6_0_stop(adev);
951 return 0; 1024 return 0;
@@ -966,7 +1039,10 @@ const struct amd_ip_funcs uvd_v6_0_ip_funcs = {
966 .resume = uvd_v6_0_resume, 1039 .resume = uvd_v6_0_resume,
967 .is_idle = uvd_v6_0_is_idle, 1040 .is_idle = uvd_v6_0_is_idle,
968 .wait_for_idle = uvd_v6_0_wait_for_idle, 1041 .wait_for_idle = uvd_v6_0_wait_for_idle,
1042 .check_soft_reset = uvd_v6_0_check_soft_reset,
1043 .pre_soft_reset = uvd_v6_0_pre_soft_reset,
969 .soft_reset = uvd_v6_0_soft_reset, 1044 .soft_reset = uvd_v6_0_soft_reset,
1045 .post_soft_reset = uvd_v6_0_post_soft_reset,
970 .set_clockgating_state = uvd_v6_0_set_clockgating_state, 1046 .set_clockgating_state = uvd_v6_0_set_clockgating_state,
971 .set_powergating_state = uvd_v6_0_set_powergating_state, 1047 .set_powergating_state = uvd_v6_0_set_powergating_state,
972}; 1048};
@@ -986,6 +1062,8 @@ static const struct amdgpu_ring_funcs uvd_v6_0_ring_phys_funcs = {
986 .pad_ib = amdgpu_ring_generic_pad_ib, 1062 .pad_ib = amdgpu_ring_generic_pad_ib,
987 .begin_use = amdgpu_uvd_ring_begin_use, 1063 .begin_use = amdgpu_uvd_ring_begin_use,
988 .end_use = amdgpu_uvd_ring_end_use, 1064 .end_use = amdgpu_uvd_ring_end_use,
1065 .get_emit_ib_size = uvd_v6_0_ring_get_emit_ib_size,
1066 .get_dma_frame_size = uvd_v6_0_ring_get_dma_frame_size,
989}; 1067};
990 1068
991static const struct amdgpu_ring_funcs uvd_v6_0_ring_vm_funcs = { 1069static const struct amdgpu_ring_funcs uvd_v6_0_ring_vm_funcs = {
@@ -1005,6 +1083,8 @@ static const struct amdgpu_ring_funcs uvd_v6_0_ring_vm_funcs = {
1005 .pad_ib = amdgpu_ring_generic_pad_ib, 1083 .pad_ib = amdgpu_ring_generic_pad_ib,
1006 .begin_use = amdgpu_uvd_ring_begin_use, 1084 .begin_use = amdgpu_uvd_ring_begin_use,
1007 .end_use = amdgpu_uvd_ring_end_use, 1085 .end_use = amdgpu_uvd_ring_end_use,
1086 .get_emit_ib_size = uvd_v6_0_ring_get_emit_ib_size,
1087 .get_dma_frame_size = uvd_v6_0_ring_get_dma_frame_size_vm,
1008}; 1088};
1009 1089
1010static void uvd_v6_0_set_ring_funcs(struct amdgpu_device *adev) 1090static void uvd_v6_0_set_ring_funcs(struct amdgpu_device *adev)
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
index 80a37a602181..76e64ad04a53 100644
--- a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
@@ -30,16 +30,17 @@
30#include "amdgpu.h" 30#include "amdgpu.h"
31#include "amdgpu_vce.h" 31#include "amdgpu_vce.h"
32#include "cikd.h" 32#include "cikd.h"
33
34#include "vce/vce_2_0_d.h" 33#include "vce/vce_2_0_d.h"
35#include "vce/vce_2_0_sh_mask.h" 34#include "vce/vce_2_0_sh_mask.h"
36 35#include "smu/smu_7_0_1_d.h"
36#include "smu/smu_7_0_1_sh_mask.h"
37#include "oss/oss_2_0_d.h" 37#include "oss/oss_2_0_d.h"
38#include "oss/oss_2_0_sh_mask.h" 38#include "oss/oss_2_0_sh_mask.h"
39 39
40#define VCE_V2_0_FW_SIZE (256 * 1024) 40#define VCE_V2_0_FW_SIZE (256 * 1024)
41#define VCE_V2_0_STACK_SIZE (64 * 1024) 41#define VCE_V2_0_STACK_SIZE (64 * 1024)
42#define VCE_V2_0_DATA_SIZE (23552 * AMDGPU_MAX_VCE_HANDLES) 42#define VCE_V2_0_DATA_SIZE (23552 * AMDGPU_MAX_VCE_HANDLES)
43#define VCE_STATUS_VCPU_REPORT_FW_LOADED_MASK 0x02
43 44
44static void vce_v2_0_mc_resume(struct amdgpu_device *adev); 45static void vce_v2_0_mc_resume(struct amdgpu_device *adev);
45static void vce_v2_0_set_ring_funcs(struct amdgpu_device *adev); 46static void vce_v2_0_set_ring_funcs(struct amdgpu_device *adev);
@@ -96,6 +97,49 @@ static void vce_v2_0_ring_set_wptr(struct amdgpu_ring *ring)
96 WREG32(mmVCE_RB_WPTR2, ring->wptr); 97 WREG32(mmVCE_RB_WPTR2, ring->wptr);
97} 98}
98 99
100static int vce_v2_0_lmi_clean(struct amdgpu_device *adev)
101{
102 int i, j;
103
104 for (i = 0; i < 10; ++i) {
105 for (j = 0; j < 100; ++j) {
106 uint32_t status = RREG32(mmVCE_LMI_STATUS);
107
108 if (status & 0x337f)
109 return 0;
110 mdelay(10);
111 }
112 }
113
114 return -ETIMEDOUT;
115}
116
117static int vce_v2_0_firmware_loaded(struct amdgpu_device *adev)
118{
119 int i, j;
120
121 for (i = 0; i < 10; ++i) {
122 for (j = 0; j < 100; ++j) {
123 uint32_t status = RREG32(mmVCE_STATUS);
124
125 if (status & VCE_STATUS_VCPU_REPORT_FW_LOADED_MASK)
126 return 0;
127 mdelay(10);
128 }
129
130 DRM_ERROR("VCE not responding, trying to reset the ECPU!!!\n");
131 WREG32_P(mmVCE_SOFT_RESET,
132 VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK,
133 ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
134 mdelay(10);
135 WREG32_P(mmVCE_SOFT_RESET, 0,
136 ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
137 mdelay(10);
138 }
139
140 return -ETIMEDOUT;
141}
142
99/** 143/**
100 * vce_v2_0_start - start VCE block 144 * vce_v2_0_start - start VCE block
101 * 145 *
@@ -106,7 +150,7 @@ static void vce_v2_0_ring_set_wptr(struct amdgpu_ring *ring)
106static int vce_v2_0_start(struct amdgpu_device *adev) 150static int vce_v2_0_start(struct amdgpu_device *adev)
107{ 151{
108 struct amdgpu_ring *ring; 152 struct amdgpu_ring *ring;
109 int i, j, r; 153 int r;
110 154
111 vce_v2_0_mc_resume(adev); 155 vce_v2_0_mc_resume(adev);
112 156
@@ -127,36 +171,12 @@ static int vce_v2_0_start(struct amdgpu_device *adev)
127 WREG32(mmVCE_RB_BASE_HI2, upper_32_bits(ring->gpu_addr)); 171 WREG32(mmVCE_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));
128 WREG32(mmVCE_RB_SIZE2, ring->ring_size / 4); 172 WREG32(mmVCE_RB_SIZE2, ring->ring_size / 4);
129 173
130 WREG32_P(mmVCE_VCPU_CNTL, VCE_VCPU_CNTL__CLK_EN_MASK, ~VCE_VCPU_CNTL__CLK_EN_MASK); 174 WREG32_FIELD(VCE_VCPU_CNTL, CLK_EN, 1);
131 175 WREG32_FIELD(VCE_SOFT_RESET, ECPU_SOFT_RESET, 1);
132 WREG32_P(mmVCE_SOFT_RESET,
133 VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK,
134 ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
135
136 mdelay(100); 176 mdelay(100);
177 WREG32_FIELD(VCE_SOFT_RESET, ECPU_SOFT_RESET, 0);
137 178
138 WREG32_P(mmVCE_SOFT_RESET, 0, ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK); 179 r = vce_v2_0_firmware_loaded(adev);
139
140 for (i = 0; i < 10; ++i) {
141 uint32_t status;
142 for (j = 0; j < 100; ++j) {
143 status = RREG32(mmVCE_STATUS);
144 if (status & 2)
145 break;
146 mdelay(10);
147 }
148 r = 0;
149 if (status & 2)
150 break;
151
152 DRM_ERROR("VCE not responding, trying to reset the ECPU!!!\n");
153 WREG32_P(mmVCE_SOFT_RESET, VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK,
154 ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
155 mdelay(10);
156 WREG32_P(mmVCE_SOFT_RESET, 0, ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
157 mdelay(10);
158 r = -1;
159 }
160 180
161 /* clear BUSY flag */ 181 /* clear BUSY flag */
162 WREG32_P(mmVCE_STATUS, 0, ~1); 182 WREG32_P(mmVCE_STATUS, 0, ~1);
@@ -173,6 +193,8 @@ static int vce_v2_0_early_init(void *handle)
173{ 193{
174 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 194 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
175 195
196 adev->vce.num_rings = 2;
197
176 vce_v2_0_set_ring_funcs(adev); 198 vce_v2_0_set_ring_funcs(adev);
177 vce_v2_0_set_irq_funcs(adev); 199 vce_v2_0_set_irq_funcs(adev);
178 200
@@ -182,7 +204,7 @@ static int vce_v2_0_early_init(void *handle)
182static int vce_v2_0_sw_init(void *handle) 204static int vce_v2_0_sw_init(void *handle)
183{ 205{
184 struct amdgpu_ring *ring; 206 struct amdgpu_ring *ring;
185 int r; 207 int r, i;
186 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 208 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
187 209
188 /* VCE */ 210 /* VCE */
@@ -199,19 +221,14 @@ static int vce_v2_0_sw_init(void *handle)
199 if (r) 221 if (r)
200 return r; 222 return r;
201 223
202 ring = &adev->vce.ring[0]; 224 for (i = 0; i < adev->vce.num_rings; i++) {
203 sprintf(ring->name, "vce0"); 225 ring = &adev->vce.ring[i];
204 r = amdgpu_ring_init(adev, ring, 512, VCE_CMD_NO_OP, 0xf, 226 sprintf(ring->name, "vce%d", i);
205 &adev->vce.irq, 0, AMDGPU_RING_TYPE_VCE); 227 r = amdgpu_ring_init(adev, ring, 512, VCE_CMD_NO_OP, 0xf,
206 if (r) 228 &adev->vce.irq, 0, AMDGPU_RING_TYPE_VCE);
207 return r; 229 if (r)
208 230 return r;
209 ring = &adev->vce.ring[1]; 231 }
210 sprintf(ring->name, "vce1");
211 r = amdgpu_ring_init(adev, ring, 512, VCE_CMD_NO_OP, 0xf,
212 &adev->vce.irq, 0, AMDGPU_RING_TYPE_VCE);
213 if (r)
214 return r;
215 232
216 return r; 233 return r;
217} 234}
@@ -234,29 +251,23 @@ static int vce_v2_0_sw_fini(void *handle)
234 251
235static int vce_v2_0_hw_init(void *handle) 252static int vce_v2_0_hw_init(void *handle)
236{ 253{
237 struct amdgpu_ring *ring; 254 int r, i;
238 int r;
239 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 255 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
240 256
241 r = vce_v2_0_start(adev); 257 r = vce_v2_0_start(adev);
258 /* this error mean vcpu not in running state, so just skip ring test, not stop driver initialize */
242 if (r) 259 if (r)
243/* this error mean vcpu not in running state, so just skip ring test, not stop driver initialize */
244 return 0; 260 return 0;
245 261
246 ring = &adev->vce.ring[0]; 262 for (i = 0; i < adev->vce.num_rings; i++)
247 ring->ready = true; 263 adev->vce.ring[i].ready = false;
248 r = amdgpu_ring_test_ring(ring);
249 if (r) {
250 ring->ready = false;
251 return r;
252 }
253 264
254 ring = &adev->vce.ring[1]; 265 for (i = 0; i < adev->vce.num_rings; i++) {
255 ring->ready = true; 266 r = amdgpu_ring_test_ring(&adev->vce.ring[i]);
256 r = amdgpu_ring_test_ring(ring); 267 if (r)
257 if (r) { 268 return r;
258 ring->ready = false; 269 else
259 return r; 270 adev->vce.ring[i].ready = true;
260 } 271 }
261 272
262 DRM_INFO("VCE initialized successfully.\n"); 273 DRM_INFO("VCE initialized successfully.\n");
@@ -338,47 +349,50 @@ static void vce_v2_0_set_sw_cg(struct amdgpu_device *adev, bool gated)
338 349
339static void vce_v2_0_set_dyn_cg(struct amdgpu_device *adev, bool gated) 350static void vce_v2_0_set_dyn_cg(struct amdgpu_device *adev, bool gated)
340{ 351{
341 u32 orig, tmp; 352 if (vce_v2_0_wait_for_idle(adev)) {
353 DRM_INFO("VCE is busy, Can't set clock gateing");
354 return;
355 }
342 356
343 if (gated) { 357 WREG32_P(mmVCE_LMI_CTRL2, 0x100, ~0x100);
344 if (vce_v2_0_wait_for_idle(adev)) { 358
345 DRM_INFO("VCE is busy, Can't set clock gateing"); 359 if (vce_v2_0_lmi_clean(adev)) {
346 return; 360 DRM_INFO("LMI is busy, Can't set clock gateing");
347 } 361 return;
348 WREG32_P(mmVCE_VCPU_CNTL, 0, ~VCE_VCPU_CNTL__CLK_EN_MASK);
349 WREG32_P(mmVCE_SOFT_RESET, VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK, ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
350 mdelay(100);
351 WREG32(mmVCE_STATUS, 0);
352 } else {
353 WREG32_P(mmVCE_VCPU_CNTL, VCE_VCPU_CNTL__CLK_EN_MASK, ~VCE_VCPU_CNTL__CLK_EN_MASK);
354 WREG32_P(mmVCE_SOFT_RESET, VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK, ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
355 mdelay(100);
356 } 362 }
357 363
358 tmp = RREG32(mmVCE_CLOCK_GATING_B); 364 WREG32_P(mmVCE_VCPU_CNTL, 0, ~VCE_VCPU_CNTL__CLK_EN_MASK);
359 tmp &= ~0x00060006; 365 WREG32_P(mmVCE_SOFT_RESET,
366 VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK,
367 ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
368 WREG32(mmVCE_STATUS, 0);
369
370 if (gated)
371 WREG32(mmVCE_CGTT_CLK_OVERRIDE, 0);
372 /* LMI_MC/LMI_UMC always set in dynamic, set {CGC_*_GATE_MODE, CGC_*_SW_GATE} = {0, 0} */
360 if (gated) { 373 if (gated) {
361 tmp |= 0xe10000; 374 /* Force CLOCK OFF , set {CGC_*_GATE_MODE, CGC_*_SW_GATE} = {*, 1} */
375 WREG32(mmVCE_CLOCK_GATING_B, 0xe90010);
362 } else { 376 } else {
363 tmp |= 0xe1; 377 /* Force CLOCK ON, set {CGC_*_GATE_MODE, CGC_*_SW_GATE} = {1, 0} */
364 tmp &= ~0xe10000; 378 WREG32(mmVCE_CLOCK_GATING_B, 0x800f1);
365 } 379 }
366 WREG32(mmVCE_CLOCK_GATING_B, tmp);
367 380
368 orig = tmp = RREG32(mmVCE_UENC_CLOCK_GATING); 381 /* Set VCE_UENC_CLOCK_GATING always in dynamic mode {*_FORCE_ON, *_FORCE_OFF} = {0, 0}*/;
369 tmp &= ~0x1fe000; 382 WREG32(mmVCE_UENC_CLOCK_GATING, 0x40);
370 tmp &= ~0xff000000;
371 if (tmp != orig)
372 WREG32(mmVCE_UENC_CLOCK_GATING, tmp);
373 383
374 orig = tmp = RREG32(mmVCE_UENC_REG_CLOCK_GATING); 384 /* set VCE_UENC_REG_CLOCK_GATING always in dynamic mode */
375 tmp &= ~0x3fc; 385 WREG32(mmVCE_UENC_REG_CLOCK_GATING, 0x00);
376 if (tmp != orig)
377 WREG32(mmVCE_UENC_REG_CLOCK_GATING, tmp);
378 386
379 if (gated) 387 WREG32_P(mmVCE_LMI_CTRL2, 0, ~0x100);
380 WREG32(mmVCE_CGTT_CLK_OVERRIDE, 0); 388 if(!gated) {
381 WREG32_P(mmVCE_SOFT_RESET, 0, ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK); 389 WREG32_P(mmVCE_VCPU_CNTL, VCE_VCPU_CNTL__CLK_EN_MASK, ~VCE_VCPU_CNTL__CLK_EN_MASK);
390 mdelay(100);
391 WREG32_P(mmVCE_SOFT_RESET, 0, ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
392
393 vce_v2_0_firmware_loaded(adev);
394 WREG32_P(mmVCE_STATUS, 0, ~VCE_STATUS__JOB_BUSY_MASK);
395 }
382} 396}
383 397
384static void vce_v2_0_disable_cg(struct amdgpu_device *adev) 398static void vce_v2_0_disable_cg(struct amdgpu_device *adev)
@@ -458,9 +472,7 @@ static void vce_v2_0_mc_resume(struct amdgpu_device *adev)
458 WREG32(mmVCE_VCPU_CACHE_SIZE2, size); 472 WREG32(mmVCE_VCPU_CACHE_SIZE2, size);
459 473
460 WREG32_P(mmVCE_LMI_CTRL2, 0x0, ~0x100); 474 WREG32_P(mmVCE_LMI_CTRL2, 0x0, ~0x100);
461 475 WREG32_FIELD(VCE_SYS_INT_EN, VCE_SYS_INT_TRAP_INTERRUPT_EN, 1);
462 WREG32_P(mmVCE_SYS_INT_EN, VCE_SYS_INT_EN__VCE_SYS_INT_TRAP_INTERRUPT_EN_MASK,
463 ~VCE_SYS_INT_EN__VCE_SYS_INT_TRAP_INTERRUPT_EN_MASK);
464 476
465 vce_v2_0_init_cg(adev); 477 vce_v2_0_init_cg(adev);
466} 478}
@@ -474,11 +486,11 @@ static bool vce_v2_0_is_idle(void *handle)
474 486
475static int vce_v2_0_wait_for_idle(void *handle) 487static int vce_v2_0_wait_for_idle(void *handle)
476{ 488{
477 unsigned i;
478 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 489 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
490 unsigned i;
479 491
480 for (i = 0; i < adev->usec_timeout; i++) { 492 for (i = 0; i < adev->usec_timeout; i++) {
481 if (!(RREG32(mmSRBM_STATUS2) & SRBM_STATUS2__VCE_BUSY_MASK)) 493 if (vce_v2_0_is_idle(handle))
482 return 0; 494 return 0;
483 } 495 }
484 return -ETIMEDOUT; 496 return -ETIMEDOUT;
@@ -488,8 +500,7 @@ static int vce_v2_0_soft_reset(void *handle)
488{ 500{
489 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 501 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
490 502
491 WREG32_P(mmSRBM_SOFT_RESET, SRBM_SOFT_RESET__SOFT_RESET_VCE_MASK, 503 WREG32_FIELD(SRBM_SOFT_RESET, SOFT_RESET_VCE, 1);
492 ~SRBM_SOFT_RESET__SOFT_RESET_VCE_MASK);
493 mdelay(5); 504 mdelay(5);
494 505
495 return vce_v2_0_start(adev); 506 return vce_v2_0_start(adev);
@@ -516,10 +527,8 @@ static int vce_v2_0_process_interrupt(struct amdgpu_device *adev,
516 DRM_DEBUG("IH: VCE\n"); 527 DRM_DEBUG("IH: VCE\n");
517 switch (entry->src_data) { 528 switch (entry->src_data) {
518 case 0: 529 case 0:
519 amdgpu_fence_process(&adev->vce.ring[0]);
520 break;
521 case 1: 530 case 1:
522 amdgpu_fence_process(&adev->vce.ring[1]); 531 amdgpu_fence_process(&adev->vce.ring[entry->src_data]);
523 break; 532 break;
524 default: 533 default:
525 DRM_ERROR("Unhandled interrupt: %d %d\n", 534 DRM_ERROR("Unhandled interrupt: %d %d\n",
@@ -530,11 +539,28 @@ static int vce_v2_0_process_interrupt(struct amdgpu_device *adev,
530 return 0; 539 return 0;
531} 540}
532 541
542static void vce_v2_0_set_bypass_mode(struct amdgpu_device *adev, bool enable)
543{
544 u32 tmp = RREG32_SMC(ixGCK_DFS_BYPASS_CNTL);
545
546 if (enable)
547 tmp |= GCK_DFS_BYPASS_CNTL__BYPASSECLK_MASK;
548 else
549 tmp &= ~GCK_DFS_BYPASS_CNTL__BYPASSECLK_MASK;
550
551 WREG32_SMC(ixGCK_DFS_BYPASS_CNTL, tmp);
552}
553
554
533static int vce_v2_0_set_clockgating_state(void *handle, 555static int vce_v2_0_set_clockgating_state(void *handle,
534 enum amd_clockgating_state state) 556 enum amd_clockgating_state state)
535{ 557{
536 bool gate = false; 558 bool gate = false;
537 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 559 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
560 bool enable = (state == AMD_CG_STATE_GATE) ? true : false;
561
562
563 vce_v2_0_set_bypass_mode(adev, enable);
538 564
539 if (state == AMD_CG_STATE_GATE) 565 if (state == AMD_CG_STATE_GATE)
540 gate = true; 566 gate = true;
@@ -596,12 +622,16 @@ static const struct amdgpu_ring_funcs vce_v2_0_ring_funcs = {
596 .pad_ib = amdgpu_ring_generic_pad_ib, 622 .pad_ib = amdgpu_ring_generic_pad_ib,
597 .begin_use = amdgpu_vce_ring_begin_use, 623 .begin_use = amdgpu_vce_ring_begin_use,
598 .end_use = amdgpu_vce_ring_end_use, 624 .end_use = amdgpu_vce_ring_end_use,
625 .get_emit_ib_size = amdgpu_vce_ring_get_emit_ib_size,
626 .get_dma_frame_size = amdgpu_vce_ring_get_dma_frame_size,
599}; 627};
600 628
601static void vce_v2_0_set_ring_funcs(struct amdgpu_device *adev) 629static void vce_v2_0_set_ring_funcs(struct amdgpu_device *adev)
602{ 630{
603 adev->vce.ring[0].funcs = &vce_v2_0_ring_funcs; 631 int i;
604 adev->vce.ring[1].funcs = &vce_v2_0_ring_funcs; 632
633 for (i = 0; i < adev->vce.num_rings; i++)
634 adev->vce.ring[i].funcs = &vce_v2_0_ring_funcs;
605} 635}
606 636
607static const struct amdgpu_irq_src_funcs vce_v2_0_irq_funcs = { 637static const struct amdgpu_irq_src_funcs vce_v2_0_irq_funcs = {
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
index c271abffd8dd..3f6db4ec0102 100644
--- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
@@ -37,6 +37,9 @@
37#include "gca/gfx_8_0_d.h" 37#include "gca/gfx_8_0_d.h"
38#include "smu/smu_7_1_2_d.h" 38#include "smu/smu_7_1_2_d.h"
39#include "smu/smu_7_1_2_sh_mask.h" 39#include "smu/smu_7_1_2_sh_mask.h"
40#include "gca/gfx_8_0_d.h"
41#include "gca/gfx_8_0_sh_mask.h"
42
40 43
41#define GRBM_GFX_INDEX__VCE_INSTANCE__SHIFT 0x04 44#define GRBM_GFX_INDEX__VCE_INSTANCE__SHIFT 0x04
42#define GRBM_GFX_INDEX__VCE_INSTANCE_MASK 0x10 45#define GRBM_GFX_INDEX__VCE_INSTANCE_MASK 0x10
@@ -67,8 +70,10 @@ static uint32_t vce_v3_0_ring_get_rptr(struct amdgpu_ring *ring)
67 70
68 if (ring == &adev->vce.ring[0]) 71 if (ring == &adev->vce.ring[0])
69 return RREG32(mmVCE_RB_RPTR); 72 return RREG32(mmVCE_RB_RPTR);
70 else 73 else if (ring == &adev->vce.ring[1])
71 return RREG32(mmVCE_RB_RPTR2); 74 return RREG32(mmVCE_RB_RPTR2);
75 else
76 return RREG32(mmVCE_RB_RPTR3);
72} 77}
73 78
74/** 79/**
@@ -84,8 +89,10 @@ static uint32_t vce_v3_0_ring_get_wptr(struct amdgpu_ring *ring)
84 89
85 if (ring == &adev->vce.ring[0]) 90 if (ring == &adev->vce.ring[0])
86 return RREG32(mmVCE_RB_WPTR); 91 return RREG32(mmVCE_RB_WPTR);
87 else 92 else if (ring == &adev->vce.ring[1])
88 return RREG32(mmVCE_RB_WPTR2); 93 return RREG32(mmVCE_RB_WPTR2);
94 else
95 return RREG32(mmVCE_RB_WPTR3);
89} 96}
90 97
91/** 98/**
@@ -101,108 +108,80 @@ static void vce_v3_0_ring_set_wptr(struct amdgpu_ring *ring)
101 108
102 if (ring == &adev->vce.ring[0]) 109 if (ring == &adev->vce.ring[0])
103 WREG32(mmVCE_RB_WPTR, ring->wptr); 110 WREG32(mmVCE_RB_WPTR, ring->wptr);
104 else 111 else if (ring == &adev->vce.ring[1])
105 WREG32(mmVCE_RB_WPTR2, ring->wptr); 112 WREG32(mmVCE_RB_WPTR2, ring->wptr);
113 else
114 WREG32(mmVCE_RB_WPTR3, ring->wptr);
106} 115}
107 116
108static void vce_v3_0_override_vce_clock_gating(struct amdgpu_device *adev, bool override) 117static void vce_v3_0_override_vce_clock_gating(struct amdgpu_device *adev, bool override)
109{ 118{
110 u32 tmp, data; 119 WREG32_FIELD(VCE_RB_ARB_CTRL, VCE_CGTT_OVERRIDE, override ? 1 : 0);
111
112 tmp = data = RREG32(mmVCE_RB_ARB_CTRL);
113 if (override)
114 data |= VCE_RB_ARB_CTRL__VCE_CGTT_OVERRIDE_MASK;
115 else
116 data &= ~VCE_RB_ARB_CTRL__VCE_CGTT_OVERRIDE_MASK;
117
118 if (tmp != data)
119 WREG32(mmVCE_RB_ARB_CTRL, data);
120} 120}
121 121
122static void vce_v3_0_set_vce_sw_clock_gating(struct amdgpu_device *adev, 122static void vce_v3_0_set_vce_sw_clock_gating(struct amdgpu_device *adev,
123 bool gated) 123 bool gated)
124{ 124{
125 u32 tmp, data; 125 u32 data;
126
126 /* Set Override to disable Clock Gating */ 127 /* Set Override to disable Clock Gating */
127 vce_v3_0_override_vce_clock_gating(adev, true); 128 vce_v3_0_override_vce_clock_gating(adev, true);
128 129
129 if (!gated) { 130 /* This function enables MGCG which is controlled by firmware.
130 /* Force CLOCK ON for VCE_CLOCK_GATING_B, 131 With the clocks in the gated state the core is still
131 * {*_FORCE_ON, *_FORCE_OFF} = {1, 0} 132 accessible but the firmware will throttle the clocks on the
132 * VREG can be FORCE ON or set to Dynamic, but can't be OFF 133 fly as necessary.
133 */ 134 */
134 tmp = data = RREG32(mmVCE_CLOCK_GATING_B); 135 if (gated) {
136 data = RREG32(mmVCE_CLOCK_GATING_B);
135 data |= 0x1ff; 137 data |= 0x1ff;
136 data &= ~0xef0000; 138 data &= ~0xef0000;
137 if (tmp != data) 139 WREG32(mmVCE_CLOCK_GATING_B, data);
138 WREG32(mmVCE_CLOCK_GATING_B, data);
139 140
140 /* Force CLOCK ON for VCE_UENC_CLOCK_GATING, 141 data = RREG32(mmVCE_UENC_CLOCK_GATING);
141 * {*_FORCE_ON, *_FORCE_OFF} = {1, 0}
142 */
143 tmp = data = RREG32(mmVCE_UENC_CLOCK_GATING);
144 data |= 0x3ff000; 142 data |= 0x3ff000;
145 data &= ~0xffc00000; 143 data &= ~0xffc00000;
146 if (tmp != data) 144 WREG32(mmVCE_UENC_CLOCK_GATING, data);
147 WREG32(mmVCE_UENC_CLOCK_GATING, data);
148 145
149 /* set VCE_UENC_CLOCK_GATING_2 */ 146 data = RREG32(mmVCE_UENC_CLOCK_GATING_2);
150 tmp = data = RREG32(mmVCE_UENC_CLOCK_GATING_2);
151 data |= 0x2; 147 data |= 0x2;
152 data &= ~0x2; 148 data &= ~0x00010000;
153 if (tmp != data) 149 WREG32(mmVCE_UENC_CLOCK_GATING_2, data);
154 WREG32(mmVCE_UENC_CLOCK_GATING_2, data);
155 150
156 /* Force CLOCK ON for VCE_UENC_REG_CLOCK_GATING */ 151 data = RREG32(mmVCE_UENC_REG_CLOCK_GATING);
157 tmp = data = RREG32(mmVCE_UENC_REG_CLOCK_GATING);
158 data |= 0x37f; 152 data |= 0x37f;
159 if (tmp != data) 153 WREG32(mmVCE_UENC_REG_CLOCK_GATING, data);
160 WREG32(mmVCE_UENC_REG_CLOCK_GATING, data);
161 154
162 /* Force VCE_UENC_DMA_DCLK_CTRL Clock ON */ 155 data = RREG32(mmVCE_UENC_DMA_DCLK_CTRL);
163 tmp = data = RREG32(mmVCE_UENC_DMA_DCLK_CTRL);
164 data |= VCE_UENC_DMA_DCLK_CTRL__WRDMCLK_FORCEON_MASK | 156 data |= VCE_UENC_DMA_DCLK_CTRL__WRDMCLK_FORCEON_MASK |
165 VCE_UENC_DMA_DCLK_CTRL__RDDMCLK_FORCEON_MASK | 157 VCE_UENC_DMA_DCLK_CTRL__RDDMCLK_FORCEON_MASK |
166 VCE_UENC_DMA_DCLK_CTRL__REGCLK_FORCEON_MASK | 158 VCE_UENC_DMA_DCLK_CTRL__REGCLK_FORCEON_MASK |
167 0x8; 159 0x8;
168 if (tmp != data) 160 WREG32(mmVCE_UENC_DMA_DCLK_CTRL, data);
169 WREG32(mmVCE_UENC_DMA_DCLK_CTRL, data);
170 } else { 161 } else {
171 /* Force CLOCK OFF for VCE_CLOCK_GATING_B, 162 data = RREG32(mmVCE_CLOCK_GATING_B);
172 * {*, *_FORCE_OFF} = {*, 1}
173 * set VREG to Dynamic, as it can't be OFF
174 */
175 tmp = data = RREG32(mmVCE_CLOCK_GATING_B);
176 data &= ~0x80010; 163 data &= ~0x80010;
177 data |= 0xe70008; 164 data |= 0xe70008;
178 if (tmp != data) 165 WREG32(mmVCE_CLOCK_GATING_B, data);
179 WREG32(mmVCE_CLOCK_GATING_B, data); 166
180 /* Force CLOCK OFF for VCE_UENC_CLOCK_GATING, 167 data = RREG32(mmVCE_UENC_CLOCK_GATING);
181 * Force ClOCK OFF takes precedent over Force CLOCK ON setting.
182 * {*_FORCE_ON, *_FORCE_OFF} = {*, 1}
183 */
184 tmp = data = RREG32(mmVCE_UENC_CLOCK_GATING);
185 data |= 0xffc00000; 168 data |= 0xffc00000;
186 if (tmp != data) 169 WREG32(mmVCE_UENC_CLOCK_GATING, data);
187 WREG32(mmVCE_UENC_CLOCK_GATING, data); 170
188 /* Set VCE_UENC_CLOCK_GATING_2 */ 171 data = RREG32(mmVCE_UENC_CLOCK_GATING_2);
189 tmp = data = RREG32(mmVCE_UENC_CLOCK_GATING_2);
190 data |= 0x10000; 172 data |= 0x10000;
191 if (tmp != data) 173 WREG32(mmVCE_UENC_CLOCK_GATING_2, data);
192 WREG32(mmVCE_UENC_CLOCK_GATING_2, data); 174
193 /* Set VCE_UENC_REG_CLOCK_GATING to dynamic */ 175 data = RREG32(mmVCE_UENC_REG_CLOCK_GATING);
194 tmp = data = RREG32(mmVCE_UENC_REG_CLOCK_GATING);
195 data &= ~0xffc00000; 176 data &= ~0xffc00000;
196 if (tmp != data) 177 WREG32(mmVCE_UENC_REG_CLOCK_GATING, data);
197 WREG32(mmVCE_UENC_REG_CLOCK_GATING, data); 178
198 /* Set VCE_UENC_DMA_DCLK_CTRL CG always in dynamic mode */ 179 data = RREG32(mmVCE_UENC_DMA_DCLK_CTRL);
199 tmp = data = RREG32(mmVCE_UENC_DMA_DCLK_CTRL);
200 data &= ~(VCE_UENC_DMA_DCLK_CTRL__WRDMCLK_FORCEON_MASK | 180 data &= ~(VCE_UENC_DMA_DCLK_CTRL__WRDMCLK_FORCEON_MASK |
201 VCE_UENC_DMA_DCLK_CTRL__RDDMCLK_FORCEON_MASK | 181 VCE_UENC_DMA_DCLK_CTRL__RDDMCLK_FORCEON_MASK |
202 VCE_UENC_DMA_DCLK_CTRL__REGCLK_FORCEON_MASK | 182 VCE_UENC_DMA_DCLK_CTRL__REGCLK_FORCEON_MASK |
203 0x8); 183 0x8);
204 if (tmp != data) 184 WREG32(mmVCE_UENC_DMA_DCLK_CTRL, data);
205 WREG32(mmVCE_UENC_DMA_DCLK_CTRL, data);
206 } 185 }
207 vce_v3_0_override_vce_clock_gating(adev, false); 186 vce_v3_0_override_vce_clock_gating(adev, false);
208} 187}
@@ -221,12 +200,9 @@ static int vce_v3_0_firmware_loaded(struct amdgpu_device *adev)
221 } 200 }
222 201
223 DRM_ERROR("VCE not responding, trying to reset the ECPU!!!\n"); 202 DRM_ERROR("VCE not responding, trying to reset the ECPU!!!\n");
224 WREG32_P(mmVCE_SOFT_RESET, 203 WREG32_FIELD(VCE_SOFT_RESET, ECPU_SOFT_RESET, 1);
225 VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK,
226 ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
227 mdelay(10); 204 mdelay(10);
228 WREG32_P(mmVCE_SOFT_RESET, 0, 205 WREG32_FIELD(VCE_SOFT_RESET, ECPU_SOFT_RESET, 0);
229 ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
230 mdelay(10); 206 mdelay(10);
231 } 207 }
232 208
@@ -259,43 +235,34 @@ static int vce_v3_0_start(struct amdgpu_device *adev)
259 WREG32(mmVCE_RB_BASE_HI2, upper_32_bits(ring->gpu_addr)); 235 WREG32(mmVCE_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));
260 WREG32(mmVCE_RB_SIZE2, ring->ring_size / 4); 236 WREG32(mmVCE_RB_SIZE2, ring->ring_size / 4);
261 237
238 ring = &adev->vce.ring[2];
239 WREG32(mmVCE_RB_RPTR3, ring->wptr);
240 WREG32(mmVCE_RB_WPTR3, ring->wptr);
241 WREG32(mmVCE_RB_BASE_LO3, ring->gpu_addr);
242 WREG32(mmVCE_RB_BASE_HI3, upper_32_bits(ring->gpu_addr));
243 WREG32(mmVCE_RB_SIZE3, ring->ring_size / 4);
244
262 mutex_lock(&adev->grbm_idx_mutex); 245 mutex_lock(&adev->grbm_idx_mutex);
263 for (idx = 0; idx < 2; ++idx) { 246 for (idx = 0; idx < 2; ++idx) {
264 if (adev->vce.harvest_config & (1 << idx)) 247 if (adev->vce.harvest_config & (1 << idx))
265 continue; 248 continue;
266 249
267 if (idx == 0) 250 WREG32_FIELD(GRBM_GFX_INDEX, VCE_INSTANCE, idx);
268 WREG32_P(mmGRBM_GFX_INDEX, 0,
269 ~GRBM_GFX_INDEX__VCE_INSTANCE_MASK);
270 else
271 WREG32_P(mmGRBM_GFX_INDEX,
272 GRBM_GFX_INDEX__VCE_INSTANCE_MASK,
273 ~GRBM_GFX_INDEX__VCE_INSTANCE_MASK);
274
275 vce_v3_0_mc_resume(adev, idx); 251 vce_v3_0_mc_resume(adev, idx);
276 252 WREG32_FIELD(VCE_STATUS, JOB_BUSY, 1);
277 WREG32_P(mmVCE_STATUS, VCE_STATUS__JOB_BUSY_MASK,
278 ~VCE_STATUS__JOB_BUSY_MASK);
279 253
280 if (adev->asic_type >= CHIP_STONEY) 254 if (adev->asic_type >= CHIP_STONEY)
281 WREG32_P(mmVCE_VCPU_CNTL, 1, ~0x200001); 255 WREG32_P(mmVCE_VCPU_CNTL, 1, ~0x200001);
282 else 256 else
283 WREG32_P(mmVCE_VCPU_CNTL, VCE_VCPU_CNTL__CLK_EN_MASK, 257 WREG32_FIELD(VCE_VCPU_CNTL, CLK_EN, 1);
284 ~VCE_VCPU_CNTL__CLK_EN_MASK);
285
286 WREG32_P(mmVCE_SOFT_RESET, 0,
287 ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
288 258
259 WREG32_FIELD(VCE_SOFT_RESET, ECPU_SOFT_RESET, 0);
289 mdelay(100); 260 mdelay(100);
290 261
291 r = vce_v3_0_firmware_loaded(adev); 262 r = vce_v3_0_firmware_loaded(adev);
292 263
293 /* clear BUSY flag */ 264 /* clear BUSY flag */
294 WREG32_P(mmVCE_STATUS, 0, ~VCE_STATUS__JOB_BUSY_MASK); 265 WREG32_FIELD(VCE_STATUS, JOB_BUSY, 0);
295
296 /* Set Clock-Gating off */
297 if (adev->cg_flags & AMD_CG_SUPPORT_VCE_MGCG)
298 vce_v3_0_set_vce_sw_clock_gating(adev, false);
299 266
300 if (r) { 267 if (r) {
301 DRM_ERROR("VCE not responding, giving up!!!\n"); 268 DRM_ERROR("VCE not responding, giving up!!!\n");
@@ -304,7 +271,7 @@ static int vce_v3_0_start(struct amdgpu_device *adev)
304 } 271 }
305 } 272 }
306 273
307 WREG32_P(mmGRBM_GFX_INDEX, 0, ~GRBM_GFX_INDEX__VCE_INSTANCE_MASK); 274 WREG32_FIELD(GRBM_GFX_INDEX, VCE_INSTANCE, 0);
308 mutex_unlock(&adev->grbm_idx_mutex); 275 mutex_unlock(&adev->grbm_idx_mutex);
309 276
310 return 0; 277 return 0;
@@ -319,33 +286,25 @@ static int vce_v3_0_stop(struct amdgpu_device *adev)
319 if (adev->vce.harvest_config & (1 << idx)) 286 if (adev->vce.harvest_config & (1 << idx))
320 continue; 287 continue;
321 288
322 if (idx == 0) 289 WREG32_FIELD(GRBM_GFX_INDEX, VCE_INSTANCE, idx);
323 WREG32_P(mmGRBM_GFX_INDEX, 0,
324 ~GRBM_GFX_INDEX__VCE_INSTANCE_MASK);
325 else
326 WREG32_P(mmGRBM_GFX_INDEX,
327 GRBM_GFX_INDEX__VCE_INSTANCE_MASK,
328 ~GRBM_GFX_INDEX__VCE_INSTANCE_MASK);
329 290
330 if (adev->asic_type >= CHIP_STONEY) 291 if (adev->asic_type >= CHIP_STONEY)
331 WREG32_P(mmVCE_VCPU_CNTL, 0, ~0x200001); 292 WREG32_P(mmVCE_VCPU_CNTL, 0, ~0x200001);
332 else 293 else
333 WREG32_P(mmVCE_VCPU_CNTL, 0, 294 WREG32_FIELD(VCE_VCPU_CNTL, CLK_EN, 0);
334 ~VCE_VCPU_CNTL__CLK_EN_MASK); 295
335 /* hold on ECPU */ 296 /* hold on ECPU */
336 WREG32_P(mmVCE_SOFT_RESET, 297 WREG32_FIELD(VCE_SOFT_RESET, ECPU_SOFT_RESET, 1);
337 VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK,
338 ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
339 298
340 /* clear BUSY flag */ 299 /* clear BUSY flag */
341 WREG32_P(mmVCE_STATUS, 0, ~VCE_STATUS__JOB_BUSY_MASK); 300 WREG32_FIELD(VCE_STATUS, JOB_BUSY, 0);
342 301
343 /* Set Clock-Gating off */ 302 /* Set Clock-Gating off */
344 if (adev->cg_flags & AMD_CG_SUPPORT_VCE_MGCG) 303 if (adev->cg_flags & AMD_CG_SUPPORT_VCE_MGCG)
345 vce_v3_0_set_vce_sw_clock_gating(adev, false); 304 vce_v3_0_set_vce_sw_clock_gating(adev, false);
346 } 305 }
347 306
348 WREG32_P(mmGRBM_GFX_INDEX, 0, ~GRBM_GFX_INDEX__VCE_INSTANCE_MASK); 307 WREG32_FIELD(GRBM_GFX_INDEX, VCE_INSTANCE, 0);
349 mutex_unlock(&adev->grbm_idx_mutex); 308 mutex_unlock(&adev->grbm_idx_mutex);
350 309
351 return 0; 310 return 0;
@@ -399,6 +358,8 @@ static int vce_v3_0_early_init(void *handle)
399 (AMDGPU_VCE_HARVEST_VCE0 | AMDGPU_VCE_HARVEST_VCE1)) 358 (AMDGPU_VCE_HARVEST_VCE0 | AMDGPU_VCE_HARVEST_VCE1))
400 return -ENOENT; 359 return -ENOENT;
401 360
361 adev->vce.num_rings = 3;
362
402 vce_v3_0_set_ring_funcs(adev); 363 vce_v3_0_set_ring_funcs(adev);
403 vce_v3_0_set_irq_funcs(adev); 364 vce_v3_0_set_irq_funcs(adev);
404 365
@@ -409,7 +370,7 @@ static int vce_v3_0_sw_init(void *handle)
409{ 370{
410 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 371 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
411 struct amdgpu_ring *ring; 372 struct amdgpu_ring *ring;
412 int r; 373 int r, i;
413 374
414 /* VCE */ 375 /* VCE */
415 r = amdgpu_irq_add_id(adev, 167, &adev->vce.irq); 376 r = amdgpu_irq_add_id(adev, 167, &adev->vce.irq);
@@ -425,19 +386,14 @@ static int vce_v3_0_sw_init(void *handle)
425 if (r) 386 if (r)
426 return r; 387 return r;
427 388
428 ring = &adev->vce.ring[0]; 389 for (i = 0; i < adev->vce.num_rings; i++) {
429 sprintf(ring->name, "vce0"); 390 ring = &adev->vce.ring[i];
430 r = amdgpu_ring_init(adev, ring, 512, VCE_CMD_NO_OP, 0xf, 391 sprintf(ring->name, "vce%d", i);
431 &adev->vce.irq, 0, AMDGPU_RING_TYPE_VCE); 392 r = amdgpu_ring_init(adev, ring, 512, VCE_CMD_NO_OP, 0xf,
432 if (r) 393 &adev->vce.irq, 0, AMDGPU_RING_TYPE_VCE);
433 return r; 394 if (r)
434 395 return r;
435 ring = &adev->vce.ring[1]; 396 }
436 sprintf(ring->name, "vce1");
437 r = amdgpu_ring_init(adev, ring, 512, VCE_CMD_NO_OP, 0xf,
438 &adev->vce.irq, 0, AMDGPU_RING_TYPE_VCE);
439 if (r)
440 return r;
441 397
442 return r; 398 return r;
443} 399}
@@ -467,10 +423,10 @@ static int vce_v3_0_hw_init(void *handle)
467 if (r) 423 if (r)
468 return r; 424 return r;
469 425
470 adev->vce.ring[0].ready = false; 426 for (i = 0; i < adev->vce.num_rings; i++)
471 adev->vce.ring[1].ready = false; 427 adev->vce.ring[i].ready = false;
472 428
473 for (i = 0; i < 2; i++) { 429 for (i = 0; i < adev->vce.num_rings; i++) {
474 r = amdgpu_ring_test_ring(&adev->vce.ring[i]); 430 r = amdgpu_ring_test_ring(&adev->vce.ring[i]);
475 if (r) 431 if (r)
476 return r; 432 return r;
@@ -534,7 +490,7 @@ static void vce_v3_0_mc_resume(struct amdgpu_device *adev, int idx)
534 WREG32_P(mmVCE_CLOCK_GATING_A, 0, ~(1 << 16)); 490 WREG32_P(mmVCE_CLOCK_GATING_A, 0, ~(1 << 16));
535 WREG32_P(mmVCE_UENC_CLOCK_GATING, 0x1FF000, ~0xFF9FF000); 491 WREG32_P(mmVCE_UENC_CLOCK_GATING, 0x1FF000, ~0xFF9FF000);
536 WREG32_P(mmVCE_UENC_REG_CLOCK_GATING, 0x3F, ~0x3F); 492 WREG32_P(mmVCE_UENC_REG_CLOCK_GATING, 0x3F, ~0x3F);
537 WREG32(mmVCE_CLOCK_GATING_B, 0xf7); 493 WREG32(mmVCE_CLOCK_GATING_B, 0x1FF);
538 494
539 WREG32(mmVCE_LMI_CTRL, 0x00398000); 495 WREG32(mmVCE_LMI_CTRL, 0x00398000);
540 WREG32_P(mmVCE_LMI_CACHE_CTRL, 0x0, ~0x1); 496 WREG32_P(mmVCE_LMI_CACHE_CTRL, 0x0, ~0x1);
@@ -573,9 +529,7 @@ static void vce_v3_0_mc_resume(struct amdgpu_device *adev, int idx)
573 } 529 }
574 530
575 WREG32_P(mmVCE_LMI_CTRL2, 0x0, ~0x100); 531 WREG32_P(mmVCE_LMI_CTRL2, 0x0, ~0x100);
576 532 WREG32_FIELD(VCE_SYS_INT_EN, VCE_SYS_INT_TRAP_INTERRUPT_EN, 1);
577 WREG32_P(mmVCE_SYS_INT_EN, VCE_SYS_INT_EN__VCE_SYS_INT_TRAP_INTERRUPT_EN_MASK,
578 ~VCE_SYS_INT_EN__VCE_SYS_INT_TRAP_INTERRUPT_EN_MASK);
579} 533}
580 534
581static bool vce_v3_0_is_idle(void *handle) 535static bool vce_v3_0_is_idle(void *handle)
@@ -601,20 +555,108 @@ static int vce_v3_0_wait_for_idle(void *handle)
601 return -ETIMEDOUT; 555 return -ETIMEDOUT;
602} 556}
603 557
558#define VCE_STATUS_VCPU_REPORT_AUTO_BUSY_MASK 0x00000008L /* AUTO_BUSY */
559#define VCE_STATUS_VCPU_REPORT_RB0_BUSY_MASK 0x00000010L /* RB0_BUSY */
560#define VCE_STATUS_VCPU_REPORT_RB1_BUSY_MASK 0x00000020L /* RB1_BUSY */
561#define AMDGPU_VCE_STATUS_BUSY_MASK (VCE_STATUS_VCPU_REPORT_AUTO_BUSY_MASK | \
562 VCE_STATUS_VCPU_REPORT_RB0_BUSY_MASK)
563
564static int vce_v3_0_check_soft_reset(void *handle)
565{
566 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
567 u32 srbm_soft_reset = 0;
568
569 /* According to VCE team , we should use VCE_STATUS instead
570 * SRBM_STATUS.VCE_BUSY bit for busy status checking.
571 * GRBM_GFX_INDEX.INSTANCE_INDEX is used to specify which VCE
572 * instance's registers are accessed
573 * (0 for 1st instance, 10 for 2nd instance).
574 *
575 *VCE_STATUS
576 *|UENC|ACPI|AUTO ACTIVE|RB1 |RB0 |RB2 | |FW_LOADED|JOB |
577 *|----+----+-----------+----+----+----+----------+---------+----|
578 *|bit8|bit7| bit6 |bit5|bit4|bit3| bit2 | bit1 |bit0|
579 *
580 * VCE team suggest use bit 3--bit 6 for busy status check
581 */
582 mutex_lock(&adev->grbm_idx_mutex);
583 WREG32_FIELD(GRBM_GFX_INDEX, INSTANCE_INDEX, 0);
584 if (RREG32(mmVCE_STATUS) & AMDGPU_VCE_STATUS_BUSY_MASK) {
585 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_VCE0, 1);
586 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_VCE1, 1);
587 }
588 WREG32_FIELD(GRBM_GFX_INDEX, INSTANCE_INDEX, 0x10);
589 if (RREG32(mmVCE_STATUS) & AMDGPU_VCE_STATUS_BUSY_MASK) {
590 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_VCE0, 1);
591 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_VCE1, 1);
592 }
593 WREG32_FIELD(GRBM_GFX_INDEX, INSTANCE_INDEX, 0);
594
595 if (srbm_soft_reset) {
596 adev->ip_block_status[AMD_IP_BLOCK_TYPE_VCE].hang = true;
597 adev->vce.srbm_soft_reset = srbm_soft_reset;
598 } else {
599 adev->ip_block_status[AMD_IP_BLOCK_TYPE_VCE].hang = false;
600 adev->vce.srbm_soft_reset = 0;
601 }
602 mutex_unlock(&adev->grbm_idx_mutex);
603 return 0;
604}
605
604static int vce_v3_0_soft_reset(void *handle) 606static int vce_v3_0_soft_reset(void *handle)
605{ 607{
606 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 608 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
607 u32 mask = 0; 609 u32 srbm_soft_reset;
610
611 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_VCE].hang)
612 return 0;
613 srbm_soft_reset = adev->vce.srbm_soft_reset;
614
615 if (srbm_soft_reset) {
616 u32 tmp;
608 617
609 mask |= (adev->vce.harvest_config & AMDGPU_VCE_HARVEST_VCE0) ? 0 : SRBM_SOFT_RESET__SOFT_RESET_VCE0_MASK; 618 tmp = RREG32(mmSRBM_SOFT_RESET);
610 mask |= (adev->vce.harvest_config & AMDGPU_VCE_HARVEST_VCE1) ? 0 : SRBM_SOFT_RESET__SOFT_RESET_VCE1_MASK; 619 tmp |= srbm_soft_reset;
620 dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
621 WREG32(mmSRBM_SOFT_RESET, tmp);
622 tmp = RREG32(mmSRBM_SOFT_RESET);
623
624 udelay(50);
625
626 tmp &= ~srbm_soft_reset;
627 WREG32(mmSRBM_SOFT_RESET, tmp);
628 tmp = RREG32(mmSRBM_SOFT_RESET);
629
630 /* Wait a little for things to settle down */
631 udelay(50);
632 }
633
634 return 0;
635}
636
637static int vce_v3_0_pre_soft_reset(void *handle)
638{
639 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
640
641 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_VCE].hang)
642 return 0;
611 643
612 WREG32_P(mmSRBM_SOFT_RESET, mask,
613 ~(SRBM_SOFT_RESET__SOFT_RESET_VCE0_MASK |
614 SRBM_SOFT_RESET__SOFT_RESET_VCE1_MASK));
615 mdelay(5); 644 mdelay(5);
616 645
617 return vce_v3_0_start(adev); 646 return vce_v3_0_suspend(adev);
647}
648
649
650static int vce_v3_0_post_soft_reset(void *handle)
651{
652 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
653
654 if (!adev->ip_block_status[AMD_IP_BLOCK_TYPE_VCE].hang)
655 return 0;
656
657 mdelay(5);
658
659 return vce_v3_0_resume(adev);
618} 660}
619 661
620static int vce_v3_0_set_interrupt_state(struct amdgpu_device *adev, 662static int vce_v3_0_set_interrupt_state(struct amdgpu_device *adev,
@@ -637,13 +679,12 @@ static int vce_v3_0_process_interrupt(struct amdgpu_device *adev,
637{ 679{
638 DRM_DEBUG("IH: VCE\n"); 680 DRM_DEBUG("IH: VCE\n");
639 681
640 WREG32_P(mmVCE_SYS_INT_STATUS, 682 WREG32_FIELD(VCE_SYS_INT_STATUS, VCE_SYS_INT_TRAP_INTERRUPT_INT, 1);
641 VCE_SYS_INT_STATUS__VCE_SYS_INT_TRAP_INTERRUPT_INT_MASK,
642 ~VCE_SYS_INT_STATUS__VCE_SYS_INT_TRAP_INTERRUPT_INT_MASK);
643 683
644 switch (entry->src_data) { 684 switch (entry->src_data) {
645 case 0: 685 case 0:
646 case 1: 686 case 1:
687 case 2:
647 amdgpu_fence_process(&adev->vce.ring[entry->src_data]); 688 amdgpu_fence_process(&adev->vce.ring[entry->src_data]);
648 break; 689 break;
649 default: 690 default:
@@ -655,7 +696,7 @@ static int vce_v3_0_process_interrupt(struct amdgpu_device *adev,
655 return 0; 696 return 0;
656} 697}
657 698
658static void vce_v3_set_bypass_mode(struct amdgpu_device *adev, bool enable) 699static void vce_v3_0_set_bypass_mode(struct amdgpu_device *adev, bool enable)
659{ 700{
660 u32 tmp = RREG32_SMC(ixGCK_DFS_BYPASS_CNTL); 701 u32 tmp = RREG32_SMC(ixGCK_DFS_BYPASS_CNTL);
661 702
@@ -674,8 +715,10 @@ static int vce_v3_0_set_clockgating_state(void *handle,
674 bool enable = (state == AMD_CG_STATE_GATE) ? true : false; 715 bool enable = (state == AMD_CG_STATE_GATE) ? true : false;
675 int i; 716 int i;
676 717
677 if (adev->asic_type == CHIP_POLARIS10) 718 if ((adev->asic_type == CHIP_POLARIS10) ||
678 vce_v3_set_bypass_mode(adev, enable); 719 (adev->asic_type == CHIP_TONGA) ||
720 (adev->asic_type == CHIP_FIJI))
721 vce_v3_0_set_bypass_mode(adev, enable);
679 722
680 if (!(adev->cg_flags & AMD_CG_SUPPORT_VCE_MGCG)) 723 if (!(adev->cg_flags & AMD_CG_SUPPORT_VCE_MGCG))
681 return 0; 724 return 0;
@@ -686,13 +729,7 @@ static int vce_v3_0_set_clockgating_state(void *handle,
686 if (adev->vce.harvest_config & (1 << i)) 729 if (adev->vce.harvest_config & (1 << i))
687 continue; 730 continue;
688 731
689 if (i == 0) 732 WREG32_FIELD(GRBM_GFX_INDEX, VCE_INSTANCE, i);
690 WREG32_P(mmGRBM_GFX_INDEX, 0,
691 ~GRBM_GFX_INDEX__VCE_INSTANCE_MASK);
692 else
693 WREG32_P(mmGRBM_GFX_INDEX,
694 GRBM_GFX_INDEX__VCE_INSTANCE_MASK,
695 ~GRBM_GFX_INDEX__VCE_INSTANCE_MASK);
696 733
697 if (enable) { 734 if (enable) {
698 /* initialize VCE_CLOCK_GATING_A: Clock ON/OFF delay */ 735 /* initialize VCE_CLOCK_GATING_A: Clock ON/OFF delay */
@@ -711,7 +748,7 @@ static int vce_v3_0_set_clockgating_state(void *handle,
711 vce_v3_0_set_vce_sw_clock_gating(adev, enable); 748 vce_v3_0_set_vce_sw_clock_gating(adev, enable);
712 } 749 }
713 750
714 WREG32_P(mmGRBM_GFX_INDEX, 0, ~GRBM_GFX_INDEX__VCE_INSTANCE_MASK); 751 WREG32_FIELD(GRBM_GFX_INDEX, VCE_INSTANCE, 0);
715 mutex_unlock(&adev->grbm_idx_mutex); 752 mutex_unlock(&adev->grbm_idx_mutex);
716 753
717 return 0; 754 return 0;
@@ -739,6 +776,60 @@ static int vce_v3_0_set_powergating_state(void *handle,
739 return vce_v3_0_start(adev); 776 return vce_v3_0_start(adev);
740} 777}
741 778
779static void vce_v3_0_ring_emit_ib(struct amdgpu_ring *ring,
780 struct amdgpu_ib *ib, unsigned int vm_id, bool ctx_switch)
781{
782 amdgpu_ring_write(ring, VCE_CMD_IB_VM);
783 amdgpu_ring_write(ring, vm_id);
784 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr));
785 amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr));
786 amdgpu_ring_write(ring, ib->length_dw);
787}
788
789static void vce_v3_0_emit_vm_flush(struct amdgpu_ring *ring,
790 unsigned int vm_id, uint64_t pd_addr)
791{
792 amdgpu_ring_write(ring, VCE_CMD_UPDATE_PTB);
793 amdgpu_ring_write(ring, vm_id);
794 amdgpu_ring_write(ring, pd_addr >> 12);
795
796 amdgpu_ring_write(ring, VCE_CMD_FLUSH_TLB);
797 amdgpu_ring_write(ring, vm_id);
798 amdgpu_ring_write(ring, VCE_CMD_END);
799}
800
801static void vce_v3_0_emit_pipeline_sync(struct amdgpu_ring *ring)
802{
803 uint32_t seq = ring->fence_drv.sync_seq;
804 uint64_t addr = ring->fence_drv.gpu_addr;
805
806 amdgpu_ring_write(ring, VCE_CMD_WAIT_GE);
807 amdgpu_ring_write(ring, lower_32_bits(addr));
808 amdgpu_ring_write(ring, upper_32_bits(addr));
809 amdgpu_ring_write(ring, seq);
810}
811
812static unsigned vce_v3_0_ring_get_emit_ib_size(struct amdgpu_ring *ring)
813{
814 return
815 5; /* vce_v3_0_ring_emit_ib */
816}
817
818static unsigned vce_v3_0_ring_get_dma_frame_size(struct amdgpu_ring *ring)
819{
820 return
821 4 + /* vce_v3_0_emit_pipeline_sync */
822 6; /* amdgpu_vce_ring_emit_fence x1 no user fence */
823}
824
825static unsigned vce_v3_0_ring_get_dma_frame_size_vm(struct amdgpu_ring *ring)
826{
827 return
828 6 + /* vce_v3_0_emit_vm_flush */
829 4 + /* vce_v3_0_emit_pipeline_sync */
830 6 + 6; /* amdgpu_vce_ring_emit_fence x2 vm fence */
831}
832
742const struct amd_ip_funcs vce_v3_0_ip_funcs = { 833const struct amd_ip_funcs vce_v3_0_ip_funcs = {
743 .name = "vce_v3_0", 834 .name = "vce_v3_0",
744 .early_init = vce_v3_0_early_init, 835 .early_init = vce_v3_0_early_init,
@@ -751,12 +842,15 @@ const struct amd_ip_funcs vce_v3_0_ip_funcs = {
751 .resume = vce_v3_0_resume, 842 .resume = vce_v3_0_resume,
752 .is_idle = vce_v3_0_is_idle, 843 .is_idle = vce_v3_0_is_idle,
753 .wait_for_idle = vce_v3_0_wait_for_idle, 844 .wait_for_idle = vce_v3_0_wait_for_idle,
845 .check_soft_reset = vce_v3_0_check_soft_reset,
846 .pre_soft_reset = vce_v3_0_pre_soft_reset,
754 .soft_reset = vce_v3_0_soft_reset, 847 .soft_reset = vce_v3_0_soft_reset,
848 .post_soft_reset = vce_v3_0_post_soft_reset,
755 .set_clockgating_state = vce_v3_0_set_clockgating_state, 849 .set_clockgating_state = vce_v3_0_set_clockgating_state,
756 .set_powergating_state = vce_v3_0_set_powergating_state, 850 .set_powergating_state = vce_v3_0_set_powergating_state,
757}; 851};
758 852
759static const struct amdgpu_ring_funcs vce_v3_0_ring_funcs = { 853static const struct amdgpu_ring_funcs vce_v3_0_ring_phys_funcs = {
760 .get_rptr = vce_v3_0_ring_get_rptr, 854 .get_rptr = vce_v3_0_ring_get_rptr,
761 .get_wptr = vce_v3_0_ring_get_wptr, 855 .get_wptr = vce_v3_0_ring_get_wptr,
762 .set_wptr = vce_v3_0_ring_set_wptr, 856 .set_wptr = vce_v3_0_ring_set_wptr,
@@ -769,12 +863,42 @@ static const struct amdgpu_ring_funcs vce_v3_0_ring_funcs = {
769 .pad_ib = amdgpu_ring_generic_pad_ib, 863 .pad_ib = amdgpu_ring_generic_pad_ib,
770 .begin_use = amdgpu_vce_ring_begin_use, 864 .begin_use = amdgpu_vce_ring_begin_use,
771 .end_use = amdgpu_vce_ring_end_use, 865 .end_use = amdgpu_vce_ring_end_use,
866 .get_emit_ib_size = vce_v3_0_ring_get_emit_ib_size,
867 .get_dma_frame_size = vce_v3_0_ring_get_dma_frame_size,
868};
869
870static const struct amdgpu_ring_funcs vce_v3_0_ring_vm_funcs = {
871 .get_rptr = vce_v3_0_ring_get_rptr,
872 .get_wptr = vce_v3_0_ring_get_wptr,
873 .set_wptr = vce_v3_0_ring_set_wptr,
874 .parse_cs = NULL,
875 .emit_ib = vce_v3_0_ring_emit_ib,
876 .emit_vm_flush = vce_v3_0_emit_vm_flush,
877 .emit_pipeline_sync = vce_v3_0_emit_pipeline_sync,
878 .emit_fence = amdgpu_vce_ring_emit_fence,
879 .test_ring = amdgpu_vce_ring_test_ring,
880 .test_ib = amdgpu_vce_ring_test_ib,
881 .insert_nop = amdgpu_ring_insert_nop,
882 .pad_ib = amdgpu_ring_generic_pad_ib,
883 .begin_use = amdgpu_vce_ring_begin_use,
884 .end_use = amdgpu_vce_ring_end_use,
885 .get_emit_ib_size = vce_v3_0_ring_get_emit_ib_size,
886 .get_dma_frame_size = vce_v3_0_ring_get_dma_frame_size_vm,
772}; 887};
773 888
774static void vce_v3_0_set_ring_funcs(struct amdgpu_device *adev) 889static void vce_v3_0_set_ring_funcs(struct amdgpu_device *adev)
775{ 890{
776 adev->vce.ring[0].funcs = &vce_v3_0_ring_funcs; 891 int i;
777 adev->vce.ring[1].funcs = &vce_v3_0_ring_funcs; 892
893 if (adev->asic_type >= CHIP_STONEY) {
894 for (i = 0; i < adev->vce.num_rings; i++)
895 adev->vce.ring[i].funcs = &vce_v3_0_ring_vm_funcs;
896 DRM_INFO("VCE enabled in VM mode\n");
897 } else {
898 for (i = 0; i < adev->vce.num_rings; i++)
899 adev->vce.ring[i].funcs = &vce_v3_0_ring_phys_funcs;
900 DRM_INFO("VCE enabled in physical mode\n");
901 }
778} 902}
779 903
780static const struct amdgpu_irq_src_funcs vce_v3_0_irq_funcs = { 904static const struct amdgpu_irq_src_funcs vce_v3_0_irq_funcs = {
diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c
index 03a31c53aec3..c0d9aad7126f 100644
--- a/drivers/gpu/drm/amd/amdgpu/vi.c
+++ b/drivers/gpu/drm/amd/amdgpu/vi.c
@@ -77,7 +77,11 @@
77#if defined(CONFIG_DRM_AMD_ACP) 77#if defined(CONFIG_DRM_AMD_ACP)
78#include "amdgpu_acp.h" 78#include "amdgpu_acp.h"
79#endif 79#endif
80#include "dce_virtual.h"
80 81
82MODULE_FIRMWARE("amdgpu/topaz_smc.bin");
83MODULE_FIRMWARE("amdgpu/tonga_smc.bin");
84MODULE_FIRMWARE("amdgpu/fiji_smc.bin");
81MODULE_FIRMWARE("amdgpu/polaris10_smc.bin"); 85MODULE_FIRMWARE("amdgpu/polaris10_smc.bin");
82MODULE_FIRMWARE("amdgpu/polaris10_smc_sk.bin"); 86MODULE_FIRMWARE("amdgpu/polaris10_smc_sk.bin");
83MODULE_FIRMWARE("amdgpu/polaris11_smc.bin"); 87MODULE_FIRMWARE("amdgpu/polaris11_smc.bin");
@@ -444,18 +448,21 @@ static bool vi_read_bios_from_rom(struct amdgpu_device *adev,
444 return true; 448 return true;
445} 449}
446 450
447static u32 vi_get_virtual_caps(struct amdgpu_device *adev) 451static void vi_detect_hw_virtualization(struct amdgpu_device *adev)
448{ 452{
449 u32 caps = 0; 453 uint32_t reg = RREG32(mmBIF_IOV_FUNC_IDENTIFIER);
450 u32 reg = RREG32(mmBIF_IOV_FUNC_IDENTIFIER); 454 /* bit0: 0 means pf and 1 means vf */
451 455 /* bit31: 0 means disable IOV and 1 means enable */
452 if (REG_GET_FIELD(reg, BIF_IOV_FUNC_IDENTIFIER, IOV_ENABLE)) 456 if (reg & 1)
453 caps |= AMDGPU_VIRT_CAPS_SRIOV_EN; 457 adev->virtualization.virtual_caps |= AMDGPU_SRIOV_CAPS_IS_VF;
454 458
455 if (REG_GET_FIELD(reg, BIF_IOV_FUNC_IDENTIFIER, FUNC_IDENTIFIER)) 459 if (reg & 0x80000000)
456 caps |= AMDGPU_VIRT_CAPS_IS_VF; 460 adev->virtualization.virtual_caps |= AMDGPU_SRIOV_CAPS_ENABLE_IOV;
457 461
458 return caps; 462 if (reg == 0) {
463 if (is_virtual_machine()) /* passthrough mode exclus sr-iov mode */
464 adev->virtualization.virtual_caps |= AMDGPU_PASSTHROUGH_MODE;
465 }
459} 466}
460 467
461static const struct amdgpu_allowed_register_entry tonga_allowed_read_registers[] = { 468static const struct amdgpu_allowed_register_entry tonga_allowed_read_registers[] = {
@@ -822,6 +829,60 @@ static const struct amdgpu_ip_block_version topaz_ip_blocks[] =
822 }, 829 },
823}; 830};
824 831
832static const struct amdgpu_ip_block_version topaz_ip_blocks_vd[] =
833{
834 /* ORDER MATTERS! */
835 {
836 .type = AMD_IP_BLOCK_TYPE_COMMON,
837 .major = 2,
838 .minor = 0,
839 .rev = 0,
840 .funcs = &vi_common_ip_funcs,
841 },
842 {
843 .type = AMD_IP_BLOCK_TYPE_GMC,
844 .major = 7,
845 .minor = 4,
846 .rev = 0,
847 .funcs = &gmc_v7_0_ip_funcs,
848 },
849 {
850 .type = AMD_IP_BLOCK_TYPE_IH,
851 .major = 2,
852 .minor = 4,
853 .rev = 0,
854 .funcs = &iceland_ih_ip_funcs,
855 },
856 {
857 .type = AMD_IP_BLOCK_TYPE_SMC,
858 .major = 7,
859 .minor = 1,
860 .rev = 0,
861 .funcs = &amdgpu_pp_ip_funcs,
862 },
863 {
864 .type = AMD_IP_BLOCK_TYPE_DCE,
865 .major = 1,
866 .minor = 0,
867 .rev = 0,
868 .funcs = &dce_virtual_ip_funcs,
869 },
870 {
871 .type = AMD_IP_BLOCK_TYPE_GFX,
872 .major = 8,
873 .minor = 0,
874 .rev = 0,
875 .funcs = &gfx_v8_0_ip_funcs,
876 },
877 {
878 .type = AMD_IP_BLOCK_TYPE_SDMA,
879 .major = 2,
880 .minor = 4,
881 .rev = 0,
882 .funcs = &sdma_v2_4_ip_funcs,
883 },
884};
885
825static const struct amdgpu_ip_block_version tonga_ip_blocks[] = 886static const struct amdgpu_ip_block_version tonga_ip_blocks[] =
826{ 887{
827 /* ORDER MATTERS! */ 888 /* ORDER MATTERS! */
@@ -890,6 +951,74 @@ static const struct amdgpu_ip_block_version tonga_ip_blocks[] =
890 }, 951 },
891}; 952};
892 953
954static const struct amdgpu_ip_block_version tonga_ip_blocks_vd[] =
955{
956 /* ORDER MATTERS! */
957 {
958 .type = AMD_IP_BLOCK_TYPE_COMMON,
959 .major = 2,
960 .minor = 0,
961 .rev = 0,
962 .funcs = &vi_common_ip_funcs,
963 },
964 {
965 .type = AMD_IP_BLOCK_TYPE_GMC,
966 .major = 8,
967 .minor = 0,
968 .rev = 0,
969 .funcs = &gmc_v8_0_ip_funcs,
970 },
971 {
972 .type = AMD_IP_BLOCK_TYPE_IH,
973 .major = 3,
974 .minor = 0,
975 .rev = 0,
976 .funcs = &tonga_ih_ip_funcs,
977 },
978 {
979 .type = AMD_IP_BLOCK_TYPE_SMC,
980 .major = 7,
981 .minor = 1,
982 .rev = 0,
983 .funcs = &amdgpu_pp_ip_funcs,
984 },
985 {
986 .type = AMD_IP_BLOCK_TYPE_DCE,
987 .major = 10,
988 .minor = 0,
989 .rev = 0,
990 .funcs = &dce_virtual_ip_funcs,
991 },
992 {
993 .type = AMD_IP_BLOCK_TYPE_GFX,
994 .major = 8,
995 .minor = 0,
996 .rev = 0,
997 .funcs = &gfx_v8_0_ip_funcs,
998 },
999 {
1000 .type = AMD_IP_BLOCK_TYPE_SDMA,
1001 .major = 3,
1002 .minor = 0,
1003 .rev = 0,
1004 .funcs = &sdma_v3_0_ip_funcs,
1005 },
1006 {
1007 .type = AMD_IP_BLOCK_TYPE_UVD,
1008 .major = 5,
1009 .minor = 0,
1010 .rev = 0,
1011 .funcs = &uvd_v5_0_ip_funcs,
1012 },
1013 {
1014 .type = AMD_IP_BLOCK_TYPE_VCE,
1015 .major = 3,
1016 .minor = 0,
1017 .rev = 0,
1018 .funcs = &vce_v3_0_ip_funcs,
1019 },
1020};
1021
893static const struct amdgpu_ip_block_version fiji_ip_blocks[] = 1022static const struct amdgpu_ip_block_version fiji_ip_blocks[] =
894{ 1023{
895 /* ORDER MATTERS! */ 1024 /* ORDER MATTERS! */
@@ -958,6 +1087,74 @@ static const struct amdgpu_ip_block_version fiji_ip_blocks[] =
958 }, 1087 },
959}; 1088};
960 1089
1090static const struct amdgpu_ip_block_version fiji_ip_blocks_vd[] =
1091{
1092 /* ORDER MATTERS! */
1093 {
1094 .type = AMD_IP_BLOCK_TYPE_COMMON,
1095 .major = 2,
1096 .minor = 0,
1097 .rev = 0,
1098 .funcs = &vi_common_ip_funcs,
1099 },
1100 {
1101 .type = AMD_IP_BLOCK_TYPE_GMC,
1102 .major = 8,
1103 .minor = 5,
1104 .rev = 0,
1105 .funcs = &gmc_v8_0_ip_funcs,
1106 },
1107 {
1108 .type = AMD_IP_BLOCK_TYPE_IH,
1109 .major = 3,
1110 .minor = 0,
1111 .rev = 0,
1112 .funcs = &tonga_ih_ip_funcs,
1113 },
1114 {
1115 .type = AMD_IP_BLOCK_TYPE_SMC,
1116 .major = 7,
1117 .minor = 1,
1118 .rev = 0,
1119 .funcs = &amdgpu_pp_ip_funcs,
1120 },
1121 {
1122 .type = AMD_IP_BLOCK_TYPE_DCE,
1123 .major = 10,
1124 .minor = 1,
1125 .rev = 0,
1126 .funcs = &dce_virtual_ip_funcs,
1127 },
1128 {
1129 .type = AMD_IP_BLOCK_TYPE_GFX,
1130 .major = 8,
1131 .minor = 0,
1132 .rev = 0,
1133 .funcs = &gfx_v8_0_ip_funcs,
1134 },
1135 {
1136 .type = AMD_IP_BLOCK_TYPE_SDMA,
1137 .major = 3,
1138 .minor = 0,
1139 .rev = 0,
1140 .funcs = &sdma_v3_0_ip_funcs,
1141 },
1142 {
1143 .type = AMD_IP_BLOCK_TYPE_UVD,
1144 .major = 6,
1145 .minor = 0,
1146 .rev = 0,
1147 .funcs = &uvd_v6_0_ip_funcs,
1148 },
1149 {
1150 .type = AMD_IP_BLOCK_TYPE_VCE,
1151 .major = 3,
1152 .minor = 0,
1153 .rev = 0,
1154 .funcs = &vce_v3_0_ip_funcs,
1155 },
1156};
1157
961static const struct amdgpu_ip_block_version polaris11_ip_blocks[] = 1158static const struct amdgpu_ip_block_version polaris11_ip_blocks[] =
962{ 1159{
963 /* ORDER MATTERS! */ 1160 /* ORDER MATTERS! */
@@ -1026,6 +1223,74 @@ static const struct amdgpu_ip_block_version polaris11_ip_blocks[] =
1026 }, 1223 },
1027}; 1224};
1028 1225
1226static const struct amdgpu_ip_block_version polaris11_ip_blocks_vd[] =
1227{
1228 /* ORDER MATTERS! */
1229 {
1230 .type = AMD_IP_BLOCK_TYPE_COMMON,
1231 .major = 2,
1232 .minor = 0,
1233 .rev = 0,
1234 .funcs = &vi_common_ip_funcs,
1235 },
1236 {
1237 .type = AMD_IP_BLOCK_TYPE_GMC,
1238 .major = 8,
1239 .minor = 1,
1240 .rev = 0,
1241 .funcs = &gmc_v8_0_ip_funcs,
1242 },
1243 {
1244 .type = AMD_IP_BLOCK_TYPE_IH,
1245 .major = 3,
1246 .minor = 1,
1247 .rev = 0,
1248 .funcs = &tonga_ih_ip_funcs,
1249 },
1250 {
1251 .type = AMD_IP_BLOCK_TYPE_SMC,
1252 .major = 7,
1253 .minor = 2,
1254 .rev = 0,
1255 .funcs = &amdgpu_pp_ip_funcs,
1256 },
1257 {
1258 .type = AMD_IP_BLOCK_TYPE_DCE,
1259 .major = 11,
1260 .minor = 2,
1261 .rev = 0,
1262 .funcs = &dce_virtual_ip_funcs,
1263 },
1264 {
1265 .type = AMD_IP_BLOCK_TYPE_GFX,
1266 .major = 8,
1267 .minor = 0,
1268 .rev = 0,
1269 .funcs = &gfx_v8_0_ip_funcs,
1270 },
1271 {
1272 .type = AMD_IP_BLOCK_TYPE_SDMA,
1273 .major = 3,
1274 .minor = 1,
1275 .rev = 0,
1276 .funcs = &sdma_v3_0_ip_funcs,
1277 },
1278 {
1279 .type = AMD_IP_BLOCK_TYPE_UVD,
1280 .major = 6,
1281 .minor = 3,
1282 .rev = 0,
1283 .funcs = &uvd_v6_0_ip_funcs,
1284 },
1285 {
1286 .type = AMD_IP_BLOCK_TYPE_VCE,
1287 .major = 3,
1288 .minor = 4,
1289 .rev = 0,
1290 .funcs = &vce_v3_0_ip_funcs,
1291 },
1292};
1293
1029static const struct amdgpu_ip_block_version cz_ip_blocks[] = 1294static const struct amdgpu_ip_block_version cz_ip_blocks[] =
1030{ 1295{
1031 /* ORDER MATTERS! */ 1296 /* ORDER MATTERS! */
@@ -1103,34 +1368,142 @@ static const struct amdgpu_ip_block_version cz_ip_blocks[] =
1103#endif 1368#endif
1104}; 1369};
1105 1370
1371static const struct amdgpu_ip_block_version cz_ip_blocks_vd[] =
1372{
1373 /* ORDER MATTERS! */
1374 {
1375 .type = AMD_IP_BLOCK_TYPE_COMMON,
1376 .major = 2,
1377 .minor = 0,
1378 .rev = 0,
1379 .funcs = &vi_common_ip_funcs,
1380 },
1381 {
1382 .type = AMD_IP_BLOCK_TYPE_GMC,
1383 .major = 8,
1384 .minor = 0,
1385 .rev = 0,
1386 .funcs = &gmc_v8_0_ip_funcs,
1387 },
1388 {
1389 .type = AMD_IP_BLOCK_TYPE_IH,
1390 .major = 3,
1391 .minor = 0,
1392 .rev = 0,
1393 .funcs = &cz_ih_ip_funcs,
1394 },
1395 {
1396 .type = AMD_IP_BLOCK_TYPE_SMC,
1397 .major = 8,
1398 .minor = 0,
1399 .rev = 0,
1400 .funcs = &amdgpu_pp_ip_funcs
1401 },
1402 {
1403 .type = AMD_IP_BLOCK_TYPE_DCE,
1404 .major = 11,
1405 .minor = 0,
1406 .rev = 0,
1407 .funcs = &dce_virtual_ip_funcs,
1408 },
1409 {
1410 .type = AMD_IP_BLOCK_TYPE_GFX,
1411 .major = 8,
1412 .minor = 0,
1413 .rev = 0,
1414 .funcs = &gfx_v8_0_ip_funcs,
1415 },
1416 {
1417 .type = AMD_IP_BLOCK_TYPE_SDMA,
1418 .major = 3,
1419 .minor = 0,
1420 .rev = 0,
1421 .funcs = &sdma_v3_0_ip_funcs,
1422 },
1423 {
1424 .type = AMD_IP_BLOCK_TYPE_UVD,
1425 .major = 6,
1426 .minor = 0,
1427 .rev = 0,
1428 .funcs = &uvd_v6_0_ip_funcs,
1429 },
1430 {
1431 .type = AMD_IP_BLOCK_TYPE_VCE,
1432 .major = 3,
1433 .minor = 0,
1434 .rev = 0,
1435 .funcs = &vce_v3_0_ip_funcs,
1436 },
1437#if defined(CONFIG_DRM_AMD_ACP)
1438 {
1439 .type = AMD_IP_BLOCK_TYPE_ACP,
1440 .major = 2,
1441 .minor = 2,
1442 .rev = 0,
1443 .funcs = &acp_ip_funcs,
1444 },
1445#endif
1446};
1447
1106int vi_set_ip_blocks(struct amdgpu_device *adev) 1448int vi_set_ip_blocks(struct amdgpu_device *adev)
1107{ 1449{
1108 switch (adev->asic_type) { 1450 if (adev->enable_virtual_display) {
1109 case CHIP_TOPAZ: 1451 switch (adev->asic_type) {
1110 adev->ip_blocks = topaz_ip_blocks; 1452 case CHIP_TOPAZ:
1111 adev->num_ip_blocks = ARRAY_SIZE(topaz_ip_blocks); 1453 adev->ip_blocks = topaz_ip_blocks_vd;
1112 break; 1454 adev->num_ip_blocks = ARRAY_SIZE(topaz_ip_blocks_vd);
1113 case CHIP_FIJI: 1455 break;
1114 adev->ip_blocks = fiji_ip_blocks; 1456 case CHIP_FIJI:
1115 adev->num_ip_blocks = ARRAY_SIZE(fiji_ip_blocks); 1457 adev->ip_blocks = fiji_ip_blocks_vd;
1116 break; 1458 adev->num_ip_blocks = ARRAY_SIZE(fiji_ip_blocks_vd);
1117 case CHIP_TONGA: 1459 break;
1118 adev->ip_blocks = tonga_ip_blocks; 1460 case CHIP_TONGA:
1119 adev->num_ip_blocks = ARRAY_SIZE(tonga_ip_blocks); 1461 adev->ip_blocks = tonga_ip_blocks_vd;
1120 break; 1462 adev->num_ip_blocks = ARRAY_SIZE(tonga_ip_blocks_vd);
1121 case CHIP_POLARIS11: 1463 break;
1122 case CHIP_POLARIS10: 1464 case CHIP_POLARIS11:
1123 adev->ip_blocks = polaris11_ip_blocks; 1465 case CHIP_POLARIS10:
1124 adev->num_ip_blocks = ARRAY_SIZE(polaris11_ip_blocks); 1466 adev->ip_blocks = polaris11_ip_blocks_vd;
1125 break; 1467 adev->num_ip_blocks = ARRAY_SIZE(polaris11_ip_blocks_vd);
1126 case CHIP_CARRIZO: 1468 break;
1127 case CHIP_STONEY: 1469
1128 adev->ip_blocks = cz_ip_blocks; 1470 case CHIP_CARRIZO:
1129 adev->num_ip_blocks = ARRAY_SIZE(cz_ip_blocks); 1471 case CHIP_STONEY:
1130 break; 1472 adev->ip_blocks = cz_ip_blocks_vd;
1131 default: 1473 adev->num_ip_blocks = ARRAY_SIZE(cz_ip_blocks_vd);
1132 /* FIXME: not supported yet */ 1474 break;
1133 return -EINVAL; 1475 default:
1476 /* FIXME: not supported yet */
1477 return -EINVAL;
1478 }
1479 } else {
1480 switch (adev->asic_type) {
1481 case CHIP_TOPAZ:
1482 adev->ip_blocks = topaz_ip_blocks;
1483 adev->num_ip_blocks = ARRAY_SIZE(topaz_ip_blocks);
1484 break;
1485 case CHIP_FIJI:
1486 adev->ip_blocks = fiji_ip_blocks;
1487 adev->num_ip_blocks = ARRAY_SIZE(fiji_ip_blocks);
1488 break;
1489 case CHIP_TONGA:
1490 adev->ip_blocks = tonga_ip_blocks;
1491 adev->num_ip_blocks = ARRAY_SIZE(tonga_ip_blocks);
1492 break;
1493 case CHIP_POLARIS11:
1494 case CHIP_POLARIS10:
1495 adev->ip_blocks = polaris11_ip_blocks;
1496 adev->num_ip_blocks = ARRAY_SIZE(polaris11_ip_blocks);
1497 break;
1498 case CHIP_CARRIZO:
1499 case CHIP_STONEY:
1500 adev->ip_blocks = cz_ip_blocks;
1501 adev->num_ip_blocks = ARRAY_SIZE(cz_ip_blocks);
1502 break;
1503 default:
1504 /* FIXME: not supported yet */
1505 return -EINVAL;
1506 }
1134 } 1507 }
1135 1508
1136 return 0; 1509 return 0;
@@ -1154,13 +1527,13 @@ static const struct amdgpu_asic_funcs vi_asic_funcs =
1154{ 1527{
1155 .read_disabled_bios = &vi_read_disabled_bios, 1528 .read_disabled_bios = &vi_read_disabled_bios,
1156 .read_bios_from_rom = &vi_read_bios_from_rom, 1529 .read_bios_from_rom = &vi_read_bios_from_rom,
1530 .detect_hw_virtualization = vi_detect_hw_virtualization,
1157 .read_register = &vi_read_register, 1531 .read_register = &vi_read_register,
1158 .reset = &vi_asic_reset, 1532 .reset = &vi_asic_reset,
1159 .set_vga_state = &vi_vga_set_state, 1533 .set_vga_state = &vi_vga_set_state,
1160 .get_xclk = &vi_get_xclk, 1534 .get_xclk = &vi_get_xclk,
1161 .set_uvd_clocks = &vi_set_uvd_clocks, 1535 .set_uvd_clocks = &vi_set_uvd_clocks,
1162 .set_vce_clocks = &vi_set_vce_clocks, 1536 .set_vce_clocks = &vi_set_vce_clocks,
1163 .get_virtual_caps = &vi_get_virtual_caps,
1164}; 1537};
1165 1538
1166static int vi_common_early_init(void *handle) 1539static int vi_common_early_init(void *handle)
@@ -1248,8 +1621,17 @@ static int vi_common_early_init(void *handle)
1248 AMD_CG_SUPPORT_HDP_MGCG | 1621 AMD_CG_SUPPORT_HDP_MGCG |
1249 AMD_CG_SUPPORT_HDP_LS | 1622 AMD_CG_SUPPORT_HDP_LS |
1250 AMD_CG_SUPPORT_SDMA_MGCG | 1623 AMD_CG_SUPPORT_SDMA_MGCG |
1251 AMD_CG_SUPPORT_SDMA_LS; 1624 AMD_CG_SUPPORT_SDMA_LS |
1625 AMD_CG_SUPPORT_VCE_MGCG;
1626 /* rev0 hardware requires workarounds to support PG */
1252 adev->pg_flags = 0; 1627 adev->pg_flags = 0;
1628 if (adev->rev_id != 0x00) {
1629 adev->pg_flags |= AMD_PG_SUPPORT_GFX_PG |
1630 AMD_PG_SUPPORT_GFX_SMG |
1631 AMD_PG_SUPPORT_GFX_PIPELINE |
1632 AMD_PG_SUPPORT_UVD |
1633 AMD_PG_SUPPORT_VCE;
1634 }
1253 adev->external_rev_id = adev->rev_id + 0x1; 1635 adev->external_rev_id = adev->rev_id + 0x1;
1254 break; 1636 break;
1255 case CHIP_STONEY: 1637 case CHIP_STONEY:
@@ -1267,14 +1649,24 @@ static int vi_common_early_init(void *handle)
1267 AMD_CG_SUPPORT_HDP_MGCG | 1649 AMD_CG_SUPPORT_HDP_MGCG |
1268 AMD_CG_SUPPORT_HDP_LS | 1650 AMD_CG_SUPPORT_HDP_LS |
1269 AMD_CG_SUPPORT_SDMA_MGCG | 1651 AMD_CG_SUPPORT_SDMA_MGCG |
1270 AMD_CG_SUPPORT_SDMA_LS; 1652 AMD_CG_SUPPORT_SDMA_LS |
1271 adev->external_rev_id = adev->rev_id + 0x1; 1653 AMD_CG_SUPPORT_VCE_MGCG;
1654 adev->pg_flags |= AMD_PG_SUPPORT_GFX_PG |
1655 AMD_PG_SUPPORT_GFX_SMG |
1656 AMD_PG_SUPPORT_GFX_PIPELINE |
1657 AMD_PG_SUPPORT_UVD |
1658 AMD_PG_SUPPORT_VCE;
1659 adev->external_rev_id = adev->rev_id + 0x61;
1272 break; 1660 break;
1273 default: 1661 default:
1274 /* FIXME: not supported yet */ 1662 /* FIXME: not supported yet */
1275 return -EINVAL; 1663 return -EINVAL;
1276 } 1664 }
1277 1665
1666 /* in early init stage, vbios code won't work */
1667 if (adev->asic_funcs->detect_hw_virtualization)
1668 amdgpu_asic_detect_hw_virtualization(adev);
1669
1278 if (amdgpu_smc_load_fw && smc_enabled) 1670 if (amdgpu_smc_load_fw && smc_enabled)
1279 adev->firmware.smu_load = true; 1671 adev->firmware.smu_load = true;
1280 1672
@@ -1418,6 +1810,63 @@ static void vi_update_rom_medium_grain_clock_gating(struct amdgpu_device *adev,
1418 WREG32_SMC(ixCGTT_ROM_CLK_CTRL0, data); 1810 WREG32_SMC(ixCGTT_ROM_CLK_CTRL0, data);
1419} 1811}
1420 1812
1813static int vi_common_set_clockgating_state_by_smu(void *handle,
1814 enum amd_clockgating_state state)
1815{
1816 uint32_t msg_id, pp_state;
1817 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1818 void *pp_handle = adev->powerplay.pp_handle;
1819
1820 if (state == AMD_CG_STATE_UNGATE)
1821 pp_state = 0;
1822 else
1823 pp_state = PP_STATE_CG | PP_STATE_LS;
1824
1825 msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
1826 PP_BLOCK_SYS_MC,
1827 PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
1828 pp_state);
1829 amd_set_clockgating_by_smu(pp_handle, msg_id);
1830
1831 msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
1832 PP_BLOCK_SYS_SDMA,
1833 PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
1834 pp_state);
1835 amd_set_clockgating_by_smu(pp_handle, msg_id);
1836
1837 msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
1838 PP_BLOCK_SYS_HDP,
1839 PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
1840 pp_state);
1841 amd_set_clockgating_by_smu(pp_handle, msg_id);
1842
1843 msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
1844 PP_BLOCK_SYS_BIF,
1845 PP_STATE_SUPPORT_LS,
1846 pp_state);
1847 amd_set_clockgating_by_smu(pp_handle, msg_id);
1848
1849 msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
1850 PP_BLOCK_SYS_BIF,
1851 PP_STATE_SUPPORT_CG,
1852 pp_state);
1853 amd_set_clockgating_by_smu(pp_handle, msg_id);
1854
1855 msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
1856 PP_BLOCK_SYS_DRM,
1857 PP_STATE_SUPPORT_LS,
1858 pp_state);
1859 amd_set_clockgating_by_smu(pp_handle, msg_id);
1860
1861 msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
1862 PP_BLOCK_SYS_ROM,
1863 PP_STATE_SUPPORT_CG,
1864 pp_state);
1865 amd_set_clockgating_by_smu(pp_handle, msg_id);
1866
1867 return 0;
1868}
1869
1421static int vi_common_set_clockgating_state(void *handle, 1870static int vi_common_set_clockgating_state(void *handle,
1422 enum amd_clockgating_state state) 1871 enum amd_clockgating_state state)
1423{ 1872{
@@ -1443,6 +1892,10 @@ static int vi_common_set_clockgating_state(void *handle,
1443 vi_update_hdp_light_sleep(adev, 1892 vi_update_hdp_light_sleep(adev,
1444 state == AMD_CG_STATE_GATE ? true : false); 1893 state == AMD_CG_STATE_GATE ? true : false);
1445 break; 1894 break;
1895 case CHIP_TONGA:
1896 case CHIP_POLARIS10:
1897 case CHIP_POLARIS11:
1898 vi_common_set_clockgating_state_by_smu(adev, state);
1446 default: 1899 default:
1447 break; 1900 break;
1448 } 1901 }
diff --git a/drivers/gpu/drm/amd/amdgpu/vid.h b/drivers/gpu/drm/amd/amdgpu/vid.h
index 062ee1676480..11746f22d0c5 100644
--- a/drivers/gpu/drm/amd/amdgpu/vid.h
+++ b/drivers/gpu/drm/amd/amdgpu/vid.h
@@ -369,4 +369,45 @@
369#define VCE_CMD_IB_AUTO 0x00000005 369#define VCE_CMD_IB_AUTO 0x00000005
370#define VCE_CMD_SEMAPHORE 0x00000006 370#define VCE_CMD_SEMAPHORE 0x00000006
371 371
372#define VCE_CMD_IB_VM 0x00000102
373#define VCE_CMD_WAIT_GE 0x00000106
374#define VCE_CMD_UPDATE_PTB 0x00000107
375#define VCE_CMD_FLUSH_TLB 0x00000108
376
377/* mmPA_SC_RASTER_CONFIG mask */
378#define RB_MAP_PKR0(x) ((x) << 0)
379#define RB_MAP_PKR0_MASK (0x3 << 0)
380#define RB_MAP_PKR1(x) ((x) << 2)
381#define RB_MAP_PKR1_MASK (0x3 << 2)
382#define RB_XSEL2(x) ((x) << 4)
383#define RB_XSEL2_MASK (0x3 << 4)
384#define RB_XSEL (1 << 6)
385#define RB_YSEL (1 << 7)
386#define PKR_MAP(x) ((x) << 8)
387#define PKR_MAP_MASK (0x3 << 8)
388#define PKR_XSEL(x) ((x) << 10)
389#define PKR_XSEL_MASK (0x3 << 10)
390#define PKR_YSEL(x) ((x) << 12)
391#define PKR_YSEL_MASK (0x3 << 12)
392#define SC_MAP(x) ((x) << 16)
393#define SC_MAP_MASK (0x3 << 16)
394#define SC_XSEL(x) ((x) << 18)
395#define SC_XSEL_MASK (0x3 << 18)
396#define SC_YSEL(x) ((x) << 20)
397#define SC_YSEL_MASK (0x3 << 20)
398#define SE_MAP(x) ((x) << 24)
399#define SE_MAP_MASK (0x3 << 24)
400#define SE_XSEL(x) ((x) << 26)
401#define SE_XSEL_MASK (0x3 << 26)
402#define SE_YSEL(x) ((x) << 28)
403#define SE_YSEL_MASK (0x3 << 28)
404
405/* mmPA_SC_RASTER_CONFIG_1 mask */
406#define SE_PAIR_MAP(x) ((x) << 0)
407#define SE_PAIR_MAP_MASK (0x3 << 0)
408#define SE_PAIR_XSEL(x) ((x) << 2)
409#define SE_PAIR_XSEL_MASK (0x3 << 2)
410#define SE_PAIR_YSEL(x) ((x) << 4)
411#define SE_PAIR_YSEL_MASK (0x3 << 4)
412
372#endif 413#endif