mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-23 06:14:42 +08:00
drm/amdgpu: Remove wrapper layer of smu ip functions
1. delete amdgpu_powerplay.c used for wrapping smu ip functions 2. delete struct pp_instance, 3. make struct hwmgr as the smu hw handle. Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Reviewed-by: Evan Quan <evan.quan@amd.com> Signed-off-by: Rex Zhu <Rex.Zhu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
5b2a3d2c15
commit
b905090d2b
@ -87,8 +87,7 @@ amdgpu-y += \
|
||||
|
||||
# add SMC block
|
||||
amdgpu-y += \
|
||||
amdgpu_dpm.o \
|
||||
amdgpu_powerplay.o
|
||||
amdgpu_dpm.o
|
||||
|
||||
# add DCE block
|
||||
amdgpu-y += \
|
||||
|
@ -1393,9 +1393,7 @@ enum amd_hw_ip_block_type {
|
||||
#define HWIP_MAX_INSTANCE 6
|
||||
|
||||
struct amd_powerplay {
|
||||
struct cgs_device *cgs_device;
|
||||
void *pp_handle;
|
||||
const struct amd_ip_funcs *ip_funcs;
|
||||
const struct amd_pm_funcs *pp_funcs;
|
||||
};
|
||||
|
||||
|
@ -1154,7 +1154,7 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj,
|
||||
umode_t effective_mode = attr->mode;
|
||||
|
||||
/* handle non-powerplay limitations */
|
||||
if (!adev->powerplay.cgs_device) {
|
||||
if (!adev->powerplay.pp_handle) {
|
||||
/* Skip fan attributes if fan is not present */
|
||||
if (adev->pm.no_fan &&
|
||||
(attr == &sensor_dev_attr_pwm1.dev_attr.attr ||
|
||||
|
@ -1,285 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 Advanced Micro Devices, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors: AMD
|
||||
*
|
||||
*/
|
||||
#include "atom.h"
|
||||
#include "amdgpu.h"
|
||||
#include "amd_shared.h"
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include "amdgpu_pm.h"
|
||||
#include <drm/amdgpu_drm.h>
|
||||
#include "amdgpu_powerplay.h"
|
||||
#include "si_dpm.h"
|
||||
#include "cik_dpm.h"
|
||||
#include "vi_dpm.h"
|
||||
|
||||
static int amdgpu_pp_early_init(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
struct amd_powerplay *amd_pp;
|
||||
int ret = 0;
|
||||
|
||||
amd_pp = &(adev->powerplay);
|
||||
amd_pp->pp_handle = (void *)adev;
|
||||
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_POLARIS11:
|
||||
case CHIP_POLARIS10:
|
||||
case CHIP_POLARIS12:
|
||||
case CHIP_TONGA:
|
||||
case CHIP_FIJI:
|
||||
case CHIP_TOPAZ:
|
||||
case CHIP_CARRIZO:
|
||||
case CHIP_STONEY:
|
||||
case CHIP_VEGA10:
|
||||
case CHIP_RAVEN:
|
||||
amd_pp->cgs_device = amdgpu_cgs_create_device(adev);
|
||||
amd_pp->ip_funcs = &pp_ip_funcs;
|
||||
amd_pp->pp_funcs = &pp_dpm_funcs;
|
||||
break;
|
||||
/* These chips don't have powerplay implemenations */
|
||||
#ifdef CONFIG_DRM_AMDGPU_SI
|
||||
case CHIP_TAHITI:
|
||||
case CHIP_PITCAIRN:
|
||||
case CHIP_VERDE:
|
||||
case CHIP_OLAND:
|
||||
case CHIP_HAINAN:
|
||||
amd_pp->ip_funcs = &si_dpm_ip_funcs;
|
||||
amd_pp->pp_funcs = &si_dpm_funcs;
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_DRM_AMDGPU_CIK
|
||||
case CHIP_BONAIRE:
|
||||
case CHIP_HAWAII:
|
||||
if (amdgpu_dpm == -1) {
|
||||
amd_pp->ip_funcs = &ci_dpm_ip_funcs;
|
||||
amd_pp->pp_funcs = &ci_dpm_funcs;
|
||||
} else {
|
||||
amd_pp->cgs_device = amdgpu_cgs_create_device(adev);
|
||||
amd_pp->ip_funcs = &pp_ip_funcs;
|
||||
amd_pp->pp_funcs = &pp_dpm_funcs;
|
||||
}
|
||||
break;
|
||||
case CHIP_KABINI:
|
||||
case CHIP_MULLINS:
|
||||
case CHIP_KAVERI:
|
||||
amd_pp->ip_funcs = &kv_dpm_ip_funcs;
|
||||
amd_pp->pp_funcs = &kv_dpm_funcs;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
if (adev->powerplay.ip_funcs->early_init)
|
||||
ret = adev->powerplay.ip_funcs->early_init(adev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int amdgpu_pp_late_init(void *handle)
|
||||
{
|
||||
int ret = 0;
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (adev->powerplay.ip_funcs->late_init)
|
||||
ret = adev->powerplay.ip_funcs->late_init(
|
||||
adev->powerplay.pp_handle);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int amdgpu_pp_sw_init(void *handle)
|
||||
{
|
||||
int ret = 0;
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (adev->powerplay.ip_funcs->sw_init)
|
||||
ret = adev->powerplay.ip_funcs->sw_init(
|
||||
adev->powerplay.pp_handle);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int amdgpu_pp_sw_fini(void *handle)
|
||||
{
|
||||
int ret = 0;
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (adev->powerplay.ip_funcs->sw_fini)
|
||||
ret = adev->powerplay.ip_funcs->sw_fini(
|
||||
adev->powerplay.pp_handle);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int amdgpu_pp_hw_init(void *handle)
|
||||
{
|
||||
int ret = 0;
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (adev->firmware.load_type == AMDGPU_FW_LOAD_SMU)
|
||||
amdgpu_ucode_init_bo(adev);
|
||||
|
||||
if (adev->powerplay.ip_funcs->hw_init)
|
||||
ret = adev->powerplay.ip_funcs->hw_init(
|
||||
adev->powerplay.pp_handle);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int amdgpu_pp_hw_fini(void *handle)
|
||||
{
|
||||
int ret = 0;
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (adev->powerplay.ip_funcs->hw_fini)
|
||||
ret = adev->powerplay.ip_funcs->hw_fini(
|
||||
adev->powerplay.pp_handle);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void amdgpu_pp_late_fini(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (adev->powerplay.ip_funcs->late_fini)
|
||||
adev->powerplay.ip_funcs->late_fini(
|
||||
adev->powerplay.pp_handle);
|
||||
|
||||
if (adev->powerplay.cgs_device)
|
||||
amdgpu_cgs_destroy_device(adev->powerplay.cgs_device);
|
||||
}
|
||||
|
||||
static int amdgpu_pp_suspend(void *handle)
|
||||
{
|
||||
int ret = 0;
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (adev->powerplay.ip_funcs->suspend)
|
||||
ret = adev->powerplay.ip_funcs->suspend(
|
||||
adev->powerplay.pp_handle);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int amdgpu_pp_resume(void *handle)
|
||||
{
|
||||
int ret = 0;
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (adev->powerplay.ip_funcs->resume)
|
||||
ret = adev->powerplay.ip_funcs->resume(
|
||||
adev->powerplay.pp_handle);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int amdgpu_pp_set_clockgating_state(void *handle,
|
||||
enum amd_clockgating_state state)
|
||||
{
|
||||
int ret = 0;
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (adev->powerplay.ip_funcs->set_clockgating_state)
|
||||
ret = adev->powerplay.ip_funcs->set_clockgating_state(
|
||||
adev->powerplay.pp_handle, state);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int amdgpu_pp_set_powergating_state(void *handle,
|
||||
enum amd_powergating_state state)
|
||||
{
|
||||
int ret = 0;
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (adev->powerplay.ip_funcs->set_powergating_state)
|
||||
ret = adev->powerplay.ip_funcs->set_powergating_state(
|
||||
adev->powerplay.pp_handle, state);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static bool amdgpu_pp_is_idle(void *handle)
|
||||
{
|
||||
bool ret = true;
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (adev->powerplay.ip_funcs->is_idle)
|
||||
ret = adev->powerplay.ip_funcs->is_idle(
|
||||
adev->powerplay.pp_handle);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int amdgpu_pp_wait_for_idle(void *handle)
|
||||
{
|
||||
int ret = 0;
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (adev->powerplay.ip_funcs->wait_for_idle)
|
||||
ret = adev->powerplay.ip_funcs->wait_for_idle(
|
||||
adev->powerplay.pp_handle);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int amdgpu_pp_soft_reset(void *handle)
|
||||
{
|
||||
int ret = 0;
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
if (adev->powerplay.ip_funcs->soft_reset)
|
||||
ret = adev->powerplay.ip_funcs->soft_reset(
|
||||
adev->powerplay.pp_handle);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct amd_ip_funcs amdgpu_pp_ip_funcs = {
|
||||
.name = "amdgpu_powerplay",
|
||||
.early_init = amdgpu_pp_early_init,
|
||||
.late_init = amdgpu_pp_late_init,
|
||||
.sw_init = amdgpu_pp_sw_init,
|
||||
.sw_fini = amdgpu_pp_sw_fini,
|
||||
.hw_init = amdgpu_pp_hw_init,
|
||||
.hw_fini = amdgpu_pp_hw_fini,
|
||||
.late_fini = amdgpu_pp_late_fini,
|
||||
.suspend = amdgpu_pp_suspend,
|
||||
.resume = amdgpu_pp_resume,
|
||||
.is_idle = amdgpu_pp_is_idle,
|
||||
.wait_for_idle = amdgpu_pp_wait_for_idle,
|
||||
.soft_reset = amdgpu_pp_soft_reset,
|
||||
.set_clockgating_state = amdgpu_pp_set_clockgating_state,
|
||||
.set_powergating_state = amdgpu_pp_set_powergating_state,
|
||||
};
|
||||
|
||||
const struct amdgpu_ip_block_version amdgpu_pp_ip_block =
|
||||
{
|
||||
.type = AMD_IP_BLOCK_TYPE_SMC,
|
||||
.major = 1,
|
||||
.minor = 0,
|
||||
.rev = 0,
|
||||
.funcs = &amdgpu_pp_ip_funcs,
|
||||
};
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 Advanced Micro Devices, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors: AMD
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __AMDGPU_POWERPLAY_H__
|
||||
#define __AMDGPU_POWERPLAY_H__
|
||||
|
||||
#include "amd_shared.h"
|
||||
|
||||
extern const struct amdgpu_ip_block_version amdgpu_pp_ip_block;
|
||||
|
||||
#endif /* __AMDGPU_POWERPLAY_H__ */
|
@ -65,6 +65,8 @@ MODULE_FIRMWARE("radeon/hawaii_k_smc.bin");
|
||||
#define VOLTAGE_VID_OFFSET_SCALE1 625
|
||||
#define VOLTAGE_VID_OFFSET_SCALE2 100
|
||||
|
||||
static const struct amd_pm_funcs ci_dpm_funcs;
|
||||
|
||||
static const struct ci_pt_defaults defaults_hawaii_xt =
|
||||
{
|
||||
1, 0xF, 0xFD, 0x19, 5, 0x14, 0, 0xB0000,
|
||||
@ -6241,6 +6243,7 @@ static int ci_dpm_early_init(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
adev->powerplay.pp_funcs = &ci_dpm_funcs;
|
||||
ci_dpm_set_irq_funcs(adev);
|
||||
|
||||
return 0;
|
||||
@ -6760,7 +6763,7 @@ static int ci_dpm_read_sensor(void *handle, int idx,
|
||||
}
|
||||
}
|
||||
|
||||
const struct amd_ip_funcs ci_dpm_ip_funcs = {
|
||||
static const struct amd_ip_funcs ci_dpm_ip_funcs = {
|
||||
.name = "ci_dpm",
|
||||
.early_init = ci_dpm_early_init,
|
||||
.late_init = ci_dpm_late_init,
|
||||
@ -6777,7 +6780,16 @@ const struct amd_ip_funcs ci_dpm_ip_funcs = {
|
||||
.set_powergating_state = ci_dpm_set_powergating_state,
|
||||
};
|
||||
|
||||
const struct amd_pm_funcs ci_dpm_funcs = {
|
||||
const struct amdgpu_ip_block_version ci_smu_ip_block =
|
||||
{
|
||||
.type = AMD_IP_BLOCK_TYPE_SMC,
|
||||
.major = 7,
|
||||
.minor = 0,
|
||||
.rev = 0,
|
||||
.funcs = &ci_dpm_ip_funcs,
|
||||
};
|
||||
|
||||
static const struct amd_pm_funcs ci_dpm_funcs = {
|
||||
.pre_set_power_state = &ci_dpm_pre_set_power_state,
|
||||
.set_power_state = &ci_dpm_set_power_state,
|
||||
.post_set_power_state = &ci_dpm_post_set_power_state,
|
||||
|
@ -67,7 +67,6 @@
|
||||
|
||||
#include "amdgpu_dm.h"
|
||||
#include "amdgpu_amdkfd.h"
|
||||
#include "amdgpu_powerplay.h"
|
||||
#include "dce_virtual.h"
|
||||
|
||||
/*
|
||||
@ -1996,7 +1995,10 @@ int cik_set_ip_blocks(struct amdgpu_device *adev)
|
||||
amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
if (amdgpu_dpm == -1)
|
||||
amdgpu_device_ip_block_add(adev, &ci_smu_ip_block);
|
||||
else
|
||||
amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
@ -2014,7 +2016,10 @@ int cik_set_ip_blocks(struct amdgpu_device *adev)
|
||||
amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
if (amdgpu_dpm == -1)
|
||||
amdgpu_device_ip_block_add(adev, &ci_smu_ip_block);
|
||||
else
|
||||
amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
@ -2032,7 +2037,7 @@ int cik_set_ip_blocks(struct amdgpu_device *adev)
|
||||
amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &kv_smu_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
@ -2051,7 +2056,7 @@ int cik_set_ip_blocks(struct amdgpu_device *adev)
|
||||
amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &kv_smu_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
|
@ -24,8 +24,7 @@
|
||||
#ifndef __CIK_DPM_H__
|
||||
#define __CIK_DPM_H__
|
||||
|
||||
extern const struct amd_ip_funcs ci_dpm_ip_funcs;
|
||||
extern const struct amd_ip_funcs kv_dpm_ip_funcs;
|
||||
extern const struct amd_pm_funcs ci_dpm_funcs;
|
||||
extern const struct amd_pm_funcs kv_dpm_funcs;
|
||||
extern const struct amdgpu_ip_block_version ci_smu_ip_block;
|
||||
extern const struct amdgpu_ip_block_version kv_smu_ip_block;
|
||||
|
||||
#endif
|
||||
|
@ -42,6 +42,8 @@
|
||||
#define KV_MINIMUM_ENGINE_CLOCK 800
|
||||
#define SMC_RAM_END 0x40000
|
||||
|
||||
static const struct amd_pm_funcs kv_dpm_funcs;
|
||||
|
||||
static void kv_dpm_set_irq_funcs(struct amdgpu_device *adev);
|
||||
static int kv_enable_nb_dpm(struct amdgpu_device *adev,
|
||||
bool enable);
|
||||
@ -2960,6 +2962,7 @@ static int kv_dpm_early_init(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
adev->powerplay.pp_funcs = &kv_dpm_funcs;
|
||||
kv_dpm_set_irq_funcs(adev);
|
||||
|
||||
return 0;
|
||||
@ -3301,7 +3304,7 @@ static int kv_dpm_read_sensor(void *handle, int idx,
|
||||
}
|
||||
}
|
||||
|
||||
const struct amd_ip_funcs kv_dpm_ip_funcs = {
|
||||
static const struct amd_ip_funcs kv_dpm_ip_funcs = {
|
||||
.name = "kv_dpm",
|
||||
.early_init = kv_dpm_early_init,
|
||||
.late_init = kv_dpm_late_init,
|
||||
@ -3318,7 +3321,16 @@ const struct amd_ip_funcs kv_dpm_ip_funcs = {
|
||||
.set_powergating_state = kv_dpm_set_powergating_state,
|
||||
};
|
||||
|
||||
const struct amd_pm_funcs kv_dpm_funcs = {
|
||||
const struct amdgpu_ip_block_version kv_smu_ip_block =
|
||||
{
|
||||
.type = AMD_IP_BLOCK_TYPE_SMC,
|
||||
.major = 1,
|
||||
.minor = 0,
|
||||
.rev = 0,
|
||||
.funcs = &kv_dpm_ip_funcs,
|
||||
};
|
||||
|
||||
static const struct amd_pm_funcs kv_dpm_funcs = {
|
||||
.pre_set_power_state = &kv_dpm_pre_set_power_state,
|
||||
.set_power_state = &kv_dpm_set_power_state,
|
||||
.post_set_power_state = &kv_dpm_post_set_power_state,
|
||||
|
@ -32,7 +32,7 @@
|
||||
#include "amdgpu_vce.h"
|
||||
#include "atom.h"
|
||||
#include "amd_pcie.h"
|
||||
#include "amdgpu_powerplay.h"
|
||||
#include "si_dpm.h"
|
||||
#include "sid.h"
|
||||
#include "si_ih.h"
|
||||
#include "gfx_v6_0.h"
|
||||
@ -1983,7 +1983,7 @@ int si_set_ip_blocks(struct amdgpu_device *adev)
|
||||
amdgpu_device_ip_block_add(adev, &si_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
else
|
||||
@ -1997,7 +1997,7 @@ int si_set_ip_blocks(struct amdgpu_device *adev)
|
||||
amdgpu_device_ip_block_add(adev, &si_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
else
|
||||
@ -2011,7 +2011,7 @@ int si_set_ip_blocks(struct amdgpu_device *adev)
|
||||
amdgpu_device_ip_block_add(adev, &si_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &si_smu_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
|
||||
|
@ -67,6 +67,8 @@ MODULE_FIRMWARE("radeon/hainan_smc.bin");
|
||||
MODULE_FIRMWARE("radeon/hainan_k_smc.bin");
|
||||
MODULE_FIRMWARE("radeon/banks_k_2_smc.bin");
|
||||
|
||||
static const struct amd_pm_funcs si_dpm_funcs;
|
||||
|
||||
union power_info {
|
||||
struct _ATOM_POWERPLAY_INFO info;
|
||||
struct _ATOM_POWERPLAY_INFO_V2 info_2;
|
||||
@ -7914,6 +7916,7 @@ static int si_dpm_early_init(void *handle)
|
||||
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
adev->powerplay.pp_funcs = &si_dpm_funcs;
|
||||
si_dpm_set_irq_funcs(adev);
|
||||
return 0;
|
||||
}
|
||||
@ -8014,7 +8017,7 @@ static int si_dpm_read_sensor(void *handle, int idx,
|
||||
}
|
||||
}
|
||||
|
||||
const struct amd_ip_funcs si_dpm_ip_funcs = {
|
||||
static const struct amd_ip_funcs si_dpm_ip_funcs = {
|
||||
.name = "si_dpm",
|
||||
.early_init = si_dpm_early_init,
|
||||
.late_init = si_dpm_late_init,
|
||||
@ -8031,7 +8034,16 @@ const struct amd_ip_funcs si_dpm_ip_funcs = {
|
||||
.set_powergating_state = si_dpm_set_powergating_state,
|
||||
};
|
||||
|
||||
const struct amd_pm_funcs si_dpm_funcs = {
|
||||
const struct amdgpu_ip_block_version si_smu_ip_block =
|
||||
{
|
||||
.type = AMD_IP_BLOCK_TYPE_SMC,
|
||||
.major = 6,
|
||||
.minor = 0,
|
||||
.rev = 0,
|
||||
.funcs = &si_dpm_ip_funcs,
|
||||
};
|
||||
|
||||
static const struct amd_pm_funcs si_dpm_funcs = {
|
||||
.pre_set_power_state = &si_dpm_pre_set_power_state,
|
||||
.set_power_state = &si_dpm_set_power_state,
|
||||
.post_set_power_state = &si_dpm_post_set_power_state,
|
||||
|
@ -245,8 +245,7 @@ enum si_display_gap
|
||||
SI_PM_DISPLAY_GAP_IGNORE = 3,
|
||||
};
|
||||
|
||||
extern const struct amd_ip_funcs si_dpm_ip_funcs;
|
||||
extern const struct amd_pm_funcs si_dpm_funcs;
|
||||
extern const struct amdgpu_ip_block_version si_smu_ip_block;
|
||||
|
||||
struct ni_leakage_coeffients
|
||||
{
|
||||
|
@ -57,7 +57,6 @@
|
||||
#include "uvd_v7_0.h"
|
||||
#include "vce_v4_0.h"
|
||||
#include "vcn_v1_0.h"
|
||||
#include "amdgpu_powerplay.h"
|
||||
#include "dce_virtual.h"
|
||||
#include "mxgpu_ai.h"
|
||||
|
||||
@ -533,7 +532,7 @@ int soc15_set_ip_blocks(struct amdgpu_device *adev)
|
||||
amdgpu_device_ip_block_add(adev, &vega10_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &psp_v3_1_ip_block);
|
||||
if (!amdgpu_sriov_vf(adev))
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
|
||||
if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
@ -552,7 +551,7 @@ int soc15_set_ip_blocks(struct amdgpu_device *adev)
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v9_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vega10_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &psp_v10_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
|
||||
if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
|
@ -71,7 +71,6 @@
|
||||
#include "uvd_v5_0.h"
|
||||
#include "uvd_v6_0.h"
|
||||
#include "vce_v3_0.h"
|
||||
#include "amdgpu_powerplay.h"
|
||||
#if defined(CONFIG_DRM_AMD_ACP)
|
||||
#include "amdgpu_acp.h"
|
||||
#endif
|
||||
@ -1511,7 +1510,7 @@ int vi_set_ip_blocks(struct amdgpu_device *adev)
|
||||
amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v7_4_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &iceland_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
|
||||
@ -1521,7 +1520,7 @@ int vi_set_ip_blocks(struct amdgpu_device *adev)
|
||||
amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v8_5_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &tonga_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
|
||||
if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
@ -1541,7 +1540,7 @@ int vi_set_ip_blocks(struct amdgpu_device *adev)
|
||||
amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v8_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &tonga_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
|
||||
if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
@ -1563,7 +1562,7 @@ int vi_set_ip_blocks(struct amdgpu_device *adev)
|
||||
amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v8_1_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &tonga_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
@ -1581,7 +1580,7 @@ int vi_set_ip_blocks(struct amdgpu_device *adev)
|
||||
amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v8_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cz_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
@ -1602,7 +1601,7 @@ int vi_set_ip_blocks(struct amdgpu_device *adev)
|
||||
amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v8_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cz_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &pp_smu_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
|
@ -24,8 +24,7 @@
|
||||
#ifndef __KGD_PP_INTERFACE_H__
|
||||
#define __KGD_PP_INTERFACE_H__
|
||||
|
||||
extern const struct amd_ip_funcs pp_ip_funcs;
|
||||
extern const struct amd_pm_funcs pp_dpm_funcs;
|
||||
extern const struct amdgpu_ip_block_version pp_smu_ip_block;
|
||||
|
||||
struct amd_vce_state {
|
||||
/* vce clocks */
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -116,23 +116,11 @@ static void hwmgr_init_workload_prority(struct pp_hwmgr *hwmgr)
|
||||
hwmgr->workload_setting[4] = PP_SMC_POWER_PROFILE_COMPUTE;
|
||||
}
|
||||
|
||||
int hwmgr_early_init(struct pp_instance *handle)
|
||||
int hwmgr_early_init(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct pp_hwmgr *hwmgr;
|
||||
|
||||
if (handle == NULL)
|
||||
if (hwmgr == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
hwmgr = kzalloc(sizeof(struct pp_hwmgr), GFP_KERNEL);
|
||||
if (hwmgr == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
handle->hwmgr = hwmgr;
|
||||
hwmgr->adev = handle->parent;
|
||||
hwmgr->device = handle->device;
|
||||
hwmgr->chip_family = ((struct amdgpu_device *)handle->parent)->family;
|
||||
hwmgr->chip_id = ((struct amdgpu_device *)handle->parent)->asic_type;
|
||||
hwmgr->feature_mask = amdgpu_pp_feature_mask;
|
||||
hwmgr->usec_timeout = AMD_MAX_USEC_TIMEOUT;
|
||||
hwmgr->power_source = PP_PowerSource_AC;
|
||||
hwmgr->pp_table_version = PP_TABLE_V1;
|
||||
@ -220,16 +208,13 @@ int hwmgr_early_init(struct pp_instance *handle)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hwmgr_hw_init(struct pp_instance *handle)
|
||||
int hwmgr_hw_init(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct pp_hwmgr *hwmgr;
|
||||
int ret = 0;
|
||||
|
||||
if (handle == NULL)
|
||||
if (hwmgr == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
hwmgr = handle->hwmgr;
|
||||
|
||||
if (hwmgr->pptable_func == NULL ||
|
||||
hwmgr->pptable_func->pptable_init == NULL ||
|
||||
hwmgr->hwmgr_func->backend_init == NULL)
|
||||
@ -275,15 +260,11 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int hwmgr_hw_fini(struct pp_instance *handle)
|
||||
int hwmgr_hw_fini(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct pp_hwmgr *hwmgr;
|
||||
|
||||
if (handle == NULL || handle->hwmgr == NULL)
|
||||
if (hwmgr == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
hwmgr = handle->hwmgr;
|
||||
|
||||
phm_stop_thermal_controller(hwmgr);
|
||||
psm_set_boot_states(hwmgr);
|
||||
psm_adjust_power_state_dynamic(hwmgr, false, NULL);
|
||||
@ -297,15 +278,13 @@ int hwmgr_hw_fini(struct pp_instance *handle)
|
||||
return psm_fini_power_state_table(hwmgr);
|
||||
}
|
||||
|
||||
int hwmgr_hw_suspend(struct pp_instance *handle)
|
||||
int hwmgr_hw_suspend(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct pp_hwmgr *hwmgr;
|
||||
int ret = 0;
|
||||
|
||||
if (handle == NULL || handle->hwmgr == NULL)
|
||||
if (hwmgr == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
hwmgr = handle->hwmgr;
|
||||
phm_disable_smc_firmware_ctf(hwmgr);
|
||||
ret = psm_set_boot_states(hwmgr);
|
||||
if (ret)
|
||||
@ -318,15 +297,13 @@ int hwmgr_hw_suspend(struct pp_instance *handle)
|
||||
return ret;
|
||||
}
|
||||
|
||||
int hwmgr_hw_resume(struct pp_instance *handle)
|
||||
int hwmgr_hw_resume(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct pp_hwmgr *hwmgr;
|
||||
int ret = 0;
|
||||
|
||||
if (handle == NULL || handle->hwmgr == NULL)
|
||||
if (hwmgr == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
hwmgr = handle->hwmgr;
|
||||
ret = phm_setup_asic(hwmgr);
|
||||
if (ret)
|
||||
return ret;
|
||||
@ -361,17 +338,14 @@ static enum PP_StateUILabel power_state_convert(enum amd_pm_state_type state)
|
||||
}
|
||||
}
|
||||
|
||||
int hwmgr_handle_task(struct pp_instance *handle, enum amd_pp_task task_id,
|
||||
int hwmgr_handle_task(struct pp_hwmgr *hwmgr, enum amd_pp_task task_id,
|
||||
enum amd_pm_state_type *user_state)
|
||||
{
|
||||
int ret = 0;
|
||||
struct pp_hwmgr *hwmgr;
|
||||
|
||||
if (handle == NULL || handle->hwmgr == NULL)
|
||||
if (hwmgr == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
hwmgr = handle->hwmgr;
|
||||
|
||||
switch (task_id) {
|
||||
case AMD_PP_TASK_DISPLAY_CONFIG_CHANGE:
|
||||
ret = phm_set_cpu_power_state(hwmgr);
|
||||
|
@ -25,7 +25,6 @@
|
||||
|
||||
#include <linux/seq_file.h>
|
||||
#include "amd_powerplay.h"
|
||||
#include "pp_instance.h"
|
||||
#include "hardwaremanager.h"
|
||||
#include "pp_power_source.h"
|
||||
#include "hwmgr_ppt.h"
|
||||
@ -34,7 +33,6 @@
|
||||
#include "power_state.h"
|
||||
#include "smu_helper.h"
|
||||
|
||||
struct pp_instance;
|
||||
struct pp_hwmgr;
|
||||
struct phm_fan_speed_info;
|
||||
struct pp_atomctrl_voltage_table;
|
||||
@ -703,6 +701,8 @@ struct pp_hwmgr {
|
||||
uint32_t chip_family;
|
||||
uint32_t chip_id;
|
||||
uint32_t smu_version;
|
||||
bool pm_en;
|
||||
struct mutex smu_lock;
|
||||
|
||||
uint32_t pp_table_version;
|
||||
void *device;
|
||||
@ -769,12 +769,12 @@ struct cgs_irq_src_funcs {
|
||||
cgs_irq_handler_func_t handler;
|
||||
};
|
||||
|
||||
extern int hwmgr_early_init(struct pp_instance *handle);
|
||||
extern int hwmgr_hw_init(struct pp_instance *handle);
|
||||
extern int hwmgr_hw_fini(struct pp_instance *handle);
|
||||
extern int hwmgr_hw_suspend(struct pp_instance *handle);
|
||||
extern int hwmgr_hw_resume(struct pp_instance *handle);
|
||||
extern int hwmgr_handle_task(struct pp_instance *handle,
|
||||
extern int hwmgr_early_init(struct pp_hwmgr *hwmgr);
|
||||
extern int hwmgr_hw_init(struct pp_hwmgr *hwmgr);
|
||||
extern int hwmgr_hw_fini(struct pp_hwmgr *hwmgr);
|
||||
extern int hwmgr_hw_suspend(struct pp_hwmgr *hwmgr);
|
||||
extern int hwmgr_hw_resume(struct pp_hwmgr *hwmgr);
|
||||
extern int hwmgr_handle_task(struct pp_hwmgr *hwmgr,
|
||||
enum amd_pp_task task_id,
|
||||
enum amd_pm_state_type *user_state);
|
||||
|
||||
|
@ -1,36 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 Advanced Micro Devices, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
#ifndef _PP_INSTANCE_H_
|
||||
#define _PP_INSTANCE_H_
|
||||
|
||||
struct pp_hwmgr;
|
||||
|
||||
struct pp_instance {
|
||||
void *parent; /* e.g. amdgpu_device */
|
||||
void *device; /* e.g. cgs_device */
|
||||
bool pm_en;
|
||||
struct pp_hwmgr *hwmgr;
|
||||
struct mutex pp_lock;
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user