mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-08-31 14:13:39 +00:00

The first supported GPU only used a single power domain so this was automatically handled by the device runtime. In order to support multiple power domains, they must be enumerated from devicetree and linked to both the GPU device and each other to ensure correct power sequencing at start time. For all Imagination Rogue GPUs, power domains are named "a", "b", etc. and the sequence A->B->... is always valid for startup with the reverse true for shutdown. Note this is not always the *only* valid sequence, but it's simple and does not require special-casing for different GPU power topologies. Reviewed-by: Frank Binns <frank.binns@imgtec.com> Link: https://lore.kernel.org/r/20250410-sets-bxs-4-64-patch-v1-v6-5-eda620c5865f@imgtec.com Signed-off-by: Matt Coster <matt.coster@imgtec.com>
45 lines
1.1 KiB
C
45 lines
1.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only OR MIT */
|
|
/* Copyright (c) 2023 Imagination Technologies Ltd. */
|
|
|
|
#ifndef PVR_POWER_H
|
|
#define PVR_POWER_H
|
|
|
|
#include "pvr_device.h"
|
|
|
|
#include <linux/mutex.h>
|
|
#include <linux/pm_runtime.h>
|
|
|
|
int pvr_watchdog_init(struct pvr_device *pvr_dev);
|
|
void pvr_watchdog_fini(struct pvr_device *pvr_dev);
|
|
|
|
void pvr_device_lost(struct pvr_device *pvr_dev);
|
|
|
|
bool pvr_power_is_idle(struct pvr_device *pvr_dev);
|
|
|
|
int pvr_power_device_suspend(struct device *dev);
|
|
int pvr_power_device_resume(struct device *dev);
|
|
int pvr_power_device_idle(struct device *dev);
|
|
|
|
int pvr_power_reset(struct pvr_device *pvr_dev, bool hard_reset);
|
|
|
|
static __always_inline int
|
|
pvr_power_get(struct pvr_device *pvr_dev)
|
|
{
|
|
struct drm_device *drm_dev = from_pvr_device(pvr_dev);
|
|
|
|
return pm_runtime_resume_and_get(drm_dev->dev);
|
|
}
|
|
|
|
static __always_inline int
|
|
pvr_power_put(struct pvr_device *pvr_dev)
|
|
{
|
|
struct drm_device *drm_dev = from_pvr_device(pvr_dev);
|
|
|
|
return pm_runtime_put(drm_dev->dev);
|
|
}
|
|
|
|
int pvr_power_domains_init(struct pvr_device *pvr_dev);
|
|
void pvr_power_domains_fini(struct pvr_device *pvr_dev);
|
|
|
|
#endif /* PVR_POWER_H */
|