From a9785995d5f22aaeb659285f8aeb64d8b56982e0 Mon Sep 17 00:00:00 2001 From: Arto Merilainen Date: Wed, 19 Mar 2014 09:38:25 +0200 Subject: gpu: nvgpu: Add NVIDIA GPU Driver This patch moves the NVIDIA GPU driver to a new location. Bug 1482562 Change-Id: I24293810b9d0f1504fd9be00135e21dad656ccb6 Signed-off-by: Arto Merilainen Reviewed-on: http://git-master/r/383722 Reviewed-by: Terje Bergstrom --- drivers/gpu/nvgpu/gk20a/platform_gk20a.h | 160 +++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 drivers/gpu/nvgpu/gk20a/platform_gk20a.h (limited to 'drivers/gpu/nvgpu/gk20a/platform_gk20a.h') diff --git a/drivers/gpu/nvgpu/gk20a/platform_gk20a.h b/drivers/gpu/nvgpu/gk20a/platform_gk20a.h new file mode 100644 index 00000000..09f348cb --- /dev/null +++ b/drivers/gpu/nvgpu/gk20a/platform_gk20a.h @@ -0,0 +1,160 @@ +/* + * drivers/video/tegra/host/gk20a/soc/platform_gk20a.h + * + * GK20A Platform (SoC) Interface + * + * Copyright (c) 2014, NVIDIA CORPORATION. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope 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. + */ + +#ifndef _GK20A_PLATFORM_H_ +#define _GK20A_PLATFORM_H_ + +#include +#include + +struct gk20a; +struct channel_gk20a; +struct gr_ctx_buffer_desc; +struct gk20a_scale_profile; + +struct gk20a_platform { +#ifdef CONFIG_TEGRA_GK20A + u32 syncpt_base; +#endif + /* Populated by the gk20a driver before probing the platform. */ + struct gk20a *g; + + /* Should be populated at probe. */ + bool can_railgate; + + /* Should be populated at probe. */ + bool has_syncpoints; + + /* Should be populated by probe. */ + struct dentry *debugfs; + + /* Clock configuration is stored here. Platform probe is responsible + * for filling this data. */ + struct clk *clk[3]; + int num_clks; + + /* Delay before rail gated */ + int railgate_delay; + + /* Delay before clock gated */ + int clockgate_delay; + + /* Initialize the platform interface of the gk20a driver. + * + * The platform implementation of this function must + * - set the power and clocks of the gk20a device to a known + * state, and + * - populate the gk20a_platform structure (a pointer to the + * structure can be obtained by calling gk20a_get_platform). + * + * After this function is finished, the driver will initialise + * pm runtime and genpd based on the platform configuration. + */ + int (*probe)(struct platform_device *dev); + + /* Second stage initialisation - called once all power management + * initialisations are done. + */ + int (*late_probe)(struct platform_device *dev); + + /* Called before submitting work to the gpu. The platform may use this + * hook to ensure that any other hw modules that the gpu depends on are + * powered. The platform implementation must count refs to this call. */ + int (*channel_busy)(struct platform_device *dev); + + /* Called after the work on the gpu is completed. The platform may use + * this hook to release power refs to any other hw modules that the gpu + * depends on. The platform implementation must count refs to this + * call. */ + void (*channel_idle)(struct platform_device *dev); + + /* This function is called to allocate secure memory (memory that the + * CPU cannot see). The function should fill the context buffer + * descriptor (especially fields destroy, sgt, size). + */ + int (*secure_alloc)(struct platform_device *dev, + struct gr_ctx_buffer_desc *desc, + size_t size); + + /* Device is going to be suspended */ + int (*suspend)(struct device *); + + /* Called to turn off the device */ + int (*railgate)(struct platform_device *dev); + + /* Called to turn on the device */ + int (*unrailgate)(struct platform_device *dev); + + /* Postscale callback is called after frequency change */ + void (*postscale)(struct platform_device *pdev, + unsigned long freq); + + /* Pre callback is called before frequency change */ + void (*prescale)(struct platform_device *pdev); + + /* Devfreq governor name. If scaling is enabled, we request + * this governor to be used in scaling */ + const char *devfreq_governor; + + /* Quality of service id. If this is set, the scaling routines + * will register a callback to id. Each time we receive a new value, + * the postscale callback gets called. */ + int qos_id; + + /* Called as part of debug dump. If the gpu gets hung, this function + * is responsible for delivering all necessary debug data of other + * hw units which may interact with the gpu without direct supervision + * of the CPU. + */ + void (*dump_platform_dependencies)(struct platform_device *dev); +}; + +static inline struct gk20a_platform *gk20a_get_platform( + struct platform_device *dev) +{ + return (struct gk20a_platform *)platform_get_drvdata(dev); +} + +extern struct gk20a_platform gk20a_generic_platform; +#ifdef CONFIG_TEGRA_GK20A +extern struct gk20a_platform gk20a_tegra_platform; +#endif + +static inline int gk20a_platform_channel_busy(struct platform_device *dev) +{ + struct gk20a_platform *p = gk20a_get_platform(dev); + int ret = 0; + if (p->channel_busy) + ret = p->channel_busy(dev); + + return ret; +} + +static inline void gk20a_platform_channel_idle(struct platform_device *dev) +{ + struct gk20a_platform *p = gk20a_get_platform(dev); + if (p->channel_idle) + p->channel_idle(dev); +} + +static inline bool gk20a_platform_has_syncpoints(struct platform_device *dev) +{ + struct gk20a_platform *p = gk20a_get_platform(dev); + return p->has_syncpoints; +} + +#endif -- cgit v1.2.2