blob: 027207c79ed32c64352079fb7c07f5f7852ccb7b [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
40struct oem_panel_data oem_data = {{'\0'}, false, false};
41
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
74struct oem_panel_data mdss_dsi_get_oem_data(void)
75{
76 return oem_data;
77}
78
79void set_panel_cmd_string(const char *panel_name)
80{
81 char *ch = NULL;
82 int i;
83
84 panel_name += strspn(panel_name, " ");
85
86 /* Panel string */
87 ch = strchr((char *) panel_name, ':');
88 if (ch) {
89 for (i = 0; (panel_name + i) < ch; i++)
90 oem_data.panel[i] = *(panel_name + i);
91 oem_data.panel[i] = '\0';
92 } else {
93 strlcpy(oem_data.panel, panel_name, MAX_PANEL_ID_LEN);
94 }
95
96 /* Skip LK configuration */
97 ch = strstr((char *) panel_name, ":skip");
98 oem_data.skip = ch ? true : false;
99
100 /* Cont. splash status */
101 ch = strstr((char *) panel_name, ":disable");
102 oem_data.cont_splash = ch ? false : true;
103}
104
105static bool mdss_dsi_set_panel_node(char *panel_name, char **dsi_id,
106 char **panel_node, char **slave_panel_node, int *panel_mode)
107{
108 if (!strcmp(panel_name, SIM_VIDEO_PANEL)) {
109 *dsi_id = SIM_DSI_ID;
110 *panel_node = SIM_VIDEO_PANEL_NODE;
111 *panel_mode = 0;
112 } else if (!strcmp(panel_name, SIM_DUALDSI_VIDEO_PANEL)) {
113 *dsi_id = SIM_DSI_ID;
114 *panel_node = SIM_DUALDSI_VIDEO_PANEL_NODE;
115 *slave_panel_node = SIM_DUALDSI_VIDEO_SLAVE_PANEL_NODE;
116 *panel_mode = DUAL_DSI_FLAG;
117 } else if (!strcmp(panel_name, SIM_CMD_PANEL)) {
118 *dsi_id = SIM_DSI_ID;
119 *panel_node = SIM_CMD_PANEL_NODE;
120 *panel_mode = 0;
121 } else if (!strcmp(panel_name, SIM_DUALDSI_CMD_PANEL)) {
122 *dsi_id = SIM_DSI_ID;
123 *panel_node = SIM_DUALDSI_CMD_PANEL_NODE;
124 *slave_panel_node = SIM_DUALDSI_CMD_SLAVE_PANEL_NODE;
125 *panel_mode = DUAL_DSI_FLAG;
126 } else if (oem_data.skip) {
127 /* For skip panel case, check the lookup table */
128 *dsi_id = SIM_DSI_ID;
129 panel_name_to_dt_string(lookup_skip_panels,
130 ARRAY_SIZE(lookup_skip_panels), panel_name,
131 panel_node, slave_panel_node, panel_mode);
132 } else {
133 return false;
134 }
135 return true;
136}
137
138bool gcdb_display_cmdline_arg(char *pbuf, uint16_t buf_size)
139{
140 char *dsi_id = NULL;
141 char *panel_node = NULL;
142 char *slave_panel_node = NULL;
143 uint16_t dsi_id_len = 0, panel_node_len = 0, slave_panel_node_len = 0;
144 uint32_t arg_size = 0;
145 bool ret = true;
146 bool rc;
147 char *default_str;
148 struct panel_struct panelstruct;
149 int panel_mode = SPLIT_DISPLAY_FLAG | DUAL_PIPE_FLAG | DST_SPLIT_FLAG;
150 int prefix_string_len = strlen(DISPLAY_CMDLINE_PREFIX);
151 char *sctl_string;
152
153 panelstruct = mdss_dsi_get_panel_data();
154
155 rc = mdss_dsi_set_panel_node(oem_data.panel, &dsi_id, &panel_node,
156 &slave_panel_node, &panel_mode);
157
158 if (!rc) {
Padmanabhan Komandurudf26fc62015-07-06 18:27:45 +0530159 if (panelstruct.paneldata) {
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530160 dsi_id = panelstruct.paneldata->panel_controller;
161 panel_node = panelstruct.paneldata->panel_node_id;
162 panel_mode =
163 panelstruct.paneldata->panel_operating_mode &
164 panel_mode;
165 slave_panel_node =
166 panelstruct.paneldata->slave_panel_node_id;
167 } else {
168 if (target_is_edp())
169 default_str = "0:edp:";
170 else
171 default_str = "0:dsi:0:";
172
173 arg_size = prefix_string_len + strlen(default_str);
174 if (buf_size < arg_size) {
175 dprintf(CRITICAL, "display command line buffer is small\n");
176 return false;
177 }
178
179 strlcpy(pbuf, DISPLAY_CMDLINE_PREFIX, buf_size);
180 pbuf += prefix_string_len;
181 buf_size -= prefix_string_len;
182
183 strlcpy(pbuf, default_str, buf_size);
184 return true;
185 }
186 }
187
188 if (dsi_id == NULL || panel_node == NULL) {
189 dprintf(CRITICAL, "panel node or dsi ctrl not present\n");
190 return false;
191 }
192
193 if (((panel_mode & SPLIT_DISPLAY_FLAG) ||
194 (panel_mode & DST_SPLIT_FLAG)) && slave_panel_node == NULL) {
195 dprintf(CRITICAL, "slave node not present in dual dsi case\n");
196 return false;
197 }
198
199 dsi_id_len = strlen(dsi_id);
200 panel_node_len = strlen(panel_node);
201 if (!slave_panel_node || !strcmp(slave_panel_node, ""))
202 slave_panel_node = NO_PANEL_CONFIG;
203 slave_panel_node_len = strlen(slave_panel_node);
204
205 arg_size = prefix_string_len + dsi_id_len + panel_node_len +
206 LK_OVERRIDE_PANEL_LEN + 1;
207
208 if (panelstruct.paneldata &&
209 !strcmp(panelstruct.paneldata->panel_destination, "DISPLAY_2"))
210 sctl_string = DSI_0_STRING;
211 else
212 sctl_string = DSI_1_STRING;
213
214 arg_size += strlen(sctl_string) + slave_panel_node_len;
215
216 if (buf_size < arg_size) {
217 dprintf(CRITICAL, "display command line buffer is small\n");
218 ret = false;
219 } else {
220 strlcpy(pbuf, DISPLAY_CMDLINE_PREFIX, buf_size);
221 pbuf += prefix_string_len;
222 buf_size -= prefix_string_len;
223
224 strlcpy(pbuf, LK_OVERRIDE_PANEL, buf_size);
225 pbuf += LK_OVERRIDE_PANEL_LEN;
226 buf_size -= LK_OVERRIDE_PANEL_LEN;
227
228 strlcpy(pbuf, dsi_id, buf_size);
229 pbuf += dsi_id_len;
230 buf_size -= dsi_id_len;
231
232 strlcpy(pbuf, panel_node, buf_size);
233
234 pbuf += panel_node_len;
235 buf_size -= panel_node_len;
236
237 strlcpy(pbuf, sctl_string, buf_size);
238 pbuf += strlen(sctl_string);
239 buf_size -= strlen(sctl_string);
240 strlcpy(pbuf, slave_panel_node, buf_size);
241 }
242 return ret;
243}