blob: 12891e036a80d147314de201dc60af5f326edab3 [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
*
*/
#ifndef _KBASE_HWCNT_GPU_H_
#define _KBASE_HWCNT_GPU_H_
#include <linux/types.h>
struct kbase_device;
struct kbase_hwcnt_metadata;
struct kbase_hwcnt_enable_map;
struct kbase_hwcnt_dump_buffer;
/**
* enum kbase_hwcnt_gpu_group_type - GPU hardware counter group types, used to
* identify metadata groups.
* @KBASE_HWCNT_GPU_GROUP_TYPE_V4: GPU V4 group type.
* @KBASE_HWCNT_GPU_GROUP_TYPE_V5: GPU V5 group type.
*/
enum kbase_hwcnt_gpu_group_type {
KBASE_HWCNT_GPU_GROUP_TYPE_V4 = 0x10,
KBASE_HWCNT_GPU_GROUP_TYPE_V5,
};
/**
* enum kbase_hwcnt_gpu_v4_block_type - GPU V4 hardware counter block types,
* used to identify metadata blocks.
* @KBASE_HWCNT_GPU_V4_BLOCK_TYPE_SHADER: Shader block.
* @KBASE_HWCNT_GPU_V4_BLOCK_TYPE_TILER: Tiler block.
* @KBASE_HWCNT_GPU_V4_BLOCK_TYPE_MMU_L2: MMU/L2 block.
* @KBASE_HWCNT_GPU_V4_BLOCK_TYPE_JM: Job Manager block.
* @KBASE_HWCNT_GPU_V4_BLOCK_TYPE_RESERVED: Reserved block.
*/
enum kbase_hwcnt_gpu_v4_block_type {
KBASE_HWCNT_GPU_V4_BLOCK_TYPE_SHADER = 0x20,
KBASE_HWCNT_GPU_V4_BLOCK_TYPE_TILER,
KBASE_HWCNT_GPU_V4_BLOCK_TYPE_MMU_L2,
KBASE_HWCNT_GPU_V4_BLOCK_TYPE_JM,
KBASE_HWCNT_GPU_V4_BLOCK_TYPE_RESERVED,
};
/**
* enum kbase_hwcnt_gpu_v5_block_type - GPU V5 hardware counter block types,
* used to identify metadata blocks.
* @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_JM: Job Manager block.
* @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_TILER: Tiler block.
* @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC: Shader Core block.
* @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC2: Secondary Shader Core block.
* @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS: Memsys block.
* @KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS2: Secondary Memsys block.
*/
enum kbase_hwcnt_gpu_v5_block_type {
KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_JM = 0x40,
KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_TILER,
KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC,
KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC2,
KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS,
KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS2,
};
/**
* struct kbase_hwcnt_physical_enable_map - Representation of enable map
* directly used by GPU.
* @jm_bm: Job Manager counters selection bitmask.
* @shader_bm: Shader counters selection bitmask.
* @tiler_bm: Tiler counters selection bitmask.
* @mmu_l2_bm: MMU_L2 counters selection bitmask.
*/
struct kbase_hwcnt_physical_enable_map {
u32 jm_bm;
u32 shader_bm;
u32 tiler_bm;
u32 mmu_l2_bm;
};
/**
* struct kbase_hwcnt_gpu_v4_info - Information about hwcnt blocks on v4 GPUs.
* @cg_count: Core group count.
* @cgs: Non-NULL pointer to array of cg_count coherent group structures.
*
* V4 devices are Mali-T6xx or Mali-T72x, and have one or more core groups,
* where each core group may have a physically different layout.
*/
struct kbase_hwcnt_gpu_v4_info {
size_t cg_count;
const struct mali_base_gpu_coherent_group *cgs;
};
/**
* struct kbase_hwcnt_gpu_v5_info - Information about hwcnt blocks on v5 GPUs.
* @l2_count: L2 cache count.
* @core_mask: Shader core mask. May be sparse.
*/
struct kbase_hwcnt_gpu_v5_info {
size_t l2_count;
u64 core_mask;
};
/**
* struct kbase_hwcnt_gpu_info - Tagged union with information about the current
* GPU's hwcnt blocks.
* @type: GPU type.
* @v4: Info filled in if a v4 GPU.
* @v5: Info filled in if a v5 GPU.
*/
struct kbase_hwcnt_gpu_info {
enum kbase_hwcnt_gpu_group_type type;
union {
struct kbase_hwcnt_gpu_v4_info v4;
struct kbase_hwcnt_gpu_v5_info v5;
};
};
/**
* kbase_hwcnt_gpu_info_init() - Initialise an info structure used to create the
* hwcnt metadata.
* @kbdev: Non-NULL pointer to kbase device.
* @info: Non-NULL pointer to data structure to be filled in.
*
* The initialised info struct will only be valid for use while kbdev is valid.
*/
int kbase_hwcnt_gpu_info_init(
struct kbase_device *kbdev,
struct kbase_hwcnt_gpu_info *info);
/**
* kbase_hwcnt_gpu_metadata_create() - Create hardware counter metadata for the
* current GPU.
* @info: Non-NULL pointer to info struct initialised by
* kbase_hwcnt_gpu_info_init.
* @use_secondary: True if secondary performance counters should be used, else
* false. Ignored if secondary counters are not supported.
* @out_metadata: Non-NULL pointer to where created metadata is stored on
* success.
* @out_dump_bytes: Non-NULL pointer to where the size of the GPU counter dump
* buffer is stored on success.
*
* Return: 0 on success, else error code.
*/
int kbase_hwcnt_gpu_metadata_create(
const struct kbase_hwcnt_gpu_info *info,
bool use_secondary,
const struct kbase_hwcnt_metadata **out_metadata,
size_t *out_dump_bytes);
/**
* kbase_hwcnt_gpu_metadata_destroy() - Destroy GPU hardware counter metadata.
* @metadata: Pointer to metadata to destroy.
*/
void kbase_hwcnt_gpu_metadata_destroy(
const struct kbase_hwcnt_metadata *metadata);
/**
* kbase_hwcnt_gpu_dump_get() - Copy or accumulate enabled counters from the raw
* dump buffer in src into the dump buffer
* abstraction in dst.
* @dst: Non-NULL pointer to dst dump buffer.
* @src: Non-NULL pointer to src raw dump buffer, of same length
* as returned in out_dump_bytes parameter of
* kbase_hwcnt_gpu_metadata_create.
* @dst_enable_map: Non-NULL pointer to enable map specifying enabled values.
* @pm_core_mask: PM state synchronized shaders core mask with the dump.
* @accumulate: True if counters in src should be accumulated into dst,
* rather than copied.
*
* The dst and dst_enable_map MUST have been created from the same metadata as
* returned from the call to kbase_hwcnt_gpu_metadata_create as was used to get
* the length of src.
*
* Return: 0 on success, else error code.
*/
int kbase_hwcnt_gpu_dump_get(
struct kbase_hwcnt_dump_buffer *dst,
void *src,
const struct kbase_hwcnt_enable_map *dst_enable_map,
const u64 pm_core_mask,
bool accumulate);
/**
* kbase_hwcnt_gpu_enable_map_to_physical() - Convert an enable map abstraction
* into a physical enable map.
* @dst: Non-NULL pointer to dst physical enable map.
* @src: Non-NULL pointer to src enable map abstraction.
*
* The src must have been created from a metadata returned from a call to
* kbase_hwcnt_gpu_metadata_create.
*
* This is a lossy conversion, as the enable map abstraction has one bit per
* individual counter block value, but the physical enable map uses 1 bit for
* every 4 counters, shared over all instances of a block.
*/
void kbase_hwcnt_gpu_enable_map_to_physical(
struct kbase_hwcnt_physical_enable_map *dst,
const struct kbase_hwcnt_enable_map *src);
/**
* kbase_hwcnt_gpu_enable_map_from_physical() - Convert a physical enable map to
* an enable map abstraction.
* @dst: Non-NULL pointer to dst enable map abstraction.
* @src: Non-NULL pointer to src physical enable map.
*
* The dst must have been created from a metadata returned from a call to
* kbase_hwcnt_gpu_metadata_create.
*
* This is a lossy conversion, as the physical enable map can technically
* support counter blocks with 128 counters each, but no hardware actually uses
* more than 64, so the enable map abstraction has nowhere to store the enable
* information for the 64 non-existent counters.
*/
void kbase_hwcnt_gpu_enable_map_from_physical(
struct kbase_hwcnt_enable_map *dst,
const struct kbase_hwcnt_physical_enable_map *src);
/**
* kbase_hwcnt_gpu_patch_dump_headers() - Patch all the performance counter
* enable headers in a dump buffer to
* reflect the specified enable map.
* @buf: Non-NULL pointer to dump buffer to patch.
* @enable_map: Non-NULL pointer to enable map.
*
* The buf and enable_map must have been created from a metadata returned from
* a call to kbase_hwcnt_gpu_metadata_create.
*
* This function should be used before handing off a dump buffer over the
* kernel-user boundary, to ensure the header is accurate for the enable map
* used by the user.
*/
void kbase_hwcnt_gpu_patch_dump_headers(
struct kbase_hwcnt_dump_buffer *buf,
const struct kbase_hwcnt_enable_map *enable_map);
#endif /* _KBASE_HWCNT_GPU_H_ */