// SPDX-License-Identifier: GPL-2.0-only OR MIT
/* Copyright (c) 2023 Imagination Technologies Ltd. */
#include <drm/drm_managed.h>
#include <drm/gpu_scheduler.h>
#include "pvr_cccb.h"
#include "pvr_context.h"
#include "pvr_device.h"
#include "pvr_drv.h"
#include "pvr_job.h"
#include "pvr_queue.h"
#include "pvr_vm.h"
#include "pvr_rogue_fwif_client.h"
#define MAX_DEADLINE_MS 30000
#define CTX_COMPUTE_CCCB_SIZE_LOG2 15
#define CTX_FRAG_CCCB_SIZE_LOG2 15
#define CTX_GEOM_CCCB_SIZE_LOG2 15
#define CTX_TRANSFER_CCCB_SIZE_LOG2 15
static int get_xfer_ctx_state_size(struct pvr_device *pvr_dev)
{
u32 num_isp_store_registers;
if (PVR_HAS_FEATURE(pvr_dev, xe_memory_hierarchy)) {
num_isp_store_registers = 1;
} else {
int err;
err = PVR_FEATURE_VALUE(pvr_dev, num_isp_ipp_pipes, &num_isp_store_registers);
if (WARN_ON(err))
return err;
}
return sizeof(struct rogue_fwif_frag_ctx_state) +
(num_isp_store_registers *
sizeof(((struct rogue_fwif_frag_ctx_state *)0)->frag_reg_isp_store[0]));
}
static int get_frag_ctx_state_size(struct pvr_device *pvr_dev)
{
u32 num_isp_store_registers;
int err;
if (PVR_HAS_FEATURE(pvr_dev, xe_memory_hierarchy)) {
err = PVR_FEATURE_VALUE(pvr_dev, num_raster_pipes, &num_isp_store_registers);
if (WARN_ON(err))
return err;
if (PVR_HAS_FEATURE(pvr_dev, gpu_multicore_support)) {
u32 xpu_max_slaves;
err = PVR_FEATURE_VALUE(pvr_dev, xpu_max_slaves, &xpu_max_slaves);
if (WARN_ON(err))
return err;
num_isp_store_registers *= (1 + xpu_max_slaves);
}
} else {
err