blob: b7aa0e1fa8e9468637a0f631d40ef07867703e7d [file] [log] [blame]
/*
*
* (C) COPYRIGHT 2018 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 licence.
*
* 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.
*
* SPDX-License-Identifier: GPL-2.0
*
*/
/*
* Virtual interface for hardware counter backends.
*/
#ifndef _KBASE_HWCNT_BACKEND_H_
#define _KBASE_HWCNT_BACKEND_H_
#include <linux/types.h>
struct kbase_hwcnt_metadata;
struct kbase_hwcnt_enable_map;
struct kbase_hwcnt_dump_buffer;
/*
* struct kbase_hwcnt_backend_info - Opaque pointer to information used to
* create an instance of a hardware counter
* backend.
*/
struct kbase_hwcnt_backend_info;
/*
* struct kbase_hwcnt_backend_info - Opaque pointer to a hardware counter
* backend, used to perform dumps.
*/
struct kbase_hwcnt_backend;
/**
* typedef kbase_hwcnt_backend_init_fn - Initialise a counter backend.
* @info: Non-NULL pointer to backend info.
* @out_backend: Non-NULL pointer to where backend is stored on success.
*
* All uses of the created hardware counter backend must be externally
* synchronised.
*
* Return: 0 on success, else error code.
*/
typedef int (*kbase_hwcnt_backend_init_fn)(
const struct kbase_hwcnt_backend_info *info,
struct kbase_hwcnt_backend **out_backend);
/**
* typedef kbase_hwcnt_backend_term_fn - Terminate a counter backend.
* @backend: Pointer to backend to be terminated.
*/
typedef void (*kbase_hwcnt_backend_term_fn)(
struct kbase_hwcnt_backend *backend);
/**
* typedef kbase_hwcnt_backend_timestamp_ns_fn - Get the current backend
* timestamp.
* @backend: Non-NULL pointer to backend.
*
* Return: Backend timestamp in nanoseconds.
*/
typedef u64 (*kbase_hwcnt_backend_timestamp_ns_fn)(
struct kbase_hwcnt_backend *backend);
/**
* typedef kbase_hwcnt_backend_dump_enable_fn - Start counter dumping with the
* backend.
* @backend: Non-NULL pointer to backend.
* @enable_map: Non-NULL pointer to enable map specifying enabled counters.
*
* The enable_map must have been created using the interface's metadata.
* If the backend has already been enabled, an error is returned.
*
* May be called in an atomic context.
*
* Return: 0 on success, else error code.
*/
typedef int (*kbase_hwcnt_backend_dump_enable_fn)(
struct kbase_hwcnt_backend *backend,
const struct kbase_hwcnt_enable_map *enable_map);
/**
* typedef kbase_hwcnt_backend_dump_enable_nolock_fn - Start counter dumping
* with the backend.
* @backend: Non-NULL pointer to backend.
* @enable_map: Non-NULL pointer to enable map specifying enabled counters.
*
* Exactly the same as kbase_hwcnt_backend_dump_enable_fn(), except must be
* called in an atomic context with the spinlock documented by the specific
* backend interface held.
*
* Return: 0 on success, else error code.
*/
typedef int (*kbase_hwcnt_backend_dump_enable_nolock_fn)(
struct kbase_hwcnt_backend *backend,
const struct kbase_hwcnt_enable_map *enable_map);
/**
* typedef kbase_hwcnt_backend_dump_disable_fn - Disable counter dumping with
* the backend.
* @backend: Non-NULL pointer to backend.
*
* If the backend is already disabled, does nothing.
* Any undumped counter values since the last dump get will be lost.
*/
typedef void (*kbase_hwcnt_backend_dump_disable_fn)(
struct kbase_hwcnt_backend *backend);
/**
* typedef kbase_hwcnt_backend_dump_clear_fn - Reset all the current undumped
* counters.
* @backend: Non-NULL pointer to backend.
*
* If the backend is not enabled, returns an error.
*
* Return: 0 on success, else error code.
*/
typedef int (*kbase_hwcnt_backend_dump_clear_fn)(
struct kbase_hwcnt_backend *backend);
/**
* typedef kbase_hwcnt_backend_dump_request_fn - Request an asynchronous counter
* dump.
* @backend: Non-NULL pointer to backend.
*
* If the backend is not enabled or another dump is already in progress,
* returns an error.
*
* Return: 0 on success, else error code.
*/
typedef int (*kbase_hwcnt_backend_dump_request_fn)(
struct kbase_hwcnt_backend *backend);
/**
* typedef kbase_hwcnt_backend_dump_wait_fn - Wait until the last requested
* counter dump has completed.
* @backend: Non-NULL pointer to backend.
*
* If the backend is not enabled, returns an error.
*
* Return: 0 on success, else error code.
*/
typedef int (*kbase_hwcnt_backend_dump_wait_fn)(
struct kbase_hwcnt_backend *backend);
/**
* typedef kbase_hwcnt_backend_dump_get_fn - Copy or accumulate enable the
* counters dumped after the last dump
* request into the dump buffer.
* @backend: Non-NULL pointer to backend.
* @dump_buffer: Non-NULL pointer to destination dump buffer.
* @enable_map: Non-NULL pointer to enable map specifying enabled values.
* @accumulate: True if counters should be accumulated into dump_buffer, rather
* than copied.
*
* If the backend is not enabled, returns an error.
* If a dump is in progress (i.e. dump_wait has not yet returned successfully)
* then the resultant contents of the dump buffer will be undefined.
*
* Return: 0 on success, else error code.
*/
typedef int (*kbase_hwcnt_backend_dump_get_fn)(
struct kbase_hwcnt_backend *backend,
struct kbase_hwcnt_dump_buffer *dump_buffer,
const struct kbase_hwcnt_enable_map *enable_map,
bool accumulate);
/**
* struct kbase_hwcnt_backend_interface - Hardware counter backend virtual
* interface.
* @metadata: Immutable hardware counter metadata.
* @info: Immutable info used to initialise an instance of the
* backend.
* @init: Function ptr to initialise an instance of the backend.
* @term: Function ptr to terminate an instance of the backend.
* @timestamp_ns: Function ptr to get the current backend timestamp.
* @dump_enable: Function ptr to enable dumping.
* @dump_enable_nolock: Function ptr to enable dumping while the
* backend-specific spinlock is already held.
* @dump_disable: Function ptr to disable dumping.
* @dump_clear: Function ptr to clear counters.
* @dump_request: Function ptr to request a dump.
* @dump_wait: Function ptr to wait until dump to complete.
* @dump_get: Function ptr to copy or accumulate dump into a dump
* buffer.
*/
struct kbase_hwcnt_backend_interface {
const struct kbase_hwcnt_metadata *metadata;
const struct kbase_hwcnt_backend_info *info;
kbase_hwcnt_backend_init_fn init;
kbase_hwcnt_backend_term_fn term;
kbase_hwcnt_backend_timestamp_ns_fn timestamp_ns;
kbase_hwcnt_backend_dump_enable_fn dump_enable;
kbase_hwcnt_backend_dump_enable_nolock_fn dump_enable_nolock;
kbase_hwcnt_backend_dump_disable_fn dump_disable;
kbase_hwcnt_backend_dump_clear_fn dump_clear;
kbase_hwcnt_backend_dump_request_fn dump_request;
kbase_hwcnt_backend_dump_wait_fn dump_wait;
kbase_hwcnt_backend_dump_get_fn dump_get;
};
#endif /* _KBASE_HWCNT_BACKEND_H_ */