aboutsummaryrefslogtreecommitdiff
path: root/drivers/gpu/arm/mali/platform/mali_platform.h
blob: 3d2a4ee56cb3c623845a1f5e258b82d10959fc15 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/*
 * Copyright (C) 2010-2012 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 licence.
 * 
 * A copy of the licence is included with the program, and can also be
 * obtained from Free Software Foundation, Inc., 51
 * Franklin Street Fifth Floor, Boston, MA  02110-1301, USA.
 */
#ifndef __MALI_PLATFORM_H__
#define __MALI_PLATFORM_H__

#include <linux/clk.h>
#include <linux/err.h>
#include <linux/platform_device.h>
#include <linux/regulator/consumer.h>
#include <linux/regulator/driver.h>


#include "mali_osk.h"

#if !USING_MALI_PMM
/* @brief System power up/down cores that can be passed into
 * mali_platform_powerdown/up()
 */
#define MALI_PLATFORM_SYSTEM  0
#endif

#ifdef __cplusplus
extern "C" {
#endif

#define MPLLCLK_NAME            "mout_mpll"
#define GPUMOUT0CLK_NAME        "mout_g3d0"
#define GPUCLK_NAME             "sclk_g3d"
#define CLK_DIV_STAT_G3D        0x1003C62C
#define CLK_DESC                "clk-divider-status"

extern struct platform_device mali_gpu_device;
/* @brief description of power change reasons */
typedef enum mali_power_mode_tag
{
	MALI_POWER_MODE_ON,
	MALI_POWER_MODE_LIGHT_SLEEP,
	MALI_POWER_MODE_DEEP_SLEEP,
} mali_power_mode;

struct regulator {
	struct device *dev;
	struct list_head list;
	unsigned int always_on:1;
	unsigned int bypass:1;
	int uA_load;
	int min_uV;
	int max_uV;
	char *supply_name;
	struct device_attribute dev_attr;
	struct regulator_dev *rdev;
	struct dentry *debugfs;
};

int mali_regulator_get_usecount(void);

void mali_regulator_disable(void);

void mali_regulator_enable(void);

void mali_regulator_set_voltage(int min_uV, int max_uV);

mali_bool mali_clk_set_rate(unsigned int clk, unsigned int mhz);

unsigned long mali_clk_get_rate(void);

void mali_clk_put(mali_bool binc_mali_clock);

mali_bool init_mali_regulator(void);

mali_bool deinit_mali_regulator(void);


/** @brief Platform specific setup and initialisation of MALI
 *
 * This is called from the entrypoint of the driver to initialize the platform
 *
 * @return _MALI_OSK_ERR_OK on success otherwise, a suitable
 * _mali_osk_errcode_t error.
 */
_mali_osk_errcode_t mali_platform_init(void);

/** @brief Platform specific deinitialisation of MALI
 *
 * This is called on the exit of the driver to terminate the platform
 *
 * @return _MALI_OSK_ERR_OK on success otherwise, a suitable
 * _mali_osk_errcode_t error.
 */
_mali_osk_errcode_t mali_platform_deinit(void);

/** @brief Platform specific powerdown sequence of MALI
 *
 * Call as part of platform init if there is no PMM support, else the
 * PMM will call it.
 * There are three power modes defined:
 *  1) MALI_POWER_MODE_ON
 *  2) MALI_POWER_MODE_LIGHT_SLEEP
 *  3) MALI_POWER_MODE_DEEP_SLEEP
 * MALI power management module transitions to MALI_POWER_MODE_LIGHT_SLEEP mode
 * when MALI is idle for idle timer (software timer defined in
 * mali_pmm_policy_jobcontrol.h) duration, MALI transitions to
 * MALI_POWER_MODE_LIGHT_SLEEP mode during timeout if there are no more
 * jobs queued.
 * MALI power management module transitions to MALI_POWER_MODE_DEEP_SLEEP mode
 * when OS does system power off.
 * Customer has to add power down code when MALI transitions to
 * MALI_POWER_MODE_LIGHT_SLEEP or MALI_POWER_MODE_DEEP_SLEEP
 * mode.
 * MALI_POWER_MODE_ON mode is entered when the MALI is to powered up.
 * Some customers want to control voltage regulators during the whole system
 * powers on/off. Customer can track in this function whether the MALI is
 * powered up from MALI_POWER_MODE_LIGHT_SLEEP or MALI_POWER_MODE_DEEP_SLEEP
 * mode and manage the voltage regulators as well.
 * @param power_mode defines the power modes
 * @return _MALI_OSK_ERR_OK on success otherwise, a suitable
 * _mali_osk_errcode_t error.
 */
_mali_osk_errcode_t mali_platform_power_mode_change(mali_power_mode power_mode);

/** @brief Platform specific handling of GPU utilization data
 *
 * When GPU utilization data is enabled, this function will be
 * periodically called.
 *
 * @param utilization The workload utilization of the Mali GPU.
 * 0 = no utilization, 256 = full utilization.
 */
void mali_gpu_utilization_handler(u32 utilization);

/** @brief Setting the power domain of MALI
 *
 * This function sets the power domain of MALI if Linux run time power
 * management is enabled
 * @param dev Reference to struct platform_device (defined in linux) used by
 * MALI GPU
 */
void set_mali_parent_power_domain(void* dev);

/** @brief Get MALI current running frequency
 *
 * This function gets the current running frequency of MALI
 *
 * @return frequency in Hz
 */
unsigned long get_mali_platform_cur_freq(void);

#ifdef __cplusplus
}
#endif
#endif