blob: 6e29c09deb403b134cd1221ad6c33bcd77550e67 [file] [log] [blame]
Abhijit Kulkarni40e38162016-06-26 22:12:09 -04001/* Copyright (c) 2015-2016, The Linux Foundation. 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
Lloyd Atkinson11f34442016-08-11 11:19:52 -040013#define pr_fmt(fmt) "sde-kms_utils:[%s] " fmt, __func__
14
Abhijit Kulkarni40e38162016-06-26 22:12:09 -040015#include "sde_kms.h"
Clarence Ipb218a3c2016-07-15 14:17:42 -040016
17void sde_kms_info_reset(struct sde_kms_info *info)
18{
19 if (info) {
20 info->len = 0;
21 info->staged_len = 0;
22 }
23}
24
25void sde_kms_info_add_keyint(struct sde_kms_info *info,
26 const char *key,
27 int32_t value)
28{
29 uint32_t len;
30
31 if (info && key) {
32 len = snprintf(info->data + info->len,
33 SDE_KMS_INFO_MAX_SIZE - info->len,
34 "%s=%d\n",
35 key,
36 value);
37
38 /* check if snprintf truncated the string */
39 if ((info->len + len) < SDE_KMS_INFO_MAX_SIZE)
40 info->len += len;
41 }
42}
43
44void sde_kms_info_add_keystr(struct sde_kms_info *info,
45 const char *key,
46 const char *value)
47{
48 uint32_t len;
49
50 if (info && key && value) {
51 len = snprintf(info->data + info->len,
52 SDE_KMS_INFO_MAX_SIZE - info->len,
53 "%s=%s\n",
54 key,
55 value);
56
57 /* check if snprintf truncated the string */
58 if ((info->len + len) < SDE_KMS_INFO_MAX_SIZE)
59 info->len += len;
60 }
61}
62
63void sde_kms_info_start(struct sde_kms_info *info,
64 const char *key)
65{
66 uint32_t len;
67
68 if (info && key) {
69 len = snprintf(info->data + info->len,
70 SDE_KMS_INFO_MAX_SIZE - info->len,
71 "%s=",
72 key);
73
74 info->start = true;
75
76 /* check if snprintf truncated the string */
77 if ((info->len + len) < SDE_KMS_INFO_MAX_SIZE)
78 info->staged_len = info->len + len;
79 }
80}
81
82void sde_kms_info_append(struct sde_kms_info *info,
83 const char *str)
84{
85 uint32_t len;
86
87 if (info) {
88 len = snprintf(info->data + info->staged_len,
89 SDE_KMS_INFO_MAX_SIZE - info->staged_len,
90 "%s",
91 str);
92
93 /* check if snprintf truncated the string */
94 if ((info->staged_len + len) < SDE_KMS_INFO_MAX_SIZE) {
95 info->staged_len += len;
96 info->start = false;
97 }
98 }
99}
100
101void sde_kms_info_append_format(struct sde_kms_info *info,
102 uint32_t pixel_format,
103 uint64_t modifier)
104{
105 uint32_t len;
106
107 if (!info)
108 return;
109
110 if (modifier) {
111 len = snprintf(info->data + info->staged_len,
112 SDE_KMS_INFO_MAX_SIZE - info->staged_len,
113 info->start ?
114 "%c%c%c%c/%llX/%llX" : " %c%c%c%c/%llX/%llX",
115 (pixel_format >> 0) & 0xFF,
116 (pixel_format >> 8) & 0xFF,
117 (pixel_format >> 16) & 0xFF,
118 (pixel_format >> 24) & 0xFF,
119 (modifier >> 56) & 0xFF,
120 modifier & ((1ULL << 56) - 1));
121 } else {
122 len = snprintf(info->data + info->staged_len,
123 SDE_KMS_INFO_MAX_SIZE - info->staged_len,
124 info->start ?
125 "%c%c%c%c" : " %c%c%c%c",
126 (pixel_format >> 0) & 0xFF,
127 (pixel_format >> 8) & 0xFF,
128 (pixel_format >> 16) & 0xFF,
129 (pixel_format >> 24) & 0xFF);
130 }
131
132 /* check if snprintf truncated the string */
133 if ((info->staged_len + len) < SDE_KMS_INFO_MAX_SIZE) {
134 info->staged_len += len;
135 info->start = false;
136 }
137}
138
139void sde_kms_info_stop(struct sde_kms_info *info)
140{
141 uint32_t len;
142
143 if (info) {
144 /* insert final delimiter */
145 len = snprintf(info->data + info->staged_len,
146 SDE_KMS_INFO_MAX_SIZE - info->staged_len,
147 "\n");
148
149 /* check if snprintf truncated the string */
150 if ((info->staged_len + len) < SDE_KMS_INFO_MAX_SIZE)
151 info->len = info->staged_len + len;
152 }
153}