blob: dd7079494ff7130e62467f6b170564b5a20e22ed [file] [log] [blame]
Benjamin Chan59a06052017-01-12 18:06:03 -05001/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
Adrian Salido-Moreno5c150382016-04-06 09:29:37 -07002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#ifndef __SDE_ROTATOR_BASE_H__
14#define __SDE_ROTATOR_BASE_H__
15
16#include <linux/types.h>
17#include <linux/file.h>
18#include <linux/kref.h>
19#include <linux/kernel.h>
20#include <linux/regulator/consumer.h>
21
22#include "sde_rotator_hwio.h"
23#include "sde_rotator_io_util.h"
24#include "sde_rotator_smmu.h"
25#include "sde_rotator_formats.h"
26
Alan Kwong8365a582016-12-28 10:22:42 -080027/* HW Revisions for different targets */
28#define SDE_GET_MAJOR_REV(rev) ((rev) >> 28)
29#define SDE_GET_MAJOR_MINOR(rev) ((rev) >> 16)
30#define IS_SDE_MAJOR_MINOR_SAME(rev1, rev2) \
31 (SDE_GET_MAJOR_MINOR(rev1) == SDE_GET_MAJOR_MINOR(rev2))
32
33#define SDE_MDP_REV(major, minor, step) \
34 ((((major) & 0x000F) << 28) | \
35 (((minor) & 0x0FFF) << 16) | \
36 ((step) & 0xFFFF))
37
38#define SDE_MDP_HW_REV_107 SDE_MDP_REV(1, 0, 7) /* 8996 v1.0 */
39#define SDE_MDP_HW_REV_300 SDE_MDP_REV(3, 0, 0) /* 8998 v1.0 */
40#define SDE_MDP_HW_REV_301 SDE_MDP_REV(3, 0, 1) /* 8998 v1.1 */
41#define SDE_MDP_HW_REV_400 SDE_MDP_REV(4, 0, 0) /* sdm845 v1.0 */
42
Adrian Salido-Moreno5c150382016-04-06 09:29:37 -070043struct sde_mult_factor {
44 uint32_t numer;
45 uint32_t denom;
46};
47
48struct sde_mdp_set_ot_params {
49 u32 xin_id;
50 u32 num;
51 u32 width;
52 u32 height;
Alan Kwongeffb5ee2016-03-12 19:47:45 -050053 u32 fps;
54 u32 fmt;
Adrian Salido-Moreno5c150382016-04-06 09:29:37 -070055 u32 reg_off_vbif_lim_conf;
56 u32 reg_off_mdp_clk_ctrl;
57 u32 bit_off_mdp_clk_ctrl;
Benjamin Chan1b94f952017-01-23 17:42:30 -050058 char __iomem *rotsts_base;
59 u32 rotsts_busy_mask;
Adrian Salido-Moreno5c150382016-04-06 09:29:37 -070060};
61
62enum sde_bus_vote_type {
63 VOTE_INDEX_DISABLE,
64 VOTE_INDEX_19_MHZ,
65 VOTE_INDEX_40_MHZ,
66 VOTE_INDEX_80_MHZ,
67 VOTE_INDEX_MAX,
68};
69
70#define MAX_CLIENT_NAME_LEN 64
71
72enum sde_qos_settings {
73 SDE_QOS_PER_PIPE_IB,
74 SDE_QOS_OVERHEAD_FACTOR,
75 SDE_QOS_CDP,
76 SDE_QOS_OTLIM,
77 SDE_QOS_PER_PIPE_LUT,
78 SDE_QOS_SIMPLIFIED_PREFILL,
79 SDE_QOS_VBLANK_PANIC_CTRL,
80 SDE_QOS_MAX,
81};
82
Benjamin Chanfb6faa32016-08-16 17:21:01 -040083/**
84 * enum sde_rot_type: SDE rotator HW version
85 * @SDE_ROT_TYPE_V1_0: V1.0 HW version
86 * @SDE_ROT_TYPE_V1_1: V1.1 HW version
87 */
88enum sde_rot_type {
89 SDE_ROT_TYPE_V1_0 = 0x10000000,
90 SDE_ROT_TYPE_V1_1 = 0x10010000,
91 SDE_ROT_TYPE_MAX,
92};
93
94/**
95 * enum sde_caps_settings: SDE rotator capability definition
96 * @SDE_CAPS_R1_WB: MDSS V1.x WB block
97 * @SDE_CAPS_R3_WB: MDSS V3.x WB block
98 * @SDE_CAPS_R3_1P5_DOWNSCALE: 1.5x downscale rotator support
Alan Kwong6bc64622017-02-04 17:36:03 -080099 * @SDE_CAPS_SBUF_1: stream buffer support for inline rotation
Benjamin Chanfb6faa32016-08-16 17:21:01 -0400100 */
Adrian Salido-Moreno5c150382016-04-06 09:29:37 -0700101enum sde_caps_settings {
102 SDE_CAPS_R1_WB,
103 SDE_CAPS_R3_WB,
Benjamin Chanfb6faa32016-08-16 17:21:01 -0400104 SDE_CAPS_R3_1P5_DOWNSCALE,
Abhijit Kulkarni298c8232016-09-26 22:32:10 -0700105 SDE_CAPS_SEC_ATTACH_DETACH_SMMU,
Alan Kwong6bc64622017-02-04 17:36:03 -0800106 SDE_CAPS_SBUF_1,
Adrian Salido-Moreno5c150382016-04-06 09:29:37 -0700107 SDE_CAPS_MAX,
108};
109
110enum sde_bus_clients {
111 SDE_ROT_RT,
112 SDE_ROT_NRT,
113 SDE_MAX_BUS_CLIENTS
114};
115
Benjamin Chan53e3bce2016-08-31 14:43:29 -0400116enum sde_rot_regdump_access {
117 SDE_ROT_REGDUMP_READ,
118 SDE_ROT_REGDUMP_WRITE,
Benjamin Chan59a06052017-01-12 18:06:03 -0500119 SDE_ROT_REGDUMP_VBIF,
Benjamin Chan53e3bce2016-08-31 14:43:29 -0400120 SDE_ROT_REGDUMP_MAX
121};
122
Adrian Salido-Moreno5c150382016-04-06 09:29:37 -0700123struct reg_bus_client {
124 char name[MAX_CLIENT_NAME_LEN];
125 short usecase_ndx;
126 u32 id;
127 struct list_head list;
128};
129
130struct sde_smmu_client {
131 struct device *dev;
132 struct dma_iommu_mapping *mmu_mapping;
133 struct sde_module_power mp;
134 struct reg_bus_client *reg_bus_clt;
135 bool domain_attached;
Abhijit Kulkarni298c8232016-09-26 22:32:10 -0700136 int domain;
Adrian Salido-Moreno5c150382016-04-06 09:29:37 -0700137};
138
Benjamin Chan53e3bce2016-08-31 14:43:29 -0400139struct sde_rot_vbif_debug_bus {
140 u32 disable_bus_addr;
141 u32 block_bus_addr;
142 u32 bit_offset;
143 u32 block_cnt;
144 u32 test_pnt_cnt;
145};
146
147struct sde_rot_regdump {
148 char *name;
149 u32 offset;
150 u32 len;
151 enum sde_rot_regdump_access access;
152};
153
Adrian Salido-Moreno5c150382016-04-06 09:29:37 -0700154struct sde_rot_data_type {
155 u32 mdss_version;
156
157 struct platform_device *pdev;
158 struct sde_io_data sde_io;
159 struct sde_io_data vbif_nrt_io;
160 char __iomem *mdp_base;
161
162 struct sde_smmu_client sde_smmu[SDE_IOMMU_MAX_DOMAIN];
163
164 /* bitmap to track qos applicable settings */
165 DECLARE_BITMAP(sde_qos_map, SDE_QOS_MAX);
166
167 /* bitmap to track capability settings */
168 DECLARE_BITMAP(sde_caps_map, SDE_CAPS_MAX);
169
170 u32 default_ot_rd_limit;
171 u32 default_ot_wr_limit;
172 u32 highest_bank_bit;
173 u32 rot_block_size;
174
175 /* register bus (AHB) */
176 u32 reg_bus_hdl;
177 u32 reg_bus_usecase_ndx;
178 struct list_head reg_bus_clist;
179 struct mutex reg_bus_lock;
180
181 u32 *vbif_rt_qos;
182 u32 *vbif_nrt_qos;
183 u32 npriority_lvl;
184
185 int iommu_attached;
186 int iommu_ref_cnt;
Benjamin Chan53e3bce2016-08-31 14:43:29 -0400187
188 struct sde_rot_vbif_debug_bus *nrt_vbif_dbg_bus;
189 u32 nrt_vbif_dbg_bus_size;
190
191 struct sde_rot_regdump *regdump;
192 u32 regdump_size;
193
194 void *sde_rot_hw;
Abhijit Kulkarni298c8232016-09-26 22:32:10 -0700195 int sec_cam_en;
196
197 struct ion_client *iclient;
Adrian Salido-Moreno5c150382016-04-06 09:29:37 -0700198};
199
200int sde_rotator_base_init(struct sde_rot_data_type **pmdata,
201 struct platform_device *pdev,
202 const void *drvdata);
203
204void sde_rotator_base_destroy(struct sde_rot_data_type *data);
205
206struct sde_rot_data_type *sde_rot_get_mdata(void);
207
208struct reg_bus_client *sde_reg_bus_vote_client_create(char *client_name);
209
210void sde_reg_bus_vote_client_destroy(struct reg_bus_client *client);
211
212int sde_update_reg_bus_vote(struct reg_bus_client *bus_client, u32 usecase_ndx);
213
214u32 sde_apply_comp_ratio_factor(u32 quota,
215 struct sde_mdp_format_params *fmt,
216 struct sde_mult_factor *factor);
217
Alan Kwongeffb5ee2016-03-12 19:47:45 -0500218u32 sde_mdp_get_ot_limit(u32 width, u32 height, u32 pixfmt, u32 fps, u32 is_rd);
219
Adrian Salido-Moreno5c150382016-04-06 09:29:37 -0700220void sde_mdp_set_ot_limit(struct sde_mdp_set_ot_params *params);
221
222#define SDE_VBIF_WRITE(mdata, offset, value) \
223 (sde_reg_w(&mdata->vbif_nrt_io, offset, value, 0))
224#define SDE_VBIF_READ(mdata, offset) \
225 (sde_reg_r(&mdata->vbif_nrt_io, offset, 0))
226#define SDE_REG_WRITE(mdata, offset, value) \
227 sde_reg_w(&mdata->sde_io, offset, value, 0)
228#define SDE_REG_READ(mdata, offset) \
229 sde_reg_r(&mdata->sde_io, offset, 0)
230
231#define ATRACE_END(name) trace_rot_mark_write(current->tgid, name, 0)
232#define ATRACE_BEGIN(name) trace_rot_mark_write(current->tgid, name, 1)
233#define ATRACE_INT(name, value) \
234 trace_rot_trace_counter(current->tgid, name, value)
235
236#endif /* __SDE_ROTATOR_BASE__ */