/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
/*
 *
 * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
 *
 * This program is free software and is provided to you under the terms of the
 * GNU General Public License version 2 as published by the Free Software
 * Foundation, and any use by you of this program is subject to the terms
 * of such GNU license.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can access it online at
 * http://www.gnu.org/licenses/gpl-2.0.html.
 *
 */

/*
 * Backend-specific Power Manager MCU state definitions.
 * The function-like macro KBASEP_MCU_STATE() must be defined before including
 * this header file. This header file can be included multiple times in the
 * same compilation unit with different definitions of KBASEP_MCU_STATE().
 *
 * @OFF:                                The MCU is powered off.
 * @PEND_ON_RELOAD:                     The warm boot of MCU or cold boot of MCU (with
 *                                      firmware reloading) is in progress.
 * @ON_GLB_REINIT_PEND:                 The MCU is enabled and Global configuration
 *                                      requests have been sent to the firmware.
 * @ON_HWCNT_ENABLE:                    The Global requests have completed and MCU is now
 *                                      ready for use and hwcnt is being enabled.
 * @ON:                                 The MCU is active and hwcnt has been enabled.
 * @ON_CORE_ATTR_UPDATE_PEND:           The MCU is active and mask of enabled shader cores
 *                                      is being updated.
 * @ON_HWCNT_DISABLE:                   The MCU is on and hwcnt is being disabled.
 * @ON_HALT:                            The MCU is on and hwcnt has been disabled, MCU
 *                                      halt would be triggered.
 * @ON_PEND_HALT:                       MCU halt in progress, confirmation pending.
 * @POWER_DOWN:                         MCU halted operations, pending being disabled.
 * @PEND_OFF:                           MCU is being disabled, pending on powering off.
 * @RESET_WAIT:                         The GPU is resetting, MCU state is unknown.
 * @HCTL_SHADERS_PEND_ON:               Global configuration requests sent to the firmware
 *                                      have completed and shaders have been requested to
 *                                      power on.
 * @HCTL_CORES_NOTIFY_PEND:             Shader cores have powered up and firmware is being
 *                                      notified of the mask of enabled shader cores.
 * @HCTL_MCU_ON_RECHECK:                MCU is on and hwcnt disabling is triggered
 *                                      and checks are done to update the number of
 *                                      enabled cores.
 * @HCTL_SHADERS_READY_OFF:             MCU has halted and cores need to be powered down
 * @HCTL_SHADERS_PEND_OFF:              Cores are transitioning to power down.
 * @HCTL_CORES_DOWN_SCALE_NOTIFY_PEND:  firmware has been informed to stop using
 *                                      specific cores, due to core_mask change request.
 *                                      After the ACK from FW, the wait will be done for
 *                                      undesired cores to become inactive.
 * @HCTL_CORE_INACTIVE_PEND:            Waiting for specific cores to become inactive.
 *                                      Once the cores become inactive their power down
 *                                      will be initiated.
 * @HCTL_SHADERS_CORE_OFF_PEND:         Waiting for specific cores to complete the
 *                                      transition to power down. Once powered down,
 *                                      HW counters will be re-enabled.
 * @ON_SLEEP_INITIATE:                  MCU is on and hwcnt has been disabled and MCU
 *                                      is being put to sleep.
 * @ON_PEND_SLEEP:                      MCU sleep is in progress.
 * @IN_SLEEP:                           Sleep request is completed and MCU has halted.
 */
KBASEP_MCU_STATE(OFF)
KBASEP_MCU_STATE(PEND_ON_RELOAD)
KBASEP_MCU_STATE(ON_GLB_REINIT_PEND)
KBASEP_MCU_STATE(ON_HWCNT_ENABLE)
KBASEP_MCU_STATE(ON)
KBASEP_MCU_STATE(ON_CORE_ATTR_UPDATE_PEND)
KBASEP_MCU_STATE(ON_HWCNT_DISABLE)
KBASEP_MCU_STATE(ON_HALT)
KBASEP_MCU_STATE(ON_PEND_HALT)
KBASEP_MCU_STATE(POWER_DOWN)
KBASEP_MCU_STATE(PEND_OFF)
KBASEP_MCU_STATE(RESET_WAIT)
/* Additional MCU states with HOST_CONTROL_SHADERS */
KBASEP_MCU_STATE(HCTL_SHADERS_PEND_ON)
KBASEP_MCU_STATE(HCTL_CORES_NOTIFY_PEND)
KBASEP_MCU_STATE(HCTL_MCU_ON_RECHECK)
KBASEP_MCU_STATE(HCTL_SHADERS_READY_OFF)
KBASEP_MCU_STATE(HCTL_SHADERS_PEND_OFF)
KBASEP_MCU_STATE(HCTL_CORES_DOWN_SCALE_NOTIFY_PEND)
KBASEP_MCU_STATE(HCTL_CORE_INACTIVE_PEND)
KBASEP_MCU_STATE(HCTL_SHADERS_CORE_OFF_PEND)
/* Additional MCU states to support GPU sleep feature */
KBASEP_MCU_STATE(ON_SLEEP_INITIATE)
KBASEP_MCU_STATE(ON_PEND_SLEEP)
KBASEP_MCU_STATE(IN_SLEEP)
