/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
/*
 *
 * (C) COPYRIGHT 2022 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.
 *
 */

#ifndef _KBASE_DEBUG_CORESIGHT_INTERNAL_CSF_H_
#define _KBASE_DEBUG_CORESIGHT_INTERNAL_CSF_H_

#include <mali_kbase.h>
#include "mali_kbase_debug_coresight_csf.h"

/**
 * struct kbase_debug_coresight_csf_client - Coresight client definition
 *
 * @drv_data:    Pointer to driver device data.
 * @addr_ranges: Arrays of address ranges used by the registered client.
 * @nr_ranges:   Size of @addr_ranges array.
 * @link:        Link item of a Coresight client.
 *               Linked to &struct_kbase_device.csf.coresight.clients.
 */
struct kbase_debug_coresight_csf_client {
	void *drv_data;
	struct kbase_debug_coresight_csf_address_range *addr_ranges;
	u32 nr_ranges;
	struct list_head link;
};

/**
 * enum kbase_debug_coresight_csf_state - Coresight configuration states
 *
 * @KBASE_DEBUG_CORESIGHT_CSF_DISABLED: Coresight configuration is disabled.
 * @KBASE_DEBUG_CORESIGHT_CSF_ENABLED:  Coresight configuration is enabled.
 */
enum kbase_debug_coresight_csf_state {
	KBASE_DEBUG_CORESIGHT_CSF_DISABLED = 0,
	KBASE_DEBUG_CORESIGHT_CSF_ENABLED,
};

/**
 * struct kbase_debug_coresight_csf_config - Coresight configuration definition
 *
 * @client:      Pointer to the client for which the configuration is created.
 * @enable_seq:  Array of operations for Coresight client enable sequence. Can be NULL.
 * @disable_seq: Array of operations for Coresight client disable sequence. Can be NULL.
 * @state:       Current Coresight configuration state.
 * @error:       Error code used to know if an error occurred during the execution
 *               of the enable or disable sequences.
 * @link:        Link item of a Coresight configuration.
 *               Linked to &struct_kbase_device.csf.coresight.configs.
 */
struct kbase_debug_coresight_csf_config {
	void *client;
	struct kbase_debug_coresight_csf_sequence *enable_seq;
	struct kbase_debug_coresight_csf_sequence *disable_seq;
	enum kbase_debug_coresight_csf_state state;
	int error;
	struct list_head link;
};

/**
 * struct kbase_debug_coresight_device - Object representing the Coresight device
 *
 * @clients: List head to maintain Coresight clients.
 * @configs: List head to maintain Coresight configs.
 * @lock: A lock to protect client/config lists.
 *                  Lists can be accessed concurrently by
 *                  Coresight kernel modules and kernel threads.
 * @workq: Work queue for Coresight enable/disable execution.
 * @enable_work: Work item used to enable Coresight.
 * @disable_work: Work item used to disable Coresight.
 * @event_wait: Wait queue for Coresight events.
 * @enable_on_pmode_exit: Flag used by the PM state machine to
 *                        identify if Coresight enable is needed.
 * @disable_on_pmode_enter: Flag used by the PM state machine to
 *                         identify if Coresight disable is needed.
 */
struct kbase_debug_coresight_device {
	struct list_head clients;
	struct list_head configs;
	spinlock_t lock;
	struct workqueue_struct *workq;
	struct work_struct enable_work;
	struct work_struct disable_work;
	wait_queue_head_t event_wait;
	bool enable_on_pmode_exit;
	bool disable_on_pmode_enter;
};

/**
 * kbase_debug_coresight_csf_init - Initialize Coresight resources.
 *
 * @kbdev: Instance of a GPU platform device that implements a CSF interface.
 *
 * This function should be called once at device initialization.
 *
 * Return: 0 on success.
 */
int kbase_debug_coresight_csf_init(struct kbase_device *kbdev);

/**
 * kbase_debug_coresight_csf_term - Terminate Coresight resources.
 *
 * @kbdev: Instance of a GPU platform device that implements a CSF interface.
 *
 * This function should be called at device termination to prevent any
 * memory leaks if Coresight module would have been removed without calling
 * kbasep_debug_coresight_csf_trace_disable().
 */
void kbase_debug_coresight_csf_term(struct kbase_device *kbdev);

/**
 * kbase_debug_coresight_csf_disable_pmode_enter - Disable Coresight on Protected
 *                                                 mode enter.
 *
 * @kbdev: Instance of a GPU platform device that implements a CSF interface.
 *
 * This function should be called just before requesting to enter protected mode.
 * It will trigger a PM state machine transition from MCU_ON
 * to ON_PMODE_ENTER_CORESIGHT_DISABLE.
 */
void kbase_debug_coresight_csf_disable_pmode_enter(struct kbase_device *kbdev);

/**
 * kbase_debug_coresight_csf_enable_pmode_exit - Enable Coresight on Protected
 *                                                 mode enter.
 *
 * @kbdev: Instance of a GPU platform device that implements a CSF interface.
 *
 * This function should be called after protected mode exit is acknowledged.
 * It will trigger a PM state machine transition from MCU_ON
 * to ON_PMODE_EXIT_CORESIGHT_ENABLE.
 */
void kbase_debug_coresight_csf_enable_pmode_exit(struct kbase_device *kbdev);

/**
 * kbase_debug_coresight_csf_state_request - Request Coresight state transition.
 *
 * @kbdev:     Instance of a GPU platform device that implements a CSF interface.
 * @state:     Coresight state to check for.
 */
void kbase_debug_coresight_csf_state_request(struct kbase_device *kbdev,
					     enum kbase_debug_coresight_csf_state state);

/**
 * kbase_debug_coresight_csf_state_check - Check Coresight state.
 *
 * @kbdev:     Instance of a GPU platform device that implements a CSF interface.
 * @state:     Coresight state to check for.
 *
 * Return: true if all states of configs are @state.
 */
bool kbase_debug_coresight_csf_state_check(struct kbase_device *kbdev,
					   enum kbase_debug_coresight_csf_state state);

/**
 * kbase_debug_coresight_csf_state_wait - Wait for Coresight state transition to complete.
 *
 * @kbdev:     Instance of a GPU platform device that implements a CSF interface.
 * @state:     Coresight state to wait for.
 *
 * Return: true if all configs become @state in pre-defined time period.
 */
bool kbase_debug_coresight_csf_state_wait(struct kbase_device *kbdev,
					  enum kbase_debug_coresight_csf_state state);

#endif /* _KBASE_DEBUG_CORESIGHT_INTERNAL_CSF_H_ */
