/* 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 <linux/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_ */
|