aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amdfalconx86/recipes-kernel/linux/files/0048-drm-amd-powerplay-add-event-manager-sub-component.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amdfalconx86/recipes-kernel/linux/files/0048-drm-amd-powerplay-add-event-manager-sub-component.patch')
-rw-r--r--meta-amdfalconx86/recipes-kernel/linux/files/0048-drm-amd-powerplay-add-event-manager-sub-component.patch2664
1 files changed, 0 insertions, 2664 deletions
diff --git a/meta-amdfalconx86/recipes-kernel/linux/files/0048-drm-amd-powerplay-add-event-manager-sub-component.patch b/meta-amdfalconx86/recipes-kernel/linux/files/0048-drm-amd-powerplay-add-event-manager-sub-component.patch
deleted file mode 100644
index 482edcb3..00000000
--- a/meta-amdfalconx86/recipes-kernel/linux/files/0048-drm-amd-powerplay-add-event-manager-sub-component.patch
+++ /dev/null
@@ -1,2664 +0,0 @@
-From 38aada7e86d4605b3edc269dfaa48637a16426b0 Mon Sep 17 00:00:00 2001
-From: Rex Zhu <Rex.Zhu@amd.com>
-Date: Wed, 23 Sep 2015 15:14:54 +0800
-Subject: [PATCH 0048/1110] drm/amd/powerplay: add event manager sub-component
-
-The event manager handles power related driver events.
-
-Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
-Reviewed-by: Jammy Zhou <Jammy.Zhou@amd.com>
-Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
----
- drivers/gpu/drm/amd/powerplay/Makefile | 2 +-
- drivers/gpu/drm/amd/powerplay/amd_powerplay.c | 23 ++
- drivers/gpu/drm/amd/powerplay/eventmgr/Makefile | 11 +
- .../drm/amd/powerplay/eventmgr/eventactionchains.c | 287 +++++++++++++++
- .../drm/amd/powerplay/eventmgr/eventactionchains.h | 62 ++++
- drivers/gpu/drm/amd/powerplay/eventmgr/eventinit.c | 180 +++++++++
- drivers/gpu/drm/amd/powerplay/eventmgr/eventinit.h | 34 ++
- .../drm/amd/powerplay/eventmgr/eventmanagement.c | 215 +++++++++++
- .../drm/amd/powerplay/eventmgr/eventmanagement.h | 59 +++
- drivers/gpu/drm/amd/powerplay/eventmgr/eventmgr.c | 114 ++++++
- .../drm/amd/powerplay/eventmgr/eventsubchains.c | 395 ++++++++++++++++++++
- .../drm/amd/powerplay/eventmgr/eventsubchains.h | 98 +++++
- .../gpu/drm/amd/powerplay/eventmgr/eventtasks.c | 408 +++++++++++++++++++++
- .../gpu/drm/amd/powerplay/eventmgr/eventtasks.h | 85 +++++
- drivers/gpu/drm/amd/powerplay/eventmgr/psm.c | 111 ++++++
- drivers/gpu/drm/amd/powerplay/eventmgr/psm.h | 37 ++
- drivers/gpu/drm/amd/powerplay/inc/eventmanager.h | 109 ++++++
- drivers/gpu/drm/amd/powerplay/inc/eventmgr.h | 125 +++++++
- drivers/gpu/drm/amd/powerplay/inc/pp_feature.h | 67 ++++
- drivers/gpu/drm/amd/powerplay/inc/pp_instance.h | 2 +
- 20 files changed, 2423 insertions(+), 1 deletion(-)
- create mode 100644 drivers/gpu/drm/amd/powerplay/eventmgr/Makefile
- create mode 100644 drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c
- create mode 100644 drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.h
- create mode 100644 drivers/gpu/drm/amd/powerplay/eventmgr/eventinit.c
- create mode 100644 drivers/gpu/drm/amd/powerplay/eventmgr/eventinit.h
- create mode 100644 drivers/gpu/drm/amd/powerplay/eventmgr/eventmanagement.c
- create mode 100644 drivers/gpu/drm/amd/powerplay/eventmgr/eventmanagement.h
- create mode 100644 drivers/gpu/drm/amd/powerplay/eventmgr/eventmgr.c
- create mode 100644 drivers/gpu/drm/amd/powerplay/eventmgr/eventsubchains.c
- create mode 100644 drivers/gpu/drm/amd/powerplay/eventmgr/eventsubchains.h
- create mode 100644 drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.c
- create mode 100644 drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.h
- create mode 100644 drivers/gpu/drm/amd/powerplay/eventmgr/psm.c
- create mode 100644 drivers/gpu/drm/amd/powerplay/eventmgr/psm.h
- create mode 100644 drivers/gpu/drm/amd/powerplay/inc/eventmanager.h
- create mode 100644 drivers/gpu/drm/amd/powerplay/inc/eventmgr.h
- create mode 100644 drivers/gpu/drm/amd/powerplay/inc/pp_feature.h
-
-diff --git a/drivers/gpu/drm/amd/powerplay/Makefile b/drivers/gpu/drm/amd/powerplay/Makefile
-index 6359c67..0231021 100644
---- a/drivers/gpu/drm/amd/powerplay/Makefile
-+++ b/drivers/gpu/drm/amd/powerplay/Makefile
-@@ -6,7 +6,7 @@ subdir-ccflags-y += -Iinclude/drm \
-
- AMD_PP_PATH = ../powerplay
-
--PP_LIBS = smumgr hwmgr
-+PP_LIBS = smumgr hwmgr eventmgr
-
- AMD_POWERPLAY = $(addsuffix /Makefile,$(addprefix drivers/gpu/drm/amd/powerplay/,$(PP_LIBS)))
-
-diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
-index 88fdb04..1964a2a 100644
---- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
-+++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
-@@ -52,6 +52,7 @@ static int pp_sw_init(void *handle)
- return -EINVAL;
-
- ret = hwmgr->pptable_func->pptable_init(hwmgr);
-+
- if (ret == 0)
- ret = hwmgr->hwmgr_func->backend_init(hwmgr);
-
-@@ -81,6 +82,7 @@ static int pp_hw_init(void *handle)
- {
- struct pp_instance *pp_handle;
- struct pp_smumgr *smumgr;
-+ struct pp_eventmgr *eventmgr;
- int ret = 0;
-
- if (handle == NULL)
-@@ -106,8 +108,14 @@ static int pp_hw_init(void *handle)
- smumgr->smumgr_funcs->smu_fini(smumgr);
- return ret;
- }
-+
- hw_init_power_state_table(pp_handle->hwmgr);
-+ eventmgr = pp_handle->eventmgr;
-
-+ if (eventmgr == NULL || eventmgr->pp_eventmgr_init == NULL)
-+ return -EINVAL;
-+
-+ ret = eventmgr->pp_eventmgr_init(eventmgr);
- return 0;
- }
-
-@@ -115,11 +123,17 @@ static int pp_hw_fini(void *handle)
- {
- struct pp_instance *pp_handle;
- struct pp_smumgr *smumgr;
-+ struct pp_eventmgr *eventmgr;
-
- if (handle == NULL)
- return -EINVAL;
-
- pp_handle = (struct pp_instance *)handle;
-+ eventmgr = pp_handle->eventmgr;
-+
-+ if (eventmgr != NULL || eventmgr->pp_eventmgr_fini != NULL)
-+ eventmgr->pp_eventmgr_fini(eventmgr);
-+
- smumgr = pp_handle->smu_mgr;
-
- if (smumgr != NULL || smumgr->smumgr_funcs != NULL ||
-@@ -273,9 +287,15 @@ static int amd_pp_instance_init(struct amd_pp_init *pp_init,
- if (ret)
- goto fail_hwmgr;
-
-+ ret = eventmgr_init(handle);
-+ if (ret)
-+ goto fail_eventmgr;
-+
- amd_pp->pp_handle = handle;
- return 0;
-
-+fail_eventmgr:
-+ hwmgr_fini(handle->hwmgr);
- fail_hwmgr:
- smum_fini(handle->smu_mgr);
- fail_smum:
-@@ -286,9 +306,12 @@ fail_smum:
- static int amd_pp_instance_fini(void *handle)
- {
- struct pp_instance *instance = (struct pp_instance *)handle;
-+
- if (instance == NULL)
- return -EINVAL;
-
-+ eventmgr_fini(instance->eventmgr);
-+
- hwmgr_fini(instance->hwmgr);
-
- smum_fini(instance->smu_mgr);
-diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/Makefile b/drivers/gpu/drm/amd/powerplay/eventmgr/Makefile
-new file mode 100644
-index 0000000..7509e38
---- /dev/null
-+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/Makefile
-@@ -0,0 +1,11 @@
-+#
-+# Makefile for the 'event manager' sub-component of powerplay.
-+# It provides the event management services for the driver.
-+
-+EVENT_MGR = eventmgr.o eventinit.o eventmanagement.o \
-+ eventactionchains.o eventsubchains.o eventtasks.o psm.o
-+
-+AMD_PP_EVENT = $(addprefix $(AMD_PP_PATH)/eventmgr/,$(EVENT_MGR))
-+
-+AMD_POWERPLAY_FILES += $(AMD_PP_EVENT)
-+
-diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c b/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c
-new file mode 100644
-index 0000000..e9fe85f
---- /dev/null
-+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c
-@@ -0,0 +1,287 @@
-+/*
-+ * 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.
-+ *
-+ */
-+#include "eventmgr.h"
-+#include "eventactionchains.h"
-+#include "eventsubchains.h"
-+
-+static const pem_event_action *initialize_event[] = {
-+ block_adjust_power_state_tasks,
-+ power_budget_tasks,
-+ system_config_tasks,
-+ setup_asic_tasks,
-+ enable_dynamic_state_management_tasks,
-+ enable_clock_power_gatings_tasks,
-+ get_2d_performance_state_tasks,
-+ set_performance_state_tasks,
-+ conditionally_force_3d_performance_state_tasks,
-+ process_vbios_eventinfo_tasks,
-+ broadcast_power_policy_tasks,
-+ NULL
-+};
-+
-+const struct action_chain initialize_action_chain = {
-+ "Initialize",
-+ initialize_event
-+};
-+
-+static const pem_event_action *uninitialize_event[] = {
-+ ungate_all_display_phys_tasks,
-+ uninitialize_display_phy_access_tasks,
-+ disable_gfx_voltage_island_power_gating_tasks,
-+ disable_gfx_clock_gating_tasks,
-+ set_boot_state_tasks,
-+ adjust_power_state_tasks,
-+ disable_dynamic_state_management_tasks,
-+ disable_clock_power_gatings_tasks,
-+ cleanup_asic_tasks,
-+ prepare_for_pnp_stop_tasks,
-+ NULL
-+};
-+
-+const struct action_chain uninitialize_action_chain = {
-+ "Uninitialize",
-+ uninitialize_event
-+};
-+
-+static const pem_event_action *power_source_change_event_pp_enabled[] = {
-+ set_power_source_tasks,
-+ set_power_saving_state_tasks,
-+ adjust_power_state_tasks,
-+ enable_disable_fps_tasks,
-+ set_nbmcu_state_tasks,
-+ broadcast_power_policy_tasks,
-+ NULL
-+};
-+
-+const struct action_chain power_source_change_action_chain_pp_enabled = {
-+ "Power source change - PowerPlay enabled",
-+ power_source_change_event_pp_enabled
-+};
-+
-+static const pem_event_action *power_source_change_event_pp_disabled[] = {
-+ set_power_source_tasks,
-+ set_nbmcu_state_tasks,
-+ NULL
-+};
-+
-+const struct action_chain power_source_changes_action_chain_pp_disabled = {
-+ "Power source change - PowerPlay disabled",
-+ power_source_change_event_pp_disabled
-+};
-+
-+static const pem_event_action *power_source_change_event_hardware_dc[] = {
-+ set_power_source_tasks,
-+ set_power_saving_state_tasks,
-+ adjust_power_state_tasks,
-+ enable_disable_fps_tasks,
-+ reset_hardware_dc_notification_tasks,
-+ set_nbmcu_state_tasks,
-+ broadcast_power_policy_tasks,
-+ NULL
-+};
-+
-+const struct action_chain power_source_change_action_chain_hardware_dc = {
-+ "Power source change - with Hardware DC switching",
-+ power_source_change_event_hardware_dc
-+};
-+
-+static const pem_event_action *suspend_event[] = {
-+ reset_display_phy_access_tasks,
-+ unregister_interrupt_tasks,
-+ disable_gfx_voltage_island_power_gating_tasks,
-+ disable_gfx_clock_gating_tasks,
-+ notify_smu_suspend_tasks,
-+ disable_smc_firmware_ctf_tasks,
-+ set_boot_state_tasks,
-+ adjust_power_state_tasks,
-+ disable_fps_tasks,
-+ vari_bright_suspend_tasks,
-+ reset_fan_speed_to_default_tasks,
-+ power_down_asic_tasks,
-+ disable_stutter_mode_tasks,
-+ set_connected_standby_tasks,
-+ block_hw_access_tasks,
-+ NULL
-+};
-+
-+const struct action_chain suspend_action_chain = {
-+ "Suspend",
-+ suspend_event
-+};
-+
-+static const pem_event_action *resume_event[] = {
-+ unblock_hw_access_tasks,
-+ resume_connected_standby_tasks,
-+ notify_smu_resume_tasks,
-+ reset_display_configCounter_tasks,
-+ update_dal_configuration_tasks,
-+ vari_bright_resume_tasks,
-+ block_adjust_power_state_tasks,
-+ setup_asic_tasks,
-+ enable_stutter_mode_tasks, /*must do this in boot state and before SMC is started */
-+ enable_dynamic_state_management_tasks,
-+ enable_clock_power_gatings_tasks,
-+ enable_disable_bapm_tasks,
-+ reset_boot_state_tasks,
-+ adjust_power_state_tasks,
-+ enable_disable_fps_tasks,
-+ notify_hw_power_source_tasks,
-+ process_vbios_event_info_tasks,
-+ enable_gfx_clock_gating_tasks,
-+ enable_gfx_voltage_island_power_gating_tasks,
-+ reset_clock_gating_tasks,
-+ notify_smu_vpu_recovery_end_tasks,
-+ disable_vpu_cap_tasks,
-+ execute_escape_sequence_tasks,
-+ NULL
-+};
-+
-+
-+const struct action_chain resume_action_chain = {
-+ "resume",
-+ resume_event
-+};
-+
-+static const pem_event_action *complete_init_event[] = {
-+ adjust_power_state_tasks,
-+ enable_gfx_clock_gating_tasks,
-+ enable_gfx_voltage_island_power_gating_tasks,
-+ notify_power_state_change_tasks,
-+ NULL
-+};
-+
-+const struct action_chain complete_init_action_chain = {
-+ "complete init",
-+ complete_init_event
-+};
-+
-+static const pem_event_action *enable_gfx_clock_gating_event[] = {
-+ enable_gfx_clock_gating_tasks,
-+ NULL
-+};
-+
-+const struct action_chain enable_gfx_clock_gating_action_chain = {
-+ "enable gfx clock gate",
-+ enable_gfx_clock_gating_event
-+};
-+
-+static const pem_event_action *disable_gfx_clock_gating_event[] = {
-+ disable_gfx_clock_gating_tasks,
-+ NULL
-+};
-+
-+const struct action_chain disable_gfx_clock_gating_action_chain = {
-+ "disable gfx clock gate",
-+ disable_gfx_clock_gating_event
-+};
-+
-+static const pem_event_action *enable_cgpg_event[] = {
-+ enable_cgpg_tasks,
-+ NULL
-+};
-+
-+const struct action_chain enable_cgpg_action_chain = {
-+ "eable cg pg",
-+ enable_cgpg_event
-+};
-+
-+static const pem_event_action *disable_cgpg_event[] = {
-+ disable_cgpg_tasks,
-+ NULL
-+};
-+
-+const struct action_chain disable_cgpg_action_chain = {
-+ "disable cg pg",
-+ disable_cgpg_event
-+};
-+
-+
-+/* Enable user _2d performance and activate */
-+
-+static const pem_event_action *enable_user_state_event[] = {
-+ create_new_user_performance_state_tasks,
-+ adjust_power_state_tasks,
-+ NULL
-+};
-+
-+const struct action_chain enable_user_state_action_chain = {
-+ "Enable user state",
-+ enable_user_state_event
-+};
-+
-+static const pem_event_action *enable_user_2d_performance_event[] = {
-+ enable_user_2d_performance_tasks,
-+ add_user_2d_performance_state_tasks,
-+ set_performance_state_tasks,
-+ adjust_power_state_tasks,
-+ delete_user_2d_performance_state_tasks,
-+ NULL
-+};
-+
-+const struct action_chain enable_user_2d_performance_action_chain = {
-+ "enable_user_2d_performance_event_activate",
-+ enable_user_2d_performance_event
-+};
-+
-+
-+static const pem_event_action *disable_user_2d_performance_event[] = {
-+ disable_user_2d_performance_tasks,
-+ delete_user_2d_performance_state_tasks,
-+ NULL
-+};
-+
-+const struct action_chain disable_user_2d_performance_action_chain = {
-+ "disable_user_2d_performance_event",
-+ disable_user_2d_performance_event
-+};
-+
-+
-+static const pem_event_action *display_config_change_event[] = {
-+ /* countDisplayConfigurationChangeEventTasks, */
-+ unblock_adjust_power_state_tasks,
-+ /* setCPUPowerState,*/
-+ notify_hw_power_source_tasks,
-+ /* updateDALConfigurationTasks,
-+ variBrightDisplayConfigurationChangeTasks, */
-+ adjust_power_state_tasks,
-+ /*enableDisableFPSTasks,
-+ setNBMCUStateTasks,
-+ notifyPCIEDeviceReadyTasks,*/
-+ NULL
-+};
-+
-+const struct action_chain display_config_change_action_chain = {
-+ "Display configuration change",
-+ display_config_change_event
-+};
-+
-+static const pem_event_action *readjust_power_state_event[] = {
-+ adjust_power_state_tasks,
-+ NULL
-+};
-+
-+const struct action_chain readjust_power_state_action_chain = {
-+ "re-adjust power state",
-+ readjust_power_state_event
-+};
-+
-diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.h b/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.h
-new file mode 100644
-index 0000000..f181e53
---- /dev/null
-+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.h
-@@ -0,0 +1,62 @@
-+/*
-+ * 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 _EVENT_ACTION_CHAINS_H_
-+#define _EVENT_ACTION_CHAINS_H_
-+#include "eventmgr.h"
-+
-+extern const struct action_chain initialize_action_chain;
-+
-+extern const struct action_chain uninitialize_action_chain;
-+
-+extern const struct action_chain power_source_change_action_chain_pp_enabled;
-+
-+extern const struct action_chain power_source_changes_action_chain_pp_disabled;
-+
-+extern const struct action_chain power_source_change_action_chain_hardware_dc;
-+
-+extern const struct action_chain suspend_action_chain;
-+
-+extern const struct action_chain resume_action_chain;
-+
-+extern const struct action_chain complete_init_action_chain;
-+
-+extern const struct action_chain enable_gfx_clock_gating_action_chain;
-+
-+extern const struct action_chain disable_gfx_clock_gating_action_chain;
-+
-+extern const struct action_chain enable_cgpg_action_chain;
-+
-+extern const struct action_chain disable_cgpg_action_chain;
-+
-+extern const struct action_chain enable_user_2d_performance_action_chain;
-+
-+extern const struct action_chain disable_user_2d_performance_action_chain;
-+
-+extern const struct action_chain enable_user_state_action_chain;
-+
-+extern const struct action_chain readjust_power_state_action_chain;
-+
-+extern const struct action_chain display_config_change_action_chain;
-+
-+#endif /*_EVENT_ACTION_CHAINS_H_*/
-+
-diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventinit.c b/drivers/gpu/drm/amd/powerplay/eventmgr/eventinit.c
-new file mode 100644
-index 0000000..0438442
---- /dev/null
-+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventinit.c
-@@ -0,0 +1,180 @@
-+/*
-+ * 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.
-+ *
-+ */
-+#include "eventmgr.h"
-+#include "eventinit.h"
-+
-+void pem_init_feature_info(struct pp_eventmgr *eventmgr)
-+{
-+
-+ /* PowerPlay info */
-+ eventmgr->ui_state_info[PP_PowerSource_AC].default_ui_lable =
-+ PP_StateUILabel_Performance;
-+
-+ eventmgr->ui_state_info[PP_PowerSource_AC].current_ui_label =
-+ PP_StateUILabel_Performance;
-+
-+ eventmgr->ui_state_info[PP_PowerSource_DC].default_ui_lable =
-+ PP_StateUILabel_Battery;
-+
-+ eventmgr->ui_state_info[PP_PowerSource_DC].current_ui_label =
-+ PP_StateUILabel_Battery;
-+
-+ if (phm_cap_enabled(eventmgr->platform_descriptor->platformCaps, PHM_PlatformCaps_PowerPlaySupport)) {
-+ eventmgr->features[PP_Feature_PowerPlay].supported = true;
-+ eventmgr->features[PP_Feature_PowerPlay].version = PEM_CURRENT_POWERPLAY_FEATURE_VERSION;
-+ eventmgr->features[PP_Feature_PowerPlay].enabled_default = true;
-+ eventmgr->features[PP_Feature_PowerPlay].enabled = true;
-+ } else {
-+ eventmgr->features[PP_Feature_PowerPlay].supported = false;
-+ eventmgr->features[PP_Feature_PowerPlay].enabled = false;
-+ eventmgr->features[PP_Feature_PowerPlay].enabled_default = false;
-+ }
-+
-+ eventmgr->features[PP_Feature_Force3DClock].supported = true;
-+ eventmgr->features[PP_Feature_Force3DClock].enabled = false;
-+ eventmgr->features[PP_Feature_Force3DClock].enabled_default = false;
-+ eventmgr->features[PP_Feature_Force3DClock].version = 1;
-+
-+ /* over drive*/
-+ eventmgr->features[PP_Feature_User2DPerformance].version = 4;
-+ eventmgr->features[PP_Feature_User3DPerformance].version = 4;
-+ eventmgr->features[PP_Feature_OverdriveTest].version = 4;
-+
-+ eventmgr->features[PP_Feature_OverDrive].version = 4;
-+ eventmgr->features[PP_Feature_OverDrive].enabled = false;
-+ eventmgr->features[PP_Feature_OverDrive].enabled_default = false;
-+
-+ eventmgr->features[PP_Feature_User2DPerformance].supported = false;
-+ eventmgr->features[PP_Feature_User2DPerformance].enabled = false;
-+ eventmgr->features[PP_Feature_User2DPerformance].enabled_default = false;
-+
-+ eventmgr->features[PP_Feature_User3DPerformance].supported = false;
-+ eventmgr->features[PP_Feature_User3DPerformance].enabled = false;
-+ eventmgr->features[PP_Feature_User3DPerformance].enabled_default = false;
-+
-+ eventmgr->features[PP_Feature_OverdriveTest].supported = false;
-+ eventmgr->features[PP_Feature_OverdriveTest].enabled = false;
-+ eventmgr->features[PP_Feature_OverdriveTest].enabled_default = false;
-+
-+ eventmgr->features[PP_Feature_OverDrive].supported = false;
-+
-+ eventmgr->features[PP_Feature_PowerBudgetWaiver].enabled_default = false;
-+ eventmgr->features[PP_Feature_PowerBudgetWaiver].version = 1;
-+ eventmgr->features[PP_Feature_PowerBudgetWaiver].supported = false;
-+ eventmgr->features[PP_Feature_PowerBudgetWaiver].enabled = false;
-+
-+ /* Multi UVD States support */
-+ eventmgr->features[PP_Feature_MultiUVDState].supported = false;
-+ eventmgr->features[PP_Feature_MultiUVDState].enabled = false;
-+ eventmgr->features[PP_Feature_MultiUVDState].enabled_default = false;
-+
-+ /* Dynamic UVD States support */
-+ eventmgr->features[PP_Feature_DynamicUVDState].supported = false;
-+ eventmgr->features[PP_Feature_DynamicUVDState].enabled = false;
-+ eventmgr->features[PP_Feature_DynamicUVDState].enabled_default = false;
-+
-+ /* VCE DPM support */
-+ eventmgr->features[PP_Feature_VCEDPM].supported = false;
-+ eventmgr->features[PP_Feature_VCEDPM].enabled = false;
-+ eventmgr->features[PP_Feature_VCEDPM].enabled_default = false;
-+
-+ /* ACP PowerGating support */
-+ eventmgr->features[PP_Feature_ACP_POWERGATING].supported = false;
-+ eventmgr->features[PP_Feature_ACP_POWERGATING].enabled = false;
-+ eventmgr->features[PP_Feature_ACP_POWERGATING].enabled_default = false;
-+
-+ /* PPM support */
-+ eventmgr->features[PP_Feature_PPM].version = 1;
-+ eventmgr->features[PP_Feature_PPM].supported = false;
-+ eventmgr->features[PP_Feature_PPM].enabled = false;
-+
-+ /* FFC support (enables fan and temp settings, Gemini needs temp settings) */
-+ if (phm_cap_enabled(eventmgr->platform_descriptor->platformCaps, PHM_PlatformCaps_ODFuzzyFanControlSupport) ||
-+ phm_cap_enabled(eventmgr->platform_descriptor->platformCaps, PHM_PlatformCaps_GeminiRegulatorFanControlSupport)) {
-+ eventmgr->features[PP_Feature_FFC].version = 1;
-+ eventmgr->features[PP_Feature_FFC].supported = true;
-+ eventmgr->features[PP_Feature_FFC].enabled = true;
-+ eventmgr->features[PP_Feature_FFC].enabled_default = true;
-+ } else {
-+ eventmgr->features[PP_Feature_FFC].supported = false;
-+ eventmgr->features[PP_Feature_FFC].enabled = false;
-+ eventmgr->features[PP_Feature_FFC].enabled_default = false;
-+ }
-+
-+ eventmgr->features[PP_Feature_VariBright].supported = false;
-+ eventmgr->features[PP_Feature_VariBright].enabled = false;
-+ eventmgr->features[PP_Feature_VariBright].enabled_default = false;
-+
-+ eventmgr->features[PP_Feature_BACO].supported = false;
-+ eventmgr->features[PP_Feature_BACO].supported = false;
-+ eventmgr->features[PP_Feature_BACO].enabled_default = false;
-+
-+ /* PowerDown feature support */
-+ eventmgr->features[PP_Feature_PowerDown].supported = false;
-+ eventmgr->features[PP_Feature_PowerDown].enabled = false;
-+ eventmgr->features[PP_Feature_PowerDown].enabled_default = false;
-+
-+ eventmgr->features[PP_Feature_FPS].version = 1;
-+ eventmgr->features[PP_Feature_FPS].supported = false;
-+ eventmgr->features[PP_Feature_FPS].enabled_default = false;
-+ eventmgr->features[PP_Feature_FPS].enabled = false;
-+
-+ eventmgr->features[PP_Feature_ViPG].version = 1;
-+ eventmgr->features[PP_Feature_ViPG].supported = false;
-+ eventmgr->features[PP_Feature_ViPG].enabled_default = false;
-+ eventmgr->features[PP_Feature_ViPG].enabled = false;
-+}
-+
-+int pem_register_interrupts(struct pp_eventmgr *eventmgr)
-+{
-+ int result = 0;
-+
-+ /* TODO:
-+ * 1. Register thermal events interrupt
-+ * 2. Register CTF event interrupt
-+ * 3. Register for vbios events interrupt
-+ * 4. Register External Throttle Interrupt
-+ * 5. Register Smc To Host Interrupt
-+ * */
-+ return result;
-+}
-+
-+
-+int pem_unregister_interrupts(struct pp_eventmgr *eventmgr)
-+{
-+ return 0;
-+}
-+
-+
-+void pem_uninit_featureInfo(struct pp_eventmgr *eventmgr)
-+{
-+ eventmgr->features[PP_Feature_MultiUVDState].supported = false;
-+ eventmgr->features[PP_Feature_VariBright].supported = false;
-+ eventmgr->features[PP_Feature_PowerBudgetWaiver].supported = false;
-+ eventmgr->features[PP_Feature_OverDrive].supported = false;
-+ eventmgr->features[PP_Feature_OverdriveTest].supported = false;
-+ eventmgr->features[PP_Feature_User3DPerformance].supported = false;
-+ eventmgr->features[PP_Feature_User2DPerformance].supported = false;
-+ eventmgr->features[PP_Feature_PowerPlay].supported = false;
-+ eventmgr->features[PP_Feature_Force3DClock].supported = false;
-+}
-diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventinit.h b/drivers/gpu/drm/amd/powerplay/eventmgr/eventinit.h
-new file mode 100644
-index 0000000..9ef96aa
---- /dev/null
-+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventinit.h
-@@ -0,0 +1,34 @@
-+/*
-+ * 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 _EVENTINIT_H_
-+#define _EVENTINIT_H_
-+
-+#define PEM_CURRENT_POWERPLAY_FEATURE_VERSION 4
-+
-+void pem_init_feature_info(struct pp_eventmgr *eventmgr);
-+void pem_uninit_featureInfo(struct pp_eventmgr *eventmgr);
-+int pem_register_interrupts(struct pp_eventmgr *eventmgr);
-+int pem_unregister_interrupts(struct pp_eventmgr *eventmgr);
-+
-+#endif /* _EVENTINIT_H_ */
-diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventmanagement.c b/drivers/gpu/drm/amd/powerplay/eventmgr/eventmanagement.c
-new file mode 100644
-index 0000000..1e2ad56
---- /dev/null
-+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventmanagement.c
-@@ -0,0 +1,215 @@
-+/*
-+ * 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.
-+ *
-+ */
-+#include "eventmanagement.h"
-+#include "eventmgr.h"
-+#include "eventactionchains.h"
-+
-+int pem_init_event_action_chains(struct pp_eventmgr *eventmgr)
-+{
-+ int i;
-+
-+ for (i = 0; i < AMD_PP_EVENT_MAX; i++)
-+ eventmgr->event_chain[i] = NULL;
-+
-+ eventmgr->event_chain[AMD_PP_EVENT_SUSPEND] = pem_get_suspend_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_INITIALIZE] = pem_get_initialize_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_UNINITIALIZE] = pem_get_uninitialize_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_POWER_SOURCE_CHANGE] = pem_get_power_source_change_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_HIBERNATE] = pem_get_hibernate_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_RESUME] = pem_get_resume_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_THERMAL_NOTIFICATION] = pem_get_thermal_notification_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_VBIOS_NOTIFICATION] = pem_get_vbios_notification_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_ENTER_THERMAL_STATE] = pem_get_enter_thermal_state_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_EXIT_THERMAL_STATE] = pem_get_exit_thermal_state_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_ENABLE_POWER_PLAY] = pem_get_enable_powerplay_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_DISABLE_POWER_PLAY] = pem_get_disable_powerplay_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_ENABLE_OVER_DRIVE_TEST] = pem_get_enable_overdrive_test_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_DISABLE_OVER_DRIVE_TEST] = pem_get_disable_overdrive_test_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_ENABLE_GFX_CLOCK_GATING] = pem_get_enable_gfx_clock_gating_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_DISABLE_GFX_CLOCK_GATING] = pem_get_disable_gfx_clock_gating_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_ENABLE_CGPG] = pem_get_enable_cgpg_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_DISABLE_CGPG] = pem_get_disable_cgpg_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_COMPLETE_INIT] = pem_get_complete_init_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_SCREEN_ON] = pem_get_screen_on_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_SCREEN_OFF] = pem_get_screen_off_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_PRE_SUSPEND] = pem_get_pre_suspend_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_PRE_RESUME] = pem_get_pre_resume_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_ENABLE_USER_STATE] = pem_enable_user_state_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_READJUST_POWER_STATE] = pem_readjust_power_state_action_chain(eventmgr);
-+ eventmgr->event_chain[AMD_PP_EVENT_DISPLAY_CONFIG_CHANGE] = pem_display_config_change_action_chain(eventmgr);
-+ return 0;
-+}
-+
-+int pem_excute_event_chain(struct pp_eventmgr *eventmgr, const struct action_chain *event_chain, struct pem_event_data *event_data)
-+{
-+ const pem_event_action **paction_chain;
-+ const pem_event_action *psub_chain;
-+ int tmp_result = 0;
-+ int result = 0;
-+
-+ if (eventmgr == NULL || event_chain == NULL || event_data == NULL)
-+ return -EINVAL;
-+
-+ for (paction_chain = event_chain->action_chain; NULL != *paction_chain; paction_chain++) {
-+ if (0 != result)
-+ return result;
-+
-+ for (psub_chain = *paction_chain; NULL != *psub_chain; psub_chain++) {
-+ tmp_result = (*psub_chain)(eventmgr, event_data);
-+ if (0 == result)
-+ result = tmp_result;
-+ }
-+ }
-+
-+ return result;
-+}
-+
-+const struct action_chain *pem_get_suspend_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return &suspend_action_chain;
-+}
-+
-+const struct action_chain *pem_get_initialize_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return &initialize_action_chain;
-+}
-+
-+const struct action_chain *pem_get_uninitialize_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return &uninitialize_action_chain;
-+}
-+
-+const struct action_chain *pem_get_power_source_change_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return &power_source_change_action_chain_pp_enabled; /* other case base on feature info*/
-+}
-+
-+const struct action_chain *pem_get_resume_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return &resume_action_chain;
-+}
-+
-+const struct action_chain *pem_get_hibernate_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return NULL;
-+}
-+
-+const struct action_chain *pem_get_thermal_notification_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return NULL;
-+}
-+
-+const struct action_chain *pem_get_vbios_notification_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return NULL;
-+}
-+
-+const struct action_chain *pem_get_enter_thermal_state_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return NULL;
-+}
-+
-+const struct action_chain *pem_get_exit_thermal_state_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return NULL;
-+}
-+
-+const struct action_chain *pem_get_enable_powerplay_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return NULL;
-+}
-+
-+const struct action_chain *pem_get_disable_powerplay_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return NULL;
-+}
-+
-+const struct action_chain *pem_get_enable_overdrive_test_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return NULL;
-+}
-+
-+const struct action_chain *pem_get_disable_overdrive_test_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return NULL;
-+}
-+
-+const struct action_chain *pem_get_enable_gfx_clock_gating_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return &enable_gfx_clock_gating_action_chain;
-+}
-+
-+const struct action_chain *pem_get_disable_gfx_clock_gating_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return &disable_gfx_clock_gating_action_chain;
-+}
-+
-+const struct action_chain *pem_get_enable_cgpg_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return &enable_cgpg_action_chain;
-+}
-+
-+const struct action_chain *pem_get_disable_cgpg_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return &disable_cgpg_action_chain;
-+}
-+
-+const struct action_chain *pem_get_complete_init_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return &complete_init_action_chain;
-+}
-+
-+const struct action_chain *pem_get_screen_on_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return NULL;
-+}
-+
-+const struct action_chain *pem_get_screen_off_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return NULL;
-+}
-+
-+const struct action_chain *pem_get_pre_suspend_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return NULL;
-+}
-+
-+const struct action_chain *pem_get_pre_resume_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return NULL;
-+}
-+
-+const struct action_chain *pem_enable_user_state_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return &enable_user_state_action_chain;
-+}
-+
-+const struct action_chain *pem_readjust_power_state_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return &readjust_power_state_action_chain;
-+}
-+
-+const struct action_chain *pem_display_config_change_action_chain(struct pp_eventmgr *eventmgr)
-+{
-+ return &display_config_change_action_chain;
-+}
-diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventmanagement.h b/drivers/gpu/drm/amd/powerplay/eventmgr/eventmanagement.h
-new file mode 100644
-index 0000000..383d4b2
---- /dev/null
-+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventmanagement.h
-@@ -0,0 +1,59 @@
-+/*
-+ * 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 _EVENT_MANAGEMENT_H_
-+#define _EVENT_MANAGEMENT_H_
-+
-+#include "eventmgr.h"
-+
-+int pem_init_event_action_chains(struct pp_eventmgr *eventmgr);
-+int pem_excute_event_chain(struct pp_eventmgr *eventmgr, const struct action_chain *event_chain, struct pem_event_data *event_data);
-+const struct action_chain *pem_get_suspend_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_initialize_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_uninitialize_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_power_source_change_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_resume_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_hibernate_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_thermal_notification_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_vbios_notification_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_enter_thermal_state_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_exit_thermal_state_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_enable_powerplay_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_disable_powerplay_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_enable_overdrive_test_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_disable_overdrive_test_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_enable_gfx_clock_gating_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_disable_gfx_clock_gating_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_enable_cgpg_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_disable_cgpg_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_complete_init_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_screen_on_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_screen_off_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_pre_suspend_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_get_pre_resume_action_chain(struct pp_eventmgr *eventmgr);
-+
-+extern const struct action_chain *pem_enable_user_state_action_chain(struct pp_eventmgr *eventmgr);
-+extern const struct action_chain *pem_readjust_power_state_action_chain(struct pp_eventmgr *eventmgr);
-+const struct action_chain *pem_display_config_change_action_chain(struct pp_eventmgr *eventmgr);
-+
-+
-+#endif /* _EVENT_MANAGEMENT_H_ */
-diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventmgr.c b/drivers/gpu/drm/amd/powerplay/eventmgr/eventmgr.c
-new file mode 100644
-index 0000000..52a3efc
---- /dev/null
-+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventmgr.c
-@@ -0,0 +1,114 @@
-+/*
-+ * 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.
-+ *
-+ */
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include "eventmgr.h"
-+#include "hwmgr.h"
-+#include "eventinit.h"
-+#include "eventmanagement.h"
-+
-+static int pem_init(struct pp_eventmgr *eventmgr)
-+{
-+ int result = 0;
-+ struct pem_event_data event_data;
-+
-+ /* Initialize PowerPlay feature info */
-+ pem_init_feature_info(eventmgr);
-+
-+ /* Initialize event action chains */
-+ pem_init_event_action_chains(eventmgr);
-+
-+ /* Call initialization event */
-+ result = pem_handle_event(eventmgr, AMD_PP_EVENT_INITIALIZE, &event_data);
-+
-+ if (0 != result)
-+ return result;
-+
-+ /* Register interrupt callback functions */
-+ result = pem_register_interrupts(eventmgr);
-+ return 0;
-+}
-+
-+static void pem_fini(struct pp_eventmgr *eventmgr)
-+{
-+ struct pem_event_data event_data;
-+
-+ pem_uninit_featureInfo(eventmgr);
-+ pem_unregister_interrupts(eventmgr);
-+
-+ pem_handle_event(eventmgr, AMD_PP_EVENT_UNINITIALIZE, &event_data);
-+
-+ if (eventmgr != NULL)
-+ kfree(eventmgr);
-+}
-+
-+int eventmgr_init(struct pp_instance *handle)
-+{
-+ int result = 0;
-+ struct pp_eventmgr *eventmgr;
-+
-+ if (handle == NULL)
-+ return -EINVAL;
-+
-+ eventmgr = kzalloc(sizeof(struct pp_eventmgr), GFP_KERNEL);
-+ if (eventmgr == NULL)
-+ return -ENOMEM;
-+
-+ eventmgr->hwmgr = handle->hwmgr;
-+ handle->eventmgr = eventmgr;
-+
-+ eventmgr->platform_descriptor = &(eventmgr->hwmgr->platform_descriptor);
-+ eventmgr->pp_eventmgr_init = pem_init;
-+ eventmgr->pp_eventmgr_fini = pem_fini;
-+
-+ return result;
-+}
-+
-+int eventmgr_fini(struct pp_eventmgr *eventmgr)
-+{
-+ kfree(eventmgr);
-+ return 0;
-+}
-+
-+static int pem_handle_event_unlocked(struct pp_eventmgr *eventmgr, enum amd_pp_event event, struct pem_event_data *data)
-+{
-+ if (eventmgr == NULL || event >= AMD_PP_EVENT_MAX || data == NULL)
-+ return -EINVAL;
-+
-+ return pem_excute_event_chain(eventmgr, eventmgr->event_chain[event], data);
-+}
-+
-+int pem_handle_event(struct pp_eventmgr *eventmgr, enum amd_pp_event event, struct pem_event_data *event_data)
-+{
-+ int r = 0;
-+
-+ r = pem_handle_event_unlocked(eventmgr, event, event_data);
-+
-+ return r;
-+}
-+
-+bool pem_is_hw_access_blocked(struct pp_eventmgr *eventmgr)
-+{
-+ return (eventmgr->block_adjust_power_state || phm_is_hw_access_blocked(eventmgr->hwmgr));
-+}
-diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventsubchains.c b/drivers/gpu/drm/amd/powerplay/eventmgr/eventsubchains.c
-new file mode 100644
-index 0000000..49d8a29
---- /dev/null
-+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventsubchains.c
-@@ -0,0 +1,395 @@
-+/*
-+ * 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.
-+ *
-+ */
-+
-+#include "eventmgr.h"
-+#include "eventsubchains.h"
-+#include "eventtasks.h"
-+#include "hardwaremanager.h"
-+
-+const pem_event_action reset_display_phy_access_tasks[] = {
-+ pem_task_reset_display_phys_access,
-+ NULL
-+};
-+
-+const pem_event_action broadcast_power_policy_tasks[] = {
-+ /* PEM_Task_BroadcastPowerPolicyChange, */
-+ NULL
-+};
-+
-+const pem_event_action unregister_interrupt_tasks[] = {
-+ pem_task_unregister_interrupts,
-+ NULL
-+};
-+
-+/* Disable GFX Voltage Islands Power Gating */
-+const pem_event_action disable_gfx_voltage_island_powergating_tasks[] = {
-+ pem_task_disable_voltage_island_power_gating,
-+ NULL
-+};
-+
-+const pem_event_action disable_gfx_clockgating_tasks[] = {
-+ pem_task_disable_gfx_clock_gating,
-+ NULL
-+};
-+
-+const pem_event_action block_adjust_power_state_tasks[] = {
-+ pem_task_block_adjust_power_state,
-+ NULL
-+};
-+
-+
-+const pem_event_action unblock_adjust_power_state_tasks[] = {
-+ pem_task_unblock_adjust_power_state,
-+ NULL
-+};
-+
-+const pem_event_action set_performance_state_tasks[] = {
-+ pem_task_set_performance_state,
-+ NULL
-+};
-+
-+const pem_event_action get_2d_performance_state_tasks[] = {
-+ pem_task_get_2D_performance_state_id,
-+ NULL
-+};
-+
-+const pem_event_action conditionally_force3D_performance_state_tasks[] = {
-+ pem_task_conditionally_force_3d_performance_state,
-+ NULL
-+};
-+
-+const pem_event_action process_vbios_eventinfo_tasks[] = {
-+ /* PEM_Task_ProcessVbiosEventInfo,*/
-+ NULL
-+};
-+
-+const pem_event_action enable_dynamic_state_management_tasks[] = {
-+ /* PEM_Task_ResetBAPMPolicyChangedFlag,*/
-+ pem_task_get_boot_state_id,
-+ pem_task_enable_dynamic_state_management,
-+ pem_task_register_interrupts,
-+ NULL
-+};
-+
-+const pem_event_action enable_clock_power_gatings_tasks[] = {
-+ pem_task_enable_clock_power_gatings_tasks,
-+ pem_task_powerdown_uvd_tasks,
-+ pem_task_powerdown_vce_tasks,
-+ NULL
-+};
-+
-+const pem_event_action setup_asic_tasks[] = {
-+ pem_task_setup_asic,
-+ NULL
-+};
-+
-+const pem_event_action power_budget_tasks[] = {
-+ /* TODO
-+ * PEM_Task_PowerBudgetWaiverAvailable,
-+ * PEM_Task_PowerBudgetWarningMessage,
-+ * PEM_Task_PruneStatesBasedOnPowerBudget,
-+ */
-+ NULL
-+};
-+
-+const pem_event_action system_config_tasks[] = {
-+ /* PEM_Task_PruneStatesBasedOnSystemConfig,*/
-+ NULL
-+};
-+
-+
-+const pem_event_action conditionally_force_3d_performance_state_tasks[] = {
-+ pem_task_conditionally_force_3d_performance_state,
-+ NULL
-+};
-+
-+const pem_event_action ungate_all_display_phys_tasks[] = {
-+ /* PEM_Task_GetDisplayPhyAccessInfo */
-+ NULL
-+};
-+
-+const pem_event_action uninitialize_display_phy_access_tasks[] = {
-+ /* PEM_Task_UninitializeDisplayPhysAccess, */
-+ NULL
-+};
-+
-+const pem_event_action disable_gfx_voltage_island_power_gating_tasks[] = {
-+ /* PEM_Task_DisableVoltageIslandPowerGating, */
-+ NULL
-+};
-+
-+const pem_event_action disable_gfx_clock_gating_tasks[] = {
-+ pem_task_disable_gfx_clock_gating,
-+ NULL
-+};
-+
-+const pem_event_action set_boot_state_tasks[] = {
-+ pem_task_get_boot_state_id,
-+ pem_task_set_boot_state,
-+ NULL
-+};
-+
-+const pem_event_action adjust_power_state_tasks[] = {
-+ pem_task_notify_hw_mgr_display_configuration_change,
-+ pem_task_adjust_power_state,
-+ /*pem_task_notify_smc_display_config_after_power_state_adjustment,*/
-+ pem_task_update_allowed_performance_levels,
-+ /* to do pem_task_Enable_disable_bapm, */
-+ NULL
-+};
-+
-+const pem_event_action disable_dynamic_state_management_tasks[] = {
-+ pem_task_unregister_interrupts,
-+ pem_task_get_boot_state_id,
-+ pem_task_disable_dynamic_state_management,
-+ NULL
-+};
-+
-+const pem_event_action disable_clock_power_gatings_tasks[] = {
-+ pem_task_disable_clock_power_gatings_tasks,
-+ NULL
-+};
-+
-+const pem_event_action cleanup_asic_tasks[] = {
-+ /* PEM_Task_DisableFPS,*/
-+ pem_task_cleanup_asic,
-+ NULL
-+};
-+
-+const pem_event_action prepare_for_pnp_stop_tasks[] = {
-+ /* PEM_Task_PrepareForPnpStop,*/
-+ NULL
-+};
-+
-+const pem_event_action set_power_source_tasks[] = {
-+ pem_task_set_power_source,
-+ pem_task_notify_hw_of_power_source,
-+ NULL
-+};
-+
-+const pem_event_action set_power_saving_state_tasks[] = {
-+ pem_task_reset_power_saving_state,
-+ pem_task_get_power_saving_state,
-+ pem_task_set_power_saving_state,
-+ /* PEM_Task_ResetODDCState,
-+ * PEM_Task_GetODDCState,
-+ * PEM_Task_SetODDCState,*/
-+ NULL
-+};
-+
-+const pem_event_action enable_disable_fps_tasks[] = {
-+ /* PEM_Task_EnableDisableFPS,*/
-+ NULL
-+};
-+
-+const pem_event_action set_nbmcu_state_tasks[] = {
-+ /* PEM_Task_NBMCUStateChange,*/
-+ NULL
-+};
-+
-+const pem_event_action reset_hardware_dc_notification_tasks[] = {
-+ /* PEM_Task_ResetHardwareDCNotification,*/
-+ NULL
-+};
-+
-+
-+const pem_event_action notify_smu_suspend_tasks[] = {
-+ /* PEM_Task_NotifySMUSuspend,*/
-+ NULL
-+};
-+
-+const pem_event_action disable_smc_firmware_ctf_tasks[] = {
-+ /* PEM_Task_DisableSMCFirmwareCTF,*/
-+ NULL
-+};
-+
-+const pem_event_action disable_fps_tasks[] = {
-+ /* PEM_Task_DisableFPS,*/
-+ NULL
-+};
-+
-+const pem_event_action vari_bright_suspend_tasks[] = {
-+ /* PEM_Task_VariBright_Suspend,*/
-+ NULL
-+};
-+
-+const pem_event_action reset_fan_speed_to_default_tasks[] = {
-+ /* PEM_Task_ResetFanSpeedToDefault,*/
-+ NULL
-+};
-+
-+const pem_event_action power_down_asic_tasks[] = {
-+ /* PEM_Task_DisableFPS,*/
-+ pem_task_power_down_asic,
-+ NULL
-+};
-+
-+const pem_event_action disable_stutter_mode_tasks[] = {
-+ /* PEM_Task_DisableStutterMode,*/
-+ NULL
-+};
-+
-+const pem_event_action set_connected_standby_tasks[] = {
-+ /* PEM_Task_SetConnectedStandby,*/
-+ NULL
-+};
-+
-+const pem_event_action block_hw_access_tasks[] = {
-+ pem_task_block_hw_access,
-+ NULL
-+};
-+
-+const pem_event_action unblock_hw_access_tasks[] = {
-+ pem_task_un_block_hw_access,
-+ NULL
-+};
-+
-+const pem_event_action resume_connected_standby_tasks[] = {
-+ /* PEM_Task_ResumeConnectedStandby,*/
-+ NULL
-+};
-+
-+const pem_event_action notify_smu_resume_tasks[] = {
-+ /* PEM_Task_NotifySMUResume,*/
-+ NULL
-+};
-+
-+const pem_event_action reset_display_configCounter_tasks[] = {
-+ pem_task_reset_display_phys_access,
-+ NULL
-+};
-+
-+const pem_event_action update_dal_configuration_tasks[] = {
-+ /* PEM_Task_CheckVBlankTime,*/
-+ NULL
-+};
-+
-+const pem_event_action vari_bright_resume_tasks[] = {
-+ /* PEM_Task_VariBright_Resume,*/
-+ NULL
-+};
-+
-+const pem_event_action notify_hw_power_source_tasks[] = {
-+ pem_task_notify_hw_of_power_source,
-+ NULL
-+};
-+
-+const pem_event_action process_vbios_event_info_tasks[] = {
-+ /* PEM_Task_ProcessVbiosEventInfo,*/
-+ NULL
-+};
-+
-+const pem_event_action enable_gfx_clock_gating_tasks[] = {
-+ pem_task_enable_gfx_clock_gating,
-+ NULL
-+};
-+
-+const pem_event_action enable_gfx_voltage_island_power_gating_tasks[] = {
-+ pem_task_enable_voltage_island_power_gating,
-+ NULL
-+};
-+
-+const pem_event_action reset_clock_gating_tasks[] = {
-+ /* PEM_Task_ResetClockGating*/
-+ NULL
-+};
-+
-+const pem_event_action notify_smu_vpu_recovery_end_tasks[] = {
-+ /* PEM_Task_NotifySmuVPURecoveryEnd,*/
-+ NULL
-+};
-+
-+const pem_event_action disable_vpu_cap_tasks[] = {
-+ /* PEM_Task_DisableVPUCap,*/
-+ NULL
-+};
-+
-+const pem_event_action execute_escape_sequence_tasks[] = {
-+ /* PEM_Task_ExecuteEscapesequence,*/
-+ NULL
-+};
-+
-+const pem_event_action notify_power_state_change_tasks[] = {
-+ pem_task_notify_power_state_change,
-+ NULL
-+};
-+
-+const pem_event_action enable_cgpg_tasks[] = {
-+ pem_task_enable_cgpg,
-+ NULL
-+};
-+
-+const pem_event_action disable_cgpg_tasks[] = {
-+ pem_task_disable_cgpg,
-+ NULL
-+};
-+
-+const pem_event_action enable_user_2d_performance_tasks[] = {
-+ /* PEM_Task_SetUser2DPerformanceFlag,*/
-+ /* PEM_Task_UpdateUser2DPerformanceEnableEvents,*/
-+ NULL
-+};
-+
-+const pem_event_action add_user_2d_performance_state_tasks[] = {
-+ /* PEM_Task_Get2DPerformanceTemplate,*/
-+ /* PEM_Task_AllocateNewPowerStateMemory,*/
-+ /* PEM_Task_CopyNewPowerStateInfo,*/
-+ /* PEM_Task_UpdateNewPowerStateClocks,*/
-+ /* PEM_Task_UpdateNewPowerStateUser2DPerformanceFlag,*/
-+ /* PEM_Task_AddPowerState,*/
-+ /* PEM_Task_ReleaseNewPowerStateMemory,*/
-+ NULL
-+};
-+
-+const pem_event_action delete_user_2d_performance_state_tasks[] = {
-+ /* PEM_Task_GetCurrentUser2DPerformanceStateID,*/
-+ /* PEM_Task_DeletePowerState,*/
-+ /* PEM_Task_SetCurrentUser2DPerformanceStateID,*/
-+ NULL
-+};
-+
-+const pem_event_action disable_user_2d_performance_tasks[] = {
-+ /* PEM_Task_ResetUser2DPerformanceFlag,*/
-+ /* PEM_Task_UpdateUser2DPerformanceDisableEvents,*/
-+ NULL
-+};
-+
-+const pem_event_action enable_stutter_mode_tasks[] = {
-+ pem_task_enable_stutter_mode,
-+ NULL
-+};
-+
-+const pem_event_action enable_disable_bapm_tasks[] = {
-+ /*PEM_Task_EnableDisableBAPM,*/
-+ NULL
-+};
-+
-+const pem_event_action reset_boot_state_tasks[] = {
-+ pem_task_reset_boot_state,
-+ NULL
-+};
-+
-+const pem_event_action create_new_user_performance_state_tasks[] = {
-+ pem_task_create_user_performance_state,
-+ NULL
-+};
-diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventsubchains.h b/drivers/gpu/drm/amd/powerplay/eventmgr/eventsubchains.h
-new file mode 100644
-index 0000000..27e0e61
---- /dev/null
-+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventsubchains.h
-@@ -0,0 +1,98 @@
-+/*
-+ * 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 _EVENT_SUB_CHAINS_H_
-+#define _EVENT_SUB_CHAINS_H_
-+
-+#include "eventmgr.h"
-+
-+extern const pem_event_action reset_display_phy_access_tasks[];
-+extern const pem_event_action broadcast_power_policy_tasks[];
-+extern const pem_event_action unregister_interrupt_tasks[];
-+extern const pem_event_action disable_GFX_voltage_island_powergating_tasks[];
-+extern const pem_event_action disable_GFX_clockgating_tasks[];
-+extern const pem_event_action block_adjust_power_state_tasks[];
-+extern const pem_event_action unblock_adjust_power_state_tasks[];
-+extern const pem_event_action set_performance_state_tasks[];
-+extern const pem_event_action get_2D_performance_state_tasks[];
-+extern const pem_event_action conditionally_force3D_performance_state_tasks[];
-+extern const pem_event_action process_vbios_eventinfo_tasks[];
-+extern const pem_event_action enable_dynamic_state_management_tasks[];
-+extern const pem_event_action enable_clock_power_gatings_tasks[];
-+extern const pem_event_action conditionally_force3D_performance_state_tasks[];
-+extern const pem_event_action setup_asic_tasks[];
-+extern const pem_event_action power_budget_tasks[];
-+extern const pem_event_action system_config_tasks[];
-+extern const pem_event_action get_2d_performance_state_tasks[];
-+extern const pem_event_action conditionally_force_3d_performance_state_tasks[];
-+extern const pem_event_action ungate_all_display_phys_tasks[];
-+extern const pem_event_action uninitialize_display_phy_access_tasks[];
-+extern const pem_event_action disable_gfx_voltage_island_power_gating_tasks[];
-+extern const pem_event_action disable_gfx_clock_gating_tasks[];
-+extern const pem_event_action set_boot_state_tasks[];
-+extern const pem_event_action adjust_power_state_tasks[];
-+extern const pem_event_action disable_dynamic_state_management_tasks[];
-+extern const pem_event_action disable_clock_power_gatings_tasks[];
-+extern const pem_event_action cleanup_asic_tasks[];
-+extern const pem_event_action prepare_for_pnp_stop_tasks[];
-+extern const pem_event_action set_power_source_tasks[];
-+extern const pem_event_action set_power_saving_state_tasks[];
-+extern const pem_event_action enable_disable_fps_tasks[];
-+extern const pem_event_action set_nbmcu_state_tasks[];
-+extern const pem_event_action reset_hardware_dc_notification_tasks[];
-+extern const pem_event_action notify_smu_suspend_tasks[];
-+extern const pem_event_action disable_smc_firmware_ctf_tasks[];
-+extern const pem_event_action disable_fps_tasks[];
-+extern const pem_event_action vari_bright_suspend_tasks[];
-+extern const pem_event_action reset_fan_speed_to_default_tasks[];
-+extern const pem_event_action power_down_asic_tasks[];
-+extern const pem_event_action disable_stutter_mode_tasks[];
-+extern const pem_event_action set_connected_standby_tasks[];
-+extern const pem_event_action block_hw_access_tasks[];
-+extern const pem_event_action unblock_hw_access_tasks[];
-+extern const pem_event_action resume_connected_standby_tasks[];
-+extern const pem_event_action notify_smu_resume_tasks[];
-+extern const pem_event_action reset_display_configCounter_tasks[];
-+extern const pem_event_action update_dal_configuration_tasks[];
-+extern const pem_event_action vari_bright_resume_tasks[];
-+extern const pem_event_action notify_hw_power_source_tasks[];
-+extern const pem_event_action process_vbios_event_info_tasks[];
-+extern const pem_event_action enable_gfx_clock_gating_tasks[];
-+extern const pem_event_action enable_gfx_voltage_island_power_gating_tasks[];
-+extern const pem_event_action reset_clock_gating_tasks[];
-+extern const pem_event_action notify_smu_vpu_recovery_end_tasks[];
-+extern const pem_event_action disable_vpu_cap_tasks[];
-+extern const pem_event_action execute_escape_sequence_tasks[];
-+extern const pem_event_action notify_power_state_change_tasks[];
-+extern const pem_event_action enable_cgpg_tasks[];
-+extern const pem_event_action disable_cgpg_tasks[];
-+extern const pem_event_action enable_user_2d_performance_tasks[];
-+extern const pem_event_action add_user_2d_performance_state_tasks[];
-+extern const pem_event_action delete_user_2d_performance_state_tasks[];
-+extern const pem_event_action disable_user_2d_performance_tasks[];
-+extern const pem_event_action enable_stutter_mode_tasks[];
-+extern const pem_event_action enable_disable_bapm_tasks[];
-+extern const pem_event_action reset_boot_state_tasks[];
-+extern const pem_event_action create_new_user_performance_state_tasks[];
-+
-+#endif /* _EVENT_SUB_CHAINS_H_ */
-diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.c b/drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.c
-new file mode 100644
-index 0000000..55d5490
---- /dev/null
-+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.c
-@@ -0,0 +1,408 @@
-+/*
-+ * 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.
-+ *
-+ */
-+
-+#include "eventmgr.h"
-+#include "eventinit.h"
-+#include "eventmanagement.h"
-+#include "eventmanager.h"
-+#include "hardwaremanager.h"
-+#include "eventtasks.h"
-+#include "power_state.h"
-+#include "hwmgr.h"
-+#include "amd_powerplay.h"
-+#include "psm.h"
-+
-+int pem_task_update_allowed_performance_levels(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+
-+ if (pem_is_hw_access_blocked(eventmgr))
-+ return 0;
-+
-+ phm_force_dpm_levels(eventmgr->hwmgr, AMD_DPM_FORCED_LEVEL_AUTO);
-+
-+ return 0;
-+}
-+
-+/* eventtasks_generic.c */
-+int pem_task_adjust_power_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ struct pp_hwmgr *hwmgr;
-+
-+ if (pem_is_hw_access_blocked(eventmgr))
-+ return 0;
-+
-+ hwmgr = eventmgr->hwmgr;
-+ if (event_data->pnew_power_state != NULL)
-+ hwmgr->request_ps = event_data->pnew_power_state;
-+
-+ if (phm_cap_enabled(eventmgr->platform_descriptor->platformCaps, PHM_PlatformCaps_DynamicPatchPowerState))
-+ psm_adjust_power_state_dynamic(eventmgr, event_data->skip_state_adjust_rules);
-+ else
-+ psm_adjust_power_state_static(eventmgr, event_data->skip_state_adjust_rules);
-+
-+ return 0;
-+}
-+
-+int pem_task_power_down_asic(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_set_boot_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_reset_boot_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_update_new_power_state_clocks(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_system_shutdown(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_register_interrupts(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_unregister_interrupts(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ return pem_unregister_interrupts(eventmgr);
-+}
-+
-+
-+
-+int pem_task_get_boot_state_id(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ int result;
-+
-+ result = psm_get_state_by_classification(eventmgr,
-+ PP_StateClassificationFlag_Boot,
-+ &(event_data->requested_state_id)
-+ );
-+
-+ if (0 == result)
-+ pem_set_event_data_valid(event_data->valid_fields, PEM_EventDataValid_RequestedStateID);
-+ else
-+ pem_unset_event_data_valid(event_data->valid_fields, PEM_EventDataValid_RequestedStateID);
-+
-+ return result;
-+}
-+
-+int pem_task_enable_dynamic_state_management(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ return phm_enable_dynamic_state_management(eventmgr->hwmgr);
-+}
-+
-+int pem_task_disable_dynamic_state_management(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_enable_clock_power_gatings_tasks(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ return phm_enable_clock_power_gatings(eventmgr->hwmgr);
-+}
-+
-+int pem_task_powerdown_uvd_tasks(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ return phm_powerdown_uvd(eventmgr->hwmgr);
-+}
-+
-+int pem_task_powerdown_vce_tasks(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ phm_powergate_uvd(eventmgr->hwmgr, true);
-+ phm_powergate_vce(eventmgr->hwmgr, true);
-+ return 0;
-+}
-+
-+int pem_task_disable_clock_power_gatings_tasks(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_start_asic_block_usage(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_stop_asic_block_usage(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_setup_asic(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ return phm_setup_asic(eventmgr->hwmgr);
-+}
-+
-+int pem_task_cleanup_asic(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_store_dal_configuration(struct pp_eventmgr *eventmgr, const struct amd_display_configuration *display_config)
-+{
-+ /* TODO */
-+ return 0;
-+ /*phm_store_dal_configuration_data(eventmgr->hwmgr, display_config) */
-+}
-+
-+int pem_task_notify_hw_mgr_display_configuration_change(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_notify_hw_mgr_pre_display_configuration_change(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_block_adjust_power_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ eventmgr->block_adjust_power_state = true;
-+ /* to do PHM_ResetIPSCounter(pEventMgr->pHwMgr);*/
-+ return 0;
-+}
-+
-+int pem_task_unblock_adjust_power_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ eventmgr->block_adjust_power_state = false;
-+ return 0;
-+}
-+
-+int pem_task_notify_power_state_change(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_block_hw_access(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_un_block_hw_access(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_reset_display_phys_access(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_set_cpu_power_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+/*powersaving*/
-+
-+int pem_task_set_power_source(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_notify_hw_of_power_source(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_get_power_saving_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_reset_power_saving_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_set_power_saving_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_set_screen_state_on(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_set_screen_state_off(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_enable_voltage_island_power_gating(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_disable_voltage_island_power_gating(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_enable_cgpg(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_disable_cgpg(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_enable_clock_power_gating(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+
-+int pem_task_enable_gfx_clock_gating(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_disable_gfx_clock_gating(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+
-+/* performance */
-+int pem_task_set_performance_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ if (pem_is_event_data_valid(event_data->valid_fields, PEM_EventDataValid_RequestedStateID))
-+ return psm_set_performance_states(eventmgr, &(event_data->requested_state_id));
-+
-+ return 0;
-+}
-+
-+int pem_task_conditionally_force_3d_performance_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_enable_stutter_mode(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ /* TODO */
-+ return 0;
-+}
-+
-+int pem_task_get_2D_performance_state_id(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ int result;
-+
-+ if (eventmgr->features[PP_Feature_PowerPlay].supported &&
-+ !(eventmgr->features[PP_Feature_PowerPlay].enabled))
-+ result = psm_get_state_by_classification(eventmgr,
-+ PP_StateClassificationFlag_Boot,
-+ &(event_data->requested_state_id));
-+ else if (eventmgr->features[PP_Feature_User2DPerformance].enabled)
-+ result = psm_get_state_by_classification(eventmgr,
-+ PP_StateClassificationFlag_User2DPerformance,
-+ &(event_data->requested_state_id));
-+ else
-+ result = psm_get_ui_state(eventmgr, PP_StateUILabel_Performance,
-+ &(event_data->requested_state_id));
-+
-+ if (0 == result)
-+ pem_set_event_data_valid(event_data->valid_fields, PEM_EventDataValid_RequestedStateID);
-+ else
-+ pem_unset_event_data_valid(event_data->valid_fields, PEM_EventDataValid_RequestedStateID);
-+
-+ return result;
-+}
-+
-+int pem_task_create_user_performance_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data)
-+{
-+ struct pp_power_state *state;
-+ int table_entries;
-+ struct pp_hwmgr *hwmgr = eventmgr->hwmgr;
-+ int i;
-+
-+ table_entries = hwmgr->num_ps;
-+ state = hwmgr->ps;
-+
-+restart_search:
-+ for (i = 0; i < table_entries; i++) {
-+ if (state->classification.ui_label & event_data->requested_ui_label) {
-+ event_data->pnew_power_state = state;
-+ return 0;
-+ }
-+ state = (struct pp_power_state *)((uint64_t)state + hwmgr->ps_size);
-+ }
-+
-+ switch (event_data->requested_ui_label) {
-+ case PP_StateUILabel_Battery:
-+ case PP_StateUILabel_Balanced:
-+ event_data->requested_ui_label = PP_StateUILabel_Performance;
-+ goto restart_search;
-+ default:
-+ break;
-+ }
-+ return -1;
-+}
-+
-diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.h b/drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.h
-new file mode 100644
-index 0000000..37d3cf1
---- /dev/null
-+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventtasks.h
-@@ -0,0 +1,85 @@
-+/*
-+ * 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 _EVENT_TASKS_H_
-+#define _EVENT_TASKS_H_
-+#include "eventmgr.h"
-+
-+struct amd_display_configuration;
-+
-+/* eventtasks_generic.c */
-+int pem_task_adjust_power_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_power_down_asic(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_get_boot_state_id(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_set_boot_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_reset_boot_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_update_new_power_state_clocks(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_system_shutdown(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_register_interrupts(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_unregister_interrupts(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_enable_dynamic_state_management(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_disable_dynamic_state_management(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_enable_clock_power_gatings_tasks(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_powerdown_uvd_tasks(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_powerdown_vce_tasks(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_disable_clock_power_gatings_tasks(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_start_asic_block_usage(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_stop_asic_block_usage(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_setup_asic(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_cleanup_asic(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_store_dal_configuration (struct pp_eventmgr *eventmgr, const struct amd_display_configuration *display_config);
-+int pem_task_notify_hw_mgr_display_configuration_change(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_notify_hw_mgr_pre_display_configuration_change(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_block_adjust_power_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_unblock_adjust_power_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_notify_power_state_change(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_block_hw_access(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_un_block_hw_access(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_reset_display_phys_access(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_set_cpu_power_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+
-+/*powersaving*/
-+
-+int pem_task_set_power_source(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_notify_hw_of_power_source(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_get_power_saving_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_reset_power_saving_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_set_power_saving_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_set_screen_state_on(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_set_screen_state_off(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_enable_voltage_island_power_gating(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_disable_voltage_island_power_gating(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_enable_cgpg(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_disable_cgpg(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_enable_gfx_clock_gating(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_disable_gfx_clock_gating(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_enable_stutter_mode(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+
-+/* performance */
-+int pem_task_set_performance_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_conditionally_force_3d_performance_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_get_2D_performance_state_id(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_create_user_performance_state(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+int pem_task_update_allowed_performance_levels(struct pp_eventmgr *eventmgr, struct pem_event_data *event_data);
-+
-+#endif /* _EVENT_TASKS_H_ */
-diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c b/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c
-new file mode 100644
-index 0000000..7469c4c
---- /dev/null
-+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c
-@@ -0,0 +1,111 @@
-+/*
-+ * 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.
-+ *
-+ */
-+#include "psm.h"
-+
-+int psm_get_ui_state(struct pp_eventmgr *eventmgr, enum PP_StateUILabel ui_label, unsigned long *state_id)
-+{
-+ struct pp_power_state *state;
-+ int table_entries;
-+ struct pp_hwmgr *hwmgr = eventmgr->hwmgr;
-+ int i;
-+
-+ table_entries = hwmgr->num_ps;
-+ state = hwmgr->ps;
-+
-+ for (i = 0; i < table_entries; i++) {
-+ if (state->classification.ui_label & ui_label) {
-+ *state_id = state->id;
-+ return 0;
-+ }
-+ state = (struct pp_power_state *)((uint64_t)state + hwmgr->ps_size);
-+ }
-+ return -1;
-+}
-+
-+int psm_get_state_by_classification(struct pp_eventmgr *eventmgr, enum PP_StateClassificationFlag flag, unsigned long *state_id)
-+{
-+ struct pp_power_state *state;
-+ int table_entries;
-+ struct pp_hwmgr *hwmgr = eventmgr->hwmgr;
-+ int i;
-+
-+ table_entries = hwmgr->num_ps;
-+ state = hwmgr->ps;
-+
-+ for (i = 0; i < table_entries; i++) {
-+ if (state->classification.flags & flag) {
-+ *state_id = state->id;
-+ return 0;
-+ }
-+ state = (struct pp_power_state *)((uint64_t)state + hwmgr->ps_size);
-+ }
-+ return -1;
-+}
-+
-+int psm_set_performance_states(struct pp_eventmgr *eventmgr, unsigned long *state_id)
-+{
-+ struct pp_power_state *state;
-+ int table_entries;
-+ struct pp_hwmgr *hwmgr = eventmgr->hwmgr;
-+ int i;
-+
-+ table_entries = hwmgr->num_ps;
-+ state = hwmgr->ps;
-+
-+ for (i = 0; i < table_entries; i++) {
-+ if (state->id == *state_id) {
-+ hwmgr->request_ps = state;
-+ return 0;
-+ }
-+ state = (struct pp_power_state *)((uint64_t)state + hwmgr->ps_size);
-+ }
-+ return -1;
-+}
-+
-+
-+int psm_adjust_power_state_dynamic(struct pp_eventmgr *eventmgr, bool skip)
-+{
-+
-+ const struct pp_power_state *pcurrent;
-+ struct pp_power_state *requested;
-+ struct pp_hwmgr *hwmgr;
-+
-+ if (skip)
-+ return 0;
-+
-+ hwmgr = eventmgr->hwmgr;
-+ pcurrent = hwmgr->current_ps;
-+ requested = hwmgr->request_ps;
-+
-+ if (pcurrent != NULL || requested != NULL) {
-+ phm_apply_state_adjust_rules(hwmgr, requested, pcurrent);
-+ phm_set_power_state(hwmgr, &pcurrent->hardware, &requested->hardware);
-+ hwmgr->current_ps = requested;
-+ }
-+ return 0;
-+}
-+
-+int psm_adjust_power_state_static(struct pp_eventmgr *eventmgr, bool skip)
-+{
-+ return 0;
-+}
-diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/psm.h b/drivers/gpu/drm/amd/powerplay/eventmgr/psm.h
-new file mode 100644
-index 0000000..15abfac
---- /dev/null
-+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/psm.h
-@@ -0,0 +1,37 @@
-+/*
-+ * 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.
-+ *
-+ */
-+#include "eventmgr.h"
-+#include "eventinit.h"
-+#include "eventmanagement.h"
-+#include "eventmanager.h"
-+#include "power_state.h"
-+
-+int psm_get_ui_state(struct pp_eventmgr *eventmgr, enum PP_StateUILabel ui_label, unsigned long *state_id);
-+
-+int psm_get_state_by_classification(struct pp_eventmgr *eventmgr, enum PP_StateClassificationFlag flag, unsigned long *state_id);
-+
-+int psm_set_performance_states(struct pp_eventmgr *eventmgr, unsigned long *state_id);
-+
-+int psm_adjust_power_state_dynamic(struct pp_eventmgr *eventmgr, bool skip);
-+
-+int psm_adjust_power_state_static(struct pp_eventmgr *eventmgr, bool skip);
-diff --git a/drivers/gpu/drm/amd/powerplay/inc/eventmanager.h b/drivers/gpu/drm/amd/powerplay/inc/eventmanager.h
-new file mode 100644
-index 0000000..b9d84de
---- /dev/null
-+++ b/drivers/gpu/drm/amd/powerplay/inc/eventmanager.h
-@@ -0,0 +1,109 @@
-+/*
-+ * 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 _EVENT_MANAGER_H_
-+#define _EVENT_MANAGER_H_
-+
-+#include "power_state.h"
-+#include "pp_power_source.h"
-+#include "hardwaremanager.h"
-+#include "pp_asicblocks.h"
-+
-+struct pp_eventmgr;
-+enum amd_pp_event;
-+
-+enum PEM_EventDataValid {
-+ PEM_EventDataValid_RequestedStateID = 0,
-+ PEM_EventDataValid_RequestedUILabel,
-+ PEM_EventDataValid_NewPowerState,
-+ PEM_EventDataValid_RequestedPowerSource,
-+ PEM_EventDataValid_RequestedClocks,
-+ PEM_EventDataValid_CurrentTemperature,
-+ PEM_EventDataValid_AsicBlocks,
-+ PEM_EventDataValid_ODParameters,
-+ PEM_EventDataValid_PXAdapterPrefs,
-+ PEM_EventDataValid_PXUserPrefs,
-+ PEM_EventDataValid_PXSwitchReason,
-+ PEM_EventDataValid_PXSwitchPhase,
-+ PEM_EventDataValid_HdVideo,
-+ PEM_EventDataValid_BacklightLevel,
-+ PEM_EventDatavalid_VariBrightParams,
-+ PEM_EventDataValid_VariBrightLevel,
-+ PEM_EventDataValid_VariBrightImmediateChange,
-+ PEM_EventDataValid_PercentWhite,
-+ PEM_EventDataValid_SdVideo,
-+ PEM_EventDataValid_HTLinkChangeReason,
-+ PEM_EventDataValid_HWBlocks,
-+ PEM_EventDataValid_RequestedThermalState,
-+ PEM_EventDataValid_MvcVideo,
-+ PEM_EventDataValid_Max
-+};
-+
-+typedef enum PEM_EventDataValid PEM_EventDataValid;
-+
-+/* Number of bits in ULONG variable */
-+#define PEM_MAX_NUM_EVENTDATAVALID_BITS_PER_FIELD (sizeof(unsigned long)*8)
-+
-+/* Number of ULONG entries used by event data valid bits */
-+#define PEM_MAX_NUM_EVENTDATAVALID_ULONG_ENTRIES \
-+ ((PEM_EventDataValid_Max + PEM_MAX_NUM_EVENTDATAVALID_BITS_PER_FIELD - 1) / \
-+ PEM_MAX_NUM_EVENTDATAVALID_BITS_PER_FIELD)
-+
-+static inline void pem_set_event_data_valid(unsigned long *fields, PEM_EventDataValid valid_field)
-+{
-+ fields[valid_field / PEM_MAX_NUM_EVENTDATAVALID_BITS_PER_FIELD] |=
-+ (1UL << (valid_field % PEM_MAX_NUM_EVENTDATAVALID_BITS_PER_FIELD));
-+}
-+
-+static inline void pem_unset_event_data_valid(unsigned long *fields, PEM_EventDataValid valid_field)
-+{
-+ fields[valid_field / PEM_MAX_NUM_EVENTDATAVALID_BITS_PER_FIELD] &=
-+ ~(1UL << (valid_field % PEM_MAX_NUM_EVENTDATAVALID_BITS_PER_FIELD));
-+}
-+
-+static inline unsigned long pem_is_event_data_valid(const unsigned long *fields, PEM_EventDataValid valid_field)
-+{
-+ return fields[valid_field / PEM_MAX_NUM_EVENTDATAVALID_BITS_PER_FIELD] &
-+ (1UL << (valid_field % PEM_MAX_NUM_EVENTDATAVALID_BITS_PER_FIELD));
-+}
-+
-+struct pem_event_data {
-+ unsigned long valid_fields[100];
-+ unsigned long requested_state_id;
-+ enum PP_StateUILabel requested_ui_label;
-+ struct pp_power_state *pnew_power_state;
-+ enum pp_power_source requested_power_source;
-+ struct PP_Clocks requested_clocks;
-+ bool skip_state_adjust_rules;
-+ struct phm_asic_blocks asic_blocks;
-+ /* to doPP_ThermalState requestedThermalState;
-+ enum ThermalStateRequestSrc requestThermalStateSrc;
-+ PP_Temperature currentTemperature;*/
-+
-+};
-+
-+int pem_handle_event(struct pp_eventmgr *eventmgr, enum amd_pp_event event,
-+ struct pem_event_data *event_data);
-+
-+bool pem_is_hw_access_blocked(struct pp_eventmgr *eventmgr);
-+
-+#endif /* _EVENT_MANAGER_H_ */
-diff --git a/drivers/gpu/drm/amd/powerplay/inc/eventmgr.h b/drivers/gpu/drm/amd/powerplay/inc/eventmgr.h
-new file mode 100644
-index 0000000..10437dc
---- /dev/null
-+++ b/drivers/gpu/drm/amd/powerplay/inc/eventmgr.h
-@@ -0,0 +1,125 @@
-+/*
-+ * 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 _EVENTMGR_H_
-+#define _EVENTMGR_H_
-+
-+#include <linux/mutex.h>
-+#include "pp_instance.h"
-+#include "hardwaremanager.h"
-+#include "eventmanager.h"
-+#include "pp_feature.h"
-+#include "pp_power_source.h"
-+#include "power_state.h"
-+
-+typedef int (*pem_event_action)(struct pp_eventmgr *eventmgr,
-+ struct pem_event_data *event_data);
-+
-+struct action_chain {
-+ const char *description; /* action chain description for debugging purpose */
-+ const pem_event_action **action_chain; /* pointer to chain of event actions */
-+};
-+
-+struct pem_power_source_ui_state_info {
-+ enum PP_StateUILabel current_ui_label;
-+ enum PP_StateUILabel default_ui_lable;
-+ unsigned long configurable_ui_mapping;
-+};
-+
-+struct pp_clock_range {
-+ uint32_t min_sclk_khz;
-+ uint32_t max_sclk_khz;
-+
-+ uint32_t min_mclk_khz;
-+ uint32_t max_mclk_khz;
-+
-+ uint32_t min_vclk_khz;
-+ uint32_t max_vclk_khz;
-+
-+ uint32_t min_dclk_khz;
-+ uint32_t max_dclk_khz;
-+
-+ uint32_t min_aclk_khz;
-+ uint32_t max_aclk_khz;
-+
-+ uint32_t min_eclk_khz;
-+ uint32_t max_eclk_khz;
-+};
-+
-+enum pp_state {
-+ UNINITIALIZED,
-+ INACTIVE,
-+ ACTIVE
-+};
-+
-+enum pp_ring_index {
-+ PP_RING_TYPE_GFX_INDEX = 0,
-+ PP_RING_TYPE_DMA_INDEX,
-+ PP_RING_TYPE_DMA1_INDEX,
-+ PP_RING_TYPE_UVD_INDEX,
-+ PP_RING_TYPE_VCE0_INDEX,
-+ PP_RING_TYPE_VCE1_INDEX,
-+ PP_RING_TYPE_CP1_INDEX,
-+ PP_RING_TYPE_CP2_INDEX,
-+ PP_NUM_RINGS,
-+};
-+
-+struct pp_request {
-+ uint32_t flags;
-+ uint32_t sclk;
-+ uint32_t sclk_throttle;
-+ uint32_t mclk;
-+ uint32_t vclk;
-+ uint32_t dclk;
-+ uint32_t eclk;
-+ uint32_t aclk;
-+ uint32_t iclk;
-+ uint32_t vp8clk;
-+ uint32_t rsv[32];
-+};
-+
-+struct pp_eventmgr {
-+ struct pp_hwmgr *hwmgr;
-+ struct pp_smumgr *smumgr;
-+
-+ struct pp_feature_info features[PP_Feature_Max];
-+ const struct action_chain *event_chain[AMD_PP_EVENT_MAX];
-+ struct phm_platform_descriptor *platform_descriptor;
-+ struct pp_clock_range clock_range;
-+ enum pp_power_source current_power_source;
-+ struct pem_power_source_ui_state_info ui_state_info[PP_PowerSource_Max];
-+ enum pp_state states[PP_NUM_RINGS];
-+ struct pp_request hi_req;
-+ struct list_head context_list;
-+ struct mutex lock;
-+ bool block_adjust_power_state;
-+ bool enable_cg;
-+ bool enable_gfx_cgpg;
-+ int (*pp_eventmgr_init)(struct pp_eventmgr *eventmgr);
-+ void (*pp_eventmgr_fini)(struct pp_eventmgr *eventmgr);
-+};
-+
-+int eventmgr_init(struct pp_instance *handle);
-+int eventmgr_fini(struct pp_eventmgr *eventmgr);
-+
-+#endif /* _EVENTMGR_H_ */
-diff --git a/drivers/gpu/drm/amd/powerplay/inc/pp_feature.h b/drivers/gpu/drm/amd/powerplay/inc/pp_feature.h
-new file mode 100644
-index 0000000..0faf6a2
---- /dev/null
-+++ b/drivers/gpu/drm/amd/powerplay/inc/pp_feature.h
-@@ -0,0 +1,67 @@
-+/*
-+ * 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_FEATURE_H_
-+#define _PP_FEATURE_H_
-+
-+/**
-+ * PowerPlay feature ids.
-+ */
-+enum pp_feature {
-+ PP_Feature_PowerPlay = 0,
-+ PP_Feature_User2DPerformance,
-+ PP_Feature_User3DPerformance,
-+ PP_Feature_VariBright,
-+ PP_Feature_VariBrightOnPowerXpress,
-+ PP_Feature_ReducedRefreshRate,
-+ PP_Feature_GFXClockGating,
-+ PP_Feature_OverdriveTest,
-+ PP_Feature_OverDrive,
-+ PP_Feature_PowerBudgetWaiver,
-+ PP_Feature_PowerControl,
-+ PP_Feature_PowerControl_2,
-+ PP_Feature_MultiUVDState,
-+ PP_Feature_Force3DClock,
-+ PP_Feature_BACO,
-+ PP_Feature_PowerDown,
-+ PP_Feature_DynamicUVDState,
-+ PP_Feature_VCEDPM,
-+ PP_Feature_PPM,
-+ PP_Feature_ACP_POWERGATING,
-+ PP_Feature_FFC,
-+ PP_Feature_FPS,
-+ PP_Feature_ViPG,
-+ PP_Feature_Max
-+};
-+
-+/**
-+ * Struct for PowerPlay feature info.
-+ */
-+struct pp_feature_info {
-+ bool supported; /* feature supported by PowerPlay */
-+ bool enabled; /* feature enabled in PowerPlay */
-+ bool enabled_default; /* default enable status of the feature */
-+ uint32_t version; /* feature version */
-+};
-+
-+#endif /* _PP_FEATURE_H_ */
-diff --git a/drivers/gpu/drm/amd/powerplay/inc/pp_instance.h b/drivers/gpu/drm/amd/powerplay/inc/pp_instance.h
-index 35dfcd9..7b60b61 100644
---- a/drivers/gpu/drm/amd/powerplay/inc/pp_instance.h
-+++ b/drivers/gpu/drm/amd/powerplay/inc/pp_instance.h
-@@ -25,10 +25,12 @@
-
- #include "smumgr.h"
- #include "hwmgr.h"
-+#include "eventmgr.h"
-
- struct pp_instance {
- struct pp_smumgr *smu_mgr;
- struct pp_hwmgr *hwmgr;
-+ struct pp_eventmgr *eventmgr;
- };
-
- #endif
---
-2.7.4
-