drm fixes for 5.13-rc1
two MAINTAINERS updates. amdgpu: - Fixes for flexible array conversions - Fix sysfs attribute init - Harvesting fixes - VCN CG/PG fixes for Picasso radeon: - Fixes for flexible array conversions - Fix for flickering on Oland with multiple 4K displays vc4: - drop an used function -----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJgneCaAAoJEAx081l5xIa+F+wP+wSg9t3IKkev8dcyHkHXHHyO k7o4SCxXZ8KCNo9uOj2r6N8k45RQJYMYFZxxlMMex/cfGcHIBUkTVdL/6cz1Ks3i Ou/CLlij9k2irBi0LGV+BcDPs3ud4DBQpP0i9RWzecvJDt0tiXnmmzIdhyDaG4HV daYV4qVuF/GBmKpyAOtHT6OXgU4g8GjYjeTA+WrEJgMLJvY7qQiRgsoz4Fwog4hi e2ALZkEPqxrszBQ3Xsl/LPhlMZ/5oVs/+JSQEsL0UM88w7TTf4dCOefFlPw05fQ8 N4T0iOIBoMWQ0SnMOEiIZxJqtt4v/eQy7GgeI7DOCxx6Z4Bc8ALSDJAaqaK+xdNQ AXyJSMlg5K/r7sCkP1nQjWP6j9tWHf82kDNoHNceVspa3+eLJ3MDzWZ6PYXsJQ+q CKT+ov0AkZZfQgafHWA+vUEIcWGeVVI1yla0TJbqf0ZvmSYo5Qr+NsS5kYLHGleE 38KYuj09mcfg3zWY9tHcZXDNEeRwLqIAOX2hy37XtwAri8QOW5ZA19KoH9Y3ZRUE s7fvAI9raHmOo0O79wGKa89k6ggDbUkC7oT9lzqCQQ005VlmfKsGNtwwvGIMkabW 9NneHx0n6+uvb1NIkTU3qP9wsbIA2hzk2iDp1zeOY2U8cGhyjFgm7apc/JyCVzsG XKHR8awHEEvC81txicI6 =iwKz -----END PGP SIGNATURE----- Merge tag 'drm-fixes-2021-05-14' of git://anongit.freedesktop.org/drm/drm Pull drm fixes from Dave Airlie: "Not much here, mostly amdgpu fixes, with a couple of radeon, and a cosmetic vc4. Two MAINTAINERS file updates also. amdgpu: - Fixes for flexible array conversions - Fix sysfs attribute init - Harvesting fixes - VCN CG/PG fixes for Picasso radeon: - Fixes for flexible array conversions - Fix for flickering on Oland with multiple 4K displays vc4: - drop unused function" * tag 'drm-fixes-2021-05-14' of git://anongit.freedesktop.org/drm/drm: drm/amdgpu: update vcn1.0 Non-DPG suspend sequence drm/amdgpu: set vcn mgcg flag for picasso drm/radeon/dpm: Disable sclk switching on Oland when two 4K 60Hz monitors are connected drm/amdgpu: update the method for harvest IP for specific SKU drm/amdgpu: add judgement when add ip blocks (v2) drm/amd/display: Initialize attribute for hdcp_srm sysfs file drm/amd/pm: Fix out-of-bounds bug drm/radeon/si_dpm: Fix SMU power state load drm/radeon/ni_dpm: Fix booting bug MAINTAINERS: Update address for Emma Anholt MAINTAINERS: Update my e-mail drm/vc4: remove unused function drm/ttm: Do not add non-system domain BO into swap list
This commit is contained in:
commit
b5304a4f9a
1
.mailmap
1
.mailmap
@ -160,6 +160,7 @@ Jeff Layton <jlayton@kernel.org> <jlayton@primarydata.com>
|
||||
Jeff Layton <jlayton@kernel.org> <jlayton@redhat.com>
|
||||
Jens Axboe <axboe@suse.de>
|
||||
Jens Osterkamp <Jens.Osterkamp@de.ibm.com>
|
||||
Jernej Skrabec <jernej.skrabec@gmail.com> <jernej.skrabec@siol.net>
|
||||
Jiri Slaby <jirislaby@kernel.org> <jirislaby@gmail.com>
|
||||
Jiri Slaby <jirislaby@kernel.org> <jslaby@novell.com>
|
||||
Jiri Slaby <jirislaby@kernel.org> <jslaby@suse.com>
|
||||
|
18
MAINTAINERS
18
MAINTAINERS
@ -1578,7 +1578,7 @@ F: drivers/clk/sunxi/
|
||||
ARM/Allwinner sunXi SoC support
|
||||
M: Maxime Ripard <mripard@kernel.org>
|
||||
M: Chen-Yu Tsai <wens@csie.org>
|
||||
R: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
R: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux.git
|
||||
@ -5089,7 +5089,7 @@ S: Maintained
|
||||
F: drivers/net/fddi/defza.*
|
||||
|
||||
DEINTERLACE DRIVERS FOR ALLWINNER H3
|
||||
M: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
M: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
@ -5632,14 +5632,14 @@ F: include/linux/power/smartreflex.h
|
||||
DRM DRIVER FOR ALLWINNER DE2 AND DE3 ENGINE
|
||||
M: Maxime Ripard <mripard@kernel.org>
|
||||
M: Chen-Yu Tsai <wens@csie.org>
|
||||
R: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
R: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
L: dri-devel@lists.freedesktop.org
|
||||
S: Supported
|
||||
T: git git://anongit.freedesktop.org/drm/drm-misc
|
||||
F: drivers/gpu/drm/sun4i/sun8i*
|
||||
|
||||
DRM DRIVER FOR ARM PL111 CLCD
|
||||
M: Eric Anholt <eric@anholt.net>
|
||||
M: Emma Anholt <emma@anholt.net>
|
||||
S: Supported
|
||||
T: git git://anongit.freedesktop.org/drm/drm-misc
|
||||
F: drivers/gpu/drm/pl111/
|
||||
@ -5719,7 +5719,7 @@ T: git git://anongit.freedesktop.org/drm/drm-misc
|
||||
F: drivers/gpu/drm/tiny/gm12u320.c
|
||||
|
||||
DRM DRIVER FOR HX8357D PANELS
|
||||
M: Eric Anholt <eric@anholt.net>
|
||||
M: Emma Anholt <emma@anholt.net>
|
||||
S: Maintained
|
||||
T: git git://anongit.freedesktop.org/drm/drm-misc
|
||||
F: Documentation/devicetree/bindings/display/himax,hx8357d.txt
|
||||
@ -6023,7 +6023,7 @@ M: Neil Armstrong <narmstrong@baylibre.com>
|
||||
M: Robert Foss <robert.foss@linaro.org>
|
||||
R: Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
|
||||
R: Jonas Karlman <jonas@kwiboo.se>
|
||||
R: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
R: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
S: Maintained
|
||||
T: git git://anongit.freedesktop.org/drm/drm-misc
|
||||
F: drivers/gpu/drm/bridge/
|
||||
@ -6177,7 +6177,7 @@ F: Documentation/devicetree/bindings/display/ti/
|
||||
F: drivers/gpu/drm/omapdrm/
|
||||
|
||||
DRM DRIVERS FOR V3D
|
||||
M: Eric Anholt <eric@anholt.net>
|
||||
M: Emma Anholt <emma@anholt.net>
|
||||
S: Supported
|
||||
T: git git://anongit.freedesktop.org/drm/drm-misc
|
||||
F: Documentation/devicetree/bindings/gpu/brcm,bcm-v3d.yaml
|
||||
@ -6185,7 +6185,7 @@ F: drivers/gpu/drm/v3d/
|
||||
F: include/uapi/drm/v3d_drm.h
|
||||
|
||||
DRM DRIVERS FOR VC4
|
||||
M: Eric Anholt <eric@anholt.net>
|
||||
M: Emma Anholt <emma@anholt.net>
|
||||
M: Maxime Ripard <mripard@kernel.org>
|
||||
S: Supported
|
||||
T: git git://github.com/anholt/linux
|
||||
@ -15815,7 +15815,7 @@ F: include/uapi/linux/rose.h
|
||||
F: net/rose/
|
||||
|
||||
ROTATION DRIVER FOR ALLWINNER A83T
|
||||
M: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
M: Jernej Skrabec <jernej.skrabec@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
|
@ -1006,6 +1006,7 @@ struct amdgpu_device {
|
||||
struct amdgpu_df df;
|
||||
|
||||
struct amdgpu_ip_block ip_blocks[AMDGPU_MAX_IP_NUM];
|
||||
uint32_t harvest_ip_mask;
|
||||
int num_ip_blocks;
|
||||
struct mutex mn_lock;
|
||||
DECLARE_HASHTABLE(mn_hash, 7);
|
||||
|
@ -1683,6 +1683,19 @@ int amdgpu_device_ip_block_add(struct amdgpu_device *adev,
|
||||
if (!ip_block_version)
|
||||
return -EINVAL;
|
||||
|
||||
switch (ip_block_version->type) {
|
||||
case AMD_IP_BLOCK_TYPE_VCN:
|
||||
if (adev->harvest_ip_mask & AMD_HARVEST_IP_VCN_MASK)
|
||||
return 0;
|
||||
break;
|
||||
case AMD_IP_BLOCK_TYPE_JPEG:
|
||||
if (adev->harvest_ip_mask & AMD_HARVEST_IP_JPEG_MASK)
|
||||
return 0;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
DRM_INFO("add ip block number %d <%s>\n", adev->num_ip_blocks,
|
||||
ip_block_version->funcs->name);
|
||||
|
||||
@ -3111,7 +3124,6 @@ bool amdgpu_device_has_dc_support(struct amdgpu_device *adev)
|
||||
return amdgpu_device_asic_has_dc_support(adev->asic_type);
|
||||
}
|
||||
|
||||
|
||||
static void amdgpu_device_xgmi_reset_func(struct work_struct *__work)
|
||||
{
|
||||
struct amdgpu_device *adev =
|
||||
@ -3276,6 +3288,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
|
||||
adev->vm_manager.vm_pte_funcs = NULL;
|
||||
adev->vm_manager.vm_pte_num_scheds = 0;
|
||||
adev->gmc.gmc_funcs = NULL;
|
||||
adev->harvest_ip_mask = 0x0;
|
||||
adev->fence_context = dma_fence_context_alloc(AMDGPU_MAX_RINGS);
|
||||
bitmap_zero(adev->gfx.pipe_reserve_bitmap, AMDGPU_MAX_COMPUTE_QUEUES);
|
||||
|
||||
|
@ -373,6 +373,34 @@ int amdgpu_discovery_get_ip_version(struct amdgpu_device *adev, int hw_id,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
void amdgpu_discovery_harvest_ip(struct amdgpu_device *adev)
|
||||
{
|
||||
struct binary_header *bhdr;
|
||||
struct harvest_table *harvest_info;
|
||||
int i;
|
||||
|
||||
bhdr = (struct binary_header *)adev->mman.discovery_bin;
|
||||
harvest_info = (struct harvest_table *)(adev->mman.discovery_bin +
|
||||
le16_to_cpu(bhdr->table_list[HARVEST_INFO].offset));
|
||||
|
||||
for (i = 0; i < 32; i++) {
|
||||
if (le32_to_cpu(harvest_info->list[i].hw_id) == 0)
|
||||
break;
|
||||
|
||||
switch (le32_to_cpu(harvest_info->list[i].hw_id)) {
|
||||
case VCN_HWID:
|
||||
adev->harvest_ip_mask |= AMD_HARVEST_IP_VCN_MASK;
|
||||
adev->harvest_ip_mask |= AMD_HARVEST_IP_JPEG_MASK;
|
||||
break;
|
||||
case DMU_HWID:
|
||||
adev->harvest_ip_mask |= AMD_HARVEST_IP_DMU_MASK;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int amdgpu_discovery_get_gfx_info(struct amdgpu_device *adev)
|
||||
{
|
||||
struct binary_header *bhdr;
|
||||
|
@ -29,6 +29,7 @@
|
||||
|
||||
void amdgpu_discovery_fini(struct amdgpu_device *adev);
|
||||
int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev);
|
||||
void amdgpu_discovery_harvest_ip(struct amdgpu_device *adev);
|
||||
int amdgpu_discovery_get_ip_version(struct amdgpu_device *adev, int hw_id,
|
||||
int *major, int *minor, int *revision);
|
||||
int amdgpu_discovery_get_gfx_info(struct amdgpu_device *adev);
|
||||
|
@ -623,6 +623,16 @@ static const struct amdgpu_ip_block_version nv_common_ip_block =
|
||||
.funcs = &nv_common_ip_funcs,
|
||||
};
|
||||
|
||||
static bool nv_is_headless_sku(struct pci_dev *pdev)
|
||||
{
|
||||
if ((pdev->device == 0x731E &&
|
||||
(pdev->revision == 0xC6 || pdev->revision == 0xC7)) ||
|
||||
(pdev->device == 0x7340 && pdev->revision == 0xC9) ||
|
||||
(pdev->device == 0x7360 && pdev->revision == 0xC7))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static int nv_reg_base_init(struct amdgpu_device *adev)
|
||||
{
|
||||
int r;
|
||||
@ -635,6 +645,12 @@ static int nv_reg_base_init(struct amdgpu_device *adev)
|
||||
goto legacy_init;
|
||||
}
|
||||
|
||||
amdgpu_discovery_harvest_ip(adev);
|
||||
if (nv_is_headless_sku(adev->pdev)) {
|
||||
adev->harvest_ip_mask |= AMD_HARVEST_IP_VCN_MASK;
|
||||
adev->harvest_ip_mask |= AMD_HARVEST_IP_JPEG_MASK;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -671,16 +687,6 @@ void nv_set_virt_ops(struct amdgpu_device *adev)
|
||||
adev->virt.ops = &xgpu_nv_virt_ops;
|
||||
}
|
||||
|
||||
static bool nv_is_headless_sku(struct pci_dev *pdev)
|
||||
{
|
||||
if ((pdev->device == 0x731E &&
|
||||
(pdev->revision == 0xC6 || pdev->revision == 0xC7)) ||
|
||||
(pdev->device == 0x7340 && pdev->revision == 0xC9) ||
|
||||
(pdev->device == 0x7360 && pdev->revision == 0xC7))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
int nv_set_ip_blocks(struct amdgpu_device *adev)
|
||||
{
|
||||
int r;
|
||||
@ -728,8 +734,7 @@ int nv_set_ip_blocks(struct amdgpu_device *adev)
|
||||
if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT &&
|
||||
!amdgpu_sriov_vf(adev))
|
||||
amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);
|
||||
if (!nv_is_headless_sku(adev->pdev))
|
||||
amdgpu_device_ip_block_add(adev, &vcn_v2_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vcn_v2_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &jpeg_v2_0_ip_block);
|
||||
if (adev->enable_mes)
|
||||
amdgpu_device_ip_block_add(adev, &mes_v10_1_ip_block);
|
||||
@ -752,8 +757,7 @@ int nv_set_ip_blocks(struct amdgpu_device *adev)
|
||||
if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT &&
|
||||
!amdgpu_sriov_vf(adev))
|
||||
amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);
|
||||
if (!nv_is_headless_sku(adev->pdev))
|
||||
amdgpu_device_ip_block_add(adev, &vcn_v2_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vcn_v2_0_ip_block);
|
||||
if (!amdgpu_sriov_vf(adev))
|
||||
amdgpu_device_ip_block_add(adev, &jpeg_v2_0_ip_block);
|
||||
break;
|
||||
@ -777,7 +781,6 @@ int nv_set_ip_blocks(struct amdgpu_device *adev)
|
||||
amdgpu_device_ip_block_add(adev, &vcn_v3_0_ip_block);
|
||||
if (!amdgpu_sriov_vf(adev))
|
||||
amdgpu_device_ip_block_add(adev, &jpeg_v3_0_ip_block);
|
||||
|
||||
if (adev->enable_mes)
|
||||
amdgpu_device_ip_block_add(adev, &mes_v10_1_ip_block);
|
||||
break;
|
||||
@ -1149,6 +1152,11 @@ static int nv_common_early_init(void *handle)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (adev->harvest_ip_mask & AMD_HARVEST_IP_VCN_MASK)
|
||||
adev->pg_flags &= ~(AMD_PG_SUPPORT_VCN |
|
||||
AMD_PG_SUPPORT_VCN_DPG |
|
||||
AMD_PG_SUPPORT_JPEG);
|
||||
|
||||
if (amdgpu_sriov_vf(adev)) {
|
||||
amdgpu_virt_init_setting(adev);
|
||||
xgpu_nv_mailbox_set_irq_funcs(adev);
|
||||
|
@ -1401,7 +1401,8 @@ static int soc15_common_early_init(void *handle)
|
||||
AMD_CG_SUPPORT_MC_MGCG |
|
||||
AMD_CG_SUPPORT_MC_LS |
|
||||
AMD_CG_SUPPORT_SDMA_MGCG |
|
||||
AMD_CG_SUPPORT_SDMA_LS;
|
||||
AMD_CG_SUPPORT_SDMA_LS |
|
||||
AMD_CG_SUPPORT_VCN_MGCG;
|
||||
|
||||
adev->pg_flags = AMD_PG_SUPPORT_SDMA |
|
||||
AMD_PG_SUPPORT_MMHUB |
|
||||
|
@ -1119,10 +1119,10 @@ static int vcn_v1_0_stop_spg_mode(struct amdgpu_device *adev)
|
||||
UVD_LMI_STATUS__WRITE_CLEAN_RAW_MASK;
|
||||
SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_LMI_STATUS, tmp, tmp);
|
||||
|
||||
/* put VCPU into reset */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_SOFT_RESET),
|
||||
UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK,
|
||||
~UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK);
|
||||
/* stall UMC channel */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_CTRL2),
|
||||
UVD_LMI_CTRL2__STALL_ARB_UMC_MASK,
|
||||
~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK);
|
||||
|
||||
tmp = UVD_LMI_STATUS__UMC_READ_CLEAN_RAW_MASK |
|
||||
UVD_LMI_STATUS__UMC_WRITE_CLEAN_RAW_MASK;
|
||||
@ -1141,6 +1141,11 @@ static int vcn_v1_0_stop_spg_mode(struct amdgpu_device *adev)
|
||||
UVD_SOFT_RESET__LMI_SOFT_RESET_MASK,
|
||||
~UVD_SOFT_RESET__LMI_SOFT_RESET_MASK);
|
||||
|
||||
/* put VCPU into reset */
|
||||
WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_SOFT_RESET),
|
||||
UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK,
|
||||
~UVD_SOFT_RESET__VCPU_SOFT_RESET_MASK);
|
||||
|
||||
WREG32_SOC15(UVD, 0, mmUVD_STATUS, 0);
|
||||
|
||||
vcn_v1_0_enable_clock_gating(adev);
|
||||
|
@ -650,6 +650,7 @@ struct hdcp_workqueue *hdcp_create_workqueue(struct amdgpu_device *adev, struct
|
||||
|
||||
/* File created at /sys/class/drm/card0/device/hdcp_srm*/
|
||||
hdcp_work[0].attr = data_attr;
|
||||
sysfs_bin_attr_init(&hdcp_work[0].attr);
|
||||
|
||||
if (sysfs_create_bin_file(&adev->dev->kobj, &hdcp_work[0].attr))
|
||||
DRM_WARN("Failed to create device file hdcp_srm");
|
||||
|
@ -216,6 +216,12 @@ enum PP_FEATURE_MASK {
|
||||
PP_GFX_DCS_MASK = 0x80000,
|
||||
};
|
||||
|
||||
enum amd_harvest_ip_mask {
|
||||
AMD_HARVEST_IP_VCN_MASK = 0x1,
|
||||
AMD_HARVEST_IP_JPEG_MASK = 0x2,
|
||||
AMD_HARVEST_IP_DMU_MASK = 0x4,
|
||||
};
|
||||
|
||||
enum DC_FEATURE_MASK {
|
||||
DC_FBC_MASK = 0x1,
|
||||
DC_MULTI_MON_PP_MCLK_SWITCH_MASK = 0x2,
|
||||
|
@ -4817,70 +4817,70 @@ static int si_populate_smc_initial_state(struct amdgpu_device *adev,
|
||||
u32 reg;
|
||||
int ret;
|
||||
|
||||
table->initialState.levels[0].mclk.vDLL_CNTL =
|
||||
table->initialState.level.mclk.vDLL_CNTL =
|
||||
cpu_to_be32(si_pi->clock_registers.dll_cntl);
|
||||
table->initialState.levels[0].mclk.vMCLK_PWRMGT_CNTL =
|
||||
table->initialState.level.mclk.vMCLK_PWRMGT_CNTL =
|
||||
cpu_to_be32(si_pi->clock_registers.mclk_pwrmgt_cntl);
|
||||
table->initialState.levels[0].mclk.vMPLL_AD_FUNC_CNTL =
|
||||
table->initialState.level.mclk.vMPLL_AD_FUNC_CNTL =
|
||||
cpu_to_be32(si_pi->clock_registers.mpll_ad_func_cntl);
|
||||
table->initialState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL =
|
||||
table->initialState.level.mclk.vMPLL_DQ_FUNC_CNTL =
|
||||
cpu_to_be32(si_pi->clock_registers.mpll_dq_func_cntl);
|
||||
table->initialState.levels[0].mclk.vMPLL_FUNC_CNTL =
|
||||
table->initialState.level.mclk.vMPLL_FUNC_CNTL =
|
||||
cpu_to_be32(si_pi->clock_registers.mpll_func_cntl);
|
||||
table->initialState.levels[0].mclk.vMPLL_FUNC_CNTL_1 =
|
||||
table->initialState.level.mclk.vMPLL_FUNC_CNTL_1 =
|
||||
cpu_to_be32(si_pi->clock_registers.mpll_func_cntl_1);
|
||||
table->initialState.levels[0].mclk.vMPLL_FUNC_CNTL_2 =
|
||||
table->initialState.level.mclk.vMPLL_FUNC_CNTL_2 =
|
||||
cpu_to_be32(si_pi->clock_registers.mpll_func_cntl_2);
|
||||
table->initialState.levels[0].mclk.vMPLL_SS =
|
||||
table->initialState.level.mclk.vMPLL_SS =
|
||||
cpu_to_be32(si_pi->clock_registers.mpll_ss1);
|
||||
table->initialState.levels[0].mclk.vMPLL_SS2 =
|
||||
table->initialState.level.mclk.vMPLL_SS2 =
|
||||
cpu_to_be32(si_pi->clock_registers.mpll_ss2);
|
||||
|
||||
table->initialState.levels[0].mclk.mclk_value =
|
||||
table->initialState.level.mclk.mclk_value =
|
||||
cpu_to_be32(initial_state->performance_levels[0].mclk);
|
||||
|
||||
table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL =
|
||||
table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL =
|
||||
cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl);
|
||||
table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_2 =
|
||||
table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_2 =
|
||||
cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl_2);
|
||||
table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_3 =
|
||||
table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_3 =
|
||||
cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl_3);
|
||||
table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_4 =
|
||||
table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_4 =
|
||||
cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl_4);
|
||||
table->initialState.levels[0].sclk.vCG_SPLL_SPREAD_SPECTRUM =
|
||||
table->initialState.level.sclk.vCG_SPLL_SPREAD_SPECTRUM =
|
||||
cpu_to_be32(si_pi->clock_registers.cg_spll_spread_spectrum);
|
||||
table->initialState.levels[0].sclk.vCG_SPLL_SPREAD_SPECTRUM_2 =
|
||||
table->initialState.level.sclk.vCG_SPLL_SPREAD_SPECTRUM_2 =
|
||||
cpu_to_be32(si_pi->clock_registers.cg_spll_spread_spectrum_2);
|
||||
|
||||
table->initialState.levels[0].sclk.sclk_value =
|
||||
table->initialState.level.sclk.sclk_value =
|
||||
cpu_to_be32(initial_state->performance_levels[0].sclk);
|
||||
|
||||
table->initialState.levels[0].arbRefreshState =
|
||||
table->initialState.level.arbRefreshState =
|
||||
SISLANDS_INITIAL_STATE_ARB_INDEX;
|
||||
|
||||
table->initialState.levels[0].ACIndex = 0;
|
||||
table->initialState.level.ACIndex = 0;
|
||||
|
||||
ret = si_populate_voltage_value(adev, &eg_pi->vddc_voltage_table,
|
||||
initial_state->performance_levels[0].vddc,
|
||||
&table->initialState.levels[0].vddc);
|
||||
&table->initialState.level.vddc);
|
||||
|
||||
if (!ret) {
|
||||
u16 std_vddc;
|
||||
|
||||
ret = si_get_std_voltage_value(adev,
|
||||
&table->initialState.levels[0].vddc,
|
||||
&table->initialState.level.vddc,
|
||||
&std_vddc);
|
||||
if (!ret)
|
||||
si_populate_std_voltage_value(adev, std_vddc,
|
||||
table->initialState.levels[0].vddc.index,
|
||||
&table->initialState.levels[0].std_vddc);
|
||||
table->initialState.level.vddc.index,
|
||||
&table->initialState.level.std_vddc);
|
||||
}
|
||||
|
||||
if (eg_pi->vddci_control)
|
||||
si_populate_voltage_value(adev,
|
||||
&eg_pi->vddci_voltage_table,
|
||||
initial_state->performance_levels[0].vddci,
|
||||
&table->initialState.levels[0].vddci);
|
||||
&table->initialState.level.vddci);
|
||||
|
||||
if (si_pi->vddc_phase_shed_control)
|
||||
si_populate_phase_shedding_value(adev,
|
||||
@ -4888,41 +4888,41 @@ static int si_populate_smc_initial_state(struct amdgpu_device *adev,
|
||||
initial_state->performance_levels[0].vddc,
|
||||
initial_state->performance_levels[0].sclk,
|
||||
initial_state->performance_levels[0].mclk,
|
||||
&table->initialState.levels[0].vddc);
|
||||
&table->initialState.level.vddc);
|
||||
|
||||
si_populate_initial_mvdd_value(adev, &table->initialState.levels[0].mvdd);
|
||||
si_populate_initial_mvdd_value(adev, &table->initialState.level.mvdd);
|
||||
|
||||
reg = CG_R(0xffff) | CG_L(0);
|
||||
table->initialState.levels[0].aT = cpu_to_be32(reg);
|
||||
table->initialState.levels[0].bSP = cpu_to_be32(pi->dsp);
|
||||
table->initialState.levels[0].gen2PCIE = (u8)si_pi->boot_pcie_gen;
|
||||
table->initialState.level.aT = cpu_to_be32(reg);
|
||||
table->initialState.level.bSP = cpu_to_be32(pi->dsp);
|
||||
table->initialState.level.gen2PCIE = (u8)si_pi->boot_pcie_gen;
|
||||
|
||||
if (adev->gmc.vram_type == AMDGPU_VRAM_TYPE_GDDR5) {
|
||||
table->initialState.levels[0].strobeMode =
|
||||
table->initialState.level.strobeMode =
|
||||
si_get_strobe_mode_settings(adev,
|
||||
initial_state->performance_levels[0].mclk);
|
||||
|
||||
if (initial_state->performance_levels[0].mclk > pi->mclk_edc_enable_threshold)
|
||||
table->initialState.levels[0].mcFlags = SISLANDS_SMC_MC_EDC_RD_FLAG | SISLANDS_SMC_MC_EDC_WR_FLAG;
|
||||
table->initialState.level.mcFlags = SISLANDS_SMC_MC_EDC_RD_FLAG | SISLANDS_SMC_MC_EDC_WR_FLAG;
|
||||
else
|
||||
table->initialState.levels[0].mcFlags = 0;
|
||||
table->initialState.level.mcFlags = 0;
|
||||
}
|
||||
|
||||
table->initialState.levelCount = 1;
|
||||
|
||||
table->initialState.flags |= PPSMC_SWSTATE_FLAG_DC;
|
||||
|
||||
table->initialState.levels[0].dpm2.MaxPS = 0;
|
||||
table->initialState.levels[0].dpm2.NearTDPDec = 0;
|
||||
table->initialState.levels[0].dpm2.AboveSafeInc = 0;
|
||||
table->initialState.levels[0].dpm2.BelowSafeInc = 0;
|
||||
table->initialState.levels[0].dpm2.PwrEfficiencyRatio = 0;
|
||||
table->initialState.level.dpm2.MaxPS = 0;
|
||||
table->initialState.level.dpm2.NearTDPDec = 0;
|
||||
table->initialState.level.dpm2.AboveSafeInc = 0;
|
||||
table->initialState.level.dpm2.BelowSafeInc = 0;
|
||||
table->initialState.level.dpm2.PwrEfficiencyRatio = 0;
|
||||
|
||||
reg = MIN_POWER_MASK | MAX_POWER_MASK;
|
||||
table->initialState.levels[0].SQPowerThrottle = cpu_to_be32(reg);
|
||||
table->initialState.level.SQPowerThrottle = cpu_to_be32(reg);
|
||||
|
||||
reg = MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK;
|
||||
table->initialState.levels[0].SQPowerThrottle_2 = cpu_to_be32(reg);
|
||||
table->initialState.level.SQPowerThrottle_2 = cpu_to_be32(reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -4953,18 +4953,18 @@ static int si_populate_smc_acpi_state(struct amdgpu_device *adev,
|
||||
|
||||
if (pi->acpi_vddc) {
|
||||
ret = si_populate_voltage_value(adev, &eg_pi->vddc_voltage_table,
|
||||
pi->acpi_vddc, &table->ACPIState.levels[0].vddc);
|
||||
pi->acpi_vddc, &table->ACPIState.level.vddc);
|
||||
if (!ret) {
|
||||
u16 std_vddc;
|
||||
|
||||
ret = si_get_std_voltage_value(adev,
|
||||
&table->ACPIState.levels[0].vddc, &std_vddc);
|
||||
&table->ACPIState.level.vddc, &std_vddc);
|
||||
if (!ret)
|
||||
si_populate_std_voltage_value(adev, std_vddc,
|
||||
table->ACPIState.levels[0].vddc.index,
|
||||
&table->ACPIState.levels[0].std_vddc);
|
||||
table->ACPIState.level.vddc.index,
|
||||
&table->ACPIState.level.std_vddc);
|
||||
}
|
||||
table->ACPIState.levels[0].gen2PCIE = si_pi->acpi_pcie_gen;
|
||||
table->ACPIState.level.gen2PCIE = si_pi->acpi_pcie_gen;
|
||||
|
||||
if (si_pi->vddc_phase_shed_control) {
|
||||
si_populate_phase_shedding_value(adev,
|
||||
@ -4972,23 +4972,23 @@ static int si_populate_smc_acpi_state(struct amdgpu_device *adev,
|
||||
pi->acpi_vddc,
|
||||
0,
|
||||
0,
|
||||
&table->ACPIState.levels[0].vddc);
|
||||
&table->ACPIState.level.vddc);
|
||||
}
|
||||
} else {
|
||||
ret = si_populate_voltage_value(adev, &eg_pi->vddc_voltage_table,
|
||||
pi->min_vddc_in_table, &table->ACPIState.levels[0].vddc);
|
||||
pi->min_vddc_in_table, &table->ACPIState.level.vddc);
|
||||
if (!ret) {
|
||||
u16 std_vddc;
|
||||
|
||||
ret = si_get_std_voltage_value(adev,
|
||||
&table->ACPIState.levels[0].vddc, &std_vddc);
|
||||
&table->ACPIState.level.vddc, &std_vddc);
|
||||
|
||||
if (!ret)
|
||||
si_populate_std_voltage_value(adev, std_vddc,
|
||||
table->ACPIState.levels[0].vddc.index,
|
||||
&table->ACPIState.levels[0].std_vddc);
|
||||
table->ACPIState.level.vddc.index,
|
||||
&table->ACPIState.level.std_vddc);
|
||||
}
|
||||
table->ACPIState.levels[0].gen2PCIE =
|
||||
table->ACPIState.level.gen2PCIE =
|
||||
(u8)amdgpu_get_pcie_gen_support(adev,
|
||||
si_pi->sys_pcie_mask,
|
||||
si_pi->boot_pcie_gen,
|
||||
@ -5000,14 +5000,14 @@ static int si_populate_smc_acpi_state(struct amdgpu_device *adev,
|
||||
pi->min_vddc_in_table,
|
||||
0,
|
||||
0,
|
||||
&table->ACPIState.levels[0].vddc);
|
||||
&table->ACPIState.level.vddc);
|
||||
}
|
||||
|
||||
if (pi->acpi_vddc) {
|
||||
if (eg_pi->acpi_vddci)
|
||||
si_populate_voltage_value(adev, &eg_pi->vddci_voltage_table,
|
||||
eg_pi->acpi_vddci,
|
||||
&table->ACPIState.levels[0].vddci);
|
||||
&table->ACPIState.level.vddci);
|
||||
}
|
||||
|
||||
mclk_pwrmgt_cntl |= MRDCK0_RESET | MRDCK1_RESET;
|
||||
@ -5018,59 +5018,59 @@ static int si_populate_smc_acpi_state(struct amdgpu_device *adev,
|
||||
spll_func_cntl_2 &= ~SCLK_MUX_SEL_MASK;
|
||||
spll_func_cntl_2 |= SCLK_MUX_SEL(4);
|
||||
|
||||
table->ACPIState.levels[0].mclk.vDLL_CNTL =
|
||||
table->ACPIState.level.mclk.vDLL_CNTL =
|
||||
cpu_to_be32(dll_cntl);
|
||||
table->ACPIState.levels[0].mclk.vMCLK_PWRMGT_CNTL =
|
||||
table->ACPIState.level.mclk.vMCLK_PWRMGT_CNTL =
|
||||
cpu_to_be32(mclk_pwrmgt_cntl);
|
||||
table->ACPIState.levels[0].mclk.vMPLL_AD_FUNC_CNTL =
|
||||
table->ACPIState.level.mclk.vMPLL_AD_FUNC_CNTL =
|
||||
cpu_to_be32(mpll_ad_func_cntl);
|
||||
table->ACPIState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL =
|
||||
table->ACPIState.level.mclk.vMPLL_DQ_FUNC_CNTL =
|
||||
cpu_to_be32(mpll_dq_func_cntl);
|
||||
table->ACPIState.levels[0].mclk.vMPLL_FUNC_CNTL =
|
||||
table->ACPIState.level.mclk.vMPLL_FUNC_CNTL =
|
||||
cpu_to_be32(mpll_func_cntl);
|
||||
table->ACPIState.levels[0].mclk.vMPLL_FUNC_CNTL_1 =
|
||||
table->ACPIState.level.mclk.vMPLL_FUNC_CNTL_1 =
|
||||
cpu_to_be32(mpll_func_cntl_1);
|
||||
table->ACPIState.levels[0].mclk.vMPLL_FUNC_CNTL_2 =
|
||||
table->ACPIState.level.mclk.vMPLL_FUNC_CNTL_2 =
|
||||
cpu_to_be32(mpll_func_cntl_2);
|
||||
table->ACPIState.levels[0].mclk.vMPLL_SS =
|
||||
table->ACPIState.level.mclk.vMPLL_SS =
|
||||
cpu_to_be32(si_pi->clock_registers.mpll_ss1);
|
||||
table->ACPIState.levels[0].mclk.vMPLL_SS2 =
|
||||
table->ACPIState.level.mclk.vMPLL_SS2 =
|
||||
cpu_to_be32(si_pi->clock_registers.mpll_ss2);
|
||||
|
||||
table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL =
|
||||
table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL =
|
||||
cpu_to_be32(spll_func_cntl);
|
||||
table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_2 =
|
||||
table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_2 =
|
||||
cpu_to_be32(spll_func_cntl_2);
|
||||
table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_3 =
|
||||
table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_3 =
|
||||
cpu_to_be32(spll_func_cntl_3);
|
||||
table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_4 =
|
||||
table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_4 =
|
||||
cpu_to_be32(spll_func_cntl_4);
|
||||
|
||||
table->ACPIState.levels[0].mclk.mclk_value = 0;
|
||||
table->ACPIState.levels[0].sclk.sclk_value = 0;
|
||||
table->ACPIState.level.mclk.mclk_value = 0;
|
||||
table->ACPIState.level.sclk.sclk_value = 0;
|
||||
|
||||
si_populate_mvdd_value(adev, 0, &table->ACPIState.levels[0].mvdd);
|
||||
si_populate_mvdd_value(adev, 0, &table->ACPIState.level.mvdd);
|
||||
|
||||
if (eg_pi->dynamic_ac_timing)
|
||||
table->ACPIState.levels[0].ACIndex = 0;
|
||||
table->ACPIState.level.ACIndex = 0;
|
||||
|
||||
table->ACPIState.levels[0].dpm2.MaxPS = 0;
|
||||
table->ACPIState.levels[0].dpm2.NearTDPDec = 0;
|
||||
table->ACPIState.levels[0].dpm2.AboveSafeInc = 0;
|
||||
table->ACPIState.levels[0].dpm2.BelowSafeInc = 0;
|
||||
table->ACPIState.levels[0].dpm2.PwrEfficiencyRatio = 0;
|
||||
table->ACPIState.level.dpm2.MaxPS = 0;
|
||||
table->ACPIState.level.dpm2.NearTDPDec = 0;
|
||||
table->ACPIState.level.dpm2.AboveSafeInc = 0;
|
||||
table->ACPIState.level.dpm2.BelowSafeInc = 0;
|
||||
table->ACPIState.level.dpm2.PwrEfficiencyRatio = 0;
|
||||
|
||||
reg = MIN_POWER_MASK | MAX_POWER_MASK;
|
||||
table->ACPIState.levels[0].SQPowerThrottle = cpu_to_be32(reg);
|
||||
table->ACPIState.level.SQPowerThrottle = cpu_to_be32(reg);
|
||||
|
||||
reg = MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK;
|
||||
table->ACPIState.levels[0].SQPowerThrottle_2 = cpu_to_be32(reg);
|
||||
table->ACPIState.level.SQPowerThrottle_2 = cpu_to_be32(reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int si_populate_ulv_state(struct amdgpu_device *adev,
|
||||
SISLANDS_SMC_SWSTATE *state)
|
||||
struct SISLANDS_SMC_SWSTATE_SINGLE *state)
|
||||
{
|
||||
struct evergreen_power_info *eg_pi = evergreen_get_pi(adev);
|
||||
struct si_power_info *si_pi = si_get_pi(adev);
|
||||
@ -5079,19 +5079,19 @@ static int si_populate_ulv_state(struct amdgpu_device *adev,
|
||||
int ret;
|
||||
|
||||
ret = si_convert_power_level_to_smc(adev, &ulv->pl,
|
||||
&state->levels[0]);
|
||||
&state->level);
|
||||
if (!ret) {
|
||||
if (eg_pi->sclk_deep_sleep) {
|
||||
if (sclk_in_sr <= SCLK_MIN_DEEPSLEEP_FREQ)
|
||||
state->levels[0].stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_BYPASS;
|
||||
state->level.stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_BYPASS;
|
||||
else
|
||||
state->levels[0].stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_THROTTLE;
|
||||
state->level.stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_THROTTLE;
|
||||
}
|
||||
if (ulv->one_pcie_lane_in_ulv)
|
||||
state->flags |= PPSMC_SWSTATE_FLAG_PCIE_X1;
|
||||
state->levels[0].arbRefreshState = (u8)(SISLANDS_ULV_STATE_ARB_INDEX);
|
||||
state->levels[0].ACIndex = 1;
|
||||
state->levels[0].std_vddc = state->levels[0].vddc;
|
||||
state->level.arbRefreshState = (u8)(SISLANDS_ULV_STATE_ARB_INDEX);
|
||||
state->level.ACIndex = 1;
|
||||
state->level.std_vddc = state->level.vddc;
|
||||
state->levelCount = 1;
|
||||
|
||||
state->flags |= PPSMC_SWSTATE_FLAG_DC;
|
||||
@ -5190,7 +5190,9 @@ static int si_init_smc_table(struct amdgpu_device *adev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
table->driverState = table->initialState;
|
||||
table->driverState.flags = table->initialState.flags;
|
||||
table->driverState.levelCount = table->initialState.levelCount;
|
||||
table->driverState.levels[0] = table->initialState.level;
|
||||
|
||||
ret = si_do_program_memory_timing_parameters(adev, amdgpu_boot_state,
|
||||
SISLANDS_INITIAL_STATE_ARB_INDEX);
|
||||
@ -5737,8 +5739,8 @@ static int si_upload_ulv_state(struct amdgpu_device *adev)
|
||||
if (ulv->supported && ulv->pl.vddc) {
|
||||
u32 address = si_pi->state_table_start +
|
||||
offsetof(SISLANDS_SMC_STATETABLE, ULVState);
|
||||
SISLANDS_SMC_SWSTATE *smc_state = &si_pi->smc_statetable.ULVState;
|
||||
u32 state_size = sizeof(SISLANDS_SMC_SWSTATE);
|
||||
struct SISLANDS_SMC_SWSTATE_SINGLE *smc_state = &si_pi->smc_statetable.ULVState;
|
||||
u32 state_size = sizeof(struct SISLANDS_SMC_SWSTATE_SINGLE);
|
||||
|
||||
memset(smc_state, 0, state_size);
|
||||
|
||||
|
@ -191,6 +191,14 @@ struct SISLANDS_SMC_SWSTATE
|
||||
|
||||
typedef struct SISLANDS_SMC_SWSTATE SISLANDS_SMC_SWSTATE;
|
||||
|
||||
struct SISLANDS_SMC_SWSTATE_SINGLE {
|
||||
uint8_t flags;
|
||||
uint8_t levelCount;
|
||||
uint8_t padding2;
|
||||
uint8_t padding3;
|
||||
SISLANDS_SMC_HW_PERFORMANCE_LEVEL level;
|
||||
};
|
||||
|
||||
#define SISLANDS_SMC_VOLTAGEMASK_VDDC 0
|
||||
#define SISLANDS_SMC_VOLTAGEMASK_MVDD 1
|
||||
#define SISLANDS_SMC_VOLTAGEMASK_VDDCI 2
|
||||
@ -208,19 +216,19 @@ typedef struct SISLANDS_SMC_VOLTAGEMASKTABLE SISLANDS_SMC_VOLTAGEMASKTABLE;
|
||||
|
||||
struct SISLANDS_SMC_STATETABLE
|
||||
{
|
||||
uint8_t thermalProtectType;
|
||||
uint8_t systemFlags;
|
||||
uint8_t maxVDDCIndexInPPTable;
|
||||
uint8_t extraFlags;
|
||||
uint32_t lowSMIO[SISLANDS_MAX_NO_VREG_STEPS];
|
||||
SISLANDS_SMC_VOLTAGEMASKTABLE voltageMaskTable;
|
||||
SISLANDS_SMC_VOLTAGEMASKTABLE phaseMaskTable;
|
||||
PP_SIslands_DPM2Parameters dpm2Params;
|
||||
SISLANDS_SMC_SWSTATE initialState;
|
||||
SISLANDS_SMC_SWSTATE ACPIState;
|
||||
SISLANDS_SMC_SWSTATE ULVState;
|
||||
SISLANDS_SMC_SWSTATE driverState;
|
||||
SISLANDS_SMC_HW_PERFORMANCE_LEVEL dpmLevels[SISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE - 1];
|
||||
uint8_t thermalProtectType;
|
||||
uint8_t systemFlags;
|
||||
uint8_t maxVDDCIndexInPPTable;
|
||||
uint8_t extraFlags;
|
||||
uint32_t lowSMIO[SISLANDS_MAX_NO_VREG_STEPS];
|
||||
SISLANDS_SMC_VOLTAGEMASKTABLE voltageMaskTable;
|
||||
SISLANDS_SMC_VOLTAGEMASKTABLE phaseMaskTable;
|
||||
PP_SIslands_DPM2Parameters dpm2Params;
|
||||
struct SISLANDS_SMC_SWSTATE_SINGLE initialState;
|
||||
struct SISLANDS_SMC_SWSTATE_SINGLE ACPIState;
|
||||
struct SISLANDS_SMC_SWSTATE_SINGLE ULVState;
|
||||
SISLANDS_SMC_SWSTATE driverState;
|
||||
SISLANDS_SMC_HW_PERFORMANCE_LEVEL dpmLevels[SISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE];
|
||||
};
|
||||
|
||||
typedef struct SISLANDS_SMC_STATETABLE SISLANDS_SMC_STATETABLE;
|
||||
|
@ -1687,102 +1687,102 @@ static int ni_populate_smc_initial_state(struct radeon_device *rdev,
|
||||
u32 reg;
|
||||
int ret;
|
||||
|
||||
table->initialState.levels[0].mclk.vMPLL_AD_FUNC_CNTL =
|
||||
table->initialState.level.mclk.vMPLL_AD_FUNC_CNTL =
|
||||
cpu_to_be32(ni_pi->clock_registers.mpll_ad_func_cntl);
|
||||
table->initialState.levels[0].mclk.vMPLL_AD_FUNC_CNTL_2 =
|
||||
table->initialState.level.mclk.vMPLL_AD_FUNC_CNTL_2 =
|
||||
cpu_to_be32(ni_pi->clock_registers.mpll_ad_func_cntl_2);
|
||||
table->initialState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL =
|
||||
table->initialState.level.mclk.vMPLL_DQ_FUNC_CNTL =
|
||||
cpu_to_be32(ni_pi->clock_registers.mpll_dq_func_cntl);
|
||||
table->initialState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL_2 =
|
||||
table->initialState.level.mclk.vMPLL_DQ_FUNC_CNTL_2 =
|
||||
cpu_to_be32(ni_pi->clock_registers.mpll_dq_func_cntl_2);
|
||||
table->initialState.levels[0].mclk.vMCLK_PWRMGT_CNTL =
|
||||
table->initialState.level.mclk.vMCLK_PWRMGT_CNTL =
|
||||
cpu_to_be32(ni_pi->clock_registers.mclk_pwrmgt_cntl);
|
||||
table->initialState.levels[0].mclk.vDLL_CNTL =
|
||||
table->initialState.level.mclk.vDLL_CNTL =
|
||||
cpu_to_be32(ni_pi->clock_registers.dll_cntl);
|
||||
table->initialState.levels[0].mclk.vMPLL_SS =
|
||||
table->initialState.level.mclk.vMPLL_SS =
|
||||
cpu_to_be32(ni_pi->clock_registers.mpll_ss1);
|
||||
table->initialState.levels[0].mclk.vMPLL_SS2 =
|
||||
table->initialState.level.mclk.vMPLL_SS2 =
|
||||
cpu_to_be32(ni_pi->clock_registers.mpll_ss2);
|
||||
table->initialState.levels[0].mclk.mclk_value =
|
||||
table->initialState.level.mclk.mclk_value =
|
||||
cpu_to_be32(initial_state->performance_levels[0].mclk);
|
||||
|
||||
table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL =
|
||||
table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL =
|
||||
cpu_to_be32(ni_pi->clock_registers.cg_spll_func_cntl);
|
||||
table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_2 =
|
||||
table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_2 =
|
||||
cpu_to_be32(ni_pi->clock_registers.cg_spll_func_cntl_2);
|
||||
table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_3 =
|
||||
table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_3 =
|
||||
cpu_to_be32(ni_pi->clock_registers.cg_spll_func_cntl_3);
|
||||
table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_4 =
|
||||
table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_4 =
|
||||
cpu_to_be32(ni_pi->clock_registers.cg_spll_func_cntl_4);
|
||||
table->initialState.levels[0].sclk.vCG_SPLL_SPREAD_SPECTRUM =
|
||||
table->initialState.level.sclk.vCG_SPLL_SPREAD_SPECTRUM =
|
||||
cpu_to_be32(ni_pi->clock_registers.cg_spll_spread_spectrum);
|
||||
table->initialState.levels[0].sclk.vCG_SPLL_SPREAD_SPECTRUM_2 =
|
||||
table->initialState.level.sclk.vCG_SPLL_SPREAD_SPECTRUM_2 =
|
||||
cpu_to_be32(ni_pi->clock_registers.cg_spll_spread_spectrum_2);
|
||||
table->initialState.levels[0].sclk.sclk_value =
|
||||
table->initialState.level.sclk.sclk_value =
|
||||
cpu_to_be32(initial_state->performance_levels[0].sclk);
|
||||
table->initialState.levels[0].arbRefreshState =
|
||||
table->initialState.level.arbRefreshState =
|
||||
NISLANDS_INITIAL_STATE_ARB_INDEX;
|
||||
|
||||
table->initialState.levels[0].ACIndex = 0;
|
||||
table->initialState.level.ACIndex = 0;
|
||||
|
||||
ret = ni_populate_voltage_value(rdev, &eg_pi->vddc_voltage_table,
|
||||
initial_state->performance_levels[0].vddc,
|
||||
&table->initialState.levels[0].vddc);
|
||||
&table->initialState.level.vddc);
|
||||
if (!ret) {
|
||||
u16 std_vddc;
|
||||
|
||||
ret = ni_get_std_voltage_value(rdev,
|
||||
&table->initialState.levels[0].vddc,
|
||||
&table->initialState.level.vddc,
|
||||
&std_vddc);
|
||||
if (!ret)
|
||||
ni_populate_std_voltage_value(rdev, std_vddc,
|
||||
table->initialState.levels[0].vddc.index,
|
||||
&table->initialState.levels[0].std_vddc);
|
||||
table->initialState.level.vddc.index,
|
||||
&table->initialState.level.std_vddc);
|
||||
}
|
||||
|
||||
if (eg_pi->vddci_control)
|
||||
ni_populate_voltage_value(rdev,
|
||||
&eg_pi->vddci_voltage_table,
|
||||
initial_state->performance_levels[0].vddci,
|
||||
&table->initialState.levels[0].vddci);
|
||||
&table->initialState.level.vddci);
|
||||
|
||||
ni_populate_initial_mvdd_value(rdev, &table->initialState.levels[0].mvdd);
|
||||
ni_populate_initial_mvdd_value(rdev, &table->initialState.level.mvdd);
|
||||
|
||||
reg = CG_R(0xffff) | CG_L(0);
|
||||
table->initialState.levels[0].aT = cpu_to_be32(reg);
|
||||
table->initialState.level.aT = cpu_to_be32(reg);
|
||||
|
||||
table->initialState.levels[0].bSP = cpu_to_be32(pi->dsp);
|
||||
table->initialState.level.bSP = cpu_to_be32(pi->dsp);
|
||||
|
||||
if (pi->boot_in_gen2)
|
||||
table->initialState.levels[0].gen2PCIE = 1;
|
||||
table->initialState.level.gen2PCIE = 1;
|
||||
else
|
||||
table->initialState.levels[0].gen2PCIE = 0;
|
||||
table->initialState.level.gen2PCIE = 0;
|
||||
|
||||
if (pi->mem_gddr5) {
|
||||
table->initialState.levels[0].strobeMode =
|
||||
table->initialState.level.strobeMode =
|
||||
cypress_get_strobe_mode_settings(rdev,
|
||||
initial_state->performance_levels[0].mclk);
|
||||
|
||||
if (initial_state->performance_levels[0].mclk > pi->mclk_edc_enable_threshold)
|
||||
table->initialState.levels[0].mcFlags = NISLANDS_SMC_MC_EDC_RD_FLAG | NISLANDS_SMC_MC_EDC_WR_FLAG;
|
||||
table->initialState.level.mcFlags = NISLANDS_SMC_MC_EDC_RD_FLAG | NISLANDS_SMC_MC_EDC_WR_FLAG;
|
||||
else
|
||||
table->initialState.levels[0].mcFlags = 0;
|
||||
table->initialState.level.mcFlags = 0;
|
||||
}
|
||||
|
||||
table->initialState.levelCount = 1;
|
||||
|
||||
table->initialState.flags |= PPSMC_SWSTATE_FLAG_DC;
|
||||
|
||||
table->initialState.levels[0].dpm2.MaxPS = 0;
|
||||
table->initialState.levels[0].dpm2.NearTDPDec = 0;
|
||||
table->initialState.levels[0].dpm2.AboveSafeInc = 0;
|
||||
table->initialState.levels[0].dpm2.BelowSafeInc = 0;
|
||||
table->initialState.level.dpm2.MaxPS = 0;
|
||||
table->initialState.level.dpm2.NearTDPDec = 0;
|
||||
table->initialState.level.dpm2.AboveSafeInc = 0;
|
||||
table->initialState.level.dpm2.BelowSafeInc = 0;
|
||||
|
||||
reg = MIN_POWER_MASK | MAX_POWER_MASK;
|
||||
table->initialState.levels[0].SQPowerThrottle = cpu_to_be32(reg);
|
||||
table->initialState.level.SQPowerThrottle = cpu_to_be32(reg);
|
||||
|
||||
reg = MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK;
|
||||
table->initialState.levels[0].SQPowerThrottle_2 = cpu_to_be32(reg);
|
||||
table->initialState.level.SQPowerThrottle_2 = cpu_to_be32(reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1813,43 +1813,43 @@ static int ni_populate_smc_acpi_state(struct radeon_device *rdev,
|
||||
if (pi->acpi_vddc) {
|
||||
ret = ni_populate_voltage_value(rdev,
|
||||
&eg_pi->vddc_voltage_table,
|
||||
pi->acpi_vddc, &table->ACPIState.levels[0].vddc);
|
||||
pi->acpi_vddc, &table->ACPIState.level.vddc);
|
||||
if (!ret) {
|
||||
u16 std_vddc;
|
||||
|
||||
ret = ni_get_std_voltage_value(rdev,
|
||||
&table->ACPIState.levels[0].vddc, &std_vddc);
|
||||
&table->ACPIState.level.vddc, &std_vddc);
|
||||
if (!ret)
|
||||
ni_populate_std_voltage_value(rdev, std_vddc,
|
||||
table->ACPIState.levels[0].vddc.index,
|
||||
&table->ACPIState.levels[0].std_vddc);
|
||||
table->ACPIState.level.vddc.index,
|
||||
&table->ACPIState.level.std_vddc);
|
||||
}
|
||||
|
||||
if (pi->pcie_gen2) {
|
||||
if (pi->acpi_pcie_gen2)
|
||||
table->ACPIState.levels[0].gen2PCIE = 1;
|
||||
table->ACPIState.level.gen2PCIE = 1;
|
||||
else
|
||||
table->ACPIState.levels[0].gen2PCIE = 0;
|
||||
table->ACPIState.level.gen2PCIE = 0;
|
||||
} else {
|
||||
table->ACPIState.levels[0].gen2PCIE = 0;
|
||||
table->ACPIState.level.gen2PCIE = 0;
|
||||
}
|
||||
} else {
|
||||
ret = ni_populate_voltage_value(rdev,
|
||||
&eg_pi->vddc_voltage_table,
|
||||
pi->min_vddc_in_table,
|
||||
&table->ACPIState.levels[0].vddc);
|
||||
&table->ACPIState.level.vddc);
|
||||
if (!ret) {
|
||||
u16 std_vddc;
|
||||
|
||||
ret = ni_get_std_voltage_value(rdev,
|
||||
&table->ACPIState.levels[0].vddc,
|
||||
&table->ACPIState.level.vddc,
|
||||
&std_vddc);
|
||||
if (!ret)
|
||||
ni_populate_std_voltage_value(rdev, std_vddc,
|
||||
table->ACPIState.levels[0].vddc.index,
|
||||
&table->ACPIState.levels[0].std_vddc);
|
||||
table->ACPIState.level.vddc.index,
|
||||
&table->ACPIState.level.std_vddc);
|
||||
}
|
||||
table->ACPIState.levels[0].gen2PCIE = 0;
|
||||
table->ACPIState.level.gen2PCIE = 0;
|
||||
}
|
||||
|
||||
if (eg_pi->acpi_vddci) {
|
||||
@ -1857,7 +1857,7 @@ static int ni_populate_smc_acpi_state(struct radeon_device *rdev,
|
||||
ni_populate_voltage_value(rdev,
|
||||
&eg_pi->vddci_voltage_table,
|
||||
eg_pi->acpi_vddci,
|
||||
&table->ACPIState.levels[0].vddci);
|
||||
&table->ACPIState.level.vddci);
|
||||
}
|
||||
|
||||
|
||||
@ -1900,37 +1900,37 @@ static int ni_populate_smc_acpi_state(struct radeon_device *rdev,
|
||||
spll_func_cntl_2 &= ~SCLK_MUX_SEL_MASK;
|
||||
spll_func_cntl_2 |= SCLK_MUX_SEL(4);
|
||||
|
||||
table->ACPIState.levels[0].mclk.vMPLL_AD_FUNC_CNTL = cpu_to_be32(mpll_ad_func_cntl);
|
||||
table->ACPIState.levels[0].mclk.vMPLL_AD_FUNC_CNTL_2 = cpu_to_be32(mpll_ad_func_cntl_2);
|
||||
table->ACPIState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL = cpu_to_be32(mpll_dq_func_cntl);
|
||||
table->ACPIState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL_2 = cpu_to_be32(mpll_dq_func_cntl_2);
|
||||
table->ACPIState.levels[0].mclk.vMCLK_PWRMGT_CNTL = cpu_to_be32(mclk_pwrmgt_cntl);
|
||||
table->ACPIState.levels[0].mclk.vDLL_CNTL = cpu_to_be32(dll_cntl);
|
||||
table->ACPIState.level.mclk.vMPLL_AD_FUNC_CNTL = cpu_to_be32(mpll_ad_func_cntl);
|
||||
table->ACPIState.level.mclk.vMPLL_AD_FUNC_CNTL_2 = cpu_to_be32(mpll_ad_func_cntl_2);
|
||||
table->ACPIState.level.mclk.vMPLL_DQ_FUNC_CNTL = cpu_to_be32(mpll_dq_func_cntl);
|
||||
table->ACPIState.level.mclk.vMPLL_DQ_FUNC_CNTL_2 = cpu_to_be32(mpll_dq_func_cntl_2);
|
||||
table->ACPIState.level.mclk.vMCLK_PWRMGT_CNTL = cpu_to_be32(mclk_pwrmgt_cntl);
|
||||
table->ACPIState.level.mclk.vDLL_CNTL = cpu_to_be32(dll_cntl);
|
||||
|
||||
table->ACPIState.levels[0].mclk.mclk_value = 0;
|
||||
table->ACPIState.level.mclk.mclk_value = 0;
|
||||
|
||||
table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL = cpu_to_be32(spll_func_cntl);
|
||||
table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_2 = cpu_to_be32(spll_func_cntl_2);
|
||||
table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_3 = cpu_to_be32(spll_func_cntl_3);
|
||||
table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_4 = cpu_to_be32(spll_func_cntl_4);
|
||||
table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL = cpu_to_be32(spll_func_cntl);
|
||||
table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_2 = cpu_to_be32(spll_func_cntl_2);
|
||||
table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_3 = cpu_to_be32(spll_func_cntl_3);
|
||||
table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_4 = cpu_to_be32(spll_func_cntl_4);
|
||||
|
||||
table->ACPIState.levels[0].sclk.sclk_value = 0;
|
||||
table->ACPIState.level.sclk.sclk_value = 0;
|
||||
|
||||
ni_populate_mvdd_value(rdev, 0, &table->ACPIState.levels[0].mvdd);
|
||||
ni_populate_mvdd_value(rdev, 0, &table->ACPIState.level.mvdd);
|
||||
|
||||
if (eg_pi->dynamic_ac_timing)
|
||||
table->ACPIState.levels[0].ACIndex = 1;
|
||||
table->ACPIState.level.ACIndex = 1;
|
||||
|
||||
table->ACPIState.levels[0].dpm2.MaxPS = 0;
|
||||
table->ACPIState.levels[0].dpm2.NearTDPDec = 0;
|
||||
table->ACPIState.levels[0].dpm2.AboveSafeInc = 0;
|
||||
table->ACPIState.levels[0].dpm2.BelowSafeInc = 0;
|
||||
table->ACPIState.level.dpm2.MaxPS = 0;
|
||||
table->ACPIState.level.dpm2.NearTDPDec = 0;
|
||||
table->ACPIState.level.dpm2.AboveSafeInc = 0;
|
||||
table->ACPIState.level.dpm2.BelowSafeInc = 0;
|
||||
|
||||
reg = MIN_POWER_MASK | MAX_POWER_MASK;
|
||||
table->ACPIState.levels[0].SQPowerThrottle = cpu_to_be32(reg);
|
||||
table->ACPIState.level.SQPowerThrottle = cpu_to_be32(reg);
|
||||
|
||||
reg = MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK;
|
||||
table->ACPIState.levels[0].SQPowerThrottle_2 = cpu_to_be32(reg);
|
||||
table->ACPIState.level.SQPowerThrottle_2 = cpu_to_be32(reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1980,7 +1980,9 @@ static int ni_init_smc_table(struct radeon_device *rdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
table->driverState = table->initialState;
|
||||
table->driverState.flags = table->initialState.flags;
|
||||
table->driverState.levelCount = table->initialState.levelCount;
|
||||
table->driverState.levels[0] = table->initialState.level;
|
||||
|
||||
table->ULVState = table->initialState;
|
||||
|
||||
|
@ -143,6 +143,14 @@ struct NISLANDS_SMC_SWSTATE
|
||||
|
||||
typedef struct NISLANDS_SMC_SWSTATE NISLANDS_SMC_SWSTATE;
|
||||
|
||||
struct NISLANDS_SMC_SWSTATE_SINGLE {
|
||||
uint8_t flags;
|
||||
uint8_t levelCount;
|
||||
uint8_t padding2;
|
||||
uint8_t padding3;
|
||||
NISLANDS_SMC_HW_PERFORMANCE_LEVEL level;
|
||||
};
|
||||
|
||||
#define NISLANDS_SMC_VOLTAGEMASK_VDDC 0
|
||||
#define NISLANDS_SMC_VOLTAGEMASK_MVDD 1
|
||||
#define NISLANDS_SMC_VOLTAGEMASK_VDDCI 2
|
||||
@ -160,19 +168,19 @@ typedef struct NISLANDS_SMC_VOLTAGEMASKTABLE NISLANDS_SMC_VOLTAGEMASKTABLE;
|
||||
|
||||
struct NISLANDS_SMC_STATETABLE
|
||||
{
|
||||
uint8_t thermalProtectType;
|
||||
uint8_t systemFlags;
|
||||
uint8_t maxVDDCIndexInPPTable;
|
||||
uint8_t extraFlags;
|
||||
uint8_t highSMIO[NISLANDS_MAX_NO_VREG_STEPS];
|
||||
uint32_t lowSMIO[NISLANDS_MAX_NO_VREG_STEPS];
|
||||
NISLANDS_SMC_VOLTAGEMASKTABLE voltageMaskTable;
|
||||
PP_NIslands_DPM2Parameters dpm2Params;
|
||||
NISLANDS_SMC_SWSTATE initialState;
|
||||
NISLANDS_SMC_SWSTATE ACPIState;
|
||||
NISLANDS_SMC_SWSTATE ULVState;
|
||||
NISLANDS_SMC_SWSTATE driverState;
|
||||
NISLANDS_SMC_HW_PERFORMANCE_LEVEL dpmLevels[NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE - 1];
|
||||
uint8_t thermalProtectType;
|
||||
uint8_t systemFlags;
|
||||
uint8_t maxVDDCIndexInPPTable;
|
||||
uint8_t extraFlags;
|
||||
uint8_t highSMIO[NISLANDS_MAX_NO_VREG_STEPS];
|
||||
uint32_t lowSMIO[NISLANDS_MAX_NO_VREG_STEPS];
|
||||
NISLANDS_SMC_VOLTAGEMASKTABLE voltageMaskTable;
|
||||
PP_NIslands_DPM2Parameters dpm2Params;
|
||||
struct NISLANDS_SMC_SWSTATE_SINGLE initialState;
|
||||
struct NISLANDS_SMC_SWSTATE_SINGLE ACPIState;
|
||||
struct NISLANDS_SMC_SWSTATE_SINGLE ULVState;
|
||||
NISLANDS_SMC_SWSTATE driverState;
|
||||
NISLANDS_SMC_HW_PERFORMANCE_LEVEL dpmLevels[NISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE];
|
||||
};
|
||||
|
||||
typedef struct NISLANDS_SMC_STATETABLE NISLANDS_SMC_STATETABLE;
|
||||
|
@ -1549,6 +1549,7 @@ struct radeon_dpm {
|
||||
void *priv;
|
||||
u32 new_active_crtcs;
|
||||
int new_active_crtc_count;
|
||||
int high_pixelclock_count;
|
||||
u32 current_active_crtcs;
|
||||
int current_active_crtc_count;
|
||||
bool single_display;
|
||||
|
@ -1767,6 +1767,7 @@ static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev)
|
||||
struct drm_device *ddev = rdev->ddev;
|
||||
struct drm_crtc *crtc;
|
||||
struct radeon_crtc *radeon_crtc;
|
||||
struct radeon_connector *radeon_connector;
|
||||
|
||||
if (!rdev->pm.dpm_enabled)
|
||||
return;
|
||||
@ -1776,6 +1777,7 @@ static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev)
|
||||
/* update active crtc counts */
|
||||
rdev->pm.dpm.new_active_crtcs = 0;
|
||||
rdev->pm.dpm.new_active_crtc_count = 0;
|
||||
rdev->pm.dpm.high_pixelclock_count = 0;
|
||||
if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) {
|
||||
list_for_each_entry(crtc,
|
||||
&ddev->mode_config.crtc_list, head) {
|
||||
@ -1783,6 +1785,12 @@ static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev)
|
||||
if (crtc->enabled) {
|
||||
rdev->pm.dpm.new_active_crtcs |= (1 << radeon_crtc->crtc_id);
|
||||
rdev->pm.dpm.new_active_crtc_count++;
|
||||
if (!radeon_crtc->connector)
|
||||
continue;
|
||||
|
||||
radeon_connector = to_radeon_connector(radeon_crtc->connector);
|
||||
if (radeon_connector->pixelclock_for_modeset > 297000)
|
||||
rdev->pm.dpm.high_pixelclock_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2979,6 +2979,9 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev,
|
||||
(rdev->pdev->device == 0x6605)) {
|
||||
max_sclk = 75000;
|
||||
}
|
||||
|
||||
if (rdev->pm.dpm.high_pixelclock_count > 1)
|
||||
disable_sclk_switching = true;
|
||||
}
|
||||
|
||||
if (rps->vce_active) {
|
||||
@ -4350,70 +4353,70 @@ static int si_populate_smc_initial_state(struct radeon_device *rdev,
|
||||
u32 reg;
|
||||
int ret;
|
||||
|
||||
table->initialState.levels[0].mclk.vDLL_CNTL =
|
||||
table->initialState.level.mclk.vDLL_CNTL =
|
||||
cpu_to_be32(si_pi->clock_registers.dll_cntl);
|
||||
table->initialState.levels[0].mclk.vMCLK_PWRMGT_CNTL =
|
||||
table->initialState.level.mclk.vMCLK_PWRMGT_CNTL =
|
||||
cpu_to_be32(si_pi->clock_registers.mclk_pwrmgt_cntl);
|
||||
table->initialState.levels[0].mclk.vMPLL_AD_FUNC_CNTL =
|
||||
table->initialState.level.mclk.vMPLL_AD_FUNC_CNTL =
|
||||
cpu_to_be32(si_pi->clock_registers.mpll_ad_func_cntl);
|
||||
table->initialState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL =
|
||||
table->initialState.level.mclk.vMPLL_DQ_FUNC_CNTL =
|
||||
cpu_to_be32(si_pi->clock_registers.mpll_dq_func_cntl);
|
||||
table->initialState.levels[0].mclk.vMPLL_FUNC_CNTL =
|
||||
table->initialState.level.mclk.vMPLL_FUNC_CNTL =
|
||||
cpu_to_be32(si_pi->clock_registers.mpll_func_cntl);
|
||||
table->initialState.levels[0].mclk.vMPLL_FUNC_CNTL_1 =
|
||||
table->initialState.level.mclk.vMPLL_FUNC_CNTL_1 =
|
||||
cpu_to_be32(si_pi->clock_registers.mpll_func_cntl_1);
|
||||
table->initialState.levels[0].mclk.vMPLL_FUNC_CNTL_2 =
|
||||
table->initialState.level.mclk.vMPLL_FUNC_CNTL_2 =
|
||||
cpu_to_be32(si_pi->clock_registers.mpll_func_cntl_2);
|
||||
table->initialState.levels[0].mclk.vMPLL_SS =
|
||||
table->initialState.level.mclk.vMPLL_SS =
|
||||
cpu_to_be32(si_pi->clock_registers.mpll_ss1);
|
||||
table->initialState.levels[0].mclk.vMPLL_SS2 =
|
||||
table->initialState.level.mclk.vMPLL_SS2 =
|
||||
cpu_to_be32(si_pi->clock_registers.mpll_ss2);
|
||||
|
||||
table->initialState.levels[0].mclk.mclk_value =
|
||||
table->initialState.level.mclk.mclk_value =
|
||||
cpu_to_be32(initial_state->performance_levels[0].mclk);
|
||||
|
||||
table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL =
|
||||
table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL =
|
||||
cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl);
|
||||
table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_2 =
|
||||
table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_2 =
|
||||
cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl_2);
|
||||
table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_3 =
|
||||
table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_3 =
|
||||
cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl_3);
|
||||
table->initialState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_4 =
|
||||
table->initialState.level.sclk.vCG_SPLL_FUNC_CNTL_4 =
|
||||
cpu_to_be32(si_pi->clock_registers.cg_spll_func_cntl_4);
|
||||
table->initialState.levels[0].sclk.vCG_SPLL_SPREAD_SPECTRUM =
|
||||
table->initialState.level.sclk.vCG_SPLL_SPREAD_SPECTRUM =
|
||||
cpu_to_be32(si_pi->clock_registers.cg_spll_spread_spectrum);
|
||||
table->initialState.levels[0].sclk.vCG_SPLL_SPREAD_SPECTRUM_2 =
|
||||
table->initialState.level.sclk.vCG_SPLL_SPREAD_SPECTRUM_2 =
|
||||
cpu_to_be32(si_pi->clock_registers.cg_spll_spread_spectrum_2);
|
||||
|
||||
table->initialState.levels[0].sclk.sclk_value =
|
||||
table->initialState.level.sclk.sclk_value =
|
||||
cpu_to_be32(initial_state->performance_levels[0].sclk);
|
||||
|
||||
table->initialState.levels[0].arbRefreshState =
|
||||
table->initialState.level.arbRefreshState =
|
||||
SISLANDS_INITIAL_STATE_ARB_INDEX;
|
||||
|
||||
table->initialState.levels[0].ACIndex = 0;
|
||||
table->initialState.level.ACIndex = 0;
|
||||
|
||||
ret = si_populate_voltage_value(rdev, &eg_pi->vddc_voltage_table,
|
||||
initial_state->performance_levels[0].vddc,
|
||||
&table->initialState.levels[0].vddc);
|
||||
&table->initialState.level.vddc);
|
||||
|
||||
if (!ret) {
|
||||
u16 std_vddc;
|
||||
|
||||
ret = si_get_std_voltage_value(rdev,
|
||||
&table->initialState.levels[0].vddc,
|
||||
&table->initialState.level.vddc,
|
||||
&std_vddc);
|
||||
if (!ret)
|
||||
si_populate_std_voltage_value(rdev, std_vddc,
|
||||
table->initialState.levels[0].vddc.index,
|
||||
&table->initialState.levels[0].std_vddc);
|
||||
table->initialState.level.vddc.index,
|
||||
&table->initialState.level.std_vddc);
|
||||
}
|
||||
|
||||
if (eg_pi->vddci_control)
|
||||
si_populate_voltage_value(rdev,
|
||||
&eg_pi->vddci_voltage_table,
|
||||
initial_state->performance_levels[0].vddci,
|
||||
&table->initialState.levels[0].vddci);
|
||||
&table->initialState.level.vddci);
|
||||
|
||||
if (si_pi->vddc_phase_shed_control)
|
||||
si_populate_phase_shedding_value(rdev,
|
||||
@ -4421,43 +4424,43 @@ static int si_populate_smc_initial_state(struct radeon_device *rdev,
|
||||
initial_state->performance_levels[0].vddc,
|
||||
initial_state->performance_levels[0].sclk,
|
||||
initial_state->performance_levels[0].mclk,
|
||||
&table->initialState.levels[0].vddc);
|
||||
&table->initialState.level.vddc);
|
||||
|
||||
si_populate_initial_mvdd_value(rdev, &table->initialState.levels[0].mvdd);
|
||||
si_populate_initial_mvdd_value(rdev, &table->initialState.level.mvdd);
|
||||
|
||||
reg = CG_R(0xffff) | CG_L(0);
|
||||
table->initialState.levels[0].aT = cpu_to_be32(reg);
|
||||
table->initialState.level.aT = cpu_to_be32(reg);
|
||||
|
||||
table->initialState.levels[0].bSP = cpu_to_be32(pi->dsp);
|
||||
table->initialState.level.bSP = cpu_to_be32(pi->dsp);
|
||||
|
||||
table->initialState.levels[0].gen2PCIE = (u8)si_pi->boot_pcie_gen;
|
||||
table->initialState.level.gen2PCIE = (u8)si_pi->boot_pcie_gen;
|
||||
|
||||
if (pi->mem_gddr5) {
|
||||
table->initialState.levels[0].strobeMode =
|
||||
table->initialState.level.strobeMode =
|
||||
si_get_strobe_mode_settings(rdev,
|
||||
initial_state->performance_levels[0].mclk);
|
||||
|
||||
if (initial_state->performance_levels[0].mclk > pi->mclk_edc_enable_threshold)
|
||||
table->initialState.levels[0].mcFlags = SISLANDS_SMC_MC_EDC_RD_FLAG | SISLANDS_SMC_MC_EDC_WR_FLAG;
|
||||
table->initialState.level.mcFlags = SISLANDS_SMC_MC_EDC_RD_FLAG | SISLANDS_SMC_MC_EDC_WR_FLAG;
|
||||
else
|
||||
table->initialState.levels[0].mcFlags = 0;
|
||||
table->initialState.level.mcFlags = 0;
|
||||
}
|
||||
|
||||
table->initialState.levelCount = 1;
|
||||
|
||||
table->initialState.flags |= PPSMC_SWSTATE_FLAG_DC;
|
||||
|
||||
table->initialState.levels[0].dpm2.MaxPS = 0;
|
||||
table->initialState.levels[0].dpm2.NearTDPDec = 0;
|
||||
table->initialState.levels[0].dpm2.AboveSafeInc = 0;
|
||||
table->initialState.levels[0].dpm2.BelowSafeInc = 0;
|
||||
table->initialState.levels[0].dpm2.PwrEfficiencyRatio = 0;
|
||||
table->initialState.level.dpm2.MaxPS = 0;
|
||||
table->initialState.level.dpm2.NearTDPDec = 0;
|
||||
table->initialState.level.dpm2.AboveSafeInc = 0;
|
||||
table->initialState.level.dpm2.BelowSafeInc = 0;
|
||||
table->initialState.level.dpm2.PwrEfficiencyRatio = 0;
|
||||
|
||||
reg = MIN_POWER_MASK | MAX_POWER_MASK;
|
||||
table->initialState.levels[0].SQPowerThrottle = cpu_to_be32(reg);
|
||||
table->initialState.level.SQPowerThrottle = cpu_to_be32(reg);
|
||||
|
||||
reg = MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK;
|
||||
table->initialState.levels[0].SQPowerThrottle_2 = cpu_to_be32(reg);
|
||||
table->initialState.level.SQPowerThrottle_2 = cpu_to_be32(reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -4488,18 +4491,18 @@ static int si_populate_smc_acpi_state(struct radeon_device *rdev,
|
||||
|
||||
if (pi->acpi_vddc) {
|
||||
ret = si_populate_voltage_value(rdev, &eg_pi->vddc_voltage_table,
|
||||
pi->acpi_vddc, &table->ACPIState.levels[0].vddc);
|
||||
pi->acpi_vddc, &table->ACPIState.level.vddc);
|
||||
if (!ret) {
|
||||
u16 std_vddc;
|
||||
|
||||
ret = si_get_std_voltage_value(rdev,
|
||||
&table->ACPIState.levels[0].vddc, &std_vddc);
|
||||
&table->ACPIState.level.vddc, &std_vddc);
|
||||
if (!ret)
|
||||
si_populate_std_voltage_value(rdev, std_vddc,
|
||||
table->ACPIState.levels[0].vddc.index,
|
||||
&table->ACPIState.levels[0].std_vddc);
|
||||
table->ACPIState.level.vddc.index,
|
||||
&table->ACPIState.level.std_vddc);
|
||||
}
|
||||
table->ACPIState.levels[0].gen2PCIE = si_pi->acpi_pcie_gen;
|
||||
table->ACPIState.level.gen2PCIE = si_pi->acpi_pcie_gen;
|
||||
|
||||
if (si_pi->vddc_phase_shed_control) {
|
||||
si_populate_phase_shedding_value(rdev,
|
||||
@ -4507,23 +4510,23 @@ static int si_populate_smc_acpi_state(struct radeon_device *rdev,
|
||||
pi->acpi_vddc,
|
||||
0,
|
||||
0,
|
||||
&table->ACPIState.levels[0].vddc);
|
||||
&table->ACPIState.level.vddc);
|
||||
}
|
||||
} else {
|
||||
ret = si_populate_voltage_value(rdev, &eg_pi->vddc_voltage_table,
|
||||
pi->min_vddc_in_table, &table->ACPIState.levels[0].vddc);
|
||||
pi->min_vddc_in_table, &table->ACPIState.level.vddc);
|
||||
if (!ret) {
|
||||
u16 std_vddc;
|
||||
|
||||
ret = si_get_std_voltage_value(rdev,
|
||||
&table->ACPIState.levels[0].vddc, &std_vddc);
|
||||
&table->ACPIState.level.vddc, &std_vddc);
|
||||
|
||||
if (!ret)
|
||||
si_populate_std_voltage_value(rdev, std_vddc,
|
||||
table->ACPIState.levels[0].vddc.index,
|
||||
&table->ACPIState.levels[0].std_vddc);
|
||||
table->ACPIState.level.vddc.index,
|
||||
&table->ACPIState.level.std_vddc);
|
||||
}
|
||||
table->ACPIState.levels[0].gen2PCIE = (u8)r600_get_pcie_gen_support(rdev,
|
||||
table->ACPIState.level.gen2PCIE = (u8)r600_get_pcie_gen_support(rdev,
|
||||
si_pi->sys_pcie_mask,
|
||||
si_pi->boot_pcie_gen,
|
||||
RADEON_PCIE_GEN1);
|
||||
@ -4534,14 +4537,14 @@ static int si_populate_smc_acpi_state(struct radeon_device *rdev,
|
||||
pi->min_vddc_in_table,
|
||||
0,
|
||||
0,
|
||||
&table->ACPIState.levels[0].vddc);
|
||||
&table->ACPIState.level.vddc);
|
||||
}
|
||||
|
||||
if (pi->acpi_vddc) {
|
||||
if (eg_pi->acpi_vddci)
|
||||
si_populate_voltage_value(rdev, &eg_pi->vddci_voltage_table,
|
||||
eg_pi->acpi_vddci,
|
||||
&table->ACPIState.levels[0].vddci);
|
||||
&table->ACPIState.level.vddci);
|
||||
}
|
||||
|
||||
mclk_pwrmgt_cntl |= MRDCK0_RESET | MRDCK1_RESET;
|
||||
@ -4552,59 +4555,59 @@ static int si_populate_smc_acpi_state(struct radeon_device *rdev,
|
||||
spll_func_cntl_2 &= ~SCLK_MUX_SEL_MASK;
|
||||
spll_func_cntl_2 |= SCLK_MUX_SEL(4);
|
||||
|
||||
table->ACPIState.levels[0].mclk.vDLL_CNTL =
|
||||
table->ACPIState.level.mclk.vDLL_CNTL =
|
||||
cpu_to_be32(dll_cntl);
|
||||
table->ACPIState.levels[0].mclk.vMCLK_PWRMGT_CNTL =
|
||||
table->ACPIState.level.mclk.vMCLK_PWRMGT_CNTL =
|
||||
cpu_to_be32(mclk_pwrmgt_cntl);
|
||||
table->ACPIState.levels[0].mclk.vMPLL_AD_FUNC_CNTL =
|
||||
table->ACPIState.level.mclk.vMPLL_AD_FUNC_CNTL =
|
||||
cpu_to_be32(mpll_ad_func_cntl);
|
||||
table->ACPIState.levels[0].mclk.vMPLL_DQ_FUNC_CNTL =
|
||||
table->ACPIState.level.mclk.vMPLL_DQ_FUNC_CNTL =
|
||||
cpu_to_be32(mpll_dq_func_cntl);
|
||||
table->ACPIState.levels[0].mclk.vMPLL_FUNC_CNTL =
|
||||
table->ACPIState.level.mclk.vMPLL_FUNC_CNTL =
|
||||
cpu_to_be32(mpll_func_cntl);
|
||||
table->ACPIState.levels[0].mclk.vMPLL_FUNC_CNTL_1 =
|
||||
table->ACPIState.level.mclk.vMPLL_FUNC_CNTL_1 =
|
||||
cpu_to_be32(mpll_func_cntl_1);
|
||||
table->ACPIState.levels[0].mclk.vMPLL_FUNC_CNTL_2 =
|
||||
table->ACPIState.level.mclk.vMPLL_FUNC_CNTL_2 =
|
||||
cpu_to_be32(mpll_func_cntl_2);
|
||||
table->ACPIState.levels[0].mclk.vMPLL_SS =
|
||||
table->ACPIState.level.mclk.vMPLL_SS =
|
||||
cpu_to_be32(si_pi->clock_registers.mpll_ss1);
|
||||
table->ACPIState.levels[0].mclk.vMPLL_SS2 =
|
||||
table->ACPIState.level.mclk.vMPLL_SS2 =
|
||||
cpu_to_be32(si_pi->clock_registers.mpll_ss2);
|
||||
|
||||
table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL =
|
||||
table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL =
|
||||
cpu_to_be32(spll_func_cntl);
|
||||
table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_2 =
|
||||
table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_2 =
|
||||
cpu_to_be32(spll_func_cntl_2);
|
||||
table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_3 =
|
||||
table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_3 =
|
||||
cpu_to_be32(spll_func_cntl_3);
|
||||
table->ACPIState.levels[0].sclk.vCG_SPLL_FUNC_CNTL_4 =
|
||||
table->ACPIState.level.sclk.vCG_SPLL_FUNC_CNTL_4 =
|
||||
cpu_to_be32(spll_func_cntl_4);
|
||||
|
||||
table->ACPIState.levels[0].mclk.mclk_value = 0;
|
||||
table->ACPIState.levels[0].sclk.sclk_value = 0;
|
||||
table->ACPIState.level.mclk.mclk_value = 0;
|
||||
table->ACPIState.level.sclk.sclk_value = 0;
|
||||
|
||||
si_populate_mvdd_value(rdev, 0, &table->ACPIState.levels[0].mvdd);
|
||||
si_populate_mvdd_value(rdev, 0, &table->ACPIState.level.mvdd);
|
||||
|
||||
if (eg_pi->dynamic_ac_timing)
|
||||
table->ACPIState.levels[0].ACIndex = 0;
|
||||
table->ACPIState.level.ACIndex = 0;
|
||||
|
||||
table->ACPIState.levels[0].dpm2.MaxPS = 0;
|
||||
table->ACPIState.levels[0].dpm2.NearTDPDec = 0;
|
||||
table->ACPIState.levels[0].dpm2.AboveSafeInc = 0;
|
||||
table->ACPIState.levels[0].dpm2.BelowSafeInc = 0;
|
||||
table->ACPIState.levels[0].dpm2.PwrEfficiencyRatio = 0;
|
||||
table->ACPIState.level.dpm2.MaxPS = 0;
|
||||
table->ACPIState.level.dpm2.NearTDPDec = 0;
|
||||
table->ACPIState.level.dpm2.AboveSafeInc = 0;
|
||||
table->ACPIState.level.dpm2.BelowSafeInc = 0;
|
||||
table->ACPIState.level.dpm2.PwrEfficiencyRatio = 0;
|
||||
|
||||
reg = MIN_POWER_MASK | MAX_POWER_MASK;
|
||||
table->ACPIState.levels[0].SQPowerThrottle = cpu_to_be32(reg);
|
||||
table->ACPIState.level.SQPowerThrottle = cpu_to_be32(reg);
|
||||
|
||||
reg = MAX_POWER_DELTA_MASK | STI_SIZE_MASK | LTI_RATIO_MASK;
|
||||
table->ACPIState.levels[0].SQPowerThrottle_2 = cpu_to_be32(reg);
|
||||
table->ACPIState.level.SQPowerThrottle_2 = cpu_to_be32(reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int si_populate_ulv_state(struct radeon_device *rdev,
|
||||
SISLANDS_SMC_SWSTATE *state)
|
||||
struct SISLANDS_SMC_SWSTATE_SINGLE *state)
|
||||
{
|
||||
struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
|
||||
struct si_power_info *si_pi = si_get_pi(rdev);
|
||||
@ -4613,19 +4616,19 @@ static int si_populate_ulv_state(struct radeon_device *rdev,
|
||||
int ret;
|
||||
|
||||
ret = si_convert_power_level_to_smc(rdev, &ulv->pl,
|
||||
&state->levels[0]);
|
||||
&state->level);
|
||||
if (!ret) {
|
||||
if (eg_pi->sclk_deep_sleep) {
|
||||
if (sclk_in_sr <= SCLK_MIN_DEEPSLEEP_FREQ)
|
||||
state->levels[0].stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_BYPASS;
|
||||
state->level.stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_BYPASS;
|
||||
else
|
||||
state->levels[0].stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_THROTTLE;
|
||||
state->level.stateFlags |= PPSMC_STATEFLAG_DEEPSLEEP_THROTTLE;
|
||||
}
|
||||
if (ulv->one_pcie_lane_in_ulv)
|
||||
state->flags |= PPSMC_SWSTATE_FLAG_PCIE_X1;
|
||||
state->levels[0].arbRefreshState = (u8)(SISLANDS_ULV_STATE_ARB_INDEX);
|
||||
state->levels[0].ACIndex = 1;
|
||||
state->levels[0].std_vddc = state->levels[0].vddc;
|
||||
state->level.arbRefreshState = (u8)(SISLANDS_ULV_STATE_ARB_INDEX);
|
||||
state->level.ACIndex = 1;
|
||||
state->level.std_vddc = state->level.vddc;
|
||||
state->levelCount = 1;
|
||||
|
||||
state->flags |= PPSMC_SWSTATE_FLAG_DC;
|
||||
@ -4725,7 +4728,9 @@ static int si_init_smc_table(struct radeon_device *rdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
table->driverState = table->initialState;
|
||||
table->driverState.flags = table->initialState.flags;
|
||||
table->driverState.levelCount = table->initialState.levelCount;
|
||||
table->driverState.levels[0] = table->initialState.level;
|
||||
|
||||
ret = si_do_program_memory_timing_parameters(rdev, radeon_boot_state,
|
||||
SISLANDS_INITIAL_STATE_ARB_INDEX);
|
||||
@ -5275,8 +5280,8 @@ static int si_upload_ulv_state(struct radeon_device *rdev)
|
||||
if (ulv->supported && ulv->pl.vddc) {
|
||||
u32 address = si_pi->state_table_start +
|
||||
offsetof(SISLANDS_SMC_STATETABLE, ULVState);
|
||||
SISLANDS_SMC_SWSTATE *smc_state = &si_pi->smc_statetable.ULVState;
|
||||
u32 state_size = sizeof(SISLANDS_SMC_SWSTATE);
|
||||
struct SISLANDS_SMC_SWSTATE_SINGLE *smc_state = &si_pi->smc_statetable.ULVState;
|
||||
u32 state_size = sizeof(struct SISLANDS_SMC_SWSTATE_SINGLE);
|
||||
|
||||
memset(smc_state, 0, state_size);
|
||||
|
||||
|
@ -191,6 +191,14 @@ struct SISLANDS_SMC_SWSTATE
|
||||
|
||||
typedef struct SISLANDS_SMC_SWSTATE SISLANDS_SMC_SWSTATE;
|
||||
|
||||
struct SISLANDS_SMC_SWSTATE_SINGLE {
|
||||
uint8_t flags;
|
||||
uint8_t levelCount;
|
||||
uint8_t padding2;
|
||||
uint8_t padding3;
|
||||
SISLANDS_SMC_HW_PERFORMANCE_LEVEL level;
|
||||
};
|
||||
|
||||
#define SISLANDS_SMC_VOLTAGEMASK_VDDC 0
|
||||
#define SISLANDS_SMC_VOLTAGEMASK_MVDD 1
|
||||
#define SISLANDS_SMC_VOLTAGEMASK_VDDCI 2
|
||||
@ -208,19 +216,19 @@ typedef struct SISLANDS_SMC_VOLTAGEMASKTABLE SISLANDS_SMC_VOLTAGEMASKTABLE;
|
||||
|
||||
struct SISLANDS_SMC_STATETABLE
|
||||
{
|
||||
uint8_t thermalProtectType;
|
||||
uint8_t systemFlags;
|
||||
uint8_t maxVDDCIndexInPPTable;
|
||||
uint8_t extraFlags;
|
||||
uint32_t lowSMIO[SISLANDS_MAX_NO_VREG_STEPS];
|
||||
SISLANDS_SMC_VOLTAGEMASKTABLE voltageMaskTable;
|
||||
SISLANDS_SMC_VOLTAGEMASKTABLE phaseMaskTable;
|
||||
PP_SIslands_DPM2Parameters dpm2Params;
|
||||
SISLANDS_SMC_SWSTATE initialState;
|
||||
SISLANDS_SMC_SWSTATE ACPIState;
|
||||
SISLANDS_SMC_SWSTATE ULVState;
|
||||
SISLANDS_SMC_SWSTATE driverState;
|
||||
SISLANDS_SMC_HW_PERFORMANCE_LEVEL dpmLevels[SISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE - 1];
|
||||
uint8_t thermalProtectType;
|
||||
uint8_t systemFlags;
|
||||
uint8_t maxVDDCIndexInPPTable;
|
||||
uint8_t extraFlags;
|
||||
uint32_t lowSMIO[SISLANDS_MAX_NO_VREG_STEPS];
|
||||
SISLANDS_SMC_VOLTAGEMASKTABLE voltageMaskTable;
|
||||
SISLANDS_SMC_VOLTAGEMASKTABLE phaseMaskTable;
|
||||
PP_SIslands_DPM2Parameters dpm2Params;
|
||||
struct SISLANDS_SMC_SWSTATE_SINGLE initialState;
|
||||
struct SISLANDS_SMC_SWSTATE_SINGLE ACPIState;
|
||||
struct SISLANDS_SMC_SWSTATE_SINGLE ULVState;
|
||||
SISLANDS_SMC_SWSTATE driverState;
|
||||
SISLANDS_SMC_HW_PERFORMANCE_LEVEL dpmLevels[SISLANDS_MAX_SMC_PERFORMANCE_LEVELS_PER_SWSTATE];
|
||||
};
|
||||
|
||||
typedef struct SISLANDS_SMC_STATETABLE SISLANDS_SMC_STATETABLE;
|
||||
|
@ -197,12 +197,6 @@ struct vc4_vec_connector {
|
||||
struct drm_encoder *encoder;
|
||||
};
|
||||
|
||||
static inline struct vc4_vec_connector *
|
||||
to_vc4_vec_connector(struct drm_connector *connector)
|
||||
{
|
||||
return container_of(connector, struct vc4_vec_connector, base);
|
||||
}
|
||||
|
||||
enum vc4_vec_tv_mode_id {
|
||||
VC4_VEC_TV_MODE_NTSC,
|
||||
VC4_VEC_TV_MODE_NTSC_J,
|
||||
|
Loading…
Reference in New Issue
Block a user