| Jordan Crouse | b3115fe | 2012-02-01 22:11:12 -0700 | [diff] [blame] | 1 | /* 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> | 
 | 16 | #include <linux/msm_kgsl.h> | 
 | 17 | #include <mach/msm_bus_board.h> | 
 | 18 | #include <mach/board.h> | 
| Lucille Sylvester | 6e36241 | 2011-12-09 16:21:42 -0700 | [diff] [blame] | 19 | #include <mach/msm_dcvs.h> | 
| Jordan Crouse | b3115fe | 2012-02-01 22:11:12 -0700 | [diff] [blame] | 20 |  | 
 | 21 | #include "devices.h" | 
 | 22 | #include "board-8064.h" | 
 | 23 |  | 
| Lucille Sylvester | 6e36241 | 2011-12-09 16:21:42 -0700 | [diff] [blame] | 24 | #ifdef CONFIG_MSM_DCVS | 
 | 25 | static struct msm_dcvs_freq_entry grp3d_freq[] = { | 
 | 26 | 	{0, 0, 333932}, | 
 | 27 | 	{0, 0, 497532}, | 
 | 28 | 	{0, 0, 707610}, | 
 | 29 | 	{0, 0, 844545}, | 
 | 30 | }; | 
 | 31 |  | 
 | 32 | static struct msm_dcvs_core_info grp3d_core_info = { | 
 | 33 | 	.freq_tbl = &grp3d_freq[0], | 
 | 34 | 	.core_param = { | 
 | 35 | 		.max_time_us = 100000, | 
 | 36 | 		.num_freq = ARRAY_SIZE(grp3d_freq), | 
 | 37 | 	}, | 
 | 38 | 	.algo_param = { | 
 | 39 | 		.slack_time_us = 39000, | 
 | 40 | 		.disable_pc_threshold = 86000, | 
 | 41 | 		.ss_window_size = 1000000, | 
 | 42 | 		.ss_util_pct = 95, | 
 | 43 | 		.em_max_util_pct = 97, | 
 | 44 | 		.ss_iobusy_conv = 100, | 
 | 45 | 	}, | 
 | 46 | }; | 
 | 47 | #endif /* CONFIG_MSM_DCVS */ | 
 | 48 |  | 
| Jordan Crouse | b3115fe | 2012-02-01 22:11:12 -0700 | [diff] [blame] | 49 | #ifdef CONFIG_MSM_BUS_SCALING | 
 | 50 | static struct msm_bus_vectors grp3d_init_vectors[] = { | 
 | 51 | 	{ | 
 | 52 | 		.src = MSM_BUS_MASTER_GRAPHICS_3D, | 
 | 53 | 		.dst = MSM_BUS_SLAVE_EBI_CH0, | 
 | 54 | 		.ab = 0, | 
 | 55 | 		.ib = 0, | 
 | 56 | 	}, | 
 | 57 | 	{ | 
 | 58 | 		.src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1, | 
 | 59 | 		.dst = MSM_BUS_SLAVE_EBI_CH0, | 
 | 60 | 		.ab = 0, | 
 | 61 | 		.ib = 0, | 
 | 62 | 	}, | 
 | 63 | }; | 
 | 64 |  | 
 | 65 | static struct msm_bus_vectors grp3d_low_vectors[] = { | 
 | 66 | 	{ | 
 | 67 | 		.src = MSM_BUS_MASTER_GRAPHICS_3D, | 
 | 68 | 		.dst = MSM_BUS_SLAVE_EBI_CH0, | 
 | 69 | 		.ab = 0, | 
| Lucille Sylvester | f6b4ce3 | 2012-05-11 11:10:18 -0600 | [diff] [blame] | 70 | 		.ib = KGSL_CONVERT_TO_MBPS(1000), | 
 | 71 | 	}, | 
 | 72 | 	{ | 
 | 73 | 		.src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1, | 
 | 74 | 		.dst = MSM_BUS_SLAVE_EBI_CH0, | 
 | 75 | 		.ab = 0, | 
 | 76 | 		.ib = KGSL_CONVERT_TO_MBPS(1000), | 
 | 77 | 	}, | 
 | 78 | }; | 
 | 79 |  | 
 | 80 | static struct msm_bus_vectors grp3d_nominal_low_vectors[] = { | 
 | 81 | 	{ | 
 | 82 | 		.src = MSM_BUS_MASTER_GRAPHICS_3D, | 
 | 83 | 		.dst = MSM_BUS_SLAVE_EBI_CH0, | 
 | 84 | 		.ab = 0, | 
| Jordan Crouse | b3115fe | 2012-02-01 22:11:12 -0700 | [diff] [blame] | 85 | 		.ib = KGSL_CONVERT_TO_MBPS(2000), | 
 | 86 | 	}, | 
 | 87 | 	{ | 
 | 88 | 		.src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1, | 
 | 89 | 		.dst = MSM_BUS_SLAVE_EBI_CH0, | 
 | 90 | 		.ab = 0, | 
 | 91 | 		.ib = KGSL_CONVERT_TO_MBPS(2000), | 
 | 92 | 	}, | 
 | 93 | }; | 
 | 94 |  | 
 | 95 | static struct msm_bus_vectors grp3d_nominal_high_vectors[] = { | 
 | 96 | 	{ | 
 | 97 | 		.src = MSM_BUS_MASTER_GRAPHICS_3D, | 
 | 98 | 		.dst = MSM_BUS_SLAVE_EBI_CH0, | 
 | 99 | 		.ab = 0, | 
| Lucille Sylvester | 2661534 | 2012-06-26 17:55:10 -0600 | [diff] [blame] | 100 | 		.ib = KGSL_CONVERT_TO_MBPS(2656), | 
| Jordan Crouse | b3115fe | 2012-02-01 22:11:12 -0700 | [diff] [blame] | 101 | 	}, | 
 | 102 | 	{ | 
 | 103 | 		.src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1, | 
 | 104 | 		.dst = MSM_BUS_SLAVE_EBI_CH0, | 
 | 105 | 		.ab = 0, | 
| Lucille Sylvester | 2661534 | 2012-06-26 17:55:10 -0600 | [diff] [blame] | 106 | 		.ib = KGSL_CONVERT_TO_MBPS(2656), | 
| Jordan Crouse | b3115fe | 2012-02-01 22:11:12 -0700 | [diff] [blame] | 107 | 	}, | 
 | 108 | }; | 
 | 109 |  | 
 | 110 | static struct msm_bus_vectors grp3d_max_vectors[] = { | 
 | 111 | 	{ | 
 | 112 | 		.src = MSM_BUS_MASTER_GRAPHICS_3D, | 
 | 113 | 		.dst = MSM_BUS_SLAVE_EBI_CH0, | 
 | 114 | 		.ab = 0, | 
 | 115 | 		.ib = KGSL_CONVERT_TO_MBPS(4264), | 
 | 116 | 	}, | 
 | 117 | 	{ | 
 | 118 | 		.src = MSM_BUS_MASTER_GRAPHICS_3D_PORT1, | 
 | 119 | 		.dst = MSM_BUS_SLAVE_EBI_CH0, | 
 | 120 | 		.ab = 0, | 
 | 121 | 		.ib = KGSL_CONVERT_TO_MBPS(4264), | 
 | 122 | 	}, | 
 | 123 | }; | 
 | 124 |  | 
 | 125 | static struct msm_bus_paths grp3d_bus_scale_usecases[] = { | 
 | 126 | 	{ | 
 | 127 | 		ARRAY_SIZE(grp3d_init_vectors), | 
 | 128 | 		grp3d_init_vectors, | 
 | 129 | 	}, | 
 | 130 | 	{ | 
 | 131 | 		ARRAY_SIZE(grp3d_low_vectors), | 
 | 132 | 		grp3d_low_vectors, | 
 | 133 | 	}, | 
 | 134 | 	{ | 
| Lucille Sylvester | f6b4ce3 | 2012-05-11 11:10:18 -0600 | [diff] [blame] | 135 | 		ARRAY_SIZE(grp3d_nominal_low_vectors), | 
 | 136 | 		grp3d_nominal_low_vectors, | 
 | 137 | 	}, | 
 | 138 | 	{ | 
| Jordan Crouse | b3115fe | 2012-02-01 22:11:12 -0700 | [diff] [blame] | 139 | 		ARRAY_SIZE(grp3d_nominal_high_vectors), | 
 | 140 | 		grp3d_nominal_high_vectors, | 
 | 141 | 	}, | 
 | 142 | 	{ | 
 | 143 | 		ARRAY_SIZE(grp3d_max_vectors), | 
 | 144 | 		grp3d_max_vectors, | 
 | 145 | 	}, | 
 | 146 | }; | 
 | 147 |  | 
 | 148 | static struct msm_bus_scale_pdata grp3d_bus_scale_pdata = { | 
 | 149 | 	grp3d_bus_scale_usecases, | 
 | 150 | 	ARRAY_SIZE(grp3d_bus_scale_usecases), | 
 | 151 | 	.name = "grp3d", | 
 | 152 | }; | 
 | 153 | #endif | 
 | 154 |  | 
 | 155 | static struct resource kgsl_3d0_resources[] = { | 
 | 156 | 	{ | 
 | 157 | 		.name = KGSL_3D0_REG_MEMORY, | 
 | 158 | 		.start = 0x04300000, /* GFX3D address */ | 
 | 159 | 		.end = 0x0431ffff, | 
 | 160 | 		.flags = IORESOURCE_MEM, | 
 | 161 | 	}, | 
 | 162 | 	{ | 
 | 163 | 		.name = KGSL_3D0_IRQ, | 
 | 164 | 		.start = GFX3D_IRQ, | 
 | 165 | 		.end = GFX3D_IRQ, | 
 | 166 | 		.flags = IORESOURCE_IRQ, | 
 | 167 | 	}, | 
 | 168 | }; | 
 | 169 |  | 
| Shubhraprakash Das | eb6df1d | 2012-05-01 00:55:35 -0600 | [diff] [blame] | 170 | static const struct kgsl_iommu_ctx kgsl_3d0_iommu0_ctxs[] = { | 
 | 171 | 	{ "gfx3d_user", 0 }, | 
 | 172 | 	{ "gfx3d_priv", 1 }, | 
| Jordan Crouse | 46cf4bb | 2012-02-21 08:54:52 -0700 | [diff] [blame] | 173 | }; | 
 | 174 |  | 
| Shubhraprakash Das | eb6df1d | 2012-05-01 00:55:35 -0600 | [diff] [blame] | 175 | static const struct kgsl_iommu_ctx kgsl_3d0_iommu1_ctxs[] = { | 
 | 176 | 	{ "gfx3d1_user", 0 }, | 
 | 177 | 	{ "gfx3d1_priv", 1 }, | 
| Jordan Crouse | 46cf4bb | 2012-02-21 08:54:52 -0700 | [diff] [blame] | 178 | }; | 
 | 179 |  | 
 | 180 | static struct kgsl_device_iommu_data kgsl_3d0_iommu_data[] = { | 
 | 181 | 	{ | 
| Shubhraprakash Das | eb6df1d | 2012-05-01 00:55:35 -0600 | [diff] [blame] | 182 | 		.iommu_ctxs = kgsl_3d0_iommu0_ctxs, | 
 | 183 | 		.iommu_ctx_count = ARRAY_SIZE(kgsl_3d0_iommu0_ctxs), | 
| Jordan Crouse | 46cf4bb | 2012-02-21 08:54:52 -0700 | [diff] [blame] | 184 | 		.physstart = 0x07C00000, | 
 | 185 | 		.physend = 0x07C00000 + SZ_1M - 1, | 
 | 186 | 	}, | 
 | 187 | 	{ | 
| Shubhraprakash Das | eb6df1d | 2012-05-01 00:55:35 -0600 | [diff] [blame] | 188 | 		.iommu_ctxs = kgsl_3d0_iommu1_ctxs, | 
 | 189 | 		.iommu_ctx_count = ARRAY_SIZE(kgsl_3d0_iommu1_ctxs), | 
| Jordan Crouse | 46cf4bb | 2012-02-21 08:54:52 -0700 | [diff] [blame] | 190 | 		.physstart = 0x07D00000, | 
 | 191 | 		.physend = 0x07D00000 + SZ_1M - 1, | 
 | 192 | 	}, | 
 | 193 | }; | 
 | 194 |  | 
| Jordan Crouse | b3115fe | 2012-02-01 22:11:12 -0700 | [diff] [blame] | 195 | static struct kgsl_device_platform_data kgsl_3d0_pdata = { | 
 | 196 | 	.pwrlevel = { | 
 | 197 | 		{ | 
| Tarun Karra | 3c2cc9e | 2012-02-17 14:58:07 -0800 | [diff] [blame] | 198 | 			.gpu_freq = 400000000, | 
| Lucille Sylvester | f6b4ce3 | 2012-05-11 11:10:18 -0600 | [diff] [blame] | 199 | 			.bus_freq = 4, | 
| Tarun Karra | 3c2cc9e | 2012-02-17 14:58:07 -0800 | [diff] [blame] | 200 | 			.io_fraction = 0, | 
| Jordan Crouse | b3115fe | 2012-02-01 22:11:12 -0700 | [diff] [blame] | 201 | 		}, | 
 | 202 | 		{ | 
| Lucille Sylvester | 0c779a9 | 2012-03-30 16:51:27 -0600 | [diff] [blame] | 203 | 			.gpu_freq = 325000000, | 
| Lucille Sylvester | f6b4ce3 | 2012-05-11 11:10:18 -0600 | [diff] [blame] | 204 | 			.bus_freq = 3, | 
| Tarun Karra | 3c2cc9e | 2012-02-17 14:58:07 -0800 | [diff] [blame] | 205 | 			.io_fraction = 33, | 
| Jordan Crouse | b3115fe | 2012-02-01 22:11:12 -0700 | [diff] [blame] | 206 | 		}, | 
 | 207 | 		{ | 
| Lucille Sylvester | 0c779a9 | 2012-03-30 16:51:27 -0600 | [diff] [blame] | 208 | 			.gpu_freq = 200000000, | 
| Lucille Sylvester | f6b4ce3 | 2012-05-11 11:10:18 -0600 | [diff] [blame] | 209 | 			.bus_freq = 2, | 
 | 210 | 			.io_fraction = 100, | 
 | 211 | 		}, | 
 | 212 | 		{ | 
 | 213 | 			.gpu_freq = 128000000, | 
| Tarun Karra | 7185370 | 2012-02-17 15:21:59 -0800 | [diff] [blame] | 214 | 			.bus_freq = 1, | 
| Jordan Crouse | b3115fe | 2012-02-01 22:11:12 -0700 | [diff] [blame] | 215 | 			.io_fraction = 100, | 
 | 216 | 		}, | 
 | 217 | 		{ | 
| Tarun Karra | 3c2cc9e | 2012-02-17 14:58:07 -0800 | [diff] [blame] | 218 | 			.gpu_freq = 27000000, | 
 | 219 | 			.bus_freq = 0, | 
| Jordan Crouse | b3115fe | 2012-02-01 22:11:12 -0700 | [diff] [blame] | 220 | 		}, | 
 | 221 | 	}, | 
| Lucille Sylvester | 37a02d3 | 2012-04-25 17:21:06 -0600 | [diff] [blame] | 222 | 	.init_level = 1, | 
| Lucille Sylvester | f6b4ce3 | 2012-05-11 11:10:18 -0600 | [diff] [blame] | 223 | 	.num_levels = 5, | 
| Jordan Crouse | b3115fe | 2012-02-01 22:11:12 -0700 | [diff] [blame] | 224 | 	.set_grp_async = NULL, | 
| Suman Tatiraju | 3bd641e | 2012-04-11 10:46:11 -0700 | [diff] [blame] | 225 | 	.idle_timeout = HZ/10, | 
| Jordan Crouse | b3115fe | 2012-02-01 22:11:12 -0700 | [diff] [blame] | 226 | 	.nap_allowed = true, | 
| Lucille Sylvester | fb77f15 | 2012-06-12 16:30:29 -0600 | [diff] [blame] | 227 | 	.strtstp_sleepwake = true, | 
| Jordan Crouse | b3115fe | 2012-02-01 22:11:12 -0700 | [diff] [blame] | 228 | 	.clk_map = KGSL_CLK_CORE | KGSL_CLK_IFACE | KGSL_CLK_MEM_IFACE, | 
 | 229 | #ifdef CONFIG_MSM_BUS_SCALING | 
 | 230 | 	.bus_scale_table = &grp3d_bus_scale_pdata, | 
 | 231 | #endif | 
| Jordan Crouse | 46cf4bb | 2012-02-21 08:54:52 -0700 | [diff] [blame] | 232 | 	.iommu_data = kgsl_3d0_iommu_data, | 
 | 233 | 	.iommu_count = ARRAY_SIZE(kgsl_3d0_iommu_data), | 
| Lucille Sylvester | 6e36241 | 2011-12-09 16:21:42 -0700 | [diff] [blame] | 234 | #ifdef CONFIG_MSM_DCVS | 
 | 235 | 	.core_info = &grp3d_core_info, | 
 | 236 | #endif | 
| Jordan Crouse | b3115fe | 2012-02-01 22:11:12 -0700 | [diff] [blame] | 237 | }; | 
 | 238 |  | 
 | 239 | struct platform_device device_kgsl_3d0 = { | 
 | 240 | 	.name = "kgsl-3d0", | 
 | 241 | 	.id = 0, | 
 | 242 | 	.num_resources = ARRAY_SIZE(kgsl_3d0_resources), | 
 | 243 | 	.resource = kgsl_3d0_resources, | 
 | 244 | 	.dev = { | 
 | 245 | 		.platform_data = &kgsl_3d0_pdata, | 
 | 246 | 	}, | 
 | 247 | }; | 
 | 248 |  | 
 | 249 | void __init apq8064_init_gpu(void) | 
 | 250 | { | 
 | 251 | 	platform_device_register(&device_kgsl_3d0); | 
 | 252 | } |