blob: 3734e8d405c7f16058c8a31cf75d5ccaa94bdd68 [file] [log] [blame]
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +05301/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions
5 * are met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above copyright
9 * notice, this list of conditions and the following disclaimer in
10 * the documentation and/or other materials provided with the
11 * distribution.
12 * * Neither the name of The Linux Foundation nor the names of its
13 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
19 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
20 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
22 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
23 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
26 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#include <debug.h>
31#include <err.h>
32#include <string.h>
33#include <stdlib.h>
34#include <mdp5.h>
35
36#include "gcdb_display.h"
37#include "target/display.h"
38#include "fastboot_oem_display.h"
39
Padmanabhan Komandurudae7e612015-06-18 15:56:02 +053040struct oem_panel_data oem_data = {{'\0'}, false, false, SIM_NONE};
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +053041
42void panel_name_to_dt_string(struct panel_lookup_list supp_panels[],
43 uint32_t supp_panels_size,
44 const char *panel_name, char **panel_node,
45 char **slave_panel_node, int *panel_mode)
46{
47 uint32_t i;
48
49 if (!panel_name) {
50 dprintf(CRITICAL, "Invalid panel name\n");
51 return;
52 }
53
54 for (i = 0; i < supp_panels_size; i++) {
55 if (!strncmp(panel_name, supp_panels[i].name,
56 MAX_PANEL_ID_LEN)) {
57 *panel_node = supp_panels[i].panel_dt_string;
58 if (supp_panels[i].is_split_dsi) {
59 *slave_panel_node =
60 supp_panels[i].panel_dt_string;
61 *panel_mode = DUAL_DSI_FLAG;
62 } else {
63 *panel_mode = 0;
64 }
65 break;
66 }
67 }
68
69 if (i == supp_panels_size)
70 dprintf(CRITICAL, "Panel_name:%s not found in lookup table\n",
71 panel_name);
72}
73
Padmanabhan Komandurudae7e612015-06-18 15:56:02 +053074void sim_override_to_cmdline(struct sim_lookup_list sim[],
75 uint32_t sim_size, uint32_t sim_mode,
76 char **sim_string)
77{
78 uint32_t i;
79
80 for (i = 0; i < sim_size; i++) {
81 if (sim_mode == sim[i].sim_mode) {
82 *sim_string = sim[i].override_string;
83 break;
84 }
85 }
86
87 if (i == sim_size)
88 dprintf(CRITICAL, "Sim_mode not found in lookup table\n");
89}
90
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +053091struct oem_panel_data mdss_dsi_get_oem_data(void)
92{
93 return oem_data;
94}
95
96void set_panel_cmd_string(const char *panel_name)
97{
Padmanabhan Komandurudae7e612015-06-18 15:56:02 +053098 char *ch = NULL, *ch_hash = NULL, *ch_col = NULL;
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +053099 int i;
100
101 panel_name += strspn(panel_name, " ");
102
Padmanabhan Komandurudae7e612015-06-18 15:56:02 +0530103 /* Panel string - ':' and '#' are delimiters */
104 ch_col = strchr((char *) panel_name, ':');
105 ch_hash = strchr((char *) panel_name, '#');
106
107 if (ch_col && ch_hash)
108 ch = (ch_col < ch_hash) ? ch_col : ch_hash;
109 else if (ch_col)
110 ch = ch_col;
111 else if (ch_hash)
112 ch = ch_hash;
113
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530114 if (ch) {
115 for (i = 0; (panel_name + i) < ch; i++)
116 oem_data.panel[i] = *(panel_name + i);
117 oem_data.panel[i] = '\0';
118 } else {
119 strlcpy(oem_data.panel, panel_name, MAX_PANEL_ID_LEN);
120 }
121
122 /* Skip LK configuration */
123 ch = strstr((char *) panel_name, ":skip");
124 oem_data.skip = ch ? true : false;
125
126 /* Cont. splash status */
127 ch = strstr((char *) panel_name, ":disable");
128 oem_data.cont_splash = ch ? false : true;
Padmanabhan Komandurudae7e612015-06-18 15:56:02 +0530129
130 /* Simulator status */
131 oem_data.sim_mode = SIM_NONE;
132 if (strstr((char *) panel_name, "#sim-hwte"))
133 oem_data.sim_mode = SIM_HWTE;
134 else if (strstr((char *) panel_name, "#sim-swte"))
135 oem_data.sim_mode = SIM_SWTE;
136 else if (strstr((char *) panel_name, "#sim"))
137 oem_data.sim_mode = SIM_MODE;
138
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530139}
140
141static bool mdss_dsi_set_panel_node(char *panel_name, char **dsi_id,
142 char **panel_node, char **slave_panel_node, int *panel_mode)
143{
144 if (!strcmp(panel_name, SIM_VIDEO_PANEL)) {
145 *dsi_id = SIM_DSI_ID;
146 *panel_node = SIM_VIDEO_PANEL_NODE;
147 *panel_mode = 0;
148 } else if (!strcmp(panel_name, SIM_DUALDSI_VIDEO_PANEL)) {
149 *dsi_id = SIM_DSI_ID;
150 *panel_node = SIM_DUALDSI_VIDEO_PANEL_NODE;
151 *slave_panel_node = SIM_DUALDSI_VIDEO_SLAVE_PANEL_NODE;
152 *panel_mode = DUAL_DSI_FLAG;
153 } else if (!strcmp(panel_name, SIM_CMD_PANEL)) {
154 *dsi_id = SIM_DSI_ID;
155 *panel_node = SIM_CMD_PANEL_NODE;
156 *panel_mode = 0;
157 } else if (!strcmp(panel_name, SIM_DUALDSI_CMD_PANEL)) {
158 *dsi_id = SIM_DSI_ID;
159 *panel_node = SIM_DUALDSI_CMD_PANEL_NODE;
160 *slave_panel_node = SIM_DUALDSI_CMD_SLAVE_PANEL_NODE;
161 *panel_mode = DUAL_DSI_FLAG;
162 } else if (oem_data.skip) {
163 /* For skip panel case, check the lookup table */
164 *dsi_id = SIM_DSI_ID;
165 panel_name_to_dt_string(lookup_skip_panels,
166 ARRAY_SIZE(lookup_skip_panels), panel_name,
167 panel_node, slave_panel_node, panel_mode);
168 } else {
169 return false;
170 }
171 return true;
172}
173
174bool gcdb_display_cmdline_arg(char *pbuf, uint16_t buf_size)
175{
176 char *dsi_id = NULL;
177 char *panel_node = NULL;
178 char *slave_panel_node = NULL;
Padmanabhan Komandurudae7e612015-06-18 15:56:02 +0530179 char *sim_mode_string = NULL;
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530180 uint16_t dsi_id_len = 0, panel_node_len = 0, slave_panel_node_len = 0;
181 uint32_t arg_size = 0;
182 bool ret = true;
183 bool rc;
184 char *default_str;
185 struct panel_struct panelstruct;
186 int panel_mode = SPLIT_DISPLAY_FLAG | DUAL_PIPE_FLAG | DST_SPLIT_FLAG;
187 int prefix_string_len = strlen(DISPLAY_CMDLINE_PREFIX);
188 char *sctl_string;
189
190 panelstruct = mdss_dsi_get_panel_data();
191
192 rc = mdss_dsi_set_panel_node(oem_data.panel, &dsi_id, &panel_node,
193 &slave_panel_node, &panel_mode);
194
195 if (!rc) {
Padmanabhan Komandurudf26fc62015-07-06 18:27:45 +0530196 if (panelstruct.paneldata) {
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530197 dsi_id = panelstruct.paneldata->panel_controller;
198 panel_node = panelstruct.paneldata->panel_node_id;
199 panel_mode =
200 panelstruct.paneldata->panel_operating_mode &
201 panel_mode;
202 slave_panel_node =
203 panelstruct.paneldata->slave_panel_node_id;
204 } else {
205 if (target_is_edp())
206 default_str = "0:edp:";
207 else
208 default_str = "0:dsi:0:";
209
210 arg_size = prefix_string_len + strlen(default_str);
211 if (buf_size < arg_size) {
212 dprintf(CRITICAL, "display command line buffer is small\n");
213 return false;
214 }
215
216 strlcpy(pbuf, DISPLAY_CMDLINE_PREFIX, buf_size);
217 pbuf += prefix_string_len;
218 buf_size -= prefix_string_len;
219
220 strlcpy(pbuf, default_str, buf_size);
221 return true;
222 }
223 }
224
225 if (dsi_id == NULL || panel_node == NULL) {
226 dprintf(CRITICAL, "panel node or dsi ctrl not present\n");
227 return false;
228 }
229
230 if (((panel_mode & SPLIT_DISPLAY_FLAG) ||
231 (panel_mode & DST_SPLIT_FLAG)) && slave_panel_node == NULL) {
232 dprintf(CRITICAL, "slave node not present in dual dsi case\n");
233 return false;
234 }
235
236 dsi_id_len = strlen(dsi_id);
237 panel_node_len = strlen(panel_node);
238 if (!slave_panel_node || !strcmp(slave_panel_node, ""))
239 slave_panel_node = NO_PANEL_CONFIG;
240 slave_panel_node_len = strlen(slave_panel_node);
241
242 arg_size = prefix_string_len + dsi_id_len + panel_node_len +
243 LK_OVERRIDE_PANEL_LEN + 1;
244
245 if (panelstruct.paneldata &&
246 !strcmp(panelstruct.paneldata->panel_destination, "DISPLAY_2"))
247 sctl_string = DSI_0_STRING;
248 else
249 sctl_string = DSI_1_STRING;
250
251 arg_size += strlen(sctl_string) + slave_panel_node_len;
252
Padmanabhan Komandurudae7e612015-06-18 15:56:02 +0530253 if (oem_data.sim_mode != SIM_NONE) {
254 sim_override_to_cmdline(lookup_sim,
255 ARRAY_SIZE(lookup_sim), oem_data.sim_mode,
256 &sim_mode_string);
257 if (sim_mode_string) {
258 arg_size += LK_SIM_OVERRIDE_LEN +
259 strlen(sim_mode_string);
260 } else {
261 dprintf(CRITICAL, "SIM string NULL but mode is not NONE\n");
262 return false;
263 }
264 }
265
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530266 if (buf_size < arg_size) {
267 dprintf(CRITICAL, "display command line buffer is small\n");
268 ret = false;
269 } else {
270 strlcpy(pbuf, DISPLAY_CMDLINE_PREFIX, buf_size);
271 pbuf += prefix_string_len;
272 buf_size -= prefix_string_len;
273
274 strlcpy(pbuf, LK_OVERRIDE_PANEL, buf_size);
275 pbuf += LK_OVERRIDE_PANEL_LEN;
276 buf_size -= LK_OVERRIDE_PANEL_LEN;
277
278 strlcpy(pbuf, dsi_id, buf_size);
279 pbuf += dsi_id_len;
280 buf_size -= dsi_id_len;
281
282 strlcpy(pbuf, panel_node, buf_size);
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530283 pbuf += panel_node_len;
284 buf_size -= panel_node_len;
285
286 strlcpy(pbuf, sctl_string, buf_size);
287 pbuf += strlen(sctl_string);
288 buf_size -= strlen(sctl_string);
Padmanabhan Komandurudae7e612015-06-18 15:56:02 +0530289
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530290 strlcpy(pbuf, slave_panel_node, buf_size);
Padmanabhan Komandurudae7e612015-06-18 15:56:02 +0530291 pbuf += slave_panel_node_len;
292 buf_size -= slave_panel_node_len;
293
294 if (sim_mode_string) {
295 strlcpy(pbuf, LK_SIM_OVERRIDE, buf_size);
296 pbuf += LK_SIM_OVERRIDE_LEN;
297 buf_size -= LK_SIM_OVERRIDE_LEN;
298
299 strlcpy(pbuf, sim_mode_string, buf_size);
300 pbuf += strlen(sim_mode_string);
301 buf_size -= strlen(sim_mode_string);
302 }
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530303 }
304 return ret;
305}