Merge remote-tracking branch 'lsk/v3.10/topic/arm64-topology' into linux-linaro-lsk
[firefly-linux-kernel-4.4.55.git] / drivers / gator / gator_annotate_kernel.c
1 /**
2  * Copyright (C) ARM Limited 2012-2013. All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  */
9
10 #define ESCAPE_CODE 0x1c
11 #define STRING_ANNOTATION 0x06
12 #define NAME_CHANNEL_ANNOTATION 0x07
13 #define NAME_GROUP_ANNOTATION 0x08
14 #define VISUAL_ANNOTATION 0x04
15 #define MARKER_ANNOTATION 0x05
16
17 static void kannotate_write(const char *ptr, unsigned int size)
18 {
19         int retval;
20         int pos = 0;
21         loff_t offset = 0;
22         while (pos < size) {
23                 retval = annotate_write(NULL, &ptr[pos], size - pos, &offset);
24                 if (retval < 0) {
25                         printk(KERN_WARNING "gator: kannotate_write failed with return value %d\n", retval);
26                         return;
27                 }
28                 pos += retval;
29         }
30 }
31
32 void gator_annotate_channel(int channel, const char *str)
33 {
34         int str_size = strlen(str) & 0xffff;
35         long long header = ESCAPE_CODE | (STRING_ANNOTATION << 8) | (channel << 16) | ((long long)str_size << 48);
36         kannotate_write((char *)&header, sizeof(header));
37         kannotate_write(str, str_size);
38 }
39
40 EXPORT_SYMBOL(gator_annotate_channel);
41
42 void gator_annotate(const char *str)
43 {
44         gator_annotate_channel(0, str);
45 }
46
47 EXPORT_SYMBOL(gator_annotate);
48
49 void gator_annotate_channel_color(int channel, int color, const char *str)
50 {
51         int str_size = (strlen(str) + 4) & 0xffff;
52         char header[12];
53         header[0] = ESCAPE_CODE;
54         header[1] = STRING_ANNOTATION;
55         *(u32 *)(&header[2]) = channel;
56         *(u16 *)(&header[6]) = str_size;
57         *(u32 *)(&header[8]) = color;
58         kannotate_write((char *)&header, sizeof(header));
59         kannotate_write(str, str_size - 4);
60 }
61
62 EXPORT_SYMBOL(gator_annotate_channel_color);
63
64 void gator_annotate_color(int color, const char *str)
65 {
66         gator_annotate_channel_color(0, color, str);
67 }
68
69 EXPORT_SYMBOL(gator_annotate_color);
70
71 void gator_annotate_channel_end(int channel)
72 {
73         long long header = ESCAPE_CODE | (STRING_ANNOTATION << 8) | (channel << 16);
74         kannotate_write((char *)&header, sizeof(header));
75 }
76
77 EXPORT_SYMBOL(gator_annotate_channel_end);
78
79 void gator_annotate_end(void)
80 {
81         gator_annotate_channel_end(0);
82 }
83
84 EXPORT_SYMBOL(gator_annotate_end);
85
86 void gator_annotate_name_channel(int channel, int group, const char* str)
87 {
88         int str_size = strlen(str) & 0xffff;
89         char header[12];
90         header[0] = ESCAPE_CODE;
91         header[1] = NAME_CHANNEL_ANNOTATION;
92         *(u32 *)(&header[2]) = channel;
93         *(u32 *)(&header[6]) = group;
94         *(u16 *)(&header[10]) = str_size;
95         kannotate_write((char *)&header, sizeof(header));
96         kannotate_write(str, str_size);
97 }
98
99 EXPORT_SYMBOL(gator_annotate_name_channel);
100
101 void gator_annotate_name_group(int group, const char* str)
102 {
103         int str_size = strlen(str) & 0xffff;
104         long long header = ESCAPE_CODE | (NAME_GROUP_ANNOTATION << 8) | (group << 16) | ((long long)str_size << 48);
105         kannotate_write((char *)&header, sizeof(header));
106         kannotate_write(str, str_size);
107 }
108
109 EXPORT_SYMBOL(gator_annotate_name_group);
110
111 void gator_annotate_visual(const char *data, unsigned int length, const char *str)
112 {
113         int str_size = strlen(str) & 0xffff;
114         int visual_annotation = ESCAPE_CODE | (VISUAL_ANNOTATION << 8) | (str_size << 16);
115         kannotate_write((char *)&visual_annotation, sizeof(visual_annotation));
116         kannotate_write(str, str_size);
117         kannotate_write((char *)&length, sizeof(length));
118         kannotate_write(data, length);
119 }
120
121 EXPORT_SYMBOL(gator_annotate_visual);
122
123 void gator_annotate_marker(void)
124 {
125         int header = ESCAPE_CODE | (MARKER_ANNOTATION << 8);
126         kannotate_write((char *)&header, sizeof(header));
127 }
128
129 EXPORT_SYMBOL(gator_annotate_marker);
130
131 void gator_annotate_marker_str(const char *str)
132 {
133         int str_size = strlen(str) & 0xffff;
134         int header = ESCAPE_CODE | (MARKER_ANNOTATION << 8) | (str_size << 16);
135         kannotate_write((char *)&header, sizeof(header));
136         kannotate_write(str, str_size);
137 }
138
139 EXPORT_SYMBOL(gator_annotate_marker_str);
140
141 void gator_annotate_marker_color(int color)
142 {
143         long long header = (ESCAPE_CODE | (MARKER_ANNOTATION << 8) | 0x00040000 | ((long long)color << 32));
144         kannotate_write((char *)&header, sizeof(header));
145 }
146
147 EXPORT_SYMBOL(gator_annotate_marker_color);
148
149 void gator_annotate_marker_color_str(int color, const char *str)
150 {
151         int str_size = (strlen(str) + 4) & 0xffff;
152         long long header = ESCAPE_CODE | (MARKER_ANNOTATION << 8) | (str_size << 16) | ((long long)color << 32);
153         kannotate_write((char *)&header, sizeof(header));
154         kannotate_write(str, str_size - 4);
155 }
156
157 EXPORT_SYMBOL(gator_annotate_marker_color_str);