xref: /linux/drivers/gpu/drm/radeon/smu7.h (revision a23e1966932464e1c5226cb9ac4ce1d5fc10ba22)
141a524abSAlex Deucher /*
241a524abSAlex Deucher  * Copyright 2013 Advanced Micro Devices, Inc.
341a524abSAlex Deucher  *
441a524abSAlex Deucher  * Permission is hereby granted, free of charge, to any person obtaining a
541a524abSAlex Deucher  * copy of this software and associated documentation files (the "Software"),
641a524abSAlex Deucher  * to deal in the Software without restriction, including without limitation
741a524abSAlex Deucher  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
841a524abSAlex Deucher  * and/or sell copies of the Software, and to permit persons to whom the
941a524abSAlex Deucher  * Software is furnished to do so, subject to the following conditions:
1041a524abSAlex Deucher  *
1141a524abSAlex Deucher  * The above copyright notice and this permission notice shall be included in
1241a524abSAlex Deucher  * all copies or substantial portions of the Software.
1341a524abSAlex Deucher  *
1441a524abSAlex Deucher  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1541a524abSAlex Deucher  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1641a524abSAlex Deucher  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1741a524abSAlex Deucher  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
1841a524abSAlex Deucher  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
1941a524abSAlex Deucher  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2041a524abSAlex Deucher  * OTHER DEALINGS IN THE SOFTWARE.
2141a524abSAlex Deucher  *
2241a524abSAlex Deucher  */
2341a524abSAlex Deucher 
2441a524abSAlex Deucher #ifndef SMU7_H
2541a524abSAlex Deucher #define SMU7_H
2641a524abSAlex Deucher 
2741a524abSAlex Deucher #pragma pack(push, 1)
2841a524abSAlex Deucher 
2941a524abSAlex Deucher #define SMU7_CONTEXT_ID_SMC        1
3041a524abSAlex Deucher #define SMU7_CONTEXT_ID_VBIOS      2
3141a524abSAlex Deucher 
3241a524abSAlex Deucher 
3341a524abSAlex Deucher #define SMU7_CONTEXT_ID_SMC        1
3441a524abSAlex Deucher #define SMU7_CONTEXT_ID_VBIOS      2
3541a524abSAlex Deucher 
3641a524abSAlex Deucher #define SMU7_MAX_LEVELS_VDDC            8
3741a524abSAlex Deucher #define SMU7_MAX_LEVELS_VDDCI           4
3841a524abSAlex Deucher #define SMU7_MAX_LEVELS_MVDD            4
3941a524abSAlex Deucher #define SMU7_MAX_LEVELS_VDDNB           8
4041a524abSAlex Deucher 
4141a524abSAlex Deucher #define SMU7_MAX_LEVELS_GRAPHICS        SMU__NUM_SCLK_DPM_STATE   // SCLK + SQ DPM + ULV
4241a524abSAlex Deucher #define SMU7_MAX_LEVELS_MEMORY          SMU__NUM_MCLK_DPM_LEVELS   // MCLK Levels DPM
4341a524abSAlex Deucher #define SMU7_MAX_LEVELS_GIO             SMU__NUM_LCLK_DPM_LEVELS  // LCLK Levels
4441a524abSAlex Deucher #define SMU7_MAX_LEVELS_LINK            SMU__NUM_PCIE_DPM_LEVELS  // PCIe speed and number of lanes.
4541a524abSAlex Deucher #define SMU7_MAX_LEVELS_UVD             8   // VCLK/DCLK levels for UVD.
4641a524abSAlex Deucher #define SMU7_MAX_LEVELS_VCE             8   // ECLK levels for VCE.
4741a524abSAlex Deucher #define SMU7_MAX_LEVELS_ACP             8   // ACLK levels for ACP.
4841a524abSAlex Deucher #define SMU7_MAX_LEVELS_SAMU            8   // SAMCLK levels for SAMU.
4941a524abSAlex Deucher #define SMU7_MAX_ENTRIES_SMIO           32  // Number of entries in SMIO table.
5041a524abSAlex Deucher 
5141a524abSAlex Deucher #define DPM_NO_LIMIT 0
5241a524abSAlex Deucher #define DPM_NO_UP 1
5341a524abSAlex Deucher #define DPM_GO_DOWN 2
5441a524abSAlex Deucher #define DPM_GO_UP 3
5541a524abSAlex Deucher 
5641a524abSAlex Deucher #define SMU7_FIRST_DPM_GRAPHICS_LEVEL    0
5741a524abSAlex Deucher #define SMU7_FIRST_DPM_MEMORY_LEVEL      0
5841a524abSAlex Deucher 
5941a524abSAlex Deucher #define GPIO_CLAMP_MODE_VRHOT      1
6041a524abSAlex Deucher #define GPIO_CLAMP_MODE_THERM      2
6141a524abSAlex Deucher #define GPIO_CLAMP_MODE_DC         4
6241a524abSAlex Deucher 
6341a524abSAlex Deucher #define SCRATCH_B_TARG_PCIE_INDEX_SHIFT 0
6441a524abSAlex Deucher #define SCRATCH_B_TARG_PCIE_INDEX_MASK  (0x7<<SCRATCH_B_TARG_PCIE_INDEX_SHIFT)
6541a524abSAlex Deucher #define SCRATCH_B_CURR_PCIE_INDEX_SHIFT 3
6641a524abSAlex Deucher #define SCRATCH_B_CURR_PCIE_INDEX_MASK  (0x7<<SCRATCH_B_CURR_PCIE_INDEX_SHIFT)
6741a524abSAlex Deucher #define SCRATCH_B_TARG_UVD_INDEX_SHIFT  6
6841a524abSAlex Deucher #define SCRATCH_B_TARG_UVD_INDEX_MASK   (0x7<<SCRATCH_B_TARG_UVD_INDEX_SHIFT)
6941a524abSAlex Deucher #define SCRATCH_B_CURR_UVD_INDEX_SHIFT  9
7041a524abSAlex Deucher #define SCRATCH_B_CURR_UVD_INDEX_MASK   (0x7<<SCRATCH_B_CURR_UVD_INDEX_SHIFT)
7141a524abSAlex Deucher #define SCRATCH_B_TARG_VCE_INDEX_SHIFT  12
7241a524abSAlex Deucher #define SCRATCH_B_TARG_VCE_INDEX_MASK   (0x7<<SCRATCH_B_TARG_VCE_INDEX_SHIFT)
7341a524abSAlex Deucher #define SCRATCH_B_CURR_VCE_INDEX_SHIFT  15
7441a524abSAlex Deucher #define SCRATCH_B_CURR_VCE_INDEX_MASK   (0x7<<SCRATCH_B_CURR_VCE_INDEX_SHIFT)
7541a524abSAlex Deucher #define SCRATCH_B_TARG_ACP_INDEX_SHIFT  18
7641a524abSAlex Deucher #define SCRATCH_B_TARG_ACP_INDEX_MASK   (0x7<<SCRATCH_B_TARG_ACP_INDEX_SHIFT)
7741a524abSAlex Deucher #define SCRATCH_B_CURR_ACP_INDEX_SHIFT  21
7841a524abSAlex Deucher #define SCRATCH_B_CURR_ACP_INDEX_MASK   (0x7<<SCRATCH_B_CURR_ACP_INDEX_SHIFT)
7941a524abSAlex Deucher #define SCRATCH_B_TARG_SAMU_INDEX_SHIFT 24
8041a524abSAlex Deucher #define SCRATCH_B_TARG_SAMU_INDEX_MASK  (0x7<<SCRATCH_B_TARG_SAMU_INDEX_SHIFT)
8141a524abSAlex Deucher #define SCRATCH_B_CURR_SAMU_INDEX_SHIFT 27
8241a524abSAlex Deucher #define SCRATCH_B_CURR_SAMU_INDEX_MASK  (0x7<<SCRATCH_B_CURR_SAMU_INDEX_SHIFT)
8341a524abSAlex Deucher 
8441a524abSAlex Deucher 
853af3497fSGuoHua Chen struct SMU7_PIDController {
8641a524abSAlex Deucher     uint32_t Ki;
8741a524abSAlex Deucher     int32_t LFWindupUL;
8841a524abSAlex Deucher     int32_t LFWindupLL;
8941a524abSAlex Deucher     uint32_t StatePrecision;
9041a524abSAlex Deucher     uint32_t LfPrecision;
9141a524abSAlex Deucher     uint32_t LfOffset;
9241a524abSAlex Deucher     uint32_t MaxState;
9341a524abSAlex Deucher     uint32_t MaxLfFraction;
9441a524abSAlex Deucher     uint32_t StateShift;
9541a524abSAlex Deucher };
9641a524abSAlex Deucher 
9741a524abSAlex Deucher typedef struct SMU7_PIDController SMU7_PIDController;
9841a524abSAlex Deucher 
9941a524abSAlex Deucher // -------------------------------------------------------------------------------------------------------------------------
10041a524abSAlex Deucher #define SMU7_MAX_PCIE_LINK_SPEEDS 3 /* 0:Gen1 1:Gen2 2:Gen3 */
10141a524abSAlex Deucher 
10241a524abSAlex Deucher #define SMU7_SCLK_DPM_CONFIG_MASK                        0x01
10341a524abSAlex Deucher #define SMU7_VOLTAGE_CONTROLLER_CONFIG_MASK              0x02
10441a524abSAlex Deucher #define SMU7_THERMAL_CONTROLLER_CONFIG_MASK              0x04
10541a524abSAlex Deucher #define SMU7_MCLK_DPM_CONFIG_MASK                        0x08
10641a524abSAlex Deucher #define SMU7_UVD_DPM_CONFIG_MASK                         0x10
10741a524abSAlex Deucher #define SMU7_VCE_DPM_CONFIG_MASK                         0x20
10841a524abSAlex Deucher #define SMU7_ACP_DPM_CONFIG_MASK                         0x40
10941a524abSAlex Deucher #define SMU7_SAMU_DPM_CONFIG_MASK                        0x80
11041a524abSAlex Deucher #define SMU7_PCIEGEN_DPM_CONFIG_MASK                    0x100
11141a524abSAlex Deucher 
11241a524abSAlex Deucher #define SMU7_ACP_MCLK_HANDSHAKE_DISABLE                  0x00000001
11341a524abSAlex Deucher #define SMU7_ACP_SCLK_HANDSHAKE_DISABLE                  0x00000002
11441a524abSAlex Deucher #define SMU7_UVD_MCLK_HANDSHAKE_DISABLE                  0x00000100
11541a524abSAlex Deucher #define SMU7_UVD_SCLK_HANDSHAKE_DISABLE                  0x00000200
11641a524abSAlex Deucher #define SMU7_VCE_MCLK_HANDSHAKE_DISABLE                  0x00010000
11741a524abSAlex Deucher #define SMU7_VCE_SCLK_HANDSHAKE_DISABLE                  0x00020000
11841a524abSAlex Deucher 
1193af3497fSGuoHua Chen struct SMU7_Firmware_Header {
12041a524abSAlex Deucher     uint32_t Digest[5];
12141a524abSAlex Deucher     uint32_t Version;
12241a524abSAlex Deucher     uint32_t HeaderSize;
12341a524abSAlex Deucher     uint32_t Flags;
12441a524abSAlex Deucher     uint32_t EntryPoint;
12541a524abSAlex Deucher     uint32_t CodeSize;
12641a524abSAlex Deucher     uint32_t ImageSize;
12741a524abSAlex Deucher 
12841a524abSAlex Deucher     uint32_t Rtos;
12941a524abSAlex Deucher     uint32_t SoftRegisters;
13041a524abSAlex Deucher     uint32_t DpmTable;
13141a524abSAlex Deucher     uint32_t FanTable;
13241a524abSAlex Deucher     uint32_t CacConfigTable;
13341a524abSAlex Deucher     uint32_t CacStatusTable;
13441a524abSAlex Deucher 
13541a524abSAlex Deucher     uint32_t mcRegisterTable;
13641a524abSAlex Deucher 
13741a524abSAlex Deucher     uint32_t mcArbDramTimingTable;
13841a524abSAlex Deucher 
13941a524abSAlex Deucher     uint32_t PmFuseTable;
14041a524abSAlex Deucher     uint32_t Globals;
14141a524abSAlex Deucher     uint32_t Reserved[42];
14241a524abSAlex Deucher     uint32_t Signature;
14341a524abSAlex Deucher };
14441a524abSAlex Deucher 
14541a524abSAlex Deucher typedef struct SMU7_Firmware_Header SMU7_Firmware_Header;
14641a524abSAlex Deucher 
14741a524abSAlex Deucher #define SMU7_FIRMWARE_HEADER_LOCATION 0x20000
14841a524abSAlex Deucher 
14941a524abSAlex Deucher enum  DisplayConfig {
15041a524abSAlex Deucher     PowerDown = 1,
15141a524abSAlex Deucher     DP54x4,
15241a524abSAlex Deucher     DP54x2,
15341a524abSAlex Deucher     DP54x1,
15441a524abSAlex Deucher     DP27x4,
15541a524abSAlex Deucher     DP27x2,
15641a524abSAlex Deucher     DP27x1,
15741a524abSAlex Deucher     HDMI297,
15841a524abSAlex Deucher     HDMI162,
15941a524abSAlex Deucher     LVDS,
16041a524abSAlex Deucher     DP324x4,
16141a524abSAlex Deucher     DP324x2,
16241a524abSAlex Deucher     DP324x1
16341a524abSAlex Deucher };
16441a524abSAlex Deucher 
16541a524abSAlex Deucher #pragma pack(pop)
16641a524abSAlex Deucher 
16741a524abSAlex Deucher #endif
16841a524abSAlex Deucher 
169