* [PATCH] drm/amdgpu: Remove wrapper layer of cgs irq handling
@ 2018-03-20 11:25 Rex Zhu
[not found] ` <1521545159-17550-1-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
0 siblings, 1 reply; 3+ messages in thread
From: Rex Zhu @ 2018-03-20 11:25 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Rex Zhu
1. remove struct cgs_os_ops
2. delete cgs_linux.h
3. refine the irq code for vega10
Change-Id: I1b1b56c38596e632fe627c436a5072ae5b359b8c
Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
---
drivers/gpu/drm/amd/acp/include/acp_gfx_if.h | 1 -
drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c | 111 -------------------
drivers/gpu/drm/amd/display/dc/os_types.h | 2 +-
drivers/gpu/drm/amd/include/cgs_common.h | 1 -
drivers/gpu/drm/amd/include/cgs_linux.h | 119 ---------------------
drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c | 46 +-------
drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c | 28 +++++
drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.h | 5 +
drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | 36 ++++---
drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | 5 -
10 files changed, 56 insertions(+), 298 deletions(-)
delete mode 100644 drivers/gpu/drm/amd/include/cgs_linux.h
diff --git a/drivers/gpu/drm/amd/acp/include/acp_gfx_if.h b/drivers/gpu/drm/amd/acp/include/acp_gfx_if.h
index a72ddb2f..feab8eb 100644
--- a/drivers/gpu/drm/amd/acp/include/acp_gfx_if.h
+++ b/drivers/gpu/drm/amd/acp/include/acp_gfx_if.h
@@ -25,7 +25,6 @@
#define _ACP_GFX_IF_H
#include <linux/types.h>
-#include "cgs_linux.h"
#include "cgs_common.h"
int amd_acp_hw_init(struct cgs_device *cgs_device,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
index 5b37c1a..0f2b376 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
@@ -28,7 +28,6 @@
#include <linux/firmware.h>
#include <drm/amdgpu_drm.h>
#include "amdgpu.h"
-#include "cgs_linux.h"
#include "atom.h"
#include "amdgpu_ucode.h"
@@ -182,109 +181,6 @@ static int amdgpu_cgs_atom_exec_cmd_table(struct cgs_device *cgs_device, unsigne
adev->mode_info.atom_context, table, args);
}
-struct cgs_irq_params {
- unsigned src_id;
- cgs_irq_source_set_func_t set;
- cgs_irq_handler_func_t handler;
- void *private_data;
-};
-
-static int cgs_set_irq_state(struct amdgpu_device *adev,
- struct amdgpu_irq_src *src,
- unsigned type,
- enum amdgpu_interrupt_state state)
-{
- struct cgs_irq_params *irq_params =
- (struct cgs_irq_params *)src->data;
- if (!irq_params)
- return -EINVAL;
- if (!irq_params->set)
- return -EINVAL;
- return irq_params->set(irq_params->private_data,
- irq_params->src_id,
- type,
- (int)state);
-}
-
-static int cgs_process_irq(struct amdgpu_device *adev,
- struct amdgpu_irq_src *source,
- struct amdgpu_iv_entry *entry)
-{
- struct cgs_irq_params *irq_params =
- (struct cgs_irq_params *)source->data;
- if (!irq_params)
- return -EINVAL;
- if (!irq_params->handler)
- return -EINVAL;
- return irq_params->handler(irq_params->private_data,
- irq_params->src_id,
- entry->iv_entry);
-}
-
-static const struct amdgpu_irq_src_funcs cgs_irq_funcs = {
- .set = cgs_set_irq_state,
- .process = cgs_process_irq,
-};
-
-static int amdgpu_cgs_add_irq_source(void *cgs_device,
- unsigned client_id,
- unsigned src_id,
- unsigned num_types,
- cgs_irq_source_set_func_t set,
- cgs_irq_handler_func_t handler,
- void *private_data)
-{
- CGS_FUNC_ADEV;
- int ret = 0;
- struct cgs_irq_params *irq_params;
- struct amdgpu_irq_src *source =
- kzalloc(sizeof(struct amdgpu_irq_src), GFP_KERNEL);
- if (!source)
- return -ENOMEM;
- irq_params =
- kzalloc(sizeof(struct cgs_irq_params), GFP_KERNEL);
- if (!irq_params) {
- kfree(source);
- return -ENOMEM;
- }
- source->num_types = num_types;
- source->funcs = &cgs_irq_funcs;
- irq_params->src_id = src_id;
- irq_params->set = set;
- irq_params->handler = handler;
- irq_params->private_data = private_data;
- source->data = (void *)irq_params;
- ret = amdgpu_irq_add_id(adev, client_id, src_id, source);
- if (ret) {
- kfree(irq_params);
- kfree(source);
- }
-
- return ret;
-}
-
-static int amdgpu_cgs_irq_get(void *cgs_device, unsigned client_id,
- unsigned src_id, unsigned type)
-{
- CGS_FUNC_ADEV;
-
- if (!adev->irq.client[client_id].sources)
- return -EINVAL;
-
- return amdgpu_irq_get(adev, adev->irq.client[client_id].sources[src_id], type);
-}
-
-static int amdgpu_cgs_irq_put(void *cgs_device, unsigned client_id,
- unsigned src_id, unsigned type)
-{
- CGS_FUNC_ADEV;
-
- if (!adev->irq.client[client_id].sources)
- return -EINVAL;
-
- return amdgpu_irq_put(adev, adev->irq.client[client_id].sources[src_id], type);
-}
-
static int amdgpu_cgs_set_clockgating_state(struct cgs_device *cgs_device,
enum amd_ip_block_type block_type,
enum amd_clockgating_state state)
@@ -792,12 +688,6 @@ static int amdgpu_cgs_notify_dpm_enabled(struct cgs_device *cgs_device, bool ena
.lock_grbm_idx = amdgpu_cgs_lock_grbm_idx,
};
-static const struct cgs_os_ops amdgpu_cgs_os_ops = {
- .add_irq_source = amdgpu_cgs_add_irq_source,
- .irq_get = amdgpu_cgs_irq_get,
- .irq_put = amdgpu_cgs_irq_put
-};
-
struct cgs_device *amdgpu_cgs_create_device(struct amdgpu_device *adev)
{
struct amdgpu_cgs_device *cgs_device =
@@ -809,7 +699,6 @@ struct cgs_device *amdgpu_cgs_create_device(struct amdgpu_device *adev)
}
cgs_device->base.ops = &amdgpu_cgs_ops;
- cgs_device->base.os_ops = &amdgpu_cgs_os_ops;
cgs_device->adev = adev;
return (struct cgs_device *)cgs_device;
diff --git a/drivers/gpu/drm/amd/display/dc/os_types.h b/drivers/gpu/drm/amd/display/dc/os_types.h
index 1fcbc99..a407892 100644
--- a/drivers/gpu/drm/amd/display/dc/os_types.h
+++ b/drivers/gpu/drm/amd/display/dc/os_types.h
@@ -32,7 +32,7 @@
#include <linux/kref.h>
-#include "cgs_linux.h"
+#include "cgs_common.h"
#if defined(__BIG_ENDIAN) && !defined(BIGENDIAN_CPU)
#define BIGENDIAN_CPU
diff --git a/drivers/gpu/drm/amd/include/cgs_common.h b/drivers/gpu/drm/amd/include/cgs_common.h
index 6ff8f35..f2814ae 100644
--- a/drivers/gpu/drm/amd/include/cgs_common.h
+++ b/drivers/gpu/drm/amd/include/cgs_common.h
@@ -290,7 +290,6 @@ struct cgs_ops {
struct cgs_device
{
const struct cgs_ops *ops;
- const struct cgs_os_ops *os_ops;
/* to be embedded at the start of driver private structure */
};
diff --git a/drivers/gpu/drm/amd/include/cgs_linux.h b/drivers/gpu/drm/amd/include/cgs_linux.h
deleted file mode 100644
index bc7446c..0000000
--- a/drivers/gpu/drm/amd/include/cgs_linux.h
+++ /dev/null
@@ -1,119 +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 _CGS_LINUX_H
-#define _CGS_LINUX_H
-
-#include "cgs_common.h"
-
-/**
- * cgs_irq_source_set_func() - Callback for enabling/disabling interrupt sources
- * @private_data: private data provided to cgs_add_irq_source
- * @src_id: interrupt source ID
- * @type: interrupt type
- * @enabled: 0 = disable source, non-0 = enable source
- *
- * Return: 0 on success, -errno otherwise
- */
-typedef int (*cgs_irq_source_set_func_t)(void *private_data,
- unsigned src_id, unsigned type,
- int enabled);
-
-/**
- * cgs_irq_handler_func() - Interrupt handler callback
- * @private_data: private data provided to cgs_add_irq_source
- * @src_id: interrupt source ID
- * @iv_entry: pointer to raw ih ring entry
- *
- * This callback runs in interrupt context.
- *
- * Return: 0 on success, -errno otherwise
- */
-typedef int (*cgs_irq_handler_func_t)(void *private_data,
- unsigned src_id, const uint32_t *iv_entry);
-
-/**
- * cgs_add_irq_source() - Add an IRQ source
- * @cgs_device: opaque device handle
- * @src_id: interrupt source ID
- * @num_types: number of interrupt types that can be independently enabled
- * @set: callback function to enable/disable an interrupt type
- * @handler: interrupt handler callback
- * @private_data: private data to pass to callback functions
- *
- * The same IRQ source can be added only once. Adding an IRQ source
- * indicates ownership of that IRQ source and all its IRQ types.
- *
- * Return: 0 on success, -errno otherwise
- */
-typedef int (*cgs_add_irq_source_t)(void *cgs_device, unsigned client_id,
- unsigned src_id,
- unsigned num_types,
- cgs_irq_source_set_func_t set,
- cgs_irq_handler_func_t handler,
- void *private_data);
-
-/**
- * cgs_irq_get() - Request enabling an IRQ source and type
- * @cgs_device: opaque device handle
- * @src_id: interrupt source ID
- * @type: interrupt type
- *
- * cgs_irq_get and cgs_irq_put calls must be balanced. They count
- * "references" to IRQ sources.
- *
- * Return: 0 on success, -errno otherwise
- */
-typedef int (*cgs_irq_get_t)(void *cgs_device, unsigned client_id, unsigned src_id, unsigned type);
-
-/**
- * cgs_irq_put() - Indicate IRQ source is no longer needed
- * @cgs_device: opaque device handle
- * @src_id: interrupt source ID
- * @type: interrupt type
- *
- * cgs_irq_get and cgs_irq_put calls must be balanced. They count
- * "references" to IRQ sources. Even after cgs_irq_put is called, the
- * IRQ handler may still be called if there are more refecences to
- * the IRQ source.
- *
- * Return: 0 on success, -errno otherwise
- */
-typedef int (*cgs_irq_put_t)(void *cgs_device, unsigned client_id, unsigned src_id, unsigned type);
-
-struct cgs_os_ops {
- /* IRQ handling */
- cgs_add_irq_source_t add_irq_source;
- cgs_irq_get_t irq_get;
- cgs_irq_put_t irq_put;
-};
-
-#define cgs_add_irq_source(dev,client_id,src_id,num_types,set,handler,private_data) \
- CGS_OS_CALL(add_irq_source,dev,client_id,src_id,num_types,set,handler, \
- private_data)
-#define cgs_irq_get(dev,client_id,src_id,type) \
- CGS_OS_CALL(irq_get,dev,client_id,src_id,type)
-#define cgs_irq_put(dev,client_id,src_id,type) \
- CGS_OS_CALL(irq_put,dev,client_id,src_id,type)
-
-#endif /* _CGS_LINUX_H */
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
index 2290300..fbcdda5 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
@@ -56,50 +56,6 @@
static int topaz_set_asic_special_caps(struct pp_hwmgr *hwmgr);
static int ci_set_asic_special_caps(struct pp_hwmgr *hwmgr);
-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 amdgpu_device *adev = hwmgr->adev;
-
- pr_warn("GPU over temperature range detected on PCIe %d:%d.%d!\n",
- PCI_BUS_NUM(adev->pdev->devfn),
- PCI_SLOT(adev->pdev->devfn),
- PCI_FUNC(adev->pdev->devfn));
- 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 amdgpu_device *adev = hwmgr->adev;
-
- pr_warn("GPU under temperature range detected on PCIe %d:%d.%d!\n",
- PCI_BUS_NUM(adev->pdev->devfn),
- PCI_SLOT(adev->pdev->devfn),
- PCI_FUNC(adev->pdev->devfn));
- 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 amdgpu_device *adev = hwmgr->adev;
-
- pr_warn("GPU Critical Temperature Fault detected on PCIe %d:%d.%d!\n",
- PCI_BUS_NUM(adev->pdev->devfn),
- PCI_SLOT(adev->pdev->devfn),
- PCI_FUNC(adev->pdev->devfn));
- return 0;
-}
-
-static const struct cgs_irq_src_funcs thermal_irq_src[3] = {
- { .handler = phm_thermal_l2h_irq },
- { .handler = phm_thermal_h2l_irq },
- { .handler = phm_ctf_irq }
-};
static void hwmgr_init_workload_prority(struct pp_hwmgr *hwmgr)
{
@@ -244,7 +200,7 @@ int hwmgr_hw_init(struct pp_hwmgr *hwmgr)
if (ret)
goto err2;
- ret = phm_register_thermal_interrupt(hwmgr, &thermal_irq_src);
+ ret = phm_register_thermal_interrupt(hwmgr, NULL);
if (ret)
goto err2;
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c
index e11daf5..dc1fe3b 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c
@@ -534,3 +534,31 @@ int phm_get_voltage_evv_on_sclk(struct pp_hwmgr *hwmgr, uint8_t voltage_type,
}
+extern int phm_irq_process(struct amdgpu_device *adev,
+ struct amdgpu_irq_src *source,
+ struct amdgpu_iv_entry *entry)
+{
+ uint32_t client_id = entry->client_id;
+ uint32_t src_id = entry->src_id;
+
+ if (client_id == SOC15_IH_CLIENTID_THM) {
+ if (src_id == 0)
+ pr_warn("GPU over temperature range detected on PCIe %d:%d.%d!\n",
+ PCI_BUS_NUM(adev->pdev->devfn),
+ PCI_SLOT(adev->pdev->devfn),
+ PCI_FUNC(adev->pdev->devfn));
+ else
+ pr_warn("GPU under temperature range detected on PCIe %d:%d.%d!\n",
+ PCI_BUS_NUM(adev->pdev->devfn),
+ PCI_SLOT(adev->pdev->devfn),
+ PCI_FUNC(adev->pdev->devfn));
+ }
+
+ if (client_id == SOC15_IH_CLIENTID_ROM_SMUIO)
+ pr_warn("GPU Critical Temperature Fault detected on PCIe %d:%d.%d!\n",
+ PCI_BUS_NUM(adev->pdev->devfn),
+ PCI_SLOT(adev->pdev->devfn),
+ PCI_FUNC(adev->pdev->devfn));
+
+ return 0;
+}
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.h b/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.h
index a1a4913..8e84760 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.h
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.h
@@ -73,6 +73,11 @@ extern int phm_wait_on_indirect_register(struct pp_hwmgr *hwmgr,
uint32_t value,
uint32_t mask);
+extern int phm_irq_process(struct amdgpu_device *adev,
+ struct amdgpu_irq_src *source,
+ struct amdgpu_iv_entry *entry);
+
+
#define PHM_FIELD_SHIFT(reg, field) reg##__##field##__SHIFT
#define PHM_FIELD_MASK(reg, field) reg##__##field##_MASK
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
index 5521137..f9c9f42 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
@@ -44,7 +44,6 @@
#include "vega10_thermal.h"
#include "pp_debug.h"
#include "amd_pcie_helpers.h"
-#include "cgs_linux.h"
#include "ppinterrupt.h"
#include "pp_overdriver.h"
#include "pp_thermal.h"
@@ -4816,34 +4815,41 @@ static int vega10_get_thermal_temperature_range(struct pp_hwmgr *hwmgr,
return 0;
}
+static const struct amdgpu_irq_src_funcs smu9_irq_funcs = {
+ .process = phm_irq_process,
+};
+
static int vega10_register_thermal_interrupt(struct pp_hwmgr *hwmgr,
const void *info)
{
- struct cgs_irq_src_funcs *irq_src =
- (struct cgs_irq_src_funcs *)info;
+ struct amdgpu_irq_src *source =
+ kzalloc(sizeof(struct amdgpu_irq_src), GFP_KERNEL);
+
+ if (!source)
+ return -ENOMEM;
+
+ source->funcs = &smu9_irq_funcs;
if (hwmgr->thermal_controller.ucType ==
ATOM_VEGA10_PP_THERMALCONTROLLER_VEGA10 ||
hwmgr->thermal_controller.ucType ==
ATOM_VEGA10_PP_THERMALCONTROLLER_EMC2103_WITH_INTERNAL) {
- PP_ASSERT_WITH_CODE(!cgs_add_irq_source(hwmgr->device,
+
+ amdgpu_irq_add_id((struct amdgpu_device *)(hwmgr->adev),
SOC15_IH_CLIENTID_THM,
- 0, 0, irq_src[0].set, irq_src[0].handler, hwmgr),
- "Failed to register high thermal interrupt!",
- return -EINVAL);
- PP_ASSERT_WITH_CODE(!cgs_add_irq_source(hwmgr->device,
+ 0,
+ source);
+ amdgpu_irq_add_id((struct amdgpu_device *)(hwmgr->adev),
SOC15_IH_CLIENTID_THM,
- 1, 0, irq_src[1].set, irq_src[1].handler, hwmgr),
- "Failed to register low thermal interrupt!",
- return -EINVAL);
+ 1,
+ source);
}
/* Register CTF(GPIO_19) interrupt */
- PP_ASSERT_WITH_CODE(!cgs_add_irq_source(hwmgr->device,
+ amdgpu_irq_add_id((struct amdgpu_device *)(hwmgr->adev),
SOC15_IH_CLIENTID_ROM_SMUIO,
- 83, 0, irq_src[2].set, irq_src[2].handler, hwmgr),
- "Failed to register CTF thermal interrupt!",
- return -EINVAL);
+ 83,
+ source);
return 0;
}
diff --git a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
index 85b46ad..2667775 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
@@ -764,11 +764,6 @@ struct pp_hwmgr {
uint32_t workload_setting[Workload_Policy_Max];
};
-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_hwmgr *hwmgr);
extern int hwmgr_hw_init(struct pp_hwmgr *hwmgr);
extern int hwmgr_hw_fini(struct pp_hwmgr *hwmgr);
--
1.9.1
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 3+ messages in thread[parent not found: <1521545159-17550-1-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>]
* Re: [PATCH] drm/amdgpu: Remove wrapper layer of cgs irq handling [not found] ` <1521545159-17550-1-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org> @ 2018-03-20 13:50 ` Christian König 2018-03-21 1:48 ` Zhang, Jerry (Junwei) 1 sibling, 0 replies; 3+ messages in thread From: Christian König @ 2018-03-20 13:50 UTC (permalink / raw) To: Rex Zhu, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW Am 20.03.2018 um 12:25 schrieb Rex Zhu: > 1. remove struct cgs_os_ops > 2. delete cgs_linux.h > 3. refine the irq code for vega10 > > Change-Id: I1b1b56c38596e632fe627c436a5072ae5b359b8c > Signed-off-by: Rex Zhu <Rex.Zhu@amd.com> Acked-by: Christian König <christian.koenig@amd.com> > --- > drivers/gpu/drm/amd/acp/include/acp_gfx_if.h | 1 - > drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c | 111 ------------------- > drivers/gpu/drm/amd/display/dc/os_types.h | 2 +- > drivers/gpu/drm/amd/include/cgs_common.h | 1 - > drivers/gpu/drm/amd/include/cgs_linux.h | 119 --------------------- > drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c | 46 +------- > drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c | 28 +++++ > drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.h | 5 + > drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | 36 ++++--- > drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | 5 - > 10 files changed, 56 insertions(+), 298 deletions(-) > delete mode 100644 drivers/gpu/drm/amd/include/cgs_linux.h > > diff --git a/drivers/gpu/drm/amd/acp/include/acp_gfx_if.h b/drivers/gpu/drm/amd/acp/include/acp_gfx_if.h > index a72ddb2f..feab8eb 100644 > --- a/drivers/gpu/drm/amd/acp/include/acp_gfx_if.h > +++ b/drivers/gpu/drm/amd/acp/include/acp_gfx_if.h > @@ -25,7 +25,6 @@ > #define _ACP_GFX_IF_H > > #include <linux/types.h> > -#include "cgs_linux.h" > #include "cgs_common.h" > > int amd_acp_hw_init(struct cgs_device *cgs_device, > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c > index 5b37c1a..0f2b376 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c > @@ -28,7 +28,6 @@ > #include <linux/firmware.h> > #include <drm/amdgpu_drm.h> > #include "amdgpu.h" > -#include "cgs_linux.h" > #include "atom.h" > #include "amdgpu_ucode.h" > > @@ -182,109 +181,6 @@ static int amdgpu_cgs_atom_exec_cmd_table(struct cgs_device *cgs_device, unsigne > adev->mode_info.atom_context, table, args); > } > > -struct cgs_irq_params { > - unsigned src_id; > - cgs_irq_source_set_func_t set; > - cgs_irq_handler_func_t handler; > - void *private_data; > -}; > - > -static int cgs_set_irq_state(struct amdgpu_device *adev, > - struct amdgpu_irq_src *src, > - unsigned type, > - enum amdgpu_interrupt_state state) > -{ > - struct cgs_irq_params *irq_params = > - (struct cgs_irq_params *)src->data; > - if (!irq_params) > - return -EINVAL; > - if (!irq_params->set) > - return -EINVAL; > - return irq_params->set(irq_params->private_data, > - irq_params->src_id, > - type, > - (int)state); > -} > - > -static int cgs_process_irq(struct amdgpu_device *adev, > - struct amdgpu_irq_src *source, > - struct amdgpu_iv_entry *entry) > -{ > - struct cgs_irq_params *irq_params = > - (struct cgs_irq_params *)source->data; > - if (!irq_params) > - return -EINVAL; > - if (!irq_params->handler) > - return -EINVAL; > - return irq_params->handler(irq_params->private_data, > - irq_params->src_id, > - entry->iv_entry); > -} > - > -static const struct amdgpu_irq_src_funcs cgs_irq_funcs = { > - .set = cgs_set_irq_state, > - .process = cgs_process_irq, > -}; > - > -static int amdgpu_cgs_add_irq_source(void *cgs_device, > - unsigned client_id, > - unsigned src_id, > - unsigned num_types, > - cgs_irq_source_set_func_t set, > - cgs_irq_handler_func_t handler, > - void *private_data) > -{ > - CGS_FUNC_ADEV; > - int ret = 0; > - struct cgs_irq_params *irq_params; > - struct amdgpu_irq_src *source = > - kzalloc(sizeof(struct amdgpu_irq_src), GFP_KERNEL); > - if (!source) > - return -ENOMEM; > - irq_params = > - kzalloc(sizeof(struct cgs_irq_params), GFP_KERNEL); > - if (!irq_params) { > - kfree(source); > - return -ENOMEM; > - } > - source->num_types = num_types; > - source->funcs = &cgs_irq_funcs; > - irq_params->src_id = src_id; > - irq_params->set = set; > - irq_params->handler = handler; > - irq_params->private_data = private_data; > - source->data = (void *)irq_params; > - ret = amdgpu_irq_add_id(adev, client_id, src_id, source); > - if (ret) { > - kfree(irq_params); > - kfree(source); > - } > - > - return ret; > -} > - > -static int amdgpu_cgs_irq_get(void *cgs_device, unsigned client_id, > - unsigned src_id, unsigned type) > -{ > - CGS_FUNC_ADEV; > - > - if (!adev->irq.client[client_id].sources) > - return -EINVAL; > - > - return amdgpu_irq_get(adev, adev->irq.client[client_id].sources[src_id], type); > -} > - > -static int amdgpu_cgs_irq_put(void *cgs_device, unsigned client_id, > - unsigned src_id, unsigned type) > -{ > - CGS_FUNC_ADEV; > - > - if (!adev->irq.client[client_id].sources) > - return -EINVAL; > - > - return amdgpu_irq_put(adev, adev->irq.client[client_id].sources[src_id], type); > -} > - > static int amdgpu_cgs_set_clockgating_state(struct cgs_device *cgs_device, > enum amd_ip_block_type block_type, > enum amd_clockgating_state state) > @@ -792,12 +688,6 @@ static int amdgpu_cgs_notify_dpm_enabled(struct cgs_device *cgs_device, bool ena > .lock_grbm_idx = amdgpu_cgs_lock_grbm_idx, > }; > > -static const struct cgs_os_ops amdgpu_cgs_os_ops = { > - .add_irq_source = amdgpu_cgs_add_irq_source, > - .irq_get = amdgpu_cgs_irq_get, > - .irq_put = amdgpu_cgs_irq_put > -}; > - > struct cgs_device *amdgpu_cgs_create_device(struct amdgpu_device *adev) > { > struct amdgpu_cgs_device *cgs_device = > @@ -809,7 +699,6 @@ struct cgs_device *amdgpu_cgs_create_device(struct amdgpu_device *adev) > } > > cgs_device->base.ops = &amdgpu_cgs_ops; > - cgs_device->base.os_ops = &amdgpu_cgs_os_ops; > cgs_device->adev = adev; > > return (struct cgs_device *)cgs_device; > diff --git a/drivers/gpu/drm/amd/display/dc/os_types.h b/drivers/gpu/drm/amd/display/dc/os_types.h > index 1fcbc99..a407892 100644 > --- a/drivers/gpu/drm/amd/display/dc/os_types.h > +++ b/drivers/gpu/drm/amd/display/dc/os_types.h > @@ -32,7 +32,7 @@ > > #include <linux/kref.h> > > -#include "cgs_linux.h" > +#include "cgs_common.h" > > #if defined(__BIG_ENDIAN) && !defined(BIGENDIAN_CPU) > #define BIGENDIAN_CPU > diff --git a/drivers/gpu/drm/amd/include/cgs_common.h b/drivers/gpu/drm/amd/include/cgs_common.h > index 6ff8f35..f2814ae 100644 > --- a/drivers/gpu/drm/amd/include/cgs_common.h > +++ b/drivers/gpu/drm/amd/include/cgs_common.h > @@ -290,7 +290,6 @@ struct cgs_ops { > struct cgs_device > { > const struct cgs_ops *ops; > - const struct cgs_os_ops *os_ops; > /* to be embedded at the start of driver private structure */ > }; > > diff --git a/drivers/gpu/drm/amd/include/cgs_linux.h b/drivers/gpu/drm/amd/include/cgs_linux.h > deleted file mode 100644 > index bc7446c..0000000 > --- a/drivers/gpu/drm/amd/include/cgs_linux.h > +++ /dev/null > @@ -1,119 +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 _CGS_LINUX_H > -#define _CGS_LINUX_H > - > -#include "cgs_common.h" > - > -/** > - * cgs_irq_source_set_func() - Callback for enabling/disabling interrupt sources > - * @private_data: private data provided to cgs_add_irq_source > - * @src_id: interrupt source ID > - * @type: interrupt type > - * @enabled: 0 = disable source, non-0 = enable source > - * > - * Return: 0 on success, -errno otherwise > - */ > -typedef int (*cgs_irq_source_set_func_t)(void *private_data, > - unsigned src_id, unsigned type, > - int enabled); > - > -/** > - * cgs_irq_handler_func() - Interrupt handler callback > - * @private_data: private data provided to cgs_add_irq_source > - * @src_id: interrupt source ID > - * @iv_entry: pointer to raw ih ring entry > - * > - * This callback runs in interrupt context. > - * > - * Return: 0 on success, -errno otherwise > - */ > -typedef int (*cgs_irq_handler_func_t)(void *private_data, > - unsigned src_id, const uint32_t *iv_entry); > - > -/** > - * cgs_add_irq_source() - Add an IRQ source > - * @cgs_device: opaque device handle > - * @src_id: interrupt source ID > - * @num_types: number of interrupt types that can be independently enabled > - * @set: callback function to enable/disable an interrupt type > - * @handler: interrupt handler callback > - * @private_data: private data to pass to callback functions > - * > - * The same IRQ source can be added only once. Adding an IRQ source > - * indicates ownership of that IRQ source and all its IRQ types. > - * > - * Return: 0 on success, -errno otherwise > - */ > -typedef int (*cgs_add_irq_source_t)(void *cgs_device, unsigned client_id, > - unsigned src_id, > - unsigned num_types, > - cgs_irq_source_set_func_t set, > - cgs_irq_handler_func_t handler, > - void *private_data); > - > -/** > - * cgs_irq_get() - Request enabling an IRQ source and type > - * @cgs_device: opaque device handle > - * @src_id: interrupt source ID > - * @type: interrupt type > - * > - * cgs_irq_get and cgs_irq_put calls must be balanced. They count > - * "references" to IRQ sources. > - * > - * Return: 0 on success, -errno otherwise > - */ > -typedef int (*cgs_irq_get_t)(void *cgs_device, unsigned client_id, unsigned src_id, unsigned type); > - > -/** > - * cgs_irq_put() - Indicate IRQ source is no longer needed > - * @cgs_device: opaque device handle > - * @src_id: interrupt source ID > - * @type: interrupt type > - * > - * cgs_irq_get and cgs_irq_put calls must be balanced. They count > - * "references" to IRQ sources. Even after cgs_irq_put is called, the > - * IRQ handler may still be called if there are more refecences to > - * the IRQ source. > - * > - * Return: 0 on success, -errno otherwise > - */ > -typedef int (*cgs_irq_put_t)(void *cgs_device, unsigned client_id, unsigned src_id, unsigned type); > - > -struct cgs_os_ops { > - /* IRQ handling */ > - cgs_add_irq_source_t add_irq_source; > - cgs_irq_get_t irq_get; > - cgs_irq_put_t irq_put; > -}; > - > -#define cgs_add_irq_source(dev,client_id,src_id,num_types,set,handler,private_data) \ > - CGS_OS_CALL(add_irq_source,dev,client_id,src_id,num_types,set,handler, \ > - private_data) > -#define cgs_irq_get(dev,client_id,src_id,type) \ > - CGS_OS_CALL(irq_get,dev,client_id,src_id,type) > -#define cgs_irq_put(dev,client_id,src_id,type) \ > - CGS_OS_CALL(irq_put,dev,client_id,src_id,type) > - > -#endif /* _CGS_LINUX_H */ > diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c > index 2290300..fbcdda5 100644 > --- a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c > +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c > @@ -56,50 +56,6 @@ > static int topaz_set_asic_special_caps(struct pp_hwmgr *hwmgr); > static int ci_set_asic_special_caps(struct pp_hwmgr *hwmgr); > > -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 amdgpu_device *adev = hwmgr->adev; > - > - pr_warn("GPU over temperature range detected on PCIe %d:%d.%d!\n", > - PCI_BUS_NUM(adev->pdev->devfn), > - PCI_SLOT(adev->pdev->devfn), > - PCI_FUNC(adev->pdev->devfn)); > - 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 amdgpu_device *adev = hwmgr->adev; > - > - pr_warn("GPU under temperature range detected on PCIe %d:%d.%d!\n", > - PCI_BUS_NUM(adev->pdev->devfn), > - PCI_SLOT(adev->pdev->devfn), > - PCI_FUNC(adev->pdev->devfn)); > - 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 amdgpu_device *adev = hwmgr->adev; > - > - pr_warn("GPU Critical Temperature Fault detected on PCIe %d:%d.%d!\n", > - PCI_BUS_NUM(adev->pdev->devfn), > - PCI_SLOT(adev->pdev->devfn), > - PCI_FUNC(adev->pdev->devfn)); > - return 0; > -} > - > -static const struct cgs_irq_src_funcs thermal_irq_src[3] = { > - { .handler = phm_thermal_l2h_irq }, > - { .handler = phm_thermal_h2l_irq }, > - { .handler = phm_ctf_irq } > -}; > > static void hwmgr_init_workload_prority(struct pp_hwmgr *hwmgr) > { > @@ -244,7 +200,7 @@ int hwmgr_hw_init(struct pp_hwmgr *hwmgr) > if (ret) > goto err2; > > - ret = phm_register_thermal_interrupt(hwmgr, &thermal_irq_src); > + ret = phm_register_thermal_interrupt(hwmgr, NULL); > if (ret) > goto err2; > > diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c > index e11daf5..dc1fe3b 100644 > --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c > +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c > @@ -534,3 +534,31 @@ int phm_get_voltage_evv_on_sclk(struct pp_hwmgr *hwmgr, uint8_t voltage_type, > } > > > +extern int phm_irq_process(struct amdgpu_device *adev, > + struct amdgpu_irq_src *source, > + struct amdgpu_iv_entry *entry) > +{ > + uint32_t client_id = entry->client_id; > + uint32_t src_id = entry->src_id; > + > + if (client_id == SOC15_IH_CLIENTID_THM) { > + if (src_id == 0) > + pr_warn("GPU over temperature range detected on PCIe %d:%d.%d!\n", > + PCI_BUS_NUM(adev->pdev->devfn), > + PCI_SLOT(adev->pdev->devfn), > + PCI_FUNC(adev->pdev->devfn)); > + else > + pr_warn("GPU under temperature range detected on PCIe %d:%d.%d!\n", > + PCI_BUS_NUM(adev->pdev->devfn), > + PCI_SLOT(adev->pdev->devfn), > + PCI_FUNC(adev->pdev->devfn)); > + } > + > + if (client_id == SOC15_IH_CLIENTID_ROM_SMUIO) > + pr_warn("GPU Critical Temperature Fault detected on PCIe %d:%d.%d!\n", > + PCI_BUS_NUM(adev->pdev->devfn), > + PCI_SLOT(adev->pdev->devfn), > + PCI_FUNC(adev->pdev->devfn)); > + > + return 0; > +} > diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.h b/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.h > index a1a4913..8e84760 100644 > --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.h > +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.h > @@ -73,6 +73,11 @@ extern int phm_wait_on_indirect_register(struct pp_hwmgr *hwmgr, > uint32_t value, > uint32_t mask); > > +extern int phm_irq_process(struct amdgpu_device *adev, > + struct amdgpu_irq_src *source, > + struct amdgpu_iv_entry *entry); > + > + > #define PHM_FIELD_SHIFT(reg, field) reg##__##field##__SHIFT > #define PHM_FIELD_MASK(reg, field) reg##__##field##_MASK > > diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c > index 5521137..f9c9f42 100644 > --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c > +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c > @@ -44,7 +44,6 @@ > #include "vega10_thermal.h" > #include "pp_debug.h" > #include "amd_pcie_helpers.h" > -#include "cgs_linux.h" > #include "ppinterrupt.h" > #include "pp_overdriver.h" > #include "pp_thermal.h" > @@ -4816,34 +4815,41 @@ static int vega10_get_thermal_temperature_range(struct pp_hwmgr *hwmgr, > return 0; > } > > +static const struct amdgpu_irq_src_funcs smu9_irq_funcs = { > + .process = phm_irq_process, > +}; > + > static int vega10_register_thermal_interrupt(struct pp_hwmgr *hwmgr, > const void *info) > { > - struct cgs_irq_src_funcs *irq_src = > - (struct cgs_irq_src_funcs *)info; > + struct amdgpu_irq_src *source = > + kzalloc(sizeof(struct amdgpu_irq_src), GFP_KERNEL); > + > + if (!source) > + return -ENOMEM; > + > + source->funcs = &smu9_irq_funcs; > > if (hwmgr->thermal_controller.ucType == > ATOM_VEGA10_PP_THERMALCONTROLLER_VEGA10 || > hwmgr->thermal_controller.ucType == > ATOM_VEGA10_PP_THERMALCONTROLLER_EMC2103_WITH_INTERNAL) { > - PP_ASSERT_WITH_CODE(!cgs_add_irq_source(hwmgr->device, > + > + amdgpu_irq_add_id((struct amdgpu_device *)(hwmgr->adev), > SOC15_IH_CLIENTID_THM, > - 0, 0, irq_src[0].set, irq_src[0].handler, hwmgr), > - "Failed to register high thermal interrupt!", > - return -EINVAL); > - PP_ASSERT_WITH_CODE(!cgs_add_irq_source(hwmgr->device, > + 0, > + source); > + amdgpu_irq_add_id((struct amdgpu_device *)(hwmgr->adev), > SOC15_IH_CLIENTID_THM, > - 1, 0, irq_src[1].set, irq_src[1].handler, hwmgr), > - "Failed to register low thermal interrupt!", > - return -EINVAL); > + 1, > + source); > } > > /* Register CTF(GPIO_19) interrupt */ > - PP_ASSERT_WITH_CODE(!cgs_add_irq_source(hwmgr->device, > + amdgpu_irq_add_id((struct amdgpu_device *)(hwmgr->adev), > SOC15_IH_CLIENTID_ROM_SMUIO, > - 83, 0, irq_src[2].set, irq_src[2].handler, hwmgr), > - "Failed to register CTF thermal interrupt!", > - return -EINVAL); > + 83, > + source); > > return 0; > } > diff --git a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h > index 85b46ad..2667775 100644 > --- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h > +++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h > @@ -764,11 +764,6 @@ struct pp_hwmgr { > uint32_t workload_setting[Workload_Policy_Max]; > }; > > -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_hwmgr *hwmgr); > extern int hwmgr_hw_init(struct pp_hwmgr *hwmgr); > extern int hwmgr_hw_fini(struct pp_hwmgr *hwmgr); _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] drm/amdgpu: Remove wrapper layer of cgs irq handling [not found] ` <1521545159-17550-1-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org> 2018-03-20 13:50 ` Christian König @ 2018-03-21 1:48 ` Zhang, Jerry (Junwei) 1 sibling, 0 replies; 3+ messages in thread From: Zhang, Jerry (Junwei) @ 2018-03-21 1:48 UTC (permalink / raw) To: Rex Zhu, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW On 03/20/2018 07:25 PM, Rex Zhu wrote: > 1. remove struct cgs_os_ops > 2. delete cgs_linux.h > 3. refine the irq code for vega10 > > Change-Id: I1b1b56c38596e632fe627c436a5072ae5b359b8c > Signed-off-by: Rex Zhu <Rex.Zhu@amd.com> Acked-by: Junwei Zhang <Jerry.Zhang@amd.com> Nice to see that Jerry > --- > drivers/gpu/drm/amd/acp/include/acp_gfx_if.h | 1 - > drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c | 111 ------------------- > drivers/gpu/drm/amd/display/dc/os_types.h | 2 +- > drivers/gpu/drm/amd/include/cgs_common.h | 1 - > drivers/gpu/drm/amd/include/cgs_linux.h | 119 --------------------- > drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c | 46 +------- > drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c | 28 +++++ > drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.h | 5 + > drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | 36 ++++--- > drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | 5 - > 10 files changed, 56 insertions(+), 298 deletions(-) > delete mode 100644 drivers/gpu/drm/amd/include/cgs_linux.h > > diff --git a/drivers/gpu/drm/amd/acp/include/acp_gfx_if.h b/drivers/gpu/drm/amd/acp/include/acp_gfx_if.h > index a72ddb2f..feab8eb 100644 > --- a/drivers/gpu/drm/amd/acp/include/acp_gfx_if.h > +++ b/drivers/gpu/drm/amd/acp/include/acp_gfx_if.h > @@ -25,7 +25,6 @@ > #define _ACP_GFX_IF_H > > #include <linux/types.h> > -#include "cgs_linux.h" > #include "cgs_common.h" > > int amd_acp_hw_init(struct cgs_device *cgs_device, > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c > index 5b37c1a..0f2b376 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c > @@ -28,7 +28,6 @@ > #include <linux/firmware.h> > #include <drm/amdgpu_drm.h> > #include "amdgpu.h" > -#include "cgs_linux.h" > #include "atom.h" > #include "amdgpu_ucode.h" > > @@ -182,109 +181,6 @@ static int amdgpu_cgs_atom_exec_cmd_table(struct cgs_device *cgs_device, unsigne > adev->mode_info.atom_context, table, args); > } > > -struct cgs_irq_params { > - unsigned src_id; > - cgs_irq_source_set_func_t set; > - cgs_irq_handler_func_t handler; > - void *private_data; > -}; > - > -static int cgs_set_irq_state(struct amdgpu_device *adev, > - struct amdgpu_irq_src *src, > - unsigned type, > - enum amdgpu_interrupt_state state) > -{ > - struct cgs_irq_params *irq_params = > - (struct cgs_irq_params *)src->data; > - if (!irq_params) > - return -EINVAL; > - if (!irq_params->set) > - return -EINVAL; > - return irq_params->set(irq_params->private_data, > - irq_params->src_id, > - type, > - (int)state); > -} > - > -static int cgs_process_irq(struct amdgpu_device *adev, > - struct amdgpu_irq_src *source, > - struct amdgpu_iv_entry *entry) > -{ > - struct cgs_irq_params *irq_params = > - (struct cgs_irq_params *)source->data; > - if (!irq_params) > - return -EINVAL; > - if (!irq_params->handler) > - return -EINVAL; > - return irq_params->handler(irq_params->private_data, > - irq_params->src_id, > - entry->iv_entry); > -} > - > -static const struct amdgpu_irq_src_funcs cgs_irq_funcs = { > - .set = cgs_set_irq_state, > - .process = cgs_process_irq, > -}; > - > -static int amdgpu_cgs_add_irq_source(void *cgs_device, > - unsigned client_id, > - unsigned src_id, > - unsigned num_types, > - cgs_irq_source_set_func_t set, > - cgs_irq_handler_func_t handler, > - void *private_data) > -{ > - CGS_FUNC_ADEV; > - int ret = 0; > - struct cgs_irq_params *irq_params; > - struct amdgpu_irq_src *source = > - kzalloc(sizeof(struct amdgpu_irq_src), GFP_KERNEL); > - if (!source) > - return -ENOMEM; > - irq_params = > - kzalloc(sizeof(struct cgs_irq_params), GFP_KERNEL); > - if (!irq_params) { > - kfree(source); > - return -ENOMEM; > - } > - source->num_types = num_types; > - source->funcs = &cgs_irq_funcs; > - irq_params->src_id = src_id; > - irq_params->set = set; > - irq_params->handler = handler; > - irq_params->private_data = private_data; > - source->data = (void *)irq_params; > - ret = amdgpu_irq_add_id(adev, client_id, src_id, source); > - if (ret) { > - kfree(irq_params); > - kfree(source); > - } > - > - return ret; > -} > - > -static int amdgpu_cgs_irq_get(void *cgs_device, unsigned client_id, > - unsigned src_id, unsigned type) > -{ > - CGS_FUNC_ADEV; > - > - if (!adev->irq.client[client_id].sources) > - return -EINVAL; > - > - return amdgpu_irq_get(adev, adev->irq.client[client_id].sources[src_id], type); > -} > - > -static int amdgpu_cgs_irq_put(void *cgs_device, unsigned client_id, > - unsigned src_id, unsigned type) > -{ > - CGS_FUNC_ADEV; > - > - if (!adev->irq.client[client_id].sources) > - return -EINVAL; > - > - return amdgpu_irq_put(adev, adev->irq.client[client_id].sources[src_id], type); > -} > - > static int amdgpu_cgs_set_clockgating_state(struct cgs_device *cgs_device, > enum amd_ip_block_type block_type, > enum amd_clockgating_state state) > @@ -792,12 +688,6 @@ static int amdgpu_cgs_notify_dpm_enabled(struct cgs_device *cgs_device, bool ena > .lock_grbm_idx = amdgpu_cgs_lock_grbm_idx, > }; > > -static const struct cgs_os_ops amdgpu_cgs_os_ops = { > - .add_irq_source = amdgpu_cgs_add_irq_source, > - .irq_get = amdgpu_cgs_irq_get, > - .irq_put = amdgpu_cgs_irq_put > -}; > - > struct cgs_device *amdgpu_cgs_create_device(struct amdgpu_device *adev) > { > struct amdgpu_cgs_device *cgs_device = > @@ -809,7 +699,6 @@ struct cgs_device *amdgpu_cgs_create_device(struct amdgpu_device *adev) > } > > cgs_device->base.ops = &amdgpu_cgs_ops; > - cgs_device->base.os_ops = &amdgpu_cgs_os_ops; > cgs_device->adev = adev; > > return (struct cgs_device *)cgs_device; > diff --git a/drivers/gpu/drm/amd/display/dc/os_types.h b/drivers/gpu/drm/amd/display/dc/os_types.h > index 1fcbc99..a407892 100644 > --- a/drivers/gpu/drm/amd/display/dc/os_types.h > +++ b/drivers/gpu/drm/amd/display/dc/os_types.h > @@ -32,7 +32,7 @@ > > #include <linux/kref.h> > > -#include "cgs_linux.h" > +#include "cgs_common.h" > > #if defined(__BIG_ENDIAN) && !defined(BIGENDIAN_CPU) > #define BIGENDIAN_CPU > diff --git a/drivers/gpu/drm/amd/include/cgs_common.h b/drivers/gpu/drm/amd/include/cgs_common.h > index 6ff8f35..f2814ae 100644 > --- a/drivers/gpu/drm/amd/include/cgs_common.h > +++ b/drivers/gpu/drm/amd/include/cgs_common.h > @@ -290,7 +290,6 @@ struct cgs_ops { > struct cgs_device > { > const struct cgs_ops *ops; > - const struct cgs_os_ops *os_ops; > /* to be embedded at the start of driver private structure */ > }; > > diff --git a/drivers/gpu/drm/amd/include/cgs_linux.h b/drivers/gpu/drm/amd/include/cgs_linux.h > deleted file mode 100644 > index bc7446c..0000000 > --- a/drivers/gpu/drm/amd/include/cgs_linux.h > +++ /dev/null > @@ -1,119 +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 _CGS_LINUX_H > -#define _CGS_LINUX_H > - > -#include "cgs_common.h" > - > -/** > - * cgs_irq_source_set_func() - Callback for enabling/disabling interrupt sources > - * @private_data: private data provided to cgs_add_irq_source > - * @src_id: interrupt source ID > - * @type: interrupt type > - * @enabled: 0 = disable source, non-0 = enable source > - * > - * Return: 0 on success, -errno otherwise > - */ > -typedef int (*cgs_irq_source_set_func_t)(void *private_data, > - unsigned src_id, unsigned type, > - int enabled); > - > -/** > - * cgs_irq_handler_func() - Interrupt handler callback > - * @private_data: private data provided to cgs_add_irq_source > - * @src_id: interrupt source ID > - * @iv_entry: pointer to raw ih ring entry > - * > - * This callback runs in interrupt context. > - * > - * Return: 0 on success, -errno otherwise > - */ > -typedef int (*cgs_irq_handler_func_t)(void *private_data, > - unsigned src_id, const uint32_t *iv_entry); > - > -/** > - * cgs_add_irq_source() - Add an IRQ source > - * @cgs_device: opaque device handle > - * @src_id: interrupt source ID > - * @num_types: number of interrupt types that can be independently enabled > - * @set: callback function to enable/disable an interrupt type > - * @handler: interrupt handler callback > - * @private_data: private data to pass to callback functions > - * > - * The same IRQ source can be added only once. Adding an IRQ source > - * indicates ownership of that IRQ source and all its IRQ types. > - * > - * Return: 0 on success, -errno otherwise > - */ > -typedef int (*cgs_add_irq_source_t)(void *cgs_device, unsigned client_id, > - unsigned src_id, > - unsigned num_types, > - cgs_irq_source_set_func_t set, > - cgs_irq_handler_func_t handler, > - void *private_data); > - > -/** > - * cgs_irq_get() - Request enabling an IRQ source and type > - * @cgs_device: opaque device handle > - * @src_id: interrupt source ID > - * @type: interrupt type > - * > - * cgs_irq_get and cgs_irq_put calls must be balanced. They count > - * "references" to IRQ sources. > - * > - * Return: 0 on success, -errno otherwise > - */ > -typedef int (*cgs_irq_get_t)(void *cgs_device, unsigned client_id, unsigned src_id, unsigned type); > - > -/** > - * cgs_irq_put() - Indicate IRQ source is no longer needed > - * @cgs_device: opaque device handle > - * @src_id: interrupt source ID > - * @type: interrupt type > - * > - * cgs_irq_get and cgs_irq_put calls must be balanced. They count > - * "references" to IRQ sources. Even after cgs_irq_put is called, the > - * IRQ handler may still be called if there are more refecences to > - * the IRQ source. > - * > - * Return: 0 on success, -errno otherwise > - */ > -typedef int (*cgs_irq_put_t)(void *cgs_device, unsigned client_id, unsigned src_id, unsigned type); > - > -struct cgs_os_ops { > - /* IRQ handling */ > - cgs_add_irq_source_t add_irq_source; > - cgs_irq_get_t irq_get; > - cgs_irq_put_t irq_put; > -}; > - > -#define cgs_add_irq_source(dev,client_id,src_id,num_types,set,handler,private_data) \ > - CGS_OS_CALL(add_irq_source,dev,client_id,src_id,num_types,set,handler, \ > - private_data) > -#define cgs_irq_get(dev,client_id,src_id,type) \ > - CGS_OS_CALL(irq_get,dev,client_id,src_id,type) > -#define cgs_irq_put(dev,client_id,src_id,type) \ > - CGS_OS_CALL(irq_put,dev,client_id,src_id,type) > - > -#endif /* _CGS_LINUX_H */ > diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c > index 2290300..fbcdda5 100644 > --- a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c > +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c > @@ -56,50 +56,6 @@ > static int topaz_set_asic_special_caps(struct pp_hwmgr *hwmgr); > static int ci_set_asic_special_caps(struct pp_hwmgr *hwmgr); > > -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 amdgpu_device *adev = hwmgr->adev; > - > - pr_warn("GPU over temperature range detected on PCIe %d:%d.%d!\n", > - PCI_BUS_NUM(adev->pdev->devfn), > - PCI_SLOT(adev->pdev->devfn), > - PCI_FUNC(adev->pdev->devfn)); > - 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 amdgpu_device *adev = hwmgr->adev; > - > - pr_warn("GPU under temperature range detected on PCIe %d:%d.%d!\n", > - PCI_BUS_NUM(adev->pdev->devfn), > - PCI_SLOT(adev->pdev->devfn), > - PCI_FUNC(adev->pdev->devfn)); > - 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 amdgpu_device *adev = hwmgr->adev; > - > - pr_warn("GPU Critical Temperature Fault detected on PCIe %d:%d.%d!\n", > - PCI_BUS_NUM(adev->pdev->devfn), > - PCI_SLOT(adev->pdev->devfn), > - PCI_FUNC(adev->pdev->devfn)); > - return 0; > -} > - > -static const struct cgs_irq_src_funcs thermal_irq_src[3] = { > - { .handler = phm_thermal_l2h_irq }, > - { .handler = phm_thermal_h2l_irq }, > - { .handler = phm_ctf_irq } > -}; > > static void hwmgr_init_workload_prority(struct pp_hwmgr *hwmgr) > { > @@ -244,7 +200,7 @@ int hwmgr_hw_init(struct pp_hwmgr *hwmgr) > if (ret) > goto err2; > > - ret = phm_register_thermal_interrupt(hwmgr, &thermal_irq_src); > + ret = phm_register_thermal_interrupt(hwmgr, NULL); > if (ret) > goto err2; > > diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c > index e11daf5..dc1fe3b 100644 > --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c > +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c > @@ -534,3 +534,31 @@ int phm_get_voltage_evv_on_sclk(struct pp_hwmgr *hwmgr, uint8_t voltage_type, > } > > > +extern int phm_irq_process(struct amdgpu_device *adev, > + struct amdgpu_irq_src *source, > + struct amdgpu_iv_entry *entry) > +{ > + uint32_t client_id = entry->client_id; > + uint32_t src_id = entry->src_id; > + > + if (client_id == SOC15_IH_CLIENTID_THM) { > + if (src_id == 0) > + pr_warn("GPU over temperature range detected on PCIe %d:%d.%d!\n", > + PCI_BUS_NUM(adev->pdev->devfn), > + PCI_SLOT(adev->pdev->devfn), > + PCI_FUNC(adev->pdev->devfn)); > + else > + pr_warn("GPU under temperature range detected on PCIe %d:%d.%d!\n", > + PCI_BUS_NUM(adev->pdev->devfn), > + PCI_SLOT(adev->pdev->devfn), > + PCI_FUNC(adev->pdev->devfn)); > + } > + > + if (client_id == SOC15_IH_CLIENTID_ROM_SMUIO) > + pr_warn("GPU Critical Temperature Fault detected on PCIe %d:%d.%d!\n", > + PCI_BUS_NUM(adev->pdev->devfn), > + PCI_SLOT(adev->pdev->devfn), > + PCI_FUNC(adev->pdev->devfn)); > + > + return 0; > +} > diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.h b/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.h > index a1a4913..8e84760 100644 > --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.h > +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.h > @@ -73,6 +73,11 @@ extern int phm_wait_on_indirect_register(struct pp_hwmgr *hwmgr, > uint32_t value, > uint32_t mask); > > +extern int phm_irq_process(struct amdgpu_device *adev, > + struct amdgpu_irq_src *source, > + struct amdgpu_iv_entry *entry); > + > + > #define PHM_FIELD_SHIFT(reg, field) reg##__##field##__SHIFT > #define PHM_FIELD_MASK(reg, field) reg##__##field##_MASK > > diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c > index 5521137..f9c9f42 100644 > --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c > +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c > @@ -44,7 +44,6 @@ > #include "vega10_thermal.h" > #include "pp_debug.h" > #include "amd_pcie_helpers.h" > -#include "cgs_linux.h" > #include "ppinterrupt.h" > #include "pp_overdriver.h" > #include "pp_thermal.h" > @@ -4816,34 +4815,41 @@ static int vega10_get_thermal_temperature_range(struct pp_hwmgr *hwmgr, > return 0; > } > > +static const struct amdgpu_irq_src_funcs smu9_irq_funcs = { > + .process = phm_irq_process, > +}; > + > static int vega10_register_thermal_interrupt(struct pp_hwmgr *hwmgr, > const void *info) > { > - struct cgs_irq_src_funcs *irq_src = > - (struct cgs_irq_src_funcs *)info; > + struct amdgpu_irq_src *source = > + kzalloc(sizeof(struct amdgpu_irq_src), GFP_KERNEL); > + > + if (!source) > + return -ENOMEM; > + > + source->funcs = &smu9_irq_funcs; > > if (hwmgr->thermal_controller.ucType == > ATOM_VEGA10_PP_THERMALCONTROLLER_VEGA10 || > hwmgr->thermal_controller.ucType == > ATOM_VEGA10_PP_THERMALCONTROLLER_EMC2103_WITH_INTERNAL) { > - PP_ASSERT_WITH_CODE(!cgs_add_irq_source(hwmgr->device, > + > + amdgpu_irq_add_id((struct amdgpu_device *)(hwmgr->adev), > SOC15_IH_CLIENTID_THM, > - 0, 0, irq_src[0].set, irq_src[0].handler, hwmgr), > - "Failed to register high thermal interrupt!", > - return -EINVAL); > - PP_ASSERT_WITH_CODE(!cgs_add_irq_source(hwmgr->device, > + 0, > + source); > + amdgpu_irq_add_id((struct amdgpu_device *)(hwmgr->adev), > SOC15_IH_CLIENTID_THM, > - 1, 0, irq_src[1].set, irq_src[1].handler, hwmgr), > - "Failed to register low thermal interrupt!", > - return -EINVAL); > + 1, > + source); > } > > /* Register CTF(GPIO_19) interrupt */ > - PP_ASSERT_WITH_CODE(!cgs_add_irq_source(hwmgr->device, > + amdgpu_irq_add_id((struct amdgpu_device *)(hwmgr->adev), > SOC15_IH_CLIENTID_ROM_SMUIO, > - 83, 0, irq_src[2].set, irq_src[2].handler, hwmgr), > - "Failed to register CTF thermal interrupt!", > - return -EINVAL); > + 83, > + source); > > return 0; > } > diff --git a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h > index 85b46ad..2667775 100644 > --- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h > +++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h > @@ -764,11 +764,6 @@ struct pp_hwmgr { > uint32_t workload_setting[Workload_Policy_Max]; > }; > > -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_hwmgr *hwmgr); > extern int hwmgr_hw_init(struct pp_hwmgr *hwmgr); > extern int hwmgr_hw_fini(struct pp_hwmgr *hwmgr); > _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2018-03-21 1:48 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-03-20 11:25 [PATCH] drm/amdgpu: Remove wrapper layer of cgs irq handling Rex Zhu
[not found] ` <1521545159-17550-1-git-send-email-Rex.Zhu-5C7GfCeVMHo@public.gmane.org>
2018-03-20 13:50 ` Christian König
2018-03-21 1:48 ` Zhang, Jerry (Junwei)
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.