diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1860-drm-amd-powerplay-add-register-thermal-interrupt-in-.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1860-drm-amd-powerplay-add-register-thermal-interrupt-in-.patch | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1860-drm-amd-powerplay-add-register-thermal-interrupt-in-.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1860-drm-amd-powerplay-add-register-thermal-interrupt-in-.patch new file mode 100644 index 00000000..0cd735f2 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1860-drm-amd-powerplay-add-register-thermal-interrupt-in-.patch @@ -0,0 +1,141 @@ +From bbbad70deb4be0c773980059f1b492b3626d3074 Mon Sep 17 00:00:00 2001 +From: Eric Huang <JinHuiEric.Huang@amd.com> +Date: Fri, 15 Sep 2017 16:38:49 -0400 +Subject: [PATCH 1860/4131] drm/amd/powerplay: add register thermal interrupt + in hwmgr_hw_init + +Signed-off-by: Eric Huang <JinHuiEric.Huang@amd.com> +Reviewed-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c | 75 ++++++++++++++++++++++++++++- + drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | 6 +++ + 2 files changed, 80 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c +index ee04336..cb768f9 100644 +--- a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c ++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c +@@ -26,8 +26,8 @@ + #include <linux/kernel.h> + #include <linux/slab.h> + #include <linux/types.h> ++#include <linux/pci.h> + #include <drm/amdgpu_drm.h> +-#include "cgs_common.h" + #include "power_state.h" + #include "hwmgr.h" + #include "pppcielanes.h" +@@ -51,6 +51,75 @@ uint8_t convert_to_vid(uint16_t vddc) + return (uint8_t) ((6200 - (vddc * VOLTAGE_SCALE)) / 25); + } + ++static int phm_get_pci_bus_devfn(struct pp_hwmgr *hwmgr, ++ struct cgs_system_info *sys_info) ++{ ++ sys_info->size = sizeof(struct cgs_system_info); ++ sys_info->info_id = CGS_SYSTEM_INFO_PCIE_BUS_DEVFN; ++ ++ return cgs_query_system_info(hwmgr->device, sys_info); ++} ++ ++static int phm_thermal_l2h_irq(void *private_data, ++ unsigned src_id, const uint32_t *iv_entry) ++{ ++ struct pp_hwmgr *hwmgr = (struct pp_hwmgr *)private_data; ++ struct cgs_system_info sys_info = {0}; ++ int result; ++ ++ result = phm_get_pci_bus_devfn(hwmgr, &sys_info); ++ if (result) ++ return -EINVAL; ++ ++ pr_warn("GPU over temperature range detected on PCIe %lld:%lld.%lld!\n", ++ PCI_BUS_NUM(sys_info.value), ++ PCI_SLOT(sys_info.value), ++ PCI_FUNC(sys_info.value)); ++ return 0; ++} ++ ++static int phm_thermal_h2l_irq(void *private_data, ++ unsigned src_id, const uint32_t *iv_entry) ++{ ++ struct pp_hwmgr *hwmgr = (struct pp_hwmgr *)private_data; ++ struct cgs_system_info sys_info = {0}; ++ int result; ++ ++ result = phm_get_pci_bus_devfn(hwmgr, &sys_info); ++ if (result) ++ return -EINVAL; ++ ++ pr_warn("GPU under temperature range detected on PCIe %lld:%lld.%lld!\n", ++ PCI_BUS_NUM(sys_info.value), ++ PCI_SLOT(sys_info.value), ++ PCI_FUNC(sys_info.value)); ++ return 0; ++} ++ ++static int phm_ctf_irq(void *private_data, ++ unsigned src_id, const uint32_t *iv_entry) ++{ ++ struct pp_hwmgr *hwmgr = (struct pp_hwmgr *)private_data; ++ struct cgs_system_info sys_info = {0}; ++ int result; ++ ++ result = phm_get_pci_bus_devfn(hwmgr, &sys_info); ++ if (result) ++ return -EINVAL; ++ ++ pr_warn("GPU Critical Temperature Fault detected on PCIe %lld:%lld.%lld!\n", ++ PCI_BUS_NUM(sys_info.value), ++ PCI_SLOT(sys_info.value), ++ PCI_FUNC(sys_info.value)); ++ return 0; ++} ++ ++static const struct cgs_irq_src_funcs thermal_irq_src[3] = { ++ {NULL, phm_thermal_l2h_irq}, ++ {NULL, phm_thermal_h2l_irq}, ++ {NULL, phm_ctf_irq} ++}; ++ + int hwmgr_early_init(struct pp_instance *handle) + { + struct pp_hwmgr *hwmgr; +@@ -179,6 +248,10 @@ int hwmgr_hw_init(struct pp_instance *handle) + if (ret) + goto err2; + ++ ret = phm_register_thermal_interrupt(hwmgr, &thermal_irq_src); ++ if (ret) ++ goto err2; ++ + return 0; + err2: + if (hwmgr->hwmgr_func->backend_fini) +diff --git a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h +index f4b6f0e..fa83e69 100644 +--- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h ++++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h +@@ -32,6 +32,7 @@ + #include "ppatomctrl.h" + #include "hwmgr_ppt.h" + #include "power_state.h" ++#include "cgs_linux.h" + + struct pp_instance; + struct pp_hwmgr; +@@ -746,6 +747,11 @@ struct pp_hwmgr { + bool en_umd_pstate; + }; + ++struct cgs_irq_src_funcs { ++ cgs_irq_source_set_func_t set; ++ 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); +-- +2.7.4 + |