mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2026-01-27 12:35:36 +01:00
MGS-7531 [#mali] gpu: Integrate Mali DDK r47p0
1. Disallows changing the sharability on the GPU of imported dma-bufs to BASE_MEM_COHERENT_SYSTEM using KBASE_IOCTL_MEM_FLAGS_CHANGE. 2. Implement full block state support for hardware counters. 3. add imx platform instead of devicetree Reviewed-by: Xianzhong Li <xianzhong.li@nxp.com> Signed-off-by: Jiyu Yang <jiyu.yang@nxp.com>
This commit is contained in:
parent
b16e82b44a
commit
cb5637f13a
|
|
@ -69,7 +69,7 @@ endif
|
|||
#
|
||||
|
||||
# Driver version string which is returned to userspace via an ioctl
|
||||
MALI_RELEASE_NAME ?= '"r46p0-01eac0"'
|
||||
MALI_RELEASE_NAME ?= '"r47p0-01eac0"'
|
||||
# Set up defaults if not defined by build system
|
||||
ifeq ($(CONFIG_MALI_DEBUG), y)
|
||||
MALI_UNIT_TEST = 1
|
||||
|
|
|
|||
|
|
@ -123,7 +123,7 @@ config MALI_MIDGARD_ENABLE_TRACE
|
|||
|
||||
config MALI_ARBITER_SUPPORT
|
||||
bool "Enable arbiter support for Mali"
|
||||
depends on MALI_MIDGARD && !MALI_CSF_SUPPORT
|
||||
depends on MALI_MIDGARD
|
||||
default n
|
||||
help
|
||||
Enable support for the arbiter interface in the driver.
|
||||
|
|
@ -203,16 +203,6 @@ config PAGE_MIGRATION_SUPPORT
|
|||
If in doubt, say Y. To strip out page migration symbols and support,
|
||||
say N.
|
||||
|
||||
config MALI_MEMORY_FULLY_BACKED
|
||||
bool "Enable memory fully physically-backed"
|
||||
depends on MALI_MIDGARD && MALI_EXPERT
|
||||
default n
|
||||
help
|
||||
This option enables full physical backing of all virtual
|
||||
memory allocations in the kernel. Notice that this build
|
||||
option only affects allocations of grow-on-GPU-page-fault
|
||||
memory.
|
||||
|
||||
config MALI_CORESTACK
|
||||
bool "Enable support of GPU core stack power control"
|
||||
depends on MALI_MIDGARD && MALI_EXPERT
|
||||
|
|
|
|||
|
|
@ -105,7 +105,6 @@ ifeq ($(MALI_KCONFIG_EXT_PREFIX),)
|
|||
CONFIG_MALI_CORESTACK = n
|
||||
CONFIG_LARGE_PAGE_SUPPORT = y
|
||||
CONFIG_MALI_PWRSOFT_765 = n
|
||||
CONFIG_MALI_MEMORY_FULLY_BACKED = n
|
||||
CONFIG_MALI_JOB_DUMP = n
|
||||
CONFIG_MALI_NO_MALI = n
|
||||
CONFIG_MALI_REAL_HW = y
|
||||
|
|
@ -170,7 +169,6 @@ ifeq ($(MALI_KCONFIG_EXT_PREFIX),)
|
|||
CONFIG_MALI_CORESTACK \
|
||||
CONFIG_LARGE_PAGE_SUPPORT \
|
||||
CONFIG_MALI_PWRSOFT_765 \
|
||||
CONFIG_MALI_MEMORY_FULLY_BACKED \
|
||||
CONFIG_MALI_JOB_DUMP \
|
||||
CONFIG_MALI_NO_MALI \
|
||||
CONFIG_MALI_ERROR_INJECT \
|
||||
|
|
@ -193,6 +191,7 @@ ifeq ($(MALI_KCONFIG_EXT_PREFIX),)
|
|||
CONFIG_MALI_TRACE_POWER_GPU_WORK_PERIOD
|
||||
|
||||
|
||||
|
||||
endif
|
||||
|
||||
THIS_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
|
||||
|
|
@ -231,7 +230,8 @@ endif
|
|||
#
|
||||
# KBUILD_EXTRA_SYMBOLS to prevent warnings about unknown functions
|
||||
#
|
||||
BASE_SYMBOLS = $(M)/../../base/arm/Module.symvers
|
||||
BASE_SYMBOLS =
|
||||
|
||||
|
||||
EXTRA_SYMBOLS += \
|
||||
$(BASE_SYMBOLS)
|
||||
|
|
|
|||
|
|
@ -183,7 +183,9 @@ int kbase_arbif_init(struct kbase_device *kbdev)
|
|||
|
||||
dev_dbg(kbdev->dev, "%s\n", __func__);
|
||||
|
||||
arbiter_if_node = of_parse_phandle(kbdev->dev->of_node, "arbiter_if", 0);
|
||||
arbiter_if_node = of_parse_phandle(kbdev->dev->of_node, "arbiter-if", 0);
|
||||
if (!arbiter_if_node)
|
||||
arbiter_if_node = of_parse_phandle(kbdev->dev->of_node, "arbiter_if", 0);
|
||||
if (!arbiter_if_node) {
|
||||
dev_dbg(kbdev->dev, "No arbiter_if in Device Tree\n");
|
||||
/* no arbiter interface defined in device tree */
|
||||
|
|
|
|||
|
|
@ -308,7 +308,7 @@ int kbase_arbiter_pm_early_init(struct kbase_device *kbdev)
|
|||
err = wait_event_timeout(arb_vm_state->vm_state_wait,
|
||||
arb_vm_state->vm_state ==
|
||||
KBASE_VM_STATE_INITIALIZING_WITH_GPU,
|
||||
msecs_to_jiffies(gpu_req_timeout));
|
||||
msecs_to_jiffies((unsigned int)gpu_req_timeout));
|
||||
|
||||
if (!err) {
|
||||
dev_dbg(kbdev->dev,
|
||||
|
|
|
|||
|
|
@ -1,29 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
*
|
||||
* (C) COPYRIGHT 2014-2023 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 configuration
|
||||
*/
|
||||
|
||||
#ifndef _KBASE_BACKEND_CONFIG_H_
|
||||
#define _KBASE_BACKEND_CONFIG_H_
|
||||
|
||||
#endif /* _KBASE_BACKEND_CONFIG_H_ */
|
||||
|
|
@ -22,8 +22,9 @@
|
|||
#ifndef _KBASE_CACHE_POLICY_BACKEND_H_
|
||||
#define _KBASE_CACHE_POLICY_BACKEND_H_
|
||||
|
||||
#include "mali_kbase.h"
|
||||
#include <uapi/gpu/arm/midgard/mali_base_kernel.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
struct kbase_device;
|
||||
|
||||
/**
|
||||
* kbase_cache_set_coherency_mode() - Sets the system coherency mode
|
||||
|
|
|
|||
|
|
@ -27,34 +27,38 @@
|
|||
#if IS_ENABLED(CONFIG_DEBUG_FS)
|
||||
|
||||
/*GPU_CONTROL_REG(r)*/
|
||||
static int gpu_control_reg_snapshot[] = { GPU_CONTROL_ENUM(GPU_ID), GPU_CONTROL_ENUM(SHADER_READY),
|
||||
GPU_CONTROL_ENUM(TILER_READY),
|
||||
GPU_CONTROL_ENUM(L2_READY) };
|
||||
static unsigned int gpu_control_reg_snapshot[] = { GPU_CONTROL_ENUM(GPU_ID),
|
||||
GPU_CONTROL_ENUM(SHADER_READY),
|
||||
GPU_CONTROL_ENUM(TILER_READY),
|
||||
GPU_CONTROL_ENUM(L2_READY) };
|
||||
|
||||
/* JOB_CONTROL_REG(r) */
|
||||
static int job_control_reg_snapshot[] = { JOB_CONTROL_ENUM(JOB_IRQ_MASK),
|
||||
JOB_CONTROL_ENUM(JOB_IRQ_STATUS) };
|
||||
static unsigned int job_control_reg_snapshot[] = { JOB_CONTROL_ENUM(JOB_IRQ_MASK),
|
||||
JOB_CONTROL_ENUM(JOB_IRQ_STATUS) };
|
||||
|
||||
/* JOB_SLOT_REG(n,r) */
|
||||
static int job_slot_reg_snapshot[] = { JOB_SLOT_ENUM(0, HEAD) - JOB_SLOT_BASE_ENUM(0),
|
||||
JOB_SLOT_ENUM(0, TAIL) - JOB_SLOT_BASE_ENUM(0),
|
||||
JOB_SLOT_ENUM(0, AFFINITY) - JOB_SLOT_BASE_ENUM(0),
|
||||
JOB_SLOT_ENUM(0, CONFIG) - JOB_SLOT_BASE_ENUM(0),
|
||||
JOB_SLOT_ENUM(0, STATUS) - JOB_SLOT_BASE_ENUM(0),
|
||||
JOB_SLOT_ENUM(0, HEAD_NEXT) - JOB_SLOT_BASE_ENUM(0),
|
||||
JOB_SLOT_ENUM(0, AFFINITY_NEXT) - JOB_SLOT_BASE_ENUM(0),
|
||||
JOB_SLOT_ENUM(0, CONFIG_NEXT) - JOB_SLOT_BASE_ENUM(0) };
|
||||
static unsigned int job_slot_reg_snapshot[] = {
|
||||
JOB_SLOT_ENUM(0, HEAD) - JOB_SLOT_BASE_ENUM(0),
|
||||
JOB_SLOT_ENUM(0, TAIL) - JOB_SLOT_BASE_ENUM(0),
|
||||
JOB_SLOT_ENUM(0, AFFINITY) - JOB_SLOT_BASE_ENUM(0),
|
||||
JOB_SLOT_ENUM(0, CONFIG) - JOB_SLOT_BASE_ENUM(0),
|
||||
JOB_SLOT_ENUM(0, STATUS) - JOB_SLOT_BASE_ENUM(0),
|
||||
JOB_SLOT_ENUM(0, HEAD_NEXT) - JOB_SLOT_BASE_ENUM(0),
|
||||
JOB_SLOT_ENUM(0, AFFINITY_NEXT) - JOB_SLOT_BASE_ENUM(0),
|
||||
JOB_SLOT_ENUM(0, CONFIG_NEXT) - JOB_SLOT_BASE_ENUM(0)
|
||||
};
|
||||
|
||||
/*MMU_CONTROL_REG(r)*/
|
||||
static int mmu_reg_snapshot[] = { MMU_CONTROL_ENUM(IRQ_MASK), MMU_CONTROL_ENUM(IRQ_STATUS) };
|
||||
static unsigned int mmu_reg_snapshot[] = { MMU_CONTROL_ENUM(IRQ_MASK),
|
||||
MMU_CONTROL_ENUM(IRQ_STATUS) };
|
||||
|
||||
/* MMU_AS_REG(n,r) */
|
||||
static int as_reg_snapshot[] = { MMU_AS_ENUM(0, TRANSTAB) - MMU_AS_BASE_ENUM(0),
|
||||
MMU_AS_ENUM(0, TRANSCFG) - MMU_AS_BASE_ENUM(0),
|
||||
MMU_AS_ENUM(0, MEMATTR) - MMU_AS_BASE_ENUM(0),
|
||||
MMU_AS_ENUM(0, FAULTSTATUS) - MMU_AS_BASE_ENUM(0),
|
||||
MMU_AS_ENUM(0, FAULTADDRESS) - MMU_AS_BASE_ENUM(0),
|
||||
MMU_AS_ENUM(0, STATUS) - MMU_AS_BASE_ENUM(0) };
|
||||
static unsigned int as_reg_snapshot[] = { MMU_AS_ENUM(0, TRANSTAB) - MMU_AS_BASE_ENUM(0),
|
||||
MMU_AS_ENUM(0, TRANSCFG) - MMU_AS_BASE_ENUM(0),
|
||||
MMU_AS_ENUM(0, MEMATTR) - MMU_AS_BASE_ENUM(0),
|
||||
MMU_AS_ENUM(0, FAULTSTATUS) - MMU_AS_BASE_ENUM(0),
|
||||
MMU_AS_ENUM(0, FAULTADDRESS) - MMU_AS_BASE_ENUM(0),
|
||||
MMU_AS_ENUM(0, STATUS) - MMU_AS_BASE_ENUM(0) };
|
||||
|
||||
bool kbase_debug_job_fault_reg_snapshot_init(struct kbase_context *kctx, int reg_range)
|
||||
{
|
||||
|
|
@ -132,7 +136,7 @@ bool kbase_debug_job_fault_reg_snapshot_init(struct kbase_context *kctx, int reg
|
|||
bool kbase_job_fault_get_reg_snapshot(struct kbase_context *kctx)
|
||||
{
|
||||
int offset = 0;
|
||||
int reg_enum;
|
||||
u32 reg_enum;
|
||||
u64 val64;
|
||||
|
||||
if (kctx->reg_dump == NULL)
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ struct rb_entry {
|
|||
* u64 for serving as tagged value.
|
||||
* @kctx: Pointer to kbase context.
|
||||
*/
|
||||
#define SLOT_RB_TAG_KCTX(kctx) (u64)((uintptr_t)(kctx))
|
||||
#define SLOT_RB_TAG_KCTX(kctx) ((u64)(uintptr_t)(kctx))
|
||||
/**
|
||||
* struct slot_rb - Slot ringbuffer
|
||||
* @entries: Ringbuffer entries
|
||||
|
|
@ -116,7 +116,7 @@ struct kbase_backend_data {
|
|||
* within the timeout period
|
||||
*/
|
||||
#define KBASE_RESET_GPU_COMMITTED 2
|
||||
/* The GPU reset process is currently occuring (timeout has expired or
|
||||
/* The GPU reset process is currently occurring (timeout has expired or
|
||||
* kbasep_try_reset_gpu_early was called)
|
||||
*/
|
||||
#define KBASE_RESET_GPU_HAPPENING 3
|
||||
|
|
@ -264,7 +264,7 @@ static int kbase_devfreq_status(struct device *dev, struct devfreq_dev_status *s
|
|||
static int kbase_devfreq_init_freq_table(struct kbase_device *kbdev, struct devfreq_dev_profile *dp)
|
||||
{
|
||||
int count;
|
||||
int i = 0;
|
||||
unsigned int i = 0;
|
||||
unsigned long freq;
|
||||
struct dev_pm_opp *opp;
|
||||
|
||||
|
|
@ -278,14 +278,14 @@ static int kbase_devfreq_init_freq_table(struct kbase_device *kbdev, struct devf
|
|||
if (count < 0)
|
||||
return count;
|
||||
|
||||
dp->freq_table = kmalloc_array(count, sizeof(dp->freq_table[0]), GFP_KERNEL);
|
||||
dp->freq_table = kmalloc_array((size_t)count, sizeof(dp->freq_table[0]), GFP_KERNEL);
|
||||
if (!dp->freq_table)
|
||||
return -ENOMEM;
|
||||
|
||||
#if KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE
|
||||
rcu_read_lock();
|
||||
#endif
|
||||
for (i = 0, freq = ULONG_MAX; i < count; i++, freq--) {
|
||||
for (i = 0, freq = ULONG_MAX; i < (unsigned int)count; i++, freq--) {
|
||||
opp = dev_pm_opp_find_freq_floor(kbdev->dev, &freq);
|
||||
if (IS_ERR(opp))
|
||||
break;
|
||||
|
|
@ -299,8 +299,8 @@ static int kbase_devfreq_init_freq_table(struct kbase_device *kbdev, struct devf
|
|||
rcu_read_unlock();
|
||||
#endif
|
||||
|
||||
if (count != i)
|
||||
dev_warn(kbdev->dev, "Unable to enumerate all OPPs (%d!=%d\n", count, i);
|
||||
if ((unsigned int)count != i)
|
||||
dev_warn(kbdev->dev, "Unable to enumerate all OPPs (%d!=%u\n", count, i);
|
||||
|
||||
dp->max_state = i;
|
||||
|
||||
|
|
@ -401,7 +401,8 @@ static int kbase_devfreq_init_core_mask_table(struct kbase_device *kbdev)
|
|||
return 0;
|
||||
|
||||
count = dev_pm_opp_get_opp_count(kbdev->dev);
|
||||
kbdev->devfreq_table = kmalloc_array(count, sizeof(struct kbase_devfreq_opp), GFP_KERNEL);
|
||||
kbdev->devfreq_table =
|
||||
kmalloc_array((size_t)count, sizeof(struct kbase_devfreq_opp), GFP_KERNEL);
|
||||
if (!kbdev->devfreq_table)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
|
||||
int kbase_backend_gpuprops_get(struct kbase_device *kbdev, struct kbasep_gpuprops_regdump *regdump)
|
||||
{
|
||||
int i;
|
||||
uint i;
|
||||
|
||||
/* regdump is zero intiialized, individual entries do not need to be explicitly set */
|
||||
regdump->gpu_id = KBASE_REG_READ(kbdev, GPU_CONTROL_ENUM(GPU_ID));
|
||||
|
|
@ -122,7 +122,7 @@ int kbase_backend_gpuprops_get_l2_features(struct kbase_device *kbdev,
|
|||
|
||||
#if MALI_USE_CSF
|
||||
if (kbase_hw_has_l2_slice_hash_feature(kbdev)) {
|
||||
int i;
|
||||
uint i;
|
||||
for (i = 0; i < GPU_L2_SLICE_HASH_COUNT; i++)
|
||||
regdump->l2_slice_hash[i] =
|
||||
kbase_reg_read32(kbdev, GPU_L2_SLICE_HASH_OFFSET(i));
|
||||
|
|
|
|||
|
|
@ -31,17 +31,17 @@
|
|||
|
||||
static int wait_prfcnt_ready(struct kbase_device *kbdev)
|
||||
{
|
||||
u32 loops;
|
||||
|
||||
for (loops = 0; loops < KBASE_PRFCNT_ACTIVE_MAX_LOOPS; loops++) {
|
||||
const u32 prfcnt_active = kbase_reg_read32(kbdev, GPU_CONTROL_ENUM(GPU_STATUS)) &
|
||||
GPU_STATUS_PRFCNT_ACTIVE;
|
||||
if (!prfcnt_active)
|
||||
return 0;
|
||||
u32 val;
|
||||
const u32 timeout_us =
|
||||
kbase_get_timeout_ms(kbdev, KBASE_PRFCNT_ACTIVE_TIMEOUT) * USEC_PER_MSEC;
|
||||
const int err = kbase_reg_poll32_timeout(kbdev, GPU_CONTROL_ENUM(GPU_STATUS), val,
|
||||
!(val & GPU_STATUS_PRFCNT_ACTIVE), 0, timeout_us,
|
||||
false);
|
||||
if (err) {
|
||||
dev_err(kbdev->dev, "PRFCNT_ACTIVE bit stuck\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
dev_err(kbdev->dev, "PRFCNT_ACTIVE bit stuck\n");
|
||||
return -EBUSY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int kbase_instr_hwcnt_enable_internal(struct kbase_device *kbdev, struct kbase_context *kctx,
|
||||
|
|
@ -86,11 +86,12 @@ int kbase_instr_hwcnt_enable_internal(struct kbase_device *kbdev, struct kbase_c
|
|||
spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
|
||||
|
||||
/* Configure */
|
||||
prfcnt_config = kctx->as_nr << PRFCNT_CONFIG_AS_SHIFT;
|
||||
prfcnt_config = (u32)kctx->as_nr << PRFCNT_CONFIG_AS_SHIFT;
|
||||
#ifdef CONFIG_MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS
|
||||
prfcnt_config |= kbdev->hwcnt.backend.override_counter_set << PRFCNT_CONFIG_SETSELECT_SHIFT;
|
||||
prfcnt_config |= (u32)kbdev->hwcnt.backend.override_counter_set
|
||||
<< PRFCNT_CONFIG_SETSELECT_SHIFT;
|
||||
#else
|
||||
prfcnt_config |= enable->counter_set << PRFCNT_CONFIG_SETSELECT_SHIFT;
|
||||
prfcnt_config |= (u32)enable->counter_set << PRFCNT_CONFIG_SETSELECT_SHIFT;
|
||||
#endif
|
||||
|
||||
/* Wait until prfcnt config register can be written */
|
||||
|
|
|
|||
|
|
@ -26,8 +26,29 @@
|
|||
#ifndef _KBASE_IRQ_INTERNAL_H_
|
||||
#define _KBASE_IRQ_INTERNAL_H_
|
||||
|
||||
/* GPU IRQ Tags */
|
||||
#define JOB_IRQ_TAG 0
|
||||
#define MMU_IRQ_TAG 1
|
||||
#define GPU_IRQ_TAG 2
|
||||
|
||||
/**
|
||||
* kbase_install_interrupts - Install IRQs handlers.
|
||||
*
|
||||
* @kbdev: The kbase device
|
||||
*
|
||||
* This function must be called once only when a kbase device is initialized.
|
||||
*
|
||||
* Return: 0 on success. Error code (negative) on failure.
|
||||
*/
|
||||
int kbase_install_interrupts(struct kbase_device *kbdev);
|
||||
|
||||
/**
|
||||
* kbase_release_interrupts - Uninstall IRQs handlers.
|
||||
*
|
||||
* @kbdev: The kbase device
|
||||
*
|
||||
* This function needs to be called when a kbase device is terminated.
|
||||
*/
|
||||
void kbase_release_interrupts(struct kbase_device *kbdev);
|
||||
|
||||
/**
|
||||
|
|
@ -37,10 +58,52 @@ void kbase_release_interrupts(struct kbase_device *kbdev);
|
|||
*/
|
||||
void kbase_synchronize_irqs(struct kbase_device *kbdev);
|
||||
|
||||
int kbasep_common_test_interrupt_handlers(struct kbase_device *const kbdev);
|
||||
#ifdef CONFIG_MALI_DEBUG
|
||||
#if IS_ENABLED(CONFIG_MALI_REAL_HW)
|
||||
/**
|
||||
* kbase_validate_interrupts - Validate interrupts
|
||||
*
|
||||
* @kbdev: The kbase device
|
||||
*
|
||||
* This function will be called once when a kbase device is initialized
|
||||
* to check whether interrupt handlers are configured appropriately.
|
||||
* If interrupt numbers and/or flags defined in the device tree are
|
||||
* incorrect, then the validation might fail.
|
||||
* The whold device initialization will fail if it returns error code.
|
||||
*
|
||||
* Return: 0 on success. Error code (negative) on failure.
|
||||
*/
|
||||
int kbase_validate_interrupts(struct kbase_device *const kbdev);
|
||||
#endif /* CONFIG_MALI_REAL_HW */
|
||||
#endif /* CONFIG_MALI_DEBUG */
|
||||
|
||||
irqreturn_t kbase_gpu_irq_test_handler(int irq, void *data, u32 val);
|
||||
/**
|
||||
* kbase_get_interrupt_handler - Return default interrupt handler
|
||||
* @kbdev: Kbase device
|
||||
* @irq_tag: Tag to choose the handler
|
||||
*
|
||||
* If single interrupt line is used the combined interrupt handler
|
||||
* will be returned regardless of irq_tag. Otherwise the corresponding
|
||||
* interrupt handler will be returned.
|
||||
*
|
||||
* Return: Interrupt handler corresponding to the tag. NULL on failure.
|
||||
*/
|
||||
irq_handler_t kbase_get_interrupt_handler(struct kbase_device *kbdev, u32 irq_tag);
|
||||
|
||||
/**
|
||||
* kbase_set_custom_irq_handler - Set a custom IRQ handler
|
||||
*
|
||||
* @kbdev: The kbase device for which the handler is to be registered
|
||||
* @custom_handler: Handler to be registered
|
||||
* @irq_tag: Interrupt tag
|
||||
*
|
||||
* Register given interrupt handler for requested interrupt tag
|
||||
* In the case where irq handler is not specified, the default handler shall be
|
||||
* registered
|
||||
*
|
||||
* Return: 0 case success, error code otherwise
|
||||
*/
|
||||
int kbase_set_custom_irq_handler(struct kbase_device *kbdev, irq_handler_t custom_handler,
|
||||
int irq_type);
|
||||
u32 irq_tag);
|
||||
|
||||
#endif /* _KBASE_IRQ_INTERNAL_H_ */
|
||||
|
|
|
|||
|
|
@ -26,20 +26,15 @@
|
|||
#include <linux/interrupt.h>
|
||||
|
||||
#if IS_ENABLED(CONFIG_MALI_REAL_HW)
|
||||
|
||||
/* GPU IRQ Tags */
|
||||
#define JOB_IRQ_TAG 0
|
||||
#define MMU_IRQ_TAG 1
|
||||
#define GPU_IRQ_TAG 2
|
||||
|
||||
static void *kbase_tag(void *ptr, u32 tag)
|
||||
{
|
||||
return (void *)(((uintptr_t)ptr) | tag);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void *kbase_untag(void *ptr)
|
||||
{
|
||||
return (void *)(((uintptr_t)ptr) & ~3);
|
||||
return (void *)(((uintptr_t)ptr) & ~(uintptr_t)3);
|
||||
}
|
||||
|
||||
static irqreturn_t kbase_job_irq_handler(int irq, void *data)
|
||||
|
|
@ -58,12 +53,6 @@ static irqreturn_t kbase_job_irq_handler(int irq, void *data)
|
|||
|
||||
val = kbase_reg_read32(kbdev, JOB_CONTROL_ENUM(JOB_IRQ_STATUS));
|
||||
|
||||
#ifdef CONFIG_MALI_DEBUG
|
||||
if (!kbdev->pm.backend.driver_ready_for_irqs)
|
||||
dev_warn(kbdev->dev, "%s: irq %d irqstatus 0x%x before driver is ready\n", __func__,
|
||||
irq, val);
|
||||
#endif /* CONFIG_MALI_DEBUG */
|
||||
|
||||
if (!val) {
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
return IRQ_NONE;
|
||||
|
|
@ -101,11 +90,6 @@ static irqreturn_t kbase_mmu_irq_handler(int irq, void *data)
|
|||
|
||||
val = kbase_reg_read32(kbdev, MMU_CONTROL_ENUM(IRQ_STATUS));
|
||||
|
||||
#ifdef CONFIG_MALI_DEBUG
|
||||
if (!kbdev->pm.backend.driver_ready_for_irqs)
|
||||
dev_warn(kbdev->dev, "%s: irq %d irqstatus 0x%x before driver is ready\n", __func__,
|
||||
irq, val);
|
||||
#endif /* CONFIG_MALI_DEBUG */
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
|
||||
if (!val) {
|
||||
|
|
@ -122,7 +106,8 @@ static irqreturn_t kbase_mmu_irq_handler(int irq, void *data)
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static irqreturn_t kbase_gpu_irq_handler(int irq, void *data)
|
||||
|
||||
static irqreturn_t kbase_gpuonly_irq_handler(int irq, void *data)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct kbase_device *kbdev = kbase_untag(data);
|
||||
|
|
@ -139,13 +124,6 @@ static irqreturn_t kbase_gpu_irq_handler(int irq, void *data)
|
|||
|
||||
gpu_irq_status = kbase_reg_read32(kbdev, GPU_CONTROL_ENUM(GPU_IRQ_STATUS));
|
||||
|
||||
#ifdef CONFIG_MALI_DEBUG
|
||||
if (!kbdev->pm.backend.driver_ready_for_irqs) {
|
||||
dev_dbg(kbdev->dev, "%s: irq %d irqstatus 0x%x before driver is ready\n", __func__,
|
||||
irq, gpu_irq_status);
|
||||
}
|
||||
#endif /* CONFIG_MALI_DEBUG */
|
||||
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
|
||||
if (gpu_irq_status) {
|
||||
|
|
@ -158,82 +136,91 @@ static irqreturn_t kbase_gpu_irq_handler(int irq, void *data)
|
|||
return irq_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* kbase_gpu_irq_handler - GPU interrupt handler
|
||||
* @irq: IRQ number
|
||||
* @data: Data associated with this IRQ (i.e. kbdev)
|
||||
*
|
||||
* Return: IRQ_HANDLED if any interrupt request has been successfully handled.
|
||||
* IRQ_NONE otherwise.
|
||||
*/
|
||||
static irqreturn_t kbase_gpu_irq_handler(int irq, void *data)
|
||||
{
|
||||
irqreturn_t irq_state = kbase_gpuonly_irq_handler(irq, data);
|
||||
return irq_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* kbase_combined_irq_handler - Combined interrupt handler for all interrupts
|
||||
* @irq: IRQ number
|
||||
* @data: Data associated with this IRQ (i.e. kbdev)
|
||||
*
|
||||
* This handler will be used for the GPU with single interrupt line.
|
||||
*
|
||||
* Return: IRQ_HANDLED if any interrupt request has been successfully handled.
|
||||
* IRQ_NONE otherwise.
|
||||
*/
|
||||
static irqreturn_t kbase_combined_irq_handler(int irq, void *data)
|
||||
{
|
||||
irqreturn_t irq_state = IRQ_NONE;
|
||||
|
||||
if (kbase_job_irq_handler(irq, data) == IRQ_HANDLED)
|
||||
irq_state = IRQ_HANDLED;
|
||||
if (kbase_mmu_irq_handler(irq, data) == IRQ_HANDLED)
|
||||
irq_state = IRQ_HANDLED;
|
||||
if (kbase_gpu_irq_handler(irq, data) == IRQ_HANDLED)
|
||||
irq_state = IRQ_HANDLED;
|
||||
|
||||
return irq_state;
|
||||
}
|
||||
|
||||
static irq_handler_t kbase_handler_table[] = {
|
||||
[JOB_IRQ_TAG] = kbase_job_irq_handler,
|
||||
[MMU_IRQ_TAG] = kbase_mmu_irq_handler,
|
||||
[GPU_IRQ_TAG] = kbase_gpu_irq_handler,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_MALI_DEBUG
|
||||
#define JOB_IRQ_HANDLER JOB_IRQ_TAG
|
||||
#define GPU_IRQ_HANDLER GPU_IRQ_TAG
|
||||
|
||||
/**
|
||||
* kbase_gpu_irq_test_handler - Variant (for test) of kbase_gpu_irq_handler()
|
||||
* @irq: IRQ number
|
||||
* @data: Data associated with this IRQ (i.e. kbdev)
|
||||
* @val: Value of the GPU_CONTROL_ENUM(GPU_IRQ_STATUS)
|
||||
*
|
||||
* Handle the GPU device interrupt source requests reflected in the
|
||||
* given source bit-pattern. The test code caller is responsible for
|
||||
* undertaking the required device power maintenace.
|
||||
*
|
||||
* Return: IRQ_HANDLED if the requests are from the GPU device,
|
||||
* IRQ_NONE otherwise
|
||||
*/
|
||||
irqreturn_t kbase_gpu_irq_test_handler(int irq, void *data, u32 val)
|
||||
irq_handler_t kbase_get_interrupt_handler(struct kbase_device *kbdev, u32 irq_tag)
|
||||
{
|
||||
struct kbase_device *kbdev = kbase_untag(data);
|
||||
|
||||
if (!val)
|
||||
return IRQ_NONE;
|
||||
|
||||
dev_dbg(kbdev->dev, "%s: irq %d irqstatus 0x%x\n", __func__, irq, val);
|
||||
|
||||
kbase_gpu_interrupt(kbdev, val);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
if (kbdev->nr_irqs == 1)
|
||||
return kbase_combined_irq_handler;
|
||||
else if (irq_tag < ARRAY_SIZE(kbase_handler_table))
|
||||
return kbase_handler_table[irq_tag];
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
KBASE_EXPORT_TEST_API(kbase_gpu_irq_test_handler);
|
||||
|
||||
/**
|
||||
* kbase_set_custom_irq_handler - Set a custom IRQ handler
|
||||
* @kbdev: Device for which the handler is to be registered
|
||||
* @custom_handler: Handler to be registered
|
||||
* @irq_type: Interrupt type
|
||||
*
|
||||
* Registers given interrupt handler for requested interrupt type
|
||||
* In the case where irq handler is not specified, the default handler shall be
|
||||
* registered
|
||||
*
|
||||
* Return: 0 case success, error code otherwise
|
||||
*/
|
||||
#if IS_ENABLED(CONFIG_MALI_REAL_HW)
|
||||
#ifdef CONFIG_MALI_DEBUG
|
||||
int kbase_set_custom_irq_handler(struct kbase_device *kbdev, irq_handler_t custom_handler,
|
||||
int irq_type)
|
||||
u32 irq_tag)
|
||||
{
|
||||
int result = 0;
|
||||
irq_handler_t requested_irq_handler = NULL;
|
||||
irq_handler_t handler = custom_handler;
|
||||
const int irq = (kbdev->nr_irqs == 1) ? 0 : irq_tag;
|
||||
|
||||
KBASE_DEBUG_ASSERT((irq_type >= JOB_IRQ_HANDLER) && (irq_type <= GPU_IRQ_HANDLER));
|
||||
if (unlikely(!((irq_tag >= JOB_IRQ_TAG) && (irq_tag <= GPU_IRQ_TAG)))) {
|
||||
dev_err(kbdev->dev, "Invalid irq_tag (%d)\n", irq_tag);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Release previous handler */
|
||||
if (kbdev->irqs[irq_type].irq)
|
||||
free_irq(kbdev->irqs[irq_type].irq, kbase_tag(kbdev, irq_type));
|
||||
if (kbdev->irqs[irq].irq)
|
||||
free_irq(kbdev->irqs[irq].irq, kbase_tag(kbdev, irq));
|
||||
|
||||
requested_irq_handler = (custom_handler != NULL) ? custom_handler :
|
||||
kbase_handler_table[irq_type];
|
||||
/* If a custom handler isn't provided use the default handler */
|
||||
if (!handler)
|
||||
handler = kbase_get_interrupt_handler(kbdev, irq_tag);
|
||||
|
||||
if (request_irq(kbdev->irqs[irq_type].irq, requested_irq_handler,
|
||||
kbdev->irqs[irq_type].flags | IRQF_SHARED, dev_name(kbdev->dev),
|
||||
kbase_tag(kbdev, irq_type)) != 0) {
|
||||
if (request_irq(kbdev->irqs[irq].irq, handler,
|
||||
kbdev->irqs[irq].flags | ((kbdev->nr_irqs == 1) ? 0 : IRQF_SHARED),
|
||||
dev_name(kbdev->dev), kbase_tag(kbdev, irq)) != 0) {
|
||||
result = -EINVAL;
|
||||
dev_err(kbdev->dev, "Can't request interrupt %d (index %d)\n",
|
||||
kbdev->irqs[irq_type].irq, irq_type);
|
||||
#if IS_ENABLED(CONFIG_SPARSE_IRQ)
|
||||
dev_err(kbdev->dev,
|
||||
"You have CONFIG_SPARSE_IRQ support enabled - is the interrupt number correct for this configuration?\n");
|
||||
#endif /* CONFIG_SPARSE_IRQ */
|
||||
dev_err(kbdev->dev, "Can't request interrupt %u (index %u)\n", kbdev->irqs[irq].irq,
|
||||
irq_tag);
|
||||
if (IS_ENABLED(CONFIG_SPARSE_IRQ))
|
||||
dev_err(kbdev->dev,
|
||||
"CONFIG_SPARSE_IRQ enabled - is the interrupt number correct for this config?\n");
|
||||
}
|
||||
|
||||
return result;
|
||||
|
|
@ -325,30 +312,43 @@ static enum hrtimer_restart kbasep_test_interrupt_timeout(struct hrtimer *timer)
|
|||
return HRTIMER_NORESTART;
|
||||
}
|
||||
|
||||
static int kbasep_common_test_interrupt(struct kbase_device *const kbdev, u32 tag)
|
||||
/**
|
||||
* validate_interrupt - Validate an interrupt
|
||||
* @kbdev: Kbase device
|
||||
* @tag: Tag to choose the interrupt
|
||||
*
|
||||
* To validate the settings for the interrupt, write a value on RAWSTAT
|
||||
* register to trigger interrupt. Then with custom interrupt handler
|
||||
* check whether the interrupt happens within reasonable time.
|
||||
*
|
||||
* Return: 0 if validating interrupt succeeds.
|
||||
*/
|
||||
static int validate_interrupt(struct kbase_device *const kbdev, u32 tag)
|
||||
{
|
||||
int err = 0;
|
||||
irq_handler_t test_handler;
|
||||
|
||||
irq_handler_t handler;
|
||||
const int irq = (kbdev->nr_irqs == 1) ? 0 : tag;
|
||||
u32 old_mask_val;
|
||||
u16 mask_offset;
|
||||
u16 rawstat_offset;
|
||||
|
||||
switch (tag) {
|
||||
case JOB_IRQ_TAG:
|
||||
test_handler = kbase_job_irq_test_handler;
|
||||
handler = kbase_job_irq_test_handler;
|
||||
rawstat_offset = JOB_CONTROL_ENUM(JOB_IRQ_RAWSTAT);
|
||||
mask_offset = JOB_CONTROL_ENUM(JOB_IRQ_MASK);
|
||||
break;
|
||||
case MMU_IRQ_TAG:
|
||||
test_handler = kbase_mmu_irq_test_handler;
|
||||
handler = kbase_mmu_irq_test_handler;
|
||||
rawstat_offset = MMU_CONTROL_ENUM(IRQ_RAWSTAT);
|
||||
mask_offset = MMU_CONTROL_ENUM(IRQ_MASK);
|
||||
break;
|
||||
case GPU_IRQ_TAG:
|
||||
/* already tested by pm_driver - bail out */
|
||||
default:
|
||||
return 0;
|
||||
default:
|
||||
dev_err(kbdev->dev, "Invalid tag (%d)\n", tag);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* store old mask */
|
||||
|
|
@ -356,9 +356,9 @@ static int kbasep_common_test_interrupt(struct kbase_device *const kbdev, u32 ta
|
|||
/* mask interrupts */
|
||||
kbase_reg_write32(kbdev, mask_offset, 0x0);
|
||||
|
||||
if (kbdev->irqs[tag].irq) {
|
||||
if (kbdev->irqs[irq].irq) {
|
||||
/* release original handler and install test handler */
|
||||
if (kbase_set_custom_irq_handler(kbdev, test_handler, tag) != 0) {
|
||||
if (kbase_set_custom_irq_handler(kbdev, handler, tag) != 0) {
|
||||
err = -EINVAL;
|
||||
} else {
|
||||
kbasep_irq_test_data.timeout = 0;
|
||||
|
|
@ -376,12 +376,12 @@ static int kbasep_common_test_interrupt(struct kbase_device *const kbdev, u32 ta
|
|||
wait_event(kbasep_irq_test_data.wait, kbasep_irq_test_data.triggered != 0);
|
||||
|
||||
if (kbasep_irq_test_data.timeout != 0) {
|
||||
dev_err(kbdev->dev, "Interrupt %d (index %d) didn't reach CPU.\n",
|
||||
kbdev->irqs[tag].irq, tag);
|
||||
dev_err(kbdev->dev, "Interrupt %u (index %u) didn't reach CPU.\n",
|
||||
kbdev->irqs[irq].irq, irq);
|
||||
err = -EINVAL;
|
||||
} else {
|
||||
dev_dbg(kbdev->dev, "Interrupt %d (index %d) reached CPU.\n",
|
||||
kbdev->irqs[tag].irq, tag);
|
||||
dev_dbg(kbdev->dev, "Interrupt %u (index %u) reached CPU.\n",
|
||||
kbdev->irqs[irq].irq, irq);
|
||||
}
|
||||
|
||||
hrtimer_cancel(&kbasep_irq_test_data.timer);
|
||||
|
|
@ -391,15 +391,15 @@ static int kbasep_common_test_interrupt(struct kbase_device *const kbdev, u32 ta
|
|||
kbase_reg_write32(kbdev, mask_offset, 0x0);
|
||||
|
||||
/* release test handler */
|
||||
free_irq(kbdev->irqs[tag].irq, kbase_tag(kbdev, tag));
|
||||
free_irq(kbdev->irqs[irq].irq, kbase_tag(kbdev, irq));
|
||||
}
|
||||
|
||||
/* restore original interrupt */
|
||||
if (request_irq(kbdev->irqs[tag].irq, kbase_handler_table[tag],
|
||||
kbdev->irqs[tag].flags | IRQF_SHARED, dev_name(kbdev->dev),
|
||||
kbase_tag(kbdev, tag))) {
|
||||
dev_err(kbdev->dev, "Can't restore original interrupt %d (index %d)\n",
|
||||
kbdev->irqs[tag].irq, tag);
|
||||
if (request_irq(kbdev->irqs[irq].irq, kbase_get_interrupt_handler(kbdev, tag),
|
||||
kbdev->irqs[irq].flags | ((kbdev->nr_irqs == 1) ? 0 : IRQF_SHARED),
|
||||
dev_name(kbdev->dev), kbase_tag(kbdev, irq))) {
|
||||
dev_err(kbdev->dev, "Can't restore original interrupt %u (index %u)\n",
|
||||
kbdev->irqs[irq].irq, tag);
|
||||
err = -EINVAL;
|
||||
}
|
||||
}
|
||||
|
|
@ -409,7 +409,8 @@ static int kbasep_common_test_interrupt(struct kbase_device *const kbdev, u32 ta
|
|||
return err;
|
||||
}
|
||||
|
||||
int kbasep_common_test_interrupt_handlers(struct kbase_device *const kbdev)
|
||||
#if IS_ENABLED(CONFIG_MALI_REAL_HW)
|
||||
int kbase_validate_interrupts(struct kbase_device *const kbdev)
|
||||
{
|
||||
int err;
|
||||
|
||||
|
|
@ -419,14 +420,14 @@ int kbasep_common_test_interrupt_handlers(struct kbase_device *const kbdev)
|
|||
/* A suspend won't happen during startup/insmod */
|
||||
kbase_pm_context_active(kbdev);
|
||||
|
||||
err = kbasep_common_test_interrupt(kbdev, JOB_IRQ_TAG);
|
||||
err = validate_interrupt(kbdev, JOB_IRQ_TAG);
|
||||
if (err) {
|
||||
dev_err(kbdev->dev,
|
||||
"Interrupt JOB_IRQ didn't reach CPU. Check interrupt assignments.\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = kbasep_common_test_interrupt(kbdev, MMU_IRQ_TAG);
|
||||
err = validate_interrupt(kbdev, MMU_IRQ_TAG);
|
||||
if (err) {
|
||||
dev_err(kbdev->dev,
|
||||
"Interrupt MMU_IRQ didn't reach CPU. Check interrupt assignments.\n");
|
||||
|
|
@ -440,25 +441,21 @@ out:
|
|||
|
||||
return err;
|
||||
}
|
||||
#endif /* CONFIG_MALI_REAL_HW */
|
||||
#endif /* CONFIG_MALI_DEBUG */
|
||||
|
||||
int kbase_install_interrupts(struct kbase_device *kbdev)
|
||||
{
|
||||
u32 nr = ARRAY_SIZE(kbase_handler_table);
|
||||
int err;
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < nr; i++) {
|
||||
err = request_irq(kbdev->irqs[i].irq, kbase_handler_table[i],
|
||||
kbdev->irqs[i].flags | IRQF_SHARED, dev_name(kbdev->dev),
|
||||
kbase_tag(kbdev, i));
|
||||
if (err) {
|
||||
dev_err(kbdev->dev, "Can't request interrupt %d (index %d)\n",
|
||||
for (i = 0; i < kbdev->nr_irqs; i++) {
|
||||
const int result = request_irq(
|
||||
kbdev->irqs[i].irq, kbase_get_interrupt_handler(kbdev, i),
|
||||
kbdev->irqs[i].flags | ((kbdev->nr_irqs == 1) ? 0 : IRQF_SHARED),
|
||||
dev_name(kbdev->dev), kbase_tag(kbdev, i));
|
||||
if (result) {
|
||||
dev_err(kbdev->dev, "Can't request interrupt %u (index %u)\n",
|
||||
kbdev->irqs[i].irq, i);
|
||||
#if IS_ENABLED(CONFIG_SPARSE_IRQ)
|
||||
dev_err(kbdev->dev,
|
||||
"You have CONFIG_SPARSE_IRQ support enabled - is the interrupt number correct for this configuration?\n");
|
||||
#endif /* CONFIG_SPARSE_IRQ */
|
||||
goto release;
|
||||
}
|
||||
}
|
||||
|
|
@ -466,18 +463,21 @@ int kbase_install_interrupts(struct kbase_device *kbdev)
|
|||
return 0;
|
||||
|
||||
release:
|
||||
if (IS_ENABLED(CONFIG_SPARSE_IRQ))
|
||||
dev_err(kbdev->dev,
|
||||
"CONFIG_SPARSE_IRQ enabled - is the interrupt number correct for this config?\n");
|
||||
|
||||
while (i-- > 0)
|
||||
free_irq(kbdev->irqs[i].irq, kbase_tag(kbdev, i));
|
||||
|
||||
return err;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
void kbase_release_interrupts(struct kbase_device *kbdev)
|
||||
{
|
||||
u32 nr = ARRAY_SIZE(kbase_handler_table);
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < nr; i++) {
|
||||
for (i = 0; i < kbdev->nr_irqs; i++) {
|
||||
if (kbdev->irqs[i].irq)
|
||||
free_irq(kbdev->irqs[i].irq, kbase_tag(kbdev, i));
|
||||
}
|
||||
|
|
@ -485,10 +485,9 @@ void kbase_release_interrupts(struct kbase_device *kbdev)
|
|||
|
||||
void kbase_synchronize_irqs(struct kbase_device *kbdev)
|
||||
{
|
||||
u32 nr = ARRAY_SIZE(kbase_handler_table);
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < nr; i++) {
|
||||
for (i = 0; i < kbdev->nr_irqs; i++) {
|
||||
if (kbdev->irqs[i].irq)
|
||||
synchronize_irq(kbdev->irqs[i].irq);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -177,17 +177,14 @@ static u64 select_job_chain(struct kbase_jd_atom *katom)
|
|||
static inline bool kbasep_jm_wait_js_free(struct kbase_device *kbdev, unsigned int js,
|
||||
struct kbase_context *kctx)
|
||||
{
|
||||
const ktime_t wait_loop_start = ktime_get_raw();
|
||||
const s64 max_timeout = (s64)kbdev->js_data.js_free_wait_time_ms;
|
||||
s64 diff = 0;
|
||||
|
||||
u32 val;
|
||||
const u32 timeout_us = kbdev->js_data.js_free_wait_time_ms * USEC_PER_MSEC;
|
||||
/* wait for the JS_COMMAND_NEXT register to reach the given status value */
|
||||
do {
|
||||
if (!kbase_reg_read32(kbdev, JOB_SLOT_OFFSET(js, COMMAND_NEXT)))
|
||||
return true;
|
||||
const int err = kbase_reg_poll32_timeout(kbdev, JOB_SLOT_OFFSET(js, COMMAND_NEXT), val,
|
||||
!val, 0, timeout_us, false);
|
||||
|
||||
diff = ktime_to_ms(ktime_sub(ktime_get_raw(), wait_loop_start));
|
||||
} while (diff < max_timeout);
|
||||
if (!err)
|
||||
return true;
|
||||
|
||||
dev_err(kbdev->dev, "Timeout in waiting for job slot %u to become free for ctx %d_%u", js,
|
||||
kctx->tgid, kctx->id);
|
||||
|
|
@ -221,7 +218,7 @@ int kbase_job_hw_submit(struct kbase_device *kbdev, struct kbase_jd_atom *katom,
|
|||
/* start MMU, medium priority, cache clean/flush on end, clean/flush on
|
||||
* start
|
||||
*/
|
||||
cfg = kctx->as_nr;
|
||||
cfg = (u32)kctx->as_nr;
|
||||
|
||||
if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_FLUSH_REDUCTION) &&
|
||||
!(kbdev->serialize_jobs & KBASE_SERIALIZE_RESET))
|
||||
|
|
@ -386,10 +383,10 @@ void kbase_job_done(struct kbase_device *kbdev, u32 done)
|
|||
/* Note: This is inherently unfair, as we always check for lower
|
||||
* numbered interrupts before the higher numbered ones.
|
||||
*/
|
||||
i = ffs(finished) - 1;
|
||||
i = (unsigned int)ffs((int)finished) - 1u;
|
||||
|
||||
do {
|
||||
int nr_done;
|
||||
u32 nr_done;
|
||||
u32 active;
|
||||
u32 completion_code = BASE_JD_EVENT_DONE; /* assume OK */
|
||||
u64 job_tail = 0;
|
||||
|
|
@ -453,7 +450,7 @@ void kbase_job_done(struct kbase_device *kbdev, u32 done)
|
|||
}
|
||||
|
||||
kbase_reg_write32(kbdev, JOB_CONTROL_ENUM(JOB_IRQ_CLEAR),
|
||||
done & ((1 << i) | (1 << (i + 16))));
|
||||
done & ((1u << i) | (1u << (i + 16))));
|
||||
active = kbase_reg_read32(kbdev, JOB_CONTROL_ENUM(JOB_IRQ_JS_STATE));
|
||||
|
||||
if (((active >> i) & 1) == 0 && (((done >> (i + 16)) & 1) == 0)) {
|
||||
|
|
@ -514,8 +511,8 @@ void kbase_job_done(struct kbase_device *kbdev, u32 done)
|
|||
nr_done -= (active >> i) & 1;
|
||||
nr_done -= (active >> (i + 16)) & 1;
|
||||
|
||||
if (nr_done <= 0) {
|
||||
dev_warn(kbdev->dev, "Spurious interrupt on slot %d", i);
|
||||
if (nr_done == 0 || nr_done > SLOT_RB_SIZE) {
|
||||
dev_warn(kbdev->dev, "Spurious interrupt on slot %u", i);
|
||||
|
||||
goto spurious;
|
||||
}
|
||||
|
|
@ -556,7 +553,7 @@ spurious:
|
|||
finished = (done & 0xFFFF) | failed;
|
||||
if (done)
|
||||
end_timestamp = ktime_get_raw();
|
||||
} while (finished & (1 << i));
|
||||
} while (finished & (1u << i));
|
||||
|
||||
kbasep_job_slot_update_head_start_timestamp(kbdev, i, end_timestamp);
|
||||
}
|
||||
|
|
@ -580,7 +577,7 @@ void kbasep_job_slot_soft_or_hard_stop_do_action(struct kbase_device *kbdev, uns
|
|||
u64 job_in_head_before;
|
||||
u32 status_reg_after;
|
||||
|
||||
WARN_ON(action & (~JS_COMMAND_MASK));
|
||||
WARN_ON(action & (~(u32)JS_COMMAND_MASK));
|
||||
|
||||
/* Check the head pointer */
|
||||
job_in_head_before = kbase_reg_read64(kbdev, JOB_SLOT_OFFSET(js, HEAD));
|
||||
|
|
@ -808,11 +805,12 @@ void kbase_jm_wait_for_zero_jobs(struct kbase_context *kctx)
|
|||
struct kbase_device *kbdev = kctx->kbdev;
|
||||
unsigned long timeout = msecs_to_jiffies(ZAP_TIMEOUT);
|
||||
|
||||
timeout = wait_event_timeout(kctx->jctx.zero_jobs_wait, kctx->jctx.job_nr == 0, timeout);
|
||||
timeout = wait_event_timeout(kctx->jctx.zero_jobs_wait, kctx->jctx.job_nr == 0,
|
||||
(long)timeout);
|
||||
|
||||
if (timeout != 0)
|
||||
timeout = wait_event_timeout(kctx->jctx.sched_info.ctx.is_scheduled_wait,
|
||||
!kbase_ctx_flag(kctx, KCTX_SCHEDULED), timeout);
|
||||
!kbase_ctx_flag(kctx, KCTX_SCHEDULED), (long)timeout);
|
||||
|
||||
/* Neither wait timed out; all done! */
|
||||
if (timeout != 0)
|
||||
|
|
@ -899,7 +897,8 @@ void kbase_job_slot_softstop_swflags(struct kbase_device *kbdev, unsigned int js
|
|||
JS_COMMAND_SOFT_STOP | sw_flags);
|
||||
}
|
||||
|
||||
void kbase_job_slot_softstop(struct kbase_device *kbdev, int js, struct kbase_jd_atom *target_katom)
|
||||
void kbase_job_slot_softstop(struct kbase_device *kbdev, unsigned int js,
|
||||
struct kbase_jd_atom *target_katom)
|
||||
{
|
||||
kbase_job_slot_softstop_swflags(kbdev, js, target_katom, 0u);
|
||||
}
|
||||
|
|
@ -979,7 +978,7 @@ void kbase_reset_gpu_assert_failed_or_prevented(struct kbase_device *kbdev)
|
|||
|
||||
static void kbase_debug_dump_registers(struct kbase_device *kbdev)
|
||||
{
|
||||
int i;
|
||||
unsigned int i;
|
||||
|
||||
kbase_io_history_dump(kbdev);
|
||||
|
||||
|
|
@ -991,7 +990,7 @@ static void kbase_debug_dump_registers(struct kbase_device *kbdev)
|
|||
kbase_reg_read32(kbdev, JOB_CONTROL_ENUM(JOB_IRQ_RAWSTAT)),
|
||||
kbase_reg_read32(kbdev, JOB_CONTROL_ENUM(JOB_IRQ_JS_STATE)));
|
||||
for (i = 0; i < 3; i++) {
|
||||
dev_err(kbdev->dev, " JS%d_STATUS=0x%08x JS%d_HEAD=0x%016llx", i,
|
||||
dev_err(kbdev->dev, " JS%u_STATUS=0x%08x JS%u_HEAD=0x%016llx", i,
|
||||
kbase_reg_read32(kbdev, JOB_SLOT_OFFSET(i, STATUS)), i,
|
||||
kbase_reg_read64(kbdev, JOB_SLOT_OFFSET(i, HEAD)));
|
||||
}
|
||||
|
|
@ -1020,7 +1019,6 @@ static void kbasep_reset_timeout_worker(struct work_struct *data)
|
|||
ktime_t end_timestamp = ktime_get_raw();
|
||||
struct kbasep_js_device_data *js_devdata;
|
||||
bool silent = false;
|
||||
u32 max_loops = KBASE_CLEAN_CACHE_MAX_LOOPS;
|
||||
|
||||
kbdev = container_of(data, struct kbase_device, hwaccess.backend.reset_work);
|
||||
|
||||
|
|
@ -1085,13 +1083,15 @@ static void kbasep_reset_timeout_worker(struct work_struct *data)
|
|||
kbdev->irq_reset_flush = false;
|
||||
|
||||
if (kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_TMIX_8463)) {
|
||||
/* Ensure that L2 is not transitioning when we send the reset
|
||||
* command
|
||||
*/
|
||||
while (--max_loops && kbase_pm_get_trans_cores(kbdev, KBASE_PM_CORE_L2))
|
||||
;
|
||||
u64 val;
|
||||
const u32 timeout_us =
|
||||
kbase_get_timeout_ms(kbdev, KBASE_CLEAN_CACHE_TIMEOUT) * USEC_PER_MSEC;
|
||||
/* Ensure that L2 is not transitioning when we send the reset command */
|
||||
const int err = read_poll_timeout_atomic(kbase_pm_get_trans_cores, val, !val, 0,
|
||||
timeout_us, false, kbdev,
|
||||
KBASE_PM_CORE_L2);
|
||||
|
||||
WARN(!max_loops, "L2 power transition timed out while trying to reset\n");
|
||||
WARN(err, "L2 power transition timed out while trying to reset\n");
|
||||
}
|
||||
|
||||
mutex_lock(&kbdev->pm.lock);
|
||||
|
|
@ -1209,7 +1209,7 @@ static enum hrtimer_restart kbasep_reset_timer_callback(struct hrtimer *timer)
|
|||
static void kbasep_try_reset_gpu_early_locked(struct kbase_device *kbdev)
|
||||
{
|
||||
unsigned int i;
|
||||
int pending_jobs = 0;
|
||||
u32 pending_jobs = 0;
|
||||
|
||||
/* Count the number of jobs */
|
||||
for (i = 0; i < kbdev->gpu_props.num_job_slots; i++)
|
||||
|
|
@ -1263,7 +1263,7 @@ static void kbasep_try_reset_gpu_early(struct kbase_device *kbdev)
|
|||
*/
|
||||
bool kbase_prepare_to_reset_gpu_locked(struct kbase_device *kbdev, unsigned int flags)
|
||||
{
|
||||
int i;
|
||||
unsigned int i;
|
||||
|
||||
#ifdef CONFIG_MALI_ARBITER_SUPPORT
|
||||
if (kbase_pm_is_gpu_lost(kbdev)) {
|
||||
|
|
|
|||
|
|
@ -159,9 +159,9 @@ bool kbase_gpu_atoms_submitted_any(struct kbase_device *kbdev)
|
|||
return false;
|
||||
}
|
||||
|
||||
int kbase_backend_nr_atoms_submitted(struct kbase_device *kbdev, unsigned int js)
|
||||
u32 kbase_backend_nr_atoms_submitted(struct kbase_device *kbdev, unsigned int js)
|
||||
{
|
||||
int nr = 0;
|
||||
u32 nr = 0;
|
||||
int i;
|
||||
|
||||
lockdep_assert_held(&kbdev->hwaccess_lock);
|
||||
|
|
@ -539,7 +539,7 @@ static int kbase_gpu_protected_mode_reset(struct kbase_device *kbdev)
|
|||
}
|
||||
|
||||
static int kbase_jm_protected_entry(struct kbase_device *kbdev, struct kbase_jd_atom **katom,
|
||||
int idx, int js)
|
||||
int idx, unsigned int js)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
|
|
@ -594,7 +594,7 @@ static int kbase_jm_protected_entry(struct kbase_device *kbdev, struct kbase_jd_
|
|||
}
|
||||
|
||||
static int kbase_jm_enter_protected_mode(struct kbase_device *kbdev, struct kbase_jd_atom **katom,
|
||||
int idx, int js)
|
||||
int idx, unsigned int js)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
|
|
@ -758,7 +758,7 @@ static int kbase_jm_enter_protected_mode(struct kbase_device *kbdev, struct kbas
|
|||
}
|
||||
|
||||
static int kbase_jm_exit_protected_mode(struct kbase_device *kbdev, struct kbase_jd_atom **katom,
|
||||
int idx, int js)
|
||||
int idx, unsigned int js)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
|
|
@ -1274,7 +1274,8 @@ void kbase_gpu_complete_hw(struct kbase_device *kbdev, unsigned int js, u32 comp
|
|||
struct kbasep_js_device_data *js_devdata = &kbdev->js_data;
|
||||
unsigned int i;
|
||||
|
||||
if (!kbase_ctx_flag(katom->kctx, KCTX_DYING)) {
|
||||
if (!kbase_ctx_flag(katom->kctx, KCTX_DYING) &&
|
||||
!kbase_ctx_flag(katom->kctx, KCTX_PAGE_FAULT_REPORT_SKIP)) {
|
||||
dev_warn(kbdev->dev, "error detected from slot %d, job status 0x%08x (%s)",
|
||||
js, completion_code, kbase_gpu_exception_name(completion_code));
|
||||
|
||||
|
|
@ -1383,7 +1384,7 @@ void kbase_gpu_complete_hw(struct kbase_device *kbdev, unsigned int js, u32 comp
|
|||
/* Check if there are lower priority jobs to soft stop */
|
||||
kbase_job_slot_ctx_priority_check_locked(kctx, katom);
|
||||
|
||||
kbase_jm_try_kick(kbdev, 1 << katom->slot_nr);
|
||||
kbase_jm_try_kick(kbdev, 1UL << katom->slot_nr);
|
||||
}
|
||||
|
||||
/* For partial shader core off L2 cache flush */
|
||||
|
|
@ -1535,7 +1536,7 @@ static int should_stop_x_dep_slot(struct kbase_jd_atom *katom)
|
|||
|
||||
if (dep_atom->gpu_rb_state != KBASE_ATOM_GPU_RB_NOT_IN_SLOT_RB &&
|
||||
dep_atom->gpu_rb_state != KBASE_ATOM_GPU_RB_RETURN_TO_JS)
|
||||
return dep_atom->slot_nr;
|
||||
return (int)dep_atom->slot_nr;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -1714,10 +1715,12 @@ bool kbase_backend_soft_hard_stop_slot(struct kbase_device *kbdev, struct kbase_
|
|||
}
|
||||
|
||||
if (stop_x_dep_idx0 != -1)
|
||||
kbase_backend_soft_hard_stop_slot(kbdev, kctx, stop_x_dep_idx0, NULL, action);
|
||||
kbase_backend_soft_hard_stop_slot(kbdev, kctx, (unsigned int)stop_x_dep_idx0, NULL,
|
||||
action);
|
||||
|
||||
if (stop_x_dep_idx1 != -1)
|
||||
kbase_backend_soft_hard_stop_slot(kbdev, kctx, stop_x_dep_idx1, NULL, action);
|
||||
kbase_backend_soft_hard_stop_slot(kbdev, kctx, (unsigned int)stop_x_dep_idx1, NULL,
|
||||
action);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -169,11 +169,11 @@ static enum hrtimer_restart timer_callback(struct hrtimer *timer)
|
|||
* now. Hard stop the slot.
|
||||
*/
|
||||
#if !KBASE_DISABLE_SCHEDULING_HARD_STOPS
|
||||
int ms = js_devdata->scheduling_period_ns / 1000000u;
|
||||
u32 ms = js_devdata->scheduling_period_ns / 1000000u;
|
||||
dev_warn(
|
||||
kbdev->dev,
|
||||
"JS: Job Hard-Stopped (took more than %lu ticks at %lu ms/tick)",
|
||||
(unsigned long)ticks, (unsigned long)ms);
|
||||
"JS: Job Hard-Stopped (took more than %u ticks at %u ms/tick)",
|
||||
ticks, ms);
|
||||
kbase_job_slot_hardstop(atom->kctx, s, atom);
|
||||
#endif
|
||||
} else if (ticks == gpu_reset_ticks) {
|
||||
|
|
@ -204,11 +204,11 @@ static enum hrtimer_restart timer_callback(struct hrtimer *timer)
|
|||
* ticks. Hard stop the slot.
|
||||
*/
|
||||
#if !KBASE_DISABLE_SCHEDULING_HARD_STOPS
|
||||
int ms = js_devdata->scheduling_period_ns / 1000000u;
|
||||
u32 ms = js_devdata->scheduling_period_ns / 1000000u;
|
||||
dev_warn(
|
||||
kbdev->dev,
|
||||
"JS: Job Hard-Stopped (took more than %lu ticks at %lu ms/tick)",
|
||||
(unsigned long)ticks, (unsigned long)ms);
|
||||
"JS: Job Hard-Stopped (took more than %u ticks at %u ms/tick)",
|
||||
ticks, ms);
|
||||
kbase_job_slot_hardstop(atom->kctx, s, atom);
|
||||
#endif
|
||||
} else if (ticks == js_devdata->gpu_reset_ticks_dumping) {
|
||||
|
|
|
|||
|
|
@ -68,6 +68,8 @@
|
|||
#include <backend/gpu/mali_kbase_model_linux.h>
|
||||
#include <mali_kbase_mem_linux.h>
|
||||
|
||||
#include <asm/arch_timer.h>
|
||||
|
||||
#if MALI_USE_CSF
|
||||
#include <csf/mali_kbase_csf_firmware.h>
|
||||
|
||||
|
|
@ -78,7 +80,7 @@
|
|||
|
||||
/* Array for storing the value of SELECT register for each type of core */
|
||||
static u64 ipa_ctl_select_config[KBASE_IPA_CORE_TYPE_NUM];
|
||||
static bool ipa_control_timer_enabled;
|
||||
static u32 ipa_control_timer_enabled;
|
||||
#endif
|
||||
|
||||
#if MALI_USE_CSF
|
||||
|
|
@ -142,8 +144,8 @@ struct control_reg_values_t {
|
|||
struct job_slot {
|
||||
int job_active;
|
||||
int job_queued;
|
||||
int job_complete_irq_asserted;
|
||||
int job_irq_mask;
|
||||
u32 job_complete_irq_asserted;
|
||||
u32 job_irq_mask;
|
||||
int job_disabled;
|
||||
};
|
||||
|
||||
|
|
@ -512,7 +514,7 @@ void *gpu_device_get_data(void *model)
|
|||
return dummy->kbdev;
|
||||
}
|
||||
|
||||
#define signal_int(m, s) m->slots[(s)].job_complete_irq_asserted = 1
|
||||
#define signal_int(m, s) m->slots[(s)].job_complete_irq_asserted = 1u
|
||||
|
||||
static char *no_mali_gpu = CONFIG_MALI_NO_MALI_DEFAULT_GPU;
|
||||
module_param(no_mali_gpu, charp, 0000);
|
||||
|
|
@ -650,7 +652,7 @@ static void gpu_model_dump_prfcnt_blocks(u64 *values, u32 *out_index, u32 block_
|
|||
|
||||
for (block_idx = 0; block_idx < block_count; block_idx++) {
|
||||
/* only dump values if core is present */
|
||||
if (!(blocks_present & (1 << block_idx))) {
|
||||
if (!(blocks_present & (1U << block_idx))) {
|
||||
#if MALI_USE_CSF
|
||||
/* if CSF dump zeroed out block */
|
||||
memset(&prfcnt_base[*out_index], 0, KBASE_DUMMY_MODEL_BLOCK_SIZE);
|
||||
|
|
@ -712,6 +714,11 @@ static void gpu_model_dump_nolock(void)
|
|||
performance_counters.time += 10;
|
||||
}
|
||||
|
||||
static void gpu_model_raise_irq(void *model, u32 irq)
|
||||
{
|
||||
gpu_device_raise_irq(model, irq);
|
||||
}
|
||||
|
||||
#if !MALI_USE_CSF
|
||||
static void midgard_model_dump_prfcnt(void)
|
||||
{
|
||||
|
|
@ -743,7 +750,7 @@ void gpu_model_glb_request_job_irq(void *model)
|
|||
spin_lock_irqsave(&hw_error_status.access_lock, flags);
|
||||
hw_error_status.job_irq_status |= JOB_IRQ_GLOBAL_IF;
|
||||
spin_unlock_irqrestore(&hw_error_status.access_lock, flags);
|
||||
gpu_device_raise_irq(model, MODEL_LINUX_JOB_IRQ);
|
||||
gpu_model_raise_irq(model, MODEL_LINUX_JOB_IRQ);
|
||||
}
|
||||
#endif /* !MALI_USE_CSF */
|
||||
|
||||
|
|
@ -767,13 +774,13 @@ static void init_register_statuses(struct dummy_model_t *dummy)
|
|||
for (i = 0; i < NUM_MMU_AS; i++) {
|
||||
hw_error_status.as_command[i] = 0;
|
||||
hw_error_status.as_faultstatus[i] = 0;
|
||||
hw_error_status.mmu_irq_mask |= 1 << i;
|
||||
hw_error_status.mmu_irq_mask |= (1u << i);
|
||||
}
|
||||
|
||||
performance_counters.time = 0;
|
||||
}
|
||||
|
||||
static void update_register_statuses(struct dummy_model_t *dummy, unsigned int job_slot)
|
||||
static void update_register_statuses(struct dummy_model_t *dummy, u32 job_slot)
|
||||
{
|
||||
lockdep_assert_held(&hw_error_status.access_lock);
|
||||
|
||||
|
|
@ -915,7 +922,7 @@ static void update_register_statuses(struct dummy_model_t *dummy, unsigned int j
|
|||
} /* end of job register statuses */
|
||||
|
||||
if (hw_error_status.errors_mask & IS_A_MMU_ERROR) {
|
||||
int i;
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < NUM_MMU_AS; i++) {
|
||||
if (i == hw_error_status.faulty_mmu_as) {
|
||||
|
|
@ -965,9 +972,10 @@ static void update_register_statuses(struct dummy_model_t *dummy, unsigned int j
|
|||
|
||||
if (hw_error_status.errors_mask & KBASE_TRANSTAB_BUS_FAULT)
|
||||
hw_error_status.mmu_irq_rawstat |=
|
||||
1 << (16 + i); /* bus error */
|
||||
1u << (16 + i); /* bus error */
|
||||
else
|
||||
hw_error_status.mmu_irq_rawstat |= 1 << i; /* page fault */
|
||||
hw_error_status.mmu_irq_rawstat |=
|
||||
(1u << i); /* page fault */
|
||||
}
|
||||
}
|
||||
} /*end of mmu register statuses */
|
||||
|
|
@ -979,11 +987,11 @@ static void update_register_statuses(struct dummy_model_t *dummy, unsigned int j
|
|||
hw_error_status.gpu_error_irq |= 1;
|
||||
switch (hw_error_status.errors_mask & IS_A_GPU_ERROR) {
|
||||
case KBASE_DELAYED_BUS_FAULT:
|
||||
hw_error_status.gpu_fault_status = (1 << 7);
|
||||
hw_error_status.gpu_fault_status = (1u << 7);
|
||||
break;
|
||||
|
||||
case KBASE_SHAREABILITY_FAULT:
|
||||
hw_error_status.gpu_fault_status = (1 << 7) | (1 << 3);
|
||||
hw_error_status.gpu_fault_status = (1u << 7) | (1u << 3);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
@ -1119,7 +1127,7 @@ static void midgard_model_get_outputs(void *h)
|
|||
lockdep_assert_held(&hw_error_status.access_lock);
|
||||
|
||||
if (hw_error_status.job_irq_status)
|
||||
gpu_device_raise_irq(dummy, MODEL_LINUX_JOB_IRQ);
|
||||
gpu_model_raise_irq(dummy, MODEL_LINUX_JOB_IRQ);
|
||||
|
||||
if ((dummy->power_changed && dummy->power_changed_mask) ||
|
||||
(dummy->reset_completed & dummy->reset_completed_mask) ||
|
||||
|
|
@ -1130,16 +1138,16 @@ static void midgard_model_get_outputs(void *h)
|
|||
(dummy->flush_pa_range_completed && dummy->flush_pa_range_completed_irq_enabled) ||
|
||||
#endif
|
||||
(dummy->clean_caches_completed && dummy->clean_caches_completed_irq_enabled))
|
||||
gpu_device_raise_irq(dummy, MODEL_LINUX_GPU_IRQ);
|
||||
gpu_model_raise_irq(dummy, MODEL_LINUX_GPU_IRQ);
|
||||
|
||||
if (hw_error_status.mmu_irq_rawstat & hw_error_status.mmu_irq_mask)
|
||||
gpu_device_raise_irq(dummy, MODEL_LINUX_MMU_IRQ);
|
||||
gpu_model_raise_irq(dummy, MODEL_LINUX_MMU_IRQ);
|
||||
}
|
||||
|
||||
static void midgard_model_update(void *h)
|
||||
{
|
||||
struct dummy_model_t *dummy = (struct dummy_model_t *)h;
|
||||
int i;
|
||||
u32 i;
|
||||
|
||||
lockdep_assert_held(&hw_error_status.access_lock);
|
||||
|
||||
|
|
@ -1157,8 +1165,8 @@ static void midgard_model_update(void *h)
|
|||
* as we will overwrite the register status of the job in
|
||||
* the head registers - which has not yet been read
|
||||
*/
|
||||
if ((hw_error_status.job_irq_rawstat & (1 << (i + 16))) ||
|
||||
(hw_error_status.job_irq_rawstat & (1 << i))) {
|
||||
if ((hw_error_status.job_irq_rawstat & (1u << (i + 16))) ||
|
||||
(hw_error_status.job_irq_rawstat & (1u << i))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -1169,7 +1177,7 @@ static void midgard_model_update(void *h)
|
|||
#endif /* CONFIG_MALI_ERROR_INJECT */
|
||||
update_register_statuses(dummy, i);
|
||||
/*if this job slot returned failures we cannot use it */
|
||||
if (hw_error_status.job_irq_rawstat & (1 << (i + 16))) {
|
||||
if (hw_error_status.job_irq_rawstat & (1u << (i + 16))) {
|
||||
dummy->slots[i].job_active = 0;
|
||||
continue;
|
||||
}
|
||||
|
|
@ -1177,7 +1185,7 @@ static void midgard_model_update(void *h)
|
|||
dummy->slots[i].job_active = dummy->slots[i].job_queued;
|
||||
dummy->slots[i].job_queued = 0;
|
||||
if (dummy->slots[i].job_active) {
|
||||
if (hw_error_status.job_irq_rawstat & (1 << (i + 16)))
|
||||
if (hw_error_status.job_irq_rawstat & (1u << (i + 16)))
|
||||
model_error_log(KBASE_CORE,
|
||||
"\natom %lld running a job on a dirty slot",
|
||||
hw_error_status.current_jc);
|
||||
|
|
@ -1193,7 +1201,7 @@ static void invalidate_active_jobs(struct dummy_model_t *dummy)
|
|||
|
||||
for (i = 0; i < NUM_SLOTS; i++) {
|
||||
if (dummy->slots[i].job_active) {
|
||||
hw_error_status.job_irq_rawstat |= (1 << (16 + i));
|
||||
hw_error_status.job_irq_rawstat |= (1u << (16 + i));
|
||||
|
||||
hw_error_status.js_status[i] = 0x7f; /*UNKNOWN*/
|
||||
}
|
||||
|
|
@ -1256,7 +1264,7 @@ void midgard_model_write_reg(void *h, u32 addr, u32 value)
|
|||
int i;
|
||||
|
||||
for (i = 0; i < NUM_SLOTS; i++) {
|
||||
if (value & ((1 << i) | (1 << (i + 16))))
|
||||
if (value & ((1u << i) | (1u << (i + 16))))
|
||||
dummy->slots[i].job_complete_irq_asserted = 0;
|
||||
/* hw_error_status.js_status[i] is cleared in
|
||||
* update_job_irq_js_state
|
||||
|
|
@ -1279,6 +1287,9 @@ void midgard_model_write_reg(void *h, u32 addr, u32 value)
|
|||
|
||||
hw_error_status.job_irq_rawstat &= ~(value);
|
||||
hw_error_status.job_irq_status &= ~(value);
|
||||
} else if (addr == JOB_CONTROL_REG(JOB_IRQ_RAWSTAT)) {
|
||||
hw_error_status.job_irq_rawstat |= value;
|
||||
hw_error_status.job_irq_status |= value;
|
||||
} else if (addr == JOB_CONTROL_REG(JOB_IRQ_MASK)) {
|
||||
/* ignore JOB_IRQ_MASK as it is handled by CSFFW */
|
||||
#endif /* !MALI_USE_CSF */
|
||||
|
|
@ -1378,7 +1389,7 @@ void midgard_model_write_reg(void *h, u32 addr, u32 value)
|
|||
pr_debug("Received IPA_CONTROL command");
|
||||
} else if (addr == IPA_CONTROL_REG(TIMER)
|
||||
) {
|
||||
ipa_control_timer_enabled = value ? true : false;
|
||||
ipa_control_timer_enabled = value ? 1U : 0U;
|
||||
} else if ((addr >= IPA_CONTROL_REG(SELECT_CSHW_LO)) &&
|
||||
(addr <= IPA_CONTROL_REG(SELECT_SHADER_HI))) {
|
||||
enum kbase_ipa_core_type core_type =
|
||||
|
|
@ -1399,7 +1410,7 @@ void midgard_model_write_reg(void *h, u32 addr, u32 value)
|
|||
hw_error_status.mmu_irq_rawstat &= (~value);
|
||||
} else if ((addr >= MMU_STAGE1_REG(MMU_AS_REG(0, AS_TRANSTAB_LO))) &&
|
||||
(addr <= MMU_STAGE1_REG(MMU_AS_REG(15, AS_STATUS)))) {
|
||||
int mem_addr_space = (addr - MMU_STAGE1_REG(MMU_AS_REG(0, AS_TRANSTAB_LO))) >> 6;
|
||||
u32 mem_addr_space = (addr - MMU_STAGE1_REG(MMU_AS_REG(0, AS_TRANSTAB_LO))) >> 6;
|
||||
|
||||
switch (addr & 0x3F) {
|
||||
case AS_COMMAND:
|
||||
|
|
@ -1622,7 +1633,7 @@ void midgard_model_read_reg(void *h, u32 addr, u32 *const value)
|
|||
#if MALI_USE_CSF
|
||||
((dummy->flush_pa_range_completed_irq_enabled ? 1u : 0u) << 20) |
|
||||
#endif
|
||||
(dummy->power_changed_mask << 9) | (1 << 7) | 1;
|
||||
(dummy->power_changed_mask << 9) | (1u << 7) | 1u;
|
||||
pr_debug("GPU_IRQ_MASK read %x", *value);
|
||||
} else if (addr == GPU_CONTROL_REG(GPU_IRQ_RAWSTAT)) {
|
||||
*value = ((dummy->clean_caches_completed ? 1u : 0u) << 17) |
|
||||
|
|
@ -1891,7 +1902,7 @@ void midgard_model_read_reg(void *h, u32 addr, u32 *const value)
|
|||
*value = 0;
|
||||
} else if (addr >= MMU_STAGE1_REG(MMU_AS_REG(0, AS_TRANSTAB_LO)) &&
|
||||
addr <= MMU_STAGE1_REG(MMU_AS_REG(15, AS_STATUS))) {
|
||||
int mem_addr_space = (addr - MMU_STAGE1_REG(MMU_AS_REG(0, AS_TRANSTAB_LO))) >> 6;
|
||||
u32 mem_addr_space = (addr - MMU_STAGE1_REG(MMU_AS_REG(0, AS_TRANSTAB_LO))) >> 6;
|
||||
|
||||
switch (addr & 0x3F) {
|
||||
case AS_TRANSTAB_LO:
|
||||
|
|
@ -1927,7 +1938,7 @@ void midgard_model_read_reg(void *h, u32 addr, u32 *const value)
|
|||
default:
|
||||
model_error_log(
|
||||
KBASE_CORE,
|
||||
"Dummy model register access: Reading unsupported MMU #%d register 0x%x. Returning 0\n",
|
||||
"Dummy model register access: Reading unsupported MMU #%u register 0x%x. Returning 0\n",
|
||||
mem_addr_space, addr);
|
||||
*value = 0;
|
||||
break;
|
||||
|
|
@ -2155,3 +2166,9 @@ int gpu_model_control(void *model, struct kbase_model_control_params *params)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
u64 midgard_model_arch_timer_get_cntfrq(void *h)
|
||||
{
|
||||
CSTD_UNUSED(h);
|
||||
return arch_timer_get_cntfrq();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -134,10 +134,10 @@ struct error_status_t {
|
|||
|
||||
u32 errors_mask;
|
||||
u32 mmu_table_level;
|
||||
int faulty_mmu_as;
|
||||
u32 faulty_mmu_as;
|
||||
|
||||
u64 current_jc;
|
||||
int current_job_slot;
|
||||
u32 current_job_slot;
|
||||
|
||||
u32 job_irq_rawstat;
|
||||
u32 job_irq_status;
|
||||
|
|
@ -168,7 +168,7 @@ struct gpu_model_prfcnt_en {
|
|||
u32 shader;
|
||||
};
|
||||
|
||||
void midgard_set_error(int job_slot);
|
||||
void midgard_set_error(u32 job_slot);
|
||||
int job_atom_inject_error(struct kbase_error_params *params);
|
||||
int gpu_model_control(void *h, struct kbase_model_control_params *params);
|
||||
|
||||
|
|
|
|||
|
|
@ -131,7 +131,7 @@ int job_atom_inject_error(struct kbase_error_params *params)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void midgard_set_error(int job_slot)
|
||||
void midgard_set_error(u32 job_slot)
|
||||
{
|
||||
#ifdef CONFIG_MALI_ERROR_INJECT_RANDOM
|
||||
gpu_generate_error();
|
||||
|
|
|
|||
|
|
@ -37,68 +37,39 @@ struct model_irq_data {
|
|||
struct work_struct work;
|
||||
};
|
||||
|
||||
static void serve_job_irq(struct work_struct *work)
|
||||
{
|
||||
struct model_irq_data *data = container_of(work, struct model_irq_data, work);
|
||||
struct kbase_device *kbdev = data->kbdev;
|
||||
|
||||
/* Make sure no worker is already serving this IRQ */
|
||||
while (atomic_cmpxchg(&kbdev->serving_job_irq, 1, 0) == 1) {
|
||||
u32 val;
|
||||
|
||||
while ((val = kbase_reg_read32(kbdev, JOB_CONTROL_ENUM(JOB_IRQ_STATUS)))) {
|
||||
unsigned long flags;
|
||||
|
||||
/* Handle the IRQ */
|
||||
spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
|
||||
#if MALI_USE_CSF
|
||||
kbase_csf_interrupt(kbdev, val);
|
||||
#else
|
||||
kbase_job_done(kbdev, val);
|
||||
#endif
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
}
|
||||
#define DEFINE_SERVE_IRQ(irq_handler) \
|
||||
static void serve_##irq_handler(struct work_struct *work) \
|
||||
{ \
|
||||
struct model_irq_data *data = container_of(work, struct model_irq_data, work); \
|
||||
struct kbase_device *kbdev = data->kbdev; \
|
||||
irq_handler(kbdev); \
|
||||
kmem_cache_free(kbdev->irq_slab, data); \
|
||||
}
|
||||
|
||||
kmem_cache_free(kbdev->irq_slab, data);
|
||||
}
|
||||
|
||||
static void serve_gpu_irq(struct work_struct *work)
|
||||
static void job_irq(struct kbase_device *kbdev)
|
||||
{
|
||||
struct model_irq_data *data = container_of(work, struct model_irq_data, work);
|
||||
struct kbase_device *kbdev = data->kbdev;
|
||||
|
||||
/* Make sure no worker is already serving this IRQ */
|
||||
while (atomic_cmpxchg(&kbdev->serving_gpu_irq, 1, 0) == 1) {
|
||||
u32 val;
|
||||
|
||||
while ((val = kbase_reg_read32(kbdev, GPU_CONTROL_ENUM(GPU_IRQ_STATUS)))) {
|
||||
/* Handle the GPU_IRQ */
|
||||
kbase_gpu_interrupt(kbdev, val);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
kmem_cache_free(kbdev->irq_slab, data);
|
||||
while (atomic_cmpxchg(&kbdev->serving_job_irq, 1, 0) == 1)
|
||||
kbase_get_interrupt_handler(kbdev, JOB_IRQ_TAG)(0, kbdev);
|
||||
}
|
||||
DEFINE_SERVE_IRQ(job_irq)
|
||||
|
||||
static void serve_mmu_irq(struct work_struct *work)
|
||||
static void gpu_irq(struct kbase_device *kbdev)
|
||||
{
|
||||
struct model_irq_data *data = container_of(work, struct model_irq_data, work);
|
||||
struct kbase_device *kbdev = data->kbdev;
|
||||
|
||||
/* Make sure no worker is already serving this IRQ */
|
||||
if (atomic_cmpxchg(&kbdev->serving_mmu_irq, 1, 0) == 1) {
|
||||
u32 val;
|
||||
|
||||
while ((val = kbase_reg_read32(kbdev, MMU_CONTROL_ENUM(IRQ_STATUS)))) {
|
||||
/* Handle the IRQ */
|
||||
kbase_mmu_interrupt(kbdev, val);
|
||||
}
|
||||
}
|
||||
|
||||
kmem_cache_free(kbdev->irq_slab, data);
|
||||
while (atomic_cmpxchg(&kbdev->serving_gpu_irq, 1, 0) == 1)
|
||||
kbase_get_interrupt_handler(kbdev, GPU_IRQ_TAG)(0, kbdev);
|
||||
}
|
||||
DEFINE_SERVE_IRQ(gpu_irq)
|
||||
|
||||
static void mmu_irq(struct kbase_device *kbdev)
|
||||
{
|
||||
/* Make sure no worker is already serving this IRQ */
|
||||
while (atomic_cmpxchg(&kbdev->serving_mmu_irq, 1, 0) == 1)
|
||||
kbase_get_interrupt_handler(kbdev, MMU_IRQ_TAG)(0, kbdev);
|
||||
}
|
||||
DEFINE_SERVE_IRQ(mmu_irq)
|
||||
|
||||
|
||||
void gpu_device_raise_irq(void *model, u32 irq)
|
||||
{
|
||||
|
|
@ -156,6 +127,9 @@ int kbase_install_interrupts(struct kbase_device *kbdev)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
kbdev->nr_irqs = 3;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -175,23 +149,13 @@ void kbase_synchronize_irqs(struct kbase_device *kbdev)
|
|||
KBASE_EXPORT_TEST_API(kbase_synchronize_irqs);
|
||||
|
||||
int kbase_set_custom_irq_handler(struct kbase_device *kbdev, irq_handler_t custom_handler,
|
||||
int irq_type)
|
||||
u32 irq_tag)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
KBASE_EXPORT_TEST_API(kbase_set_custom_irq_handler);
|
||||
|
||||
irqreturn_t kbase_gpu_irq_test_handler(int irq, void *data, u32 val)
|
||||
{
|
||||
if (!val)
|
||||
return IRQ_NONE;
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
KBASE_EXPORT_TEST_API(kbase_gpu_irq_test_handler);
|
||||
|
||||
int kbase_gpu_device_create(struct kbase_device *kbdev)
|
||||
{
|
||||
kbdev->model = midgard_model_create(kbdev);
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
/*
|
||||
*
|
||||
* (C) COPYRIGHT 2019-2022 ARM Limited. All rights reserved.
|
||||
* (C) COPYRIGHT 2014-2023 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
|
||||
|
|
@ -116,6 +116,15 @@ void midgard_model_write_reg(void *h, u32 addr, u32 value);
|
|||
*/
|
||||
void midgard_model_read_reg(void *h, u32 addr, u32 *const value);
|
||||
|
||||
/**
|
||||
* midgard_model_arch_timer_get_cntfrq - Get Model specific System Timer Frequency
|
||||
*
|
||||
* @h: Model handle.
|
||||
*
|
||||
* Return: Frequency in Hz
|
||||
*/
|
||||
u64 midgard_model_arch_timer_get_cntfrq(void *h);
|
||||
|
||||
/**
|
||||
* gpu_device_raise_irq() - Private IRQ raise function.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@
|
|||
#include <backend/gpu/mali_kbase_js_internal.h>
|
||||
#include <backend/gpu/mali_kbase_jm_internal.h>
|
||||
#else
|
||||
#include <linux/version_compat_defs.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <mali_kbase_reset_gpu.h>
|
||||
#endif /* !MALI_USE_CSF */
|
||||
|
|
@ -42,6 +43,7 @@
|
|||
#include <mali_kbase_dummy_job_wa.h>
|
||||
#include <backend/gpu/mali_kbase_irq_internal.h>
|
||||
|
||||
|
||||
static void kbase_pm_gpu_poweroff_wait_wq(struct work_struct *data);
|
||||
static void kbase_pm_hwcnt_disable_worker(struct work_struct *data);
|
||||
static void kbase_pm_gpu_clock_control_worker(struct work_struct *data);
|
||||
|
|
@ -51,6 +53,8 @@ int kbase_pm_runtime_init(struct kbase_device *kbdev)
|
|||
struct kbase_pm_callback_conf *callbacks;
|
||||
|
||||
callbacks = (struct kbase_pm_callback_conf *)POWER_MANAGEMENT_CALLBACKS;
|
||||
|
||||
|
||||
if (callbacks) {
|
||||
kbdev->pm.backend.callback_power_on = callbacks->power_on_callback;
|
||||
kbdev->pm.backend.callback_power_off = callbacks->power_off_callback;
|
||||
|
|
@ -178,6 +182,10 @@ int kbase_hwaccess_pm_init(struct kbase_device *kbdev)
|
|||
!kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_TURSEHW_1997) &&
|
||||
kbdev->pm.backend.callback_power_runtime_gpu_active &&
|
||||
kbdev->pm.backend.callback_power_runtime_gpu_idle;
|
||||
|
||||
kbdev->pm.backend.apply_hw_issue_TITANHW_2938_wa =
|
||||
kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_TITANHW_2938) &&
|
||||
kbdev->pm.backend.gpu_sleep_supported;
|
||||
#endif
|
||||
|
||||
if (IS_ENABLED(CONFIG_MALI_HW_ERRATA_1485982_NOT_AFFECTED))
|
||||
|
|
@ -239,6 +247,58 @@ void kbase_pm_do_poweron(struct kbase_device *kbdev, bool is_resume)
|
|||
*/
|
||||
}
|
||||
|
||||
#if MALI_USE_CSF
|
||||
static bool wait_cond_mmu_fault_handling_in_gpu_poweroff_wait_wq(struct kbase_device *kbdev,
|
||||
int faults_pending)
|
||||
{
|
||||
struct kbase_pm_backend_data *backend = &kbdev->pm.backend;
|
||||
bool cond = false;
|
||||
|
||||
kbase_pm_lock(kbdev);
|
||||
cond = backend->poweron_required || (faults_pending == 0);
|
||||
kbase_pm_unlock(kbdev);
|
||||
|
||||
return cond;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void wait_for_mmu_fault_handling_in_gpu_poweroff_wait_wq(struct kbase_device *kbdev)
|
||||
{
|
||||
#if MALI_USE_CSF
|
||||
bool reset_triggered = false;
|
||||
int ret = 0;
|
||||
|
||||
lockdep_assert_held(&kbdev->pm.lock);
|
||||
|
||||
do {
|
||||
const u64 timeout_us = kbase_get_timeout_ms(kbdev, CSF_PM_TIMEOUT) * USEC_PER_MSEC;
|
||||
const unsigned long delay_us = 10;
|
||||
int faults_pending = 0;
|
||||
|
||||
kbase_pm_unlock(kbdev);
|
||||
ret = read_poll_timeout_atomic(
|
||||
atomic_read, faults_pending,
|
||||
wait_cond_mmu_fault_handling_in_gpu_poweroff_wait_wq(kbdev, faults_pending),
|
||||
delay_us, timeout_us, false, &kbdev->faults_pending);
|
||||
kbase_pm_lock(kbdev);
|
||||
|
||||
if (ret && !reset_triggered) {
|
||||
dev_err(kbdev->dev,
|
||||
"Wait for fault handling timed-out in gpu_poweroff_wait_wq");
|
||||
if (kbase_prepare_to_reset_gpu(kbdev,
|
||||
RESET_FLAGS_HWC_UNRECOVERABLE_ERROR)) {
|
||||
kbase_reset_gpu(kbdev);
|
||||
reset_triggered = true;
|
||||
}
|
||||
}
|
||||
} while (ret);
|
||||
#else
|
||||
kbase_pm_unlock(kbdev);
|
||||
kbase_flush_mmu_wqs(kbdev);
|
||||
kbase_pm_lock(kbdev);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void pm_handle_power_off(struct kbase_device *kbdev)
|
||||
{
|
||||
struct kbase_pm_backend_data *backend = &kbdev->pm.backend;
|
||||
|
|
@ -283,9 +343,7 @@ static void pm_handle_power_off(struct kbase_device *kbdev)
|
|||
* process. Interrupts are disabled so no more faults
|
||||
* should be generated at this point.
|
||||
*/
|
||||
kbase_pm_unlock(kbdev);
|
||||
kbase_flush_mmu_wqs(kbdev);
|
||||
kbase_pm_lock(kbdev);
|
||||
wait_for_mmu_fault_handling_in_gpu_poweroff_wait_wq(kbdev);
|
||||
|
||||
#ifdef CONFIG_MALI_ARBITER_SUPPORT
|
||||
/* poweron_required may have changed while pm lock
|
||||
|
|
@ -698,12 +756,6 @@ int kbase_hwaccess_pm_powerup(struct kbase_device *kbdev, unsigned int flags)
|
|||
kbdev->pm.backend.gpu_cycle_counter_requests = 0;
|
||||
spin_unlock_irqrestore(&kbdev->pm.backend.gpu_cycle_counter_requests_lock, irq_flags);
|
||||
|
||||
/* We are ready to receive IRQ's now as power policy is set up, so
|
||||
* enable them now.
|
||||
*/
|
||||
#ifdef CONFIG_MALI_DEBUG
|
||||
kbdev->pm.backend.driver_ready_for_irqs = true;
|
||||
#endif
|
||||
kbase_pm_enable_interrupts(kbdev);
|
||||
|
||||
WARN_ON(!kbdev->pm.backend.gpu_powered);
|
||||
|
|
@ -910,7 +962,9 @@ void kbase_hwaccess_pm_resume(struct kbase_device *kbdev)
|
|||
void kbase_pm_handle_gpu_lost(struct kbase_device *kbdev)
|
||||
{
|
||||
unsigned long flags;
|
||||
#if !MALI_USE_CSF
|
||||
ktime_t end_timestamp = ktime_get_raw();
|
||||
#endif
|
||||
struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state;
|
||||
|
||||
if (!kbdev->arb.arb_if)
|
||||
|
|
@ -937,11 +991,14 @@ void kbase_pm_handle_gpu_lost(struct kbase_device *kbdev)
|
|||
/* Clear all jobs running on the GPU */
|
||||
spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
|
||||
kbdev->protected_mode = false;
|
||||
#if !MALI_USE_CSF
|
||||
kbase_backend_reset(kbdev, &end_timestamp);
|
||||
kbase_pm_metrics_update(kbdev, NULL);
|
||||
#endif
|
||||
kbase_pm_update_state(kbdev);
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
|
||||
#if !MALI_USE_CSF
|
||||
/* Cancel any pending HWC dumps */
|
||||
spin_lock_irqsave(&kbdev->hwcnt.lock, flags);
|
||||
if (kbdev->hwcnt.backend.state == KBASE_INSTR_STATE_DUMPING ||
|
||||
|
|
@ -951,6 +1008,7 @@ void kbase_pm_handle_gpu_lost(struct kbase_device *kbdev)
|
|||
wake_up(&kbdev->hwcnt.backend.wait);
|
||||
}
|
||||
spin_unlock_irqrestore(&kbdev->hwcnt.lock, flags);
|
||||
#endif
|
||||
}
|
||||
mutex_unlock(&arb_vm_state->vm_state_lock);
|
||||
mutex_unlock(&kbdev->pm.lock);
|
||||
|
|
@ -968,6 +1026,7 @@ int kbase_pm_force_mcu_wakeup_after_sleep(struct kbase_device *kbdev)
|
|||
spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
|
||||
/* Set the override flag to force the power up of L2 cache */
|
||||
kbdev->pm.backend.gpu_wakeup_override = true;
|
||||
kbdev->pm.backend.runtime_suspend_abort_reason = ABORT_REASON_NONE;
|
||||
kbase_pm_update_state(kbdev);
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
|
||||
|
|
@ -1003,14 +1062,27 @@ static int pm_handle_mcu_sleep_on_runtime_suspend(struct kbase_device *kbdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* Check if a Doorbell mirror interrupt occurred meanwhile */
|
||||
/* Check if a Doorbell mirror interrupt occurred meanwhile.
|
||||
* Also check if GPU idle work item is pending. If FW had sent the GPU idle notification
|
||||
* after the wake up of MCU then it can be assumed that Userspace submission didn't make
|
||||
* GPU non-idle, so runtime suspend doesn't need to be aborted.
|
||||
*/
|
||||
spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
|
||||
if (kbdev->pm.backend.gpu_sleep_mode_active && kbdev->pm.backend.exit_gpu_sleep_mode) {
|
||||
dev_dbg(kbdev->dev,
|
||||
"DB mirror interrupt occurred during runtime suspend after L2 power up");
|
||||
kbdev->pm.backend.gpu_wakeup_override = false;
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
return -EBUSY;
|
||||
if (kbdev->pm.backend.gpu_sleep_mode_active && kbdev->pm.backend.exit_gpu_sleep_mode &&
|
||||
!work_pending(&kbdev->csf.scheduler.gpu_idle_work)) {
|
||||
u32 glb_req =
|
||||
kbase_csf_firmware_global_input_read(&kbdev->csf.global_iface, GLB_REQ);
|
||||
u32 glb_ack = kbase_csf_firmware_global_output(&kbdev->csf.global_iface, GLB_ACK);
|
||||
|
||||
/* Only abort the runtime suspend if GPU idle event is not pending */
|
||||
if (!((glb_req ^ glb_ack) & GLB_REQ_IDLE_EVENT_MASK)) {
|
||||
dev_dbg(kbdev->dev,
|
||||
"DB mirror interrupt occurred during runtime suspend after L2 power up");
|
||||
kbdev->pm.backend.gpu_wakeup_override = false;
|
||||
kbdev->pm.backend.runtime_suspend_abort_reason = ABORT_REASON_DB_MIRROR_IRQ;
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
return -EBUSY;
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
/* Need to release the kbdev->pm.lock to avoid lock ordering issue
|
||||
|
|
|
|||
|
|
@ -109,13 +109,19 @@ unlock:
|
|||
KBASE_EXPORT_TEST_API(kbase_devfreq_set_core_mask);
|
||||
#endif
|
||||
|
||||
u64 kbase_pm_ca_get_core_mask(struct kbase_device *kbdev)
|
||||
u64 kbase_pm_ca_get_debug_core_mask(struct kbase_device *kbdev)
|
||||
{
|
||||
#if MALI_USE_CSF
|
||||
u64 debug_core_mask = kbdev->pm.debug_core_mask;
|
||||
return kbdev->pm.debug_core_mask;
|
||||
#else
|
||||
u64 debug_core_mask = kbdev->pm.debug_core_mask_all;
|
||||
return kbdev->pm.debug_core_mask_all;
|
||||
#endif
|
||||
}
|
||||
KBASE_EXPORT_TEST_API(kbase_pm_ca_get_debug_core_mask);
|
||||
|
||||
u64 kbase_pm_ca_get_core_mask(struct kbase_device *kbdev)
|
||||
{
|
||||
u64 debug_core_mask = kbase_pm_ca_get_debug_core_mask(kbdev);
|
||||
|
||||
lockdep_assert_held(&kbdev->hwaccess_lock);
|
||||
|
||||
|
|
|
|||
|
|
@ -57,6 +57,17 @@ void kbase_pm_ca_term(struct kbase_device *kbdev);
|
|||
*/
|
||||
u64 kbase_pm_ca_get_core_mask(struct kbase_device *kbdev);
|
||||
|
||||
/**
|
||||
* kbase_pm_ca_get_debug_core_mask - Get debug core mask.
|
||||
*
|
||||
* @kbdev: The kbase device structure for the device (must be a valid pointer)
|
||||
*
|
||||
* Returns a mask of the currently selected shader cores.
|
||||
*
|
||||
* Return: The bit mask of user-selected cores
|
||||
*/
|
||||
u64 kbase_pm_ca_get_debug_core_mask(struct kbase_device *kbdev);
|
||||
|
||||
/**
|
||||
* kbase_pm_ca_update_core_status - Update core status
|
||||
*
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@
|
|||
#include "mali_kbase_pm_always_on.h"
|
||||
#include "mali_kbase_pm_coarse_demand.h"
|
||||
|
||||
#include <hw_access/mali_kbase_hw_access_regmap.h>
|
||||
|
||||
#if defined(CONFIG_PM_RUNTIME) || defined(CONFIG_PM)
|
||||
#define KBASE_PM_RUNTIME 1
|
||||
#endif
|
||||
|
|
@ -97,6 +99,21 @@ enum kbase_shader_core_state {
|
|||
#undef KBASEP_SHADER_STATE
|
||||
};
|
||||
|
||||
/**
|
||||
* enum kbase_pm_runtime_suspend_abort_reason - Reason why runtime suspend was aborted
|
||||
* after the wake up of MCU.
|
||||
*
|
||||
* @ABORT_REASON_NONE: Not aborted
|
||||
* @ABORT_REASON_DB_MIRROR_IRQ: Runtime suspend was aborted due to DB_MIRROR irq.
|
||||
* @ABORT_REASON_NON_IDLE_CGS: Runtime suspend was aborted as CSGs were detected as non-idle after
|
||||
* their suspension.
|
||||
*/
|
||||
enum kbase_pm_runtime_suspend_abort_reason {
|
||||
ABORT_REASON_NONE,
|
||||
ABORT_REASON_DB_MIRROR_IRQ,
|
||||
ABORT_REASON_NON_IDLE_CGS
|
||||
};
|
||||
|
||||
/**
|
||||
* struct kbasep_pm_metrics - Metrics data collected for use by the power
|
||||
* management framework.
|
||||
|
|
@ -248,9 +265,6 @@ union kbase_pm_policy_data {
|
|||
* states and transitions.
|
||||
* @cg1_disabled: Set if the policy wants to keep the second core group
|
||||
* powered off
|
||||
* @driver_ready_for_irqs: Debug state indicating whether sufficient
|
||||
* initialization of the driver has occurred to handle
|
||||
* IRQs
|
||||
* @metrics: Structure to hold metrics for the GPU
|
||||
* @shader_tick_timer: Structure to hold the shader poweroff tick timer state
|
||||
* @poweroff_wait_in_progress: true if a wait for GPU power off is in progress.
|
||||
|
|
@ -290,6 +304,8 @@ union kbase_pm_policy_data {
|
|||
* called previously.
|
||||
* See &struct kbase_pm_callback_conf.
|
||||
* @ca_cores_enabled: Cores that are currently available
|
||||
* @apply_hw_issue_TITANHW_2938_wa: Indicates if the workaround for BASE_HW_ISSUE_TITANHW_2938
|
||||
* needs to be applied when unmapping memory from GPU.
|
||||
* @mcu_state: The current state of the micro-control unit, only applicable
|
||||
* to GPUs that have such a component
|
||||
* @l2_state: The current state of the L2 cache state machine. See
|
||||
|
|
@ -358,6 +374,12 @@ union kbase_pm_policy_data {
|
|||
* mode for the saving the HW state before power down.
|
||||
* @db_mirror_interrupt_enabled: Flag tracking if the Doorbell mirror interrupt
|
||||
* is enabled or not.
|
||||
* @runtime_suspend_abort_reason: Tracks if the runtime suspend was aborted,
|
||||
* after the wake up of MCU, due to the DB_MIRROR irq
|
||||
* or non-idle CSGs. Tracking is done to avoid
|
||||
* redundant transition of MCU to sleep state after the
|
||||
* abort of runtime suspend and before the resumption
|
||||
* of scheduling.
|
||||
* @l2_force_off_after_mcu_halt: Flag to indicate that L2 cache power down is
|
||||
* must after performing the MCU halt. Flag is set
|
||||
* immediately after the MCU halt and cleared
|
||||
|
|
@ -427,10 +449,6 @@ struct kbase_pm_backend_data {
|
|||
|
||||
bool cg1_disabled;
|
||||
|
||||
#ifdef CONFIG_MALI_DEBUG
|
||||
bool driver_ready_for_irqs;
|
||||
#endif /* CONFIG_MALI_DEBUG */
|
||||
|
||||
struct kbasep_pm_metrics_state metrics;
|
||||
|
||||
struct kbasep_pm_tick_timer_state shader_tick_timer;
|
||||
|
|
@ -458,6 +476,7 @@ struct kbase_pm_backend_data {
|
|||
u64 ca_cores_enabled;
|
||||
|
||||
#if MALI_USE_CSF
|
||||
bool apply_hw_issue_TITANHW_2938_wa;
|
||||
enum kbase_mcu_state mcu_state;
|
||||
#endif
|
||||
enum kbase_l2_core_state l2_state;
|
||||
|
|
@ -479,6 +498,7 @@ struct kbase_pm_backend_data {
|
|||
bool gpu_idled;
|
||||
bool gpu_wakeup_override;
|
||||
bool db_mirror_interrupt_enabled;
|
||||
enum kbase_pm_runtime_suspend_abort_reason runtime_suspend_abort_reason;
|
||||
#endif
|
||||
|
||||
bool l2_force_off_after_mcu_halt;
|
||||
|
|
|
|||
|
|
@ -114,7 +114,8 @@ bool kbase_pm_is_mcu_desired(struct kbase_device *kbdev)
|
|||
return true;
|
||||
|
||||
#ifdef KBASE_PM_RUNTIME
|
||||
if (kbdev->pm.backend.gpu_wakeup_override)
|
||||
if (kbdev->pm.backend.gpu_wakeup_override ||
|
||||
kbdev->pm.backend.runtime_suspend_abort_reason != ABORT_REASON_NONE)
|
||||
return true;
|
||||
#endif
|
||||
|
||||
|
|
@ -351,12 +352,14 @@ __pure static u32 map_core_type_to_tl_pm_state(struct kbase_device *kbdev,
|
|||
}
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_ARM64)
|
||||
#if IS_ENABLED(CONFIG_ARM64) && !MALI_USE_CSF
|
||||
|
||||
static void mali_cci_flush_l2(struct kbase_device *kbdev)
|
||||
{
|
||||
u32 val;
|
||||
const u32 mask = CLEAN_CACHES_COMPLETED | RESET_COMPLETED;
|
||||
u32 loops = KBASE_CLEAN_CACHE_MAX_LOOPS;
|
||||
u32 raw;
|
||||
const u32 timeout_us =
|
||||
kbase_get_timeout_ms(kbdev, KBASE_CLEAN_CACHE_TIMEOUT) * USEC_PER_MSEC;
|
||||
|
||||
/*
|
||||
* Note that we don't take the cache flush mutex here since
|
||||
|
|
@ -368,14 +371,11 @@ static void mali_cci_flush_l2(struct kbase_device *kbdev)
|
|||
|
||||
kbase_reg_write32(kbdev, GPU_CONTROL_ENUM(GPU_COMMAND), GPU_COMMAND_CACHE_CLN_INV_L2);
|
||||
|
||||
raw = kbase_reg_read32(kbdev, GPU_CONTROL_ENUM(GPU_IRQ_RAWSTAT));
|
||||
|
||||
/* Wait for cache flush to complete before continuing, exit on
|
||||
* gpu resets or loop expiry.
|
||||
*/
|
||||
while (((raw & mask) == 0) && --loops) {
|
||||
raw = kbase_reg_read32(kbdev, GPU_CONTROL_ENUM(GPU_IRQ_RAWSTAT));
|
||||
}
|
||||
kbase_reg_poll32_timeout(kbdev, GPU_CONTROL_ENUM(GPU_IRQ_RAWSTAT), val, val & mask, 0,
|
||||
timeout_us, false);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -632,7 +632,7 @@ static void kbase_pm_l2_config_override(struct kbase_device *kbdev)
|
|||
val |= (kbdev->l2_hash_override << L2_CONFIG_HASH_SHIFT);
|
||||
} else if (kbdev->l2_hash_values_override) {
|
||||
#if MALI_USE_CSF
|
||||
int i;
|
||||
uint i;
|
||||
|
||||
WARN_ON(!kbase_hw_has_l2_slice_hash_feature(kbdev));
|
||||
|
||||
|
|
@ -640,7 +640,7 @@ static void kbase_pm_l2_config_override(struct kbase_device *kbdev)
|
|||
val |= (0x1 << L2_CONFIG_L2_SLICE_HASH_ENABLE_SHIFT);
|
||||
for (i = 0; i < GPU_L2_SLICE_HASH_COUNT; i++) {
|
||||
/* L2_SLICE_HASH and ASN_HASH alias each other */
|
||||
dev_dbg(kbdev->dev, "Program 0x%x to ASN_HASH[%d]\n",
|
||||
dev_dbg(kbdev->dev, "Program 0x%x to ASN_HASH[%u]\n",
|
||||
kbdev->l2_hash_values[i], i);
|
||||
kbase_reg_write32(kbdev, GPU_L2_SLICE_HASH_OFFSET(i),
|
||||
kbdev->l2_hash_values[i]);
|
||||
|
|
@ -757,19 +757,20 @@ static void kbase_pm_enable_mcu_db_notification(struct kbase_device *kbdev)
|
|||
*/
|
||||
static void wait_mcu_as_inactive(struct kbase_device *kbdev)
|
||||
{
|
||||
unsigned int max_loops = KBASE_AS_INACTIVE_MAX_LOOPS;
|
||||
|
||||
u32 val;
|
||||
int err;
|
||||
const u32 timeout_us =
|
||||
kbase_get_timeout_ms(kbdev, KBASE_AS_INACTIVE_TIMEOUT) * USEC_PER_MSEC;
|
||||
lockdep_assert_held(&kbdev->hwaccess_lock);
|
||||
|
||||
if (!kbase_hw_has_issue(kbdev, BASE_HW_ISSUE_TURSEHW_2716))
|
||||
return;
|
||||
|
||||
/* Wait for the AS_ACTIVE_INT bit to become 0 for the AS used by MCU FW */
|
||||
while (--max_loops && kbase_reg_read32(kbdev, MMU_AS_OFFSET(MCU_AS_NR, STATUS)) &
|
||||
AS_STATUS_AS_ACTIVE_INT_MASK)
|
||||
;
|
||||
|
||||
if (!WARN_ON_ONCE(max_loops == 0))
|
||||
err = kbase_reg_poll32_timeout(kbdev, MMU_AS_OFFSET(MCU_AS_NR, STATUS), val,
|
||||
!(val & AS_STATUS_AS_ACTIVE_INT_MASK), 10, timeout_us,
|
||||
false);
|
||||
if (!WARN_ON_ONCE(err == -ETIMEDOUT))
|
||||
return;
|
||||
|
||||
dev_err(kbdev->dev, "AS_ACTIVE_INT bit stuck for AS %d used by MCU FW", MCU_AS_NR);
|
||||
|
|
@ -1341,15 +1342,8 @@ static void kbase_pm_l2_clear_backend_slot_submit_kctx(struct kbase_device *kbde
|
|||
|
||||
static bool can_power_down_l2(struct kbase_device *kbdev)
|
||||
{
|
||||
#if MALI_USE_CSF
|
||||
/* Due to the HW issue GPU2019-3878, need to prevent L2 power off
|
||||
* whilst MMU command is in progress.
|
||||
* Also defer the power-down if MMU is in process of page migration.
|
||||
*/
|
||||
return !kbdev->mmu_hw_operation_in_progress && !kbdev->mmu_page_migrate_in_progress;
|
||||
#else
|
||||
/* Defer the power-down if MMU is in process of page migration. */
|
||||
return !kbdev->mmu_page_migrate_in_progress;
|
||||
#endif
|
||||
}
|
||||
|
||||
static bool can_power_up_l2(struct kbase_device *kbdev)
|
||||
|
|
@ -1508,7 +1502,7 @@ static int kbase_pm_l2_update_state(struct kbase_device *kbdev)
|
|||
* must power them on explicitly.
|
||||
*/
|
||||
if (l2_present != 1)
|
||||
kbase_pm_invoke(kbdev, KBASE_PM_CORE_L2, l2_present & ~1,
|
||||
kbase_pm_invoke(kbdev, KBASE_PM_CORE_L2, l2_present & ~1ULL,
|
||||
ACTION_PWRON);
|
||||
/* Clear backend slot submission kctx */
|
||||
kbase_pm_l2_clear_backend_slot_submit_kctx(kbdev);
|
||||
|
|
@ -2501,7 +2495,8 @@ int kbase_pm_wait_for_l2_powered(struct kbase_device *kbdev)
|
|||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
|
||||
#if MALI_USE_CSF
|
||||
timeout = kbase_csf_timeout_in_jiffies(kbase_get_timeout_ms(kbdev, CSF_PM_TIMEOUT));
|
||||
timeout = (unsigned long)kbase_csf_timeout_in_jiffies(
|
||||
kbase_get_timeout_ms(kbdev, CSF_PM_TIMEOUT));
|
||||
#else
|
||||
timeout = msecs_to_jiffies(PM_TIMEOUT_MS);
|
||||
#endif
|
||||
|
|
@ -2510,11 +2505,11 @@ int kbase_pm_wait_for_l2_powered(struct kbase_device *kbdev)
|
|||
#if KERNEL_VERSION(4, 13, 1) <= LINUX_VERSION_CODE
|
||||
remaining = wait_event_killable_timeout(kbdev->pm.backend.gpu_in_desired_state_wait,
|
||||
kbase_pm_is_in_desired_state_with_l2_powered(kbdev),
|
||||
timeout);
|
||||
(long)timeout);
|
||||
#else
|
||||
remaining = wait_event_timeout(kbdev->pm.backend.gpu_in_desired_state_wait,
|
||||
kbase_pm_is_in_desired_state_with_l2_powered(kbdev),
|
||||
timeout);
|
||||
(long)timeout);
|
||||
#endif
|
||||
|
||||
if (!remaining) {
|
||||
|
|
@ -2535,7 +2530,7 @@ static int pm_wait_for_desired_state(struct kbase_device *kbdev, bool killable_w
|
|||
#if MALI_USE_CSF
|
||||
long timeout = kbase_csf_timeout_in_jiffies(kbase_get_timeout_ms(kbdev, CSF_PM_TIMEOUT));
|
||||
#else
|
||||
long timeout = msecs_to_jiffies(PM_TIMEOUT_MS);
|
||||
long timeout = (long)msecs_to_jiffies(PM_TIMEOUT_MS);
|
||||
#endif
|
||||
int err = 0;
|
||||
|
||||
|
|
@ -2662,7 +2657,7 @@ static int pm_wait_for_poweroff_work_complete(struct kbase_device *kbdev, bool k
|
|||
/* Handling of timeout error isn't supported for arbiter builds */
|
||||
const long timeout = MAX_SCHEDULE_TIMEOUT;
|
||||
#else
|
||||
const long timeout = msecs_to_jiffies(PM_TIMEOUT_MS);
|
||||
const long timeout = (long)msecs_to_jiffies(PM_TIMEOUT_MS);
|
||||
#endif
|
||||
#endif
|
||||
int err = 0;
|
||||
|
|
@ -3081,7 +3076,7 @@ static int kbase_set_gpu_quirks(struct kbase_device *kbdev)
|
|||
|
||||
#endif /* !MALI_USE_CSF */
|
||||
if (kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_IDVS_GROUP_SIZE)) {
|
||||
int default_idvs_group_size = 0xF;
|
||||
u32 default_idvs_group_size = 0xF;
|
||||
u32 group_size = 0;
|
||||
|
||||
if (of_property_read_u32(kbdev->dev->of_node, "idvs-group-size", &group_size))
|
||||
|
|
@ -3219,6 +3214,7 @@ static void kbase_pm_hw_issues_apply(struct kbase_device *kbdev)
|
|||
|
||||
void kbase_pm_cache_snoop_enable(struct kbase_device *kbdev)
|
||||
{
|
||||
#if !MALI_USE_CSF
|
||||
if ((kbdev->current_gpu_coherency_mode == COHERENCY_ACE) && !kbdev->cci_snoop_enabled) {
|
||||
#if IS_ENABLED(CONFIG_ARM64)
|
||||
if (kbdev->snoop_enable_smc != 0)
|
||||
|
|
@ -3227,10 +3223,12 @@ void kbase_pm_cache_snoop_enable(struct kbase_device *kbdev)
|
|||
dev_dbg(kbdev->dev, "MALI - CCI Snoops - Enabled\n");
|
||||
kbdev->cci_snoop_enabled = true;
|
||||
}
|
||||
#endif /* !MALI_USE_CSF */
|
||||
}
|
||||
|
||||
void kbase_pm_cache_snoop_disable(struct kbase_device *kbdev)
|
||||
{
|
||||
#if !MALI_USE_CSF
|
||||
if (kbdev->cci_snoop_enabled) {
|
||||
#if IS_ENABLED(CONFIG_ARM64)
|
||||
if (kbdev->snoop_disable_smc != 0) {
|
||||
|
|
@ -3241,6 +3239,7 @@ void kbase_pm_cache_snoop_disable(struct kbase_device *kbdev)
|
|||
dev_dbg(kbdev->dev, "MALI - CCI Snoops Disabled\n");
|
||||
kbdev->cci_snoop_enabled = false;
|
||||
}
|
||||
#endif /* !MALI_USE_CSF */
|
||||
}
|
||||
|
||||
#if !MALI_USE_CSF
|
||||
|
|
|
|||
|
|
@ -1041,4 +1041,5 @@ static inline bool kbase_pm_l2_allow_mmu_page_migration(struct kbase_device *kbd
|
|||
return (backend->l2_state != KBASE_L2_PEND_ON && backend->l2_state != KBASE_L2_PEND_OFF);
|
||||
}
|
||||
|
||||
|
||||
#endif /* _KBASE_BACKEND_PM_INTERNAL_H_ */
|
||||
|
|
|
|||
|
|
@ -454,7 +454,7 @@ static void kbase_pm_metrics_active_calc(struct kbase_device *kbdev)
|
|||
|
||||
if (katom && katom->gpu_rb_state == KBASE_ATOM_GPU_RB_SUBMITTED) {
|
||||
if (katom->core_req & BASE_JD_REQ_ONLY_COMPUTE) {
|
||||
int device_nr =
|
||||
u32 device_nr =
|
||||
(katom->core_req & BASE_JD_REQ_SPECIFIC_COHERENT_GROUP) ?
|
||||
katom->device_nr :
|
||||
0;
|
||||
|
|
|
|||
|
|
@ -228,7 +228,8 @@ void kbase_pm_update_cores_state(struct kbase_device *kbdev)
|
|||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
}
|
||||
|
||||
int kbase_pm_list_policies(struct kbase_device *kbdev, const struct kbase_pm_policy *const **list)
|
||||
size_t kbase_pm_list_policies(struct kbase_device *kbdev,
|
||||
const struct kbase_pm_policy *const **list)
|
||||
{
|
||||
CSTD_UNUSED(kbdev);
|
||||
if (list)
|
||||
|
|
@ -294,7 +295,7 @@ void kbase_pm_set_policy(struct kbase_device *kbdev, const struct kbase_pm_polic
|
|||
bool reset_gpu = false;
|
||||
bool reset_op_prevented = true;
|
||||
struct kbase_csf_scheduler *scheduler = NULL;
|
||||
u32 pwroff;
|
||||
u64 pwroff_ns;
|
||||
bool switching_to_always_on;
|
||||
#endif
|
||||
|
||||
|
|
@ -304,9 +305,9 @@ void kbase_pm_set_policy(struct kbase_device *kbdev, const struct kbase_pm_polic
|
|||
KBASE_KTRACE_ADD(kbdev, PM_SET_POLICY, NULL, new_policy->id);
|
||||
|
||||
#if MALI_USE_CSF
|
||||
pwroff = kbase_csf_firmware_get_mcu_core_pwroff_time(kbdev);
|
||||
pwroff_ns = kbase_csf_firmware_get_mcu_core_pwroff_time(kbdev);
|
||||
switching_to_always_on = new_policy == &kbase_pm_always_on_policy_ops;
|
||||
if (pwroff == 0 && !switching_to_always_on) {
|
||||
if (pwroff_ns == 0 && !switching_to_always_on) {
|
||||
dev_warn(
|
||||
kbdev->dev,
|
||||
"power_policy: cannot switch away from always_on with mcu_shader_pwroff_timeout set to 0\n");
|
||||
|
|
|
|||
|
|
@ -22,7 +22,6 @@
|
|||
#include <mali_kbase.h>
|
||||
#include <mali_kbase_hwaccess_time.h>
|
||||
#if MALI_USE_CSF
|
||||
#include <asm/arch_timer.h>
|
||||
#include <linux/gcd.h>
|
||||
#include <csf/mali_kbase_csf_timeout.h>
|
||||
#endif
|
||||
|
|
@ -30,6 +29,11 @@
|
|||
#include <backend/gpu/mali_kbase_pm_internal.h>
|
||||
#include <mali_kbase_config_defaults.h>
|
||||
#include <linux/version_compat_defs.h>
|
||||
#include <asm/arch_timer.h>
|
||||
|
||||
#if !IS_ENABLED(CONFIG_MALI_REAL_HW)
|
||||
#include <backend/gpu/mali_kbase_model_linux.h>
|
||||
#endif
|
||||
|
||||
struct kbase_timeout_info {
|
||||
char *selector_str;
|
||||
|
|
@ -53,6 +57,15 @@ static struct kbase_timeout_info timeout_info[KBASE_TIMEOUT_SELECTOR_COUNT] = {
|
|||
MMU_AS_INACTIVE_WAIT_TIMEOUT_CYCLES },
|
||||
[KCPU_FENCE_SIGNAL_TIMEOUT] = { "KCPU_FENCE_SIGNAL_TIMEOUT",
|
||||
KCPU_FENCE_SIGNAL_TIMEOUT_CYCLES },
|
||||
[KBASE_PRFCNT_ACTIVE_TIMEOUT] = { "KBASE_PRFCNT_ACTIVE_TIMEOUT",
|
||||
KBASE_PRFCNT_ACTIVE_TIMEOUT_CYCLES },
|
||||
[KBASE_CLEAN_CACHE_TIMEOUT] = { "KBASE_CLEAN_CACHE_TIMEOUT",
|
||||
KBASE_CLEAN_CACHE_TIMEOUT_CYCLES },
|
||||
[KBASE_AS_INACTIVE_TIMEOUT] = { "KBASE_AS_INACTIVE_TIMEOUT",
|
||||
KBASE_AS_INACTIVE_TIMEOUT_CYCLES },
|
||||
[IPA_INACTIVE_TIMEOUT] = { "IPA_INACTIVE_TIMEOUT", IPA_INACTIVE_TIMEOUT_CYCLES },
|
||||
[CSF_FIRMWARE_STOP_TIMEOUT] = { "CSF_FIRMWARE_STOP_TIMEOUT",
|
||||
CSF_FIRMWARE_STOP_TIMEOUT_CYCLES },
|
||||
};
|
||||
#else
|
||||
static struct kbase_timeout_info timeout_info[KBASE_TIMEOUT_SELECTOR_COUNT] = {
|
||||
|
|
@ -60,6 +73,12 @@ static struct kbase_timeout_info timeout_info[KBASE_TIMEOUT_SELECTOR_COUNT] = {
|
|||
MMU_AS_INACTIVE_WAIT_TIMEOUT_CYCLES },
|
||||
[JM_DEFAULT_JS_FREE_TIMEOUT] = { "JM_DEFAULT_JS_FREE_TIMEOUT",
|
||||
JM_DEFAULT_JS_FREE_TIMEOUT_CYCLES },
|
||||
[KBASE_PRFCNT_ACTIVE_TIMEOUT] = { "KBASE_PRFCNT_ACTIVE_TIMEOUT",
|
||||
KBASE_PRFCNT_ACTIVE_TIMEOUT_CYCLES },
|
||||
[KBASE_CLEAN_CACHE_TIMEOUT] = { "KBASE_CLEAN_CACHE_TIMEOUT",
|
||||
KBASE_CLEAN_CACHE_TIMEOUT_CYCLES },
|
||||
[KBASE_AS_INACTIVE_TIMEOUT] = { "KBASE_AS_INACTIVE_TIMEOUT",
|
||||
KBASE_AS_INACTIVE_TIMEOUT_CYCLES },
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
@ -282,10 +301,23 @@ static void get_cpu_gpu_time(struct kbase_device *kbdev, u64 *cpu_ts, u64 *gpu_t
|
|||
kbase_backend_get_gpu_time(kbdev, gpu_cycle, gpu_ts, &ts);
|
||||
|
||||
if (cpu_ts)
|
||||
*cpu_ts = ts.tv_sec * NSEC_PER_SEC + ts.tv_nsec;
|
||||
*cpu_ts = (u64)(ts.tv_sec * NSEC_PER_SEC + ts.tv_nsec);
|
||||
}
|
||||
#endif
|
||||
|
||||
u64 kbase_arch_timer_get_cntfrq(struct kbase_device *kbdev)
|
||||
{
|
||||
u64 freq = arch_timer_get_cntfrq();
|
||||
|
||||
#if !IS_ENABLED(CONFIG_MALI_REAL_HW)
|
||||
freq = midgard_model_arch_timer_get_cntfrq(kbdev->model);
|
||||
#endif
|
||||
|
||||
dev_dbg(kbdev->dev, "System Timer Freq = %lluHz", freq);
|
||||
|
||||
return freq;
|
||||
}
|
||||
|
||||
int kbase_backend_time_init(struct kbase_device *kbdev)
|
||||
{
|
||||
int err = 0;
|
||||
|
|
@ -297,7 +329,7 @@ int kbase_backend_time_init(struct kbase_device *kbdev)
|
|||
|
||||
kbase_pm_register_access_enable(kbdev);
|
||||
get_cpu_gpu_time(kbdev, &cpu_ts, &gpu_ts, NULL);
|
||||
freq = arch_timer_get_cntfrq();
|
||||
freq = kbase_arch_timer_get_cntfrq(kbdev);
|
||||
|
||||
if (!freq) {
|
||||
dev_warn(kbdev->dev, "arch_timer_get_rate() is zero!");
|
||||
|
|
@ -316,8 +348,9 @@ int kbase_backend_time_init(struct kbase_device *kbdev)
|
|||
goto disable_registers;
|
||||
}
|
||||
|
||||
kbdev->backend_time.offset = cpu_ts - div64_u64(gpu_ts * kbdev->backend_time.multiplier,
|
||||
kbdev->backend_time.divisor);
|
||||
kbdev->backend_time.offset =
|
||||
(s64)(cpu_ts - div64_u64(gpu_ts * kbdev->backend_time.multiplier,
|
||||
kbdev->backend_time.divisor));
|
||||
#endif
|
||||
|
||||
if (kbase_timeout_scaling_init(kbdev)) {
|
||||
|
|
|
|||
|
|
@ -188,7 +188,7 @@ int kbase_context_common_init(struct kbase_context *kctx)
|
|||
bitmap_copy(kctx->cookies, &cookies_mask, BITS_PER_LONG);
|
||||
kbase_gpu_vm_unlock(kctx);
|
||||
|
||||
kctx->id = atomic_add_return(1, &(kctx->kbdev->ctx_num)) - 1;
|
||||
kctx->id = (u32)atomic_add_return(1, &(kctx->kbdev->ctx_num)) - 1;
|
||||
|
||||
mutex_lock(&kctx->kbdev->kctx_list_lock);
|
||||
err = kbase_insert_kctx_to_process(kctx);
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ void kbase_destroy_context(struct kbase_context *kctx);
|
|||
*/
|
||||
static inline bool kbase_ctx_flag(struct kbase_context *kctx, enum kbase_context_flags flag)
|
||||
{
|
||||
return atomic_read(&kctx->flags) & flag;
|
||||
return atomic_read(&kctx->flags) & (int)flag;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -45,11 +45,6 @@
|
|||
*/
|
||||
#define TIMER_EVENTS_PER_SECOND ((u32)1000 / IPA_CONTROL_TIMER_DEFAULT_VALUE_MS)
|
||||
|
||||
/*
|
||||
* Maximum number of loops polling the GPU before we assume the GPU has hung.
|
||||
*/
|
||||
#define IPA_INACTIVE_MAX_LOOPS (8000000U)
|
||||
|
||||
/*
|
||||
* Number of bits used to configure a performance counter in SELECT registers.
|
||||
*/
|
||||
|
|
@ -86,16 +81,16 @@ static u32 timer_value(u32 gpu_rate)
|
|||
|
||||
static int wait_status(struct kbase_device *kbdev, u32 flags)
|
||||
{
|
||||
unsigned int max_loops = IPA_INACTIVE_MAX_LOOPS;
|
||||
u32 status = kbase_reg_read32(kbdev, IPA_CONTROL_ENUM(STATUS));
|
||||
|
||||
u32 val;
|
||||
const u32 timeout_us = kbase_get_timeout_ms(kbdev, IPA_INACTIVE_TIMEOUT) * USEC_PER_MSEC;
|
||||
/*
|
||||
* Wait for the STATUS register to indicate that flags have been
|
||||
* cleared, in case a transition is pending.
|
||||
*/
|
||||
while (--max_loops && (status & flags))
|
||||
status = kbase_reg_read32(kbdev, IPA_CONTROL_ENUM(STATUS));
|
||||
if (max_loops == 0) {
|
||||
const int err = kbase_reg_poll32_timeout(kbdev, IPA_CONTROL_ENUM(STATUS), val,
|
||||
!(val & flags), 0, timeout_us, false);
|
||||
|
||||
if (err) {
|
||||
dev_err(kbdev->dev, "IPA_CONTROL STATUS register stuck");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
|
@ -126,7 +121,7 @@ static int apply_select_config(struct kbase_device *kbdev, u64 *select)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static u64 read_value_cnt(struct kbase_device *kbdev, u8 type, int select_idx)
|
||||
static u64 read_value_cnt(struct kbase_device *kbdev, u8 type, u8 select_idx)
|
||||
{
|
||||
switch (type) {
|
||||
case KBASE_IPA_CORE_TYPE_CSHW:
|
||||
|
|
|
|||
|
|
@ -191,14 +191,14 @@ static int kernel_map_user_io_pages(struct kbase_context *kctx, struct kbase_que
|
|||
struct page *page_list[2];
|
||||
pgprot_t cpu_map_prot;
|
||||
unsigned long flags;
|
||||
uint64_t *user_io_addr;
|
||||
u64 *user_io_addr;
|
||||
int ret = 0;
|
||||
size_t i;
|
||||
|
||||
kbase_gpu_vm_lock(kctx);
|
||||
|
||||
if (ARRAY_SIZE(page_list) > (KBASE_PERMANENTLY_MAPPED_MEM_LIMIT_PAGES -
|
||||
atomic_read(&kctx->permanent_mapped_pages))) {
|
||||
(unsigned int)atomic_read(&kctx->permanent_mapped_pages))) {
|
||||
ret = -ENOMEM;
|
||||
goto unlock;
|
||||
}
|
||||
|
|
@ -548,7 +548,7 @@ static int csf_queue_register_internal(struct kbase_context *kctx,
|
|||
* enabled, otherwise leave them as default zeros.
|
||||
*/
|
||||
if (reg_ex && reg_ex->ex_buffer_size) {
|
||||
u32 cfg = CS_INSTR_CONFIG_EVENT_SIZE_SET(0, reg_ex->ex_event_size);
|
||||
u32 cfg = CS_INSTR_CONFIG_EVENT_SIZE_SET(0U, reg_ex->ex_event_size);
|
||||
cfg = CS_INSTR_CONFIG_EVENT_STATE_SET(cfg, reg_ex->ex_event_state);
|
||||
|
||||
queue->trace_cfg = cfg;
|
||||
|
|
@ -719,7 +719,7 @@ int kbase_csf_queue_bind(struct kbase_context *kctx, union kbase_ioctl_cs_queue_
|
|||
group->bound_queues[bind->in.csi_index] = queue;
|
||||
queue->group = group;
|
||||
queue->group_priority = group->priority;
|
||||
queue->csi_index = bind->in.csi_index;
|
||||
queue->csi_index = (s8)bind->in.csi_index;
|
||||
queue->bind_state = KBASE_CSF_QUEUE_BIND_IN_PROGRESS;
|
||||
|
||||
out:
|
||||
|
|
@ -835,8 +835,8 @@ void kbase_csf_ring_cs_kernel_doorbell(struct kbase_device *kbdev, int csi_index
|
|||
dmb(osh);
|
||||
|
||||
value = kbase_csf_firmware_csg_output(ginfo, CSG_DB_ACK);
|
||||
value ^= (1 << csi_index);
|
||||
kbase_csf_firmware_csg_input_mask(ginfo, CSG_DB_REQ, value, 1 << csi_index);
|
||||
value ^= (1U << csi_index);
|
||||
kbase_csf_firmware_csg_input_mask(ginfo, CSG_DB_REQ, value, 1U << csi_index);
|
||||
|
||||
if (likely(ring_csg_doorbell))
|
||||
kbase_csf_ring_csg_doorbell(kbdev, csg_nr);
|
||||
|
|
@ -897,7 +897,7 @@ static void unbind_stopped_queue(struct kbase_context *kctx, struct kbase_queue
|
|||
unsigned long flags;
|
||||
|
||||
kbase_csf_scheduler_spin_lock(kctx->kbdev, &flags);
|
||||
bitmap_clear(queue->group->protm_pending_bitmap, queue->csi_index, 1);
|
||||
bitmap_clear(queue->group->protm_pending_bitmap, (unsigned int)queue->csi_index, 1);
|
||||
KBASE_KTRACE_ADD_CSF_GRP_Q(kctx->kbdev, CSI_PROTM_PEND_CLEAR, queue->group, queue,
|
||||
queue->group->protm_pending_bitmap[0]);
|
||||
queue->group->bound_queues[queue->csi_index] = NULL;
|
||||
|
|
@ -1923,8 +1923,8 @@ static void flush_gpu_cache_on_fatal_error(struct kbase_device *kbdev)
|
|||
*/
|
||||
if (kbdev->pm.backend.gpu_powered) {
|
||||
kbase_gpu_start_cache_clean(kbdev, GPU_COMMAND_CACHE_CLN_INV_L2_LSC);
|
||||
if (kbase_gpu_wait_cache_clean_timeout(kbdev,
|
||||
kbdev->mmu_or_gpu_cache_op_wait_time_ms))
|
||||
if (kbase_gpu_wait_cache_clean_timeout(
|
||||
kbdev, kbase_get_timeout_ms(kbdev, MMU_AS_INACTIVE_WAIT_TIMEOUT)))
|
||||
dev_warn(
|
||||
kbdev->dev,
|
||||
"[%llu] Timeout waiting for CACHE_CLN_INV_L2_LSC to complete after fatal error",
|
||||
|
|
@ -2258,12 +2258,13 @@ static void handle_fault_event(struct kbase_queue *const queue, const u32 cs_ack
|
|||
const u32 cs_fault_exception_data = CS_FAULT_EXCEPTION_DATA_GET(cs_fault);
|
||||
const u64 cs_fault_info_exception_data = CS_FAULT_INFO_EXCEPTION_DATA_GET(cs_fault_info);
|
||||
bool use_old_log_format = true;
|
||||
bool skip_fault_report = kbase_ctx_flag(queue->kctx, KCTX_PAGE_FAULT_REPORT_SKIP);
|
||||
|
||||
|
||||
kbase_csf_scheduler_spin_lock_assert_held(kbdev);
|
||||
|
||||
|
||||
if (use_old_log_format)
|
||||
if (use_old_log_format && !skip_fault_report)
|
||||
dev_warn(kbdev->dev,
|
||||
"Ctx %d_%d Group %d CSG %d CSI: %d\n"
|
||||
"CS_FAULT.EXCEPTION_TYPE: 0x%x (%s)\n"
|
||||
|
|
@ -2324,7 +2325,7 @@ static void report_queue_fatal_error(struct kbase_queue *const queue, u32 cs_fat
|
|||
return;
|
||||
|
||||
error.payload.csg_error.handle = group->handle;
|
||||
error.payload.csg_error.error.payload.fatal_queue.csi_index = queue->csi_index;
|
||||
error.payload.csg_error.error.payload.fatal_queue.csi_index = (__u8)queue->csi_index;
|
||||
kbase_csf_event_add_error(queue->kctx, &group->error_fatal, &error);
|
||||
kbase_event_wakeup(queue->kctx);
|
||||
}
|
||||
|
|
@ -2433,11 +2434,12 @@ static void handle_fatal_event(struct kbase_queue *const queue,
|
|||
const u32 cs_fatal_exception_data = CS_FATAL_EXCEPTION_DATA_GET(cs_fatal);
|
||||
const u64 cs_fatal_info_exception_data = CS_FATAL_INFO_EXCEPTION_DATA_GET(cs_fatal_info);
|
||||
bool use_old_log_format = true;
|
||||
bool skip_fault_report = kbase_ctx_flag(queue->kctx, KCTX_PAGE_FAULT_REPORT_SKIP);
|
||||
|
||||
|
||||
kbase_csf_scheduler_spin_lock_assert_held(kbdev);
|
||||
|
||||
if (use_old_log_format)
|
||||
if (use_old_log_format && !skip_fault_report)
|
||||
dev_warn(kbdev->dev,
|
||||
"Ctx %d_%d Group %d CSG %d CSI: %d\n"
|
||||
"CS_FATAL.EXCEPTION_TYPE: 0x%x (%s)\n"
|
||||
|
|
@ -2498,17 +2500,17 @@ static void process_cs_interrupts(struct kbase_queue_group *const group,
|
|||
kbase_csf_scheduler_spin_lock_assert_held(kbdev);
|
||||
|
||||
while (remaining != 0) {
|
||||
int const i = ffs(remaining) - 1;
|
||||
unsigned int const i = (unsigned int)ffs((int)remaining) - 1;
|
||||
struct kbase_queue *const queue = group->bound_queues[i];
|
||||
|
||||
remaining &= ~(1 << i);
|
||||
remaining &= ~(1U << i);
|
||||
|
||||
/* The queue pointer can be NULL, but if it isn't NULL then it
|
||||
* cannot disappear since scheduler spinlock is held and before
|
||||
* freeing a bound queue it has to be first unbound which
|
||||
* requires scheduler spinlock.
|
||||
*/
|
||||
if (queue && !WARN_ON(queue->csi_index != i)) {
|
||||
if (queue && !WARN_ON(queue->csi_index != (s8)i)) {
|
||||
struct kbase_csf_cmd_stream_info const *const stream = &ginfo->streams[i];
|
||||
u32 const cs_req = kbase_csf_firmware_cs_input_read(stream, CS_REQ);
|
||||
u32 const cs_ack = kbase_csf_firmware_cs_output(stream, CS_ACK);
|
||||
|
|
@ -2612,7 +2614,7 @@ static void process_cs_interrupts(struct kbase_queue_group *const group,
|
|||
*
|
||||
* See process_cs_interrupts() for details of per-stream interrupt handling.
|
||||
*/
|
||||
static void process_csg_interrupts(struct kbase_device *const kbdev, int const csg_nr,
|
||||
static void process_csg_interrupts(struct kbase_device *const kbdev, u32 const csg_nr,
|
||||
struct irq_idle_and_protm_track *track)
|
||||
{
|
||||
struct kbase_csf_cmd_stream_group_info *ginfo;
|
||||
|
|
@ -2621,7 +2623,7 @@ static void process_csg_interrupts(struct kbase_device *const kbdev, int const c
|
|||
|
||||
kbase_csf_scheduler_spin_lock_assert_held(kbdev);
|
||||
|
||||
if (WARN_ON((u32)csg_nr >= kbdev->csf.global_iface.group_num))
|
||||
if (WARN_ON(csg_nr >= kbdev->csf.global_iface.group_num))
|
||||
return;
|
||||
|
||||
ginfo = &kbdev->csf.global_iface.groups[csg_nr];
|
||||
|
|
@ -2655,10 +2657,10 @@ static void process_csg_interrupts(struct kbase_device *const kbdev, int const c
|
|||
if (!group)
|
||||
return;
|
||||
|
||||
if (WARN_ON(kbase_csf_scheduler_group_get_slot_locked(group) != csg_nr))
|
||||
if (WARN_ON((u32)kbase_csf_scheduler_group_get_slot_locked(group) != csg_nr))
|
||||
return;
|
||||
|
||||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, CSG_INTERRUPT_PROCESS_START, group, csg_nr);
|
||||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, CSG_INTERRUPT_PROCESS_START, group, (u64)csg_nr);
|
||||
|
||||
kbase_csf_handle_csg_sync_update(kbdev, ginfo, group, req, ack);
|
||||
|
||||
|
|
@ -2673,7 +2675,7 @@ static void process_csg_interrupts(struct kbase_device *const kbdev, int const c
|
|||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, CSG_SLOT_IDLE_SET, group,
|
||||
scheduler->csg_slots_idle_mask[0]);
|
||||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, CSG_INTERRUPT_IDLE, group, req ^ ack);
|
||||
dev_dbg(kbdev->dev, "Idle notification received for Group %u on slot %d\n",
|
||||
dev_dbg(kbdev->dev, "Idle notification received for Group %u on slot %u\n",
|
||||
group->handle, csg_nr);
|
||||
|
||||
if (atomic_read(&scheduler->non_idle_offslot_grps)) {
|
||||
|
|
@ -2690,7 +2692,7 @@ static void process_csg_interrupts(struct kbase_device *const kbdev, int const c
|
|||
|
||||
if (group->scan_seq_num < track->idle_seq) {
|
||||
track->idle_seq = group->scan_seq_num;
|
||||
track->idle_slot = csg_nr;
|
||||
track->idle_slot = (s8)csg_nr;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2702,7 +2704,7 @@ static void process_csg_interrupts(struct kbase_device *const kbdev, int const c
|
|||
req ^ ack);
|
||||
dev_info(
|
||||
kbdev->dev,
|
||||
"[%llu] Iterator PROGRESS_TIMER timeout notification received for group %u of ctx %d_%d on slot %d\n",
|
||||
"[%llu] Iterator PROGRESS_TIMER timeout notification received for group %u of ctx %d_%d on slot %u\n",
|
||||
kbase_backend_get_cycle_cnt(kbdev), group->handle, group->kctx->tgid,
|
||||
group->kctx->id, csg_nr);
|
||||
|
||||
|
|
@ -2964,10 +2966,10 @@ void kbase_csf_interrupt(struct kbase_device *kbdev, u32 val)
|
|||
kbase_csf_scheduler_spin_lock(kbdev, &flags);
|
||||
/* Looping through and track the highest idle and protm groups */
|
||||
while (csg_interrupts != 0) {
|
||||
int const csg_nr = ffs(csg_interrupts) - 1;
|
||||
u32 const csg_nr = (u32)ffs((int)csg_interrupts) - 1;
|
||||
|
||||
process_csg_interrupts(kbdev, csg_nr, &track);
|
||||
csg_interrupts &= ~(1 << csg_nr);
|
||||
csg_interrupts &= ~(1U << csg_nr);
|
||||
}
|
||||
|
||||
/* Handle protm from the tracked information */
|
||||
|
|
@ -3038,10 +3040,13 @@ void kbase_csf_interrupt(struct kbase_device *kbdev, u32 val)
|
|||
|
||||
if (deferred_handling_glb_idle_irq) {
|
||||
unsigned long flags;
|
||||
bool invoke_pm_state_machine;
|
||||
|
||||
kbase_csf_scheduler_spin_lock(kbdev, &flags);
|
||||
kbase_csf_scheduler_process_gpu_idle_event(kbdev);
|
||||
invoke_pm_state_machine = kbase_csf_scheduler_process_gpu_idle_event(kbdev);
|
||||
kbase_csf_scheduler_spin_unlock(kbdev, flags);
|
||||
if (unlikely(invoke_pm_state_machine))
|
||||
kbase_pm_update_state(kbdev);
|
||||
}
|
||||
|
||||
wake_up_all(&kbdev->csf.event_wait);
|
||||
|
|
|
|||
|
|
@ -236,7 +236,6 @@ static ssize_t kbase_csf_debugfs_scheduler_state_set(struct file *file, const ch
|
|||
{
|
||||
struct kbase_device *kbdev = file->private_data;
|
||||
char buf[MAX_SCHED_STATE_STRING_LEN];
|
||||
ssize_t ret = count;
|
||||
|
||||
CSTD_UNUSED(ppos);
|
||||
|
||||
|
|
@ -256,10 +255,10 @@ static ssize_t kbase_csf_debugfs_scheduler_state_set(struct file *file, const ch
|
|||
kbase_csf_scheduler_force_wakeup(kbdev);
|
||||
else {
|
||||
dev_dbg(kbdev->dev, "Bad scheduler state %s", buf);
|
||||
ret = -EINVAL;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
static const struct file_operations kbasep_csf_debugfs_scheduler_state_fops = {
|
||||
|
|
|
|||
|
|
@ -26,15 +26,16 @@
|
|||
#ifndef _KBASE_CSF_DEFS_H_
|
||||
#define _KBASE_CSF_DEFS_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/wait.h>
|
||||
|
||||
#include <hw_access/mali_kbase_hw_access.h>
|
||||
#include "mali_kbase_csf_firmware.h"
|
||||
#include "mali_kbase_refcount_defs.h"
|
||||
#include "mali_kbase_csf_event.h"
|
||||
#include <uapi/gpu/arm/midgard/csf/mali_kbase_csf_errors_dumpfault.h>
|
||||
|
||||
#include <linux/version_compat_defs.h>
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/wait.h>
|
||||
|
||||
#if IS_ENABLED(CONFIG_MALI_CORESIGHT)
|
||||
#include <debug/backend/mali_kbase_debug_coresight_internal_csf.h>
|
||||
#endif /* IS_ENABLED(CONFIG_MALI_CORESIGHT) */
|
||||
|
|
@ -245,11 +246,11 @@ enum kbase_csf_scheduler_state {
|
|||
/**
|
||||
* enum kbase_queue_group_priority - Kbase internal relative priority list.
|
||||
*
|
||||
* @KBASE_QUEUE_GROUP_PRIORITY_REALTIME: The realtime queue group priority.
|
||||
* @KBASE_QUEUE_GROUP_PRIORITY_HIGH: The high queue group priority.
|
||||
* @KBASE_QUEUE_GROUP_PRIORITY_MEDIUM: The medium queue group priority.
|
||||
* @KBASE_QUEUE_GROUP_PRIORITY_LOW: The low queue group priority.
|
||||
* @KBASE_QUEUE_GROUP_PRIORITY_COUNT: The number of priority levels.
|
||||
* @KBASE_QUEUE_GROUP_PRIORITY_REALTIME: The realtime queue group priority.
|
||||
* @KBASE_QUEUE_GROUP_PRIORITY_HIGH: The high queue group priority.
|
||||
* @KBASE_QUEUE_GROUP_PRIORITY_MEDIUM: The medium queue group priority.
|
||||
* @KBASE_QUEUE_GROUP_PRIORITY_LOW: The low queue group priority.
|
||||
* @KBASE_QUEUE_GROUP_PRIORITY_COUNT: The number of priority levels.
|
||||
*/
|
||||
enum kbase_queue_group_priority {
|
||||
KBASE_QUEUE_GROUP_PRIORITY_REALTIME = 0,
|
||||
|
|
@ -273,7 +274,12 @@ enum kbase_queue_group_priority {
|
|||
* @CSF_SCHED_PROTM_PROGRESS_TIMEOUT: Timeout used to prevent protected mode execution hang.
|
||||
* @MMU_AS_INACTIVE_WAIT_TIMEOUT: Maximum waiting time in ms for the completion
|
||||
* of a MMU operation.
|
||||
* @KCPU_FENCE_SIGNAL_TIMEOUT: Waiting time in ms for triggering a KCPU queue sync state dump
|
||||
* @KCPU_FENCE_SIGNAL_TIMEOUT: Waiting time in ms for triggering a KCPU queue sync state dump.
|
||||
* @KBASE_PRFCNT_ACTIVE_TIMEOUT: Waiting time for prfcnt to be ready.
|
||||
* @KBASE_CLEAN_CACHE_TIMEOUT: Waiting time for cache flush to complete.
|
||||
* @KBASE_AS_INACTIVE_TIMEOUT: Waiting time for MCU address space to become inactive.
|
||||
* @IPA_INACTIVE_TIMEOUT: Waiting time for IPA_CONTROL_STATUS flags to be cleared.
|
||||
* @CSF_FIRMWARE_STOP_TIMEOUT: Waiting time for the firmware to stop.
|
||||
* @KBASE_TIMEOUT_SELECTOR_COUNT: Number of timeout selectors. Must be last in
|
||||
* the enum.
|
||||
* @KBASE_DEFAULT_TIMEOUT: Default timeout used when an invalid selector is passed
|
||||
|
|
@ -289,6 +295,11 @@ enum kbase_timeout_selector {
|
|||
CSF_SCHED_PROTM_PROGRESS_TIMEOUT,
|
||||
MMU_AS_INACTIVE_WAIT_TIMEOUT,
|
||||
KCPU_FENCE_SIGNAL_TIMEOUT,
|
||||
KBASE_PRFCNT_ACTIVE_TIMEOUT,
|
||||
KBASE_CLEAN_CACHE_TIMEOUT,
|
||||
KBASE_AS_INACTIVE_TIMEOUT,
|
||||
IPA_INACTIVE_TIMEOUT,
|
||||
CSF_FIRMWARE_STOP_TIMEOUT,
|
||||
|
||||
/* Must be the last in the enum */
|
||||
KBASE_TIMEOUT_SELECTOR_COUNT,
|
||||
|
|
@ -505,9 +516,9 @@ struct kbase_protected_suspend_buffer {
|
|||
* @prepared_seq_num: Indicates the position of queue group in the list of
|
||||
* prepared groups to be scheduled.
|
||||
* @scan_seq_num: Scan out sequence number before adjusting for dynamic
|
||||
* idle conditions. It is used for setting a group's
|
||||
* onslot priority. It could differ from prepared_seq_number
|
||||
* when there are idle groups.
|
||||
* idle conditions. It represents a group's global priority
|
||||
* for a running tick/tock. It could differ from
|
||||
* prepared_seq_number when there are idle groups.
|
||||
* @faulted: Indicates that a GPU fault occurred for the queue group.
|
||||
* This flag persists until the fault has been queued to be
|
||||
* reported to userspace.
|
||||
|
|
@ -538,6 +549,12 @@ struct kbase_protected_suspend_buffer {
|
|||
* It is accumulated on consecutive mapping attempt failures. On
|
||||
* reaching a preset limit, the group is regarded as suffered
|
||||
* a fatal error and triggers a fatal error notification.
|
||||
* @sched_act_seq_num: Scheduling action sequence number to determine the CSG slot
|
||||
* priority in tick/tock scheduling action. It could differ from
|
||||
* scan_seq_num. The field is only meaningful if the CSG is on the
|
||||
* Scheduler's schedulable list for a tick/tock, and used for
|
||||
* determining the CSG slot priority when the group is to be placed
|
||||
* on the CSG slot.
|
||||
*/
|
||||
struct kbase_queue_group {
|
||||
struct kbase_context *kctx;
|
||||
|
|
@ -589,6 +606,7 @@ struct kbase_queue_group {
|
|||
#endif
|
||||
void *csg_reg;
|
||||
u8 csg_reg_bind_retries;
|
||||
u32 sched_act_seq_num;
|
||||
#if IS_ENABLED(CONFIG_MALI_TRACE_POWER_GPU_WORK_PERIOD)
|
||||
/**
|
||||
* @prev_act: Previous CSG activity transition in a GPU metrics.
|
||||
|
|
@ -729,13 +747,15 @@ struct kbase_csf_ctx_heap_reclaim_info {
|
|||
* GPU command queues are idle and at least one of them
|
||||
* is blocked on a sync wait operation.
|
||||
* @num_idle_wait_grps: Length of the @idle_wait_groups list.
|
||||
* @sync_update_wq: Dedicated workqueue to process work items corresponding
|
||||
* to the sync_update events by sync_set/sync_add
|
||||
* instruction execution on CSs bound to groups
|
||||
* of @idle_wait_groups list.
|
||||
* @sync_update_work: work item to process the sync_update events by
|
||||
* sync_set / sync_add instruction execution on command
|
||||
* streams bound to groups of @idle_wait_groups list.
|
||||
* @sync_update_wq_high_prio: high-priority work queue to process the
|
||||
* SYNC_UPDATE events by sync_set / sync_add
|
||||
* instruction execution on command streams bound to
|
||||
* groups of @idle_wait_groups list. This WQ would
|
||||
* be used if the context is prioritised.
|
||||
* @sync_update_wq_normal_prio: similar to sync_update_wq_high_prio, but this
|
||||
* WQ would be used if the context is not
|
||||
* prioritised.
|
||||
* @sync_update_work: Work item to process the SYNC_UPDATE events.
|
||||
* @ngrp_to_schedule: Number of groups added for the context to the
|
||||
* 'groups_to_schedule' list of scheduler instance.
|
||||
* @heap_info: Heap reclaim information data of the kctx. As the
|
||||
|
|
@ -748,7 +768,8 @@ struct kbase_csf_scheduler_context {
|
|||
u32 num_runnable_grps;
|
||||
struct list_head idle_wait_groups;
|
||||
u32 num_idle_wait_grps;
|
||||
struct workqueue_struct *sync_update_wq;
|
||||
struct workqueue_struct *sync_update_wq_high_prio;
|
||||
struct workqueue_struct *sync_update_wq_normal_prio;
|
||||
struct work_struct sync_update_work;
|
||||
u32 ngrp_to_schedule;
|
||||
struct kbase_csf_ctx_heap_reclaim_info heap_info;
|
||||
|
|
@ -844,6 +865,11 @@ struct kbase_csf_user_reg_context {
|
|||
* @wq: Dedicated workqueue to process work items corresponding
|
||||
* to the OoM events raised for chunked tiler heaps being
|
||||
* used by GPU command queues, and progress timeout events.
|
||||
* @kcpu_wq_high_prio: High-priority work queue to process KCPU commands for
|
||||
* all queues in this context. This WQ would be used if
|
||||
* the context is prioritised.
|
||||
* @kcpu_wq_normal_prio: Similar to kcpu_wq_high_prio, but this WQ would be
|
||||
* used if the context is not prioritised.
|
||||
* @link: Link to this csf context in the 'runnable_kctxs' list of
|
||||
* the scheduler instance
|
||||
* @sched: Object representing the scheduler's context
|
||||
|
|
@ -862,6 +888,8 @@ struct kbase_csf_context {
|
|||
struct kbase_csf_event event;
|
||||
struct kbase_csf_tiler_heap_context tiler_heaps;
|
||||
struct workqueue_struct *wq;
|
||||
struct workqueue_struct *kcpu_wq_high_prio;
|
||||
struct workqueue_struct *kcpu_wq_normal_prio;
|
||||
struct list_head link;
|
||||
struct kbase_csf_scheduler_context sched;
|
||||
struct kbase_csf_cpu_queue_context cpu_queue;
|
||||
|
|
@ -1069,6 +1097,9 @@ struct kbase_csf_mcu_shared_regions {
|
|||
* protected mode execution compared to other such
|
||||
* groups. It is updated on every tick/tock.
|
||||
* @interrupt_lock is used to serialize the access.
|
||||
* @csg_scan_sched_count: Scheduling action counter used to assign the sched_act_seq_num
|
||||
* for each group added to Scheduler's schedulable list in a
|
||||
* tick/tock.
|
||||
* @protm_enter_time: GPU protected mode enter time.
|
||||
* @reclaim_mgr: CSGs tiler heap manager object.
|
||||
* @mcu_regs_data: Scheduler MCU shared regions data for managing the
|
||||
|
|
@ -1118,6 +1149,7 @@ struct kbase_csf_scheduler {
|
|||
u32 pm_active_count;
|
||||
unsigned int csg_scheduling_period_ms;
|
||||
u32 tick_protm_pending_seq;
|
||||
u32 csg_scan_sched_count;
|
||||
ktime_t protm_enter_time;
|
||||
struct kbase_csf_sched_heap_reclaim_mgr reclaim_mgr;
|
||||
struct kbase_csf_mcu_shared_regions mcu_regs_data;
|
||||
|
|
@ -1201,6 +1233,8 @@ enum kbase_ipa_core_type {
|
|||
KBASE_IPA_CORE_TYPE_MEMSYS,
|
||||
KBASE_IPA_CORE_TYPE_TILER,
|
||||
KBASE_IPA_CORE_TYPE_SHADER,
|
||||
|
||||
/* Must be the last in the enum */
|
||||
KBASE_IPA_CORE_TYPE_NUM
|
||||
};
|
||||
|
||||
|
|
@ -1328,7 +1362,7 @@ struct kbase_ipa_control {
|
|||
* @num_pages: Number of entries in @phys and @pma (and length of the interface)
|
||||
* @num_pages_aligned: Same as @num_pages except for the case when @is_small_page
|
||||
* is false and @reuse_pages is false and therefore will be
|
||||
* aligned to NUM_4K_PAGES_IN_2MB_PAGE.
|
||||
* aligned to NUM_PAGES_IN_2MB_LARGE_PAGE.
|
||||
* @virtual: Starting GPU virtual address this interface is mapped at
|
||||
* @flags: bitmask of CSF_FIRMWARE_ENTRY_* conveying the interface attributes
|
||||
* @data_start: Offset into firmware image at which the interface data starts
|
||||
|
|
@ -1593,9 +1627,9 @@ struct kbase_csf_user_reg {
|
|||
* @mcu_core_pwroff_dur_count: The counterpart of the glb_pwroff timeout input
|
||||
* in interface required format, ready to be used
|
||||
* directly in the firmware.
|
||||
* @mcu_core_pwroff_dur_count_modifier: Update csffw_glb_req_cfg_pwroff_timer
|
||||
* to make the shr(10) modifier conditional
|
||||
* on new flag in GLB_PWROFF_TIMER_CONFIG
|
||||
* @mcu_core_pwroff_dur_count_no_modifier: Update csffw_glb_req_cfg_pwroff_timer
|
||||
* to make the shr(10) modifier conditional
|
||||
* on new flag in GLB_PWROFF_TIMER_CONFIG
|
||||
* @mcu_core_pwroff_reg_shadow: The actual value that has been programed into
|
||||
* the glb_pwoff register. This is separated from
|
||||
* the @p mcu_core_pwroff_dur_count as an update
|
||||
|
|
@ -1606,10 +1640,9 @@ struct kbase_csf_user_reg {
|
|||
* @gpu_idle_dur_count: The counterpart of the hysteresis time window in
|
||||
* interface required format, ready to be used
|
||||
* directly in the firmware.
|
||||
* @gpu_idle_dur_count_modifier: Update csffw_glb_req_idle_enable to make the shr(10)
|
||||
* modifier conditional on the new flag
|
||||
* in GLB_IDLE_TIMER_CONFIG.
|
||||
* @fw_timeout_ms: Timeout value (in milliseconds) used when waiting
|
||||
* @gpu_idle_dur_count_no_modifier: Update csffw_glb_req_idle_enable to make the shr(10)
|
||||
* modifier conditional on the new flag
|
||||
* in GLB_IDLE_TIMER_CONFIG.
|
||||
* for any request sent to the firmware.
|
||||
* @hwcnt: Contain members required for handling the dump of
|
||||
* HW counters.
|
||||
|
|
@ -1656,14 +1689,13 @@ struct kbase_csf_device {
|
|||
bool glb_init_request_pending;
|
||||
struct work_struct fw_error_work;
|
||||
struct kbase_ipa_control ipa_control;
|
||||
u32 mcu_core_pwroff_dur_ns;
|
||||
u64 mcu_core_pwroff_dur_ns;
|
||||
u32 mcu_core_pwroff_dur_count;
|
||||
u32 mcu_core_pwroff_dur_count_modifier;
|
||||
u32 mcu_core_pwroff_dur_count_no_modifier;
|
||||
u32 mcu_core_pwroff_reg_shadow;
|
||||
u32 gpu_idle_hysteresis_ns;
|
||||
u64 gpu_idle_hysteresis_ns;
|
||||
u32 gpu_idle_dur_count;
|
||||
u32 gpu_idle_dur_count_modifier;
|
||||
unsigned int fw_timeout_ms;
|
||||
u32 gpu_idle_dur_count_no_modifier;
|
||||
struct kbase_csf_hwcnt hwcnt;
|
||||
struct kbase_csf_mcu_fw fw;
|
||||
struct kbase_csf_firmware_log fw_log;
|
||||
|
|
@ -1699,7 +1731,7 @@ struct kbase_csf_device {
|
|||
* @current_setup: Stores the MMU configuration for this address space.
|
||||
*/
|
||||
struct kbase_as {
|
||||
int number;
|
||||
unsigned int number;
|
||||
struct workqueue_struct *pf_wq;
|
||||
struct work_struct work_pagefault;
|
||||
struct work_struct work_busfault;
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@ static unsigned int csf_firmware_boot_timeout_ms;
|
|||
module_param(csf_firmware_boot_timeout_ms, uint, 0444);
|
||||
MODULE_PARM_DESC(csf_firmware_boot_timeout_ms, "Maximum time to wait for firmware to boot.");
|
||||
|
||||
|
||||
#ifdef CONFIG_MALI_DEBUG
|
||||
/* Makes Driver wait indefinitely for an acknowledgment for the different
|
||||
* requests it sends to firmware. Otherwise the timeouts interfere with the
|
||||
|
|
@ -110,8 +111,6 @@ MODULE_PARM_DESC(fw_debug, "Enables effective use of a debugger for debugging fi
|
|||
#define BUILD_INFO_GIT_DIRTY_LEN (1U)
|
||||
#define BUILD_INFO_GIT_SHA_PATTERN "git_sha: "
|
||||
|
||||
#define CSF_MAX_FW_STOP_LOOPS (100000)
|
||||
|
||||
#define CSF_GLB_REQ_CFG_MASK \
|
||||
(GLB_REQ_CFG_ALLOC_EN_MASK | GLB_REQ_CFG_PROGRESS_TIMER_MASK | \
|
||||
GLB_REQ_CFG_PWROFF_TIMER_MASK | GLB_REQ_IDLE_ENABLE_MASK)
|
||||
|
|
@ -208,17 +207,6 @@ static int setup_shared_iface_static_region(struct kbase_device *kbdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int wait_mcu_status_value(struct kbase_device *kbdev, u32 val)
|
||||
{
|
||||
u32 max_loops = CSF_MAX_FW_STOP_LOOPS;
|
||||
|
||||
/* wait for the MCU_STATUS register to reach the given status value */
|
||||
while (--max_loops && (kbase_reg_read32(kbdev, GPU_CONTROL_ENUM(MCU_STATUS)) != val))
|
||||
;
|
||||
|
||||
return (max_loops == 0) ? -1 : 0;
|
||||
}
|
||||
|
||||
|
||||
void kbase_csf_firmware_disable_mcu(struct kbase_device *kbdev)
|
||||
{
|
||||
|
|
@ -229,10 +217,15 @@ void kbase_csf_firmware_disable_mcu(struct kbase_device *kbdev)
|
|||
|
||||
static void wait_for_firmware_stop(struct kbase_device *kbdev)
|
||||
{
|
||||
if (wait_mcu_status_value(kbdev, MCU_CONTROL_REQ_DISABLE) < 0) {
|
||||
/* This error shall go away once MIDJM-2371 is closed */
|
||||
dev_err(kbdev->dev, "Firmware failed to stop");
|
||||
}
|
||||
u32 val;
|
||||
const u32 timeout_us =
|
||||
kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_STOP_TIMEOUT) * USEC_PER_MSEC;
|
||||
const int err = kbase_reg_poll32_timeout(kbdev, GPU_CONTROL_ENUM(MCU_STATUS), val,
|
||||
val == MCU_CONTROL_REQ_DISABLE, 0, timeout_us,
|
||||
false);
|
||||
|
||||
if (err)
|
||||
dev_err(kbdev->dev, "Firmware failed to stop, error no: %d", err);
|
||||
|
||||
KBASE_TLSTREAM_TL_KBASE_CSFFW_FW_OFF(kbdev, kbase_backend_get_cycle_cnt(kbdev));
|
||||
}
|
||||
|
|
@ -302,22 +295,15 @@ static void boot_csf_firmware(struct kbase_device *kbdev)
|
|||
*/
|
||||
static int wait_ready(struct kbase_device *kbdev)
|
||||
{
|
||||
const ktime_t wait_loop_start = ktime_get_raw();
|
||||
const u32 mmu_as_inactive_wait_time_ms = kbdev->mmu_or_gpu_cache_op_wait_time_ms;
|
||||
s64 diff;
|
||||
u32 val;
|
||||
const u32 timeout_us =
|
||||
kbase_get_timeout_ms(kbdev, MMU_AS_INACTIVE_WAIT_TIMEOUT) * USEC_PER_MSEC;
|
||||
const int err = kbase_reg_poll32_timeout(kbdev, MMU_AS_OFFSET(MCU_AS_NR, STATUS), val,
|
||||
!(val & AS_STATUS_AS_ACTIVE_EXT_MASK), 0,
|
||||
timeout_us, false);
|
||||
|
||||
do {
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < 1000; i++) {
|
||||
/* Wait for the MMU status to indicate there is no active command */
|
||||
if (!(kbase_reg_read32(kbdev, MMU_AS_OFFSET(MCU_AS_NR, STATUS)) &
|
||||
AS_STATUS_AS_ACTIVE_EXT_MASK))
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff = ktime_to_ms(ktime_sub(ktime_get_raw(), wait_loop_start));
|
||||
} while (diff < mmu_as_inactive_wait_time_ms);
|
||||
if (!err)
|
||||
return 0;
|
||||
|
||||
dev_err(kbdev->dev,
|
||||
"AS_ACTIVE bit stuck for MCU AS. Might be caused by unstable GPU clk/pwr or faulty system");
|
||||
|
|
@ -520,11 +506,11 @@ out:
|
|||
* parsed FW interface entry using large page(s) from protected memory.
|
||||
* If no appropriate entry is found it is set to NULL.
|
||||
* @num_pages: Number of pages requested.
|
||||
* @num_pages_aligned: This is an output parameter used to carry the number of 4KB pages
|
||||
* @num_pages_aligned: This is an output parameter used to carry the number of small pages
|
||||
* within the 2MB pages aligned allocation.
|
||||
* @is_small_page: This is an output flag used to select between the small and large page
|
||||
* to be used for the FW entry allocation.
|
||||
* @force_small_page: Use 4kB pages to allocate memory needed for FW loading
|
||||
* @force_small_page: Use small pages to allocate memory needed for FW loading
|
||||
*
|
||||
* Go through all the already initialized interfaces and find if a previously
|
||||
* allocated large page can be used to store contents of new FW interface entry.
|
||||
|
|
@ -559,16 +545,16 @@ static inline bool entry_find_large_page_to_reuse(struct kbase_device *kbdev,
|
|||
* then use 2MB page(s) for it.
|
||||
*/
|
||||
if (!(virtual_start & (SZ_2M - 1))) {
|
||||
*num_pages_aligned = round_up(*num_pages_aligned, NUM_4K_PAGES_IN_2MB_PAGE);
|
||||
*num_pages_aligned = round_up(*num_pages_aligned, NUM_PAGES_IN_2MB_LARGE_PAGE);
|
||||
*is_small_page = false;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* If the section doesn't lie within the same 2MB aligned boundary,
|
||||
* then use 4KB pages as it would be complicated to use a 2MB page
|
||||
* then use small pages as it would be complicated to use a 2MB page
|
||||
* for such section.
|
||||
*/
|
||||
if ((virtual_start & ~(SZ_2M - 1)) != (virtual_end & ~(SZ_2M - 1)))
|
||||
if ((virtual_start & ~(SZ_2M - 1UL)) != (virtual_end & ~(SZ_2M - 1UL)))
|
||||
goto out;
|
||||
|
||||
/* Find the nearest 2MB aligned section which comes before the current
|
||||
|
|
@ -599,7 +585,7 @@ static inline bool entry_find_large_page_to_reuse(struct kbase_device *kbdev,
|
|||
*phys = &target_interface->phys[page_index];
|
||||
|
||||
if (target_interface->pma)
|
||||
*pma = &target_interface->pma[page_index / NUM_4K_PAGES_IN_2MB_PAGE];
|
||||
*pma = &target_interface->pma[page_index / NUM_PAGES_IN_2MB_LARGE_PAGE];
|
||||
|
||||
*is_small_page = false;
|
||||
reuse_large_page = true;
|
||||
|
|
@ -1520,7 +1506,7 @@ static void handle_internal_firmware_fatal(struct kbase_device *const kbdev)
|
|||
* active address space and retain its refcount.
|
||||
*/
|
||||
spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
|
||||
kctx = kbase_ctx_sched_as_to_ctx_nolock(kbdev, as);
|
||||
kctx = kbase_ctx_sched_as_to_ctx_nolock(kbdev, (size_t)as);
|
||||
|
||||
if (kctx) {
|
||||
kbase_ctx_sched_retain_ctx_refcount(kctx);
|
||||
|
|
@ -1597,7 +1583,8 @@ static int wait_for_global_request_with_timeout(struct kbase_device *const kbdev
|
|||
|
||||
static int wait_for_global_request(struct kbase_device *const kbdev, u32 const req_mask)
|
||||
{
|
||||
return wait_for_global_request_with_timeout(kbdev, req_mask, kbdev->csf.fw_timeout_ms);
|
||||
return wait_for_global_request_with_timeout(
|
||||
kbdev, req_mask, kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT));
|
||||
}
|
||||
|
||||
static void set_global_request(const struct kbase_csf_global_iface *const global_iface,
|
||||
|
|
@ -1635,7 +1622,7 @@ static void set_shader_poweroff_timer(struct kbase_device *const kbdev,
|
|||
kbase_csf_firmware_global_input(global_iface, GLB_PWROFF_TIMER, pwroff_reg);
|
||||
|
||||
kbase_csf_firmware_global_input_mask(global_iface, GLB_PWROFF_TIMER_CONFIG,
|
||||
kbdev->csf.mcu_core_pwroff_dur_count_modifier,
|
||||
kbdev->csf.mcu_core_pwroff_dur_count_no_modifier,
|
||||
GLB_PWROFF_TIMER_CONFIG_NO_MODIFIER_MASK);
|
||||
|
||||
set_global_request(global_iface, GLB_REQ_CFG_PWROFF_TIMER_MASK);
|
||||
|
|
@ -1665,7 +1652,7 @@ static void enable_gpu_idle_timer(struct kbase_device *const kbdev)
|
|||
kbdev->csf.gpu_idle_dur_count);
|
||||
|
||||
kbase_csf_firmware_global_input_mask(global_iface, GLB_IDLE_TIMER_CONFIG,
|
||||
kbdev->csf.gpu_idle_dur_count_modifier,
|
||||
kbdev->csf.gpu_idle_dur_count_no_modifier,
|
||||
GLB_IDLE_TIMER_CONFIG_NO_MODIFIER_MASK);
|
||||
|
||||
kbase_csf_firmware_global_input_mask(global_iface, GLB_REQ, GLB_REQ_REQ_IDLE_ENABLE,
|
||||
|
|
@ -1961,11 +1948,11 @@ void kbase_csf_firmware_reload_completed(struct kbase_device *kbdev)
|
|||
kbase_pm_update_state(kbdev);
|
||||
}
|
||||
|
||||
static u32 convert_dur_to_idle_count(struct kbase_device *kbdev, const u32 dur_ns, u32 *modifier)
|
||||
static u32 convert_dur_to_idle_count(struct kbase_device *kbdev, const u64 dur_ns, u32 *no_modifier)
|
||||
{
|
||||
#define HYSTERESIS_VAL_UNIT_SHIFT (10)
|
||||
/* Get the cntfreq_el0 value, which drives the SYSTEM_TIMESTAMP */
|
||||
u64 freq = arch_timer_get_cntfrq();
|
||||
u64 freq = kbase_arch_timer_get_cntfrq(kbdev);
|
||||
u64 dur_val = dur_ns;
|
||||
u32 cnt_val_u32, reg_val_u32;
|
||||
bool src_system_timestamp = freq > 0;
|
||||
|
|
@ -1988,10 +1975,10 @@ static u32 convert_dur_to_idle_count(struct kbase_device *kbdev, const u32 dur_n
|
|||
dur_val = dur_val * freq;
|
||||
dur_val = div_u64(dur_val, NSEC_PER_SEC);
|
||||
if (dur_val < S32_MAX) {
|
||||
*modifier = 1;
|
||||
*no_modifier = 1;
|
||||
} else {
|
||||
dur_val = dur_val >> HYSTERESIS_VAL_UNIT_SHIFT;
|
||||
*modifier = 0;
|
||||
*no_modifier = 0;
|
||||
}
|
||||
|
||||
/* Interface limits the value field to S32_MAX */
|
||||
|
|
@ -2006,24 +1993,24 @@ static u32 convert_dur_to_idle_count(struct kbase_device *kbdev, const u32 dur_n
|
|||
return reg_val_u32;
|
||||
}
|
||||
|
||||
u32 kbase_csf_firmware_get_gpu_idle_hysteresis_time(struct kbase_device *kbdev)
|
||||
u64 kbase_csf_firmware_get_gpu_idle_hysteresis_time(struct kbase_device *kbdev)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 dur;
|
||||
u64 dur_ns;
|
||||
|
||||
kbase_csf_scheduler_spin_lock(kbdev, &flags);
|
||||
dur = kbdev->csf.gpu_idle_hysteresis_ns;
|
||||
dur_ns = kbdev->csf.gpu_idle_hysteresis_ns;
|
||||
kbase_csf_scheduler_spin_unlock(kbdev, flags);
|
||||
|
||||
return dur;
|
||||
return dur_ns;
|
||||
}
|
||||
|
||||
u32 kbase_csf_firmware_set_gpu_idle_hysteresis_time(struct kbase_device *kbdev, u32 dur_ns)
|
||||
u32 kbase_csf_firmware_set_gpu_idle_hysteresis_time(struct kbase_device *kbdev, u64 dur_ns)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 modifier = 0;
|
||||
u32 no_modifier = 0;
|
||||
|
||||
const u32 hysteresis_val = convert_dur_to_idle_count(kbdev, dur_ns, &modifier);
|
||||
const u32 hysteresis_val = convert_dur_to_idle_count(kbdev, dur_ns, &no_modifier);
|
||||
|
||||
/* The 'fw_load_lock' is taken to synchronize against the deferred
|
||||
* loading of FW, where the idle timer will be enabled.
|
||||
|
|
@ -2033,7 +2020,7 @@ u32 kbase_csf_firmware_set_gpu_idle_hysteresis_time(struct kbase_device *kbdev,
|
|||
kbase_csf_scheduler_spin_lock(kbdev, &flags);
|
||||
kbdev->csf.gpu_idle_hysteresis_ns = dur_ns;
|
||||
kbdev->csf.gpu_idle_dur_count = hysteresis_val;
|
||||
kbdev->csf.gpu_idle_dur_count_modifier = modifier;
|
||||
kbdev->csf.gpu_idle_dur_count_no_modifier = no_modifier;
|
||||
kbase_csf_scheduler_spin_unlock(kbdev, flags);
|
||||
mutex_unlock(&kbdev->fw_load_lock);
|
||||
goto end;
|
||||
|
|
@ -2073,7 +2060,7 @@ u32 kbase_csf_firmware_set_gpu_idle_hysteresis_time(struct kbase_device *kbdev,
|
|||
kbase_csf_scheduler_spin_lock(kbdev, &flags);
|
||||
kbdev->csf.gpu_idle_hysteresis_ns = dur_ns;
|
||||
kbdev->csf.gpu_idle_dur_count = hysteresis_val;
|
||||
kbdev->csf.gpu_idle_dur_count_modifier = modifier;
|
||||
kbdev->csf.gpu_idle_dur_count_no_modifier = no_modifier;
|
||||
kbase_csf_firmware_enable_gpu_idle_timer(kbdev);
|
||||
kbase_csf_scheduler_spin_unlock(kbdev, flags);
|
||||
wait_for_global_request(kbdev, GLB_REQ_IDLE_ENABLE_MASK);
|
||||
|
|
@ -2086,12 +2073,13 @@ end:
|
|||
|
||||
return hysteresis_val;
|
||||
}
|
||||
KBASE_EXPORT_TEST_API(kbase_csf_firmware_set_gpu_idle_hysteresis_time);
|
||||
|
||||
static u32 convert_dur_to_core_pwroff_count(struct kbase_device *kbdev, const u32 dur_ns,
|
||||
u32 *modifier)
|
||||
static u32 convert_dur_to_core_pwroff_count(struct kbase_device *kbdev, const u64 dur_ns,
|
||||
u32 *no_modifier)
|
||||
{
|
||||
/* Get the cntfreq_el0 value, which drives the SYSTEM_TIMESTAMP */
|
||||
u64 freq = arch_timer_get_cntfrq();
|
||||
u64 freq = kbase_arch_timer_get_cntfrq(kbdev);
|
||||
u64 dur_val = dur_ns;
|
||||
u32 cnt_val_u32, reg_val_u32;
|
||||
bool src_system_timestamp = freq > 0;
|
||||
|
|
@ -2117,10 +2105,10 @@ static u32 convert_dur_to_core_pwroff_count(struct kbase_device *kbdev, const u3
|
|||
dur_val = dur_val * freq;
|
||||
dur_val = div_u64(dur_val, NSEC_PER_SEC);
|
||||
if (dur_val < S32_MAX) {
|
||||
*modifier = 1;
|
||||
*no_modifier = 1;
|
||||
} else {
|
||||
dur_val = dur_val >> HYSTERESIS_VAL_UNIT_SHIFT;
|
||||
*modifier = 0;
|
||||
*no_modifier = 0;
|
||||
}
|
||||
|
||||
if (dur_val == 0 && !always_on) {
|
||||
|
|
@ -2143,29 +2131,29 @@ static u32 convert_dur_to_core_pwroff_count(struct kbase_device *kbdev, const u3
|
|||
return reg_val_u32;
|
||||
}
|
||||
|
||||
u32 kbase_csf_firmware_get_mcu_core_pwroff_time(struct kbase_device *kbdev)
|
||||
u64 kbase_csf_firmware_get_mcu_core_pwroff_time(struct kbase_device *kbdev)
|
||||
{
|
||||
u32 pwroff;
|
||||
u64 pwroff_ns;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
|
||||
pwroff = kbdev->csf.mcu_core_pwroff_dur_ns;
|
||||
pwroff_ns = kbdev->csf.mcu_core_pwroff_dur_ns;
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
|
||||
return pwroff;
|
||||
return pwroff_ns;
|
||||
}
|
||||
|
||||
u32 kbase_csf_firmware_set_mcu_core_pwroff_time(struct kbase_device *kbdev, u32 dur_ns)
|
||||
u32 kbase_csf_firmware_set_mcu_core_pwroff_time(struct kbase_device *kbdev, u64 dur_ns)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 modifier = 0;
|
||||
u32 no_modifier = 0;
|
||||
|
||||
const u32 pwroff = convert_dur_to_core_pwroff_count(kbdev, dur_ns, &modifier);
|
||||
const u32 pwroff = convert_dur_to_core_pwroff_count(kbdev, dur_ns, &no_modifier);
|
||||
|
||||
spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
|
||||
kbdev->csf.mcu_core_pwroff_dur_ns = dur_ns;
|
||||
kbdev->csf.mcu_core_pwroff_dur_count = pwroff;
|
||||
kbdev->csf.mcu_core_pwroff_dur_count_modifier = modifier;
|
||||
kbdev->csf.mcu_core_pwroff_dur_count_no_modifier = no_modifier;
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
|
||||
dev_dbg(kbdev->dev, "MCU shader Core Poweroff input update: 0x%.8x", pwroff);
|
||||
|
|
@ -2178,6 +2166,34 @@ u32 kbase_csf_firmware_reset_mcu_core_pwroff_time(struct kbase_device *kbdev)
|
|||
return kbase_csf_firmware_set_mcu_core_pwroff_time(kbdev, DEFAULT_GLB_PWROFF_TIMEOUT_NS);
|
||||
}
|
||||
|
||||
/**
|
||||
* kbase_csf_get_iterator_trace_enable - Parsing the iterator_trace enable firstly from
|
||||
* the module parameter, and then from device-tree.
|
||||
* @kbdev: Kernel base device pointer
|
||||
*
|
||||
* Return: true on enabled, otherwise false.
|
||||
*/
|
||||
static bool kbase_csf_get_iterator_trace_enable(struct kbase_device *kbdev)
|
||||
{
|
||||
const void *dt_iter_trace_param;
|
||||
unsigned int val;
|
||||
|
||||
|
||||
/* check device tree for iterator trace enable property and
|
||||
* fallback to "iter_trace_enable" if not found and try again
|
||||
*/
|
||||
dt_iter_trace_param = of_get_property(kbdev->dev->of_node, "iter-trace-enable", NULL);
|
||||
|
||||
if (!dt_iter_trace_param)
|
||||
dt_iter_trace_param =
|
||||
of_get_property(kbdev->dev->of_node, "iter_trace_enable", NULL);
|
||||
|
||||
val = (dt_iter_trace_param) ? be32_to_cpup(dt_iter_trace_param) : 0;
|
||||
dev_dbg(kbdev->dev, "Iterator trace enable device-tree config value: %u", val);
|
||||
|
||||
return (val != 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* kbase_device_csf_iterator_trace_init - Send request to enable iterator
|
||||
* trace port.
|
||||
|
|
@ -2188,50 +2204,35 @@ u32 kbase_csf_firmware_reset_mcu_core_pwroff_time(struct kbase_device *kbdev)
|
|||
*/
|
||||
static int kbase_device_csf_iterator_trace_init(struct kbase_device *kbdev)
|
||||
{
|
||||
/* Enable the iterator trace port if supported by the GPU.
|
||||
* It requires the GPU to have a nonzero "iter-trace-enable"
|
||||
* property in the device tree, and the FW must advertise
|
||||
* this feature in GLB_FEATURES.
|
||||
/* Enable the iterator trace port if supported by the GPU and is
|
||||
* configured to do so. The FW must advertise this feature in GLB_FEATURES.
|
||||
*/
|
||||
if (kbdev->pm.backend.gpu_powered) {
|
||||
/* check device tree for iterator trace enable property
|
||||
* and fallback to "iter_trace_enable" if it is not found
|
||||
*/
|
||||
const void *iter_trace_param =
|
||||
of_get_property(kbdev->dev->of_node, "iter-trace-enable", NULL);
|
||||
|
||||
const struct kbase_csf_global_iface *iface = &kbdev->csf.global_iface;
|
||||
bool dev_support_iter_trace = iface->features &
|
||||
GLB_FEATURES_ITER_TRACE_SUPPORTED_MASK;
|
||||
|
||||
if (!iter_trace_param)
|
||||
iter_trace_param =
|
||||
of_get_property(kbdev->dev->of_node, "iter_trace_enable", NULL);
|
||||
dev_dbg(kbdev->dev, "Device supporting iterator trace: %s\n",
|
||||
dev_support_iter_trace ? "true" : "false");
|
||||
if (dev_support_iter_trace && kbase_csf_get_iterator_trace_enable(kbdev)) {
|
||||
long ack_timeout = kbase_csf_timeout_in_jiffies(
|
||||
kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT));
|
||||
|
||||
if (iter_trace_param) {
|
||||
u32 iter_trace_value = be32_to_cpup(iter_trace_param);
|
||||
/* write enable request to global input */
|
||||
kbase_csf_firmware_global_input_mask(iface, GLB_REQ,
|
||||
GLB_REQ_ITER_TRACE_ENABLE_MASK,
|
||||
GLB_REQ_ITER_TRACE_ENABLE_MASK);
|
||||
/* Ring global doorbell */
|
||||
kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
|
||||
|
||||
if ((iface->features & GLB_FEATURES_ITER_TRACE_SUPPORTED_MASK) &&
|
||||
iter_trace_value) {
|
||||
long ack_timeout;
|
||||
ack_timeout = wait_event_timeout(
|
||||
kbdev->csf.event_wait,
|
||||
!((kbase_csf_firmware_global_input_read(iface, GLB_REQ) ^
|
||||
kbase_csf_firmware_global_output(iface, GLB_ACK)) &
|
||||
GLB_REQ_ITER_TRACE_ENABLE_MASK),
|
||||
ack_timeout);
|
||||
|
||||
ack_timeout = kbase_csf_timeout_in_jiffies(
|
||||
kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT));
|
||||
|
||||
/* write enable request to global input */
|
||||
kbase_csf_firmware_global_input_mask(
|
||||
iface, GLB_REQ, GLB_REQ_ITER_TRACE_ENABLE_MASK,
|
||||
GLB_REQ_ITER_TRACE_ENABLE_MASK);
|
||||
/* Ring global doorbell */
|
||||
kbase_csf_ring_doorbell(kbdev, CSF_KERNEL_DOORBELL_NR);
|
||||
|
||||
ack_timeout = wait_event_timeout(
|
||||
kbdev->csf.event_wait,
|
||||
!((kbase_csf_firmware_global_input_read(iface, GLB_REQ) ^
|
||||
kbase_csf_firmware_global_output(iface, GLB_ACK)) &
|
||||
GLB_REQ_ITER_TRACE_ENABLE_MASK),
|
||||
ack_timeout);
|
||||
|
||||
return ack_timeout ? 0 : -EINVAL;
|
||||
}
|
||||
return ack_timeout ? 0 : -EINVAL;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -2241,8 +2242,6 @@ int kbase_csf_firmware_early_init(struct kbase_device *kbdev)
|
|||
{
|
||||
init_waitqueue_head(&kbdev->csf.event_wait);
|
||||
|
||||
kbdev->csf.fw_timeout_ms = kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT);
|
||||
|
||||
kbase_csf_firmware_reset_mcu_core_pwroff_time(kbdev);
|
||||
INIT_LIST_HEAD(&kbdev->csf.firmware_interfaces);
|
||||
INIT_LIST_HEAD(&kbdev->csf.firmware_config);
|
||||
|
|
@ -2270,7 +2269,7 @@ void kbase_csf_firmware_early_term(struct kbase_device *kbdev)
|
|||
|
||||
int kbase_csf_firmware_late_init(struct kbase_device *kbdev)
|
||||
{
|
||||
u32 modifier = 0;
|
||||
u32 no_modifier = 0;
|
||||
|
||||
kbdev->csf.gpu_idle_hysteresis_ns = FIRMWARE_IDLE_HYSTERESIS_TIME_NS;
|
||||
|
||||
|
|
@ -2280,8 +2279,8 @@ int kbase_csf_firmware_late_init(struct kbase_device *kbdev)
|
|||
#endif
|
||||
WARN_ON(!kbdev->csf.gpu_idle_hysteresis_ns);
|
||||
kbdev->csf.gpu_idle_dur_count =
|
||||
convert_dur_to_idle_count(kbdev, kbdev->csf.gpu_idle_hysteresis_ns, &modifier);
|
||||
kbdev->csf.gpu_idle_dur_count_modifier = modifier;
|
||||
convert_dur_to_idle_count(kbdev, kbdev->csf.gpu_idle_hysteresis_ns, &no_modifier);
|
||||
kbdev->csf.gpu_idle_dur_count_no_modifier = no_modifier;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -2694,7 +2693,9 @@ int kbase_csf_firmware_mcu_register_read(struct kbase_device *const kbdev, u32 c
|
|||
int kbase_csf_firmware_mcu_register_poll(struct kbase_device *const kbdev, u32 const reg_addr,
|
||||
u32 const val_mask, u32 const reg_val)
|
||||
{
|
||||
unsigned long remaining = kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms) + jiffies;
|
||||
unsigned long remaining =
|
||||
kbase_csf_timeout_in_jiffies(kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT)) +
|
||||
jiffies;
|
||||
u32 read_val;
|
||||
|
||||
dev_dbg(kbdev->dev, "p: reg %08x val %08x mask %08x", reg_addr, reg_val, val_mask);
|
||||
|
|
@ -2922,6 +2923,12 @@ int kbase_csf_trigger_firmware_config_update(struct kbase_device *kbdev)
|
|||
unsigned long flags;
|
||||
int err = 0;
|
||||
|
||||
err = kbase_reset_gpu_prevent_and_wait(kbdev);
|
||||
if (err) {
|
||||
dev_warn(kbdev->dev, "Unsuccessful GPU reset detected when updating FW config");
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Ensure GPU is powered-up until we complete config update.*/
|
||||
kbase_csf_scheduler_pm_active(kbdev);
|
||||
err = kbase_csf_scheduler_killable_wait_mcu_active(kbdev);
|
||||
|
|
@ -2944,6 +2951,7 @@ int kbase_csf_trigger_firmware_config_update(struct kbase_device *kbdev)
|
|||
|
||||
exit:
|
||||
kbase_csf_scheduler_pm_idle(kbdev);
|
||||
kbase_reset_gpu_allow(kbdev);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
#include "device/mali_kbase_device.h"
|
||||
#include <csf/mali_kbase_csf_registers.h>
|
||||
#include <hw_access/mali_kbase_hw_access_regmap.h>
|
||||
#include <uapi/gpu/arm/midgard/gpu/mali_kbase_gpu_regmap.h>
|
||||
|
||||
/*
|
||||
|
|
@ -770,9 +771,9 @@ extern bool fw_debug;
|
|||
static inline long kbase_csf_timeout_in_jiffies(const unsigned int msecs)
|
||||
{
|
||||
#ifdef CONFIG_MALI_DEBUG
|
||||
return (fw_debug ? MAX_SCHEDULE_TIMEOUT : msecs_to_jiffies(msecs));
|
||||
return (fw_debug ? MAX_SCHEDULE_TIMEOUT : (long)msecs_to_jiffies(msecs));
|
||||
#else
|
||||
return msecs_to_jiffies(msecs);
|
||||
return (long)msecs_to_jiffies(msecs);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -807,15 +808,15 @@ void kbase_csf_firmware_disable_gpu_idle_timer(struct kbase_device *kbdev);
|
|||
*
|
||||
* Return: the internally recorded hysteresis (nominal) value.
|
||||
*/
|
||||
u32 kbase_csf_firmware_get_gpu_idle_hysteresis_time(struct kbase_device *kbdev);
|
||||
u64 kbase_csf_firmware_get_gpu_idle_hysteresis_time(struct kbase_device *kbdev);
|
||||
|
||||
/**
|
||||
* kbase_csf_firmware_set_gpu_idle_hysteresis_time - Set the firmware GPU idle
|
||||
* detection hysteresis duration
|
||||
*
|
||||
* @kbdev: Instance of a GPU platform device that implements a CSF interface.
|
||||
* @dur: The duration value (unit: milliseconds) for the configuring
|
||||
* hysteresis field for GPU idle detection
|
||||
* @kbdev: Instance of a GPU platform device that implements a CSF interface.
|
||||
* @dur_ns: The duration value (unit: nanoseconds) for the configuring
|
||||
* hysteresis field for GPU idle detection
|
||||
*
|
||||
* The supplied value will be recorded internally without any change. But the
|
||||
* actual field value will be subject to hysteresis source frequency scaling
|
||||
|
|
@ -827,7 +828,7 @@ u32 kbase_csf_firmware_get_gpu_idle_hysteresis_time(struct kbase_device *kbdev);
|
|||
*
|
||||
* Return: the actual internally configured hysteresis field value.
|
||||
*/
|
||||
u32 kbase_csf_firmware_set_gpu_idle_hysteresis_time(struct kbase_device *kbdev, u32 dur);
|
||||
u32 kbase_csf_firmware_set_gpu_idle_hysteresis_time(struct kbase_device *kbdev, u64 dur_ns);
|
||||
|
||||
/**
|
||||
* kbase_csf_firmware_get_mcu_core_pwroff_time - Get the MCU shader Core power-off
|
||||
|
|
@ -838,14 +839,14 @@ u32 kbase_csf_firmware_set_gpu_idle_hysteresis_time(struct kbase_device *kbdev,
|
|||
* Return: the internally recorded MCU shader Core power-off (nominal) timeout value. The unit
|
||||
* of the value is in micro-seconds.
|
||||
*/
|
||||
u32 kbase_csf_firmware_get_mcu_core_pwroff_time(struct kbase_device *kbdev);
|
||||
u64 kbase_csf_firmware_get_mcu_core_pwroff_time(struct kbase_device *kbdev);
|
||||
|
||||
/**
|
||||
* kbase_csf_firmware_set_mcu_core_pwroff_time - Set the MCU shader Core power-off
|
||||
* time value
|
||||
*
|
||||
* @kbdev: Instance of a GPU platform device that implements a CSF interface.
|
||||
* @dur: The duration value (unit: micro-seconds) for configuring MCU
|
||||
* @dur_ns: The duration value (unit: nanoseconds) for configuring MCU
|
||||
* core power-off timer, when the shader cores' power
|
||||
* transitions are delegated to the MCU (normal operational
|
||||
* mode)
|
||||
|
|
@ -864,7 +865,7 @@ u32 kbase_csf_firmware_get_mcu_core_pwroff_time(struct kbase_device *kbdev);
|
|||
* Return: the actual internal core power-off timer value in register defined
|
||||
* format.
|
||||
*/
|
||||
u32 kbase_csf_firmware_set_mcu_core_pwroff_time(struct kbase_device *kbdev, u32 dur);
|
||||
u32 kbase_csf_firmware_set_mcu_core_pwroff_time(struct kbase_device *kbdev, u64 dur_ns);
|
||||
|
||||
/**
|
||||
* kbase_csf_firmware_reset_mcu_core_pwroff_time - Reset the MCU shader Core power-off
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@ static ssize_t store_fw_cfg(struct kobject *kobj, struct attribute *attr, const
|
|||
cur_val = config->cur_val;
|
||||
if (cur_val == val) {
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
/* If configuration update cannot be performed with
|
||||
|
|
@ -209,7 +209,7 @@ static ssize_t store_fw_cfg(struct kobject *kobj, struct attribute *attr, const
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
static const struct sysfs_ops fw_cfg_ops = {
|
||||
|
|
@ -373,17 +373,17 @@ int kbase_csf_firmware_cfg_fw_wa_init(struct kbase_device *kbdev)
|
|||
if (entry_count == -EINVAL || entry_count == -ENODATA)
|
||||
return 0;
|
||||
|
||||
entry_bytes = entry_count * sizeof(u32);
|
||||
entry_bytes = (size_t)entry_count * sizeof(u32);
|
||||
kbdev->csf.quirks_ext = kzalloc(entry_bytes, GFP_KERNEL);
|
||||
if (!kbdev->csf.quirks_ext)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = of_property_read_u32_array(kbdev->dev->of_node, "quirks-ext", kbdev->csf.quirks_ext,
|
||||
entry_count);
|
||||
(size_t)entry_count);
|
||||
|
||||
if (ret == -EINVAL)
|
||||
ret = of_property_read_u32_array(kbdev->dev->of_node, "quirks_ext",
|
||||
kbdev->csf.quirks_ext, entry_count);
|
||||
kbdev->csf.quirks_ext, (size_t)entry_count);
|
||||
|
||||
if (ret == -EINVAL || ret == -ENODATA) {
|
||||
/* This is unexpected since the property is already accessed for counting the number
|
||||
|
|
|
|||
|
|
@ -144,7 +144,7 @@ static ssize_t kbasep_csf_firmware_log_debugfs_read(struct file *file, char __us
|
|||
}
|
||||
|
||||
*ppos += n_read;
|
||||
ret = n_read;
|
||||
ret = (int)n_read;
|
||||
|
||||
out:
|
||||
atomic_set(&fw_log->busy, 0);
|
||||
|
|
@ -178,8 +178,9 @@ static int kbase_csf_firmware_log_mode_write(void *data, u64 val)
|
|||
break;
|
||||
case KBASE_CSF_FIRMWARE_LOG_MODE_AUTO_PRINT:
|
||||
case KBASE_CSF_FIRMWARE_LOG_MODE_AUTO_DISCARD:
|
||||
schedule_delayed_work(&fw_log->poll_work,
|
||||
msecs_to_jiffies(atomic_read(&fw_log->poll_period_ms)));
|
||||
schedule_delayed_work(
|
||||
&fw_log->poll_work,
|
||||
msecs_to_jiffies((unsigned int)atomic_read(&fw_log->poll_period_ms)));
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
|
|
@ -198,7 +199,7 @@ static int kbase_csf_firmware_log_poll_period_read(void *data, u64 *val)
|
|||
struct kbase_device *kbdev = (struct kbase_device *)data;
|
||||
struct kbase_csf_firmware_log *fw_log = &kbdev->csf.fw_log;
|
||||
|
||||
*val = atomic_read(&fw_log->poll_period_ms);
|
||||
*val = (u64)atomic_read(&fw_log->poll_period_ms);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -263,7 +264,7 @@ static void kbase_csf_firmware_log_poll(struct work_struct *work)
|
|||
return;
|
||||
|
||||
schedule_delayed_work(&fw_log->poll_work,
|
||||
msecs_to_jiffies(atomic_read(&fw_log->poll_period_ms)));
|
||||
msecs_to_jiffies((unsigned int)atomic_read(&fw_log->poll_period_ms)));
|
||||
}
|
||||
|
||||
int kbase_csf_firmware_log_init(struct kbase_device *kbdev)
|
||||
|
|
@ -382,7 +383,7 @@ void kbase_csf_firmware_log_dump_buffer(struct kbase_device *kbdev)
|
|||
pend = p + read_size;
|
||||
p = buf;
|
||||
|
||||
while (p < pend && (pnewline = memchr(p, '\n', pend - p))) {
|
||||
while (p < pend && (pnewline = memchr(p, '\n', (size_t)(pend - p)))) {
|
||||
/* Null-terminate the string */
|
||||
*pnewline = 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -533,9 +533,9 @@ EXPORT_SYMBOL(kbase_csf_ring_doorbell);
|
|||
*/
|
||||
static void handle_internal_firmware_fatal(struct kbase_device *const kbdev)
|
||||
{
|
||||
int as;
|
||||
size_t as;
|
||||
|
||||
for (as = 0; as < kbdev->nr_hw_address_spaces; as++) {
|
||||
for (as = 0; as < (size_t)kbdev->nr_hw_address_spaces; as++) {
|
||||
unsigned long flags;
|
||||
struct kbase_context *kctx;
|
||||
struct kbase_fault fault;
|
||||
|
|
@ -604,7 +604,8 @@ static bool global_request_complete(struct kbase_device *const kbdev, u32 const
|
|||
|
||||
static int wait_for_global_request(struct kbase_device *const kbdev, u32 const req_mask)
|
||||
{
|
||||
const long wait_timeout = kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
|
||||
const long wait_timeout =
|
||||
kbase_csf_timeout_in_jiffies(kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT));
|
||||
long remaining;
|
||||
int err = 0;
|
||||
|
||||
|
|
@ -893,12 +894,12 @@ void kbase_csf_firmware_reload_completed(struct kbase_device *kbdev)
|
|||
kbase_pm_update_state(kbdev);
|
||||
}
|
||||
|
||||
static u32 convert_dur_to_idle_count(struct kbase_device *kbdev, const u32 dur_ms, u32 *modifier)
|
||||
static u32 convert_dur_to_idle_count(struct kbase_device *kbdev, const u32 dur_ns, u32 *no_modifier)
|
||||
{
|
||||
#define HYSTERESIS_VAL_UNIT_SHIFT (10)
|
||||
/* Get the cntfreq_el0 value, which drives the SYSTEM_TIMESTAMP */
|
||||
u64 freq = arch_timer_get_cntfrq();
|
||||
u64 dur_val = dur_ms;
|
||||
u64 freq = kbase_arch_timer_get_cntfrq(kbdev);
|
||||
u64 dur_val = dur_ns;
|
||||
u32 cnt_val_u32, reg_val_u32;
|
||||
bool src_system_timestamp = freq > 0;
|
||||
|
||||
|
|
@ -916,45 +917,46 @@ static u32 convert_dur_to_idle_count(struct kbase_device *kbdev, const u32 dur_m
|
|||
"Can't get the timestamp frequency, use cycle counter format with firmware idle hysteresis!");
|
||||
}
|
||||
|
||||
/* Formula for dur_val = ((dur_ms/1000) * freq_HZ) >> 10) */
|
||||
dur_val = (dur_val * freq) >> HYSTERESIS_VAL_UNIT_SHIFT;
|
||||
dur_val = div_u64(dur_val, 1000);
|
||||
|
||||
*modifier = 0;
|
||||
/* Formula for dur_val = (dur/1e9) * freq_HZ) */
|
||||
dur_val = dur_val * freq;
|
||||
dur_val = div_u64(dur_val, NSEC_PER_SEC);
|
||||
if (dur_val < S32_MAX) {
|
||||
*no_modifier = 1;
|
||||
} else {
|
||||
dur_val = dur_val >> HYSTERESIS_VAL_UNIT_SHIFT;
|
||||
*no_modifier = 0;
|
||||
}
|
||||
|
||||
/* Interface limits the value field to S32_MAX */
|
||||
cnt_val_u32 = (dur_val > S32_MAX) ? S32_MAX : (u32)dur_val;
|
||||
|
||||
reg_val_u32 = GLB_IDLE_TIMER_TIMEOUT_SET(0, cnt_val_u32);
|
||||
/* add the source flag */
|
||||
if (src_system_timestamp)
|
||||
reg_val_u32 = GLB_IDLE_TIMER_TIMER_SOURCE_SET(
|
||||
reg_val_u32, GLB_IDLE_TIMER_TIMER_SOURCE_SYSTEM_TIMESTAMP);
|
||||
else
|
||||
reg_val_u32 = GLB_IDLE_TIMER_TIMER_SOURCE_SET(
|
||||
reg_val_u32, GLB_IDLE_TIMER_TIMER_SOURCE_GPU_COUNTER);
|
||||
reg_val_u32 = GLB_IDLE_TIMER_TIMER_SOURCE_SET(
|
||||
reg_val_u32, (src_system_timestamp ? GLB_IDLE_TIMER_TIMER_SOURCE_SYSTEM_TIMESTAMP :
|
||||
GLB_IDLE_TIMER_TIMER_SOURCE_GPU_COUNTER));
|
||||
|
||||
return reg_val_u32;
|
||||
}
|
||||
|
||||
u32 kbase_csf_firmware_get_gpu_idle_hysteresis_time(struct kbase_device *kbdev)
|
||||
u64 kbase_csf_firmware_get_gpu_idle_hysteresis_time(struct kbase_device *kbdev)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 dur;
|
||||
u64 dur_ns;
|
||||
|
||||
kbase_csf_scheduler_spin_lock(kbdev, &flags);
|
||||
dur = kbdev->csf.gpu_idle_hysteresis_ns;
|
||||
dur_ns = kbdev->csf.gpu_idle_hysteresis_ns;
|
||||
kbase_csf_scheduler_spin_unlock(kbdev, flags);
|
||||
|
||||
return dur;
|
||||
return dur_ns;
|
||||
}
|
||||
|
||||
u32 kbase_csf_firmware_set_gpu_idle_hysteresis_time(struct kbase_device *kbdev, u32 dur)
|
||||
u32 kbase_csf_firmware_set_gpu_idle_hysteresis_time(struct kbase_device *kbdev, u64 dur_ns)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 modifier = 0;
|
||||
u32 no_modifier = 0;
|
||||
|
||||
const u32 hysteresis_val = convert_dur_to_idle_count(kbdev, dur, &modifier);
|
||||
const u32 hysteresis_val = convert_dur_to_idle_count(kbdev, dur_ns, &no_modifier);
|
||||
|
||||
/* The 'fw_load_lock' is taken to synchronize against the deferred
|
||||
* loading of FW, where the idle timer will be enabled.
|
||||
|
|
@ -962,9 +964,9 @@ u32 kbase_csf_firmware_set_gpu_idle_hysteresis_time(struct kbase_device *kbdev,
|
|||
mutex_lock(&kbdev->fw_load_lock);
|
||||
if (unlikely(!kbdev->csf.firmware_inited)) {
|
||||
kbase_csf_scheduler_spin_lock(kbdev, &flags);
|
||||
kbdev->csf.gpu_idle_hysteresis_ns = dur;
|
||||
kbdev->csf.gpu_idle_hysteresis_ns = dur_ns;
|
||||
kbdev->csf.gpu_idle_dur_count = hysteresis_val;
|
||||
kbdev->csf.gpu_idle_dur_count_modifier = modifier;
|
||||
kbdev->csf.gpu_idle_dur_count_no_modifier = no_modifier;
|
||||
kbase_csf_scheduler_spin_unlock(kbdev, flags);
|
||||
mutex_unlock(&kbdev->fw_load_lock);
|
||||
goto end;
|
||||
|
|
@ -1002,9 +1004,9 @@ u32 kbase_csf_firmware_set_gpu_idle_hysteresis_time(struct kbase_device *kbdev,
|
|||
wait_for_global_request(kbdev, GLB_REQ_IDLE_DISABLE_MASK);
|
||||
|
||||
kbase_csf_scheduler_spin_lock(kbdev, &flags);
|
||||
kbdev->csf.gpu_idle_hysteresis_ns = dur;
|
||||
kbdev->csf.gpu_idle_hysteresis_ns = dur_ns;
|
||||
kbdev->csf.gpu_idle_dur_count = hysteresis_val;
|
||||
kbdev->csf.gpu_idle_dur_count_modifier = modifier;
|
||||
kbdev->csf.gpu_idle_dur_count_no_modifier = no_modifier;
|
||||
kbase_csf_firmware_enable_gpu_idle_timer(kbdev);
|
||||
kbase_csf_scheduler_spin_unlock(kbdev, flags);
|
||||
wait_for_global_request(kbdev, GLB_REQ_IDLE_ENABLE_MASK);
|
||||
|
|
@ -1018,12 +1020,12 @@ end:
|
|||
return hysteresis_val;
|
||||
}
|
||||
|
||||
static u32 convert_dur_to_core_pwroff_count(struct kbase_device *kbdev, const u32 dur_us,
|
||||
u32 *modifier)
|
||||
static u32 convert_dur_to_core_pwroff_count(struct kbase_device *kbdev, const u64 dur_ns,
|
||||
u32 *no_modifier)
|
||||
{
|
||||
/* Get the cntfreq_el0 value, which drives the SYSTEM_TIMESTAMP */
|
||||
u64 freq = arch_timer_get_cntfrq();
|
||||
u64 dur_val = dur_us;
|
||||
u64 freq = kbase_arch_timer_get_cntfrq(kbdev);
|
||||
u64 dur_val = dur_ns;
|
||||
u32 cnt_val_u32, reg_val_u32;
|
||||
bool src_system_timestamp = freq > 0;
|
||||
|
||||
|
|
@ -1041,50 +1043,57 @@ static u32 convert_dur_to_core_pwroff_count(struct kbase_device *kbdev, const u3
|
|||
"Can't get the timestamp frequency, use cycle counter with MCU shader Core Poweroff timer!");
|
||||
}
|
||||
|
||||
/* Formula for dur_val = ((dur_us/1e6) * freq_HZ) >> 10) */
|
||||
dur_val = (dur_val * freq) >> HYSTERESIS_VAL_UNIT_SHIFT;
|
||||
dur_val = div_u64(dur_val, 1000000);
|
||||
|
||||
*modifier = 0;
|
||||
/* Formula for dur_val = (dur/1e9) * freq_HZ) */
|
||||
dur_val = dur_val * freq;
|
||||
dur_val = div_u64(dur_val, NSEC_PER_SEC);
|
||||
if (dur_val < S32_MAX) {
|
||||
*no_modifier = 1;
|
||||
} else {
|
||||
dur_val = dur_val >> HYSTERESIS_VAL_UNIT_SHIFT;
|
||||
*no_modifier = 0;
|
||||
}
|
||||
|
||||
/* Interface limits the value field to S32_MAX */
|
||||
cnt_val_u32 = (dur_val > S32_MAX) ? S32_MAX : (u32)dur_val;
|
||||
if (dur_val > S32_MAX) {
|
||||
/* Upper Bound - as interface limits the field to S32_MAX */
|
||||
cnt_val_u32 = S32_MAX;
|
||||
} else {
|
||||
cnt_val_u32 = (u32)dur_val;
|
||||
}
|
||||
|
||||
reg_val_u32 = GLB_PWROFF_TIMER_TIMEOUT_SET(0, cnt_val_u32);
|
||||
/* add the source flag */
|
||||
if (src_system_timestamp)
|
||||
reg_val_u32 = GLB_PWROFF_TIMER_TIMER_SOURCE_SET(
|
||||
reg_val_u32, GLB_PWROFF_TIMER_TIMER_SOURCE_SYSTEM_TIMESTAMP);
|
||||
else
|
||||
reg_val_u32 = GLB_PWROFF_TIMER_TIMER_SOURCE_SET(
|
||||
reg_val_u32, GLB_PWROFF_TIMER_TIMER_SOURCE_GPU_COUNTER);
|
||||
reg_val_u32 = GLB_PWROFF_TIMER_TIMER_SOURCE_SET(
|
||||
reg_val_u32,
|
||||
(src_system_timestamp ? GLB_PWROFF_TIMER_TIMER_SOURCE_SYSTEM_TIMESTAMP :
|
||||
GLB_PWROFF_TIMER_TIMER_SOURCE_GPU_COUNTER));
|
||||
|
||||
return reg_val_u32;
|
||||
}
|
||||
|
||||
u32 kbase_csf_firmware_get_mcu_core_pwroff_time(struct kbase_device *kbdev)
|
||||
u64 kbase_csf_firmware_get_mcu_core_pwroff_time(struct kbase_device *kbdev)
|
||||
{
|
||||
u32 pwroff;
|
||||
u64 pwroff_ns;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
|
||||
pwroff = kbdev->csf.mcu_core_pwroff_dur_ns;
|
||||
pwroff_ns = kbdev->csf.mcu_core_pwroff_dur_ns;
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
|
||||
return pwroff;
|
||||
return pwroff_ns;
|
||||
}
|
||||
|
||||
u32 kbase_csf_firmware_set_mcu_core_pwroff_time(struct kbase_device *kbdev, u32 dur)
|
||||
u32 kbase_csf_firmware_set_mcu_core_pwroff_time(struct kbase_device *kbdev, u64 dur_ns)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 modifier = 0;
|
||||
u32 no_modifier = 0;
|
||||
|
||||
const u32 pwroff = convert_dur_to_core_pwroff_count(kbdev, dur, &modifier);
|
||||
const u32 pwroff = convert_dur_to_core_pwroff_count(kbdev, dur_ns, &no_modifier);
|
||||
|
||||
spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
|
||||
kbdev->csf.mcu_core_pwroff_dur_ns = dur;
|
||||
kbdev->csf.mcu_core_pwroff_dur_ns = dur_ns;
|
||||
kbdev->csf.mcu_core_pwroff_dur_count = pwroff;
|
||||
kbdev->csf.mcu_core_pwroff_dur_count_modifier = modifier;
|
||||
kbdev->csf.mcu_core_pwroff_dur_count_no_modifier = no_modifier;
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
|
||||
dev_dbg(kbdev->dev, "MCU shader Core Poweroff input update: 0x%.8x", pwroff);
|
||||
|
|
@ -1101,8 +1110,6 @@ int kbase_csf_firmware_early_init(struct kbase_device *kbdev)
|
|||
{
|
||||
init_waitqueue_head(&kbdev->csf.event_wait);
|
||||
|
||||
kbdev->csf.fw_timeout_ms = kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT);
|
||||
|
||||
kbase_csf_firmware_reset_mcu_core_pwroff_time(kbdev);
|
||||
INIT_LIST_HEAD(&kbdev->csf.firmware_interfaces);
|
||||
INIT_LIST_HEAD(&kbdev->csf.firmware_config);
|
||||
|
|
@ -1125,7 +1132,7 @@ void kbase_csf_firmware_early_term(struct kbase_device *kbdev)
|
|||
|
||||
int kbase_csf_firmware_late_init(struct kbase_device *kbdev)
|
||||
{
|
||||
u32 modifier = 0;
|
||||
u32 no_modifier = 0;
|
||||
|
||||
kbdev->csf.gpu_idle_hysteresis_ns = FIRMWARE_IDLE_HYSTERESIS_TIME_NS;
|
||||
#ifdef KBASE_PM_RUNTIME
|
||||
|
|
@ -1134,8 +1141,8 @@ int kbase_csf_firmware_late_init(struct kbase_device *kbdev)
|
|||
#endif
|
||||
WARN_ON(!kbdev->csf.gpu_idle_hysteresis_ns);
|
||||
kbdev->csf.gpu_idle_dur_count =
|
||||
convert_dur_to_idle_count(kbdev, kbdev->csf.gpu_idle_hysteresis_ns, &modifier);
|
||||
kbdev->csf.gpu_idle_dur_count_modifier = modifier;
|
||||
convert_dur_to_idle_count(kbdev, kbdev->csf.gpu_idle_hysteresis_ns, &no_modifier);
|
||||
kbdev->csf.gpu_idle_dur_count_no_modifier = no_modifier;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -464,7 +464,9 @@ static void kbase_kcpu_jit_retry_pending_allocs(struct kbase_context *kctx)
|
|||
* kbase_csf_kcpu_queue_context.jit_lock .
|
||||
*/
|
||||
list_for_each_entry(blocked_queue, &kctx->csf.kcpu_queues.jit_blocked_queues, jit_blocked)
|
||||
queue_work(blocked_queue->wq, &blocked_queue->work);
|
||||
queue_work(atomic_read(&kctx->prioritized) ? kctx->csf.kcpu_wq_high_prio :
|
||||
kctx->csf.kcpu_wq_normal_prio,
|
||||
&blocked_queue->work);
|
||||
}
|
||||
|
||||
static int kbase_kcpu_jit_free_process(struct kbase_kcpu_command_queue *queue,
|
||||
|
|
@ -510,7 +512,7 @@ static int kbase_kcpu_jit_free_process(struct kbase_kcpu_command_queue *queue,
|
|||
}
|
||||
|
||||
KBASE_TLSTREAM_TL_KBASE_ARRAY_ITEM_KCPUQUEUE_EXECUTE_JIT_FREE_END(
|
||||
queue->kctx->kbdev, queue, item_err, pages_used);
|
||||
queue->kctx->kbdev, queue, (u32)item_err, pages_used);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -611,7 +613,7 @@ kbase_csf_queue_group_suspend_prepare(struct kbase_kcpu_command_queue *kcpu_queu
|
|||
u64 page_addr = addr & PAGE_MASK;
|
||||
u64 end_addr = addr + csg_suspend_buf_size - 1;
|
||||
u64 last_page_addr = end_addr & PAGE_MASK;
|
||||
int nr_pages = (last_page_addr - page_addr) / PAGE_SIZE + 1;
|
||||
unsigned int nr_pages = (last_page_addr - page_addr) / PAGE_SIZE + 1;
|
||||
int pinned_pages = 0, ret = 0;
|
||||
struct kbase_va_region *reg;
|
||||
|
||||
|
|
@ -647,7 +649,7 @@ kbase_csf_queue_group_suspend_prepare(struct kbase_kcpu_command_queue *kcpu_queu
|
|||
|
||||
if (kbase_is_region_invalid_or_free(reg)) {
|
||||
kbase_gpu_vm_unlock(kctx);
|
||||
pinned_pages = get_user_pages_fast(page_addr, nr_pages, 1, sus_buf->pages);
|
||||
pinned_pages = get_user_pages_fast(page_addr, (int)nr_pages, 1, sus_buf->pages);
|
||||
kbase_gpu_vm_lock(kctx);
|
||||
|
||||
if (pinned_pages < 0) {
|
||||
|
|
@ -715,8 +717,11 @@ static int kbase_csf_queue_group_suspend_process(struct kbase_context *kctx,
|
|||
static enum kbase_csf_event_callback_action event_cqs_callback(void *param)
|
||||
{
|
||||
struct kbase_kcpu_command_queue *kcpu_queue = (struct kbase_kcpu_command_queue *)param;
|
||||
struct kbase_context *kctx = kcpu_queue->kctx;
|
||||
|
||||
queue_work(kcpu_queue->wq, &kcpu_queue->work);
|
||||
queue_work(atomic_read(&kctx->prioritized) ? kctx->csf.kcpu_wq_high_prio :
|
||||
kctx->csf.kcpu_wq_normal_prio,
|
||||
&kcpu_queue->work);
|
||||
|
||||
return KBASE_CSF_EVENT_CALLBACK_KEEP;
|
||||
}
|
||||
|
|
@ -1301,11 +1306,7 @@ static int kbase_kcpu_cqs_set_operation_prepare(
|
|||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_SYNC_FILE)
|
||||
#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
|
||||
static void kbase_csf_fence_wait_callback(struct fence *fence, struct fence_cb *cb)
|
||||
#else
|
||||
static void kbase_csf_fence_wait_callback(struct dma_fence *fence, struct dma_fence_cb *cb)
|
||||
#endif
|
||||
{
|
||||
struct kbase_kcpu_command_fence_info *fence_info =
|
||||
container_of(cb, struct kbase_kcpu_command_fence_info, fence_cb);
|
||||
|
|
@ -1321,7 +1322,9 @@ static void kbase_csf_fence_wait_callback(struct dma_fence *fence, struct dma_fe
|
|||
fence->seqno);
|
||||
|
||||
/* Resume kcpu command queue processing. */
|
||||
queue_work(kcpu_queue->wq, &kcpu_queue->work);
|
||||
queue_work(atomic_read(&kctx->prioritized) ? kctx->csf.kcpu_wq_high_prio :
|
||||
kctx->csf.kcpu_wq_normal_prio,
|
||||
&kcpu_queue->work);
|
||||
}
|
||||
|
||||
static void kbasep_kcpu_fence_wait_cancel(struct kbase_kcpu_command_queue *kcpu_queue,
|
||||
|
|
@ -1374,11 +1377,7 @@ static void fence_timeout_callback(struct timer_list *timer)
|
|||
struct kbase_context *const kctx = kcpu_queue->kctx;
|
||||
struct kbase_kcpu_command *cmd = &kcpu_queue->commands[kcpu_queue->start_offset];
|
||||
struct kbase_kcpu_command_fence_info *fence_info;
|
||||
#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
|
||||
struct fence *fence;
|
||||
#else
|
||||
struct dma_fence *fence;
|
||||
#endif
|
||||
struct kbase_sync_fence_info info;
|
||||
|
||||
if (cmd->type != BASE_KCPU_COMMAND_TYPE_FENCE_WAIT) {
|
||||
|
|
@ -1400,7 +1399,9 @@ static void fence_timeout_callback(struct timer_list *timer)
|
|||
kbase_sync_fence_info_get(fence, &info);
|
||||
|
||||
if (info.status == 1) {
|
||||
queue_work(kcpu_queue->wq, &kcpu_queue->work);
|
||||
queue_work(atomic_read(&kctx->prioritized) ? kctx->csf.kcpu_wq_high_prio :
|
||||
kctx->csf.kcpu_wq_normal_prio,
|
||||
&kcpu_queue->work);
|
||||
} else if (info.status == 0) {
|
||||
dev_warn(kctx->kbdev->dev, "fence has not yet signalled in %ums",
|
||||
FENCE_WAIT_TIMEOUT_MS);
|
||||
|
|
@ -1444,11 +1445,7 @@ static int kbase_kcpu_fence_wait_process(struct kbase_kcpu_command_queue *kcpu_q
|
|||
struct kbase_kcpu_command_fence_info *fence_info)
|
||||
{
|
||||
int fence_status = 0;
|
||||
#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
|
||||
struct fence *fence;
|
||||
#else
|
||||
struct dma_fence *fence;
|
||||
#endif
|
||||
struct kbase_context *const kctx = kcpu_queue->kctx;
|
||||
|
||||
lockdep_assert_held(&kcpu_queue->lock);
|
||||
|
|
@ -1514,11 +1511,7 @@ static int kbase_kcpu_fence_wait_prepare(struct kbase_kcpu_command_queue *kcpu_q
|
|||
struct base_kcpu_command_fence_info *fence_info,
|
||||
struct kbase_kcpu_command *current_command)
|
||||
{
|
||||
#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
|
||||
struct fence *fence_in;
|
||||
#else
|
||||
struct dma_fence *fence_in;
|
||||
#endif
|
||||
struct base_fence fence;
|
||||
|
||||
lockdep_assert_held(&kcpu_queue->lock);
|
||||
|
|
@ -1613,11 +1606,7 @@ static void kcpu_force_signal_fence(struct kbase_kcpu_command_queue *kcpu_queue)
|
|||
{
|
||||
int status;
|
||||
int i;
|
||||
#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
|
||||
struct fence *fence;
|
||||
#else
|
||||
struct dma_fence *fence;
|
||||
#endif
|
||||
struct kbase_context *const kctx = kcpu_queue->kctx;
|
||||
#ifdef CONFIG_MALI_FENCE_DEBUG
|
||||
int del;
|
||||
|
|
@ -1703,7 +1692,9 @@ static void fence_signal_timeout_cb(struct timer_list *timer)
|
|||
if (atomic_read(&kcpu_queue->fence_signal_pending_cnt) > 1)
|
||||
fence_signal_timeout_start(kcpu_queue);
|
||||
|
||||
queue_work(kcpu_queue->wq, &kcpu_queue->timeout_work);
|
||||
queue_work(atomic_read(&kctx->prioritized) ? kctx->csf.kcpu_wq_high_prio :
|
||||
kctx->csf.kcpu_wq_normal_prio,
|
||||
&kcpu_queue->timeout_work);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1762,11 +1753,7 @@ static int kbasep_kcpu_fence_signal_init(struct kbase_kcpu_command_queue *kcpu_q
|
|||
struct base_fence *fence, struct sync_file **sync_file,
|
||||
int *fd)
|
||||
{
|
||||
#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
|
||||
struct fence *fence_out;
|
||||
#else
|
||||
struct dma_fence *fence_out;
|
||||
#endif
|
||||
struct kbase_kcpu_dma_fence *kcpu_fence;
|
||||
int ret = 0;
|
||||
|
||||
|
|
@ -1780,11 +1767,7 @@ static int kbasep_kcpu_fence_signal_init(struct kbase_kcpu_command_queue *kcpu_q
|
|||
kcpu_fence->metadata = kcpu_queue->metadata;
|
||||
WARN_ON(!kbase_refcount_inc_not_zero(&kcpu_fence->metadata->refcount));
|
||||
|
||||
#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
|
||||
fence_out = (struct fence *)kcpu_fence;
|
||||
#else
|
||||
fence_out = (struct dma_fence *)kcpu_fence;
|
||||
#endif
|
||||
|
||||
dma_fence_init(fence_out, &kbase_fence_ops, &kbase_csf_fence_lock,
|
||||
kcpu_queue->fence_context, ++kcpu_queue->fence_seqno);
|
||||
|
|
@ -1859,7 +1842,7 @@ static int kbase_kcpu_fence_signal_prepare(struct kbase_kcpu_command_queue *kcpu
|
|||
* installed, so the install step needs to be done at the last
|
||||
* before returning success.
|
||||
*/
|
||||
fd_install(fd, sync_file->file);
|
||||
fd_install((unsigned int)fd, sync_file->file);
|
||||
|
||||
if (atomic_inc_return(&kcpu_queue->fence_signal_pending_cnt) == 1)
|
||||
fence_signal_timeout_start(kcpu_queue);
|
||||
|
|
@ -1903,11 +1886,7 @@ static void kcpu_fence_timeout_dump(struct kbase_kcpu_command_queue *queue,
|
|||
struct kbase_kcpu_command *cmd;
|
||||
struct kbase_kcpu_command_fence_info *fence_info;
|
||||
struct kbase_kcpu_dma_fence *kcpu_fence;
|
||||
#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
|
||||
struct fence *fence;
|
||||
#else
|
||||
struct dma_fence *fence;
|
||||
#endif
|
||||
struct kbase_sync_fence_info info;
|
||||
u16 i;
|
||||
|
||||
|
|
@ -2045,8 +2024,6 @@ static int delete_queue(struct kbase_context *kctx, u32 id)
|
|||
cancel_work_sync(&queue->timeout_work);
|
||||
cancel_work_sync(&queue->work);
|
||||
|
||||
destroy_workqueue(queue->wq);
|
||||
|
||||
mutex_destroy(&queue->lock);
|
||||
|
||||
kfree(queue);
|
||||
|
|
@ -2085,7 +2062,7 @@ static void KBASE_TLSTREAM_TL_KBASE_KCPUQUEUE_EXECUTE_JIT_ALLOC_INFO(
|
|||
#endif /* CONFIG_MALI_VECTOR_DUMP */
|
||||
}
|
||||
KBASE_TLSTREAM_TL_KBASE_ARRAY_ITEM_KCPUQUEUE_EXECUTE_JIT_ALLOC_END(
|
||||
kbdev, queue, alloc_status, gpu_alloc_addr, mmu_flags);
|
||||
kbdev, queue, (u32)alloc_status, gpu_alloc_addr, mmu_flags);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2584,7 +2561,7 @@ int kbase_csf_kcpu_queue_enqueue(struct kbase_context *kctx,
|
|||
}
|
||||
}
|
||||
|
||||
kcpu_cmd->enqueue_ts = atomic64_inc_return(&kctx->csf.kcpu_queues.cmd_seq_num);
|
||||
kcpu_cmd->enqueue_ts = (u64)atomic64_inc_return(&kctx->csf.kcpu_queues.cmd_seq_num);
|
||||
switch (command.type) {
|
||||
case BASE_KCPU_COMMAND_TYPE_FENCE_WAIT:
|
||||
#if IS_ENABLED(CONFIG_SYNC_FILE)
|
||||
|
|
@ -2676,6 +2653,23 @@ out:
|
|||
|
||||
int kbase_csf_kcpu_queue_context_init(struct kbase_context *kctx)
|
||||
{
|
||||
kctx->csf.kcpu_wq_high_prio = alloc_workqueue("mali_kcpu_wq_%i_high_prio",
|
||||
WQ_UNBOUND | WQ_HIGHPRI, 0, kctx->tgid);
|
||||
if (kctx->csf.kcpu_wq_high_prio == NULL) {
|
||||
dev_err(kctx->kbdev->dev,
|
||||
"Failed to initialize KCPU queue high-priority workqueue");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
kctx->csf.kcpu_wq_normal_prio =
|
||||
alloc_workqueue("mali_kcpu_wq_%i_normal_prio", 0, 0, kctx->tgid);
|
||||
if (kctx->csf.kcpu_wq_normal_prio == NULL) {
|
||||
dev_err(kctx->kbdev->dev,
|
||||
"Failed to initialize KCPU queue normal-priority workqueue");
|
||||
destroy_workqueue(kctx->csf.kcpu_wq_high_prio);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
mutex_init(&kctx->csf.kcpu_queues.lock);
|
||||
|
||||
return 0;
|
||||
|
|
@ -2689,10 +2683,13 @@ void kbase_csf_kcpu_queue_context_term(struct kbase_context *kctx)
|
|||
if (WARN_ON(!kctx->csf.kcpu_queues.array[id]))
|
||||
clear_bit(id, kctx->csf.kcpu_queues.in_use);
|
||||
else
|
||||
(void)delete_queue(kctx, id);
|
||||
(void)delete_queue(kctx, (u32)id);
|
||||
}
|
||||
|
||||
mutex_destroy(&kctx->csf.kcpu_queues.lock);
|
||||
|
||||
destroy_workqueue(kctx->csf.kcpu_wq_normal_prio);
|
||||
destroy_workqueue(kctx->csf.kcpu_wq_high_prio);
|
||||
}
|
||||
KBASE_EXPORT_TEST_API(kbase_csf_kcpu_queue_context_term);
|
||||
|
||||
|
|
@ -2737,15 +2734,7 @@ int kbase_csf_kcpu_queue_new(struct kbase_context *kctx, struct kbase_ioctl_kcpu
|
|||
goto out;
|
||||
}
|
||||
|
||||
queue->wq = alloc_workqueue("mali_kbase_csf_kcpu_wq_%i", WQ_UNBOUND | WQ_HIGHPRI, 0, idx);
|
||||
if (queue->wq == NULL) {
|
||||
kfree(queue);
|
||||
ret = -ENOMEM;
|
||||
|
||||
goto out;
|
||||
}
|
||||
|
||||
bitmap_set(kctx->csf.kcpu_queues.in_use, idx, 1);
|
||||
bitmap_set(kctx->csf.kcpu_queues.in_use, (unsigned int)idx, 1);
|
||||
kctx->csf.kcpu_queues.array[idx] = queue;
|
||||
mutex_init(&queue->lock);
|
||||
queue->kctx = kctx;
|
||||
|
|
@ -2758,7 +2747,6 @@ int kbase_csf_kcpu_queue_new(struct kbase_context *kctx, struct kbase_ioctl_kcpu
|
|||
|
||||
metadata = kzalloc(sizeof(*metadata), GFP_KERNEL);
|
||||
if (!metadata) {
|
||||
destroy_workqueue(queue->wq);
|
||||
kfree(queue);
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
|
|
@ -2766,10 +2754,9 @@ int kbase_csf_kcpu_queue_new(struct kbase_context *kctx, struct kbase_ioctl_kcpu
|
|||
|
||||
metadata->kbdev = kctx->kbdev;
|
||||
metadata->kctx_id = kctx->id;
|
||||
n = snprintf(metadata->timeline_name, MAX_TIMELINE_NAME, "%d-%d_%d-%lld-kcpu",
|
||||
n = snprintf(metadata->timeline_name, MAX_TIMELINE_NAME, "%u-%d_%u-%llu-kcpu",
|
||||
kctx->kbdev->id, kctx->tgid, kctx->id, queue->fence_context);
|
||||
if (WARN_ON(n >= MAX_TIMELINE_NAME)) {
|
||||
destroy_workqueue(queue->wq);
|
||||
kfree(queue);
|
||||
kfree(metadata);
|
||||
ret = -EINVAL;
|
||||
|
|
|
|||
|
|
@ -25,11 +25,7 @@
|
|||
#include <mali_kbase_fence.h>
|
||||
#include <mali_kbase_sync.h>
|
||||
|
||||
#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
|
||||
#include <linux/fence.h>
|
||||
#else
|
||||
#include <linux/dma-fence.h>
|
||||
#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0) */
|
||||
#include <linux/version_compat_defs.h>
|
||||
|
||||
/* The maximum number of KCPU commands in flight, enqueueing more commands
|
||||
* than this value shall block.
|
||||
|
|
@ -56,13 +52,8 @@ struct kbase_kcpu_command_import_info {
|
|||
* @fence_has_force_signaled: fence has forced signaled after fence timeouted
|
||||
*/
|
||||
struct kbase_kcpu_command_fence_info {
|
||||
#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
|
||||
struct fence_cb fence_cb;
|
||||
struct fence *fence;
|
||||
#else
|
||||
struct dma_fence_cb fence_cb;
|
||||
struct dma_fence *fence;
|
||||
#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0) */
|
||||
struct kbase_kcpu_command_queue *kcpu_queue;
|
||||
bool fence_has_force_signaled;
|
||||
};
|
||||
|
|
@ -249,7 +240,6 @@ struct kbase_kcpu_command {
|
|||
* @kctx: The context to which this command queue belongs.
|
||||
* @commands: Array of commands which have been successfully
|
||||
* enqueued to this command queue.
|
||||
* @wq: Dedicated workqueue for processing commands.
|
||||
* @work: struct work_struct which contains a pointer to
|
||||
* the function which handles processing of kcpu
|
||||
* commands enqueued into a kcpu command queue;
|
||||
|
|
@ -296,7 +286,6 @@ struct kbase_kcpu_command_queue {
|
|||
struct mutex lock;
|
||||
struct kbase_context *kctx;
|
||||
struct kbase_kcpu_command commands[KBASEP_KCPU_QUEUE_SIZE];
|
||||
struct workqueue_struct *wq;
|
||||
struct work_struct work;
|
||||
struct work_struct timeout_work;
|
||||
u8 start_offset;
|
||||
|
|
|
|||
|
|
@ -60,9 +60,9 @@ static ssize_t kbase_csf_kcpu_queue_fence_signal_enabled_set(struct file *file,
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
atomic_set(&kbdev->fence_signal_timeout_enabled, enabled);
|
||||
atomic_set(&kbdev->fence_signal_timeout_enabled, (int)enabled);
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
static const struct file_operations kbase_csf_kcpu_queue_fence_signal_fops = {
|
||||
|
|
@ -82,7 +82,7 @@ static ssize_t kbase_csf_kcpu_queue_fence_signal_timeout_get(struct file *file,
|
|||
unsigned int timeout_ms = kbase_get_timeout_ms(kbdev, KCPU_FENCE_SIGNAL_TIMEOUT);
|
||||
|
||||
size = scnprintf(buffer, sizeof(buffer), "%u\n", timeout_ms);
|
||||
return simple_read_from_buffer(buf, count, ppos, buffer, size);
|
||||
return simple_read_from_buffer(buf, count, ppos, buffer, (size_t)size);
|
||||
}
|
||||
|
||||
static ssize_t kbase_csf_kcpu_queue_fence_signal_timeout_set(struct file *file,
|
||||
|
|
@ -105,7 +105,7 @@ static ssize_t kbase_csf_kcpu_queue_fence_signal_timeout_set(struct file *file,
|
|||
*/
|
||||
kbase_device_set_timeout_ms(kbdev, KCPU_FENCE_SIGNAL_TIMEOUT, timeout_ms);
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
static const struct file_operations kbase_csf_kcpu_queue_fence_signal_timeout_fops = {
|
||||
|
|
|
|||
|
|
@ -412,7 +412,7 @@ int kbase_csf_mcu_shared_add_queue(struct kbase_device *kbdev, struct kbase_queu
|
|||
"No bound csg_reg, or in wrong state"))
|
||||
return -EIO;
|
||||
|
||||
vpfn = CSG_REG_USERIO_VPFN(csg_reg->reg, queue->csi_index, nr_susp_pages);
|
||||
vpfn = CSG_REG_USERIO_VPFN(csg_reg->reg, (u32)queue->csi_index, nr_susp_pages);
|
||||
err = userio_pages_replace_phys(kbdev, vpfn, queue->phys);
|
||||
if (likely(!err)) {
|
||||
/* Mark the queue has been successfully mapped */
|
||||
|
|
@ -452,7 +452,7 @@ void kbase_csf_mcu_shared_drop_stopped_queue(struct kbase_device *kbdev, struct
|
|||
|
||||
csg_reg = get_group_bound_csg_reg(group);
|
||||
|
||||
vpfn = CSG_REG_USERIO_VPFN(csg_reg->reg, queue->csi_index, nr_susp_pages);
|
||||
vpfn = CSG_REG_USERIO_VPFN(csg_reg->reg, (u32)queue->csi_index, nr_susp_pages);
|
||||
|
||||
WARN_ONCE(userio_pages_replace_phys(kbdev, vpfn, NULL),
|
||||
"Unexpected restoring to dummy map update error");
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ kbase_csf_protected_memory_alloc(struct kbase_device *const kbdev, struct tagged
|
|||
unsigned int num_pages_order;
|
||||
|
||||
if (is_small_page)
|
||||
order = KBASE_MEM_POOL_4KB_PAGE_TABLE_ORDER;
|
||||
order = KBASE_MEM_POOL_SMALL_PAGE_TABLE_ORDER;
|
||||
|
||||
num_pages_order = (1u << order);
|
||||
|
||||
|
|
@ -135,7 +135,7 @@ void kbase_csf_protected_memory_free(struct kbase_device *const kbdev,
|
|||
unsigned int num_pages_order = (1u << KBASE_MEM_POOL_2MB_PAGE_TABLE_ORDER);
|
||||
|
||||
if (is_small_page)
|
||||
num_pages_order = (1u << KBASE_MEM_POOL_4KB_PAGE_TABLE_ORDER);
|
||||
num_pages_order = (1u << KBASE_MEM_POOL_SMALL_PAGE_TABLE_ORDER);
|
||||
|
||||
if (WARN_ON(!pma_dev) || WARN_ON(!pma))
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -271,21 +271,21 @@
|
|||
/* CS_KERNEL_INPUT_BLOCK register set definitions */
|
||||
/* GLB_VERSION register */
|
||||
#define GLB_VERSION_PATCH_SHIFT (0)
|
||||
#define GLB_VERSION_PATCH_MASK ((0xFFFF) << GLB_VERSION_PATCH_SHIFT)
|
||||
#define GLB_VERSION_PATCH_MASK ((0xFFFFU) << GLB_VERSION_PATCH_SHIFT)
|
||||
#define GLB_VERSION_PATCH_GET(reg_val) \
|
||||
(((reg_val)&GLB_VERSION_PATCH_MASK) >> GLB_VERSION_PATCH_SHIFT)
|
||||
#define GLB_VERSION_PATCH_SET(reg_val, value) \
|
||||
(((reg_val) & ~GLB_VERSION_PATCH_MASK) | \
|
||||
(((value) << GLB_VERSION_PATCH_SHIFT) & GLB_VERSION_PATCH_MASK))
|
||||
#define GLB_VERSION_MINOR_SHIFT (16)
|
||||
#define GLB_VERSION_MINOR_MASK ((0xFF) << GLB_VERSION_MINOR_SHIFT)
|
||||
#define GLB_VERSION_MINOR_MASK ((0xFFU) << GLB_VERSION_MINOR_SHIFT)
|
||||
#define GLB_VERSION_MINOR_GET(reg_val) \
|
||||
(((reg_val)&GLB_VERSION_MINOR_MASK) >> GLB_VERSION_MINOR_SHIFT)
|
||||
#define GLB_VERSION_MINOR_SET(reg_val, value) \
|
||||
(((reg_val) & ~GLB_VERSION_MINOR_MASK) | \
|
||||
(((value) << GLB_VERSION_MINOR_SHIFT) & GLB_VERSION_MINOR_MASK))
|
||||
#define GLB_VERSION_MAJOR_SHIFT (24)
|
||||
#define GLB_VERSION_MAJOR_MASK ((0xFF) << GLB_VERSION_MAJOR_SHIFT)
|
||||
#define GLB_VERSION_MAJOR_MASK ((0xFFU) << GLB_VERSION_MAJOR_SHIFT)
|
||||
#define GLB_VERSION_MAJOR_GET(reg_val) \
|
||||
(((reg_val)&GLB_VERSION_MAJOR_MASK) >> GLB_VERSION_MAJOR_SHIFT)
|
||||
#define GLB_VERSION_MAJOR_SET(reg_val, value) \
|
||||
|
|
@ -311,60 +311,60 @@
|
|||
(((value) << CS_REQ_EXTRACT_EVENT_SHIFT) & CS_REQ_EXTRACT_EVENT_MASK))
|
||||
|
||||
#define CS_REQ_IDLE_SYNC_WAIT_SHIFT 8
|
||||
#define CS_REQ_IDLE_SYNC_WAIT_MASK (0x1 << CS_REQ_IDLE_SYNC_WAIT_SHIFT)
|
||||
#define CS_REQ_IDLE_SYNC_WAIT_MASK (0x1U << CS_REQ_IDLE_SYNC_WAIT_SHIFT)
|
||||
#define CS_REQ_IDLE_SYNC_WAIT_GET(reg_val) \
|
||||
(((reg_val)&CS_REQ_IDLE_SYNC_WAIT_MASK) >> CS_REQ_IDLE_SYNC_WAIT_SHIFT)
|
||||
#define CS_REQ_IDLE_SYNC_WAIT_SET(reg_val, value) \
|
||||
(((reg_val) & ~CS_REQ_IDLE_SYNC_WAIT_MASK) | \
|
||||
(((value) << CS_REQ_IDLE_SYNC_WAIT_SHIFT) & CS_REQ_IDLE_SYNC_WAIT_MASK))
|
||||
#define CS_REQ_IDLE_PROTM_PEND_SHIFT 9
|
||||
#define CS_REQ_IDLE_PROTM_PEND_MASK (0x1 << CS_REQ_IDLE_PROTM_PEND_SHIFT)
|
||||
#define CS_REQ_IDLE_PROTM_PEND_MASK (0x1U << CS_REQ_IDLE_PROTM_PEND_SHIFT)
|
||||
#define CS_REQ_IDLE_PROTM_PEND_GET(reg_val) \
|
||||
(((reg_val)&CS_REQ_IDLE_PROTM_PEND_MASK) >> CS_REQ_IDLE_PROTM_PEND_SHIFT)
|
||||
#define CS_REQ_IDLE_PROTM_PEND_SET(reg_val, value) \
|
||||
(((reg_val) & ~CS_REQ_IDLE_PROTM_PEND_MASK) | \
|
||||
(((value) << CS_REQ_IDLE_PROTM_PEND_SHIFT) & CS_REQ_IDLE_PROTM_PEND_MASK))
|
||||
#define CS_REQ_IDLE_EMPTY_SHIFT 10
|
||||
#define CS_REQ_IDLE_EMPTY_MASK (0x1 << CS_REQ_IDLE_EMPTY_SHIFT)
|
||||
#define CS_REQ_IDLE_EMPTY_MASK (0x1U << CS_REQ_IDLE_EMPTY_SHIFT)
|
||||
#define CS_REQ_IDLE_EMPTY_GET(reg_val) \
|
||||
(((reg_val)&CS_REQ_IDLE_EMPTY_MASK) >> CS_REQ_IDLE_EMPTY_SHIFT)
|
||||
#define CS_REQ_IDLE_EMPTY_SET(reg_val, value) \
|
||||
(((reg_val) & ~CS_REQ_IDLE_EMPTY_MASK) | \
|
||||
(((value) << CS_REQ_IDLE_EMPTY_SHIFT) & CS_REQ_IDLE_EMPTY_MASK))
|
||||
#define CS_REQ_IDLE_RESOURCE_REQ_SHIFT 11
|
||||
#define CS_REQ_IDLE_RESOURCE_REQ_MASK (0x1 << CS_REQ_IDLE_RESOURCE_REQ_SHIFT)
|
||||
#define CS_REQ_IDLE_RESOURCE_REQ_MASK (0x1U << CS_REQ_IDLE_RESOURCE_REQ_SHIFT)
|
||||
#define CS_REQ_IDLE_RESOURCE_REQ_GET(reg_val) \
|
||||
(((reg_val)&CS_REQ_IDLE_RESOURCE_REQ_MASK) >> CS_REQ_IDLE_RESOURCE_REQ_SHIFT)
|
||||
#define CS_REQ_IDLE_RESOURCE_REQ_SET(reg_val, value) \
|
||||
(((reg_val) & ~CS_REQ_IDLE_RESOURCE_REQ_MASK) | \
|
||||
(((value) << CS_REQ_IDLE_RESOURCE_REQ_SHIFT) & CS_REQ_IDLE_RESOURCE_REQ_MASK))
|
||||
#define CS_REQ_IDLE_SHARED_SB_DEC_SHIFT 12
|
||||
#define CS_REQ_IDLE_SHARED_SB_DEC_MASK (0x1 << CS_REQ_IDLE_SHARED_SB_DEC_SHIFT)
|
||||
#define CS_REQ_IDLE_SHARED_SB_DEC_MASK (0x1U << CS_REQ_IDLE_SHARED_SB_DEC_SHIFT)
|
||||
#define CS_REQ_IDLE_SHARED_SB_DEC_GET(reg_val) \
|
||||
(((reg_val)&CS_REQ_IDLE_SHARED_SB_DEC_MASK) >> CS_REQ_IDLE_SHARED_SB_DEC_SHIFT)
|
||||
#define CS_REQ_IDLE_SHARED_SB_DEC_REQ_SET(reg_val, value) \
|
||||
(((reg_val) & ~CS_REQ_IDLE_SHARED_SB_DEC_MASK) | \
|
||||
(((value) << CS_REQ_IDLE_SHARED_SB_DEC_SHIFT) & CS_REQ_IDLE_SHARED_SB_DEC_MASK))
|
||||
#define CS_REQ_TILER_OOM_SHIFT 26
|
||||
#define CS_REQ_TILER_OOM_MASK (0x1 << CS_REQ_TILER_OOM_SHIFT)
|
||||
#define CS_REQ_TILER_OOM_MASK (0x1U << CS_REQ_TILER_OOM_SHIFT)
|
||||
#define CS_REQ_TILER_OOM_GET(reg_val) (((reg_val)&CS_REQ_TILER_OOM_MASK) >> CS_REQ_TILER_OOM_SHIFT)
|
||||
#define CS_REQ_TILER_OOM_SET(reg_val, value) \
|
||||
(((reg_val) & ~CS_REQ_TILER_OOM_MASK) | \
|
||||
(((value) << CS_REQ_TILER_OOM_SHIFT) & CS_REQ_TILER_OOM_MASK))
|
||||
#define CS_REQ_PROTM_PEND_SHIFT 27
|
||||
#define CS_REQ_PROTM_PEND_MASK (0x1 << CS_REQ_PROTM_PEND_SHIFT)
|
||||
#define CS_REQ_PROTM_PEND_MASK (0x1U << CS_REQ_PROTM_PEND_SHIFT)
|
||||
#define CS_REQ_PROTM_PEND_GET(reg_val) \
|
||||
(((reg_val)&CS_REQ_PROTM_PEND_MASK) >> CS_REQ_PROTM_PEND_SHIFT)
|
||||
#define CS_REQ_PROTM_PEND_SET(reg_val, value) \
|
||||
(((reg_val) & ~CS_REQ_PROTM_PEND_MASK) | \
|
||||
(((value) << CS_REQ_PROTM_PEND_SHIFT) & CS_REQ_PROTM_PEND_MASK))
|
||||
#define CS_REQ_FATAL_SHIFT 30
|
||||
#define CS_REQ_FATAL_MASK (0x1 << CS_REQ_FATAL_SHIFT)
|
||||
#define CS_REQ_FATAL_MASK (0x1U << CS_REQ_FATAL_SHIFT)
|
||||
#define CS_REQ_FATAL_GET(reg_val) (((reg_val)&CS_REQ_FATAL_MASK) >> CS_REQ_FATAL_SHIFT)
|
||||
#define CS_REQ_FATAL_SET(reg_val, value) \
|
||||
(((reg_val) & ~CS_REQ_FATAL_MASK) | (((value) << CS_REQ_FATAL_SHIFT) & CS_REQ_FATAL_MASK))
|
||||
#define CS_REQ_FAULT_SHIFT 31
|
||||
#define CS_REQ_FAULT_MASK (0x1 << CS_REQ_FAULT_SHIFT)
|
||||
#define CS_REQ_FAULT_MASK (0x1U << CS_REQ_FAULT_SHIFT)
|
||||
#define CS_REQ_FAULT_GET(reg_val) (((reg_val)&CS_REQ_FAULT_MASK) >> CS_REQ_FAULT_SHIFT)
|
||||
#define CS_REQ_FAULT_SET(reg_val, value) \
|
||||
(((reg_val) & ~CS_REQ_FAULT_MASK) | (((value) << CS_REQ_FAULT_SHIFT) & CS_REQ_FAULT_MASK))
|
||||
|
|
@ -559,32 +559,32 @@
|
|||
#define CS_ACK_STATE_START 0x1
|
||||
/* End of CS_ACK_STATE values */
|
||||
#define CS_ACK_EXTRACT_EVENT_SHIFT 4
|
||||
#define CS_ACK_EXTRACT_EVENT_MASK (0x1 << CS_ACK_EXTRACT_EVENT_SHIFT)
|
||||
#define CS_ACK_EXTRACT_EVENT_MASK (0x1U << CS_ACK_EXTRACT_EVENT_SHIFT)
|
||||
#define CS_ACK_EXTRACT_EVENT_GET(reg_val) \
|
||||
(((reg_val)&CS_ACK_EXTRACT_EVENT_MASK) >> CS_ACK_EXTRACT_EVENT_SHIFT)
|
||||
#define CS_ACK_EXTRACT_EVENT_SET(reg_val, value) \
|
||||
(((reg_val) & ~CS_ACK_EXTRACT_EVENT_MASK) | \
|
||||
(((value) << CS_ACK_EXTRACT_EVENT_SHIFT) & CS_ACK_EXTRACT_EVENT_MASK))
|
||||
#define CS_ACK_TILER_OOM_SHIFT 26
|
||||
#define CS_ACK_TILER_OOM_MASK (0x1 << CS_ACK_TILER_OOM_SHIFT)
|
||||
#define CS_ACK_TILER_OOM_MASK (0x1U << CS_ACK_TILER_OOM_SHIFT)
|
||||
#define CS_ACK_TILER_OOM_GET(reg_val) (((reg_val)&CS_ACK_TILER_OOM_MASK) >> CS_ACK_TILER_OOM_SHIFT)
|
||||
#define CS_ACK_TILER_OOM_SET(reg_val, value) \
|
||||
(((reg_val) & ~CS_ACK_TILER_OOM_MASK) | \
|
||||
(((value) << CS_ACK_TILER_OOM_SHIFT) & CS_ACK_TILER_OOM_MASK))
|
||||
#define CS_ACK_PROTM_PEND_SHIFT 27
|
||||
#define CS_ACK_PROTM_PEND_MASK (0x1 << CS_ACK_PROTM_PEND_SHIFT)
|
||||
#define CS_ACK_PROTM_PEND_MASK (0x1U << CS_ACK_PROTM_PEND_SHIFT)
|
||||
#define CS_ACK_PROTM_PEND_GET(reg_val) \
|
||||
(((reg_val)&CS_ACK_PROTM_PEND_MASK) >> CS_ACK_PROTM_PEND_SHIFT)
|
||||
#define CS_ACK_PROTM_PEND_SET(reg_val, value) \
|
||||
(((reg_val) & ~CS_ACK_PROTM_PEND_MASK) | \
|
||||
(((value) << CS_ACK_PROTM_PEND_SHIFT) & CS_ACK_PROTM_PEND_MASK))
|
||||
#define CS_ACK_FATAL_SHIFT 30
|
||||
#define CS_ACK_FATAL_MASK (0x1 << CS_ACK_FATAL_SHIFT)
|
||||
#define CS_ACK_FATAL_MASK (0x1U << CS_ACK_FATAL_SHIFT)
|
||||
#define CS_ACK_FATAL_GET(reg_val) (((reg_val)&CS_ACK_FATAL_MASK) >> CS_ACK_FATAL_SHIFT)
|
||||
#define CS_ACK_FATAL_SET(reg_val, value) \
|
||||
(((reg_val) & ~CS_ACK_FATAL_MASK) | (((value) << CS_ACK_FATAL_SHIFT) & CS_ACK_FATAL_MASK))
|
||||
#define CS_ACK_FAULT_SHIFT 31
|
||||
#define CS_ACK_FAULT_MASK (0x1 << CS_ACK_FAULT_SHIFT)
|
||||
#define CS_ACK_FAULT_MASK (0x1U << CS_ACK_FAULT_SHIFT)
|
||||
#define CS_ACK_FAULT_GET(reg_val) (((reg_val)&CS_ACK_FAULT_MASK) >> CS_ACK_FAULT_SHIFT)
|
||||
#define CS_ACK_FAULT_SET(reg_val, value) \
|
||||
(((reg_val) & ~CS_ACK_FAULT_MASK) | (((value) << CS_ACK_FAULT_SHIFT) & CS_ACK_FAULT_MASK))
|
||||
|
|
@ -601,21 +601,21 @@
|
|||
|
||||
/* CS_STATUS_WAIT register */
|
||||
#define CS_STATUS_WAIT_SB_MASK_SHIFT 0
|
||||
#define CS_STATUS_WAIT_SB_MASK_MASK (0xFFFF << CS_STATUS_WAIT_SB_MASK_SHIFT)
|
||||
#define CS_STATUS_WAIT_SB_MASK_MASK (0xFFFFU << CS_STATUS_WAIT_SB_MASK_SHIFT)
|
||||
#define CS_STATUS_WAIT_SB_MASK_GET(reg_val) \
|
||||
(((reg_val)&CS_STATUS_WAIT_SB_MASK_MASK) >> CS_STATUS_WAIT_SB_MASK_SHIFT)
|
||||
#define CS_STATUS_WAIT_SB_MASK_SET(reg_val, value) \
|
||||
(((reg_val) & ~CS_STATUS_WAIT_SB_MASK_MASK) | \
|
||||
(((value) << CS_STATUS_WAIT_SB_MASK_SHIFT) & CS_STATUS_WAIT_SB_MASK_MASK))
|
||||
#define CS_STATUS_WAIT_SB_SOURCE_SHIFT 16
|
||||
#define CS_STATUS_WAIT_SB_SOURCE_MASK (0xF << CS_STATUS_WAIT_SB_SOURCE_SHIFT)
|
||||
#define CS_STATUS_WAIT_SB_SOURCE_MASK (0xFU << CS_STATUS_WAIT_SB_SOURCE_SHIFT)
|
||||
#define CS_STATUS_WAIT_SB_SOURCE_GET(reg_val) \
|
||||
(((reg_val)&CS_STATUS_WAIT_SB_SOURCE_MASK) >> CS_STATUS_WAIT_SB_SOURCE_SHIFT)
|
||||
#define CS_STATUS_WAIT_SB_SOURCE_SET(reg_val, value) \
|
||||
(((reg_val) & ~CS_STATUS_WAIT_SB_SOURCE_MASK) | \
|
||||
(((value) << CS_STATUS_WAIT_SB_SOURCE_SHIFT) & CS_STATUS_WAIT_SB_SOURCE_MASK))
|
||||
#define CS_STATUS_WAIT_SYNC_WAIT_CONDITION_SHIFT 24
|
||||
#define CS_STATUS_WAIT_SYNC_WAIT_CONDITION_MASK (0xF << CS_STATUS_WAIT_SYNC_WAIT_CONDITION_SHIFT)
|
||||
#define CS_STATUS_WAIT_SYNC_WAIT_CONDITION_MASK (0xFU << CS_STATUS_WAIT_SYNC_WAIT_CONDITION_SHIFT)
|
||||
#define CS_STATUS_WAIT_SYNC_WAIT_CONDITION_GET(reg_val) \
|
||||
(((reg_val)&CS_STATUS_WAIT_SYNC_WAIT_CONDITION_MASK) >> \
|
||||
CS_STATUS_WAIT_SYNC_WAIT_CONDITION_SHIFT)
|
||||
|
|
@ -630,28 +630,28 @@
|
|||
/* End of CS_STATUS_WAIT_SYNC_WAIT_CONDITION values */
|
||||
/* PROGRESS_WAIT is only for before v14.x.4 */
|
||||
#define CS_STATUS_WAIT_PROGRESS_WAIT_SHIFT 28
|
||||
#define CS_STATUS_WAIT_PROGRESS_WAIT_MASK (0x1 << CS_STATUS_WAIT_PROGRESS_WAIT_SHIFT)
|
||||
#define CS_STATUS_WAIT_PROGRESS_WAIT_MASK (0x1U << CS_STATUS_WAIT_PROGRESS_WAIT_SHIFT)
|
||||
#define CS_STATUS_WAIT_PROGRESS_WAIT_GET(reg_val) \
|
||||
(((reg_val)&CS_STATUS_WAIT_PROGRESS_WAIT_MASK) >> CS_STATUS_WAIT_PROGRESS_WAIT_SHIFT)
|
||||
#define CS_STATUS_WAIT_PROGRESS_WAIT_SET(reg_val, value) \
|
||||
(((reg_val) & ~CS_STATUS_WAIT_PROGRESS_WAIT_MASK) | \
|
||||
(((value) << CS_STATUS_WAIT_PROGRESS_WAIT_SHIFT) & CS_STATUS_WAIT_PROGRESS_WAIT_MASK))
|
||||
#define CS_STATUS_WAIT_PROTM_PEND_SHIFT 29
|
||||
#define CS_STATUS_WAIT_PROTM_PEND_MASK (0x1 << CS_STATUS_WAIT_PROTM_PEND_SHIFT)
|
||||
#define CS_STATUS_WAIT_PROTM_PEND_MASK (0x1U << CS_STATUS_WAIT_PROTM_PEND_SHIFT)
|
||||
#define CS_STATUS_WAIT_PROTM_PEND_GET(reg_val) \
|
||||
(((reg_val)&CS_STATUS_WAIT_PROTM_PEND_MASK) >> CS_STATUS_WAIT_PROTM_PEND_SHIFT)
|
||||
#define CS_STATUS_WAIT_PROTM_PEND_SET(reg_val, value) \
|
||||
(((reg_val) & ~CS_STATUS_WAIT_PROTM_PEND_MASK) | \
|
||||
(((value) << CS_STATUS_WAIT_PROTM_PEND_SHIFT) & CS_STATUS_WAIT_PROTM_PEND_MASK))
|
||||
#define CS_STATUS_WAIT_SYNC_WAIT_SIZE_SHIFT 30
|
||||
#define CS_STATUS_WAIT_SYNC_WAIT_SIZE_MASK (0x1 << CS_STATUS_WAIT_SYNC_WAIT_SIZE_SHIFT)
|
||||
#define CS_STATUS_WAIT_SYNC_WAIT_SIZE_MASK (0x1U << CS_STATUS_WAIT_SYNC_WAIT_SIZE_SHIFT)
|
||||
#define CS_STATUS_WAIT_SYNC_WAIT_SIZE_GET(reg_val) \
|
||||
(((reg_val)&CS_STATUS_WAIT_SYNC_WAIT_SIZE_MASK) >> CS_STATUS_WAIT_SYNC_WAIT_SIZE_SHIFT)
|
||||
#define CS_STATUS_WAIT_SYNC_WAIT_SIZE_SET(reg_val, value) \
|
||||
(((reg_val) & ~CS_STATUS_WAIT_SYNC_WAIT_SIZE_MASK) | \
|
||||
(((value) << CS_STATUS_WAIT_SYNC_WAIT_SIZE_SHIFT) & CS_STATUS_WAIT_SYNC_WAIT_SIZE_MASK))
|
||||
#define CS_STATUS_WAIT_SYNC_WAIT_SHIFT 31
|
||||
#define CS_STATUS_WAIT_SYNC_WAIT_MASK (0x1 << CS_STATUS_WAIT_SYNC_WAIT_SHIFT)
|
||||
#define CS_STATUS_WAIT_SYNC_WAIT_MASK (0x1U << CS_STATUS_WAIT_SYNC_WAIT_SHIFT)
|
||||
#define CS_STATUS_WAIT_SYNC_WAIT_GET(reg_val) \
|
||||
(((reg_val)&CS_STATUS_WAIT_SYNC_WAIT_MASK) >> CS_STATUS_WAIT_SYNC_WAIT_SHIFT)
|
||||
#define CS_STATUS_WAIT_SYNC_WAIT_SET(reg_val, value) \
|
||||
|
|
@ -754,7 +754,7 @@
|
|||
|
||||
/* CS_FAULT register */
|
||||
#define CS_FAULT_EXCEPTION_TYPE_SHIFT 0
|
||||
#define CS_FAULT_EXCEPTION_TYPE_MASK (0xFF << CS_FAULT_EXCEPTION_TYPE_SHIFT)
|
||||
#define CS_FAULT_EXCEPTION_TYPE_MASK (0xFFU << CS_FAULT_EXCEPTION_TYPE_SHIFT)
|
||||
#define CS_FAULT_EXCEPTION_TYPE_GET(reg_val) \
|
||||
(((reg_val)&CS_FAULT_EXCEPTION_TYPE_MASK) >> CS_FAULT_EXCEPTION_TYPE_SHIFT)
|
||||
#define CS_FAULT_EXCEPTION_TYPE_SET(reg_val, value) \
|
||||
|
|
@ -796,7 +796,7 @@
|
|||
#define CS_FAULT_EXCEPTION_TYPE_MEMORY_ATTRIBUTE_FAULT_3 0xEB
|
||||
/* End of CS_FAULT_EXCEPTION_TYPE values */
|
||||
#define CS_FAULT_EXCEPTION_DATA_SHIFT 8
|
||||
#define CS_FAULT_EXCEPTION_DATA_MASK (0xFFFFFF << CS_FAULT_EXCEPTION_DATA_SHIFT)
|
||||
#define CS_FAULT_EXCEPTION_DATA_MASK (0xFFFFFFU << CS_FAULT_EXCEPTION_DATA_SHIFT)
|
||||
#define CS_FAULT_EXCEPTION_DATA_GET(reg_val) \
|
||||
(((reg_val)&CS_FAULT_EXCEPTION_DATA_MASK) >> CS_FAULT_EXCEPTION_DATA_SHIFT)
|
||||
#define CS_FAULT_EXCEPTION_DATA_SET(reg_val, value) \
|
||||
|
|
@ -821,7 +821,7 @@
|
|||
#define CS_FATAL_EXCEPTION_TYPE_FIRMWARE_INTERNAL_ERROR 0x68
|
||||
/* End of CS_FATAL_EXCEPTION_TYPE values */
|
||||
#define CS_FATAL_EXCEPTION_DATA_SHIFT 8
|
||||
#define CS_FATAL_EXCEPTION_DATA_MASK (0xFFFFFF << CS_FATAL_EXCEPTION_DATA_SHIFT)
|
||||
#define CS_FATAL_EXCEPTION_DATA_MASK (0xFFFFFFU << CS_FATAL_EXCEPTION_DATA_SHIFT)
|
||||
#define CS_FATAL_EXCEPTION_DATA_GET(reg_val) \
|
||||
(((reg_val)&CS_FATAL_EXCEPTION_DATA_MASK) >> CS_FATAL_EXCEPTION_DATA_SHIFT)
|
||||
#define CS_FATAL_EXCEPTION_DATA_SET(reg_val, value) \
|
||||
|
|
@ -941,32 +941,32 @@
|
|||
#define CSG_REQ_STATE_RESUME 0x3
|
||||
/* End of CSG_REQ_STATE values */
|
||||
#define CSG_REQ_EP_CFG_SHIFT 4
|
||||
#define CSG_REQ_EP_CFG_MASK (0x1 << CSG_REQ_EP_CFG_SHIFT)
|
||||
#define CSG_REQ_EP_CFG_MASK (0x1U << CSG_REQ_EP_CFG_SHIFT)
|
||||
#define CSG_REQ_EP_CFG_GET(reg_val) (((reg_val)&CSG_REQ_EP_CFG_MASK) >> CSG_REQ_EP_CFG_SHIFT)
|
||||
#define CSG_REQ_EP_CFG_SET(reg_val, value) \
|
||||
(((reg_val) & ~CSG_REQ_EP_CFG_MASK) | \
|
||||
(((value) << CSG_REQ_EP_CFG_SHIFT) & CSG_REQ_EP_CFG_MASK))
|
||||
#define CSG_REQ_STATUS_UPDATE_SHIFT 5
|
||||
#define CSG_REQ_STATUS_UPDATE_MASK (0x1 << CSG_REQ_STATUS_UPDATE_SHIFT)
|
||||
#define CSG_REQ_STATUS_UPDATE_MASK (0x1U << CSG_REQ_STATUS_UPDATE_SHIFT)
|
||||
#define CSG_REQ_STATUS_UPDATE_GET(reg_val) \
|
||||
(((reg_val)&CSG_REQ_STATUS_UPDATE_MASK) >> CSG_REQ_STATUS_UPDATE_SHIFT)
|
||||
#define CSG_REQ_STATUS_UPDATE_SET(reg_val, value) \
|
||||
(((reg_val) & ~CSG_REQ_STATUS_UPDATE_MASK) | \
|
||||
(((value) << CSG_REQ_STATUS_UPDATE_SHIFT) & CSG_REQ_STATUS_UPDATE_MASK))
|
||||
#define CSG_REQ_SYNC_UPDATE_SHIFT 28
|
||||
#define CSG_REQ_SYNC_UPDATE_MASK (0x1 << CSG_REQ_SYNC_UPDATE_SHIFT)
|
||||
#define CSG_REQ_SYNC_UPDATE_MASK (0x1U << CSG_REQ_SYNC_UPDATE_SHIFT)
|
||||
#define CSG_REQ_SYNC_UPDATE_GET(reg_val) \
|
||||
(((reg_val)&CSG_REQ_SYNC_UPDATE_MASK) >> CSG_REQ_SYNC_UPDATE_SHIFT)
|
||||
#define CSG_REQ_SYNC_UPDATE_SET(reg_val, value) \
|
||||
(((reg_val) & ~CSG_REQ_SYNC_UPDATE_MASK) | \
|
||||
(((value) << CSG_REQ_SYNC_UPDATE_SHIFT) & CSG_REQ_SYNC_UPDATE_MASK))
|
||||
#define CSG_REQ_IDLE_SHIFT 29
|
||||
#define CSG_REQ_IDLE_MASK (0x1 << CSG_REQ_IDLE_SHIFT)
|
||||
#define CSG_REQ_IDLE_MASK (0x1U << CSG_REQ_IDLE_SHIFT)
|
||||
#define CSG_REQ_IDLE_GET(reg_val) (((reg_val)&CSG_REQ_IDLE_MASK) >> CSG_REQ_IDLE_SHIFT)
|
||||
#define CSG_REQ_IDLE_SET(reg_val, value) \
|
||||
(((reg_val) & ~CSG_REQ_IDLE_MASK) | (((value) << CSG_REQ_IDLE_SHIFT) & CSG_REQ_IDLE_MASK))
|
||||
#define CSG_REQ_PROGRESS_TIMER_EVENT_SHIFT 31
|
||||
#define CSG_REQ_PROGRESS_TIMER_EVENT_MASK (0x1 << CSG_REQ_PROGRESS_TIMER_EVENT_SHIFT)
|
||||
#define CSG_REQ_PROGRESS_TIMER_EVENT_MASK (0x1U << CSG_REQ_PROGRESS_TIMER_EVENT_SHIFT)
|
||||
#define CSG_REQ_PROGRESS_TIMER_EVENT_GET(reg_val) \
|
||||
(((reg_val)&CSG_REQ_PROGRESS_TIMER_EVENT_MASK) >> CSG_REQ_PROGRESS_TIMER_EVENT_SHIFT)
|
||||
#define CSG_REQ_PROGRESS_TIMER_EVENT_SET(reg_val, value) \
|
||||
|
|
@ -1133,38 +1133,38 @@
|
|||
#define CSG_ACK_STATE_RESUME 0x3
|
||||
/* End of CSG_ACK_STATE values */
|
||||
#define CSG_ACK_EP_CFG_SHIFT 4
|
||||
#define CSG_ACK_EP_CFG_MASK (0x1 << CSG_ACK_EP_CFG_SHIFT)
|
||||
#define CSG_ACK_EP_CFG_MASK (0x1U << CSG_ACK_EP_CFG_SHIFT)
|
||||
#define CSG_ACK_EP_CFG_GET(reg_val) (((reg_val)&CSG_ACK_EP_CFG_MASK) >> CSG_ACK_EP_CFG_SHIFT)
|
||||
#define CSG_ACK_EP_CFG_SET(reg_val, value) \
|
||||
(((reg_val) & ~CSG_ACK_EP_CFG_MASK) | \
|
||||
(((value) << CSG_ACK_EP_CFG_SHIFT) & CSG_ACK_EP_CFG_MASK))
|
||||
#define CSG_ACK_STATUS_UPDATE_SHIFT 5
|
||||
#define CSG_ACK_STATUS_UPDATE_MASK (0x1 << CSG_ACK_STATUS_UPDATE_SHIFT)
|
||||
#define CSG_ACK_STATUS_UPDATE_MASK (0x1U << CSG_ACK_STATUS_UPDATE_SHIFT)
|
||||
#define CSG_ACK_STATUS_UPDATE_GET(reg_val) \
|
||||
(((reg_val)&CSG_ACK_STATUS_UPDATE_MASK) >> CSG_ACK_STATUS_UPDATE_SHIFT)
|
||||
#define CSG_ACK_STATUS_UPDATE_SET(reg_val, value) \
|
||||
(((reg_val) & ~CSG_ACK_STATUS_UPDATE_MASK) | \
|
||||
(((value) << CSG_ACK_STATUS_UPDATE_SHIFT) & CSG_ACK_STATUS_UPDATE_MASK))
|
||||
#define CSG_ACK_SYNC_UPDATE_SHIFT 28
|
||||
#define CSG_ACK_SYNC_UPDATE_MASK (0x1 << CSG_ACK_SYNC_UPDATE_SHIFT)
|
||||
#define CSG_ACK_SYNC_UPDATE_MASK (0x1U << CSG_ACK_SYNC_UPDATE_SHIFT)
|
||||
#define CSG_ACK_SYNC_UPDATE_GET(reg_val) \
|
||||
(((reg_val)&CSG_ACK_SYNC_UPDATE_MASK) >> CSG_ACK_SYNC_UPDATE_SHIFT)
|
||||
#define CSG_ACK_SYNC_UPDATE_SET(reg_val, value) \
|
||||
(((reg_val) & ~CSG_ACK_SYNC_UPDATE_MASK) | \
|
||||
(((value) << CSG_ACK_SYNC_UPDATE_SHIFT) & CSG_ACK_SYNC_UPDATE_MASK))
|
||||
#define CSG_ACK_IDLE_SHIFT 29
|
||||
#define CSG_ACK_IDLE_MASK (0x1 << CSG_ACK_IDLE_SHIFT)
|
||||
#define CSG_ACK_IDLE_MASK (0x1U << CSG_ACK_IDLE_SHIFT)
|
||||
#define CSG_ACK_IDLE_GET(reg_val) (((reg_val)&CSG_ACK_IDLE_MASK) >> CSG_ACK_IDLE_SHIFT)
|
||||
#define CSG_ACK_IDLE_SET(reg_val, value) \
|
||||
(((reg_val) & ~CSG_ACK_IDLE_MASK) | (((value) << CSG_ACK_IDLE_SHIFT) & CSG_ACK_IDLE_MASK))
|
||||
#define CSG_ACK_DOORBELL_SHIFT 30
|
||||
#define CSG_ACK_DOORBELL_MASK (0x1 << CSG_ACK_DOORBELL_SHIFT)
|
||||
#define CSG_ACK_DOORBELL_MASK (0x1U << CSG_ACK_DOORBELL_SHIFT)
|
||||
#define CSG_ACK_DOORBELL_GET(reg_val) (((reg_val)&CSG_ACK_DOORBELL_MASK) >> CSG_ACK_DOORBELL_SHIFT)
|
||||
#define CSG_ACK_DOORBELL_SET(reg_val, value) \
|
||||
(((reg_val) & ~CSG_ACK_DOORBELL_MASK) | \
|
||||
(((value) << CSG_ACK_DOORBELL_SHIFT) & CSG_ACK_DOORBELL_MASK))
|
||||
#define CSG_ACK_PROGRESS_TIMER_EVENT_SHIFT 31
|
||||
#define CSG_ACK_PROGRESS_TIMER_EVENT_MASK (0x1 << CSG_ACK_PROGRESS_TIMER_EVENT_SHIFT)
|
||||
#define CSG_ACK_PROGRESS_TIMER_EVENT_MASK (0x1U << CSG_ACK_PROGRESS_TIMER_EVENT_SHIFT)
|
||||
#define CSG_ACK_PROGRESS_TIMER_EVENT_GET(reg_val) \
|
||||
(((reg_val)&CSG_ACK_PROGRESS_TIMER_EVENT_MASK) >> CSG_ACK_PROGRESS_TIMER_EVENT_SHIFT)
|
||||
#define CSG_ACK_PROGRESS_TIMER_EVENT_SET(reg_val, value) \
|
||||
|
|
@ -1611,8 +1611,8 @@
|
|||
(((reg_val) & ~GLB_PWROFF_TIMER_TIMER_SOURCE_MASK) | \
|
||||
(((value) << GLB_PWROFF_TIMER_TIMER_SOURCE_SHIFT) & GLB_PWROFF_TIMER_TIMER_SOURCE_MASK))
|
||||
/* GLB_PWROFF_TIMER_TIMER_SOURCE values */
|
||||
#define GLB_PWROFF_TIMER_TIMER_SOURCE_SYSTEM_TIMESTAMP 0x0
|
||||
#define GLB_PWROFF_TIMER_TIMER_SOURCE_GPU_COUNTER 0x1
|
||||
#define GLB_PWROFF_TIMER_TIMER_SOURCE_SYSTEM_TIMESTAMP 0x0U
|
||||
#define GLB_PWROFF_TIMER_TIMER_SOURCE_GPU_COUNTER 0x1U
|
||||
/* End of GLB_PWROFF_TIMER_TIMER_SOURCE values */
|
||||
|
||||
/* GLB_PWROFF_TIMER_CONFIG register */
|
||||
|
|
@ -1695,8 +1695,8 @@
|
|||
(((reg_val) & ~GLB_IDLE_TIMER_TIMER_SOURCE_MASK) | \
|
||||
(((value) << GLB_IDLE_TIMER_TIMER_SOURCE_SHIFT) & GLB_IDLE_TIMER_TIMER_SOURCE_MASK))
|
||||
/* GLB_IDLE_TIMER_TIMER_SOURCE values */
|
||||
#define GLB_IDLE_TIMER_TIMER_SOURCE_SYSTEM_TIMESTAMP 0x0
|
||||
#define GLB_IDLE_TIMER_TIMER_SOURCE_GPU_COUNTER 0x1
|
||||
#define GLB_IDLE_TIMER_TIMER_SOURCE_SYSTEM_TIMESTAMP 0x0U
|
||||
#define GLB_IDLE_TIMER_TIMER_SOURCE_GPU_COUNTER 0x1U
|
||||
/* End of GLB_IDLE_TIMER_TIMER_SOURCE values */
|
||||
|
||||
/* GLB_IDLE_TIMER_CONFIG values */
|
||||
|
|
|
|||
|
|
@ -240,13 +240,17 @@ static void kbase_csf_debug_dump_registers(struct kbase_device *kbdev)
|
|||
kbase_reg_read32(kbdev, GPU_CONTROL_ENUM(GPU_IRQ_MASK)),
|
||||
kbase_reg_read32(kbdev, JOB_CONTROL_ENUM(JOB_IRQ_MASK)),
|
||||
kbase_reg_read32(kbdev, MMU_CONTROL_ENUM(IRQ_MASK)));
|
||||
dev_err(kbdev->dev, " PWR_OVERRIDE0=0x%08x PWR_OVERRIDE1=0x%08x",
|
||||
kbase_reg_read32(kbdev, GPU_CONTROL_ENUM(PWR_OVERRIDE0)),
|
||||
kbase_reg_read32(kbdev, GPU_CONTROL_ENUM(PWR_OVERRIDE1)));
|
||||
dev_err(kbdev->dev, " SHADER_CONFIG=0x%08x L2_MMU_CONFIG=0x%08x TILER_CONFIG=0x%08x",
|
||||
kbase_reg_read32(kbdev, GPU_CONTROL_ENUM(SHADER_CONFIG)),
|
||||
kbase_reg_read32(kbdev, GPU_CONTROL_ENUM(L2_MMU_CONFIG)),
|
||||
kbase_reg_read32(kbdev, GPU_CONTROL_ENUM(TILER_CONFIG)));
|
||||
if (kbdev->gpu_props.gpu_id.arch_id < GPU_ID_ARCH_MAKE(14, 10, 0)) {
|
||||
dev_err(kbdev->dev, " PWR_OVERRIDE0=0x%08x PWR_OVERRIDE1=0x%08x",
|
||||
kbase_reg_read32(kbdev, GPU_CONTROL_ENUM(PWR_OVERRIDE0)),
|
||||
kbase_reg_read32(kbdev, GPU_CONTROL_ENUM(PWR_OVERRIDE1)));
|
||||
dev_err(kbdev->dev,
|
||||
" SHADER_CONFIG=0x%08x L2_MMU_CONFIG=0x%08x TILER_CONFIG=0x%08x",
|
||||
kbase_reg_read32(kbdev, GPU_CONTROL_ENUM(SHADER_CONFIG)),
|
||||
kbase_reg_read32(kbdev, GPU_CONTROL_ENUM(L2_MMU_CONFIG)),
|
||||
kbase_reg_read32(kbdev, GPU_CONTROL_ENUM(TILER_CONFIG)));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -528,7 +528,7 @@ static int wait_for_scheduler_to_exit_sleep(struct kbase_device *kbdev)
|
|||
/* Usually Scheduler would remain in sleeping state until the
|
||||
* auto-suspend timer expires and all active CSGs are suspended.
|
||||
*/
|
||||
sleep_exit_wait_time = autosuspend_delay + kbdev->reset_timeout_ms;
|
||||
sleep_exit_wait_time = (u32)autosuspend_delay + kbdev->reset_timeout_ms;
|
||||
|
||||
remaining = kbase_csf_timeout_in_jiffies(sleep_exit_wait_time);
|
||||
|
||||
|
|
@ -680,7 +680,7 @@ static void unassign_user_doorbell_from_queue(struct kbase_device *kbdev, struct
|
|||
queue->doorbell_nr = KBASEP_USER_DB_NR_INVALID;
|
||||
/* After this the dummy page would be mapped in */
|
||||
unmap_mapping_range(kbdev->csf.db_filp->f_inode->i_mapping,
|
||||
queue->db_file_offset << PAGE_SHIFT, PAGE_SIZE, 1);
|
||||
(loff_t)(queue->db_file_offset << PAGE_SHIFT), PAGE_SIZE, 1);
|
||||
}
|
||||
|
||||
mutex_unlock(&kbdev->csf.reg_lock);
|
||||
|
|
@ -714,7 +714,7 @@ static void assign_user_doorbell_to_queue(struct kbase_device *kbdev,
|
|||
|
||||
/* After this the real Hw doorbell page would be mapped in */
|
||||
unmap_mapping_range(kbdev->csf.db_filp->f_inode->i_mapping,
|
||||
queue->db_file_offset << PAGE_SHIFT, PAGE_SIZE, 1);
|
||||
(loff_t)(queue->db_file_offset << PAGE_SHIFT), PAGE_SIZE, 1);
|
||||
}
|
||||
|
||||
mutex_unlock(&kbdev->csf.reg_lock);
|
||||
|
|
@ -791,44 +791,56 @@ static void enqueue_gpu_idle_work(struct kbase_csf_scheduler *const scheduler)
|
|||
queue_work(scheduler->idle_wq, &scheduler->gpu_idle_work);
|
||||
}
|
||||
|
||||
void kbase_csf_scheduler_process_gpu_idle_event(struct kbase_device *kbdev)
|
||||
bool kbase_csf_scheduler_process_gpu_idle_event(struct kbase_device *kbdev)
|
||||
{
|
||||
struct kbase_csf_scheduler *scheduler = &kbdev->csf.scheduler;
|
||||
int non_idle_offslot_grps;
|
||||
bool can_suspend_on_idle;
|
||||
bool invoke_pm_state_machine = false;
|
||||
|
||||
lockdep_assert_held(&kbdev->hwaccess_lock);
|
||||
lockdep_assert_held(&scheduler->interrupt_lock);
|
||||
|
||||
non_idle_offslot_grps = atomic_read(&scheduler->non_idle_offslot_grps);
|
||||
can_suspend_on_idle = kbase_pm_idle_groups_sched_suspendable(kbdev);
|
||||
KBASE_KTRACE_ADD(kbdev, SCHEDULER_GPU_IDLE_EVENT_CAN_SUSPEND, NULL,
|
||||
((u64)(u32)non_idle_offslot_grps) | (((u64)can_suspend_on_idle) << 32));
|
||||
(((u64)can_suspend_on_idle) << 32));
|
||||
|
||||
if (!non_idle_offslot_grps) {
|
||||
if (can_suspend_on_idle) {
|
||||
/* fast_gpu_idle_handling is protected by the
|
||||
* interrupt_lock, which would prevent this from being
|
||||
* updated whilst gpu_idle_worker() is executing.
|
||||
if (can_suspend_on_idle) {
|
||||
/* fast_gpu_idle_handling is protected by the
|
||||
* interrupt_lock, which would prevent this from being
|
||||
* updated whilst gpu_idle_worker() is executing.
|
||||
*/
|
||||
scheduler->fast_gpu_idle_handling = (kbdev->csf.gpu_idle_hysteresis_ns == 0) ||
|
||||
!kbase_csf_scheduler_all_csgs_idle(kbdev);
|
||||
|
||||
/* If GPU idle event occurred after the runtime suspend was aborted due to
|
||||
* DB_MIRROR irq then it suggests that Userspace submission didn't make GPU
|
||||
* non-idle. So the planned resumption of scheduling can be cancelled and
|
||||
* MCU can be put back to sleep state to re-trigger the runtime suspend.
|
||||
*/
|
||||
if (unlikely(kbdev->pm.backend.exit_gpu_sleep_mode &&
|
||||
kbdev->pm.backend.runtime_suspend_abort_reason ==
|
||||
ABORT_REASON_DB_MIRROR_IRQ)) {
|
||||
/* Cancel the planned resumption of scheduling */
|
||||
kbdev->pm.backend.exit_gpu_sleep_mode = false;
|
||||
kbdev->pm.backend.runtime_suspend_abort_reason = ABORT_REASON_NONE;
|
||||
/* PM state machine can be invoked to put MCU back to the sleep
|
||||
* state right away and thereby re-trigger the runtime suspend.
|
||||
*/
|
||||
scheduler->fast_gpu_idle_handling =
|
||||
(kbdev->csf.gpu_idle_hysteresis_ns == 0) ||
|
||||
!kbase_csf_scheduler_all_csgs_idle(kbdev);
|
||||
|
||||
/* The GPU idle worker relies on update_on_slot_queues_offsets() to have
|
||||
* finished. It's queued before to reduce the time it takes till execution
|
||||
* but it'll eventually be blocked by the scheduler->interrupt_lock.
|
||||
*/
|
||||
enqueue_gpu_idle_work(scheduler);
|
||||
|
||||
/* The extract offsets are unused in fast GPU idle handling */
|
||||
if (!scheduler->fast_gpu_idle_handling)
|
||||
update_on_slot_queues_offsets(kbdev);
|
||||
invoke_pm_state_machine = true;
|
||||
}
|
||||
} else {
|
||||
/* Invoke the scheduling tick to get the non-idle suspended groups loaded soon */
|
||||
kbase_csf_scheduler_invoke_tick(kbdev);
|
||||
|
||||
/* The GPU idle worker relies on update_on_slot_queues_offsets() to have
|
||||
* finished. It's queued before to reduce the time it takes till execution
|
||||
* but it'll eventually be blocked by the scheduler->interrupt_lock.
|
||||
*/
|
||||
enqueue_gpu_idle_work(scheduler);
|
||||
}
|
||||
|
||||
/* The extract offsets are unused in fast GPU idle handling */
|
||||
if (!scheduler->fast_gpu_idle_handling)
|
||||
update_on_slot_queues_offsets(kbdev);
|
||||
|
||||
return invoke_pm_state_machine;
|
||||
}
|
||||
|
||||
u32 kbase_csf_scheduler_get_nr_active_csgs_locked(struct kbase_device *kbdev)
|
||||
|
|
@ -837,8 +849,8 @@ u32 kbase_csf_scheduler_get_nr_active_csgs_locked(struct kbase_device *kbdev)
|
|||
|
||||
lockdep_assert_held(&kbdev->csf.scheduler.interrupt_lock);
|
||||
|
||||
nr_active_csgs = bitmap_weight(kbdev->csf.scheduler.csg_inuse_bitmap,
|
||||
kbdev->csf.global_iface.group_num);
|
||||
nr_active_csgs = (u32)bitmap_weight(kbdev->csf.scheduler.csg_inuse_bitmap,
|
||||
kbdev->csf.global_iface.group_num);
|
||||
|
||||
return nr_active_csgs;
|
||||
}
|
||||
|
|
@ -938,13 +950,15 @@ static void update_idle_protm_group_state_to_runnable(struct kbase_queue_group *
|
|||
static bool scheduler_protm_wait_quit(struct kbase_device *kbdev)
|
||||
{
|
||||
struct kbase_csf_scheduler *const scheduler = &kbdev->csf.scheduler;
|
||||
long wt = kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
|
||||
const unsigned int fw_timeout_ms = kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT);
|
||||
long wt = kbase_csf_timeout_in_jiffies(fw_timeout_ms);
|
||||
long remaining;
|
||||
bool success = true;
|
||||
|
||||
lockdep_assert_held(&scheduler->lock);
|
||||
|
||||
KBASE_KTRACE_ADD(kbdev, SCHEDULER_PROTM_WAIT_QUIT_START, NULL, jiffies_to_msecs(wt));
|
||||
KBASE_KTRACE_ADD(kbdev, SCHEDULER_PROTM_WAIT_QUIT_START, NULL,
|
||||
jiffies_to_msecs((unsigned long)wt));
|
||||
|
||||
remaining = wait_event_timeout(kbdev->csf.event_wait,
|
||||
!kbase_csf_scheduler_protected_mode_in_use(kbdev), wt);
|
||||
|
|
@ -954,12 +968,13 @@ static bool scheduler_protm_wait_quit(struct kbase_device *kbdev)
|
|||
struct kbase_context *kctx = group ? group->kctx : NULL;
|
||||
|
||||
dev_warn(kbdev->dev, "[%llu] Timeout (%d ms), protm_quit wait skipped",
|
||||
kbase_backend_get_cycle_cnt(kbdev), kbdev->csf.fw_timeout_ms);
|
||||
kbase_backend_get_cycle_cnt(kbdev), fw_timeout_ms);
|
||||
schedule_actions_trigger_df(kbdev, kctx, DF_PROTECTED_MODE_EXIT_TIMEOUT);
|
||||
success = false;
|
||||
}
|
||||
|
||||
KBASE_KTRACE_ADD(kbdev, SCHEDULER_PROTM_WAIT_QUIT_END, NULL, jiffies_to_msecs(remaining));
|
||||
KBASE_KTRACE_ADD(kbdev, SCHEDULER_PROTM_WAIT_QUIT_END, NULL,
|
||||
jiffies_to_msecs((unsigned long)remaining));
|
||||
|
||||
return success;
|
||||
}
|
||||
|
|
@ -1084,6 +1099,8 @@ static int scheduler_pm_active_after_sleep(struct kbase_device *kbdev, unsigned
|
|||
if (!WARN_ON(prev_count == U32_MAX))
|
||||
kbdev->csf.scheduler.pm_active_count++;
|
||||
|
||||
kbdev->pm.backend.runtime_suspend_abort_reason = ABORT_REASON_NONE;
|
||||
|
||||
/* On 0 => 1, make a pm_ctx_active request */
|
||||
if (!prev_count) {
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, *flags);
|
||||
|
|
@ -1279,8 +1296,9 @@ static void update_idle_suspended_group_state(struct kbase_queue_group *group)
|
|||
unsigned int n_slots = group->kctx->kbdev->csf.global_iface.group_num;
|
||||
|
||||
spin_lock_irqsave(&scheduler->interrupt_lock, flags);
|
||||
n_idle = bitmap_weight(scheduler->csg_slots_idle_mask, n_slots);
|
||||
n_used = bitmap_weight(scheduler->csg_inuse_bitmap, n_slots);
|
||||
n_idle = (unsigned int)bitmap_weight(scheduler->csg_slots_idle_mask,
|
||||
n_slots);
|
||||
n_used = (unsigned int)bitmap_weight(scheduler->csg_inuse_bitmap, n_slots);
|
||||
spin_unlock_irqrestore(&scheduler->interrupt_lock, flags);
|
||||
|
||||
if (n_idle || n_used < scheduler->num_csg_slots_for_tick ||
|
||||
|
|
@ -1292,7 +1310,7 @@ static void update_idle_suspended_group_state(struct kbase_queue_group *group)
|
|||
|
||||
new_val = atomic_inc_return(&scheduler->non_idle_offslot_grps);
|
||||
KBASE_KTRACE_ADD_CSF_GRP(group->kctx->kbdev, SCHEDULER_NONIDLE_OFFSLOT_GRP_INC, group,
|
||||
new_val);
|
||||
(u64)new_val);
|
||||
}
|
||||
|
||||
int kbase_csf_scheduler_group_get_slot_locked(struct kbase_queue_group *group)
|
||||
|
|
@ -1363,7 +1381,7 @@ bool kbase_csf_scheduler_group_events_enabled(struct kbase_device *kbdev,
|
|||
}
|
||||
|
||||
struct kbase_queue_group *kbase_csf_scheduler_get_group_on_slot(struct kbase_device *kbdev,
|
||||
int slot)
|
||||
u32 slot)
|
||||
{
|
||||
lockdep_assert_held(&kbdev->csf.scheduler.interrupt_lock);
|
||||
|
||||
|
|
@ -1378,7 +1396,8 @@ static int halt_stream_sync(struct kbase_queue *queue)
|
|||
struct kbase_csf_cmd_stream_group_info *ginfo;
|
||||
struct kbase_csf_cmd_stream_info *stream;
|
||||
int csi_index = queue->csi_index;
|
||||
long remaining = kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
|
||||
const unsigned int fw_timeout_ms = kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT);
|
||||
long remaining = kbase_csf_timeout_in_jiffies(fw_timeout_ms);
|
||||
unsigned long flags;
|
||||
|
||||
if (WARN_ON(!group) || WARN_ON(!kbasep_csf_scheduler_group_is_on_slot_locked(group)))
|
||||
|
|
@ -1399,8 +1418,8 @@ static int halt_stream_sync(struct kbase_queue *queue)
|
|||
dev_warn(
|
||||
kbdev->dev,
|
||||
"[%llu] Timeout (%d ms) waiting for queue to start on csi %d bound to group %d on slot %d",
|
||||
kbase_backend_get_cycle_cnt(kbdev), kbdev->csf.fw_timeout_ms,
|
||||
csi_index, group->handle, group->csg_nr);
|
||||
kbase_backend_get_cycle_cnt(kbdev), fw_timeout_ms, csi_index,
|
||||
group->handle, group->csg_nr);
|
||||
if (kbase_prepare_to_reset_gpu(kbdev, RESET_FLAGS_NONE))
|
||||
kbase_reset_gpu(kbdev);
|
||||
|
||||
|
|
@ -1408,7 +1427,7 @@ static int halt_stream_sync(struct kbase_queue *queue)
|
|||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
remaining = kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
|
||||
remaining = kbase_csf_timeout_in_jiffies(fw_timeout_ms);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&kbdev->csf.scheduler.interrupt_lock, flags);
|
||||
|
|
@ -1430,8 +1449,8 @@ static int halt_stream_sync(struct kbase_queue *queue)
|
|||
dev_warn(
|
||||
kbdev->dev,
|
||||
"[%llu] Timeout (%d ms) waiting for queue to stop on csi %d bound to group %d on slot %d",
|
||||
kbase_backend_get_cycle_cnt(kbdev), kbdev->csf.fw_timeout_ms,
|
||||
queue->csi_index, group->handle, group->csg_nr);
|
||||
kbase_backend_get_cycle_cnt(kbdev), fw_timeout_ms, queue->csi_index,
|
||||
group->handle, group->csg_nr);
|
||||
|
||||
/* TODO GPUCORE-25328: The CSG can't be terminated, the GPU
|
||||
* will be reset as a work-around.
|
||||
|
|
@ -1487,6 +1506,7 @@ static int sched_halt_stream(struct kbase_queue *queue)
|
|||
int slot;
|
||||
int err = 0;
|
||||
const u32 group_schedule_timeout = kbase_get_timeout_ms(kbdev, CSF_CSG_SUSPEND_TIMEOUT);
|
||||
const u32 fw_timeout_ms = kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT);
|
||||
|
||||
if (WARN_ON(!group))
|
||||
return -EINVAL;
|
||||
|
|
@ -1585,15 +1605,14 @@ retry:
|
|||
kbdev->csf.event_wait,
|
||||
(CS_ACK_STATE_GET(kbase_csf_firmware_cs_output(
|
||||
stream, CS_ACK)) == CS_ACK_STATE_STOP),
|
||||
kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms));
|
||||
kbase_csf_timeout_in_jiffies(fw_timeout_ms));
|
||||
|
||||
if (!remaining) {
|
||||
dev_warn(
|
||||
kbdev->dev,
|
||||
"[%llu] Timeout (%d ms) waiting for queue stop ack on csi %d bound to group %d on slot %d",
|
||||
kbase_backend_get_cycle_cnt(kbdev),
|
||||
kbdev->csf.fw_timeout_ms, queue->csi_index,
|
||||
group->handle, group->csg_nr);
|
||||
kbase_backend_get_cycle_cnt(kbdev), fw_timeout_ms,
|
||||
queue->csi_index, group->handle, group->csg_nr);
|
||||
|
||||
|
||||
err = -ETIMEDOUT;
|
||||
|
|
@ -1728,7 +1747,7 @@ static void program_cs_trace_cfg(struct kbase_csf_cmd_stream_info *stream,
|
|||
* queue's register_ex call.
|
||||
*/
|
||||
if (kbase_csf_scheduler_queue_has_trace(queue)) {
|
||||
u32 cs_cfg = CS_INSTR_CONFIG_JASID_SET(queue->trace_cfg, queue->kctx->as_nr);
|
||||
u32 cs_cfg = CS_INSTR_CONFIG_JASID_SET(queue->trace_cfg, (u32)queue->kctx->as_nr);
|
||||
|
||||
kbase_csf_firmware_cs_input(stream, CS_INSTR_CONFIG, cs_cfg);
|
||||
kbase_csf_firmware_cs_input(stream, CS_INSTR_BUFFER_SIZE, queue->trace_buffer_size);
|
||||
|
|
@ -1801,7 +1820,7 @@ static void program_cs(struct kbase_device *kbdev, struct kbase_queue *queue,
|
|||
kbase_csf_firmware_cs_input(stream, CS_USER_OUTPUT_HI, user_output >> 32);
|
||||
|
||||
kbase_csf_firmware_cs_input(stream, CS_CONFIG,
|
||||
(queue->doorbell_nr << 8) | (queue->priority & 0xF));
|
||||
((u32)queue->doorbell_nr << 8) | (queue->priority & 0xF));
|
||||
|
||||
/* Program the queue's cs_trace configuration */
|
||||
program_cs_trace_cfg(stream, queue);
|
||||
|
|
@ -2039,6 +2058,7 @@ static void halt_csg_slot(struct kbase_queue_group *group, bool suspend)
|
|||
struct kbase_device *kbdev = group->kctx->kbdev;
|
||||
struct kbase_csf_global_iface *global_iface = &kbdev->csf.global_iface;
|
||||
struct kbase_csf_csg_slot *csg_slot = kbdev->csf.scheduler.csg_slots;
|
||||
const unsigned int fw_timeout_ms = kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT);
|
||||
s8 slot;
|
||||
|
||||
lockdep_assert_held(&kbdev->csf.scheduler.lock);
|
||||
|
|
@ -2050,15 +2070,14 @@ static void halt_csg_slot(struct kbase_queue_group *group, bool suspend)
|
|||
|
||||
/* When in transition, wait for it to complete */
|
||||
if (atomic_read(&csg_slot[slot].state) == CSG_SLOT_READY2RUN) {
|
||||
long remaining = kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
|
||||
long remaining = kbase_csf_timeout_in_jiffies(fw_timeout_ms);
|
||||
|
||||
dev_dbg(kbdev->dev, "slot %d wait for up-running\n", slot);
|
||||
remaining = wait_event_timeout(kbdev->csf.event_wait, csg_slot_running(kbdev, slot),
|
||||
remaining);
|
||||
if (!remaining)
|
||||
dev_warn(kbdev->dev, "[%llu] slot %d timeout (%d ms) on up-running\n",
|
||||
kbase_backend_get_cycle_cnt(kbdev), slot,
|
||||
kbdev->csf.fw_timeout_ms);
|
||||
kbase_backend_get_cycle_cnt(kbdev), slot, fw_timeout_ms);
|
||||
}
|
||||
|
||||
if (csg_slot_running(kbdev, slot)) {
|
||||
|
|
@ -2079,7 +2098,7 @@ static void halt_csg_slot(struct kbase_queue_group *group, bool suspend)
|
|||
csg_slot[slot].trigger_jiffies = jiffies;
|
||||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, CSG_SLOT_STOP_REQ, group, halt_cmd);
|
||||
|
||||
KBASE_TLSTREAM_TL_KBASE_DEVICE_HALTING_CSG(kbdev, kbdev->id, slot, suspend);
|
||||
KBASE_TLSTREAM_TL_KBASE_DEVICE_HALTING_CSG(kbdev, kbdev->id, (u32)slot, suspend);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2554,7 +2573,8 @@ static void update_offslot_non_idle_cnt(struct kbase_queue_group *group)
|
|||
|
||||
if (group->prepared_seq_num < scheduler->non_idle_scanout_grps) {
|
||||
int new_val = atomic_dec_return(&scheduler->non_idle_offslot_grps);
|
||||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_GRP_DEC, group, new_val);
|
||||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_GRP_DEC, group,
|
||||
(u64)new_val);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2569,7 +2589,8 @@ static void update_offslot_non_idle_cnt_for_onslot_grp(struct kbase_queue_group
|
|||
|
||||
if (group->prepared_seq_num < scheduler->non_idle_scanout_grps) {
|
||||
int new_val = atomic_dec_return(&scheduler->non_idle_offslot_grps);
|
||||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_GRP_DEC, group, new_val);
|
||||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_GRP_DEC, group,
|
||||
(u64)new_val);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2587,13 +2608,13 @@ static void update_offslot_non_idle_cnt_on_grp_suspend(struct kbase_queue_group
|
|||
if (group->run_state == KBASE_CSF_GROUP_SUSPENDED) {
|
||||
int new_val = atomic_inc_return(&scheduler->non_idle_offslot_grps);
|
||||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_GRP_INC,
|
||||
group, new_val);
|
||||
group, (u64)new_val);
|
||||
}
|
||||
} else {
|
||||
if (group->run_state != KBASE_CSF_GROUP_SUSPENDED) {
|
||||
int new_val = atomic_dec_return(&scheduler->non_idle_offslot_grps);
|
||||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_GRP_DEC,
|
||||
group, new_val);
|
||||
group, (u64)new_val);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
|
@ -2601,7 +2622,7 @@ static void update_offslot_non_idle_cnt_on_grp_suspend(struct kbase_queue_group
|
|||
if (group->run_state == KBASE_CSF_GROUP_SUSPENDED) {
|
||||
int new_val = atomic_inc_return(&scheduler->non_idle_offslot_grps);
|
||||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_GRP_INC, group,
|
||||
new_val);
|
||||
(u64)new_val);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2796,10 +2817,10 @@ static bool cleanup_csg_slot(struct kbase_queue_group *group)
|
|||
csg_slot->trigger_jiffies = jiffies;
|
||||
atomic_set(&csg_slot->state, CSG_SLOT_READY);
|
||||
|
||||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, CSG_SLOT_CLEANED, group, slot);
|
||||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, CSG_SLOT_CLEANED, group, (u64)slot);
|
||||
dev_dbg(kbdev->dev, "Cleanup done for group %d on slot %d\n", group->handle, slot);
|
||||
|
||||
KBASE_TLSTREAM_TL_KBASE_DEVICE_DEPROGRAM_CSG(kbdev, kbdev->id, slot);
|
||||
KBASE_TLSTREAM_TL_KBASE_DEVICE_DEPROGRAM_CSG(kbdev, kbdev->id, (u32)slot);
|
||||
|
||||
/* Notify the group is off-slot and the csg_reg might be available for
|
||||
* resue with other groups in a 'lazy unbinding' style.
|
||||
|
|
@ -2965,7 +2986,7 @@ static void program_csg_slot(struct kbase_queue_group *group, s8 slot, u8 prio)
|
|||
kbase_csf_firmware_csg_input(ginfo, CSG_EP_REQ_LO, ep_cfg & U32_MAX);
|
||||
|
||||
/* Program the address space number assigned to the context */
|
||||
kbase_csf_firmware_csg_input(ginfo, CSG_CONFIG, kctx->as_nr);
|
||||
kbase_csf_firmware_csg_input(ginfo, CSG_CONFIG, (u32)kctx->as_nr);
|
||||
|
||||
kbase_csf_firmware_csg_input(ginfo, CSG_SUSPEND_BUF_LO, normal_suspend_buf & U32_MAX);
|
||||
kbase_csf_firmware_csg_input(ginfo, CSG_SUSPEND_BUF_HI, normal_suspend_buf >> 32);
|
||||
|
|
@ -3012,7 +3033,8 @@ static void program_csg_slot(struct kbase_queue_group *group, s8 slot, u8 prio)
|
|||
|
||||
/* Trace the programming of the CSG on the slot */
|
||||
KBASE_TLSTREAM_TL_KBASE_DEVICE_PROGRAM_CSG(kbdev, kbdev->id, group->kctx->id, group->handle,
|
||||
slot, (state == CSG_REQ_STATE_RESUME) ? 1 : 0);
|
||||
(u32)slot,
|
||||
(state == CSG_REQ_STATE_RESUME) ? 1 : 0);
|
||||
|
||||
dev_dbg(kbdev->dev, "Starting group %d of context %d_%d on slot %d with priority %u\n",
|
||||
group->handle, kctx->tgid, kctx->id, slot, prio);
|
||||
|
|
@ -3063,7 +3085,7 @@ static void sched_evict_group(struct kbase_queue_group *group, bool fault,
|
|||
group->run_state == KBASE_CSF_GROUP_RUNNABLE)) {
|
||||
int new_val = atomic_dec_return(&scheduler->non_idle_offslot_grps);
|
||||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_GRP_DEC, group,
|
||||
new_val);
|
||||
(u64)new_val);
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_SUPPORTED_STREAMS_PER_GROUP; i++) {
|
||||
|
|
@ -3109,7 +3131,8 @@ static void sched_evict_group(struct kbase_queue_group *group, bool fault,
|
|||
static int term_group_sync(struct kbase_queue_group *group)
|
||||
{
|
||||
struct kbase_device *kbdev = group->kctx->kbdev;
|
||||
long remaining = kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
|
||||
const unsigned int fw_timeout_ms = kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT);
|
||||
long remaining = kbase_csf_timeout_in_jiffies(fw_timeout_ms);
|
||||
int err = 0;
|
||||
|
||||
term_csg_slot(group);
|
||||
|
|
@ -3125,7 +3148,7 @@ static int term_group_sync(struct kbase_queue_group *group)
|
|||
dev_warn(
|
||||
kbdev->dev,
|
||||
"[%llu] term request timeout (%d ms) for group %d of context %d_%d on slot %d",
|
||||
kbase_backend_get_cycle_cnt(kbdev), kbdev->csf.fw_timeout_ms, group->handle,
|
||||
kbase_backend_get_cycle_cnt(kbdev), fw_timeout_ms, group->handle,
|
||||
group->kctx->tgid, group->kctx->id, group->csg_nr);
|
||||
if (kbase_csf_firmware_ping_wait(kbdev, FW_PING_AFTER_ERROR_TIMEOUT_MS))
|
||||
error_type = DF_PING_REQUEST_TIMEOUT;
|
||||
|
|
@ -3276,7 +3299,8 @@ static int scheduler_group_schedule(struct kbase_queue_group *group)
|
|||
insert_group_to_runnable(&kbdev->csf.scheduler, group, KBASE_CSF_GROUP_RUNNABLE);
|
||||
/* A new group into the scheduler */
|
||||
new_val = atomic_inc_return(&kbdev->csf.scheduler.non_idle_offslot_grps);
|
||||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_GRP_INC, group, new_val);
|
||||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_GRP_INC, group,
|
||||
(u64)new_val);
|
||||
}
|
||||
|
||||
/* Since a group has become active now, check if GPU needs to be
|
||||
|
|
@ -3302,7 +3326,8 @@ static inline void set_max_csg_slots(struct kbase_device *kbdev)
|
|||
{
|
||||
struct kbase_csf_scheduler *scheduler = &kbdev->csf.scheduler;
|
||||
unsigned int total_csg_slots = kbdev->csf.global_iface.group_num;
|
||||
unsigned int max_address_space_slots = kbdev->nr_hw_address_spaces - NUM_RESERVED_AS_SLOTS;
|
||||
unsigned int max_address_space_slots =
|
||||
(unsigned int)kbdev->nr_hw_address_spaces - NUM_RESERVED_AS_SLOTS;
|
||||
|
||||
WARN_ON(scheduler->num_active_address_spaces > total_csg_slots);
|
||||
|
||||
|
|
@ -3325,7 +3350,8 @@ static inline void count_active_address_space(struct kbase_device *kbdev,
|
|||
{
|
||||
struct kbase_csf_scheduler *scheduler = &kbdev->csf.scheduler;
|
||||
unsigned int total_csg_slots = kbdev->csf.global_iface.group_num;
|
||||
unsigned int max_address_space_slots = kbdev->nr_hw_address_spaces - NUM_RESERVED_AS_SLOTS;
|
||||
unsigned int max_address_space_slots =
|
||||
(unsigned int)kbdev->nr_hw_address_spaces - NUM_RESERVED_AS_SLOTS;
|
||||
|
||||
if (scheduler->ngrp_to_schedule <= total_csg_slots) {
|
||||
if (kctx->csf.sched.ngrp_to_schedule == 1)
|
||||
|
|
@ -3358,9 +3384,9 @@ static inline void count_active_address_space(struct kbase_device *kbdev,
|
|||
* priority of a slot belonging to a higher priority idle group will always be
|
||||
* greater than the priority of a slot belonging to a lower priority non-idle
|
||||
* group, reflecting the original position of a group in the scan order (i.e
|
||||
* static priority) 'scan_seq_num', which is set during the prepare phase of a
|
||||
* tick/tock before the group is moved to 'idle_groups_to_schedule' list if it
|
||||
* is idle.
|
||||
* static priority) 'sched_act_seq_num', which is set during the prepare phase
|
||||
* of a tick/tock before the group is moved to 'idle_groups_to_schedule' list if
|
||||
* it is idle.
|
||||
* The priority range [MAX_CSG_SLOT_PRIORITY, 0] is partitioned with the first
|
||||
* 'slots_for_tick' groups in the original scan order are assigned a priority in
|
||||
* the subrange [MAX_CSG_SLOT_PRIORITY, MAX_CSG_SLOT_PRIORITY - slots_for_tick),
|
||||
|
|
@ -3385,8 +3411,8 @@ static u8 get_slot_priority(struct kbase_queue_group *group)
|
|||
slot_prio = (u8)(MAX_CSG_SLOT_PRIORITY - used_slots);
|
||||
} else {
|
||||
/* There will be a mix of idle and non-idle groups. */
|
||||
if (group->scan_seq_num < slots_for_tick)
|
||||
slot_prio = (u8)(MAX_CSG_SLOT_PRIORITY - group->scan_seq_num);
|
||||
if (group->sched_act_seq_num < slots_for_tick)
|
||||
slot_prio = (u8)(MAX_CSG_SLOT_PRIORITY - group->sched_act_seq_num);
|
||||
else if (MAX_CSG_SLOT_PRIORITY > (slots_for_tick + used_slots))
|
||||
slot_prio = (u8)(MAX_CSG_SLOT_PRIORITY - (slots_for_tick + used_slots));
|
||||
else
|
||||
|
|
@ -3644,7 +3670,7 @@ static void program_suspending_csg_slots(struct kbase_device *kbdev)
|
|||
"[%llu] Group %d of context %d_%d on slot %u failed to suspend (timeout %d ms)",
|
||||
kbase_backend_get_cycle_cnt(kbdev), group->handle,
|
||||
group->kctx->tgid, group->kctx->id, i,
|
||||
kbdev->csf.fw_timeout_ms);
|
||||
kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT));
|
||||
if (kbase_csf_firmware_ping_wait(kbdev,
|
||||
FW_PING_AFTER_ERROR_TIMEOUT_MS))
|
||||
error_type = DF_PING_REQUEST_TIMEOUT;
|
||||
|
|
@ -3713,7 +3739,8 @@ static void wait_csg_slots_start(struct kbase_device *kbdev)
|
|||
{
|
||||
u32 num_groups = kbdev->csf.global_iface.group_num;
|
||||
struct kbase_csf_scheduler *scheduler = &kbdev->csf.scheduler;
|
||||
long remaining = kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
|
||||
long remaining =
|
||||
kbase_csf_timeout_in_jiffies(kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT));
|
||||
DECLARE_BITMAP(slot_mask, MAX_SUPPORTED_CSGS) = { 0 };
|
||||
u32 i;
|
||||
|
||||
|
|
@ -3753,8 +3780,9 @@ static void wait_csg_slots_start(struct kbase_device *kbdev)
|
|||
|
||||
dev_err(kbdev->dev,
|
||||
"[%llu] Timeout (%d ms) waiting for CSG slots to start, slots: 0x%*pb\n",
|
||||
kbase_backend_get_cycle_cnt(kbdev), kbdev->csf.fw_timeout_ms,
|
||||
num_groups, slot_mask);
|
||||
kbase_backend_get_cycle_cnt(kbdev),
|
||||
kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT), num_groups,
|
||||
slot_mask);
|
||||
if (kbase_csf_firmware_ping_wait(kbdev, FW_PING_AFTER_ERROR_TIMEOUT_MS))
|
||||
error_type = DF_PING_REQUEST_TIMEOUT;
|
||||
schedule_actions_trigger_df(kbdev, group->kctx, error_type);
|
||||
|
|
@ -3884,7 +3912,8 @@ static int wait_csg_slots_handshake_ack(struct kbase_device *kbdev, u32 field_ma
|
|||
static void wait_csg_slots_finish_prio_update(struct kbase_device *kbdev)
|
||||
{
|
||||
unsigned long *slot_mask = kbdev->csf.scheduler.csg_slots_prio_update;
|
||||
long wait_time = kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
|
||||
const unsigned int fw_timeout_ms = kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT);
|
||||
long wait_time = kbase_csf_timeout_in_jiffies(fw_timeout_ms);
|
||||
int ret = wait_csg_slots_handshake_ack(kbdev, CSG_REQ_EP_CFG_MASK, slot_mask, wait_time);
|
||||
|
||||
lockdep_assert_held(&kbdev->csf.scheduler.lock);
|
||||
|
|
@ -3898,7 +3927,7 @@ static void wait_csg_slots_finish_prio_update(struct kbase_device *kbdev)
|
|||
dev_warn(
|
||||
kbdev->dev,
|
||||
"[%llu] Timeout (%d ms) on CSG_REQ:EP_CFG, skipping the update wait: slot mask=0x%lx",
|
||||
kbase_backend_get_cycle_cnt(kbdev), kbdev->csf.fw_timeout_ms, slot_mask[0]);
|
||||
kbase_backend_get_cycle_cnt(kbdev), fw_timeout_ms, slot_mask[0]);
|
||||
if (kbase_csf_firmware_ping_wait(kbdev, FW_PING_AFTER_ERROR_TIMEOUT_MS))
|
||||
error_type = DF_PING_REQUEST_TIMEOUT;
|
||||
schedule_actions_trigger_df(kbdev, group->kctx, error_type);
|
||||
|
|
@ -4297,6 +4326,34 @@ static void scheduler_apply(struct kbase_device *kbdev)
|
|||
program_suspending_csg_slots(kbdev);
|
||||
}
|
||||
|
||||
/**
|
||||
* scheduler_scan_add_group_to_sched_list - Add a schedulable group to one of the scheduler's
|
||||
* schedulable lists following exactly the scan sequence.
|
||||
*
|
||||
* @kbdev: Pointer to the GPU device.
|
||||
* @sched_list: the scheduling list for appending the given group
|
||||
* @group: the group that is to be added forllowing the scan out procedure.
|
||||
*
|
||||
* This function is called when a group is required to be added to a scheduler maintained list
|
||||
* for a tick/tock scheduling operation.
|
||||
*/
|
||||
static void scheduler_scan_add_group_to_sched_list(struct kbase_device *kbdev,
|
||||
struct list_head *sched_list,
|
||||
struct kbase_queue_group *group)
|
||||
{
|
||||
struct kbase_csf_scheduler *scheduler = &kbdev->csf.scheduler;
|
||||
|
||||
lockdep_assert_held(&scheduler->lock);
|
||||
lockdep_assert_held(&scheduler->interrupt_lock);
|
||||
|
||||
list_add_tail(&group->link_to_schedule, sched_list);
|
||||
/* Set the act_seq_num when a group is added to a schedulable list.
|
||||
* Otherwise it's a don't care case, as the group would not be involved
|
||||
* with onslot running.
|
||||
*/
|
||||
group->sched_act_seq_num = scheduler->csg_scan_sched_count++;
|
||||
}
|
||||
|
||||
static void scheduler_ctx_scan_groups(struct kbase_device *kbdev, struct kbase_context *kctx,
|
||||
int priority, struct list_head *privileged_groups,
|
||||
struct list_head *active_groups)
|
||||
|
|
@ -4338,17 +4395,17 @@ static void scheduler_ctx_scan_groups(struct kbase_device *kbdev, struct kbase_c
|
|||
update_idle_protm_group_state_to_runnable(group);
|
||||
else if (queue_group_idle_locked(group)) {
|
||||
if (can_schedule_idle_group(group))
|
||||
list_add_tail(&group->link_to_schedule,
|
||||
&scheduler->idle_groups_to_schedule);
|
||||
scheduler_scan_add_group_to_sched_list(
|
||||
kbdev, &scheduler->idle_groups_to_schedule, group);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (protm_req && (group->priority == KBASE_QUEUE_GROUP_PRIORITY_REALTIME)) {
|
||||
list_add_tail(&group->link_to_schedule, privileged_groups);
|
||||
scheduler_scan_add_group_to_sched_list(kbdev, privileged_groups, group);
|
||||
continue;
|
||||
}
|
||||
|
||||
list_add_tail(&group->link_to_schedule, active_groups);
|
||||
scheduler_scan_add_group_to_sched_list(kbdev, active_groups, group);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -4559,7 +4616,9 @@ static void scheduler_update_idle_slots_status(struct kbase_device *kbdev,
|
|||
|
||||
/* The groups are aggregated into a single kernel doorbell request */
|
||||
if (!bitmap_empty(csg_bitmap, num_groups)) {
|
||||
long wt = kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
|
||||
const unsigned int fw_timeout_ms =
|
||||
kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT);
|
||||
long wt = kbase_csf_timeout_in_jiffies(fw_timeout_ms);
|
||||
u32 db_slots = (u32)csg_bitmap[0];
|
||||
|
||||
kbase_csf_ring_csg_slots_doorbell(kbdev, db_slots);
|
||||
|
|
@ -4574,8 +4633,7 @@ static void scheduler_update_idle_slots_status(struct kbase_device *kbdev,
|
|||
dev_warn(
|
||||
kbdev->dev,
|
||||
"[%llu] Timeout (%d ms) on CSG_REQ:STATUS_UPDATE, treat groups as not idle: slot mask=0x%lx",
|
||||
kbase_backend_get_cycle_cnt(kbdev), kbdev->csf.fw_timeout_ms,
|
||||
csg_bitmap[0]);
|
||||
kbase_backend_get_cycle_cnt(kbdev), fw_timeout_ms, csg_bitmap[0]);
|
||||
schedule_actions_trigger_df(kbdev, group->kctx,
|
||||
DF_CSG_STATUS_UPDATE_TIMEOUT);
|
||||
|
||||
|
|
@ -4753,7 +4811,8 @@ static int suspend_active_groups_on_powerdown(struct kbase_device *kbdev, bool s
|
|||
dev_warn(
|
||||
kbdev->dev,
|
||||
"[%llu] Timeout (%d ms) waiting for CSG slots to suspend on power down, slot_mask: 0x%*pb\n",
|
||||
kbase_backend_get_cycle_cnt(kbdev), kbdev->csf.fw_timeout_ms,
|
||||
kbase_backend_get_cycle_cnt(kbdev),
|
||||
kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT),
|
||||
kbdev->csf.global_iface.group_num, slot_mask);
|
||||
if (kbase_csf_firmware_ping_wait(kbdev, FW_PING_AFTER_ERROR_TIMEOUT_MS))
|
||||
error_type = DF_PING_REQUEST_TIMEOUT;
|
||||
|
|
@ -4843,42 +4902,29 @@ static bool scheduler_idle_suspendable(struct kbase_device *kbdev)
|
|||
spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
|
||||
spin_lock(&scheduler->interrupt_lock);
|
||||
|
||||
if (scheduler->fast_gpu_idle_handling) {
|
||||
scheduler->fast_gpu_idle_handling = false;
|
||||
|
||||
if (scheduler->total_runnable_grps) {
|
||||
suspend = !atomic_read(&scheduler->non_idle_offslot_grps) &&
|
||||
kbase_pm_idle_groups_sched_suspendable(kbdev);
|
||||
} else
|
||||
suspend = kbase_pm_no_runnables_sched_suspendable(kbdev);
|
||||
|
||||
if (suspend && unlikely(atomic_read(&scheduler->gpu_no_longer_idle)))
|
||||
suspend = false;
|
||||
|
||||
spin_unlock(&scheduler->interrupt_lock);
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
|
||||
return suspend;
|
||||
}
|
||||
|
||||
if (scheduler->total_runnable_grps) {
|
||||
/* Check both on-slots and off-slots groups idle status */
|
||||
suspend = kbase_csf_scheduler_all_csgs_idle(kbdev) &&
|
||||
suspend = (scheduler->fast_gpu_idle_handling ||
|
||||
kbase_csf_scheduler_all_csgs_idle(kbdev)) &&
|
||||
!atomic_read(&scheduler->non_idle_offslot_grps) &&
|
||||
kbase_pm_idle_groups_sched_suspendable(kbdev);
|
||||
} else
|
||||
suspend = kbase_pm_no_runnables_sched_suspendable(kbdev);
|
||||
|
||||
if (suspend && unlikely(atomic_read(&scheduler->gpu_no_longer_idle)))
|
||||
suspend = false;
|
||||
|
||||
/* Confirm that all groups are actually idle before proceeding with
|
||||
* suspension as groups might potentially become active again without
|
||||
* informing the scheduler in case userspace rings a doorbell directly.
|
||||
*/
|
||||
if (suspend && (unlikely(atomic_read(&scheduler->gpu_no_longer_idle)) ||
|
||||
unlikely(!all_on_slot_groups_remained_idle(kbdev)))) {
|
||||
if (suspend && !scheduler->fast_gpu_idle_handling &&
|
||||
unlikely(!all_on_slot_groups_remained_idle(kbdev))) {
|
||||
dev_dbg(kbdev->dev, "GPU suspension skipped due to active CSGs");
|
||||
suspend = false;
|
||||
}
|
||||
|
||||
scheduler->fast_gpu_idle_handling = false;
|
||||
spin_unlock(&scheduler->interrupt_lock);
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
|
||||
|
|
@ -5021,6 +5067,7 @@ static int scheduler_prepare(struct kbase_device *kbdev)
|
|||
WARN_ON(!list_empty(&scheduler->idle_groups_to_schedule));
|
||||
scheduler->num_active_address_spaces = 0;
|
||||
scheduler->num_csg_slots_for_tick = 0;
|
||||
scheduler->csg_scan_sched_count = 0;
|
||||
bitmap_zero(scheduler->csg_slots_prio_update, MAX_SUPPORTED_CSGS);
|
||||
INIT_LIST_HEAD(&privileged_groups);
|
||||
INIT_LIST_HEAD(&active_groups);
|
||||
|
|
@ -5031,9 +5078,19 @@ static int scheduler_prepare(struct kbase_device *kbdev)
|
|||
for (i = 0; i < KBASE_QUEUE_GROUP_PRIORITY_COUNT; ++i) {
|
||||
struct kbase_context *kctx;
|
||||
|
||||
list_for_each_entry(kctx, &scheduler->runnable_kctxs, csf.link)
|
||||
scheduler_ctx_scan_groups(kbdev, kctx, i, &privileged_groups,
|
||||
&active_groups);
|
||||
/* Scan the per-priority list of groups twice, firstly for the
|
||||
* prioritised contexts, then the normal ones.
|
||||
*/
|
||||
list_for_each_entry(kctx, &scheduler->runnable_kctxs, csf.link) {
|
||||
if (atomic_read(&kctx->prioritized))
|
||||
scheduler_ctx_scan_groups(kbdev, kctx, i, &privileged_groups,
|
||||
&active_groups);
|
||||
}
|
||||
list_for_each_entry(kctx, &scheduler->runnable_kctxs, csf.link) {
|
||||
if (!atomic_read(&kctx->prioritized))
|
||||
scheduler_ctx_scan_groups(kbdev, kctx, i, &privileged_groups,
|
||||
&active_groups);
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&scheduler->interrupt_lock, flags);
|
||||
|
||||
|
|
@ -5051,7 +5108,7 @@ static int scheduler_prepare(struct kbase_device *kbdev)
|
|||
* of the tick. It will be subject to up/downs during the scheduler
|
||||
* active phase.
|
||||
*/
|
||||
atomic_set(&scheduler->non_idle_offslot_grps, scheduler->non_idle_scanout_grps);
|
||||
atomic_set(&scheduler->non_idle_offslot_grps, (int)scheduler->non_idle_scanout_grps);
|
||||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_GRP_INC, NULL,
|
||||
scheduler->non_idle_scanout_grps);
|
||||
|
||||
|
|
@ -5296,7 +5353,7 @@ static void evict_lru_or_blocked_csg(struct kbase_device *kbdev)
|
|||
}
|
||||
|
||||
if (lru_idle_group != NULL) {
|
||||
unsigned long slot_mask = 1 << lru_idle_group->csg_nr;
|
||||
unsigned long slot_mask = 1UL << lru_idle_group->csg_nr;
|
||||
|
||||
dev_dbg(kbdev->dev, "Suspending LRU idle group %d of context %d_%d on slot %d",
|
||||
lru_idle_group->handle, lru_idle_group->kctx->tgid,
|
||||
|
|
@ -5310,7 +5367,8 @@ static void evict_lru_or_blocked_csg(struct kbase_device *kbdev)
|
|||
"[%llu] LRU idle group %d of context %d_%d failed to suspend on slot %d (timeout %d ms)",
|
||||
kbase_backend_get_cycle_cnt(kbdev), lru_idle_group->handle,
|
||||
lru_idle_group->kctx->tgid, lru_idle_group->kctx->id,
|
||||
lru_idle_group->csg_nr, kbdev->csf.fw_timeout_ms);
|
||||
lru_idle_group->csg_nr,
|
||||
kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT));
|
||||
if (kbase_csf_firmware_ping_wait(kbdev, FW_PING_AFTER_ERROR_TIMEOUT_MS))
|
||||
error_type = DF_PING_REQUEST_TIMEOUT;
|
||||
schedule_actions_trigger_df(kbdev, lru_idle_group->kctx, error_type);
|
||||
|
|
@ -5323,7 +5381,6 @@ static void schedule_actions(struct kbase_device *kbdev, bool is_tick)
|
|||
struct kbase_csf_scheduler *scheduler = &kbdev->csf.scheduler;
|
||||
unsigned long flags;
|
||||
struct kbase_queue_group *protm_grp;
|
||||
int ret;
|
||||
bool skip_scheduling_actions;
|
||||
bool skip_idle_slots_update;
|
||||
bool new_protm_top_grp = false;
|
||||
|
|
@ -5332,8 +5389,7 @@ static void schedule_actions(struct kbase_device *kbdev, bool is_tick)
|
|||
kbase_reset_gpu_assert_prevented(kbdev);
|
||||
lockdep_assert_held(&scheduler->lock);
|
||||
|
||||
ret = kbase_csf_scheduler_wait_mcu_active(kbdev);
|
||||
if (ret) {
|
||||
if (kbase_csf_scheduler_wait_mcu_active(kbdev)) {
|
||||
dev_err(kbdev->dev, "Wait for MCU power on failed on scheduling tick/tock");
|
||||
return;
|
||||
}
|
||||
|
|
@ -5658,7 +5714,8 @@ static int suspend_active_queue_groups_on_reset(struct kbase_device *kbdev)
|
|||
* case.
|
||||
*/
|
||||
kbase_gpu_start_cache_clean(kbdev, GPU_COMMAND_CACHE_CLN_INV_L2_LSC);
|
||||
ret2 = kbase_gpu_wait_cache_clean_timeout(kbdev, kbdev->mmu_or_gpu_cache_op_wait_time_ms);
|
||||
ret2 = kbase_gpu_wait_cache_clean_timeout(
|
||||
kbdev, kbase_get_timeout_ms(kbdev, MMU_AS_INACTIVE_WAIT_TIMEOUT));
|
||||
if (ret2) {
|
||||
dev_err(kbdev->dev, "[%llu] Timeout waiting for CACHE_CLN_INV_L2_LSC",
|
||||
kbase_backend_get_cycle_cnt(kbdev));
|
||||
|
|
@ -5755,7 +5812,8 @@ static bool scheduler_handle_reset_in_protected_mode(struct kbase_device *kbdev)
|
|||
* anyways.
|
||||
*/
|
||||
new_val = atomic_inc_return(&scheduler->non_idle_offslot_grps);
|
||||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_GRP_INC, group, new_val);
|
||||
KBASE_KTRACE_ADD_CSF_GRP(kbdev, SCHEDULER_NONIDLE_OFFSLOT_GRP_INC, group,
|
||||
(u64)new_val);
|
||||
}
|
||||
|
||||
unlock:
|
||||
|
|
@ -5898,9 +5956,13 @@ static void firmware_aliveness_monitor(struct work_struct *work)
|
|||
goto exit;
|
||||
}
|
||||
|
||||
kbase_csf_scheduler_wait_mcu_active(kbdev);
|
||||
if (kbase_csf_scheduler_wait_mcu_active(kbdev)) {
|
||||
dev_err(kbdev->dev, "Wait for MCU power on failed at fw aliveness monitor");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
err = kbase_csf_firmware_ping_wait(kbdev, kbdev->csf.fw_timeout_ms);
|
||||
err = kbase_csf_firmware_ping_wait(kbdev,
|
||||
kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT));
|
||||
|
||||
if (err) {
|
||||
/* It is acceptable to enqueue a reset whilst we've prevented
|
||||
|
|
@ -6414,7 +6476,10 @@ static void check_group_sync_update_worker(struct work_struct *work)
|
|||
|
||||
#if IS_ENABLED(CONFIG_DEBUG_FS)
|
||||
if (unlikely(scheduler->state == SCHED_BUSY)) {
|
||||
queue_work(kctx->csf.sched.sync_update_wq, &kctx->csf.sched.sync_update_work);
|
||||
queue_work(atomic_read(&kctx->prioritized) ?
|
||||
kctx->csf.sched.sync_update_wq_high_prio :
|
||||
kctx->csf.sched.sync_update_wq_normal_prio,
|
||||
&kctx->csf.sched.sync_update_work);
|
||||
mutex_unlock(&scheduler->lock);
|
||||
return;
|
||||
}
|
||||
|
|
@ -6457,10 +6522,13 @@ static void check_group_sync_update_worker(struct work_struct *work)
|
|||
static enum kbase_csf_event_callback_action check_group_sync_update_cb(void *param)
|
||||
{
|
||||
struct kbase_context *const kctx = param;
|
||||
struct workqueue_struct *wq = atomic_read(&kctx->prioritized) ?
|
||||
kctx->csf.sched.sync_update_wq_high_prio :
|
||||
kctx->csf.sched.sync_update_wq_normal_prio;
|
||||
|
||||
KBASE_KTRACE_ADD(kctx->kbdev, SCHEDULER_GROUP_SYNC_UPDATE_EVENT, kctx, 0u);
|
||||
|
||||
queue_work(kctx->csf.sched.sync_update_wq, &kctx->csf.sched.sync_update_work);
|
||||
queue_work(wq, &kctx->csf.sched.sync_update_work);
|
||||
|
||||
return KBASE_CSF_EVENT_CALLBACK_KEEP;
|
||||
}
|
||||
|
|
@ -6483,12 +6551,22 @@ int kbase_csf_scheduler_context_init(struct kbase_context *kctx)
|
|||
|
||||
INIT_LIST_HEAD(&kctx->csf.sched.idle_wait_groups);
|
||||
|
||||
kctx->csf.sched.sync_update_wq =
|
||||
alloc_ordered_workqueue("mali_kbase_csf_sync_update_wq", WQ_HIGHPRI);
|
||||
if (!kctx->csf.sched.sync_update_wq) {
|
||||
dev_err(kbdev->dev, "Failed to initialize scheduler context workqueue");
|
||||
kctx->csf.sched.sync_update_wq_high_prio = alloc_ordered_workqueue(
|
||||
"mali_sync_wq_%i_high_prio", WQ_UNBOUND | WQ_HIGHPRI, kctx->tgid);
|
||||
if (kctx->csf.sched.sync_update_wq_high_prio == NULL) {
|
||||
dev_err(kbdev->dev,
|
||||
"Failed to initialize scheduler context high-priority workqueue");
|
||||
err = -ENOMEM;
|
||||
goto alloc_wq_failed;
|
||||
goto alloc_high_prio_wq_failed;
|
||||
}
|
||||
|
||||
kctx->csf.sched.sync_update_wq_normal_prio =
|
||||
alloc_ordered_workqueue("mali_sync_wq_%i_normal_prio", 0, kctx->tgid);
|
||||
if (kctx->csf.sched.sync_update_wq_normal_prio == NULL) {
|
||||
dev_err(kbdev->dev,
|
||||
"Failed to initialize scheduler context normal-priority workqueue");
|
||||
err = -ENOMEM;
|
||||
goto alloc_normal_prio_wq_failed;
|
||||
}
|
||||
|
||||
INIT_WORK(&kctx->csf.sched.sync_update_work, check_group_sync_update_worker);
|
||||
|
|
@ -6505,8 +6583,10 @@ int kbase_csf_scheduler_context_init(struct kbase_context *kctx)
|
|||
return err;
|
||||
|
||||
event_wait_add_failed:
|
||||
destroy_workqueue(kctx->csf.sched.sync_update_wq);
|
||||
alloc_wq_failed:
|
||||
destroy_workqueue(kctx->csf.sched.sync_update_wq_normal_prio);
|
||||
alloc_normal_prio_wq_failed:
|
||||
destroy_workqueue(kctx->csf.sched.sync_update_wq_high_prio);
|
||||
alloc_high_prio_wq_failed:
|
||||
kbase_ctx_sched_remove_ctx(kctx);
|
||||
#if IS_ENABLED(CONFIG_MALI_TRACE_POWER_GPU_WORK_PERIOD)
|
||||
gpu_metrics_ctx_term(kctx);
|
||||
|
|
@ -6518,7 +6598,8 @@ void kbase_csf_scheduler_context_term(struct kbase_context *kctx)
|
|||
{
|
||||
kbase_csf_event_wait_remove(kctx, check_group_sync_update_cb, kctx);
|
||||
cancel_work_sync(&kctx->csf.sched.sync_update_work);
|
||||
destroy_workqueue(kctx->csf.sched.sync_update_wq);
|
||||
destroy_workqueue(kctx->csf.sched.sync_update_wq_normal_prio);
|
||||
destroy_workqueue(kctx->csf.sched.sync_update_wq_high_prio);
|
||||
|
||||
kbase_ctx_sched_remove_ctx(kctx);
|
||||
#if IS_ENABLED(CONFIG_MALI_TRACE_POWER_GPU_WORK_PERIOD)
|
||||
|
|
@ -6995,6 +7076,7 @@ int kbase_csf_scheduler_handle_runtime_suspend(struct kbase_device *kbdev)
|
|||
|
||||
spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
|
||||
kbdev->pm.backend.exit_gpu_sleep_mode = true;
|
||||
kbdev->pm.backend.runtime_suspend_abort_reason = ABORT_REASON_NON_IDLE_CGS;
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
|
||||
kbase_csf_scheduler_invoke_tick(kbdev);
|
||||
|
|
@ -7060,3 +7142,4 @@ void kbase_csf_scheduler_force_wakeup(struct kbase_device *kbdev)
|
|||
scheduler_wakeup(kbdev, true);
|
||||
mutex_unlock(&scheduler->lock);
|
||||
}
|
||||
KBASE_EXPORT_TEST_API(kbase_csf_scheduler_force_wakeup);
|
||||
|
|
|
|||
|
|
@ -122,7 +122,7 @@ bool kbase_csf_scheduler_group_events_enabled(struct kbase_device *kbdev,
|
|||
* Note: Caller must hold the interrupt_lock.
|
||||
*/
|
||||
struct kbase_queue_group *kbase_csf_scheduler_get_group_on_slot(struct kbase_device *kbdev,
|
||||
int slot);
|
||||
u32 slot);
|
||||
|
||||
/**
|
||||
* kbase_csf_scheduler_group_deschedule() - Deschedule a GPU command queue
|
||||
|
|
@ -591,8 +591,11 @@ int kbase_csf_scheduler_handle_runtime_suspend(struct kbase_device *kbdev);
|
|||
* @kbdev: Pointer to the device
|
||||
*
|
||||
* This function is called when a GPU idle IRQ has been raised.
|
||||
*
|
||||
* Return: true if the PM state machine needs to be invoked after the processing
|
||||
* of GPU idle irq, otherwise false.
|
||||
*/
|
||||
void kbase_csf_scheduler_process_gpu_idle_event(struct kbase_device *kbdev);
|
||||
bool kbase_csf_scheduler_process_gpu_idle_event(struct kbase_device *kbdev);
|
||||
|
||||
/**
|
||||
* kbase_csf_scheduler_get_nr_active_csgs() - Get the number of active CSGs
|
||||
|
|
|
|||
|
|
@ -99,11 +99,7 @@ static void kbasep_csf_sync_print_kcpu_fence_wait_or_signal(char *buffer, int *l
|
|||
struct kbase_kcpu_command *cmd,
|
||||
const char *cmd_name)
|
||||
{
|
||||
#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
|
||||
struct fence *fence = NULL;
|
||||
#else
|
||||
struct dma_fence *fence = NULL;
|
||||
#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0) */
|
||||
struct kbase_kcpu_command_fence_info *fence_info;
|
||||
struct kbase_sync_fence_info info;
|
||||
const char *timeline_name = NULL;
|
||||
|
|
|
|||
|
|
@ -225,7 +225,7 @@ static void remove_unlinked_chunk(struct kbase_context *kctx,
|
|||
* For "no user free count", we check that the count is 1 as it is a shrinkable region;
|
||||
* no other code part within kbase can take a reference to it.
|
||||
*/
|
||||
WARN_ON(atomic_read(&chunk->region->no_user_free_count) > 1);
|
||||
WARN_ON(atomic64_read(&chunk->region->no_user_free_count) > 1);
|
||||
kbase_va_region_no_user_free_dec(chunk->region);
|
||||
#if !defined(CONFIG_MALI_VECTOR_DUMP)
|
||||
chunk->region->flags &= ~KBASE_REG_DONT_NEED;
|
||||
|
|
@ -308,7 +308,7 @@ static struct kbase_csf_tiler_heap_chunk *alloc_new_chunk(struct kbase_context *
|
|||
* It should be fine and not a security risk if we let the region leak till
|
||||
* region tracker termination in such a case.
|
||||
*/
|
||||
if (unlikely(atomic_read(&chunk->region->no_user_free_count) > 1)) {
|
||||
if (unlikely(atomic64_read(&chunk->region->no_user_free_count) > 1)) {
|
||||
dev_err(kctx->kbdev->dev, "Chunk region has no_user_free_count > 1!\n");
|
||||
goto unroll_region;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
#define HEAP_SHRINKER_SEEKS (DEFAULT_SEEKS + 2)
|
||||
|
||||
/* Tiler heap shrinker batch value */
|
||||
#define HEAP_SHRINKER_BATCH (512)
|
||||
#define HEAP_SHRINKER_BATCH (512 / (GPU_PAGES_PER_CPU_PAGE))
|
||||
|
||||
/* Tiler heap reclaim scan (free) method size for limiting a scan run length */
|
||||
#define HEAP_RECLAIM_SCAN_BATCH_SIZE (HEAP_SHRINKER_BATCH << 7)
|
||||
|
|
@ -69,8 +69,8 @@ static void detach_ctx_from_heap_reclaim_mgr(struct kbase_context *kctx)
|
|||
|
||||
list_del_init(&info->mgr_link);
|
||||
if (remaining)
|
||||
WARN_ON(atomic_sub_return(remaining, &scheduler->reclaim_mgr.unused_pages) <
|
||||
0);
|
||||
WARN_ON(atomic_sub_return((int)remaining,
|
||||
&scheduler->reclaim_mgr.unused_pages) < 0);
|
||||
|
||||
dev_dbg(kctx->kbdev->dev,
|
||||
"Reclaim_mgr_detach: ctx_%d_%d, est_pages=0%u, freed_pages=%u", kctx->tgid,
|
||||
|
|
@ -96,7 +96,7 @@ static void attach_ctx_to_heap_reclaim_mgr(struct kbase_context *kctx)
|
|||
|
||||
list_add_tail(&info->mgr_link, &scheduler->reclaim_mgr.ctx_lists[prio]);
|
||||
/* Accumulate the estimated pages to the manager total field */
|
||||
atomic_add(info->nr_est_unused_pages, &scheduler->reclaim_mgr.unused_pages);
|
||||
atomic_add((int)info->nr_est_unused_pages, &scheduler->reclaim_mgr.unused_pages);
|
||||
|
||||
dev_dbg(kctx->kbdev->dev, "Reclaim_mgr_attach: ctx_%d_%d, est_count_pages=%u", kctx->tgid,
|
||||
kctx->id, info->nr_est_unused_pages);
|
||||
|
|
@ -201,8 +201,8 @@ static unsigned long reclaim_unused_heap_pages(struct kbase_device *kbdev)
|
|||
* headers of the individual chunks and buffer descriptors.
|
||||
*/
|
||||
kbase_gpu_start_cache_clean(kbdev, GPU_COMMAND_CACHE_CLN_INV_L2);
|
||||
if (kbase_gpu_wait_cache_clean_timeout(kbdev,
|
||||
kbdev->mmu_or_gpu_cache_op_wait_time_ms))
|
||||
if (kbase_gpu_wait_cache_clean_timeout(
|
||||
kbdev, kbase_get_timeout_ms(kbdev, MMU_AS_INACTIVE_WAIT_TIMEOUT)))
|
||||
dev_warn(
|
||||
kbdev->dev,
|
||||
"[%llu] Timeout waiting for CACHE_CLN_INV_L2 to complete before Tiler heap reclaim",
|
||||
|
|
@ -241,7 +241,7 @@ static unsigned long reclaim_unused_heap_pages(struct kbase_device *kbdev)
|
|||
u32 rm_cnt = MIN(info->nr_est_unused_pages - info->nr_freed_pages,
|
||||
freed_pages);
|
||||
|
||||
WARN_ON(atomic_sub_return(rm_cnt, &mgr->unused_pages) < 0);
|
||||
WARN_ON(atomic_sub_return((int)rm_cnt, &mgr->unused_pages) < 0);
|
||||
|
||||
/* tracking the freed pages, before a potential detach call */
|
||||
info->nr_freed_pages += freed_pages;
|
||||
|
|
@ -278,7 +278,7 @@ static unsigned long kbase_csf_tiler_heap_reclaim_count_free_pages(struct kbase_
|
|||
struct shrink_control *sc)
|
||||
{
|
||||
struct kbase_csf_sched_heap_reclaim_mgr *mgr = &kbdev->csf.scheduler.reclaim_mgr;
|
||||
unsigned long page_cnt = atomic_read(&mgr->unused_pages);
|
||||
unsigned long page_cnt = (unsigned long)atomic_read(&mgr->unused_pages);
|
||||
|
||||
CSTD_UNUSED(sc);
|
||||
|
||||
|
|
@ -300,14 +300,14 @@ static unsigned long kbase_csf_tiler_heap_reclaim_scan_free_pages(struct kbase_d
|
|||
|
||||
/* Wait for roughly 2-ms */
|
||||
wait_event_timeout(kbdev->csf.event_wait, (scheduler->state != SCHED_BUSY),
|
||||
msecs_to_jiffies(2));
|
||||
(long)msecs_to_jiffies(2));
|
||||
if (!mutex_trylock(&kbdev->csf.scheduler.lock)) {
|
||||
dev_dbg(kbdev->dev, "Tiler heap reclaim scan see device busy (freed: 0)");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
avail = atomic_read(&mgr->unused_pages);
|
||||
avail = (unsigned long)atomic_read(&mgr->unused_pages);
|
||||
if (avail)
|
||||
freed = reclaim_unused_heap_pages(kbdev);
|
||||
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ static int set_timeout(struct kbase_device *const kbdev, u64 const timeout)
|
|||
|
||||
dev_dbg(kbdev->dev, "New progress timeout: %llu cycles\n", timeout);
|
||||
|
||||
atomic64_set(&kbdev->csf.progress_timeout, timeout);
|
||||
atomic64_set(&kbdev->csf.progress_timeout, (s64)timeout);
|
||||
kbase_device_set_timeout(kbdev, CSF_SCHED_PROTM_PROGRESS_TIMEOUT, timeout, 1);
|
||||
|
||||
return 0;
|
||||
|
|
@ -112,7 +112,7 @@ static ssize_t progress_timeout_store(struct device *const dev, struct device_at
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -179,5 +179,5 @@ void kbase_csf_timeout_term(struct kbase_device *const kbdev)
|
|||
|
||||
u64 kbase_csf_timeout_get(struct kbase_device *const kbdev)
|
||||
{
|
||||
return atomic64_read(&kbdev->csf.progress_timeout);
|
||||
return (u64)atomic64_read(&kbdev->csf.progress_timeout);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -88,8 +88,8 @@ bool kbase_debug_csf_fault_notify(struct kbase_device *kbdev, struct kbase_conte
|
|||
goto unlock;
|
||||
}
|
||||
|
||||
kbdev->csf.dof.kctx_tgid = kctx ? kctx->tgid : 0;
|
||||
kbdev->csf.dof.kctx_id = kctx ? kctx->id : 0;
|
||||
kbdev->csf.dof.kctx_tgid = kctx ? (unsigned int)kctx->tgid : 0U;
|
||||
kbdev->csf.dof.kctx_id = kctx ? kctx->id : 0U;
|
||||
kbdev->csf.dof.error_code = error;
|
||||
kbase_debug_csf_fault_wakeup(kbdev);
|
||||
|
||||
|
|
@ -142,7 +142,7 @@ static ssize_t debug_csf_fault_read(struct file *file, char __user *buffer, size
|
|||
spin_unlock_irqrestore(&kbdev->csf.dof.lock, flags);
|
||||
|
||||
dev_info(kbdev->dev, "debug csf fault info read");
|
||||
return simple_read_from_buffer(buffer, size, f_pos, buf, count);
|
||||
return simple_read_from_buffer(buffer, size, f_pos, buf, (size_t)count);
|
||||
}
|
||||
|
||||
static int debug_csf_fault_open(struct inode *in, struct file *file)
|
||||
|
|
@ -197,7 +197,7 @@ static ssize_t debug_csf_fault_write(struct file *file, const char __user *ubuf,
|
|||
*/
|
||||
wake_up(&kbdev->csf.dof.dump_wait_wq);
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
static int debug_csf_fault_release(struct inode *in, struct file *file)
|
||||
|
|
|
|||
|
|
@ -778,7 +778,8 @@ KBASE_EXPORT_TEST_API(kbase_debug_coresight_csf_state_check);
|
|||
bool kbase_debug_coresight_csf_state_wait(struct kbase_device *kbdev,
|
||||
enum kbase_debug_coresight_csf_state state)
|
||||
{
|
||||
const long wait_timeout = kbase_csf_timeout_in_jiffies(kbdev->csf.fw_timeout_ms);
|
||||
const long wait_timeout =
|
||||
kbase_csf_timeout_in_jiffies(kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT));
|
||||
struct kbase_debug_coresight_csf_config *config_entry, *next_config_entry;
|
||||
unsigned long flags;
|
||||
bool success = true;
|
||||
|
|
|
|||
|
|
@ -27,8 +27,9 @@
|
|||
|
||||
void kbasep_ktrace_backend_format_header(char *buffer, int sz, s32 *written)
|
||||
{
|
||||
*written += MAX(
|
||||
snprintf(buffer + *written, MAX(sz - *written, 0), "group,slot,prio,csi,kcpu"), 0);
|
||||
*written += MAX(snprintf(buffer + *written, (size_t)MAX(sz - *written, 0),
|
||||
"group,slot,prio,csi,kcpu"),
|
||||
0);
|
||||
}
|
||||
|
||||
void kbasep_ktrace_backend_format_msg(struct kbase_ktrace_msg *trace_msg, char *buffer, int sz,
|
||||
|
|
@ -43,38 +44,39 @@ void kbasep_ktrace_backend_format_msg(struct kbase_ktrace_msg *trace_msg, char *
|
|||
if (be_msg->gpu.flags & KBASE_KTRACE_FLAG_CSF_GROUP) {
|
||||
const s8 slot = be_msg->gpu.csg_nr;
|
||||
/* group,slot, */
|
||||
*written += MAX(snprintf(buffer + *written, MAX(sz - *written, 0), "%u,%d,",
|
||||
*written += MAX(snprintf(buffer + *written, (size_t)MAX(sz - *written, 0), "%u,%d,",
|
||||
be_msg->gpu.group_handle, slot),
|
||||
0);
|
||||
|
||||
/* prio */
|
||||
if (slot >= 0)
|
||||
*written += MAX(snprintf(buffer + *written, MAX(sz - *written, 0), "%u",
|
||||
be_msg->gpu.slot_prio),
|
||||
*written += MAX(snprintf(buffer + *written, (size_t)MAX(sz - *written, 0),
|
||||
"%u", be_msg->gpu.slot_prio),
|
||||
0);
|
||||
|
||||
/* , */
|
||||
*written += MAX(snprintf(buffer + *written, MAX(sz - *written, 0), ","), 0);
|
||||
*written += MAX(snprintf(buffer + *written, (size_t)MAX(sz - *written, 0), ","), 0);
|
||||
} else {
|
||||
/* No group,slot,prio fields, but ensure ending with "," */
|
||||
*written += MAX(snprintf(buffer + *written, MAX(sz - *written, 0), ",,,"), 0);
|
||||
*written +=
|
||||
MAX(snprintf(buffer + *written, (size_t)MAX(sz - *written, 0), ",,,"), 0);
|
||||
}
|
||||
|
||||
/* queue parts: csi */
|
||||
if (trace_msg->backend.gpu.flags & KBASE_KTRACE_FLAG_CSF_QUEUE)
|
||||
*written += MAX(snprintf(buffer + *written, MAX(sz - *written, 0), "%d",
|
||||
*written += MAX(snprintf(buffer + *written, (size_t)MAX(sz - *written, 0), "%d",
|
||||
be_msg->gpu.csi_index),
|
||||
0);
|
||||
|
||||
/* , */
|
||||
*written += MAX(snprintf(buffer + *written, MAX(sz - *written, 0), ","), 0);
|
||||
*written += MAX(snprintf(buffer + *written, (size_t)MAX(sz - *written, 0), ","), 0);
|
||||
|
||||
if (be_msg->gpu.flags & KBASE_KTRACE_FLAG_CSF_KCPU) {
|
||||
/* kcpu data */
|
||||
*written +=
|
||||
MAX(snprintf(buffer + *written, MAX(sz - *written, 0), "kcpu %d (0x%llx)",
|
||||
be_msg->kcpu.id, be_msg->kcpu.extra_info_val),
|
||||
0);
|
||||
*written += MAX(snprintf(buffer + *written, (size_t)MAX(sz - *written, 0),
|
||||
"kcpu %d (0x%llx)", be_msg->kcpu.id,
|
||||
be_msg->kcpu.extra_info_val),
|
||||
0);
|
||||
}
|
||||
|
||||
/* Don't end with a trailing "," - this is a 'standalone' formatted
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ union kbase_ktrace_backend {
|
|||
* KBASE_KTRACE_FLAG_JM_ATOM
|
||||
*/
|
||||
u64 gpu_addr;
|
||||
int atom_number; /* Only valid for KBASE_KTRACE_FLAG_JM_ATOM */
|
||||
unsigned int atom_number; /* Only valid for KBASE_KTRACE_FLAG_JM_ATOM */
|
||||
/* Pack smaller members together */
|
||||
kbase_ktrace_code_t code;
|
||||
kbase_ktrace_flag_t flags;
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
|
||||
void kbasep_ktrace_backend_format_header(char *buffer, int sz, s32 *written)
|
||||
{
|
||||
*written += MAX(snprintf(buffer + *written, MAX(sz - *written, 0),
|
||||
*written += MAX(snprintf(buffer + *written, (size_t)MAX(sz - *written, 0),
|
||||
"katom,gpu_addr,jobslot,refcount"),
|
||||
0);
|
||||
}
|
||||
|
|
@ -37,8 +37,8 @@ void kbasep_ktrace_backend_format_msg(struct kbase_ktrace_msg *trace_msg, char *
|
|||
{
|
||||
/* katom */
|
||||
if (trace_msg->backend.gpu.flags & KBASE_KTRACE_FLAG_JM_ATOM)
|
||||
*written += MAX(snprintf(buffer + *written, MAX(sz - *written, 0),
|
||||
"atom %d (ud: 0x%llx 0x%llx)",
|
||||
*written += MAX(snprintf(buffer + *written, (size_t)MAX(sz - *written, 0),
|
||||
"atom %u (ud: 0x%llx 0x%llx)",
|
||||
trace_msg->backend.gpu.atom_number,
|
||||
trace_msg->backend.gpu.atom_udata[0],
|
||||
trace_msg->backend.gpu.atom_udata[1]),
|
||||
|
|
@ -46,31 +46,32 @@ void kbasep_ktrace_backend_format_msg(struct kbase_ktrace_msg *trace_msg, char *
|
|||
|
||||
/* gpu_addr */
|
||||
if (trace_msg->backend.gpu.flags & KBASE_KTRACE_FLAG_BACKEND)
|
||||
*written += MAX(snprintf(buffer + *written, MAX(sz - *written, 0), ",%.8llx,",
|
||||
trace_msg->backend.gpu.gpu_addr),
|
||||
*written += MAX(snprintf(buffer + *written, (size_t)MAX(sz - *written, 0),
|
||||
",%.8llx,", trace_msg->backend.gpu.gpu_addr),
|
||||
0);
|
||||
else
|
||||
*written += MAX(snprintf(buffer + *written, MAX(sz - *written, 0), ",,"), 0);
|
||||
*written +=
|
||||
MAX(snprintf(buffer + *written, (size_t)MAX(sz - *written, 0), ",,"), 0);
|
||||
|
||||
/* jobslot */
|
||||
if (trace_msg->backend.gpu.flags & KBASE_KTRACE_FLAG_JM_JOBSLOT)
|
||||
*written += MAX(snprintf(buffer + *written, MAX(sz - *written, 0), "%d",
|
||||
*written += MAX(snprintf(buffer + *written, (size_t)MAX(sz - *written, 0), "%d",
|
||||
trace_msg->backend.gpu.jobslot),
|
||||
0);
|
||||
|
||||
*written += MAX(snprintf(buffer + *written, MAX(sz - *written, 0), ","), 0);
|
||||
*written += MAX(snprintf(buffer + *written, (size_t)MAX(sz - *written, 0), ","), 0);
|
||||
|
||||
/* refcount */
|
||||
if (trace_msg->backend.gpu.flags & KBASE_KTRACE_FLAG_JM_REFCOUNT)
|
||||
*written += MAX(snprintf(buffer + *written, MAX(sz - *written, 0), "%d",
|
||||
*written += MAX(snprintf(buffer + *written, (size_t)MAX(sz - *written, 0), "%d",
|
||||
trace_msg->backend.gpu.refcount),
|
||||
0);
|
||||
}
|
||||
|
||||
void kbasep_ktrace_add_jm(struct kbase_device *kbdev, enum kbase_ktrace_code code,
|
||||
struct kbase_context *kctx, const struct kbase_jd_atom *katom,
|
||||
u64 gpu_addr, kbase_ktrace_flag_t flags, int refcount, int jobslot,
|
||||
u64 info_val)
|
||||
u64 gpu_addr, kbase_ktrace_flag_t flags, int refcount,
|
||||
unsigned int jobslot, u64 info_val)
|
||||
{
|
||||
unsigned long irqflags;
|
||||
struct kbase_ktrace_msg *trace_msg;
|
||||
|
|
|
|||
|
|
@ -42,8 +42,8 @@
|
|||
*/
|
||||
void kbasep_ktrace_add_jm(struct kbase_device *kbdev, enum kbase_ktrace_code code,
|
||||
struct kbase_context *kctx, const struct kbase_jd_atom *katom,
|
||||
u64 gpu_addr, kbase_ktrace_flag_t flags, int refcount, int jobslot,
|
||||
u64 info_val);
|
||||
u64 gpu_addr, kbase_ktrace_flag_t flags, int refcount,
|
||||
unsigned int jobslot, u64 info_val);
|
||||
|
||||
#define KBASE_KTRACE_RBUF_ADD_JM(kbdev, code, kctx, katom, gpu_addr, flags, refcount, jobslot, \
|
||||
info_val) \
|
||||
|
|
@ -175,7 +175,7 @@ void kbasep_ktrace_add_jm(struct kbase_device *kbdev, enum kbase_ktrace_code cod
|
|||
do { \
|
||||
/* capture values that could come from non-pure function calls */ \
|
||||
u64 __gpu_addr = gpu_addr; \
|
||||
int __jobslot = jobslot; \
|
||||
unsigned int __jobslot = jobslot; \
|
||||
KBASE_KTRACE_RBUF_ADD_JM(kbdev, code, kctx, katom, __gpu_addr, \
|
||||
KBASE_KTRACE_FLAG_JM_JOBSLOT, 0, __jobslot, 0); \
|
||||
KBASE_KTRACE_FTRACE_ADD_JM_SLOT(kbdev, code, kctx, katom, __gpu_addr, __jobslot); \
|
||||
|
|
@ -202,7 +202,7 @@ void kbasep_ktrace_add_jm(struct kbase_device *kbdev, enum kbase_ktrace_code cod
|
|||
do { \
|
||||
/* capture values that could come from non-pure function calls */ \
|
||||
u64 __gpu_addr = gpu_addr; \
|
||||
int __jobslot = jobslot; \
|
||||
unsigned int __jobslot = jobslot; \
|
||||
u64 __info_val = info_val; \
|
||||
KBASE_KTRACE_RBUF_ADD_JM(kbdev, code, kctx, katom, __gpu_addr, \
|
||||
KBASE_KTRACE_FLAG_JM_JOBSLOT, 0, __jobslot, __info_val); \
|
||||
|
|
@ -234,7 +234,7 @@ void kbasep_ktrace_add_jm(struct kbase_device *kbdev, enum kbase_ktrace_code cod
|
|||
KBASE_KTRACE_RBUF_ADD_JM(kbdev, code, kctx, katom, __gpu_addr, \
|
||||
KBASE_KTRACE_FLAG_JM_REFCOUNT, __refcount, 0, 0u); \
|
||||
KBASE_KTRACE_FTRACE_ADD_JM_REFCOUNT(kbdev, code, kctx, katom, __gpu_addr, \
|
||||
__refcount); \
|
||||
(unsigned int)__refcount); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
|
|
@ -265,7 +265,7 @@ void kbasep_ktrace_add_jm(struct kbase_device *kbdev, enum kbase_ktrace_code cod
|
|||
KBASE_KTRACE_FLAG_JM_REFCOUNT, __refcount, 0, \
|
||||
__info_val); \
|
||||
KBASE_KTRACE_FTRACE_ADD_JM_REFCOUNT(kbdev, code, kctx, katom, __gpu_addr, \
|
||||
__refcount, __info_val); \
|
||||
(unsigned int)__refcount, __info_val); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
#define _KBASE_DEBUG_LINUX_KTRACE_JM_H_
|
||||
|
||||
DECLARE_EVENT_CLASS(mali_jm_slot_template,
|
||||
TP_PROTO(struct kbase_context *kctx, int jobslot, u64 info_val),
|
||||
TP_PROTO(struct kbase_context *kctx, unsigned int jobslot, u64 info_val),
|
||||
TP_ARGS(kctx, jobslot, info_val),
|
||||
TP_STRUCT__entry(__field(pid_t, kctx_tgid) __field(u32, kctx_id)
|
||||
__field(unsigned int, jobslot) __field(u64, info_val)),
|
||||
|
|
@ -38,9 +38,9 @@ DECLARE_EVENT_CLASS(mali_jm_slot_template,
|
|||
TP_printk("kctx=%d_%u jobslot=%u info=0x%llx", __entry->kctx_tgid,
|
||||
__entry->kctx_id, __entry->jobslot, __entry->info_val));
|
||||
|
||||
#define DEFINE_MALI_JM_SLOT_EVENT(name) \
|
||||
DEFINE_EVENT(mali_jm_slot_template, mali_##name, \
|
||||
TP_PROTO(struct kbase_context *kctx, int jobslot, u64 info_val), \
|
||||
#define DEFINE_MALI_JM_SLOT_EVENT(name) \
|
||||
DEFINE_EVENT(mali_jm_slot_template, mali_##name, \
|
||||
TP_PROTO(struct kbase_context *kctx, unsigned int jobslot, u64 info_val), \
|
||||
TP_ARGS(kctx, jobslot, info_val))
|
||||
DEFINE_MALI_JM_SLOT_EVENT(JM_RETURN_ATOM_TO_JS);
|
||||
DEFINE_MALI_JM_SLOT_EVENT(JM_MARK_FOR_RETURN_TO_JS);
|
||||
|
|
@ -78,7 +78,7 @@ DEFINE_MALI_JM_SLOT_EVENT(JS_SLOT_PRIO_IS_BLOCKED);
|
|||
#undef DEFINE_MALI_JM_SLOT_EVENT
|
||||
|
||||
DECLARE_EVENT_CLASS(mali_jm_refcount_template,
|
||||
TP_PROTO(struct kbase_context *kctx, int refcount, u64 info_val),
|
||||
TP_PROTO(struct kbase_context *kctx, unsigned int refcount, u64 info_val),
|
||||
TP_ARGS(kctx, refcount, info_val),
|
||||
TP_STRUCT__entry(__field(pid_t, kctx_tgid) __field(u32, kctx_id)
|
||||
__field(unsigned int, refcount)
|
||||
|
|
@ -89,9 +89,9 @@ DECLARE_EVENT_CLASS(mali_jm_refcount_template,
|
|||
TP_printk("kctx=%d_%u refcount=%u info=0x%llx", __entry->kctx_tgid,
|
||||
__entry->kctx_id, __entry->refcount, __entry->info_val));
|
||||
|
||||
#define DEFINE_MALI_JM_REFCOUNT_EVENT(name) \
|
||||
DEFINE_EVENT(mali_jm_refcount_template, mali_##name, \
|
||||
TP_PROTO(struct kbase_context *kctx, int refcount, u64 info_val), \
|
||||
#define DEFINE_MALI_JM_REFCOUNT_EVENT(name) \
|
||||
DEFINE_EVENT(mali_jm_refcount_template, mali_##name, \
|
||||
TP_PROTO(struct kbase_context *kctx, unsigned int refcount, u64 info_val), \
|
||||
TP_ARGS(kctx, refcount, info_val))
|
||||
DEFINE_MALI_JM_REFCOUNT_EVENT(JS_ADD_JOB);
|
||||
DEFINE_MALI_JM_REFCOUNT_EVENT(JS_REMOVE_JOB);
|
||||
|
|
|
|||
|
|
@ -71,13 +71,13 @@ static const char *const kbasep_ktrace_code_string[] = {
|
|||
|
||||
static void kbasep_ktrace_format_header(char *buffer, int sz, s32 written)
|
||||
{
|
||||
written += MAX(snprintf(buffer + written, MAX(sz - written, 0),
|
||||
written += MAX(snprintf(buffer + written, (size_t)MAX(sz - written, 0),
|
||||
"secs,thread_id,cpu,code,kctx,"),
|
||||
0);
|
||||
|
||||
kbasep_ktrace_backend_format_header(buffer, sz, &written);
|
||||
|
||||
written += MAX(snprintf(buffer + written, MAX(sz - written, 0),
|
||||
written += MAX(snprintf(buffer + written, (size_t)MAX(sz - written, 0),
|
||||
",info_val,ktrace_version=%u.%u", KBASE_KTRACE_VERSION_MAJOR,
|
||||
KBASE_KTRACE_VERSION_MINOR),
|
||||
0);
|
||||
|
|
@ -93,7 +93,7 @@ static void kbasep_ktrace_format_msg(struct kbase_ktrace_msg *trace_msg, char *b
|
|||
*
|
||||
* secs,thread_id,cpu,code,
|
||||
*/
|
||||
written += MAX(snprintf(buffer + written, MAX(sz - written, 0), "%d.%.6d,%d,%d,%s,",
|
||||
written += MAX(snprintf(buffer + written, (size_t)MAX(sz - written, 0), "%d.%.6d,%d,%d,%s,",
|
||||
(int)trace_msg->timestamp.tv_sec,
|
||||
(int)(trace_msg->timestamp.tv_nsec / 1000), trace_msg->thread_id,
|
||||
trace_msg->cpu,
|
||||
|
|
@ -102,12 +102,12 @@ static void kbasep_ktrace_format_msg(struct kbase_ktrace_msg *trace_msg, char *b
|
|||
|
||||
/* kctx part: */
|
||||
if (trace_msg->kctx_tgid) {
|
||||
written += MAX(snprintf(buffer + written, MAX(sz - written, 0), "%d_%u",
|
||||
written += MAX(snprintf(buffer + written, (size_t)MAX(sz - written, 0), "%d_%u",
|
||||
trace_msg->kctx_tgid, trace_msg->kctx_id),
|
||||
0);
|
||||
}
|
||||
/* Trailing comma */
|
||||
written += MAX(snprintf(buffer + written, MAX(sz - written, 0), ","), 0);
|
||||
written += MAX(snprintf(buffer + written, (size_t)MAX(sz - written, 0), ","), 0);
|
||||
|
||||
/* Backend parts */
|
||||
kbasep_ktrace_backend_format_msg(trace_msg, buffer, sz, &written);
|
||||
|
|
@ -119,7 +119,7 @@ static void kbasep_ktrace_format_msg(struct kbase_ktrace_msg *trace_msg, char *b
|
|||
* Note that the last column is empty, it's simply to hold the ktrace
|
||||
* version in the header
|
||||
*/
|
||||
written += MAX(snprintf(buffer + written, MAX(sz - written, 0), ",0x%.16llx",
|
||||
written += MAX(snprintf(buffer + written, (size_t)MAX(sz - written, 0), ",0x%.16llx",
|
||||
(unsigned long long)trace_msg->info_val),
|
||||
0);
|
||||
buffer[sz - 1] = 0;
|
||||
|
|
@ -156,7 +156,7 @@ void kbasep_ktrace_msg_init(struct kbase_ktrace *ktrace, struct kbase_ktrace_msg
|
|||
{
|
||||
lockdep_assert_held(&ktrace->lock);
|
||||
|
||||
trace_msg->thread_id = task_pid_nr(current);
|
||||
trace_msg->thread_id = (u32)task_pid_nr(current);
|
||||
trace_msg->cpu = task_cpu(current);
|
||||
|
||||
ktime_get_real_ts64(&trace_msg->timestamp);
|
||||
|
|
|
|||
|
|
@ -87,8 +87,8 @@ static int kbase_backend_late_init(struct kbase_device *kbdev)
|
|||
|
||||
#ifdef CONFIG_MALI_DEBUG
|
||||
#if IS_ENABLED(CONFIG_MALI_REAL_HW)
|
||||
if (kbasep_common_test_interrupt_handlers(kbdev) != 0) {
|
||||
dev_err(kbdev->dev, "Interrupt assignment check failed.\n");
|
||||
if (kbase_validate_interrupts(kbdev) != 0) {
|
||||
dev_err(kbdev->dev, "Interrupt validation failed.\n");
|
||||
err = -EINVAL;
|
||||
goto fail_interrupt_test;
|
||||
}
|
||||
|
|
@ -278,7 +278,7 @@ static const struct kbase_device_init dev_init[] = {
|
|||
#if !IS_ENABLED(CONFIG_MALI_REAL_HW)
|
||||
{ kbase_gpu_device_create, kbase_gpu_device_destroy, "Dummy model initialization failed" },
|
||||
#else /* !IS_ENABLED(CONFIG_MALI_REAL_HW) */
|
||||
{ assign_irqs, NULL, "IRQ search failed" },
|
||||
{ kbase_get_irqs, NULL, "IRQ search failed" },
|
||||
#endif /* !IS_ENABLED(CONFIG_MALI_REAL_HW) */
|
||||
#if !IS_ENABLED(CONFIG_MALI_NO_MALI)
|
||||
{ registers_map, registers_unmap, "Register map failed" },
|
||||
|
|
|
|||
|
|
@ -175,4 +175,5 @@ void kbase_gpu_interrupt(struct kbase_device *kbdev, u32 val)
|
|||
|
||||
KBASE_KTRACE_ADD(kbdev, CORE_GPU_IRQ_DONE, NULL, val);
|
||||
}
|
||||
KBASE_EXPORT_TEST_API(kbase_gpu_interrupt);
|
||||
|
||||
|
|
|
|||
|
|
@ -101,3 +101,4 @@ void kbase_gpu_interrupt(struct kbase_device *kbdev, u32 val)
|
|||
|
||||
KBASE_KTRACE_ADD(kbdev, CORE_GPU_IRQ_DONE, NULL, val);
|
||||
}
|
||||
KBASE_EXPORT_TEST_API(kbase_gpu_interrupt);
|
||||
|
|
|
|||
|
|
@ -75,8 +75,8 @@ static int kbase_backend_late_init(struct kbase_device *kbdev)
|
|||
|
||||
#ifdef CONFIG_MALI_DEBUG
|
||||
#if IS_ENABLED(CONFIG_MALI_REAL_HW)
|
||||
if (kbasep_common_test_interrupt_handlers(kbdev) != 0) {
|
||||
dev_err(kbdev->dev, "Interrupt assignment check failed.\n");
|
||||
if (kbase_validate_interrupts(kbdev) != 0) {
|
||||
dev_err(kbdev->dev, "Interrupt validation failed.\n");
|
||||
err = -EINVAL;
|
||||
goto fail_interrupt_test;
|
||||
}
|
||||
|
|
@ -216,7 +216,7 @@ static const struct kbase_device_init dev_init[] = {
|
|||
#if !IS_ENABLED(CONFIG_MALI_REAL_HW)
|
||||
{ kbase_gpu_device_create, kbase_gpu_device_destroy, "Dummy model initialization failed" },
|
||||
#else /* !IS_ENABLED(CONFIG_MALI_REAL_HW) */
|
||||
{ assign_irqs, NULL, "IRQ search failed" },
|
||||
{ kbase_get_irqs, NULL, "IRQ search failed" },
|
||||
#endif /* !IS_ENABLED(CONFIG_MALI_REAL_HW) */
|
||||
#if !IS_ENABLED(CONFIG_MALI_NO_MALI)
|
||||
{ registers_map, registers_unmap, "Register map failed" },
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@
|
|||
|
||||
static DEFINE_MUTEX(kbase_dev_list_lock);
|
||||
static LIST_HEAD(kbase_dev_list);
|
||||
static int kbase_dev_nr;
|
||||
static unsigned int kbase_dev_nr;
|
||||
|
||||
struct kbase_device *kbase_device_alloc(void)
|
||||
{
|
||||
|
|
@ -83,9 +83,10 @@ struct kbase_device *kbase_device_alloc(void)
|
|||
*/
|
||||
static int kbase_device_all_as_init(struct kbase_device *kbdev)
|
||||
{
|
||||
int i, err = 0;
|
||||
unsigned int i;
|
||||
int err = 0;
|
||||
|
||||
for (i = 0; i < kbdev->nr_hw_address_spaces; i++) {
|
||||
for (i = 0; i < (unsigned int)kbdev->nr_hw_address_spaces; i++) {
|
||||
err = kbase_mmu_as_init(kbdev, i);
|
||||
if (err)
|
||||
break;
|
||||
|
|
@ -101,12 +102,39 @@ static int kbase_device_all_as_init(struct kbase_device *kbdev)
|
|||
|
||||
static void kbase_device_all_as_term(struct kbase_device *kbdev)
|
||||
{
|
||||
int i;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < kbdev->nr_hw_address_spaces; i++)
|
||||
for (i = 0; i < (unsigned int)kbdev->nr_hw_address_spaces; i++)
|
||||
kbase_mmu_as_term(kbdev, i);
|
||||
}
|
||||
|
||||
static int pcm_prioritized_process_cb(struct notifier_block *nb, unsigned long action, void *data)
|
||||
{
|
||||
#if MALI_USE_CSF
|
||||
|
||||
struct kbase_device *const kbdev =
|
||||
container_of(nb, struct kbase_device, pcm_prioritized_process_nb);
|
||||
struct pcm_prioritized_process_notifier_data *const notifier_data = data;
|
||||
int ret = -EINVAL;
|
||||
|
||||
switch (action) {
|
||||
case ADD_PRIORITIZED_PROCESS:
|
||||
if (kbasep_adjust_prioritized_process(kbdev, true, notifier_data->pid))
|
||||
ret = 0;
|
||||
break;
|
||||
case REMOVE_PRIORITIZED_PROCESS:
|
||||
if (kbasep_adjust_prioritized_process(kbdev, false, notifier_data->pid))
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
#endif /* MALI_USE_CSF */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int kbase_device_pcm_dev_init(struct kbase_device *const kbdev)
|
||||
{
|
||||
int err = 0;
|
||||
|
|
@ -140,6 +168,18 @@ int kbase_device_pcm_dev_init(struct kbase_device *const kbdev)
|
|||
dev_info(kbdev->dev,
|
||||
"Priority control manager successfully loaded");
|
||||
kbdev->pcm_dev = pcm_dev;
|
||||
|
||||
kbdev->pcm_prioritized_process_nb = (struct notifier_block){
|
||||
.notifier_call = &pcm_prioritized_process_cb,
|
||||
};
|
||||
if (pcm_dev->ops.pcm_prioritized_process_notifier_register !=
|
||||
NULL) {
|
||||
if (pcm_dev->ops.pcm_prioritized_process_notifier_register(
|
||||
pcm_dev, &kbdev->pcm_prioritized_process_nb))
|
||||
dev_warn(
|
||||
kbdev->dev,
|
||||
"Failed to register for changes in prioritized processes");
|
||||
}
|
||||
}
|
||||
}
|
||||
of_node_put(prio_ctrl_node);
|
||||
|
|
@ -151,8 +191,14 @@ int kbase_device_pcm_dev_init(struct kbase_device *const kbdev)
|
|||
|
||||
void kbase_device_pcm_dev_term(struct kbase_device *const kbdev)
|
||||
{
|
||||
if (kbdev->pcm_dev)
|
||||
module_put(kbdev->pcm_dev->owner);
|
||||
struct priority_control_manager_device *const pcm_dev = kbdev->pcm_dev;
|
||||
|
||||
if (pcm_dev) {
|
||||
if (pcm_dev->ops.pcm_prioritized_process_notifier_unregister != NULL)
|
||||
pcm_dev->ops.pcm_prioritized_process_notifier_unregister(
|
||||
pcm_dev, &kbdev->pcm_prioritized_process_nb);
|
||||
module_put(pcm_dev->owner);
|
||||
}
|
||||
}
|
||||
|
||||
#define KBASE_PAGES_TO_KIB(pages) (((unsigned int)pages) << (PAGE_SHIFT - 10))
|
||||
|
|
@ -253,7 +299,7 @@ int kbase_device_misc_init(struct kbase_device *const kbdev)
|
|||
if (err)
|
||||
goto dma_set_mask_failed;
|
||||
|
||||
kbdev->nr_hw_address_spaces = kbdev->gpu_props.num_address_spaces;
|
||||
kbdev->nr_hw_address_spaces = (s8)kbdev->gpu_props.num_address_spaces;
|
||||
|
||||
err = kbase_device_all_as_init(kbdev);
|
||||
if (err)
|
||||
|
|
@ -276,8 +322,6 @@ int kbase_device_misc_init(struct kbase_device *const kbdev)
|
|||
#endif /* !MALI_USE_CSF */
|
||||
|
||||
kbdev->mmu_mode = kbase_mmu_mode_get_aarch64();
|
||||
kbdev->mmu_or_gpu_cache_op_wait_time_ms =
|
||||
kbase_get_timeout_ms(kbdev, MMU_AS_INACTIVE_WAIT_TIMEOUT);
|
||||
mutex_init(&kbdev->kctx_list_lock);
|
||||
INIT_LIST_HEAD(&kbdev->kctx_list);
|
||||
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ bool kbase_is_gpu_removed(struct kbase_device *kbdev)
|
|||
static int busy_wait_cache_operation(struct kbase_device *kbdev, u32 irq_bit)
|
||||
{
|
||||
const ktime_t wait_loop_start = ktime_get_raw();
|
||||
const u32 wait_time_ms = kbdev->mmu_or_gpu_cache_op_wait_time_ms;
|
||||
const u32 wait_time_ms = kbase_get_timeout_ms(kbdev, MMU_AS_INACTIVE_WAIT_TIMEOUT);
|
||||
bool completed = false;
|
||||
s64 diff;
|
||||
u32 irq_bits_to_check = irq_bit;
|
||||
|
|
@ -169,7 +169,7 @@ int kbase_gpu_cache_flush_and_busy_wait(struct kbase_device *kbdev, u32 flush_op
|
|||
irq_mask & ~CLEAN_CACHES_COMPLETED);
|
||||
|
||||
/* busy wait irq status to be enabled */
|
||||
ret = busy_wait_cache_operation(kbdev, (u32)CLEAN_CACHES_COMPLETED);
|
||||
ret = busy_wait_cache_operation(kbdev, CLEAN_CACHES_COMPLETED);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
@ -188,7 +188,7 @@ int kbase_gpu_cache_flush_and_busy_wait(struct kbase_device *kbdev, u32 flush_op
|
|||
kbase_reg_write32(kbdev, GPU_CONTROL_ENUM(GPU_COMMAND), flush_op);
|
||||
|
||||
/* 3. Busy-wait irq status to be enabled. */
|
||||
ret = busy_wait_cache_operation(kbdev, (u32)CLEAN_CACHES_COMPLETED);
|
||||
ret = busy_wait_cache_operation(kbdev, CLEAN_CACHES_COMPLETED);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
@ -301,7 +301,7 @@ void kbase_gpu_wait_cache_clean(struct kbase_device *kbdev)
|
|||
|
||||
int kbase_gpu_wait_cache_clean_timeout(struct kbase_device *kbdev, unsigned int wait_timeout_ms)
|
||||
{
|
||||
long remaining = msecs_to_jiffies(wait_timeout_ms);
|
||||
long remaining = (long)msecs_to_jiffies(wait_timeout_ms);
|
||||
int result = 0;
|
||||
|
||||
while (remaining && get_cache_clean_flag(kbdev)) {
|
||||
|
|
|
|||
|
|
@ -146,28 +146,28 @@ const char *kbase_gpu_exception_name(u32 const exception_code)
|
|||
e = "ADDRESS_SIZE_FAULT_IN";
|
||||
break;
|
||||
case CS_FAULT_EXCEPTION_TYPE_ADDRESS_SIZE_FAULT_OUT_0:
|
||||
e = "ADDRESS_SIZE_FAULT_OUT_0 at level 0";
|
||||
e = "ADDRESS_SIZE_FAULT_OUT at level 0";
|
||||
break;
|
||||
case CS_FAULT_EXCEPTION_TYPE_ADDRESS_SIZE_FAULT_OUT_1:
|
||||
e = "ADDRESS_SIZE_FAULT_OUT_1 at level 1";
|
||||
e = "ADDRESS_SIZE_FAULT_OUT at level 1";
|
||||
break;
|
||||
case CS_FAULT_EXCEPTION_TYPE_ADDRESS_SIZE_FAULT_OUT_2:
|
||||
e = "ADDRESS_SIZE_FAULT_OUT_2 at level 2";
|
||||
e = "ADDRESS_SIZE_FAULT_OUT at level 2";
|
||||
break;
|
||||
case CS_FAULT_EXCEPTION_TYPE_ADDRESS_SIZE_FAULT_OUT_3:
|
||||
e = "ADDRESS_SIZE_FAULT_OUT_3 at level 3";
|
||||
e = "ADDRESS_SIZE_FAULT_OUT at level 3";
|
||||
break;
|
||||
case CS_FAULT_EXCEPTION_TYPE_MEMORY_ATTRIBUTE_FAULT_0:
|
||||
e = "MEMORY_ATTRIBUTE_FAULT_0 at level 0";
|
||||
e = "MEMORY_ATTRIBUTE_FAULT at level 0";
|
||||
break;
|
||||
case CS_FAULT_EXCEPTION_TYPE_MEMORY_ATTRIBUTE_FAULT_1:
|
||||
e = "MEMORY_ATTRIBUTE_FAULT_1 at level 1";
|
||||
e = "MEMORY_ATTRIBUTE_FAULT at level 1";
|
||||
break;
|
||||
case CS_FAULT_EXCEPTION_TYPE_MEMORY_ATTRIBUTE_FAULT_2:
|
||||
e = "MEMORY_ATTRIBUTE_FAULT_2 at level 2";
|
||||
e = "MEMORY_ATTRIBUTE_FAULT at level 2";
|
||||
break;
|
||||
case CS_FAULT_EXCEPTION_TYPE_MEMORY_ATTRIBUTE_FAULT_3:
|
||||
e = "MEMORY_ATTRIBUTE_FAULT_3 at level 3";
|
||||
e = "MEMORY_ATTRIBUTE_FAULT at level 3";
|
||||
break;
|
||||
/* Any other exception code is unknown */
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -22,6 +22,8 @@
|
|||
#ifndef _MALI_KBASE_HW_ACCESS_H_
|
||||
#define _MALI_KBASE_HW_ACCESS_H_
|
||||
|
||||
#include <linux/version_compat_defs.h>
|
||||
|
||||
#define KBASE_REGMAP_PERM_READ (1U << 0)
|
||||
#define KBASE_REGMAP_PERM_WRITE (1U << 1)
|
||||
#define KBASE_REGMAP_WIDTH_32_BIT (1U << 2)
|
||||
|
|
@ -186,4 +188,37 @@ u32 kbase_regmap_backend_init(struct kbase_device *kbdev);
|
|||
*/
|
||||
void kbase_regmap_term(struct kbase_device *kbdev);
|
||||
|
||||
/**
|
||||
* kbase_reg_poll32_timeout - Poll a 32 bit register with timeout
|
||||
* @kbdev: Kbase device pointer
|
||||
* @reg_enum: Register enum
|
||||
* @val: Variable for result of read
|
||||
* @cond: Condition to be met
|
||||
* @delay_us: Delay between each poll (in uS)
|
||||
* @timeout_us: Timeout (in uS)
|
||||
* @delay_before_read: If true delay for @delay_us before read
|
||||
*
|
||||
* Return: 0 if condition is met, -ETIMEDOUT if timed out.
|
||||
*/
|
||||
#define kbase_reg_poll32_timeout(kbdev, reg_enum, val, cond, delay_us, timeout_us, \
|
||||
delay_before_read) \
|
||||
read_poll_timeout_atomic(kbase_reg_read32, val, cond, delay_us, timeout_us, \
|
||||
delay_before_read, kbdev, reg_enum)
|
||||
|
||||
/**
|
||||
* kbase_reg_poll64_timeout - Poll a 64 bit register with timeout
|
||||
* @kbdev: Kbase device pointer
|
||||
* @reg_enum: Register enum
|
||||
* @val: Variable for result of read
|
||||
* @cond: Condition to be met
|
||||
* @delay_us: Delay between each poll (in uS)
|
||||
* @timeout_us: Timeout (in uS)
|
||||
* @delay_before_read: If true delay for @delay_us before read
|
||||
*
|
||||
* Return: 0 if condition is met, -ETIMEDOUT if timed out.
|
||||
*/
|
||||
#define kbase_reg_poll64_timeout(kbdev, reg_enum, val, cond, delay_us, timeout_us, \
|
||||
delay_before_read) \
|
||||
read_poll_timeout_atomic(kbase_reg_read64, val, cond, delay_us, timeout_us, \
|
||||
delay_before_read, kbdev, reg_enum)
|
||||
#endif /* _MALI_KBASE_HW_ACCESS_H_ */
|
||||
|
|
|
|||
|
|
@ -290,10 +290,10 @@
|
|||
/* THREAD_* registers */
|
||||
|
||||
/* THREAD_FEATURES IMPLEMENTATION_TECHNOLOGY values */
|
||||
#define THREAD_FEATURES_IMPLEMENTATION_TECHNOLOGY_NOT_SPECIFIED 0
|
||||
#define THREAD_FEATURES_IMPLEMENTATION_TECHNOLOGY_SILICON 1
|
||||
#define THREAD_FEATURES_IMPLEMENTATION_TECHNOLOGY_FPGA 2
|
||||
#define THREAD_FEATURES_IMPLEMENTATION_TECHNOLOGY_SOFTWARE 3
|
||||
#define THREAD_FEATURES_IMPLEMENTATION_TECHNOLOGY_NOT_SPECIFIED 0U
|
||||
#define THREAD_FEATURES_IMPLEMENTATION_TECHNOLOGY_SILICON 1U
|
||||
#define THREAD_FEATURES_IMPLEMENTATION_TECHNOLOGY_FPGA 2U
|
||||
#define THREAD_FEATURES_IMPLEMENTATION_TECHNOLOGY_SOFTWARE 3U
|
||||
|
||||
/* End THREAD_* registers */
|
||||
|
||||
|
|
@ -430,7 +430,7 @@
|
|||
|
||||
/* SYSC_ALLOC register */
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC0_SHIFT (0)
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC0_MASK ((0xF) << SYSC_ALLOC_R_SYSC_ALLOC0_SHIFT)
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC0_MASK ((0xFU) << SYSC_ALLOC_R_SYSC_ALLOC0_SHIFT)
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC0_GET(reg_val) \
|
||||
(((reg_val)&SYSC_ALLOC_R_SYSC_ALLOC0_MASK) >> SYSC_ALLOC_R_SYSC_ALLOC0_SHIFT)
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC0_SET(reg_val, value) \
|
||||
|
|
@ -438,7 +438,7 @@
|
|||
(((value) << SYSC_ALLOC_R_SYSC_ALLOC0_SHIFT) & SYSC_ALLOC_R_SYSC_ALLOC0_MASK))
|
||||
/* End of SYSC_ALLOC_R_SYSC_ALLOC0 values */
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC0_SHIFT (4)
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC0_MASK ((0xF) << SYSC_ALLOC_W_SYSC_ALLOC0_SHIFT)
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC0_MASK ((0xFU) << SYSC_ALLOC_W_SYSC_ALLOC0_SHIFT)
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC0_GET(reg_val) \
|
||||
(((reg_val)&SYSC_ALLOC_W_SYSC_ALLOC0_MASK) >> SYSC_ALLOC_W_SYSC_ALLOC0_SHIFT)
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC0_SET(reg_val, value) \
|
||||
|
|
@ -446,7 +446,7 @@
|
|||
(((value) << SYSC_ALLOC_W_SYSC_ALLOC0_SHIFT) & SYSC_ALLOC_W_SYSC_ALLOC0_MASK))
|
||||
/* End of SYSC_ALLOC_W_SYSC_ALLOC0 values */
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC1_SHIFT (8)
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC1_MASK ((0xF) << SYSC_ALLOC_R_SYSC_ALLOC1_SHIFT)
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC1_MASK ((0xFU) << SYSC_ALLOC_R_SYSC_ALLOC1_SHIFT)
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC1_GET(reg_val) \
|
||||
(((reg_val)&SYSC_ALLOC_R_SYSC_ALLOC1_MASK) >> SYSC_ALLOC_R_SYSC_ALLOC1_SHIFT)
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC1_SET(reg_val, value) \
|
||||
|
|
@ -454,7 +454,7 @@
|
|||
(((value) << SYSC_ALLOC_R_SYSC_ALLOC1_SHIFT) & SYSC_ALLOC_R_SYSC_ALLOC1_MASK))
|
||||
/* End of SYSC_ALLOC_R_SYSC_ALLOC1 values */
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC1_SHIFT (12)
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC1_MASK ((0xF) << SYSC_ALLOC_W_SYSC_ALLOC1_SHIFT)
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC1_MASK ((0xFU) << SYSC_ALLOC_W_SYSC_ALLOC1_SHIFT)
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC1_GET(reg_val) \
|
||||
(((reg_val)&SYSC_ALLOC_W_SYSC_ALLOC1_MASK) >> SYSC_ALLOC_W_SYSC_ALLOC1_SHIFT)
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC1_SET(reg_val, value) \
|
||||
|
|
@ -462,7 +462,7 @@
|
|||
(((value) << SYSC_ALLOC_W_SYSC_ALLOC1_SHIFT) & SYSC_ALLOC_W_SYSC_ALLOC1_MASK))
|
||||
/* End of SYSC_ALLOC_W_SYSC_ALLOC1 values */
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC2_SHIFT (16)
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC2_MASK ((0xF) << SYSC_ALLOC_R_SYSC_ALLOC2_SHIFT)
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC2_MASK ((0xFU) << SYSC_ALLOC_R_SYSC_ALLOC2_SHIFT)
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC2_GET(reg_val) \
|
||||
(((reg_val)&SYSC_ALLOC_R_SYSC_ALLOC2_MASK) >> SYSC_ALLOC_R_SYSC_ALLOC2_SHIFT)
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC2_SET(reg_val, value) \
|
||||
|
|
@ -470,7 +470,7 @@
|
|||
(((value) << SYSC_ALLOC_R_SYSC_ALLOC2_SHIFT) & SYSC_ALLOC_R_SYSC_ALLOC2_MASK))
|
||||
/* End of SYSC_ALLOC_R_SYSC_ALLOC2 values */
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC2_SHIFT (20)
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC2_MASK ((0xF) << SYSC_ALLOC_W_SYSC_ALLOC2_SHIFT)
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC2_MASK ((0xFU) << SYSC_ALLOC_W_SYSC_ALLOC2_SHIFT)
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC2_GET(reg_val) \
|
||||
(((reg_val)&SYSC_ALLOC_W_SYSC_ALLOC2_MASK) >> SYSC_ALLOC_W_SYSC_ALLOC2_SHIFT)
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC2_SET(reg_val, value) \
|
||||
|
|
@ -478,7 +478,7 @@
|
|||
(((value) << SYSC_ALLOC_W_SYSC_ALLOC2_SHIFT) & SYSC_ALLOC_W_SYSC_ALLOC2_MASK))
|
||||
/* End of SYSC_ALLOC_W_SYSC_ALLOC2 values */
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC3_SHIFT (24)
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC3_MASK ((0xF) << SYSC_ALLOC_R_SYSC_ALLOC3_SHIFT)
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC3_MASK ((0xFU) << SYSC_ALLOC_R_SYSC_ALLOC3_SHIFT)
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC3_GET(reg_val) \
|
||||
(((reg_val)&SYSC_ALLOC_R_SYSC_ALLOC3_MASK) >> SYSC_ALLOC_R_SYSC_ALLOC3_SHIFT)
|
||||
#define SYSC_ALLOC_R_SYSC_ALLOC3_SET(reg_val, value) \
|
||||
|
|
@ -486,7 +486,7 @@
|
|||
(((value) << SYSC_ALLOC_R_SYSC_ALLOC3_SHIFT) & SYSC_ALLOC_R_SYSC_ALLOC3_MASK))
|
||||
/* End of SYSC_ALLOC_R_SYSC_ALLOC3 values */
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC3_SHIFT (28)
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC3_MASK ((0xF) << SYSC_ALLOC_W_SYSC_ALLOC3_SHIFT)
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC3_MASK ((0xFU) << SYSC_ALLOC_W_SYSC_ALLOC3_SHIFT)
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC3_GET(reg_val) \
|
||||
(((reg_val)&SYSC_ALLOC_W_SYSC_ALLOC3_MASK) >> SYSC_ALLOC_W_SYSC_ALLOC3_SHIFT)
|
||||
#define SYSC_ALLOC_W_SYSC_ALLOC3_SET(reg_val, value) \
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@
|
|||
ENUM_OFFSET(n, DOORBELL_BLOCK_ENUM(0, regname), DOORBELL_BLOCK_ENUM(1, regname))
|
||||
|
||||
/* register value macros */
|
||||
|
||||
/* L2_CONFIG PBHA values */
|
||||
#define L2_CONFIG_PBHA_HWU_SHIFT GPU_U(12)
|
||||
#define L2_CONFIG_PBHA_HWU_MASK (GPU_U(0xF) << L2_CONFIG_PBHA_HWU_SHIFT)
|
||||
|
|
@ -79,7 +80,8 @@
|
|||
(((value) << L2_CONFIG_PBHA_HWU_SHIFT) & L2_CONFIG_PBHA_HWU_MASK))
|
||||
|
||||
#define PRFCNT_FEATURES_COUNTER_BLOCK_SIZE_SHIFT (0)
|
||||
#define PRFCNT_FEATURES_COUNTER_BLOCK_SIZE_MASK ((0xFF) << PRFCNT_FEATURES_COUNTER_BLOCK_SIZE_SHIFT)
|
||||
#define PRFCNT_FEATURES_COUNTER_BLOCK_SIZE_MASK \
|
||||
((0xFFU) << PRFCNT_FEATURES_COUNTER_BLOCK_SIZE_SHIFT)
|
||||
#define PRFCNT_FEATURES_COUNTER_BLOCK_SIZE_GET(reg_val) \
|
||||
(((reg_val)&PRFCNT_FEATURES_COUNTER_BLOCK_SIZE_MASK) >> \
|
||||
PRFCNT_FEATURES_COUNTER_BLOCK_SIZE_SHIFT)
|
||||
|
|
@ -401,16 +403,17 @@
|
|||
(((value) << GPU_FAULTSTATUS_ADDRESS_VALID_SHIFT) & GPU_FAULTSTATUS_ADDRESS_VALID_MASK))
|
||||
|
||||
/* GPU IRQ flags */
|
||||
#define GPU_FAULT (1 << 0) /* A GPU Fault has occurred */
|
||||
#define GPU_PROTECTED_FAULT (1 << 1) /* A GPU fault has occurred in protected mode */
|
||||
#define RESET_COMPLETED (1 << 8) /* Set when a reset has completed. */
|
||||
#define POWER_CHANGED_SINGLE (1 << 9) /* Set when a single core has finished powering up or down. */
|
||||
#define POWER_CHANGED_ALL (1 << 10) /* Set when all cores have finished powering up or down. */
|
||||
#define CLEAN_CACHES_COMPLETED (1 << 17) /* Set when a cache clean operation has completed. */
|
||||
#define DOORBELL_MIRROR (1 << 18) /* Mirrors the doorbell interrupt line to the CPU */
|
||||
#define MCU_STATUS_GPU_IRQ (1 << 19) /* MCU requires attention */
|
||||
#define GPU_FAULT (1U << 0) /* A GPU Fault has occurred */
|
||||
#define GPU_PROTECTED_FAULT (1U << 1) /* A GPU fault has occurred in protected mode */
|
||||
#define RESET_COMPLETED (1U << 8) /* Set when a reset has completed. */
|
||||
#define POWER_CHANGED_SINGLE \
|
||||
(1U << 9) /* Set when a single core has finished powering up or down. */
|
||||
#define POWER_CHANGED_ALL (1U << 10) /* Set when all cores have finished powering up or down. */
|
||||
#define CLEAN_CACHES_COMPLETED (1U << 17) /* Set when a cache clean operation has completed. */
|
||||
#define DOORBELL_MIRROR (1U << 18) /* Mirrors the doorbell interrupt line to the CPU */
|
||||
#define MCU_STATUS_GPU_IRQ (1U << 19) /* MCU requires attention */
|
||||
#define FLUSH_PA_RANGE_COMPLETED \
|
||||
(1 << 20) /* Set when a physical range cache clean operation has completed. */
|
||||
(1U << 20) /* Set when a physical range cache clean operation has completed. */
|
||||
|
||||
|
||||
/* GPU_FEATURES register */
|
||||
|
|
|
|||
|
|
@ -269,13 +269,14 @@
|
|||
#define GPU_COMMAND_FLUSH_CACHE_MERGE(cmd1, cmd2) ((cmd1) > (cmd2) ? (cmd1) : (cmd2))
|
||||
|
||||
/* IRQ flags */
|
||||
#define GPU_FAULT (1 << 0) /* A GPU Fault has occurred */
|
||||
#define MULTIPLE_GPU_FAULTS (1 << 7) /* More than one GPU Fault occurred. */
|
||||
#define RESET_COMPLETED (1 << 8) /* Set when a reset has completed. */
|
||||
#define POWER_CHANGED_SINGLE (1 << 9) /* Set when a single core has finished powering up or down. */
|
||||
#define POWER_CHANGED_ALL (1 << 10) /* Set when all cores have finished powering up or down. */
|
||||
#define PRFCNT_SAMPLE_COMPLETED (1 << 16) /* Set when a performance count sample has completed. */
|
||||
#define CLEAN_CACHES_COMPLETED (1 << 17) /* Set when a cache clean operation has completed. */
|
||||
#define GPU_FAULT (1U << 0) /* A GPU Fault has occurred */
|
||||
#define MULTIPLE_GPU_FAULTS (1U << 7) /* More than one GPU Fault occurred. */
|
||||
#define RESET_COMPLETED (1U << 8) /* Set when a reset has completed. */
|
||||
#define POWER_CHANGED_SINGLE \
|
||||
(1U << 9) /* Set when a single core has finished powering up or down. */
|
||||
#define POWER_CHANGED_ALL (1U << 10) /* Set when all cores have finished powering up or down. */
|
||||
#define PRFCNT_SAMPLE_COMPLETED (1U << 16) /* Set when a performance count sample has completed. */
|
||||
#define CLEAN_CACHES_COMPLETED (1U << 17) /* Set when a cache clean operation has completed. */
|
||||
#define FLUSH_PA_RANGE_COMPLETED \
|
||||
(1 << 20) /* Set when a physical range cache clean operation has completed. */
|
||||
|
||||
|
|
|
|||
|
|
@ -44,6 +44,9 @@
|
|||
#define HWCNT_BACKEND_WATCHDOG_TIMER_INTERVAL_MS ((u32)1000)
|
||||
#endif /* IS_FPGA && !NO_MALI */
|
||||
|
||||
/* Used to check for a sample in which all counters in the block are disabled */
|
||||
#define HWCNT_BLOCK_EMPTY_SAMPLE (2)
|
||||
|
||||
/**
|
||||
* enum kbase_hwcnt_backend_csf_dump_state - HWC CSF backend dumping states.
|
||||
*
|
||||
|
|
@ -339,8 +342,7 @@ kbasep_hwcnt_backend_csf_cc_initial_sample(struct kbase_hwcnt_backend_csf *backe
|
|||
backend_csf->info->csf_if->get_gpu_cycle_count(backend_csf->info->csf_if->ctx, cycle_counts,
|
||||
clk_enable_map);
|
||||
|
||||
kbase_hwcnt_metadata_for_each_clock(enable_map->metadata, clk)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_clock(enable_map->metadata, clk) {
|
||||
if (kbase_hwcnt_clk_enable_map_enabled(clk_enable_map, clk))
|
||||
backend_csf->prev_cycle_count[clk] = cycle_counts[clk];
|
||||
}
|
||||
|
|
@ -361,8 +363,7 @@ static void kbasep_hwcnt_backend_csf_cc_update(struct kbase_hwcnt_backend_csf *b
|
|||
backend_csf->info->csf_if->get_gpu_cycle_count(backend_csf->info->csf_if->ctx, cycle_counts,
|
||||
backend_csf->clk_enable_map);
|
||||
|
||||
kbase_hwcnt_metadata_for_each_clock(backend_csf->info->metadata, clk)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_clock(backend_csf->info->metadata, clk) {
|
||||
if (kbase_hwcnt_clk_enable_map_enabled(backend_csf->clk_enable_map, clk)) {
|
||||
backend_csf->cycle_count_elapsed[clk] =
|
||||
cycle_counts[clk] - backend_csf->prev_cycle_count[clk];
|
||||
|
|
@ -384,34 +385,28 @@ static u64 kbasep_hwcnt_backend_csf_timestamp_ns(struct kbase_hwcnt_backend *bac
|
|||
|
||||
/** kbasep_hwcnt_backend_csf_process_enable_map() - Process the enable_map to
|
||||
* guarantee headers are
|
||||
* enabled if any counter is
|
||||
* required.
|
||||
* enabled.
|
||||
*@phys_enable_map: HWC physical enable map to be processed.
|
||||
*/
|
||||
static void
|
||||
kbasep_hwcnt_backend_csf_process_enable_map(struct kbase_hwcnt_physical_enable_map *phys_enable_map)
|
||||
void kbasep_hwcnt_backend_csf_process_enable_map(
|
||||
struct kbase_hwcnt_physical_enable_map *phys_enable_map)
|
||||
{
|
||||
WARN_ON(!phys_enable_map);
|
||||
|
||||
/* Enable header if any counter is required from user, the header is
|
||||
* controlled by bit 0 of the enable mask.
|
||||
/* Unconditionally enable each block header and first counter,
|
||||
* the header is controlled by bit 0 of the enable mask.
|
||||
*/
|
||||
phys_enable_map->fe_bm |= 1;
|
||||
phys_enable_map->fe_bm |= 3;
|
||||
|
||||
if (phys_enable_map->tiler_bm)
|
||||
phys_enable_map->tiler_bm |= 1;
|
||||
phys_enable_map->tiler_bm |= 3;
|
||||
|
||||
if (phys_enable_map->mmu_l2_bm)
|
||||
phys_enable_map->mmu_l2_bm |= 1;
|
||||
phys_enable_map->mmu_l2_bm |= 3;
|
||||
|
||||
if (phys_enable_map->shader_bm)
|
||||
phys_enable_map->shader_bm |= 1;
|
||||
phys_enable_map->shader_bm |= 3;
|
||||
|
||||
if (phys_enable_map->fw_bm)
|
||||
phys_enable_map->fw_bm |= 1;
|
||||
phys_enable_map->fw_bm |= 3;
|
||||
|
||||
if (phys_enable_map->csg_bm)
|
||||
phys_enable_map->csg_bm |= 1;
|
||||
phys_enable_map->csg_bm |= 3;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -429,7 +424,7 @@ static void kbasep_hwcnt_backend_csf_init_layout(
|
|||
WARN_ON(!prfcnt_info);
|
||||
WARN_ON(!phys_layout);
|
||||
|
||||
shader_core_cnt = fls64(prfcnt_info->core_mask);
|
||||
shader_core_cnt = (size_t)fls64(prfcnt_info->core_mask);
|
||||
values_per_block = prfcnt_info->prfcnt_block_size / KBASE_HWCNT_VALUE_HW_BYTES;
|
||||
fw_block_cnt = div_u64(prfcnt_info->prfcnt_fw_size, prfcnt_info->prfcnt_block_size);
|
||||
hw_block_cnt = div_u64(prfcnt_info->prfcnt_hw_size, prfcnt_info->prfcnt_block_size);
|
||||
|
|
@ -542,7 +537,8 @@ static void kbasep_hwcnt_backend_csf_update_block_state(
|
|||
size_t block_idx, blk_stt_t *const block_state, bool fw_in_protected_mode)
|
||||
{
|
||||
/* Offset of shader core blocks from the start of the HW blocks in the sample */
|
||||
size_t shader_core_block_offset = phys_layout->hw_block_cnt - phys_layout->shader_cnt;
|
||||
size_t shader_core_block_offset =
|
||||
(size_t)(phys_layout->hw_block_cnt - phys_layout->shader_cnt);
|
||||
bool is_shader_core_block;
|
||||
|
||||
is_shader_core_block = block_idx >= shader_core_block_offset;
|
||||
|
|
@ -608,17 +604,17 @@ static void kbasep_hwcnt_backend_csf_accumulate_sample(
|
|||
const u32 *old_block = old_sample_buf;
|
||||
const u32 *new_block = new_sample_buf;
|
||||
u64 *acc_block = accum_buf;
|
||||
/* Flag to indicate whether current sample is when exiting protected mode. */
|
||||
/* Flag to indicate whether current sample is exiting protected mode. */
|
||||
bool exiting_protm = false;
|
||||
const size_t values_per_block = phys_layout->values_per_block;
|
||||
|
||||
/* The block pointers now point to the first HW block, which is always a CSHW/front-end
|
||||
* block. The counter enable mask for this block can be checked to determine whether this
|
||||
* sample is taken after leaving protected mode - this is the only scenario where the CSHW
|
||||
* block counter enable mask is all-zero. In this case, the values in this sample would not
|
||||
* be meaningful, so they don't need to be accumulated.
|
||||
* block counter enable mask has only the first bit set, and no others. In this case,
|
||||
* the values in this sample would not be meaningful, so they don't need to be accumulated.
|
||||
*/
|
||||
exiting_protm = !new_block[phys_layout->enable_mask_offset];
|
||||
exiting_protm = (new_block[phys_layout->enable_mask_offset] == 1);
|
||||
|
||||
for (block_idx = 0; block_idx < phys_layout->block_cnt; block_idx++) {
|
||||
const u32 old_enable_mask = old_block[phys_layout->enable_mask_offset];
|
||||
|
|
@ -629,7 +625,7 @@ static void kbasep_hwcnt_backend_csf_accumulate_sample(
|
|||
&block_states[block_idx],
|
||||
fw_in_protected_mode);
|
||||
|
||||
if (new_enable_mask == 0) {
|
||||
if (!(new_enable_mask & HWCNT_BLOCK_EMPTY_SAMPLE)) {
|
||||
/* Hardware block was unavailable or we didn't turn on
|
||||
* any counters. Do nothing.
|
||||
*/
|
||||
|
|
@ -662,7 +658,7 @@ static void kbasep_hwcnt_backend_csf_accumulate_sample(
|
|||
* saturating at their maximum value.
|
||||
*/
|
||||
if (!clearing_samples) {
|
||||
if (old_enable_mask == 0) {
|
||||
if (!(old_enable_mask & HWCNT_BLOCK_EMPTY_SAMPLE)) {
|
||||
/* Block was previously
|
||||
* unavailable. Accumulate the new
|
||||
* counters only, as we know previous
|
||||
|
|
@ -1444,8 +1440,7 @@ static int kbasep_hwcnt_backend_csf_dump_get(struct kbase_hwcnt_backend *backend
|
|||
return -EINVAL;
|
||||
|
||||
/* Extract elapsed cycle count for each clock domain if enabled. */
|
||||
kbase_hwcnt_metadata_for_each_clock(dst_enable_map->metadata, clk)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_clock(dst_enable_map->metadata, clk) {
|
||||
if (!kbase_hwcnt_clk_enable_map_enabled(dst_enable_map->clk_enable_map, clk))
|
||||
continue;
|
||||
|
||||
|
|
|
|||
|
|
@ -31,6 +31,8 @@
|
|||
#include "hwcnt/backend/mali_kbase_hwcnt_backend_csf_if.h"
|
||||
#include "hwcnt/mali_kbase_hwcnt_watchdog_if.h"
|
||||
|
||||
struct kbase_hwcnt_physical_enable_map;
|
||||
|
||||
/**
|
||||
* kbase_hwcnt_backend_csf_create() - Create a CSF hardware counter backend
|
||||
* interface.
|
||||
|
|
@ -127,6 +129,15 @@ void kbase_hwcnt_backend_csf_set_hw_availability(struct kbase_hwcnt_backend_inte
|
|||
size_t num_l2_slices,
|
||||
uint64_t shader_present_bitmap);
|
||||
|
||||
/** kbasep_hwcnt_backend_csf_process_enable_map() - Process the enable_map to
|
||||
* guarantee headers are
|
||||
* enabled if any counter is
|
||||
* required.
|
||||
* @phys_enable_map: HWC physical enable map to be processed.
|
||||
*/
|
||||
void kbasep_hwcnt_backend_csf_process_enable_map(
|
||||
struct kbase_hwcnt_physical_enable_map *phys_enable_map);
|
||||
|
||||
/**
|
||||
* kbase_hwcnt_backend_csf_on_prfcnt_sample() - CSF performance counter sample
|
||||
* complete interrupt handler.
|
||||
|
|
|
|||
|
|
@ -536,7 +536,7 @@ kbasep_hwcnt_backend_csf_if_fw_dump_enable(struct kbase_hwcnt_backend_csf_if_ctx
|
|||
(struct kbase_hwcnt_backend_csf_if_fw_ctx *)ctx;
|
||||
struct kbase_hwcnt_backend_csf_if_fw_ring_buf *fw_ring_buf =
|
||||
(struct kbase_hwcnt_backend_csf_if_fw_ring_buf *)ring_buf;
|
||||
u32 max_csg_slots;
|
||||
u32 csg_mask;
|
||||
|
||||
WARN_ON(!ctx);
|
||||
WARN_ON(!ring_buf);
|
||||
|
|
@ -545,7 +545,7 @@ kbasep_hwcnt_backend_csf_if_fw_dump_enable(struct kbase_hwcnt_backend_csf_if_ctx
|
|||
|
||||
kbdev = fw_ctx->kbdev;
|
||||
global_iface = &kbdev->csf.global_iface;
|
||||
max_csg_slots = kbdev->csf.global_iface.group_num;
|
||||
csg_mask = (1 << kbdev->csf.global_iface.group_num) - 1;
|
||||
|
||||
/* Configure */
|
||||
prfcnt_config = GLB_PRFCNT_CONFIG_SIZE_SET(0, fw_ring_buf->buf_count);
|
||||
|
|
@ -570,7 +570,7 @@ kbasep_hwcnt_backend_csf_if_fw_dump_enable(struct kbase_hwcnt_backend_csf_if_ctx
|
|||
kbase_csf_firmware_global_input(global_iface, GLB_PRFCNT_CSG_EN, enable->csg_bm);
|
||||
|
||||
/* Enable all of the CSGs by default. */
|
||||
kbase_csf_firmware_global_input(global_iface, GLB_PRFCNT_CSG_SELECT, max_csg_slots);
|
||||
kbase_csf_firmware_global_input(global_iface, GLB_PRFCNT_CSG_SELECT, csg_mask);
|
||||
|
||||
|
||||
/* Configure the HWC set and buffer size */
|
||||
|
|
|
|||
|
|
@ -80,34 +80,40 @@ struct kbase_hwcnt_jm_physical_layout {
|
|||
|
||||
/**
|
||||
* struct kbase_hwcnt_backend_jm - Instance of a JM hardware counter backend.
|
||||
* @info: Info used to create the backend.
|
||||
* @kctx: KBase context used for GPU memory allocation and
|
||||
* counter dumping.
|
||||
* @gpu_dump_va: GPU hardware counter dump buffer virtual address.
|
||||
* @cpu_dump_va: CPU mapping of gpu_dump_va.
|
||||
* @vmap: Dump buffer vmap.
|
||||
* @to_user_buf: HWC sample buffer for client user, size
|
||||
* metadata.dump_buf_bytes.
|
||||
* @enabled: True if dumping has been enabled, else false.
|
||||
* @accum_all_blk_stt: Block State to accumulate on next sample, for all types
|
||||
* of block.
|
||||
* @info: Info used to create the backend.
|
||||
* @kctx: KBase context used for GPU memory allocation and
|
||||
* counter dumping.
|
||||
* @gpu_dump_va: GPU hardware counter dump buffer virtual address.
|
||||
* @cpu_dump_va: CPU mapping of gpu_dump_va.
|
||||
* @vmap: Dump buffer vmap.
|
||||
* @to_user_buf: HWC sample buffer for client user, size
|
||||
* metadata.dump_buf_bytes.
|
||||
* @enabled: True if dumping has been enabled, else false.
|
||||
* @accum_all_blk_stt: Block State to accumulate on next sample, for all types
|
||||
* of block.
|
||||
* @sampled_all_blk_stt: Block State to accumulate into the current sample, for
|
||||
* all types of block.
|
||||
* @pm_core_mask: PM state sync-ed shaders core mask for the enabled
|
||||
* dumping.
|
||||
* @curr_config: Current allocated hardware resources to correctly map the
|
||||
* source raw dump buffer to the destination dump buffer.
|
||||
* @clk_enable_map: The enable map specifying enabled clock domains.
|
||||
* @cycle_count_elapsed:
|
||||
* Cycle count elapsed for a given sample period.
|
||||
* The top clock cycle, index 0, is read directly from
|
||||
* hardware, but the other clock domains need to be
|
||||
* calculated with software estimation.
|
||||
* @prev_cycle_count: Previous cycle count to calculate the cycle count for
|
||||
* sample period.
|
||||
* @rate_listener: Clock rate listener callback state.
|
||||
* @ccswe_shader_cores: Shader cores cycle count software estimator.
|
||||
* @phys_layout: Physical memory layout information of HWC sample buffer.
|
||||
* @debug_core_mask: User-set mask of shader cores that can be used.
|
||||
* @pm_core_mask: PM state sync-ed shaders core mask for the enabled
|
||||
* dumping.
|
||||
* @curr_config: Current allocated hardware resources to correctly map the
|
||||
* source raw dump buffer to the destination dump buffer.
|
||||
* @max_core_mask: Core mask of all cores allocated to the GPU (non
|
||||
* virtualized platforms) or resource group (virtualized
|
||||
* platforms).
|
||||
* @max_l2_slices: Maximum number of L2 slices allocated to the GPU (non
|
||||
* virtualized platforms) or resource group (virtualized
|
||||
* platforms).
|
||||
* @clk_enable_map: The enable map specifying enabled clock domains.
|
||||
* @cycle_count_elapsed: Cycle count elapsed for a given sample period.
|
||||
* The top clock cycle, index 0, is read directly from
|
||||
* hardware, but the other clock domains need to be
|
||||
* calculated with software estimation.
|
||||
* @prev_cycle_count: Previous cycle count to calculate the cycle count for
|
||||
* sample period.
|
||||
* @rate_listener: Clock rate listener callback state.
|
||||
* @ccswe_shader_cores: Shader cores cycle count software estimator.
|
||||
* @phys_layout: Physical memory layout information of HWC sample buffer.
|
||||
*/
|
||||
struct kbase_hwcnt_backend_jm {
|
||||
const struct kbase_hwcnt_backend_jm_info *info;
|
||||
|
|
@ -119,8 +125,11 @@ struct kbase_hwcnt_backend_jm {
|
|||
bool enabled;
|
||||
blk_stt_t accum_all_blk_stt;
|
||||
blk_stt_t sampled_all_blk_stt;
|
||||
u64 debug_core_mask;
|
||||
u64 pm_core_mask;
|
||||
struct kbase_hwcnt_curr_config curr_config;
|
||||
u64 max_core_mask;
|
||||
size_t max_l2_slices;
|
||||
u64 clk_enable_map;
|
||||
u64 cycle_count_elapsed[BASE_MAX_NR_CLOCKS_REGULATORS];
|
||||
u64 prev_cycle_count[BASE_MAX_NR_CLOCKS_REGULATORS];
|
||||
|
|
@ -355,9 +364,9 @@ kbasep_hwcnt_backend_jm_dump_enable_nolock(struct kbase_hwcnt_backend *backend,
|
|||
struct kbase_hwcnt_backend_jm *backend_jm = (struct kbase_hwcnt_backend_jm *)backend;
|
||||
struct kbase_context *kctx;
|
||||
struct kbase_device *kbdev;
|
||||
struct kbase_hwcnt_physical_enable_map phys_enable_map;
|
||||
struct kbase_hwcnt_physical_enable_map phys_enable_map = { 0 };
|
||||
enum kbase_hwcnt_physical_set phys_counter_set;
|
||||
struct kbase_instr_hwcnt_enable enable;
|
||||
struct kbase_instr_hwcnt_enable enable = { 0 };
|
||||
u64 timestamp_ns;
|
||||
|
||||
if (!backend_jm || !enable_map || backend_jm->enabled ||
|
||||
|
|
@ -373,18 +382,21 @@ kbasep_hwcnt_backend_jm_dump_enable_nolock(struct kbase_hwcnt_backend *backend,
|
|||
|
||||
kbase_hwcnt_gpu_set_to_physical(&phys_counter_set, backend_jm->info->counter_set);
|
||||
|
||||
enable.fe_bm = phys_enable_map.fe_bm;
|
||||
enable.shader_bm = phys_enable_map.shader_bm;
|
||||
enable.tiler_bm = phys_enable_map.tiler_bm;
|
||||
enable.mmu_l2_bm = phys_enable_map.mmu_l2_bm;
|
||||
enable.counter_set = phys_counter_set;
|
||||
enable = (struct kbase_instr_hwcnt_enable)
|
||||
{
|
||||
.fe_bm = phys_enable_map.fe_bm,
|
||||
.shader_bm = phys_enable_map.shader_bm,
|
||||
.tiler_bm = phys_enable_map.tiler_bm,
|
||||
.mmu_l2_bm = phys_enable_map.mmu_l2_bm,
|
||||
.counter_set = phys_counter_set,
|
||||
#if IS_ENABLED(CONFIG_MALI_NO_MALI)
|
||||
/* The dummy model needs the CPU mapping. */
|
||||
enable.dump_buffer = (uintptr_t)backend_jm->cpu_dump_va;
|
||||
/* The dummy model needs the CPU mapping. */
|
||||
.dump_buffer = (uintptr_t)backend_jm->cpu_dump_va,
|
||||
#else
|
||||
enable.dump_buffer = backend_jm->gpu_dump_va;
|
||||
.dump_buffer = backend_jm->gpu_dump_va,
|
||||
#endif /* CONFIG_MALI_NO_MALI */
|
||||
enable.dump_buffer_bytes = backend_jm->info->dump_bytes;
|
||||
.dump_buffer_bytes = backend_jm->info->dump_bytes,
|
||||
};
|
||||
|
||||
timestamp_ns = kbasep_hwcnt_backend_jm_timestamp_ns(backend);
|
||||
|
||||
|
|
@ -397,6 +409,10 @@ kbasep_hwcnt_backend_jm_dump_enable_nolock(struct kbase_hwcnt_backend *backend,
|
|||
if (errcode)
|
||||
goto error;
|
||||
|
||||
backend_jm->debug_core_mask = kbase_pm_ca_get_debug_core_mask(kbdev);
|
||||
backend_jm->max_l2_slices = backend_jm->info->hwcnt_gpu_info.l2_count;
|
||||
backend_jm->max_core_mask = backend_jm->info->hwcnt_gpu_info.core_mask;
|
||||
|
||||
backend_jm->pm_core_mask = kbase_pm_ca_get_instr_core_mask(kbdev);
|
||||
|
||||
backend_jm->enabled = true;
|
||||
|
|
@ -537,8 +553,7 @@ static int kbasep_hwcnt_backend_jm_dump_request(struct kbase_hwcnt_backend *back
|
|||
*dump_time_ns = kbasep_hwcnt_backend_jm_timestamp_ns(backend);
|
||||
ret = kbase_instr_hwcnt_request_dump(backend_jm->kctx);
|
||||
|
||||
kbase_hwcnt_metadata_for_each_clock(metadata, clk)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_clock(metadata, clk) {
|
||||
if (!kbase_hwcnt_clk_enable_map_enabled(backend_jm->clk_enable_map, clk))
|
||||
continue;
|
||||
|
||||
|
|
@ -620,8 +635,7 @@ static int kbasep_hwcnt_backend_jm_dump_get(struct kbase_hwcnt_backend *backend,
|
|||
kbasep_hwcnt_backend_jm_dump_sample(backend_jm);
|
||||
|
||||
/* Extract elapsed cycle count for each clock domain if enabled. */
|
||||
kbase_hwcnt_metadata_for_each_clock(dst_enable_map->metadata, clk)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_clock(dst_enable_map->metadata, clk) {
|
||||
if (!kbase_hwcnt_clk_enable_map_enabled(dst_enable_map->clk_enable_map, clk))
|
||||
continue;
|
||||
|
||||
|
|
@ -645,8 +659,9 @@ static int kbasep_hwcnt_backend_jm_dump_get(struct kbase_hwcnt_backend *backend,
|
|||
return errcode;
|
||||
#endif /* CONFIG_MALI_NO_MALI */
|
||||
errcode = kbase_hwcnt_jm_dump_get(dst, backend_jm->to_user_buf, dst_enable_map,
|
||||
backend_jm->pm_core_mask, &backend_jm->curr_config,
|
||||
accumulate);
|
||||
backend_jm->pm_core_mask, backend_jm->debug_core_mask,
|
||||
backend_jm->max_core_mask, backend_jm->max_l2_slices,
|
||||
&backend_jm->curr_config, accumulate);
|
||||
|
||||
if (errcode)
|
||||
return errcode;
|
||||
|
|
|
|||
|
|
@ -169,7 +169,7 @@ static int kbasep_hwcnt_backend_gpu_metadata_create(const struct kbase_hwcnt_gpu
|
|||
/* Calculate number of block instances that aren't cores */
|
||||
non_core_block_count = 2 + gpu_info->l2_count;
|
||||
/* Calculate number of block instances that are shader cores */
|
||||
sc_block_count = fls64(gpu_info->core_mask);
|
||||
sc_block_count = (size_t)fls64(gpu_info->core_mask);
|
||||
/* Determine the total number of cores */
|
||||
core_block_count = sc_block_count;
|
||||
|
||||
|
|
@ -274,7 +274,8 @@ static int kbasep_hwcnt_backend_gpu_metadata_create(const struct kbase_hwcnt_gpu
|
|||
desc.clk_cnt = gpu_info->clk_cnt;
|
||||
|
||||
/* The JM, Tiler, and L2s are always available, and are before cores */
|
||||
kbase_hwcnt_set_avail_mask(&desc.avail_mask, (1ull << non_core_block_count) - 1, 0);
|
||||
kbase_hwcnt_set_avail_mask(&desc.avail_mask, 0, 0);
|
||||
kbase_hwcnt_set_avail_mask_bits(&desc.avail_mask, 0, non_core_block_count, U64_MAX);
|
||||
kbase_hwcnt_set_avail_mask_bits(&desc.avail_mask, non_core_block_count, sc_block_count,
|
||||
gpu_info->core_mask);
|
||||
|
||||
|
|
@ -293,7 +294,7 @@ static size_t kbasep_hwcnt_backend_jm_dump_bytes(const struct kbase_hwcnt_gpu_in
|
|||
{
|
||||
WARN_ON(!gpu_info);
|
||||
|
||||
return (2 + gpu_info->l2_count + fls64(gpu_info->core_mask)) *
|
||||
return (2 + gpu_info->l2_count + (size_t)fls64(gpu_info->core_mask)) *
|
||||
gpu_info->prfcnt_values_per_block * KBASE_HWCNT_VALUE_HW_BYTES;
|
||||
}
|
||||
|
||||
|
|
@ -372,33 +373,50 @@ void kbase_hwcnt_csf_metadata_destroy(const struct kbase_hwcnt_metadata *metadat
|
|||
kbase_hwcnt_metadata_destroy(metadata);
|
||||
}
|
||||
|
||||
static bool is_block_type_shader(const u64 blk_type)
|
||||
bool kbase_hwcnt_is_block_type_shader(const enum kbase_hwcnt_gpu_v5_block_type blk_type)
|
||||
{
|
||||
bool is_shader = false;
|
||||
|
||||
if (blk_type == KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC ||
|
||||
blk_type == KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC2 ||
|
||||
blk_type == KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC3 ||
|
||||
blk_type == KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC_UNDEFINED)
|
||||
is_shader = true;
|
||||
return true;
|
||||
|
||||
return is_shader;
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool is_block_type_l2_cache(const u64 blk_type)
|
||||
bool kbase_hwcnt_is_block_type_memsys(const enum kbase_hwcnt_gpu_v5_block_type blk_type)
|
||||
{
|
||||
bool is_l2_cache = false;
|
||||
|
||||
if (blk_type == KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS ||
|
||||
blk_type == KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS2 ||
|
||||
blk_type == KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS_UNDEFINED)
|
||||
is_l2_cache = true;
|
||||
return true;
|
||||
|
||||
return is_l2_cache;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool kbase_hwcnt_is_block_type_tiler(const enum kbase_hwcnt_gpu_v5_block_type blk_type)
|
||||
{
|
||||
if (blk_type == KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_TILER ||
|
||||
blk_type == KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_TILER_UNDEFINED)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool kbase_hwcnt_is_block_type_fe(const enum kbase_hwcnt_gpu_v5_block_type blk_type)
|
||||
{
|
||||
if (blk_type == KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE ||
|
||||
blk_type == KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE2 ||
|
||||
blk_type == KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE3 ||
|
||||
blk_type == KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE_UNDEFINED)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int kbase_hwcnt_jm_dump_get(struct kbase_hwcnt_dump_buffer *dst, u64 *src,
|
||||
const struct kbase_hwcnt_enable_map *dst_enable_map, u64 pm_core_mask,
|
||||
u64 debug_core_mask, u64 max_core_mask, size_t max_l2_slices,
|
||||
const struct kbase_hwcnt_curr_config *curr_config, bool accumulate)
|
||||
{
|
||||
const struct kbase_hwcnt_metadata *metadata;
|
||||
|
|
@ -406,6 +424,7 @@ int kbase_hwcnt_jm_dump_get(struct kbase_hwcnt_dump_buffer *dst, u64 *src,
|
|||
const u64 *dump_src = src;
|
||||
size_t src_offset = 0;
|
||||
u64 core_mask = pm_core_mask;
|
||||
u64 shader_present = curr_config->shader_present;
|
||||
|
||||
/* Variables to deal with the current configuration */
|
||||
size_t l2_count = 0;
|
||||
|
|
@ -415,13 +434,12 @@ int kbase_hwcnt_jm_dump_get(struct kbase_hwcnt_dump_buffer *dst, u64 *src,
|
|||
|
||||
metadata = dst->metadata;
|
||||
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst) {
|
||||
const size_t hdr_cnt = kbase_hwcnt_metadata_block_headers_count(metadata, blk);
|
||||
const size_t ctr_cnt = kbase_hwcnt_metadata_block_counters_count(metadata, blk);
|
||||
const u64 blk_type = kbase_hwcnt_metadata_block_type(metadata, blk);
|
||||
const bool is_shader_core = is_block_type_shader(blk_type);
|
||||
const bool is_l2_cache = is_block_type_l2_cache(blk_type);
|
||||
const bool is_shader_core = kbase_hwcnt_is_block_type_shader(blk_type);
|
||||
const bool is_l2_cache = kbase_hwcnt_is_block_type_memsys(blk_type);
|
||||
const bool is_undefined = kbase_hwcnt_is_block_type_undefined(blk_type);
|
||||
blk_stt_t *dst_blk_stt =
|
||||
kbase_hwcnt_dump_buffer_block_state_instance(dst, blk, blk_inst);
|
||||
|
|
@ -458,25 +476,52 @@ int kbase_hwcnt_jm_dump_get(struct kbase_hwcnt_dump_buffer *dst, u64 *src,
|
|||
|
||||
if (blk_valid) {
|
||||
bool blk_powered;
|
||||
blk_stt_t current_block_state;
|
||||
blk_stt_t current_block_state = 0;
|
||||
|
||||
if (!is_shader_core) {
|
||||
/* Under the current PM system, counters will only be
|
||||
* enabled after all non shader core blocks are powered up.
|
||||
/* The L2 block must be available at this point, or handled
|
||||
* differently below.
|
||||
* Every partition must have a FE and a tiler, so they
|
||||
* must be implicitly available as part of the current
|
||||
* configuration.
|
||||
*/
|
||||
blk_powered = true;
|
||||
current_block_state |= KBASE_HWCNT_STATE_AVAILABLE;
|
||||
} else {
|
||||
/* Check the PM core mask to see if the shader core is
|
||||
* powered up.
|
||||
*/
|
||||
blk_powered = core_mask & 1;
|
||||
|
||||
/* Set availability bits based on whether the core is
|
||||
* present in both the shader_present AND the core
|
||||
* mask in sysFS. The core masks are shifted to the
|
||||
* right at the end of the loop so always check the
|
||||
* rightmost bit.
|
||||
*/
|
||||
if ((shader_present & debug_core_mask) & 0x1)
|
||||
current_block_state |= KBASE_HWCNT_STATE_AVAILABLE;
|
||||
else {
|
||||
/* If this branch is taken, the shader core may
|
||||
* be:
|
||||
* * in the max configuration, but not enabled
|
||||
* through the sysFS core mask
|
||||
* * in the max configuration, but not in the
|
||||
* current configuration
|
||||
* * physically not present
|
||||
*/
|
||||
current_block_state |=
|
||||
KBASE_HWCNT_STATE_UNAVAILABLE;
|
||||
}
|
||||
}
|
||||
current_block_state = (blk_powered) ? KBASE_HWCNT_STATE_ON :
|
||||
KBASE_HWCNT_STATE_OFF;
|
||||
|
||||
/* Note: KBASE_HWCNT_STATE_OFF for non-shader cores (L2, Tiler, JM)
|
||||
* is handled on this backend's dump_disable function
|
||||
* is handled on this backend's dump_disable function (since
|
||||
* they are considered to always be powered here).
|
||||
*/
|
||||
current_block_state |= (blk_powered) ? KBASE_HWCNT_STATE_ON :
|
||||
KBASE_HWCNT_STATE_OFF;
|
||||
|
||||
if (accumulate) {
|
||||
/* Only update existing counter values if block was powered
|
||||
* and valid
|
||||
|
|
@ -500,10 +545,22 @@ int kbase_hwcnt_jm_dump_get(struct kbase_hwcnt_dump_buffer *dst, u64 *src,
|
|||
kbase_hwcnt_block_state_set(dst_blk_stt,
|
||||
current_block_state);
|
||||
}
|
||||
} else if (is_l2_cache && !is_undefined) {
|
||||
/* Defined L2 can only reach here when the partition does not
|
||||
* own it. Check that the L2 count is within the resource
|
||||
* group or whole GPU's max L2 count, and if so,
|
||||
* mark it as unavailable.
|
||||
*/
|
||||
if (l2_count <= max_l2_slices) {
|
||||
kbase_hwcnt_block_state_set(
|
||||
dst_blk_stt, KBASE_HWCNT_STATE_OFF |
|
||||
KBASE_HWCNT_STATE_UNAVAILABLE);
|
||||
}
|
||||
kbase_hwcnt_dump_buffer_block_zero(dst_blk, (hdr_cnt + ctr_cnt));
|
||||
} else {
|
||||
/* Even though the block might be undefined, the user has enabled
|
||||
* counter collection for it. We should not propagate garbage data,
|
||||
* or copy/accumulate the block states.
|
||||
/* Even though the block is undefined, the user has
|
||||
* enabled counter collection for it. We should not propagate
|
||||
* garbage data, or copy/accumulate the block states.
|
||||
*/
|
||||
if (accumulate) {
|
||||
/* No-op to preserve existing values */
|
||||
|
|
@ -520,8 +577,13 @@ int kbase_hwcnt_jm_dump_get(struct kbase_hwcnt_dump_buffer *dst, u64 *src,
|
|||
/* Just increase the src_offset if the HW is available */
|
||||
if (hw_res_available)
|
||||
src_offset += (hdr_cnt + ctr_cnt);
|
||||
if (is_shader_core)
|
||||
core_mask = core_mask >> 1;
|
||||
if (is_shader_core) {
|
||||
/* Shift each core mask right by 1 */
|
||||
core_mask >>= 1;
|
||||
debug_core_mask >>= 1;
|
||||
max_core_mask >>= 1;
|
||||
shader_present >>= 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -544,8 +606,7 @@ int kbase_hwcnt_csf_dump_get(struct kbase_hwcnt_dump_buffer *dst, u64 *src,
|
|||
|
||||
metadata = dst->metadata;
|
||||
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst) {
|
||||
const size_t hdr_cnt = kbase_hwcnt_metadata_block_headers_count(metadata, blk);
|
||||
const size_t ctr_cnt = kbase_hwcnt_metadata_block_counters_count(metadata, blk);
|
||||
const uint64_t blk_type = kbase_hwcnt_metadata_block_type(metadata, blk);
|
||||
|
|
@ -650,8 +711,7 @@ void kbase_hwcnt_gpu_enable_map_to_physical(struct kbase_hwcnt_physical_enable_m
|
|||
|
||||
metadata = src->metadata;
|
||||
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst) {
|
||||
const u64 blk_type = kbase_hwcnt_metadata_block_type(metadata, blk);
|
||||
const u64 *blk_map = kbase_hwcnt_enable_map_block_instance(src, blk, blk_inst);
|
||||
const size_t map_stride =
|
||||
|
|
@ -749,14 +809,31 @@ void kbase_hwcnt_gpu_set_to_physical(enum kbase_hwcnt_physical_set *dst, enum kb
|
|||
void kbase_hwcnt_gpu_enable_map_from_physical(struct kbase_hwcnt_enable_map *dst,
|
||||
const struct kbase_hwcnt_physical_enable_map *src)
|
||||
{
|
||||
const struct kbase_hwcnt_metadata *metadata;
|
||||
struct kbase_hwcnt_enable_cm cm = {};
|
||||
|
||||
u64 fe_bm[EM_COUNT] = { 0 };
|
||||
u64 shader_bm[EM_COUNT] = { 0 };
|
||||
u64 tiler_bm[EM_COUNT] = { 0 };
|
||||
u64 mmu_l2_bm[EM_COUNT] = { 0 };
|
||||
u64 fw_bm[EM_COUNT] = { 0 };
|
||||
u64 csg_bm[EM_COUNT] = { 0 };
|
||||
if (WARN_ON(!src) || WARN_ON(!dst))
|
||||
return;
|
||||
|
||||
kbasep_hwcnt_backend_gpu_block_map_from_physical(src->fe_bm, &cm.fe_bm[EM_LO],
|
||||
&cm.fe_bm[EM_HI]);
|
||||
kbasep_hwcnt_backend_gpu_block_map_from_physical(src->shader_bm, &cm.shader_bm[EM_LO],
|
||||
&cm.shader_bm[EM_HI]);
|
||||
kbasep_hwcnt_backend_gpu_block_map_from_physical(src->tiler_bm, &cm.tiler_bm[EM_LO],
|
||||
&cm.tiler_bm[EM_HI]);
|
||||
kbasep_hwcnt_backend_gpu_block_map_from_physical(src->mmu_l2_bm, &cm.mmu_l2_bm[EM_LO],
|
||||
&cm.mmu_l2_bm[EM_HI]);
|
||||
kbasep_hwcnt_backend_gpu_block_map_from_physical(src->fw_bm, &cm.fw_bm[EM_LO],
|
||||
&cm.fw_bm[EM_HI]);
|
||||
kbasep_hwcnt_backend_gpu_block_map_from_physical(src->csg_bm, &cm.csg_bm[EM_LO],
|
||||
&cm.csg_bm[EM_HI]);
|
||||
|
||||
kbase_hwcnt_gpu_enable_map_from_cm(dst, &cm);
|
||||
}
|
||||
|
||||
void kbase_hwcnt_gpu_enable_map_from_cm(struct kbase_hwcnt_enable_map *dst,
|
||||
const struct kbase_hwcnt_enable_cm *src)
|
||||
{
|
||||
const struct kbase_hwcnt_metadata *metadata;
|
||||
size_t blk, blk_inst;
|
||||
|
||||
if (WARN_ON(!src) || WARN_ON(!dst))
|
||||
|
|
@ -764,19 +841,7 @@ void kbase_hwcnt_gpu_enable_map_from_physical(struct kbase_hwcnt_enable_map *dst
|
|||
|
||||
metadata = dst->metadata;
|
||||
|
||||
kbasep_hwcnt_backend_gpu_block_map_from_physical(src->fe_bm, &fe_bm[EM_LO], &fe_bm[EM_HI]);
|
||||
kbasep_hwcnt_backend_gpu_block_map_from_physical(src->shader_bm, &shader_bm[EM_LO],
|
||||
&shader_bm[EM_HI]);
|
||||
kbasep_hwcnt_backend_gpu_block_map_from_physical(src->tiler_bm, &tiler_bm[EM_LO],
|
||||
&tiler_bm[EM_HI]);
|
||||
kbasep_hwcnt_backend_gpu_block_map_from_physical(src->mmu_l2_bm, &mmu_l2_bm[EM_LO],
|
||||
&mmu_l2_bm[EM_HI]);
|
||||
kbasep_hwcnt_backend_gpu_block_map_from_physical(src->fw_bm, &fw_bm[EM_LO], &fw_bm[EM_HI]);
|
||||
kbasep_hwcnt_backend_gpu_block_map_from_physical(src->csg_bm, &csg_bm[EM_LO],
|
||||
&csg_bm[EM_HI]);
|
||||
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst) {
|
||||
const u64 blk_type = kbase_hwcnt_metadata_block_type(metadata, blk);
|
||||
u64 *blk_map = kbase_hwcnt_enable_map_block_instance(dst, blk, blk_inst);
|
||||
const size_t map_stride =
|
||||
|
|
@ -806,36 +871,36 @@ void kbase_hwcnt_gpu_enable_map_from_physical(struct kbase_hwcnt_enable_map *dst
|
|||
case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE2:
|
||||
fallthrough;
|
||||
case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FE3:
|
||||
blk_map[map_idx] = fe_bm[map_idx];
|
||||
blk_map[map_idx] = src->fe_bm[map_idx];
|
||||
break;
|
||||
case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_TILER:
|
||||
blk_map[map_idx] = tiler_bm[map_idx];
|
||||
blk_map[map_idx] = src->tiler_bm[map_idx];
|
||||
break;
|
||||
case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC:
|
||||
fallthrough;
|
||||
case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC2:
|
||||
fallthrough;
|
||||
case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_SC3:
|
||||
blk_map[map_idx] = shader_bm[map_idx];
|
||||
blk_map[map_idx] = src->shader_bm[map_idx];
|
||||
break;
|
||||
case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS:
|
||||
fallthrough;
|
||||
case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_MEMSYS2:
|
||||
blk_map[map_idx] = mmu_l2_bm[map_idx];
|
||||
blk_map[map_idx] = src->mmu_l2_bm[map_idx];
|
||||
break;
|
||||
case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FW:
|
||||
fallthrough;
|
||||
case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FW2:
|
||||
fallthrough;
|
||||
case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_FW3:
|
||||
blk_map[map_idx] = fw_bm[map_idx];
|
||||
blk_map[map_idx] = src->fw_bm[map_idx];
|
||||
break;
|
||||
case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_CSG:
|
||||
fallthrough;
|
||||
case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_CSG2:
|
||||
fallthrough;
|
||||
case KBASE_HWCNT_GPU_V5_BLOCK_TYPE_PERF_CSG3:
|
||||
blk_map[map_idx] = csg_bm[map_idx];
|
||||
blk_map[map_idx] = src->csg_bm[map_idx];
|
||||
break;
|
||||
default:
|
||||
WARN(true, "Invalid block type %llu", blk_type);
|
||||
|
|
@ -855,8 +920,7 @@ void kbase_hwcnt_gpu_patch_dump_headers(struct kbase_hwcnt_dump_buffer *buf,
|
|||
|
||||
metadata = buf->metadata;
|
||||
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst) {
|
||||
u64 *buf_blk = kbase_hwcnt_dump_buffer_block_instance(buf, blk, blk_inst);
|
||||
const u64 *blk_map =
|
||||
kbase_hwcnt_enable_map_block_instance(enable_map, blk, blk_inst);
|
||||
|
|
|
|||
|
|
@ -138,6 +138,24 @@ struct kbase_hwcnt_physical_enable_map {
|
|||
u32 csg_bm;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct kbase_hwcnt_enable_cm - 128-bit enable counter masks.
|
||||
* @fe_bm: Front end (JM/CSHW) counters selection bitmask.
|
||||
* @shader_bm: Shader counters selection bitmask.
|
||||
* @tiler_bm: Tiler counters selection bitmask.
|
||||
* @mmu_l2_bm: MMU_L2 counters selection bitmask.
|
||||
* @fw_bm: CSF firmware counters selection bitmask.
|
||||
* @csg_bm: CSF CSG counters selection bitmask.
|
||||
*/
|
||||
struct kbase_hwcnt_enable_cm {
|
||||
u64 fe_bm[2];
|
||||
u64 shader_bm[2];
|
||||
u64 tiler_bm[2];
|
||||
u64 mmu_l2_bm[2];
|
||||
u64 fw_bm[2];
|
||||
u64 csg_bm[2];
|
||||
};
|
||||
|
||||
/*
|
||||
* Values for Hardware Counter SET_SELECT value.
|
||||
* Directly passed to HW.
|
||||
|
|
@ -275,16 +293,23 @@ void kbase_hwcnt_csf_metadata_destroy(const struct kbase_hwcnt_metadata *metadat
|
|||
* kbase_hwcnt_jm_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 destination dump buffer.
|
||||
* @src: Non-NULL pointer to source raw dump buffer, of same length
|
||||
* as dump_buf_bytes in the metadata of destination dump
|
||||
* buffer.
|
||||
* @dst_enable_map: Non-NULL pointer to enable map specifying enabled values.
|
||||
* @pm_core_mask: PM state synchronized shaders core mask with the dump.
|
||||
* @curr_config: Current allocated hardware resources to correctly map the
|
||||
* source raw dump buffer to the destination dump buffer.
|
||||
* @accumulate: True if counters in source should be accumulated into
|
||||
* destination, rather than copied.
|
||||
* @dst: Non-NULL pointer to destination dump buffer.
|
||||
* @src: Non-NULL pointer to source raw dump buffer, of same length
|
||||
* as dump_buf_bytes in the metadata of destination dump
|
||||
* buffer.
|
||||
* @dst_enable_map: Non-NULL pointer to enable map specifying enabled values.
|
||||
* @pm_core_mask: PM state synchronized shaders core mask with the dump.
|
||||
* @debug_core_mask: User-set mask of cores to be used by the GPU.
|
||||
* @max_core_mask: Core mask of all cores allocated to the GPU (non
|
||||
* virtualized platforms) or resource group (virtualized
|
||||
* platforms).
|
||||
* @max_l2_slices: Maximum number of L2 slices allocated to the GPU (non
|
||||
* virtualised platforms) or resource group (virtualized
|
||||
* platforms).
|
||||
* @curr_config: Current allocated hardware resources to correctly map the
|
||||
* source raw dump buffer to the destination dump buffer.
|
||||
* @accumulate: True if counters in source should be accumulated into
|
||||
* destination, 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_jm_metadata_create as was used to get
|
||||
|
|
@ -294,8 +319,9 @@ void kbase_hwcnt_csf_metadata_destroy(const struct kbase_hwcnt_metadata *metadat
|
|||
*/
|
||||
int kbase_hwcnt_jm_dump_get(struct kbase_hwcnt_dump_buffer *dst, u64 *src,
|
||||
const struct kbase_hwcnt_enable_map *dst_enable_map,
|
||||
const u64 pm_core_mask,
|
||||
const struct kbase_hwcnt_curr_config *curr_config, bool accumulate);
|
||||
const u64 pm_core_mask, u64 debug_core_mask, u64 max_core_mask,
|
||||
size_t max_l2_slices, const struct kbase_hwcnt_curr_config *curr_config,
|
||||
bool accumulate);
|
||||
|
||||
/**
|
||||
* kbase_hwcnt_csf_dump_get() - Copy or accumulate enabled counters from the raw
|
||||
|
|
@ -420,4 +446,23 @@ void kbase_hwcnt_gpu_enable_map_from_physical(struct kbase_hwcnt_enable_map *dst
|
|||
void kbase_hwcnt_gpu_patch_dump_headers(struct kbase_hwcnt_dump_buffer *buf,
|
||||
const struct kbase_hwcnt_enable_map *enable_map);
|
||||
|
||||
bool kbase_hwcnt_is_block_type_shader(const enum kbase_hwcnt_gpu_v5_block_type blk_type);
|
||||
|
||||
bool kbase_hwcnt_is_block_type_memsys(const enum kbase_hwcnt_gpu_v5_block_type blk_type);
|
||||
|
||||
bool kbase_hwcnt_is_block_type_tiler(const enum kbase_hwcnt_gpu_v5_block_type blk_type);
|
||||
|
||||
bool kbase_hwcnt_is_block_type_fe(const enum kbase_hwcnt_gpu_v5_block_type blk_type);
|
||||
/**
|
||||
* kbase_hwcnt_gpu_enable_map_from_cm() - Builds enable map abstraction from
|
||||
* counter selection bitmasks.
|
||||
* @dst: Non-NULL pointer to destination enable map abstraction.
|
||||
* @src: Non-NULL pointer to source counter selection bitmasks.
|
||||
*
|
||||
* The dst must have been created from a metadata returned from a call to
|
||||
* kbase_hwcnt_jm_metadata_create or kbase_hwcnt_csf_metadata_create.
|
||||
*/
|
||||
void kbase_hwcnt_gpu_enable_map_from_cm(struct kbase_hwcnt_enable_map *dst,
|
||||
const struct kbase_hwcnt_enable_cm *src);
|
||||
|
||||
#endif /* _KBASE_HWCNT_GPU_H_ */
|
||||
|
|
|
|||
|
|
@ -208,8 +208,7 @@ void kbase_hwcnt_dump_buffer_zero(struct kbase_hwcnt_dump_buffer *dst,
|
|||
|
||||
metadata = dst->metadata;
|
||||
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst) {
|
||||
u64 *dst_blk;
|
||||
size_t val_cnt;
|
||||
|
||||
|
|
@ -248,8 +247,7 @@ void kbase_hwcnt_dump_buffer_zero_non_enabled(struct kbase_hwcnt_dump_buffer *ds
|
|||
|
||||
metadata = dst->metadata;
|
||||
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst) {
|
||||
u64 *dst_blk = kbase_hwcnt_dump_buffer_block_instance(dst, blk, blk_inst);
|
||||
blk_stt_t *dst_blk_stt =
|
||||
kbase_hwcnt_dump_buffer_block_state_instance(dst, blk, blk_inst);
|
||||
|
|
@ -291,8 +289,7 @@ void kbase_hwcnt_dump_buffer_copy(struct kbase_hwcnt_dump_buffer *dst,
|
|||
|
||||
metadata = dst->metadata;
|
||||
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst) {
|
||||
u64 *dst_blk;
|
||||
const u64 *src_blk;
|
||||
blk_stt_t *dst_blk_stt;
|
||||
|
|
@ -312,8 +309,7 @@ void kbase_hwcnt_dump_buffer_copy(struct kbase_hwcnt_dump_buffer *dst,
|
|||
kbase_hwcnt_block_state_copy(dst_blk_stt, src_blk_stt);
|
||||
}
|
||||
|
||||
kbase_hwcnt_metadata_for_each_clock(metadata, clk)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_clock(metadata, clk) {
|
||||
if (kbase_hwcnt_clk_enable_map_enabled(dst_enable_map->clk_enable_map, clk))
|
||||
dst->clk_cnt_buf[clk] = src->clk_cnt_buf[clk];
|
||||
}
|
||||
|
|
@ -334,8 +330,7 @@ void kbase_hwcnt_dump_buffer_copy_strict(struct kbase_hwcnt_dump_buffer *dst,
|
|||
|
||||
metadata = dst->metadata;
|
||||
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst) {
|
||||
u64 *dst_blk = kbase_hwcnt_dump_buffer_block_instance(dst, blk, blk_inst);
|
||||
const u64 *src_blk = kbase_hwcnt_dump_buffer_block_instance(src, blk, blk_inst);
|
||||
blk_stt_t *dst_blk_stt =
|
||||
|
|
@ -358,8 +353,7 @@ void kbase_hwcnt_dump_buffer_copy_strict(struct kbase_hwcnt_dump_buffer *dst,
|
|||
kbase_hwcnt_block_state_set(dst_blk_stt, KBASE_HWCNT_STATE_UNKNOWN);
|
||||
}
|
||||
|
||||
kbase_hwcnt_metadata_for_each_clock(metadata, clk)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_clock(metadata, clk) {
|
||||
bool clk_enabled =
|
||||
kbase_hwcnt_clk_enable_map_enabled(dst_enable_map->clk_enable_map, clk);
|
||||
|
||||
|
|
@ -382,8 +376,7 @@ void kbase_hwcnt_dump_buffer_accumulate(struct kbase_hwcnt_dump_buffer *dst,
|
|||
|
||||
metadata = dst->metadata;
|
||||
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst) {
|
||||
u64 *dst_blk;
|
||||
const u64 *src_blk;
|
||||
blk_stt_t *dst_blk_stt;
|
||||
|
|
@ -405,8 +398,7 @@ void kbase_hwcnt_dump_buffer_accumulate(struct kbase_hwcnt_dump_buffer *dst,
|
|||
kbase_hwcnt_block_state_accumulate(dst_blk_stt, src_blk_stt);
|
||||
}
|
||||
|
||||
kbase_hwcnt_metadata_for_each_clock(metadata, clk)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_clock(metadata, clk) {
|
||||
if (kbase_hwcnt_clk_enable_map_enabled(dst_enable_map->clk_enable_map, clk))
|
||||
dst->clk_cnt_buf[clk] += src->clk_cnt_buf[clk];
|
||||
}
|
||||
|
|
@ -427,8 +419,7 @@ void kbase_hwcnt_dump_buffer_accumulate_strict(struct kbase_hwcnt_dump_buffer *d
|
|||
|
||||
metadata = dst->metadata;
|
||||
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst) {
|
||||
u64 *dst_blk = kbase_hwcnt_dump_buffer_block_instance(dst, blk, blk_inst);
|
||||
const u64 *src_blk = kbase_hwcnt_dump_buffer_block_instance(src, blk, blk_inst);
|
||||
const u64 *blk_em =
|
||||
|
|
@ -455,8 +446,7 @@ void kbase_hwcnt_dump_buffer_accumulate_strict(struct kbase_hwcnt_dump_buffer *d
|
|||
kbase_hwcnt_block_state_set(dst_blk_stt, KBASE_HWCNT_STATE_UNKNOWN);
|
||||
}
|
||||
|
||||
kbase_hwcnt_metadata_for_each_clock(metadata, clk)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_clock(metadata, clk) {
|
||||
if (kbase_hwcnt_clk_enable_map_enabled(dst_enable_map->clk_enable_map, clk))
|
||||
dst->clk_cnt_buf[clk] += src->clk_cnt_buf[clk];
|
||||
else
|
||||
|
|
@ -477,14 +467,12 @@ void kbase_hwcnt_dump_buffer_block_state_update(struct kbase_hwcnt_dump_buffer *
|
|||
|
||||
metadata = dst->metadata;
|
||||
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_block(metadata, blk, blk_inst) {
|
||||
if (kbase_hwcnt_metadata_block_instance_avail(metadata, blk, blk_inst) &&
|
||||
kbase_hwcnt_enable_map_block_enabled(dst_enable_map, blk, blk_inst)) {
|
||||
blk_stt_t *dst_blk_stt =
|
||||
kbase_hwcnt_dump_buffer_block_state_instance(dst, blk, blk_inst);
|
||||
|
||||
/* Block is available and enabled, so update the block state */
|
||||
*dst_blk_stt |= blk_stt_val;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -321,7 +321,7 @@ static inline void kbase_hwcnt_cp_avail_mask(struct kbase_hwcnt_avail_mask *dst_
|
|||
* placed is expected to be fully contained by the array of bitmask elements.
|
||||
* @length_in_bits: The length of the value being placed in the bitmask. Assumed to be no more
|
||||
* than 64 bits in length.
|
||||
* @value: Pointer to the source value to be written into the bitmask.
|
||||
* @value: The source value to be written into the bitmask.
|
||||
*/
|
||||
static inline void kbase_hwcnt_set_avail_mask_bits(struct kbase_hwcnt_avail_mask *avail_mask,
|
||||
size_t offset_in_bits, size_t length_in_bits,
|
||||
|
|
@ -929,8 +929,7 @@ kbase_hwcnt_enable_map_any_enabled(const struct kbase_hwcnt_enable_map *enable_m
|
|||
if (enable_map->metadata->clk_cnt > 0 && (enable_map->clk_enable_map & clk_enable_map_mask))
|
||||
return true;
|
||||
|
||||
kbase_hwcnt_metadata_for_each_block(enable_map->metadata, blk, blk_inst)
|
||||
{
|
||||
kbase_hwcnt_metadata_for_each_block(enable_map->metadata, blk, blk_inst) {
|
||||
if (kbase_hwcnt_enable_map_block_enabled(enable_map, blk, blk_inst))
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ static s64 kbase_ipa_group_energy(s32 coeff, u64 counter_value)
|
|||
/* Range: 0 < counter_value < 2^38 */
|
||||
|
||||
/* Range: -2^59 < ret < 2^59 (as -2^21 < coeff < 2^21) */
|
||||
return counter_value * (s64)coeff;
|
||||
return (s64)counter_value * (s64)coeff;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -183,7 +183,7 @@ static int calculate_coeff(struct kbase_ipa_counter_model_data *model_data,
|
|||
|
||||
/* Range: 0 <= coeff < 2^63 */
|
||||
if (total_energy >= 0)
|
||||
coeff = total_energy;
|
||||
coeff = (u64)total_energy;
|
||||
else
|
||||
dev_dbg(model_data->kbdev->dev, "Energy value came negative as %lld", total_energy);
|
||||
|
||||
|
|
@ -224,7 +224,7 @@ static int calculate_coeff(struct kbase_ipa_counter_model_data *model_data,
|
|||
/* Scale by user-specified integer factor.
|
||||
* Range: 0 <= coeff_mul < 2^43
|
||||
*/
|
||||
coeff_mul = coeff * model_data->scaling_factor;
|
||||
coeff_mul = coeff * (u64)model_data->scaling_factor;
|
||||
|
||||
/* The power models have results with units
|
||||
* mW/(MHz V^2), i.e. nW/(Hz V^2). With precision of 1/1000000, this
|
||||
|
|
|
|||
|
|
@ -211,7 +211,7 @@ int kbase_ipa_vinstr_dynamic_coeff(struct kbase_ipa_model *model, u32 *coeffp)
|
|||
|
||||
/* Range: 0 <= coeff < 2^57 */
|
||||
if (energy > 0)
|
||||
coeff = energy;
|
||||
coeff = (u64)energy;
|
||||
|
||||
/* Range: 0 <= coeff < 2^57 (because active_cycles >= 1). However, this
|
||||
* can be constrained further: Counter values can only be increased by
|
||||
|
|
@ -244,7 +244,7 @@ int kbase_ipa_vinstr_dynamic_coeff(struct kbase_ipa_model *model, u32 *coeffp)
|
|||
/* Scale by user-specified integer factor.
|
||||
* Range: 0 <= coeff_mul < 2^57
|
||||
*/
|
||||
coeff_mul = coeff * model_data->scaling_factor;
|
||||
coeff_mul = coeff * (u64)model_data->scaling_factor;
|
||||
|
||||
/* The power models have results with units
|
||||
* mW/(MHz V^2), i.e. nW/(Hz V^2). With precision of 1/1000000, this
|
||||
|
|
|
|||
|
|
@ -174,7 +174,7 @@ int kbase_ipa_model_add_param_string(struct kbase_ipa_model *model, const char *
|
|||
of_node_put(model_dt_node);
|
||||
|
||||
if (err && dt_required) {
|
||||
strncpy(addr, "", size - 1);
|
||||
strscpy(addr, "", size);
|
||||
dev_warn(model->kbdev->dev, "Error %d, no DT entry: %s.%s = \'%s\'\n", err,
|
||||
model->ops->name, name, addr);
|
||||
err = 0;
|
||||
|
|
@ -182,7 +182,7 @@ int kbase_ipa_model_add_param_string(struct kbase_ipa_model *model, const char *
|
|||
} else if (err && !dt_required) {
|
||||
origin = "default";
|
||||
} else /* !err */ {
|
||||
strncpy(addr, string_prop_value, size - 1);
|
||||
strscpy(addr, string_prop_value, size);
|
||||
origin = "DT";
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@ static ssize_t param_string_set(struct file *file, const char __user *user_buf,
|
|||
struct kbase_ipa_model_param *param = file->private_data;
|
||||
struct kbase_ipa_model *model = param->model;
|
||||
char *old_str = NULL;
|
||||
ssize_t ret = count;
|
||||
ssize_t ret = (ssize_t)count;
|
||||
size_t buf_size;
|
||||
int err;
|
||||
|
||||
|
|
|
|||
|
|
@ -294,6 +294,9 @@ static int kbase_simple_power_model_recalculate(struct kbase_ipa_model *model)
|
|||
|
||||
if (!strnlen(model_data->tz_name, sizeof(model_data->tz_name))) {
|
||||
model_data->gpu_tz = NULL;
|
||||
dev_warn(model->kbdev->dev,
|
||||
"No thermal zone specified, will use the default temperature value of %u",
|
||||
FALLBACK_STATIC_TEMPERATURE);
|
||||
} else {
|
||||
char tz_name[THERMAL_NAME_LENGTH];
|
||||
u32 string_len = strscpy(tz_name, model_data->tz_name, sizeof(tz_name));
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@
|
|||
|
||||
#include "mali_kbase_js_defs.h"
|
||||
|
||||
#include <linux/version_compat_defs.h>
|
||||
|
||||
/* Dump Job slot trace on error (only active if KBASE_KTRACE_ENABLE != 0) */
|
||||
#define KBASE_KTRACE_DUMP_ON_JOB_SLOT_ERROR 1
|
||||
|
||||
|
|
@ -70,29 +72,29 @@
|
|||
#define KBASE_DISABLE_SCHEDULING_HARD_STOPS 0
|
||||
|
||||
/* Atom has been previously soft-stopped */
|
||||
#define KBASE_KATOM_FLAG_BEEN_SOFT_STOPPED (1 << 1)
|
||||
#define KBASE_KATOM_FLAG_BEEN_SOFT_STOPPED (1U << 1)
|
||||
/* Atom has been previously retried to execute */
|
||||
#define KBASE_KATOM_FLAGS_RERUN (1 << 2)
|
||||
#define KBASE_KATOM_FLAGS_RERUN (1U << 2)
|
||||
/* Atom submitted with JOB_CHAIN_FLAG bit set in JS_CONFIG_NEXT register, helps
|
||||
* to disambiguate short-running job chains during soft/hard stopping of jobs
|
||||
*/
|
||||
#define KBASE_KATOM_FLAGS_JOBCHAIN (1 << 3)
|
||||
#define KBASE_KATOM_FLAGS_JOBCHAIN (1U << 3)
|
||||
/* Atom has been previously hard-stopped. */
|
||||
#define KBASE_KATOM_FLAG_BEEN_HARD_STOPPED (1 << 4)
|
||||
#define KBASE_KATOM_FLAG_BEEN_HARD_STOPPED (1U << 4)
|
||||
/* Atom has caused us to enter disjoint state */
|
||||
#define KBASE_KATOM_FLAG_IN_DISJOINT (1 << 5)
|
||||
#define KBASE_KATOM_FLAG_IN_DISJOINT (1U << 5)
|
||||
/* Atom blocked on cross-slot dependency */
|
||||
#define KBASE_KATOM_FLAG_X_DEP_BLOCKED (1 << 7)
|
||||
#define KBASE_KATOM_FLAG_X_DEP_BLOCKED (1U << 7)
|
||||
/* Atom has fail dependency on cross-slot dependency */
|
||||
#define KBASE_KATOM_FLAG_FAIL_BLOCKER (1 << 8)
|
||||
#define KBASE_KATOM_FLAG_FAIL_BLOCKER (1U << 8)
|
||||
/* Atom is currently in the list of atoms blocked on cross-slot dependencies */
|
||||
#define KBASE_KATOM_FLAG_JSCTX_IN_X_DEP_LIST (1 << 9)
|
||||
#define KBASE_KATOM_FLAG_JSCTX_IN_X_DEP_LIST (1U << 9)
|
||||
/* Atom requires GPU to be in protected mode */
|
||||
#define KBASE_KATOM_FLAG_PROTECTED (1 << 11)
|
||||
#define KBASE_KATOM_FLAG_PROTECTED (1U << 11)
|
||||
/* Atom has been stored in runnable_tree */
|
||||
#define KBASE_KATOM_FLAG_JSCTX_IN_TREE (1 << 12)
|
||||
#define KBASE_KATOM_FLAG_JSCTX_IN_TREE (1U << 12)
|
||||
/* Atom is waiting for L2 caches to power up in order to enter protected mode */
|
||||
#define KBASE_KATOM_FLAG_HOLDING_L2_REF_PROT (1 << 13)
|
||||
#define KBASE_KATOM_FLAG_HOLDING_L2_REF_PROT (1U << 13)
|
||||
|
||||
/* SW related flags about types of JS_COMMAND action
|
||||
* NOTE: These must be masked off by JS_COMMAND_MASK
|
||||
|
|
@ -131,6 +133,9 @@
|
|||
* @JM_DEFAULT_JS_FREE_TIMEOUT: Maximum timeout to wait for JS_COMMAND_NEXT
|
||||
* to be updated on HW side so a Job Slot is
|
||||
* considered free.
|
||||
* @KBASE_PRFCNT_ACTIVE_TIMEOUT: Waiting time for prfcnt to be ready.
|
||||
* @KBASE_CLEAN_CACHE_TIMEOUT: Waiting time for cache flush to complete.
|
||||
* @KBASE_AS_INACTIVE_TIMEOUT: Waiting time for MCU address space to become inactive.
|
||||
* @KBASE_TIMEOUT_SELECTOR_COUNT: Number of timeout selectors.
|
||||
* @KBASE_DEFAULT_TIMEOUT: Fallthrough in case an invalid timeout is
|
||||
* passed.
|
||||
|
|
@ -138,7 +143,9 @@
|
|||
enum kbase_timeout_selector {
|
||||
MMU_AS_INACTIVE_WAIT_TIMEOUT,
|
||||
JM_DEFAULT_JS_FREE_TIMEOUT,
|
||||
|
||||
KBASE_PRFCNT_ACTIVE_TIMEOUT,
|
||||
KBASE_CLEAN_CACHE_TIMEOUT,
|
||||
KBASE_AS_INACTIVE_TIMEOUT,
|
||||
/* Must be the last in the enum */
|
||||
KBASE_TIMEOUT_SELECTOR_COUNT,
|
||||
KBASE_DEFAULT_TIMEOUT = JM_DEFAULT_JS_FREE_TIMEOUT
|
||||
|
|
@ -526,13 +533,7 @@ struct kbase_jd_atom {
|
|||
/* Use the functions/API defined in mali_kbase_fence.h to
|
||||
* when working with this sub struct
|
||||
*/
|
||||
#if IS_ENABLED(CONFIG_SYNC_FILE)
|
||||
#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
|
||||
struct fence *fence_in;
|
||||
#else
|
||||
struct dma_fence *fence_in;
|
||||
#endif
|
||||
#endif
|
||||
/* This points to the dma-buf output fence for this atom. If
|
||||
* this is NULL then there is no fence for this atom and the
|
||||
* following fields related to dma_fence may have invalid data.
|
||||
|
|
@ -544,20 +545,12 @@ struct kbase_jd_atom {
|
|||
* regardless of the event_code of the katom (signal also on
|
||||
* failure).
|
||||
*/
|
||||
#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
|
||||
struct fence *fence;
|
||||
#else
|
||||
struct dma_fence *fence;
|
||||
#endif
|
||||
|
||||
/* This is the callback object that is registered for the fence_in.
|
||||
* The callback is invoked when the fence_in is signaled.
|
||||
*/
|
||||
#if (KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE)
|
||||
struct fence_cb fence_cb;
|
||||
#else
|
||||
struct dma_fence_cb fence_cb;
|
||||
#endif
|
||||
bool fence_cb_added;
|
||||
|
||||
unsigned int context;
|
||||
|
|
@ -857,7 +850,7 @@ struct jsctx_queue {
|
|||
* @current_setup: Stores the MMU configuration for this address space.
|
||||
*/
|
||||
struct kbase_as {
|
||||
int number;
|
||||
unsigned int number;
|
||||
struct workqueue_struct *pf_wq;
|
||||
struct work_struct work_pagefault;
|
||||
struct work_struct work_busfault;
|
||||
|
|
|
|||
|
|
@ -906,7 +906,7 @@ static inline void kbase_js_runpool_dec_context_count(struct kbase_device *kbdev
|
|||
*/
|
||||
static inline void kbase_js_sched_all(struct kbase_device *kbdev)
|
||||
{
|
||||
kbase_js_sched(kbdev, (1 << kbdev->gpu_props.num_job_slots) - 1);
|
||||
kbase_js_sched(kbdev, (1U << kbdev->gpu_props.num_job_slots) - 1U);
|
||||
}
|
||||
|
||||
extern const int kbasep_js_atom_priority_to_relative[BASE_JD_NR_PRIO_LEVELS];
|
||||
|
|
|
|||
|
|
@ -66,9 +66,12 @@ enum base_hw_issue {
|
|||
BASE_HW_ISSUE_GPU2021PRO_290,
|
||||
BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_TITANHW_2679,
|
||||
BASE_HW_ISSUE_TITANHW_2922,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_TITANHW_2922,
|
||||
BASE_HW_ISSUE_TITANHW_2952,
|
||||
BASE_HW_ISSUE_KRAKEHW_2151,
|
||||
BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_KRAKEHW_2269,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
|
|
@ -82,7 +85,7 @@ __attribute__((unused)) static const enum base_hw_issue base_hw_issues_tMIx_r0p0
|
|||
BASE_HW_ISSUE_TMIX_8343, BASE_HW_ISSUE_TMIX_8463, BASE_HW_ISSUE_TMIX_8456,
|
||||
BASE_HW_ISSUE_TMIX_8438, BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_GPU2017_1336, BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tMIx_r0p0[] = {
|
||||
|
|
@ -92,7 +95,7 @@ __attribute__((unused)) static const enum base_hw_issue base_hw_issues_tMIx_r0p0
|
|||
BASE_HW_ISSUE_TMIX_8343, BASE_HW_ISSUE_TMIX_8463, BASE_HW_ISSUE_TMIX_8456,
|
||||
BASE_HW_ISSUE_TMIX_8438, BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_GPU2017_1336, BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tMIx_r0p1[] = {
|
||||
|
|
@ -102,129 +105,139 @@ __attribute__((unused)) static const enum base_hw_issue base_hw_issues_tMIx_r0p1
|
|||
BASE_HW_ISSUE_TMIX_8343, BASE_HW_ISSUE_TMIX_8463, BASE_HW_ISSUE_TMIX_8456,
|
||||
BASE_HW_ISSUE_TMIX_8438, BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_GPU2017_1336, BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_model_tMIx[] = {
|
||||
BASE_HW_ISSUE_5736, BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TMIX_7891,
|
||||
BASE_HW_ISSUE_TMIX_7940, BASE_HW_ISSUE_TMIX_8042, BASE_HW_ISSUE_TMIX_8133,
|
||||
BASE_HW_ISSUE_TMIX_8138, BASE_HW_ISSUE_TMIX_8206, BASE_HW_ISSUE_TMIX_8343,
|
||||
BASE_HW_ISSUE_TMIX_8456, BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_5736, BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TMIX_7891,
|
||||
BASE_HW_ISSUE_TMIX_7940, BASE_HW_ISSUE_TMIX_8042, BASE_HW_ISSUE_TMIX_8133,
|
||||
BASE_HW_ISSUE_TMIX_8138, BASE_HW_ISSUE_TMIX_8206, BASE_HW_ISSUE_TMIX_8343,
|
||||
BASE_HW_ISSUE_TMIX_8456, BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tHEx_r0p0[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_10682, BASE_HW_ISSUE_11054,
|
||||
BASE_HW_ISSUE_TMIX_7891, BASE_HW_ISSUE_TMIX_8042, BASE_HW_ISSUE_TMIX_8133,
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_921, BASE_HW_ISSUE_GPU2017_1336,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tHEx_r0p1[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_10682, BASE_HW_ISSUE_11054,
|
||||
BASE_HW_ISSUE_TMIX_7891, BASE_HW_ISSUE_TMIX_8042, BASE_HW_ISSUE_TMIX_8133,
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_921, BASE_HW_ISSUE_GPU2017_1336,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tHEx_r0p2[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_10682, BASE_HW_ISSUE_11054,
|
||||
BASE_HW_ISSUE_TMIX_7891, BASE_HW_ISSUE_TMIX_8042, BASE_HW_ISSUE_TMIX_8133,
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_921, BASE_HW_ISSUE_GPU2017_1336,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tHEx_r0p3[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_10682, BASE_HW_ISSUE_TMIX_7891,
|
||||
BASE_HW_ISSUE_TMIX_8042, BASE_HW_ISSUE_TMIX_8133, BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_921, BASE_HW_ISSUE_GPU2017_1336, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_model_tHEx[] = {
|
||||
BASE_HW_ISSUE_5736, BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TMIX_7891,
|
||||
BASE_HW_ISSUE_TMIX_8042, BASE_HW_ISSUE_TMIX_8133, BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tSIx_r0p0[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_11054, BASE_HW_ISSUE_TMIX_8133,
|
||||
BASE_HW_ISSUE_TSIX_1116, BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TSIX_1792,
|
||||
BASE_HW_ISSUE_TTRX_921, BASE_HW_ISSUE_GPU2017_1336, BASE_HW_ISSUE_TTRX_3464,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tSIx_r0p1[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_11054, BASE_HW_ISSUE_TMIX_8133,
|
||||
BASE_HW_ISSUE_TSIX_1116, BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TSIX_1792,
|
||||
BASE_HW_ISSUE_TTRX_921, BASE_HW_ISSUE_GPU2017_1336, BASE_HW_ISSUE_TTRX_3464,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tSIx_r1p0[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_11054, BASE_HW_ISSUE_TMIX_8133,
|
||||
BASE_HW_ISSUE_TSIX_1116, BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_GPU2017_1336, BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_11054, BASE_HW_ISSUE_TMIX_8133,
|
||||
BASE_HW_ISSUE_TSIX_1116, BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_GPU2017_1336, BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tSIx_r1p1[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TMIX_8133, BASE_HW_ISSUE_TSIX_1116,
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_921, BASE_HW_ISSUE_GPU2017_1336,
|
||||
BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TMIX_8133, BASE_HW_ISSUE_TSIX_1116,
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_921, BASE_HW_ISSUE_GPU2017_1336,
|
||||
BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_model_tSIx[] = {
|
||||
BASE_HW_ISSUE_5736, BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TMIX_8133,
|
||||
BASE_HW_ISSUE_TSIX_1116, BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_3464,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tDVx_r0p0[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TMIX_8133, BASE_HW_ISSUE_TSIX_1116,
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_921, BASE_HW_ISSUE_GPU2017_1336,
|
||||
BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TMIX_8133, BASE_HW_ISSUE_TSIX_1116,
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_921, BASE_HW_ISSUE_GPU2017_1336,
|
||||
BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_model_tDVx[] = {
|
||||
BASE_HW_ISSUE_5736, BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TMIX_8133,
|
||||
BASE_HW_ISSUE_TSIX_1116, BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_3464,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tNOx_r0p0[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TMIX_8133, BASE_HW_ISSUE_TSIX_1116,
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TNOX_1194, BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_GPU2017_1336, BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TMIX_8133, BASE_HW_ISSUE_TSIX_1116,
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TNOX_1194, BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_GPU2017_1336, BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_model_tNOx[] = {
|
||||
BASE_HW_ISSUE_5736, BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TMIX_8133,
|
||||
BASE_HW_ISSUE_TSIX_1116, BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_3464,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tGOx_r0p0[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TMIX_8133, BASE_HW_ISSUE_TSIX_1116,
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TNOX_1194, BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_GPU2017_1336, BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TMIX_8133, BASE_HW_ISSUE_TSIX_1116,
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TNOX_1194, BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_GPU2017_1336, BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tGOx_r1p0[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TMIX_8133, BASE_HW_ISSUE_TSIX_1116,
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TGOX_R1_1234, BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_GPU2017_1336, BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_model_tGOx[] = {
|
||||
BASE_HW_ISSUE_5736, BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TMIX_8133,
|
||||
BASE_HW_ISSUE_TSIX_1116, BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_3464,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tTRx_r0p0[] = {
|
||||
|
|
@ -235,7 +248,7 @@ __attribute__((unused)) static const enum base_hw_issue base_hw_issues_tTRx_r0p0
|
|||
BASE_HW_ISSUE_TTRX_3083, BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TTRX_3485,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tTRx_r0p1[] = {
|
||||
|
|
@ -246,24 +259,32 @@ __attribute__((unused)) static const enum base_hw_issue base_hw_issues_tTRx_r0p1
|
|||
BASE_HW_ISSUE_TTRX_3083, BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TTRX_3485,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tTRx_r0p2[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TTRX_2968_TTRX_3162,
|
||||
BASE_HW_ISSUE_TTRX_3076, BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_TTRX_3414, BASE_HW_ISSUE_GPU2017_1336,
|
||||
BASE_HW_ISSUE_TTRX_3083, BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_9435,
|
||||
BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337,
|
||||
BASE_HW_ISSUE_TTRX_2968_TTRX_3162,
|
||||
BASE_HW_ISSUE_TTRX_3076,
|
||||
BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_TTRX_3414,
|
||||
BASE_HW_ISSUE_GPU2017_1336,
|
||||
BASE_HW_ISSUE_TTRX_3083,
|
||||
BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464,
|
||||
BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_model_tTRx[] = {
|
||||
BASE_HW_ISSUE_5736, BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TTRX_3414, BASE_HW_ISSUE_TTRX_3083,
|
||||
BASE_HW_ISSUE_TTRX_3470, BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_5736, BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TTRX_3414, BASE_HW_ISSUE_TTRX_3083,
|
||||
BASE_HW_ISSUE_TTRX_3470, BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tNAx_r0p0[] = {
|
||||
|
|
@ -274,24 +295,32 @@ __attribute__((unused)) static const enum base_hw_issue base_hw_issues_tNAx_r0p0
|
|||
BASE_HW_ISSUE_TTRX_3083, BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TTRX_3485,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tNAx_r0p1[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TTRX_2968_TTRX_3162,
|
||||
BASE_HW_ISSUE_TTRX_3076, BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_TTRX_3414, BASE_HW_ISSUE_GPU2017_1336,
|
||||
BASE_HW_ISSUE_TTRX_3083, BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_9435,
|
||||
BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337,
|
||||
BASE_HW_ISSUE_TTRX_2968_TTRX_3162,
|
||||
BASE_HW_ISSUE_TTRX_3076,
|
||||
BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_TTRX_3414,
|
||||
BASE_HW_ISSUE_GPU2017_1336,
|
||||
BASE_HW_ISSUE_TTRX_3083,
|
||||
BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464,
|
||||
BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_model_tNAx[] = {
|
||||
BASE_HW_ISSUE_5736, BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TTRX_3414, BASE_HW_ISSUE_TTRX_3083,
|
||||
BASE_HW_ISSUE_TTRX_3470, BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_5736, BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TTRX_3414, BASE_HW_ISSUE_TTRX_3083,
|
||||
BASE_HW_ISSUE_TTRX_3470, BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tBEx_r0p0[] = {
|
||||
|
|
@ -301,41 +330,62 @@ __attribute__((unused)) static const enum base_hw_issue base_hw_issues_tBEx_r0p0
|
|||
BASE_HW_ISSUE_TTRX_3083, BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TTRX_3485,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tBEx_r0p1[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TTRX_2968_TTRX_3162,
|
||||
BASE_HW_ISSUE_TTRX_921, BASE_HW_ISSUE_TTRX_3414,
|
||||
BASE_HW_ISSUE_TTRX_3083, BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_9435,
|
||||
BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337,
|
||||
BASE_HW_ISSUE_TTRX_2968_TTRX_3162,
|
||||
BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_TTRX_3414,
|
||||
BASE_HW_ISSUE_TTRX_3083,
|
||||
BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464,
|
||||
BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tBEx_r1p0[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TTRX_2968_TTRX_3162,
|
||||
BASE_HW_ISSUE_TTRX_921, BASE_HW_ISSUE_TTRX_3414,
|
||||
BASE_HW_ISSUE_TTRX_3083, BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_9435,
|
||||
BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337,
|
||||
BASE_HW_ISSUE_TTRX_2968_TTRX_3162,
|
||||
BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_TTRX_3414,
|
||||
BASE_HW_ISSUE_TTRX_3083,
|
||||
BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464,
|
||||
BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tBEx_r1p1[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TTRX_2968_TTRX_3162,
|
||||
BASE_HW_ISSUE_TTRX_921, BASE_HW_ISSUE_TTRX_3414,
|
||||
BASE_HW_ISSUE_TTRX_3083, BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_9435,
|
||||
BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337,
|
||||
BASE_HW_ISSUE_TTRX_2968_TTRX_3162,
|
||||
BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_TTRX_3414,
|
||||
BASE_HW_ISSUE_TTRX_3083,
|
||||
BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464,
|
||||
BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_model_tBEx[] = {
|
||||
BASE_HW_ISSUE_5736, BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TTRX_3414, BASE_HW_ISSUE_TTRX_3083,
|
||||
BASE_HW_ISSUE_TTRX_3470, BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_5736, BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TTRX_3414, BASE_HW_ISSUE_TTRX_3083,
|
||||
BASE_HW_ISSUE_TTRX_3470, BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_lBEx_r1p0[] = {
|
||||
|
|
@ -345,152 +395,223 @@ __attribute__((unused)) static const enum base_hw_issue base_hw_issues_lBEx_r1p0
|
|||
BASE_HW_ISSUE_TTRX_3083, BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TTRX_3485,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_lBEx_r1p1[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TTRX_2968_TTRX_3162,
|
||||
BASE_HW_ISSUE_TTRX_921, BASE_HW_ISSUE_TTRX_3414,
|
||||
BASE_HW_ISSUE_TTRX_3083, BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_9435,
|
||||
BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337,
|
||||
BASE_HW_ISSUE_TTRX_2968_TTRX_3162,
|
||||
BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_TTRX_3414,
|
||||
BASE_HW_ISSUE_TTRX_3083,
|
||||
BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464,
|
||||
BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tBAx_r0p0[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TTRX_2968_TTRX_3162,
|
||||
BASE_HW_ISSUE_TTRX_921, BASE_HW_ISSUE_TTRX_3414,
|
||||
BASE_HW_ISSUE_TTRX_3083, BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_9435,
|
||||
BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337,
|
||||
BASE_HW_ISSUE_TTRX_2968_TTRX_3162,
|
||||
BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_TTRX_3414,
|
||||
BASE_HW_ISSUE_TTRX_3083,
|
||||
BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464,
|
||||
BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tBAx_r0p1[] = {
|
||||
BASE_HW_ISSUE_9435,
|
||||
BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337,
|
||||
BASE_HW_ISSUE_TTRX_2968_TTRX_3162,
|
||||
BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_TTRX_3414,
|
||||
BASE_HW_ISSUE_TTRX_3083,
|
||||
BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464,
|
||||
BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tBAx_r0p2[] = {
|
||||
BASE_HW_ISSUE_9435,
|
||||
BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337,
|
||||
BASE_HW_ISSUE_TTRX_2968_TTRX_3162,
|
||||
BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_TTRX_3414,
|
||||
BASE_HW_ISSUE_TTRX_3083,
|
||||
BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464,
|
||||
BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tBAx_r1p0[] = {
|
||||
BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TTRX_2968_TTRX_3162,
|
||||
BASE_HW_ISSUE_TTRX_921, BASE_HW_ISSUE_TTRX_3414,
|
||||
BASE_HW_ISSUE_TTRX_3083, BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_9435,
|
||||
BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337,
|
||||
BASE_HW_ISSUE_TTRX_2968_TTRX_3162,
|
||||
BASE_HW_ISSUE_TTRX_921,
|
||||
BASE_HW_ISSUE_TTRX_3414,
|
||||
BASE_HW_ISSUE_TTRX_3083,
|
||||
BASE_HW_ISSUE_TTRX_3470,
|
||||
BASE_HW_ISSUE_TTRX_3464,
|
||||
BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_model_tBAx[] = {
|
||||
BASE_HW_ISSUE_5736, BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TTRX_3414, BASE_HW_ISSUE_TTRX_3083,
|
||||
BASE_HW_ISSUE_TTRX_3470, BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_5736, BASE_HW_ISSUE_9435, BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TTRX_3414, BASE_HW_ISSUE_TTRX_3083,
|
||||
BASE_HW_ISSUE_TTRX_3470, BASE_HW_ISSUE_TTRX_3464, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tODx_r0p0[] = {
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_GPU2019_3212,
|
||||
BASE_HW_ISSUE_GPU2019_3878, BASE_HW_ISSUE_GPU2019_3901, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_model_tODx[] = {
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_GPU2019_3212,
|
||||
BASE_HW_ISSUE_GPU2019_3878, BASE_HW_ISSUE_GPU2019_3901, BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tGRx_r0p0[] = {
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_GPU2019_3878,
|
||||
BASE_HW_ISSUE_GPU2019_3901, BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_model_tGRx[] = {
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_GPU2019_3878,
|
||||
BASE_HW_ISSUE_GPU2019_3901, BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tVAx_r0p0[] = {
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_GPU2019_3878,
|
||||
BASE_HW_ISSUE_GPU2019_3901, BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_model_tVAx[] = {
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_GPU2019_3878,
|
||||
BASE_HW_ISSUE_GPU2019_3901, BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tTUx_r0p0[] = {
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TURSEHW_1997,
|
||||
BASE_HW_ISSUE_GPU2019_3878, BASE_HW_ISSUE_TURSEHW_2716, BASE_HW_ISSUE_GPU2019_3901,
|
||||
BASE_HW_ISSUE_GPU2021PRO_290, BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_TITANHW_2679,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tTUx_r0p1[] = {
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TURSEHW_1997,
|
||||
BASE_HW_ISSUE_GPU2019_3878, BASE_HW_ISSUE_TURSEHW_2716, BASE_HW_ISSUE_GPU2019_3901,
|
||||
BASE_HW_ISSUE_GPU2021PRO_290, BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_TITANHW_2679,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2922, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TSIX_2033,
|
||||
BASE_HW_ISSUE_TTRX_1337,
|
||||
BASE_HW_ISSUE_TURSEHW_1997,
|
||||
BASE_HW_ISSUE_GPU2019_3878,
|
||||
BASE_HW_ISSUE_TURSEHW_2716,
|
||||
BASE_HW_ISSUE_GPU2019_3901,
|
||||
BASE_HW_ISSUE_GPU2021PRO_290,
|
||||
BASE_HW_ISSUE_TITANHW_2710,
|
||||
BASE_HW_ISSUE_TITANHW_2679,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_TITANHW_2922,
|
||||
BASE_HW_ISSUE_TITANHW_2938,
|
||||
BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_model_tTUx[] = {
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_GPU2019_3878,
|
||||
BASE_HW_ISSUE_TURSEHW_2716, BASE_HW_ISSUE_GPU2019_3901, BASE_HW_ISSUE_GPU2021PRO_290,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_TITANHW_2679, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_TITANHW_2922, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2922, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tTUx_r1p0[] = {
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_GPU2019_3878,
|
||||
BASE_HW_ISSUE_TURSEHW_2716, BASE_HW_ISSUE_GPU2019_3901, BASE_HW_ISSUE_GPU2021PRO_290,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_TITANHW_2679, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_TITANHW_2922, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2922, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tTUx_r1p1[] = {
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_GPU2019_3878,
|
||||
BASE_HW_ISSUE_TURSEHW_2716, BASE_HW_ISSUE_GPU2019_3901, BASE_HW_ISSUE_GPU2021PRO_290,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_TITANHW_2679, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_TITANHW_2922, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2922, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tTUx_r1p2[] = {
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_GPU2019_3878,
|
||||
BASE_HW_ISSUE_TURSEHW_2716, BASE_HW_ISSUE_GPU2019_3901, BASE_HW_ISSUE_GPU2021PRO_290,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_TITANHW_2679, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_TITANHW_2922, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2922, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tTUx_r1p3[] = {
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_GPU2019_3878,
|
||||
BASE_HW_ISSUE_TURSEHW_2716, BASE_HW_ISSUE_GPU2019_3901, BASE_HW_ISSUE_GPU2021PRO_290,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_TITANHW_2679, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_TITANHW_2922, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TITANHW_2922, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_model_tTIx[] = {
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_1337,
|
||||
BASE_HW_ISSUE_TURSEHW_2716, BASE_HW_ISSUE_GPU2021PRO_290,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_TITANHW_2679,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2922,
|
||||
BASE_HW_ISSUE_TITANHW_2952, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TURSEHW_2716,
|
||||
BASE_HW_ISSUE_GPU2021PRO_290, BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_TITANHW_2679,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2922, BASE_HW_ISSUE_TITANHW_2952,
|
||||
BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tTIx_r0p0[] = {
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_1337,
|
||||
BASE_HW_ISSUE_TURSEHW_2716, BASE_HW_ISSUE_GPU2021PRO_290,
|
||||
BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_TITANHW_2679,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2922,
|
||||
BASE_HW_ISSUE_TITANHW_2952, BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TURSEHW_2716,
|
||||
BASE_HW_ISSUE_GPU2021PRO_290, BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_TITANHW_2679,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2922, BASE_HW_ISSUE_TITANHW_2952,
|
||||
BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tTIx_r0p1[] = {
|
||||
BASE_HW_ISSUE_TSIX_2033, BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TURSEHW_2716,
|
||||
BASE_HW_ISSUE_GPU2021PRO_290, BASE_HW_ISSUE_TITANHW_2710, BASE_HW_ISSUE_TITANHW_2679,
|
||||
BASE_HW_ISSUE_GPU2022PRO_148, BASE_HW_ISSUE_TITANHW_2938, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tKRx_r0p0[] = {
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TURSEHW_2716, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_KRAKEHW_2151, BASE_HW_ISSUE_KRAKEHW_2269, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_tKRx_r0p1[] = {
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TURSEHW_2716, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_KRAKEHW_2269, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
__attribute__((unused)) static const enum base_hw_issue base_hw_issues_model_tKRx[] = {
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TURSEHW_2716, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_END
|
||||
BASE_HW_ISSUE_TTRX_1337, BASE_HW_ISSUE_TURSEHW_2716, BASE_HW_ISSUE_GPU2022PRO_148,
|
||||
BASE_HW_ISSUE_KRAKEHW_2151, BASE_HW_ISSUE_KRAKEHW_2269, BASE_HW_ISSUE_END
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -26,25 +26,6 @@
|
|||
|
||||
#include <mali_kbase_debug.h>
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/hrtimer.h>
|
||||
#include <linux/ktime.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/rwsem.h>
|
||||
#include <linux/sched.h>
|
||||
#if (KERNEL_VERSION(4, 11, 0) <= LINUX_VERSION_CODE)
|
||||
#include <linux/sched/mm.h>
|
||||
#endif
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#include <uapi/gpu/arm/midgard/mali_base_kernel.h>
|
||||
#include <mali_kbase_linux.h>
|
||||
#include <linux/version_compat_defs.h>
|
||||
|
|
@ -75,18 +56,39 @@
|
|||
|
||||
#include "ipa/mali_kbase_ipa.h"
|
||||
|
||||
#if MALI_USE_CSF
|
||||
#include "csf/mali_kbase_csf.h"
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_GPU_TRACEPOINTS)
|
||||
#include <trace/events/gpu.h>
|
||||
#endif
|
||||
|
||||
#include "mali_linux_trace.h"
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/hrtimer.h>
|
||||
#include <linux/ktime.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/rwsem.h>
|
||||
#include <linux/sched.h>
|
||||
#if (KERNEL_VERSION(4, 11, 0) <= LINUX_VERSION_CODE)
|
||||
#include <linux/sched/mm.h>
|
||||
#endif
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#define KBASE_DRV_NAME "mali"
|
||||
#define KBASE_TIMELINE_NAME KBASE_DRV_NAME ".timeline"
|
||||
|
||||
#if MALI_USE_CSF
|
||||
#include "csf/mali_kbase_csf.h"
|
||||
|
||||
/* Physical memory group ID for CSF user I/O.
|
||||
*/
|
||||
#define KBASE_MEM_GROUP_CSF_IO BASE_MEM_GROUP_DEFAULT
|
||||
|
|
@ -169,7 +171,16 @@ unsigned long kbase_context_get_unmapped_area(struct kbase_context *kctx, const
|
|||
const unsigned long len, const unsigned long pgoff,
|
||||
const unsigned long flags);
|
||||
|
||||
int assign_irqs(struct kbase_device *kbdev);
|
||||
/**
|
||||
* kbase_get_irqs() - Get GPU interrupts from the device tree.
|
||||
*
|
||||
* @kbdev: The kbase device structure of the device
|
||||
*
|
||||
* This function must be called once only when a kbase device is initialized.
|
||||
*
|
||||
* Return: 0 on success. Error code (negative) on failure.
|
||||
*/
|
||||
int kbase_get_irqs(struct kbase_device *kbdev);
|
||||
|
||||
int kbase_sysfs_init(struct kbase_device *kbdev);
|
||||
void kbase_sysfs_term(struct kbase_device *kbdev);
|
||||
|
|
@ -271,7 +282,7 @@ int kbase_jd_submit(struct kbase_context *kctx, void __user *user_addr, u32 nr_a
|
|||
*/
|
||||
void kbase_jd_done_worker(struct work_struct *data);
|
||||
|
||||
void kbase_jd_done(struct kbase_jd_atom *katom, int slot_nr, ktime_t *end_timestamp,
|
||||
void kbase_jd_done(struct kbase_jd_atom *katom, unsigned int slot_nr, ktime_t *end_timestamp,
|
||||
kbasep_js_atom_done_code done_code);
|
||||
void kbase_jd_cancel(struct kbase_device *kbdev, struct kbase_jd_atom *katom);
|
||||
void kbase_jd_zap_context(struct kbase_context *kctx);
|
||||
|
|
@ -352,7 +363,7 @@ int kbase_job_slot_softstop_start_rp(struct kbase_context *kctx, struct kbase_va
|
|||
*
|
||||
* Where possible any job in the next register is evicted before the soft-stop.
|
||||
*/
|
||||
void kbase_job_slot_softstop(struct kbase_device *kbdev, int js,
|
||||
void kbase_job_slot_softstop(struct kbase_device *kbdev, unsigned int js,
|
||||
struct kbase_jd_atom *target_katom);
|
||||
|
||||
void kbase_job_slot_softstop_swflags(struct kbase_device *kbdev, unsigned int js,
|
||||
|
|
@ -534,7 +545,7 @@ static inline void kbase_pm_set_gpu_lost(struct kbase_device *kbdev, bool gpu_lo
|
|||
const int cur_val = atomic_xchg(&kbdev->pm.gpu_lost, new_val);
|
||||
|
||||
if (new_val != cur_val)
|
||||
KBASE_KTRACE_ADD(kbdev, ARB_GPU_LOST, NULL, new_val);
|
||||
KBASE_KTRACE_ADD(kbdev, ARB_GPU_LOST, NULL, (u64)new_val);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -636,16 +647,17 @@ int kbase_pm_force_mcu_wakeup_after_sleep(struct kbase_device *kbdev);
|
|||
*
|
||||
* Return: the atom's ID.
|
||||
*/
|
||||
static inline int kbase_jd_atom_id(struct kbase_context *kctx, const struct kbase_jd_atom *katom)
|
||||
static inline unsigned int kbase_jd_atom_id(struct kbase_context *kctx,
|
||||
const struct kbase_jd_atom *katom)
|
||||
{
|
||||
int result;
|
||||
unsigned int result;
|
||||
|
||||
KBASE_DEBUG_ASSERT(kctx);
|
||||
KBASE_DEBUG_ASSERT(katom);
|
||||
KBASE_DEBUG_ASSERT(katom->kctx == kctx);
|
||||
|
||||
result = katom - &kctx->jctx.atoms[0];
|
||||
KBASE_DEBUG_ASSERT(result >= 0 && result <= BASE_JD_ATOM_COUNT);
|
||||
KBASE_DEBUG_ASSERT(result <= BASE_JD_ATOM_COUNT);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
@ -767,6 +779,22 @@ int kbase_device_pcm_dev_init(struct kbase_device *const kbdev);
|
|||
*/
|
||||
void kbase_device_pcm_dev_term(struct kbase_device *const kbdev);
|
||||
|
||||
#if MALI_USE_CSF
|
||||
|
||||
/**
|
||||
* kbasep_adjust_prioritized_process() - Adds or removes the specified PID from
|
||||
* the list of prioritized processes.
|
||||
*
|
||||
* @kbdev: Pointer to the structure for the kbase device
|
||||
* @add: True if the process should be prioritized, false otherwise
|
||||
* @tgid: The process/thread group ID
|
||||
*
|
||||
* Return: true if the operation was successful, false otherwise
|
||||
*/
|
||||
bool kbasep_adjust_prioritized_process(struct kbase_device *kbdev, bool add, uint32_t tgid);
|
||||
|
||||
#endif /* MALI_USE_CSF */
|
||||
|
||||
/**
|
||||
* KBASE_DISJOINT_STATE_INTERLEAVED_CONTEXT_COUNT_THRESHOLD - If a job is soft stopped
|
||||
* and the number of contexts is >= this value it is reported as a disjoint event
|
||||
|
|
@ -786,9 +814,9 @@ void kbase_device_pcm_dev_term(struct kbase_device *const kbdev);
|
|||
*
|
||||
* Return: sampled value of kfile::fops_count.
|
||||
*/
|
||||
static inline u32 kbase_file_fops_count(struct kbase_file *kfile)
|
||||
static inline int kbase_file_fops_count(struct kbase_file *kfile)
|
||||
{
|
||||
u32 fops_count;
|
||||
int fops_count;
|
||||
|
||||
spin_lock(&kfile->lock);
|
||||
fops_count = kfile->fops_count;
|
||||
|
|
|
|||
|
|
@ -22,6 +22,8 @@
|
|||
#ifndef _KBASE_AS_FAULT_DEBUG_FS_H
|
||||
#define _KBASE_AS_FAULT_DEBUG_FS_H
|
||||
|
||||
#include <mali_kbase.h>
|
||||
|
||||
/**
|
||||
* kbase_as_fault_debugfs_init() - Add debugfs files for reporting page faults
|
||||
*
|
||||
|
|
@ -35,7 +37,7 @@ void kbase_as_fault_debugfs_init(struct kbase_device *kbdev);
|
|||
* @kbdev: Pointer to kbase_device
|
||||
* @as_no: The address space the fault occurred on
|
||||
*/
|
||||
static inline void kbase_as_fault_debugfs_new(struct kbase_device *kbdev, int as_no)
|
||||
static inline void kbase_as_fault_debugfs_new(struct kbase_device *kbdev, unsigned int as_no)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_DEBUG_FS)
|
||||
#ifdef CONFIG_MALI_DEBUG
|
||||
|
|
|
|||
|
|
@ -23,7 +23,8 @@
|
|||
* Cache Policy API.
|
||||
*/
|
||||
|
||||
#include "mali_kbase_cache_policy.h"
|
||||
#include <mali_kbase_cache_policy.h>
|
||||
#include <mali_kbase.h>
|
||||
|
||||
/*
|
||||
* The output flags should be a combination of the following values:
|
||||
|
|
|
|||
|
|
@ -26,8 +26,7 @@
|
|||
#ifndef _KBASE_CACHE_POLICY_H_
|
||||
#define _KBASE_CACHE_POLICY_H_
|
||||
|
||||
#include "mali_kbase.h"
|
||||
#include <uapi/gpu/arm/midgard/mali_base_kernel.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
/**
|
||||
* kbase_cache_enabled - Choose the cache policy for a specific region
|
||||
|
|
|
|||
|
|
@ -32,13 +32,14 @@ static u64 kbasep_ccswe_cycle_at_no_lock(struct kbase_ccswe *self, u64 timestamp
|
|||
|
||||
lockdep_assert_held(&self->access);
|
||||
|
||||
diff_ns = timestamp_ns - self->timestamp_ns;
|
||||
diff_ns = (s64)(timestamp_ns - self->timestamp_ns);
|
||||
gpu_freq = diff_ns > 0 ? self->gpu_freq : self->prev_gpu_freq;
|
||||
|
||||
diff_s = div_s64(diff_ns, NSEC_PER_SEC);
|
||||
diff_ns -= diff_s * NSEC_PER_SEC;
|
||||
|
||||
return self->cycles_elapsed + diff_s * gpu_freq + div_s64(diff_ns * gpu_freq, NSEC_PER_SEC);
|
||||
return self->cycles_elapsed + (u64)diff_s * gpu_freq +
|
||||
(u64)div_s64(diff_ns * gpu_freq, NSEC_PER_SEC);
|
||||
}
|
||||
|
||||
void kbase_ccswe_init(struct kbase_ccswe *self)
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@
|
|||
#ifndef _KBASE_CCSWE_H_
|
||||
#define _KBASE_CCSWE_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -26,9 +26,9 @@
|
|||
#ifndef _KBASE_CONFIG_H_
|
||||
#define _KBASE_CONFIG_H_
|
||||
|
||||
#include <linux/mm.h>
|
||||
#include <mali_malisw.h>
|
||||
#include <backend/gpu/mali_kbase_backend_config.h>
|
||||
|
||||
#include <linux/mm.h>
|
||||
|
||||
/* Forward declaration of struct kbase_device */
|
||||
struct kbase_device;
|
||||
|
|
|
|||
|
|
@ -219,6 +219,19 @@ enum {
|
|||
#define KCPU_FENCE_SIGNAL_TIMEOUT_CYCLES (1000000000ull)
|
||||
#endif
|
||||
|
||||
/* Timeout for polling the GPU in clock cycles.
|
||||
*
|
||||
* Based on 10s timeout based on original MAX_LOOPS value.
|
||||
*/
|
||||
#define IPA_INACTIVE_TIMEOUT_CYCLES (1000000000ull)
|
||||
|
||||
/* Timeout for polling the GPU for the MCU status in clock cycles.
|
||||
*
|
||||
* Based on 120s timeout based on original MAX_LOOPS value.
|
||||
*/
|
||||
#define CSF_FIRMWARE_STOP_TIMEOUT_CYCLES (12000000000ull)
|
||||
|
||||
|
||||
/* Waiting timeout for task execution on an endpoint. Based on the
|
||||
* DEFAULT_PROGRESS_TIMEOUT.
|
||||
*
|
||||
|
|
@ -250,6 +263,24 @@ enum {
|
|||
|
||||
#endif /* !MALI_USE_CSF */
|
||||
|
||||
/* Timeout for polling the GPU PRFCNT_ACTIVE bit in clock cycles.
|
||||
*
|
||||
* Based on 120s timeout at 100MHz, based on original MAX_LOOPS value.
|
||||
*/
|
||||
#define KBASE_PRFCNT_ACTIVE_TIMEOUT_CYCLES (12000000000ull)
|
||||
|
||||
/* Timeout for polling the GPU for a cache flush in clock cycles.
|
||||
*
|
||||
* Based on 120ms timeout at 100MHz, based on original MAX_LOOPS value.
|
||||
*/
|
||||
#define KBASE_CLEAN_CACHE_TIMEOUT_CYCLES (12000000ull)
|
||||
|
||||
/* Timeout for polling the GPU for an AS command to complete in clock cycles.
|
||||
*
|
||||
* Based on 120s timeout at 100MHz, based on original MAX_LOOPS value.
|
||||
*/
|
||||
#define KBASE_AS_INACTIVE_TIMEOUT_CYCLES (12000000000ull)
|
||||
|
||||
/* Default timeslice that a context is scheduled in for, in nanoseconds.
|
||||
*
|
||||
* When a context has used up this amount of time across its jobs, it is
|
||||
|
|
|
|||
|
|
@ -128,7 +128,7 @@
|
|||
* @minor: Kernel minor version
|
||||
*/
|
||||
#define KBASE_API_VERSION(major, minor) \
|
||||
((((major)&0xFFF) << 20) | (((minor)&0xFFF) << 8) | ((0 & 0xFF) << 0))
|
||||
((((major)&0xFFFU) << 20U) | (((minor)&0xFFFU) << 8U) | ((0U & 0xFFU) << 0U))
|
||||
|
||||
/**
|
||||
* struct mali_kbase_capability_def - kbase capabilities table
|
||||
|
|
@ -525,26 +525,28 @@ static struct kbase_device *to_kbase_device(struct device *dev)
|
|||
return dev_get_drvdata(dev);
|
||||
}
|
||||
|
||||
int assign_irqs(struct kbase_device *kbdev)
|
||||
/**
|
||||
* get_irqs - Get interrupts information from the device tree.
|
||||
*
|
||||
* @kbdev: Kbase device.
|
||||
* @pdev: Platform device of the kbase device
|
||||
*
|
||||
* Read interrupt number and flag for 'JOB', 'MMU' and 'GPU' interrupts
|
||||
* from the device tree and fill them into the struct of the kbase device.
|
||||
*
|
||||
* Return: 0 on successful reading of all the entries JOB, MMU and GPU interrupts.
|
||||
* -EINVAL on failure for all other cases.
|
||||
*
|
||||
*/
|
||||
static int get_irqs(struct kbase_device *kbdev, struct platform_device *pdev)
|
||||
{
|
||||
int i;
|
||||
static const char *const irq_names_caps[] = { "JOB", "MMU", "GPU" };
|
||||
|
||||
#if IS_ENABLED(CONFIG_OF)
|
||||
static const char *const irq_names[] = { "job", "mmu", "gpu" };
|
||||
#endif
|
||||
|
||||
struct platform_device *pdev;
|
||||
size_t i;
|
||||
|
||||
if (!kbdev)
|
||||
return -ENODEV;
|
||||
|
||||
pdev = to_platform_device(kbdev->dev);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(irq_names_caps); i++) {
|
||||
struct irq_data *irqdata;
|
||||
int irq;
|
||||
|
||||
#if IS_ENABLED(CONFIG_OF)
|
||||
/* We recommend using Upper case for the irq names in dts, but if
|
||||
* there are devices in the world using Lower case then we should
|
||||
* avoid breaking support for them. So try using names in Upper case
|
||||
|
|
@ -552,24 +554,42 @@ int assign_irqs(struct kbase_device *kbdev)
|
|||
* we assume there is no IRQ resource specified for the GPU.
|
||||
*/
|
||||
irq = platform_get_irq_byname(pdev, irq_names_caps[i]);
|
||||
if (irq < 0)
|
||||
irq = platform_get_irq_byname(pdev, irq_names[i]);
|
||||
#else
|
||||
irq = platform_get_irq(pdev, i);
|
||||
#endif /* CONFIG_OF */
|
||||
|
||||
if (irq < 0) {
|
||||
dev_err(kbdev->dev, "No IRQ resource '%s'\n", irq_names_caps[i]);
|
||||
return irq;
|
||||
static const char *const irq_names[] = { "job", "mmu", "gpu" };
|
||||
|
||||
irq = platform_get_irq_byname(pdev, irq_names[i]);
|
||||
}
|
||||
|
||||
kbdev->irqs[i].irq = irq;
|
||||
kbdev->irqs[i].flags = irqd_get_trigger_type(irq_get_irq_data(irq));
|
||||
if (irq < 0)
|
||||
return irq;
|
||||
|
||||
kbdev->irqs[i].irq = (u32)irq;
|
||||
irqdata = irq_get_irq_data((unsigned int)irq);
|
||||
if (likely(irqdata))
|
||||
kbdev->irqs[i].flags = irqd_get_trigger_type(irqdata);
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
kbdev->nr_irqs++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int kbase_get_irqs(struct kbase_device *kbdev)
|
||||
{
|
||||
int result;
|
||||
struct platform_device *pdev = to_platform_device(kbdev->dev);
|
||||
|
||||
kbdev->nr_irqs = 0;
|
||||
result = get_irqs(kbdev, pdev);
|
||||
if (result)
|
||||
dev_err(kbdev->dev, "Invalid or No interrupt resources");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Find a particular kbase device (as specified by minor number), or find the "first" device if -1 is specified */
|
||||
struct kbase_device *kbase_find_device(int minor)
|
||||
{
|
||||
|
|
@ -618,19 +638,19 @@ static ssize_t write_ctx_infinite_cache(struct file *f, const char __user *ubuf,
|
|||
else
|
||||
kbase_ctx_flag_clear(kctx, KCTX_INFINITE_CACHE);
|
||||
|
||||
return size;
|
||||
return (ssize_t)size;
|
||||
}
|
||||
|
||||
static ssize_t read_ctx_infinite_cache(struct file *f, char __user *ubuf, size_t size, loff_t *off)
|
||||
{
|
||||
struct kbase_context *kctx = f->private_data;
|
||||
char buf[32];
|
||||
int count;
|
||||
size_t count;
|
||||
bool value;
|
||||
|
||||
value = kbase_ctx_flag(kctx, KCTX_INFINITE_CACHE);
|
||||
|
||||
count = scnprintf(buf, sizeof(buf), "%s\n", value ? "Y" : "N");
|
||||
count = (size_t)scnprintf(buf, sizeof(buf), "%s\n", value ? "Y" : "N");
|
||||
|
||||
return simple_read_from_buffer(ubuf, size, off, buf, count);
|
||||
}
|
||||
|
|
@ -669,19 +689,19 @@ static ssize_t write_ctx_force_same_va(struct file *f, const char __user *ubuf,
|
|||
kbase_ctx_flag_clear(kctx, KCTX_FORCE_SAME_VA);
|
||||
}
|
||||
|
||||
return size;
|
||||
return (ssize_t)size;
|
||||
}
|
||||
|
||||
static ssize_t read_ctx_force_same_va(struct file *f, char __user *ubuf, size_t size, loff_t *off)
|
||||
{
|
||||
struct kbase_context *kctx = f->private_data;
|
||||
char buf[32];
|
||||
int count;
|
||||
size_t count;
|
||||
bool value;
|
||||
|
||||
value = kbase_ctx_flag(kctx, KCTX_FORCE_SAME_VA);
|
||||
|
||||
count = scnprintf(buf, sizeof(buf), "%s\n", value ? "Y" : "N");
|
||||
count = (size_t)scnprintf(buf, sizeof(buf), "%s\n", value ? "Y" : "N");
|
||||
|
||||
return simple_read_from_buffer(ubuf, size, off, buf, count);
|
||||
}
|
||||
|
|
@ -759,7 +779,7 @@ static int kbase_open(struct inode *inode, struct file *filp)
|
|||
struct kbase_file *kfile;
|
||||
int ret = 0;
|
||||
|
||||
kbdev = kbase_find_device(iminor(inode));
|
||||
kbdev = kbase_find_device((int)iminor(inode));
|
||||
|
||||
if (!kbdev)
|
||||
return -ENODEV;
|
||||
|
|
@ -901,7 +921,7 @@ static int kbase_api_get_gpuprops(struct kbase_file *kfile,
|
|||
}
|
||||
|
||||
if (get_props->size == 0)
|
||||
return kprops->prop_buffer_size;
|
||||
return (int)kprops->prop_buffer_size;
|
||||
if (get_props->size < kprops->prop_buffer_size)
|
||||
return -EINVAL;
|
||||
|
||||
|
|
@ -909,7 +929,7 @@ static int kbase_api_get_gpuprops(struct kbase_file *kfile,
|
|||
kprops->prop_buffer_size);
|
||||
if (err)
|
||||
return -EFAULT;
|
||||
return kprops->prop_buffer_size;
|
||||
return (int)kprops->prop_buffer_size;
|
||||
}
|
||||
|
||||
#if !MALI_USE_CSF
|
||||
|
|
@ -1111,8 +1131,8 @@ static int kbase_api_get_cpu_gpu_timeinfo(struct kbase_context *kctx,
|
|||
timeinfo->out.cycle_counter = cycle_cnt;
|
||||
|
||||
if (flags & BASE_TIMEINFO_MONOTONIC_FLAG) {
|
||||
timeinfo->out.sec = ts.tv_sec;
|
||||
timeinfo->out.nsec = ts.tv_nsec;
|
||||
timeinfo->out.sec = (u64)ts.tv_sec;
|
||||
timeinfo->out.nsec = (u32)ts.tv_nsec;
|
||||
}
|
||||
|
||||
kbase_pm_context_idle(kctx->kbdev);
|
||||
|
|
@ -1139,14 +1159,14 @@ static int kbase_api_get_ddk_version(struct kbase_context *kctx,
|
|||
struct kbase_ioctl_get_ddk_version *version)
|
||||
{
|
||||
int ret;
|
||||
uint len = sizeof(KERNEL_SIDE_DDK_VERSION_STRING);
|
||||
int len = sizeof(KERNEL_SIDE_DDK_VERSION_STRING);
|
||||
|
||||
CSTD_UNUSED(kctx);
|
||||
|
||||
if (version->version_buffer == 0)
|
||||
return len;
|
||||
|
||||
if (version->size < len)
|
||||
if (version->size < (u32)len)
|
||||
return -EOVERFLOW;
|
||||
|
||||
ret = copy_to_user(u64_to_user_ptr(version->version_buffer), KERNEL_SIDE_DDK_VERSION_STRING,
|
||||
|
|
@ -2192,7 +2212,7 @@ static ssize_t kbase_read(struct file *filp, char __user *buf, size_t count, lof
|
|||
struct kbase_file *const kfile = filp->private_data;
|
||||
struct kbase_context *kctx;
|
||||
struct base_jd_event_v2 uevent;
|
||||
int out_count = 0;
|
||||
size_t out_count = 0;
|
||||
ssize_t err = 0;
|
||||
|
||||
CSTD_UNUSED(f_pos);
|
||||
|
|
@ -2430,13 +2450,15 @@ static ssize_t power_policy_show(struct device *dev, struct device_attribute *at
|
|||
|
||||
for (i = 0; i < policy_count && ret < (ssize_t)PAGE_SIZE; i++) {
|
||||
if (policy_list[i] == current_policy)
|
||||
ret += scnprintf(buf + ret, PAGE_SIZE - ret, "[%s] ", policy_list[i]->name);
|
||||
ret += scnprintf(buf + ret, (size_t)(PAGE_SIZE - ret), "[%s] ",
|
||||
policy_list[i]->name);
|
||||
else
|
||||
ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s ", policy_list[i]->name);
|
||||
ret += scnprintf(buf + ret, (size_t)(PAGE_SIZE - ret), "%s ",
|
||||
policy_list[i]->name);
|
||||
}
|
||||
|
||||
if (ret < (ssize_t)PAGE_SIZE - 1) {
|
||||
ret += scnprintf(buf + ret, PAGE_SIZE - ret, "\n");
|
||||
ret += scnprintf(buf + ret, (size_t)(PAGE_SIZE - ret), "\n");
|
||||
} else {
|
||||
buf[PAGE_SIZE - 2] = '\n';
|
||||
buf[PAGE_SIZE - 1] = '\0';
|
||||
|
|
@ -2493,7 +2515,7 @@ static ssize_t power_policy_store(struct device *dev, struct device_attribute *a
|
|||
|
||||
kbase_pm_set_policy(kbdev, new_policy);
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -2532,22 +2554,22 @@ static ssize_t core_mask_show(struct device *dev, struct device_attribute *attr,
|
|||
spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
|
||||
|
||||
#if MALI_USE_CSF
|
||||
ret += scnprintf(buf + ret, PAGE_SIZE - ret, "Current debug core mask : 0x%llX\n",
|
||||
ret += scnprintf(buf + ret, (size_t)(PAGE_SIZE - ret), "Current debug core mask : 0x%llX\n",
|
||||
kbdev->pm.debug_core_mask);
|
||||
ret += scnprintf(buf + ret, PAGE_SIZE - ret, "Current desired core mask : 0x%llX\n",
|
||||
kbase_pm_ca_get_core_mask(kbdev));
|
||||
ret += scnprintf(buf + ret, PAGE_SIZE - ret, "Current in use core mask : 0x%llX\n",
|
||||
kbdev->pm.backend.shaders_avail);
|
||||
ret += scnprintf(buf + ret, (size_t)(PAGE_SIZE - ret),
|
||||
"Current desired core mask : 0x%llX\n", kbase_pm_ca_get_core_mask(kbdev));
|
||||
ret += scnprintf(buf + ret, (size_t)(PAGE_SIZE - ret),
|
||||
"Current in use core mask : 0x%llX\n", kbdev->pm.backend.shaders_avail);
|
||||
#else
|
||||
ret += scnprintf(buf + ret, PAGE_SIZE - ret, "Current core mask (JS0) : 0x%llX\n",
|
||||
ret += scnprintf(buf + ret, (size_t)(PAGE_SIZE - ret), "Current core mask (JS0) : 0x%llX\n",
|
||||
kbdev->pm.debug_core_mask[0]);
|
||||
ret += scnprintf(buf + ret, PAGE_SIZE - ret, "Current core mask (JS1) : 0x%llX\n",
|
||||
ret += scnprintf(buf + ret, (size_t)(PAGE_SIZE - ret), "Current core mask (JS1) : 0x%llX\n",
|
||||
kbdev->pm.debug_core_mask[1]);
|
||||
ret += scnprintf(buf + ret, PAGE_SIZE - ret, "Current core mask (JS2) : 0x%llX\n",
|
||||
ret += scnprintf(buf + ret, (size_t)(PAGE_SIZE - ret), "Current core mask (JS2) : 0x%llX\n",
|
||||
kbdev->pm.debug_core_mask[2]);
|
||||
#endif /* MALI_USE_CSF */
|
||||
|
||||
ret += scnprintf(buf + ret, PAGE_SIZE - ret, "Available core mask : 0x%llX\n",
|
||||
ret += scnprintf(buf + ret, (size_t)(PAGE_SIZE - ret), "Available core mask : 0x%llX\n",
|
||||
kbdev->gpu_props.shader_present);
|
||||
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
|
|
@ -2580,7 +2602,7 @@ static ssize_t core_mask_store(struct device *dev, struct device_attribute *attr
|
|||
#endif /* MALI_USE_CSF */
|
||||
|
||||
int items;
|
||||
ssize_t err = count;
|
||||
ssize_t err = (ssize_t)count;
|
||||
unsigned long flags;
|
||||
u64 shader_present;
|
||||
|
||||
|
|
@ -2733,7 +2755,7 @@ static ssize_t soft_job_timeout_store(struct device *dev, struct device_attribut
|
|||
|
||||
atomic_set(&kbdev->js_data.soft_job_timeout_ms, soft_job_timeout_ms);
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -2768,14 +2790,14 @@ static u32 timeout_ms_to_ticks(struct kbase_device *kbdev, long timeout_ms, int
|
|||
u32 old_ticks)
|
||||
{
|
||||
if (timeout_ms > 0) {
|
||||
u64 ticks = timeout_ms * 1000000ULL;
|
||||
u64 ticks = (u64)timeout_ms * 1000000ULL;
|
||||
|
||||
do_div(ticks, kbdev->js_data.scheduling_period_ns);
|
||||
if (!ticks)
|
||||
return 1;
|
||||
return ticks;
|
||||
} else if (timeout_ms < 0) {
|
||||
return default_ticks;
|
||||
return (u32)default_ticks;
|
||||
} else {
|
||||
return old_ticks;
|
||||
}
|
||||
|
|
@ -2859,7 +2881,7 @@ static ssize_t js_timeouts_store(struct device *dev, struct device_attribute *at
|
|||
|
||||
spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
dev_err(kbdev->dev,
|
||||
|
|
@ -3041,7 +3063,7 @@ static ssize_t js_scheduling_period_store(struct device *dev, struct device_attr
|
|||
|
||||
dev_dbg(kbdev->dev, "JS scheduling period: %dms\n", js_scheduling_period);
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -3102,7 +3124,7 @@ static ssize_t js_softstop_always_store(struct device *dev, struct device_attrib
|
|||
kbdev->js_data.softstop_always = (bool)softstop_always;
|
||||
dev_dbg(kbdev->dev, "Support for softstop on a single context: %s\n",
|
||||
(kbdev->js_data.softstop_always) ? "Enabled" : "Disabled");
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
static ssize_t js_softstop_always_show(struct device *dev, struct device_attribute *attr,
|
||||
|
|
@ -3191,7 +3213,8 @@ static ssize_t debug_command_show(struct device *dev, struct device_attribute *a
|
|||
return -ENODEV;
|
||||
|
||||
for (i = 0; i < KBASEP_DEBUG_COMMAND_COUNT && ret < (ssize_t)PAGE_SIZE; i++)
|
||||
ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s\n", debug_commands[i].str);
|
||||
ret += scnprintf(buf + ret, (size_t)(PAGE_SIZE - ret), "%s\n",
|
||||
debug_commands[i].str);
|
||||
|
||||
if (ret >= (ssize_t)PAGE_SIZE) {
|
||||
buf[PAGE_SIZE - 2] = '\n';
|
||||
|
|
@ -3233,7 +3256,7 @@ static ssize_t debug_command_store(struct device *dev, struct device_attribute *
|
|||
for (i = 0; i < KBASEP_DEBUG_COMMAND_COUNT; i++) {
|
||||
if (sysfs_streq(debug_commands[i].str, buf)) {
|
||||
debug_commands[i].func(kbdev);
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3287,6 +3310,7 @@ static ssize_t gpuinfo_show(struct device *dev, struct device_attribute *attr, c
|
|||
{ .id = GPU_ID_PRODUCT_LODX, .name = "Mali-G610" },
|
||||
{ .id = GPU_ID_PRODUCT_TGRX, .name = "Mali-G510" },
|
||||
{ .id = GPU_ID_PRODUCT_TVAX, .name = "Mali-G310" },
|
||||
{ .id = GPU_ID_PRODUCT_LTUX, .name = "Mali-G615" },
|
||||
{ .id = GPU_ID_PRODUCT_LTIX, .name = "Mali-G620" },
|
||||
{ .id = GPU_ID_PRODUCT_TKRX, .name = "Mali-TKRX" },
|
||||
{ .id = GPU_ID_PRODUCT_LKRX, .name = "Mali-LKRX" },
|
||||
|
|
@ -3352,6 +3376,7 @@ static ssize_t gpuinfo_show(struct device *dev, struct device_attribute *attr, c
|
|||
dev_dbg(kbdev->dev, "GPU ID_Name: %s (ID: 0x%x), nr_cores(%u)\n", product_name,
|
||||
product_id, nr_cores);
|
||||
}
|
||||
|
||||
#endif /* MALI_USE_CSF */
|
||||
|
||||
return scnprintf(buf, PAGE_SIZE, "%s %d cores r%dp%d 0x%08X\n", product_name,
|
||||
|
|
@ -3392,10 +3417,10 @@ static ssize_t dvfs_period_store(struct device *dev, struct device_attribute *at
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
kbdev->pm.dvfs_period = dvfs_period;
|
||||
kbdev->pm.dvfs_period = (u32)dvfs_period;
|
||||
dev_dbg(kbdev->dev, "DVFS period: %dms\n", dvfs_period);
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -3531,7 +3556,7 @@ static ssize_t pm_poweroff_store(struct device *dev, struct device_attribute *at
|
|||
if (poweroff_gpu_ticks != 0)
|
||||
dev_warn(kbdev->dev, "Separate GPU poweroff delay no longer supported.\n");
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -3617,7 +3642,7 @@ static ssize_t reset_timeout_store(struct device *dev, struct device_attribute *
|
|||
kbdev->reset_timeout_ms = reset_timeout;
|
||||
dev_dbg(kbdev->dev, "Reset timeout: %ums\n", reset_timeout);
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -3834,13 +3859,13 @@ static DEVICE_ATTR_RW(lp_mem_pool_max_size);
|
|||
|
||||
/**
|
||||
* show_simplified_mem_pool_max_size - Show the maximum size for the memory
|
||||
* pool 0 of small (4KiB) pages.
|
||||
* pool 0 of small (4KiB/16KiB/64KiB) pages.
|
||||
* @dev: The device this sysfs file is for.
|
||||
* @attr: The attributes of the sysfs file.
|
||||
* @buf: The output buffer to receive the max size.
|
||||
*
|
||||
* This function is called to get the maximum size for the memory pool 0 of
|
||||
* small (4KiB) pages. It is assumed that the maximum size value is same for
|
||||
* small pages. It is assumed that the maximum size value is same for
|
||||
* all the pools.
|
||||
*
|
||||
* Return: The number of bytes output to @buf.
|
||||
|
|
@ -3861,14 +3886,14 @@ static ssize_t show_simplified_mem_pool_max_size(struct device *dev, struct devi
|
|||
|
||||
/**
|
||||
* set_simplified_mem_pool_max_size - Set the same maximum size for all the
|
||||
* memory pools of small (4KiB) pages.
|
||||
* memory pools of small (4KiB/16KiB/64KiB) pages.
|
||||
* @dev: The device with sysfs file is for
|
||||
* @attr: The attributes of the sysfs file
|
||||
* @buf: The value written to the sysfs file
|
||||
* @count: The number of bytes written to the sysfs file
|
||||
*
|
||||
* This function is called to set the same maximum size for all the memory
|
||||
* pools of small (4KiB) pages.
|
||||
* pools of small pages.
|
||||
*
|
||||
* Return: The number of bytes output to @buf.
|
||||
*/
|
||||
|
|
@ -3877,7 +3902,7 @@ static ssize_t set_simplified_mem_pool_max_size(struct device *dev, struct devic
|
|||
{
|
||||
struct kbase_device *const kbdev = to_kbase_device(dev);
|
||||
unsigned long new_size;
|
||||
int gid;
|
||||
size_t gid;
|
||||
int err;
|
||||
|
||||
CSTD_UNUSED(attr);
|
||||
|
|
@ -3892,7 +3917,7 @@ static ssize_t set_simplified_mem_pool_max_size(struct device *dev, struct devic
|
|||
for (gid = 0; gid < MEMORY_GROUP_MANAGER_NR_GROUPS; ++gid)
|
||||
kbase_mem_pool_debugfs_set_max_size(kbdev->mem_pools.small, gid, (size_t)new_size);
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(max_size, 0600, show_simplified_mem_pool_max_size,
|
||||
|
|
@ -3944,7 +3969,7 @@ static ssize_t set_simplified_lp_mem_pool_max_size(struct device *dev,
|
|||
{
|
||||
struct kbase_device *const kbdev = to_kbase_device(dev);
|
||||
unsigned long new_size;
|
||||
int gid;
|
||||
size_t gid;
|
||||
int err;
|
||||
|
||||
CSTD_UNUSED(attr);
|
||||
|
|
@ -3959,7 +3984,7 @@ static ssize_t set_simplified_lp_mem_pool_max_size(struct device *dev,
|
|||
for (gid = 0; gid < MEMORY_GROUP_MANAGER_NR_GROUPS; ++gid)
|
||||
kbase_mem_pool_debugfs_set_max_size(kbdev->mem_pools.large, gid, (size_t)new_size);
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(lp_max_size, 0600, show_simplified_lp_mem_pool_max_size,
|
||||
|
|
@ -3967,15 +3992,15 @@ static DEVICE_ATTR(lp_max_size, 0600, show_simplified_lp_mem_pool_max_size,
|
|||
|
||||
/**
|
||||
* show_simplified_ctx_default_max_size - Show the default maximum size for the
|
||||
* memory pool 0 of small (4KiB) pages.
|
||||
* memory pool 0 of small (4KiB/16KiB/64KiB) pages.
|
||||
* @dev: The device this sysfs file is for.
|
||||
* @attr: The attributes of the sysfs file.
|
||||
* @buf: The output buffer to receive the pool size.
|
||||
*
|
||||
* This function is called to get the default ctx maximum size for the memory
|
||||
* pool 0 of small (4KiB) pages. It is assumed that maximum size value is same
|
||||
* pool 0 of small pages. It is assumed that maximum size value is same
|
||||
* for all the pools. The maximum size for the pool of large (2MiB) pages will
|
||||
* be same as max size of the pool of small (4KiB) pages in terms of bytes.
|
||||
* be same as max size of the pool of small pages in terms of bytes.
|
||||
*
|
||||
* Return: The number of bytes output to @buf.
|
||||
*/
|
||||
|
|
@ -4032,7 +4057,7 @@ static ssize_t set_simplified_ctx_default_max_size(struct device *dev,
|
|||
|
||||
kbase_mem_pool_group_config_set_max_size(&kbdev->mem_pool_defaults, (size_t)new_size);
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(ctx_default_max_size, 0600, show_simplified_ctx_default_max_size,
|
||||
|
|
@ -4102,7 +4127,7 @@ static ssize_t js_ctx_scheduling_mode_store(struct device *dev, struct device_at
|
|||
}
|
||||
|
||||
if (new_js_ctx_scheduling_mode == kbdev->js_ctx_scheduling_mode)
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
|
||||
mutex_lock(&kbdev->kctx_list_lock);
|
||||
spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
|
||||
|
|
@ -4119,7 +4144,7 @@ static ssize_t js_ctx_scheduling_mode_store(struct device *dev, struct device_at
|
|||
|
||||
dev_dbg(kbdev->dev, "JS ctx scheduling mode: %u\n", new_js_ctx_scheduling_mode);
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR_RW(js_ctx_scheduling_mode);
|
||||
|
|
@ -4175,7 +4200,7 @@ static ssize_t update_serialize_jobs_setting(struct kbase_device *kbdev, const c
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_DEBUG_FS)
|
||||
|
|
@ -4290,15 +4315,15 @@ static ssize_t show_serialize_jobs_sysfs(struct device *dev, struct device_attri
|
|||
|
||||
for (i = 0; i < NR_SERIALIZE_JOBS_SETTINGS; i++) {
|
||||
if (kbdev->serialize_jobs == serialize_jobs_settings[i].setting)
|
||||
ret += scnprintf(buf + ret, PAGE_SIZE - ret, "[%s]",
|
||||
ret += scnprintf(buf + ret, (size_t)(PAGE_SIZE - ret), "[%s]",
|
||||
serialize_jobs_settings[i].name);
|
||||
else
|
||||
ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s ",
|
||||
ret += scnprintf(buf + ret, (size_t)(PAGE_SIZE - ret), "%s ",
|
||||
serialize_jobs_settings[i].name);
|
||||
}
|
||||
|
||||
if (ret < (ssize_t)(PAGE_SIZE - 1)) {
|
||||
ret += scnprintf(buf + ret, PAGE_SIZE - ret, "\n");
|
||||
ret += scnprintf(buf + ret, (size_t)(PAGE_SIZE - ret), "\n");
|
||||
} else {
|
||||
buf[PAGE_SIZE - 2] = '\n';
|
||||
buf[PAGE_SIZE - 1] = '\0';
|
||||
|
|
@ -4690,7 +4715,7 @@ int power_control_init(struct kbase_device *kbdev)
|
|||
* operating with a partial initialization of clocks.
|
||||
*/
|
||||
for (i = 0; i < BASE_MAX_NR_CLOCKS_REGULATORS; i++) {
|
||||
kbdev->clocks[i] = of_clk_get(kbdev->dev->of_node, i);
|
||||
kbdev->clocks[i] = of_clk_get(kbdev->dev->of_node, (int)i);
|
||||
if (IS_ERR(kbdev->clocks[i])) {
|
||||
err = PTR_ERR(kbdev->clocks[i]);
|
||||
kbdev->clocks[i] = NULL;
|
||||
|
|
@ -5247,6 +5272,93 @@ early_exit:
|
|||
|
||||
|
||||
#if MALI_USE_CSF
|
||||
|
||||
bool kbasep_adjust_prioritized_process(struct kbase_device *kbdev, bool add, uint32_t tgid)
|
||||
{
|
||||
struct kbase_context *kctx;
|
||||
bool found_contexts = false;
|
||||
|
||||
mutex_lock(&kbdev->kctx_list_lock);
|
||||
list_for_each_entry(kctx, &kbdev->kctx_list, kctx_list_link) {
|
||||
if (kctx->tgid == tgid) {
|
||||
if (add)
|
||||
dev_dbg(kbdev->dev,
|
||||
"Adding context %pK of process %u to prioritized list\n",
|
||||
(void *)kctx, tgid);
|
||||
else
|
||||
dev_dbg(kbdev->dev,
|
||||
"Removing context %pK of process %u from prioritized list\n",
|
||||
(void *)kctx, tgid);
|
||||
atomic_set(&kctx->prioritized, add);
|
||||
found_contexts = true;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&kbdev->kctx_list_lock);
|
||||
|
||||
if (found_contexts)
|
||||
kbase_csf_scheduler_kick(kbdev);
|
||||
|
||||
return found_contexts;
|
||||
}
|
||||
|
||||
static ssize_t add_prioritized_process_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct kbase_device *kbdev;
|
||||
int ret;
|
||||
unsigned int tgid;
|
||||
|
||||
CSTD_UNUSED(attr);
|
||||
|
||||
kbdev = to_kbase_device(dev);
|
||||
if (!kbdev)
|
||||
return -ENODEV;
|
||||
|
||||
ret = kstrtouint(buf, 0, &tgid);
|
||||
if (ret || tgid == 0) {
|
||||
dev_err(kbdev->dev, "Invalid PID specified\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (unlikely(!kbasep_adjust_prioritized_process(kbdev, true, tgid))) {
|
||||
dev_err(kbdev->dev, "Non-existent PID specified\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR_WO(add_prioritized_process);
|
||||
|
||||
static ssize_t remove_prioritized_process_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct kbase_device *kbdev;
|
||||
int ret;
|
||||
unsigned int tgid;
|
||||
|
||||
CSTD_UNUSED(attr);
|
||||
|
||||
kbdev = to_kbase_device(dev);
|
||||
if (!kbdev)
|
||||
return -ENODEV;
|
||||
|
||||
ret = kstrtouint(buf, 0, &tgid);
|
||||
if (ret || tgid == 0) {
|
||||
dev_err(kbdev->dev, "Invalid PID specified\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (unlikely(!kbasep_adjust_prioritized_process(kbdev, false, tgid))) {
|
||||
dev_err(kbdev->dev, "Non-existent PID specified\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR_WO(remove_prioritized_process);
|
||||
|
||||
/**
|
||||
* csg_scheduling_period_store - Store callback for the csg_scheduling_period
|
||||
* sysfs file.
|
||||
|
|
@ -5286,7 +5398,7 @@ static ssize_t csg_scheduling_period_store(struct device *dev, struct device_att
|
|||
dev_dbg(kbdev->dev, "CSG scheduling period: %ums\n", csg_scheduling_period);
|
||||
kbase_csf_scheduler_unlock(kbdev);
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -5350,16 +5462,16 @@ static ssize_t fw_timeout_store(struct device *dev, struct device_attribute *att
|
|||
"Couldn't process fw_timeout write operation.\n"
|
||||
"Use format 'fw_timeout_ms', and fw_timeout_ms > 0\n"
|
||||
"Default fw_timeout: %u",
|
||||
kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_PING_TIMEOUT));
|
||||
kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
kbase_csf_scheduler_lock(kbdev);
|
||||
kbdev->csf.fw_timeout_ms = fw_timeout;
|
||||
kbase_device_set_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT, fw_timeout);
|
||||
kbase_csf_scheduler_unlock(kbdev);
|
||||
dev_dbg(kbdev->dev, "Firmware timeout: %ums\n", fw_timeout);
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -5383,7 +5495,7 @@ static ssize_t fw_timeout_show(struct device *dev, struct device_attribute *attr
|
|||
if (!kbdev)
|
||||
return -ENODEV;
|
||||
|
||||
ret = scnprintf(buf, PAGE_SIZE, "%u\n", kbdev->csf.fw_timeout_ms);
|
||||
ret = scnprintf(buf, PAGE_SIZE, "%u\n", kbase_get_timeout_ms(kbdev, CSF_FIRMWARE_TIMEOUT));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -5409,7 +5521,7 @@ static ssize_t idle_hysteresis_time_store(struct device *dev, struct device_attr
|
|||
const char *buf, size_t count)
|
||||
{
|
||||
struct kbase_device *kbdev;
|
||||
u32 dur = 0;
|
||||
u32 dur_us = 0;
|
||||
|
||||
CSTD_UNUSED(attr);
|
||||
|
||||
|
|
@ -5417,7 +5529,7 @@ static ssize_t idle_hysteresis_time_store(struct device *dev, struct device_attr
|
|||
if (!kbdev)
|
||||
return -ENODEV;
|
||||
|
||||
if (kstrtou32(buf, 0, &dur)) {
|
||||
if (kstrtou32(buf, 0, &dur_us)) {
|
||||
dev_err(kbdev->dev, "Couldn't process idle_hysteresis_time write operation.\n"
|
||||
"Use format <idle_hysteresis_time>\n");
|
||||
return -EINVAL;
|
||||
|
|
@ -5426,9 +5538,9 @@ static ssize_t idle_hysteresis_time_store(struct device *dev, struct device_attr
|
|||
/* In sysFs, The unit of the input value of idle_hysteresis_time is us.
|
||||
* But the unit of the input parameter of this function is ns, so multiply by 1000
|
||||
*/
|
||||
kbase_csf_firmware_set_gpu_idle_hysteresis_time(kbdev, dur * NSEC_PER_USEC);
|
||||
kbase_csf_firmware_set_gpu_idle_hysteresis_time(kbdev, (u64)dur_us * NSEC_PER_USEC);
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -5438,7 +5550,7 @@ static ssize_t idle_hysteresis_time_store(struct device *dev, struct device_attr
|
|||
* @attr: The attributes of the sysfs file.
|
||||
* @buf: The output buffer to receive the GPU information.
|
||||
*
|
||||
* This function is called to get the current idle hysteresis duration in ms.
|
||||
* This function is called to get the current idle hysteresis duration in us.
|
||||
*
|
||||
* Return: The number of bytes output to @buf.
|
||||
*/
|
||||
|
|
@ -5447,7 +5559,7 @@ static ssize_t idle_hysteresis_time_show(struct device *dev, struct device_attri
|
|||
{
|
||||
struct kbase_device *kbdev;
|
||||
ssize_t ret;
|
||||
u32 dur;
|
||||
u64 dur_us;
|
||||
|
||||
CSTD_UNUSED(attr);
|
||||
|
||||
|
|
@ -5455,9 +5567,9 @@ static ssize_t idle_hysteresis_time_show(struct device *dev, struct device_attri
|
|||
if (!kbdev)
|
||||
return -ENODEV;
|
||||
|
||||
/* The unit of return value of idle_hysteresis_time_show is us, So divide by 1000.*/
|
||||
dur = kbase_csf_firmware_get_gpu_idle_hysteresis_time(kbdev) / NSEC_PER_USEC;
|
||||
ret = scnprintf(buf, PAGE_SIZE, "%u\n", dur);
|
||||
/* The unit of return value of idle_hysteresis_time_show is us, So divide by 1000 */
|
||||
dur_us = div_u64(kbase_csf_firmware_get_gpu_idle_hysteresis_time(kbdev), NSEC_PER_USEC);
|
||||
ret = scnprintf(buf, PAGE_SIZE, "%u\n", (u32)dur_us);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -5484,19 +5596,19 @@ static ssize_t idle_hysteresis_time_ns_store(struct device *dev, struct device_a
|
|||
const char *buf, size_t count)
|
||||
{
|
||||
struct kbase_device *kbdev;
|
||||
u32 dur = 0;
|
||||
u64 dur_ns = 0;
|
||||
|
||||
kbdev = to_kbase_device(dev);
|
||||
if (!kbdev)
|
||||
return -ENODEV;
|
||||
|
||||
if (kstrtou32(buf, 0, &dur)) {
|
||||
if (kstrtou64(buf, 0, &dur_ns)) {
|
||||
dev_err(kbdev->dev, "Couldn't process idle_hysteresis_time_ns write operation.\n"
|
||||
"Use format <idle_hysteresis_time_ns>\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
kbase_csf_firmware_set_gpu_idle_hysteresis_time(kbdev, dur);
|
||||
kbase_csf_firmware_set_gpu_idle_hysteresis_time(kbdev, dur_ns);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
|
@ -5518,14 +5630,14 @@ static ssize_t idle_hysteresis_time_ns_show(struct device *dev, struct device_at
|
|||
{
|
||||
struct kbase_device *kbdev;
|
||||
ssize_t ret;
|
||||
u32 dur;
|
||||
u64 dur_ns;
|
||||
|
||||
kbdev = to_kbase_device(dev);
|
||||
if (!kbdev)
|
||||
return -ENODEV;
|
||||
|
||||
dur = kbase_csf_firmware_get_gpu_idle_hysteresis_time(kbdev);
|
||||
ret = scnprintf(buf, PAGE_SIZE, "%u\n", dur);
|
||||
dur_ns = kbase_csf_firmware_get_gpu_idle_hysteresis_time(kbdev);
|
||||
ret = scnprintf(buf, PAGE_SIZE, "%llu\n", dur_ns);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -5549,16 +5661,16 @@ static ssize_t mcu_shader_pwroff_timeout_show(struct device *dev, struct device_
|
|||
char *const buf)
|
||||
{
|
||||
struct kbase_device *kbdev = dev_get_drvdata(dev);
|
||||
u32 pwroff;
|
||||
u64 pwroff_us;
|
||||
|
||||
CSTD_UNUSED(attr);
|
||||
|
||||
if (!kbdev)
|
||||
return -ENODEV;
|
||||
|
||||
/* The unit of return value of the function is us, So divide by 1000.*/
|
||||
pwroff = kbase_csf_firmware_get_mcu_core_pwroff_time(kbdev) / NSEC_PER_USEC;
|
||||
return scnprintf(buf, PAGE_SIZE, "%u\n", pwroff);
|
||||
/* The unit of return value of the function is us, So divide by 1000 */
|
||||
pwroff_us = div_u64(kbase_csf_firmware_get_mcu_core_pwroff_time(kbdev), NSEC_PER_USEC);
|
||||
return scnprintf(buf, PAGE_SIZE, "%u\n", (u32)pwroff_us);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -5579,7 +5691,7 @@ static ssize_t mcu_shader_pwroff_timeout_store(struct device *dev, struct device
|
|||
const char *buf, size_t count)
|
||||
{
|
||||
struct kbase_device *kbdev = dev_get_drvdata(dev);
|
||||
u32 dur;
|
||||
u32 dur_us;
|
||||
|
||||
const struct kbase_pm_policy *current_policy;
|
||||
bool always_on;
|
||||
|
|
@ -5589,20 +5701,20 @@ static ssize_t mcu_shader_pwroff_timeout_store(struct device *dev, struct device
|
|||
if (!kbdev)
|
||||
return -ENODEV;
|
||||
|
||||
if (kstrtouint(buf, 0, &dur))
|
||||
if (kstrtou32(buf, 0, &dur_us))
|
||||
return -EINVAL;
|
||||
|
||||
current_policy = kbase_pm_get_policy(kbdev);
|
||||
always_on = current_policy == &kbase_pm_always_on_policy_ops;
|
||||
if (dur == 0 && !always_on)
|
||||
if (dur_us == 0 && !always_on)
|
||||
return -EINVAL;
|
||||
|
||||
/* In sysFs, The unit of the input value of mcu_shader_pwroff_timeout is us.
|
||||
* But the unit of the input parameter of this function is ns, so multiply by 1000
|
||||
*/
|
||||
kbase_csf_firmware_set_mcu_core_pwroff_time(kbdev, dur * NSEC_PER_USEC);
|
||||
kbase_csf_firmware_set_mcu_core_pwroff_time(kbdev, (u64)dur_us * NSEC_PER_USEC);
|
||||
|
||||
return count;
|
||||
return (ssize_t)count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR_RW(mcu_shader_pwroff_timeout);
|
||||
|
|
@ -5624,13 +5736,13 @@ static ssize_t mcu_shader_pwroff_timeout_ns_show(struct device *dev, struct devi
|
|||
char *const buf)
|
||||
{
|
||||
struct kbase_device *kbdev = dev_get_drvdata(dev);
|
||||
u32 pwroff;
|
||||
u64 pwroff_ns;
|
||||
|
||||
if (!kbdev)
|
||||
return -ENODEV;
|
||||
|
||||
pwroff = kbase_csf_firmware_get_mcu_core_pwroff_time(kbdev);
|
||||
return scnprintf(buf, PAGE_SIZE, "%u\n", pwroff);
|
||||
pwroff_ns = kbase_csf_firmware_get_mcu_core_pwroff_time(kbdev);
|
||||
return scnprintf(buf, PAGE_SIZE, "%llu\n", pwroff_ns);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -5651,7 +5763,7 @@ static ssize_t mcu_shader_pwroff_timeout_ns_store(struct device *dev, struct dev
|
|||
const char *buf, size_t count)
|
||||
{
|
||||
struct kbase_device *kbdev = dev_get_drvdata(dev);
|
||||
u32 dur;
|
||||
u64 dur_ns;
|
||||
|
||||
const struct kbase_pm_policy *current_policy;
|
||||
bool always_on;
|
||||
|
|
@ -5659,15 +5771,15 @@ static ssize_t mcu_shader_pwroff_timeout_ns_store(struct device *dev, struct dev
|
|||
if (!kbdev)
|
||||
return -ENODEV;
|
||||
|
||||
if (kstrtouint(buf, 0, &dur))
|
||||
if (kstrtou64(buf, 0, &dur_ns))
|
||||
return -EINVAL;
|
||||
|
||||
current_policy = kbase_pm_get_policy(kbdev);
|
||||
always_on = current_policy == &kbase_pm_always_on_policy_ops;
|
||||
if (dur == 0 && !always_on)
|
||||
if (dur_ns == 0 && !always_on)
|
||||
return -EINVAL;
|
||||
|
||||
kbase_csf_firmware_set_mcu_core_pwroff_time(kbdev, dur);
|
||||
kbase_csf_firmware_set_mcu_core_pwroff_time(kbdev, dur_ns);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
|
@ -5702,6 +5814,8 @@ static struct attribute *kbase_attrs[] = {
|
|||
&dev_attr_js_scheduling_period.attr,
|
||||
#else
|
||||
&dev_attr_csg_scheduling_period.attr,
|
||||
&dev_attr_add_prioritized_process.attr,
|
||||
&dev_attr_remove_prioritized_process.attr,
|
||||
&dev_attr_fw_timeout.attr,
|
||||
&dev_attr_idle_hysteresis_time.attr,
|
||||
&dev_attr_idle_hysteresis_time_ns.attr,
|
||||
|
|
@ -5859,6 +5973,10 @@ static int kbase_platform_device_probe(struct platform_device *pdev)
|
|||
#endif
|
||||
|
||||
dev_info(kbdev->dev, "Probed as %s\n", dev_name(kbdev->mdev.this_device));
|
||||
if (PAGE_SHIFT != 12)
|
||||
dev_warn(kbdev->dev, "Experimental feature: %s with Page Size of %luKiB",
|
||||
dev_name(kbdev->mdev.this_device), PAGE_SIZE / 1024);
|
||||
|
||||
kbase_increment_device_id();
|
||||
#if (KERNEL_VERSION(5, 3, 0) <= LINUX_VERSION_CODE)
|
||||
mutex_unlock(&kbase_probe_mutex);
|
||||
|
|
@ -6150,8 +6268,8 @@ void kbase_trace_mali_pm_status(u32 dev_id, u32 event, u64 value)
|
|||
void kbase_trace_mali_job_slots_event(u32 dev_id, u32 event, const struct kbase_context *kctx,
|
||||
u8 atom_id)
|
||||
{
|
||||
trace_mali_job_slots_event(dev_id, event, (kctx != NULL ? kctx->tgid : 0),
|
||||
(kctx != NULL ? kctx->pid : 0), atom_id);
|
||||
trace_mali_job_slots_event(dev_id, event, (kctx != NULL ? (u32)kctx->tgid : 0U),
|
||||
(kctx != NULL ? (u32)kctx->pid : 0U), atom_id);
|
||||
}
|
||||
|
||||
void kbase_trace_mali_page_fault_insert_pages(u32 dev_id, int event, u32 value)
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ static int kbase_ktrace_get_ctx_refcnt(struct kbase_context *kctx)
|
|||
|
||||
int kbase_ctx_sched_init(struct kbase_device *kbdev)
|
||||
{
|
||||
int as_present = (1U << kbdev->nr_hw_address_spaces) - 1;
|
||||
int as_present = (1 << kbdev->nr_hw_address_spaces) - 1;
|
||||
|
||||
/* These two must be recalculated if nr_hw_address_spaces changes
|
||||
* (e.g. for HW workarounds)
|
||||
|
|
@ -133,7 +133,8 @@ int kbase_ctx_sched_retain_ctx(struct kbase_context *kctx)
|
|||
}
|
||||
kctx->as_nr = free_as;
|
||||
kbdev->as_to_kctx[free_as] = kctx;
|
||||
KBASE_TLSTREAM_TL_KBASE_CTX_ASSIGN_AS(kbdev, kctx->id, free_as);
|
||||
KBASE_TLSTREAM_TL_KBASE_CTX_ASSIGN_AS(kbdev, kctx->id,
|
||||
(u32)free_as);
|
||||
kbase_mmu_update(kbdev, &kctx->mmu, kctx->as_nr);
|
||||
}
|
||||
} else {
|
||||
|
|
@ -198,7 +199,7 @@ void kbase_ctx_sched_release_ctx(struct kbase_context *kctx)
|
|||
}
|
||||
}
|
||||
|
||||
KBASE_KTRACE_ADD(kbdev, SCHED_RELEASE_CTX, kctx, new_ref_count);
|
||||
KBASE_KTRACE_ADD(kbdev, SCHED_RELEASE_CTX, kctx, (u64)new_ref_count);
|
||||
}
|
||||
|
||||
void kbase_ctx_sched_remove_ctx(struct kbase_context *kctx)
|
||||
|
|
@ -340,7 +341,7 @@ bool kbase_ctx_sched_inc_refcount_nolock(struct kbase_context *kctx)
|
|||
|
||||
kbase_ctx_sched_retain_ctx_refcount(kctx);
|
||||
KBASE_KTRACE_ADD(kctx->kbdev, SCHED_RETAIN_CTX_NOLOCK, kctx,
|
||||
kbase_ktrace_get_ctx_refcnt(kctx));
|
||||
(u64)kbase_ktrace_get_ctx_refcnt(kctx));
|
||||
result = true;
|
||||
}
|
||||
|
||||
|
|
@ -408,7 +409,7 @@ bool kbase_ctx_sched_inc_refcount_if_as_valid(struct kbase_context *kctx)
|
|||
kbdev->as_free &= ~(1u << kctx->as_nr);
|
||||
|
||||
KBASE_KTRACE_ADD(kbdev, SCHED_RETAIN_CTX_NOLOCK, kctx,
|
||||
kbase_ktrace_get_ctx_refcnt(kctx));
|
||||
(u64)kbase_ktrace_get_ctx_refcnt(kctx));
|
||||
added_ref = true;
|
||||
}
|
||||
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user