blob: 122505e4c0813d62f4b2439a5d94068855bf68fc [file] [log] [blame]
Jordan Crouseb3115fe2012-02-01 22:11:12 -07001/* Copyright (c) 2012, Code Aurora Forum. All rights reserved.
2 *
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
14#include <linux/init.h>
15#include <linux/platform_device.h>
Jordan Crouse914de9b2012-07-09 13:49:46 -060016#include <mach/kgsl.h>
Jordan Crouseb3115fe2012-02-01 22:11:12 -070017#include <mach/msm_bus_board.h>
18#include <mach/board.h>
Lucille Sylvester6e362412011-12-09 16:21:42 -070019#include <mach/msm_dcvs.h>
Jordan Crouse4815e9f2012-07-09 15:36:37 -060020#include <mach/socinfo.h>
Jordan Crouseb3115fe2012-02-01 22:11:12 -070021
22#include "devices.h"
23#include "board-8064.h"
24
Lucille Sylvester6e362412011-12-09 16:21:42 -070025#ifdef CONFIG_MSM_DCVS
26static struct msm_dcvs_freq_entry grp3d_freq[] = {
27 {0, 0, 333932},
28 {0, 0, 497532},
29 {0, 0, 707610},
30 {0, 0, 844545},
31};
32
33static struct msm_dcvs_core_info grp3d_core_info = {
34 .freq_tbl = &grp3d_freq[0],
35 .core_param = {
36 .max_time_us = 100000,
37 .num_freq = ARRAY_SIZE(grp3d_freq),
38 },
39 .algo_param = {
40 .slack_time_us = 39000,
41 .disable_pc_threshold = 86000,
42 .ss_window_size = 1000000,
43 .ss_util_pct = 95,
44 .em_max_util_pct = 97,
45 .ss_iobusy_conv = 100,
46 },
47};
48#endif /* CONFIG_MSM_DCVS */
49
Jordan Crouseb3115fe2012-02-01 22:11:12 -070050#ifdef CONFIG_MSM_BUS_SCALING
51static struct msm_bus_vectors grp3d_init_vectors[] = {
52 {
53 .src = MSM_BUS_MASTER_GRAPHICS_3D,
54 .dst = MSM_BUS_SLAVE_EBI_CH0,
55 .ab = 0,
56 .ib = 0,
57 },
58 {
59 .src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1,
60 .dst = MSM_BUS_SLAVE_EBI_CH0,
61 .ab = 0,
62 .ib = 0,
63 },
64};
65
66static struct msm_bus_vectors grp3d_low_vectors[] = {
67 {
68 .src = MSM_BUS_MASTER_GRAPHICS_3D,
69 .dst = MSM_BUS_SLAVE_EBI_CH0,
70 .ab = 0,
Lucille Sylvesterf6b4ce32012-05-11 11:10:18 -060071 .ib = KGSL_CONVERT_TO_MBPS(1000),
72 },
73 {
74 .src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1,
75 .dst = MSM_BUS_SLAVE_EBI_CH0,
76 .ab = 0,
77 .ib = KGSL_CONVERT_TO_MBPS(1000),
78 },
79};
80
81static struct msm_bus_vectors grp3d_nominal_low_vectors[] = {
82 {
83 .src = MSM_BUS_MASTER_GRAPHICS_3D,
84 .dst = MSM_BUS_SLAVE_EBI_CH0,
85 .ab = 0,
Jordan Crouseb3115fe2012-02-01 22:11:12 -070086 .ib = KGSL_CONVERT_TO_MBPS(2000),
87 },
88 {
89 .src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1,
90 .dst = MSM_BUS_SLAVE_EBI_CH0,
91 .ab = 0,
92 .ib = KGSL_CONVERT_TO_MBPS(2000),
93 },
94};
95
96static struct msm_bus_vectors grp3d_nominal_high_vectors[] = {
97 {
98 .src = MSM_BUS_MASTER_GRAPHICS_3D,
99 .dst = MSM_BUS_SLAVE_EBI_CH0,
100 .ab = 0,
Lucille Sylvester26615342012-06-26 17:55:10 -0600101 .ib = KGSL_CONVERT_TO_MBPS(2656),
Jordan Crouseb3115fe2012-02-01 22:11:12 -0700102 },
103 {
104 .src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1,
105 .dst = MSM_BUS_SLAVE_EBI_CH0,
106 .ab = 0,
Lucille Sylvester26615342012-06-26 17:55:10 -0600107 .ib = KGSL_CONVERT_TO_MBPS(2656),
Jordan Crouseb3115fe2012-02-01 22:11:12 -0700108 },
109};
110
111static struct msm_bus_vectors grp3d_max_vectors[] = {
112 {
113 .src = MSM_BUS_MASTER_GRAPHICS_3D,
114 .dst = MSM_BUS_SLAVE_EBI_CH0,
115 .ab = 0,
116 .ib = KGSL_CONVERT_TO_MBPS(4264),
117 },
118 {
119 .src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1,
120 .dst = MSM_BUS_SLAVE_EBI_CH0,
121 .ab = 0,
122 .ib = KGSL_CONVERT_TO_MBPS(4264),
123 },
124};
125
126static struct msm_bus_paths grp3d_bus_scale_usecases[] = {
127 {
128 ARRAY_SIZE(grp3d_init_vectors),
129 grp3d_init_vectors,
130 },
131 {
132 ARRAY_SIZE(grp3d_low_vectors),
133 grp3d_low_vectors,
134 },
135 {
Lucille Sylvesterf6b4ce32012-05-11 11:10:18 -0600136 ARRAY_SIZE(grp3d_nominal_low_vectors),
137 grp3d_nominal_low_vectors,
138 },
139 {
Jordan Crouseb3115fe2012-02-01 22:11:12 -0700140 ARRAY_SIZE(grp3d_nominal_high_vectors),
141 grp3d_nominal_high_vectors,
142 },
143 {
144 ARRAY_SIZE(grp3d_max_vectors),
145 grp3d_max_vectors,
146 },
147};
148
149static struct msm_bus_scale_pdata grp3d_bus_scale_pdata = {
150 grp3d_bus_scale_usecases,
151 ARRAY_SIZE(grp3d_bus_scale_usecases),
152 .name = "grp3d",
153};
154#endif
155
156static struct resource kgsl_3d0_resources[] = {
157 {
158 .name = KGSL_3D0_REG_MEMORY,
159 .start = 0x04300000, /* GFX3D address */
160 .end = 0x0431ffff,
161 .flags = IORESOURCE_MEM,
162 },
163 {
164 .name = KGSL_3D0_IRQ,
165 .start = GFX3D_IRQ,
166 .end = GFX3D_IRQ,
167 .flags = IORESOURCE_IRQ,
168 },
169};
170
Shubhraprakash Daseb6df1d2012-05-01 00:55:35 -0600171static const struct kgsl_iommu_ctx kgsl_3d0_iommu0_ctxs[] = {
172 { "gfx3d_user", 0 },
173 { "gfx3d_priv", 1 },
Jordan Crouse46cf4bb2012-02-21 08:54:52 -0700174};
175
Shubhraprakash Daseb6df1d2012-05-01 00:55:35 -0600176static const struct kgsl_iommu_ctx kgsl_3d0_iommu1_ctxs[] = {
177 { "gfx3d1_user", 0 },
178 { "gfx3d1_priv", 1 },
Jordan Crouse46cf4bb2012-02-21 08:54:52 -0700179};
180
181static struct kgsl_device_iommu_data kgsl_3d0_iommu_data[] = {
182 {
Shubhraprakash Daseb6df1d2012-05-01 00:55:35 -0600183 .iommu_ctxs = kgsl_3d0_iommu0_ctxs,
184 .iommu_ctx_count = ARRAY_SIZE(kgsl_3d0_iommu0_ctxs),
Jordan Crouse46cf4bb2012-02-21 08:54:52 -0700185 .physstart = 0x07C00000,
186 .physend = 0x07C00000 + SZ_1M - 1,
187 },
188 {
Shubhraprakash Daseb6df1d2012-05-01 00:55:35 -0600189 .iommu_ctxs = kgsl_3d0_iommu1_ctxs,
190 .iommu_ctx_count = ARRAY_SIZE(kgsl_3d0_iommu1_ctxs),
Jordan Crouse46cf4bb2012-02-21 08:54:52 -0700191 .physstart = 0x07D00000,
192 .physend = 0x07D00000 + SZ_1M - 1,
193 },
194};
195
Jordan Crouseb3115fe2012-02-01 22:11:12 -0700196static struct kgsl_device_platform_data kgsl_3d0_pdata = {
197 .pwrlevel = {
198 {
Tarun Karra3c2cc9e2012-02-17 14:58:07 -0800199 .gpu_freq = 400000000,
Lucille Sylvesterf6b4ce32012-05-11 11:10:18 -0600200 .bus_freq = 4,
Tarun Karra3c2cc9e2012-02-17 14:58:07 -0800201 .io_fraction = 0,
Jordan Crouseb3115fe2012-02-01 22:11:12 -0700202 },
203 {
Lucille Sylvester0c779a92012-03-30 16:51:27 -0600204 .gpu_freq = 325000000,
Lucille Sylvesterf6b4ce32012-05-11 11:10:18 -0600205 .bus_freq = 3,
Tarun Karra3c2cc9e2012-02-17 14:58:07 -0800206 .io_fraction = 33,
Jordan Crouseb3115fe2012-02-01 22:11:12 -0700207 },
208 {
Lucille Sylvester0c779a92012-03-30 16:51:27 -0600209 .gpu_freq = 200000000,
Lucille Sylvesterf6b4ce32012-05-11 11:10:18 -0600210 .bus_freq = 2,
211 .io_fraction = 100,
212 },
213 {
214 .gpu_freq = 128000000,
Tarun Karra71853702012-02-17 15:21:59 -0800215 .bus_freq = 1,
Jordan Crouseb3115fe2012-02-01 22:11:12 -0700216 .io_fraction = 100,
217 },
218 {
Tarun Karra3c2cc9e2012-02-17 14:58:07 -0800219 .gpu_freq = 27000000,
220 .bus_freq = 0,
Jordan Crouseb3115fe2012-02-01 22:11:12 -0700221 },
222 },
Lucille Sylvester37a02d32012-04-25 17:21:06 -0600223 .init_level = 1,
Lucille Sylvesterf6b4ce32012-05-11 11:10:18 -0600224 .num_levels = 5,
Jordan Crouseb3115fe2012-02-01 22:11:12 -0700225 .set_grp_async = NULL,
Suman Tatiraju3bd641e2012-04-11 10:46:11 -0700226 .idle_timeout = HZ/10,
Jordan Crouseb3115fe2012-02-01 22:11:12 -0700227 .nap_allowed = true,
Lucille Sylvestera448aeb2012-06-12 16:30:29 -0600228 .strtstp_sleepwake = true,
Jordan Crouseb3115fe2012-02-01 22:11:12 -0700229 .clk_map = KGSL_CLK_CORE | KGSL_CLK_IFACE | KGSL_CLK_MEM_IFACE,
230#ifdef CONFIG_MSM_BUS_SCALING
231 .bus_scale_table = &grp3d_bus_scale_pdata,
232#endif
Jordan Crouse46cf4bb2012-02-21 08:54:52 -0700233 .iommu_data = kgsl_3d0_iommu_data,
234 .iommu_count = ARRAY_SIZE(kgsl_3d0_iommu_data),
Lucille Sylvester6e362412011-12-09 16:21:42 -0700235#ifdef CONFIG_MSM_DCVS
236 .core_info = &grp3d_core_info,
237#endif
Jordan Crouseb3115fe2012-02-01 22:11:12 -0700238};
239
240struct platform_device device_kgsl_3d0 = {
241 .name = "kgsl-3d0",
242 .id = 0,
243 .num_resources = ARRAY_SIZE(kgsl_3d0_resources),
244 .resource = kgsl_3d0_resources,
245 .dev = {
246 .platform_data = &kgsl_3d0_pdata,
247 },
248};
249
250void __init apq8064_init_gpu(void)
251{
Jordan Crouse4815e9f2012-07-09 15:36:37 -0600252 unsigned int version = socinfo_get_version();
253
254 if ((SOCINFO_VERSION_MAJOR(version) == 1) &&
255 (SOCINFO_VERSION_MINOR(version) == 1))
256 kgsl_3d0_pdata.chipid = ADRENO_CHIPID(3, 2, 0, 1);
257 else
258 kgsl_3d0_pdata.chipid = ADRENO_CHIPID(3, 2, 0, 0);
259
Jordan Crouseb3115fe2012-02-01 22:11:12 -0700260 platform_device_register(&device_kgsl_3d0);
261}