|
Packit Service |
0ee8e1 |
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
Packit |
2ad57b |
/*
|
|
Packit |
2ad57b |
* (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005, 2008.
|
|
Packit |
2ad57b |
*/
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
%option noyywrap nounput noinput never-interactive
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
%x BYTESTRING
|
|
Packit |
2ad57b |
%x PROPNODENAME
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
PROPNODECHAR [a-zA-Z0-9,._+*#?@-]
|
|
Packit |
2ad57b |
PATHCHAR ({PROPNODECHAR}|[/])
|
|
Packit |
2ad57b |
LABEL [a-zA-Z_][a-zA-Z0-9_]*
|
|
Packit |
2ad57b |
STRING \"([^\\"]|\\.)*\"
|
|
Packit |
2ad57b |
WS [[:space:]]
|
|
Packit |
2ad57b |
COMMENT "/*"([^*]|\*+[^*/])*\*+"/"
|
|
Packit |
2ad57b |
LINECOMMENT "//".*\n
|
|
Packit |
2ad57b |
GAP ({WS}|{COMMENT}|{LINECOMMENT})*
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
%{
|
|
Packit |
2ad57b |
#include <string.h>
|
|
Packit |
2ad57b |
#include <stdlib.h>
|
|
Packit |
2ad57b |
#include <stdarg.h>
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
#include <errno.h>
|
|
Packit |
2ad57b |
#include <assert.h>
|
|
Packit |
2ad57b |
#include <fnmatch.h>
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
#include "srcpos.h"
|
|
Packit |
2ad57b |
#include "util.h"
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
static int v1_tagged; /* = 0 */
|
|
Packit |
2ad57b |
static int cbase = 16;
|
|
Packit |
2ad57b |
static int saw_hyphen; /* = 0 */
|
|
Packit |
2ad57b |
static unsigned long long last_val;
|
|
Packit |
2ad57b |
static char *last_name; /* = NULL */
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
static const struct {
|
|
Packit |
2ad57b |
const char *pattern;
|
|
Packit |
2ad57b |
int obase, width;
|
|
Packit |
2ad57b |
} guess_table[] = {
|
|
Packit |
2ad57b |
{ "*-frequency", 10, 0 },
|
|
Packit |
2ad57b |
{ "num-*", 10, 0 },
|
|
Packit |
2ad57b |
{ "#*-cells", 10, 0 },
|
|
Packit |
2ad57b |
{ "*cache-line-size", 10, 0 },
|
|
Packit |
2ad57b |
{ "*cache-block-size", 10, 0 },
|
|
Packit |
2ad57b |
{ "*cache-size", 10, 0 },
|
|
Packit |
2ad57b |
{ "*cache-sets", 10, 0 },
|
|
Packit |
2ad57b |
{ "cell-index", 10, 0 },
|
|
Packit |
2ad57b |
{ "bank-width", 10, 0 },
|
|
Packit |
2ad57b |
{ "*-fifo-size", 10, 0 },
|
|
Packit |
2ad57b |
{ "*-frame-size", 10, 0 },
|
|
Packit |
2ad57b |
{ "*-channel", 10, 0 },
|
|
Packit |
2ad57b |
{ "current-speed", 10, 0 },
|
|
Packit |
2ad57b |
{ "phy-map", 16, 8 },
|
|
Packit |
2ad57b |
{ "dcr-reg", 16, 3 },
|
|
Packit |
2ad57b |
{ "reg", 16, 8 },
|
|
Packit |
2ad57b |
{ "ranges", 16, 8},
|
|
Packit |
2ad57b |
};
|
|
Packit |
2ad57b |
%}
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
%%
|
|
Packit |
2ad57b |
<*>"/include/"{GAP}{STRING} ECHO;
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
<*>\"([^\\"]|\\.)*\" ECHO;
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
<*>"/dts-v1/" {
|
|
Packit |
2ad57b |
die("Input dts file is already version 1\n");
|
|
Packit |
2ad57b |
}
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
<*>"/memreserve/" {
|
|
Packit |
2ad57b |
if (!v1_tagged) {
|
|
Packit |
2ad57b |
fprintf(yyout, "/dts-v1/;\n\n");
|
|
Packit |
2ad57b |
v1_tagged = 1;
|
|
Packit |
2ad57b |
}
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
ECHO;
|
|
Packit |
2ad57b |
BEGIN(INITIAL);
|
|
Packit |
2ad57b |
}
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
<*>{LABEL}: ECHO;
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
<INITIAL>[bodh]# {
|
|
Packit |
2ad57b |
if (*yytext == 'b')
|
|
Packit |
2ad57b |
cbase = 2;
|
|
Packit |
2ad57b |
else if (*yytext == 'o')
|
|
Packit |
2ad57b |
cbase = 8;
|
|
Packit |
2ad57b |
else if (*yytext == 'd')
|
|
Packit |
2ad57b |
cbase = 10;
|
|
Packit |
2ad57b |
else
|
|
Packit |
2ad57b |
cbase = 16;
|
|
Packit |
2ad57b |
}
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
<INITIAL>[0-9a-fA-F]+ {
|
|
Packit |
2ad57b |
unsigned long long val;
|
|
Packit |
2ad57b |
int obase = 16, width = 0;
|
|
Packit |
2ad57b |
int i;
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
val = strtoull(yytext, NULL, cbase);
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
if (saw_hyphen)
|
|
Packit |
2ad57b |
val = val - last_val + 1;
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
if (last_name) {
|
|
Packit |
2ad57b |
for (i = 0; i < ARRAY_SIZE(guess_table); i++)
|
|
Packit |
2ad57b |
if (fnmatch(guess_table[i].pattern,
|
|
Packit |
2ad57b |
last_name, 0) == 0) {
|
|
Packit |
2ad57b |
obase = guess_table[i].obase;
|
|
Packit |
2ad57b |
width = guess_table[i].width;
|
|
Packit |
2ad57b |
}
|
|
Packit |
2ad57b |
} else {
|
|
Packit |
2ad57b |
obase = 16;
|
|
Packit |
2ad57b |
width = 16;
|
|
Packit |
2ad57b |
}
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
if (cbase != 16)
|
|
Packit |
2ad57b |
obase = cbase;
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
switch (obase) {
|
|
Packit |
2ad57b |
case 2:
|
|
Packit |
2ad57b |
case 16:
|
|
Packit |
2ad57b |
fprintf(yyout, "0x%0*llx", width, val);
|
|
Packit |
2ad57b |
break;
|
|
Packit |
2ad57b |
case 8:
|
|
Packit |
2ad57b |
fprintf(yyout, "0%0*llo", width, val);
|
|
Packit |
2ad57b |
break;
|
|
Packit |
2ad57b |
case 10:
|
|
Packit |
2ad57b |
fprintf(yyout, "%*llu", width, val);
|
|
Packit |
2ad57b |
break;
|
|
Packit |
2ad57b |
}
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
cbase = 16;
|
|
Packit |
2ad57b |
last_val = val;
|
|
Packit |
2ad57b |
saw_hyphen = 0;
|
|
Packit |
2ad57b |
}
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
\&{LABEL} ECHO;
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
"&{/"{PATHCHAR}+\} ECHO;
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
<INITIAL>"&/"{PATHCHAR}+ fprintf(yyout, "&{/%s}", yytext + 2);
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
<BYTESTRING>[0-9a-fA-F]{2} ECHO;
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
<BYTESTRING>"]" {
|
|
Packit |
2ad57b |
ECHO;
|
|
Packit |
2ad57b |
BEGIN(INITIAL);
|
|
Packit |
2ad57b |
}
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
<PROPNODENAME>{PROPNODECHAR}+ {
|
|
Packit |
2ad57b |
ECHO;
|
|
Packit |
2ad57b |
last_name = xstrdup(yytext);
|
|
Packit |
2ad57b |
BEGIN(INITIAL);
|
|
Packit |
2ad57b |
}
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
<*>{GAP} ECHO;
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
<*>- { /* Hack to convert old style memreserves */
|
|
Packit |
2ad57b |
saw_hyphen = 1;
|
|
Packit |
2ad57b |
fprintf(yyout, " ");
|
|
Packit |
2ad57b |
}
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
<*>. {
|
|
Packit |
2ad57b |
if (!v1_tagged) {
|
|
Packit |
2ad57b |
fprintf(yyout, "/dts-v1/;\n\n");
|
|
Packit |
2ad57b |
v1_tagged = 1;
|
|
Packit |
2ad57b |
}
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
ECHO;
|
|
Packit |
2ad57b |
if (yytext[0] == '[') {
|
|
Packit |
2ad57b |
BEGIN(BYTESTRING);
|
|
Packit |
2ad57b |
}
|
|
Packit |
2ad57b |
if ((yytext[0] == '{')
|
|
Packit |
2ad57b |
|| (yytext[0] == ';')) {
|
|
Packit |
2ad57b |
BEGIN(PROPNODENAME);
|
|
Packit |
2ad57b |
}
|
|
Packit |
2ad57b |
}
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
%%
|
|
Packit |
2ad57b |
/* Usage related data. */
|
|
Packit |
2ad57b |
static const char usage_synopsis[] = "convert-dtsv0 [options] <v0 dts file>...";
|
|
Packit |
2ad57b |
static const char usage_short_opts[] = "" USAGE_COMMON_SHORT_OPTS;
|
|
Packit |
2ad57b |
static struct option const usage_long_opts[] = {
|
|
Packit |
2ad57b |
USAGE_COMMON_LONG_OPTS
|
|
Packit |
2ad57b |
};
|
|
Packit |
2ad57b |
static const char * const usage_opts_help[] = {
|
|
Packit |
2ad57b |
USAGE_COMMON_OPTS_HELP
|
|
Packit |
2ad57b |
};
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
static void convert_file(const char *fname)
|
|
Packit |
2ad57b |
{
|
|
Packit |
2ad57b |
const char suffix[] = "v1";
|
|
Packit |
2ad57b |
int len = strlen(fname);
|
|
Packit |
2ad57b |
char *newname;
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
newname = xmalloc(len + sizeof(suffix));
|
|
Packit |
2ad57b |
memcpy(newname, fname, len);
|
|
Packit |
2ad57b |
memcpy(newname + len, suffix, sizeof(suffix));
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
yyin = fopen(fname, "r");
|
|
Packit |
2ad57b |
if (!yyin)
|
|
Packit |
2ad57b |
die("Couldn't open input file %s: %s\n",
|
|
Packit |
2ad57b |
fname, strerror(errno));
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
yyout = fopen(newname, "w");
|
|
Packit |
2ad57b |
if (!yyout)
|
|
Packit |
2ad57b |
die("Couldn't open output file %s: %s\n",
|
|
Packit |
2ad57b |
newname, strerror(errno));
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
while(yylex())
|
|
Packit |
2ad57b |
;
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
free(newname);
|
|
Packit |
2ad57b |
}
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
int main(int argc, char *argv[])
|
|
Packit |
2ad57b |
{
|
|
Packit |
2ad57b |
int opt;
|
|
Packit |
2ad57b |
int i;
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
while ((opt = util_getopt_long()) != EOF) {
|
|
Packit |
2ad57b |
switch (opt) {
|
|
Packit |
2ad57b |
case_USAGE_COMMON_FLAGS
|
|
Packit |
2ad57b |
}
|
|
Packit |
2ad57b |
}
|
|
Packit |
2ad57b |
if (argc < 2)
|
|
Packit |
2ad57b |
usage("missing filename");
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
for (i = 1; i < argc; i++) {
|
|
Packit |
2ad57b |
fprintf(stderr, "Converting %s from dts v0 to dts v1\n", argv[i]);
|
|
Packit |
2ad57b |
convert_file(argv[i]);
|
|
Packit |
2ad57b |
}
|
|
Packit |
2ad57b |
|
|
Packit |
2ad57b |
exit(0);
|
|
Packit |
2ad57b |
}
|