/* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef __ADRENO_A6XX_RGMU_H #define __ADRENO_A6XX_RGMU_H #define RGMU_AO_IRQ_FENCE_ERR BIT(3) #define RGMU_AO_IRQ_MASK RGMU_AO_IRQ_FENCE_ERR #define RGMU_OOB_IRQ_ERR_MSG BIT(24) #define RGMU_OOB_IRQ_ACK_MASK GENMASK(23, 16) #define RGMU_OOB_IRQ_ERR_MSG_MASK GENMASK(31, 24) #define RGMU_OOB_IRQ_MASK RGMU_OOB_IRQ_ERR_MSG_MASK #define MAX_RGMU_CLKS 8 enum { /* @RGMU_PRIV_FIRST_BOOT_DONE: The very first ggpu boot is done */ RGMU_PRIV_FIRST_BOOT_DONE, /* @RGMU_PRIV_GPU_STARTED: GPU has been started */ RGMU_PRIV_GPU_STARTED, /* @RGMU_PRIV_PM_SUSPEND: The rgmu driver is suspended */ RGMU_PRIV_PM_SUSPEND, }; /** * struct a6xx_rgmu_device - rGMU device structure * @ver: RGMU firmware version * @rgmu_interrupt_num: RGMU interrupt number * @oob_interrupt_num: number of RGMU asserted OOB interrupt * @fw_hostptr: Buffer which holds the RGMU firmware * @fw_size: Size of RGMU firmware buffer * @clks: RGMU clocks including the GPU * @gpu_clk: Pointer to GPU core clock * @rgmu_clk: Pointer to rgmu clock * @flags: RGMU flags * @idle_level: Minimal GPU idle power level * @fault_count: RGMU fault count */ struct a6xx_rgmu_device { u32 ver; struct platform_device *pdev; unsigned int rgmu_interrupt_num; unsigned int oob_interrupt_num; unsigned int *fw_hostptr; uint32_t fw_size; struct clk_bulk_data *clks; /** @num_clks: Number of clocks in @clks */ int num_clks; struct clk *gpu_clk; struct clk *rgmu_clk; unsigned int idle_level; unsigned int fault_count; /** @flags: rgmu internal flags */ unsigned long flags; /** @num_oob_perfcntr: Number of active oob_perfcntr requests */ u32 num_oob_perfcntr; }; /** * a6xx_rgmu_device_probe - Probe a6xx rgmu resources * @pdev: Pointer to the platform device * @chipid: Chipid of the target * @gpucore: Pointer to the gpucore * * The target specific probe function for rgmu based a6xx targets. */ int a6xx_rgmu_device_probe(struct platform_device *pdev, u32 chipid, const struct adreno_gpu_core *gpucore); /** * a6xx_rgmu_reset - Reset and restart the rgmu * @adreno_dev: Pointer to the adreno device * * Return: 0 on success or negative error on failure */ int a6xx_rgmu_reset(struct adreno_device *adreno_dev); /** * a6xx_rgmu_snapshot - Take snapshot for rgmu based targets * @adreno_dev: Pointer to the adreno device * @snapshot: Pointer to the snapshot * * This function halts rgmu execution if we hit a rgmu * fault. And then, it takes rgmu and gpu snapshot. */ void a6xx_rgmu_snapshot(struct adreno_device *adreno_dev, struct kgsl_snapshot *snapshot); /** * a6xx_rgmu_add_to_minidump - Register a6xx_device with va minidump * @adreno_dev: Pointer to the adreno device */ int a6xx_rgmu_add_to_minidump(struct adreno_device *adreno_dev); /** * a6xx_rgmu_gx_is_on() - Check if GX is on using pwr status register * @adreno_dev: Pointer to the adreno device * * This check should only be performed if the keepalive bit is set or it * can be guaranteed that the power state of the GPU will remain unchanged */ bool a6xx_rgmu_gx_is_on(struct adreno_device *adreno_dev); #endif