xref: /dflybsd-src/sys/tools/acpi_quirks2h.awk (revision d2fa5f9560f2780d7fc8448cce5c2706576fd2b7)
1*d2fa5f95SSascha Wildner#!/usr/bin/awk -f
2*d2fa5f95SSascha Wildner#
3*d2fa5f95SSascha Wildner# $FreeBSD: head/sys/tools/acpi_quirks2h.awk 167814 2007-03-22 18:16:43Z jkim $
4*d2fa5f95SSascha Wildner
5*d2fa5f95SSascha Wildner#-
6*d2fa5f95SSascha Wildner# Copyright (c) 2004 Mark Santcroos <marks@ripe.net>
7*d2fa5f95SSascha Wildner# All rights reserved.
8*d2fa5f95SSascha Wildner#
9*d2fa5f95SSascha Wildner# Redistribution and use in source and binary forms, with or without
10*d2fa5f95SSascha Wildner# modification, are permitted provided that the following conditions
11*d2fa5f95SSascha Wildner# are met:
12*d2fa5f95SSascha Wildner# 1. Redistributions of source code must retain the above copyright
13*d2fa5f95SSascha Wildner#    notice, this list of conditions and the following disclaimer.
14*d2fa5f95SSascha Wildner# 2. Redistributions in binary form must reproduce the above copyright
15*d2fa5f95SSascha Wildner#    notice, this list of conditions and the following disclaimer in the
16*d2fa5f95SSascha Wildner#    documentation and/or other materials provided with the distribution.
17*d2fa5f95SSascha Wildner#
18*d2fa5f95SSascha Wildner# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19*d2fa5f95SSascha Wildner# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20*d2fa5f95SSascha Wildner# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*d2fa5f95SSascha Wildner# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22*d2fa5f95SSascha Wildner# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23*d2fa5f95SSascha Wildner# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24*d2fa5f95SSascha Wildner# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25*d2fa5f95SSascha Wildner# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26*d2fa5f95SSascha Wildner# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27*d2fa5f95SSascha Wildner# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28*d2fa5f95SSascha Wildner# SUCH DAMAGE.
29*d2fa5f95SSascha Wildner#
30*d2fa5f95SSascha Wildner
31*d2fa5f95SSascha WildnerBEGIN {
32*d2fa5f95SSascha Wildner	OUTPUT="acpi_quirks.h"
33*d2fa5f95SSascha Wildner}
34*d2fa5f95SSascha Wildner
35*d2fa5f95SSascha Wildner# Print header and id
36*d2fa5f95SSascha WildnerNR == 1 {
37*d2fa5f95SSascha Wildner	VERSION = $0;
38*d2fa5f95SSascha Wildner	gsub("\^# ", "", VERSION)
39*d2fa5f95SSascha Wildner	gsub("\\$", "", VERSION)
40*d2fa5f95SSascha Wildner
41*d2fa5f95SSascha Wildner	printf("/*\n") > OUTPUT;
42*d2fa5f95SSascha Wildner	printf(" * THIS FILE IS AUTOMAGICALLY GENERATED.  DO NOT EDIT.\n") \
43*d2fa5f95SSascha Wildner	    > OUTPUT;
44*d2fa5f95SSascha Wildner	printf(" *\n") > OUTPUT;
45*d2fa5f95SSascha Wildner	printf(" * Generated from:\n") > OUTPUT;
46*d2fa5f95SSascha Wildner	printf(" * %s\n", VERSION) > OUTPUT;
47*d2fa5f95SSascha Wildner	printf(" */\n\n") > OUTPUT;
48*d2fa5f95SSascha Wildner}
49*d2fa5f95SSascha Wildner
50*d2fa5f95SSascha Wildner# Ignore comments and empty lines
51*d2fa5f95SSascha Wildner/^#/, NF == 0 {
52*d2fa5f95SSascha Wildner}
53*d2fa5f95SSascha Wildner
54*d2fa5f95SSascha Wildner#
55*d2fa5f95SSascha Wildner# NAME field: this is the first line of every entry
56*d2fa5f95SSascha Wildner#
57*d2fa5f95SSascha Wildner$1 == "name:" {
58*d2fa5f95SSascha Wildner	ENTRY_NAME = $2;
59*d2fa5f95SSascha Wildner	printf("const struct acpi_q_rule %s[] = {\n", ENTRY_NAME) > OUTPUT;
60*d2fa5f95SSascha Wildner}
61*d2fa5f95SSascha Wildner
62*d2fa5f95SSascha Wildner#
63*d2fa5f95SSascha Wildner# OEM field
64*d2fa5f95SSascha Wildner#
65*d2fa5f95SSascha Wildner$1 == "oem:" {
66*d2fa5f95SSascha Wildner	LENGTH = length();
67*d2fa5f95SSascha Wildner
68*d2fa5f95SSascha Wildner	# Parse table type to match
69*d2fa5f95SSascha Wildner	TABLE = $2;
70*d2fa5f95SSascha Wildner
71*d2fa5f95SSascha Wildner	# Parse OEM ID
72*d2fa5f95SSascha Wildner	M = match ($0, /\"[^\"]*\"/);
73*d2fa5f95SSascha Wildner	OEM_ID = substr($0, M, RLENGTH);
74*d2fa5f95SSascha Wildner
75*d2fa5f95SSascha Wildner	# Parse OEM Table ID
76*d2fa5f95SSascha Wildner	ANCHOR = LENGTH - (M + RLENGTH - 1);
77*d2fa5f95SSascha Wildner	REMAINDER = substr($0, M + RLENGTH, ANCHOR);
78*d2fa5f95SSascha Wildner	M = match (REMAINDER, /\"[^\"]*\"/);
79*d2fa5f95SSascha Wildner	OEM_TABLE_ID = substr(REMAINDER, M, RLENGTH);
80*d2fa5f95SSascha Wildner
81*d2fa5f95SSascha Wildner	printf("\t{ \"%s\", OEM, {%s}, {%s} },\n",
82*d2fa5f95SSascha Wildner	    TABLE, OEM_ID, OEM_TABLE_ID) > OUTPUT;
83*d2fa5f95SSascha Wildner}
84*d2fa5f95SSascha Wildner
85*d2fa5f95SSascha Wildner#
86*d2fa5f95SSascha Wildner# CREATOR field
87*d2fa5f95SSascha Wildner#
88*d2fa5f95SSascha Wildner$1 == "creator:" {
89*d2fa5f95SSascha Wildner	# Parse table type to match
90*d2fa5f95SSascha Wildner	TABLE = $2;
91*d2fa5f95SSascha Wildner
92*d2fa5f95SSascha Wildner	M = match ($0, /\"[^\"]*\"/);
93*d2fa5f95SSascha Wildner	CREATOR = substr($0, M, RLENGTH);
94*d2fa5f95SSascha Wildner
95*d2fa5f95SSascha Wildner	printf("\t{ \"%s\", CREATOR, {%s} },\n",
96*d2fa5f95SSascha Wildner	    TABLE, CREATOR) > OUTPUT;
97*d2fa5f95SSascha Wildner}
98*d2fa5f95SSascha Wildner
99*d2fa5f95SSascha Wildner#
100*d2fa5f95SSascha Wildner# OEM REVISION field
101*d2fa5f95SSascha Wildner#
102*d2fa5f95SSascha Wildner$1 == "oem_rev:" {
103*d2fa5f95SSascha Wildner	TABLE = $2;
104*d2fa5f95SSascha Wildner	SIGN = $3;
105*d2fa5f95SSascha Wildner	VALUE = $4;
106*d2fa5f95SSascha Wildner
107*d2fa5f95SSascha Wildner	# Parse operand
108*d2fa5f95SSascha Wildner	OPERAND = trans_sign(SIGN);
109*d2fa5f95SSascha Wildner
110*d2fa5f95SSascha Wildner	printf("\t{ \"%s\", OEM_REV, {.op = %s}, {.rev = %s} },\n",
111*d2fa5f95SSascha Wildner	    TABLE, OPERAND, VALUE) > OUTPUT;
112*d2fa5f95SSascha Wildner}
113*d2fa5f95SSascha Wildner
114*d2fa5f95SSascha Wildner#
115*d2fa5f95SSascha Wildner# CREATOR REVISION field
116*d2fa5f95SSascha Wildner#
117*d2fa5f95SSascha Wildner$1 == "creator_rev:" {
118*d2fa5f95SSascha Wildner	TABLE = $2;
119*d2fa5f95SSascha Wildner	SIGN = $3;
120*d2fa5f95SSascha Wildner	VALUE = $4;
121*d2fa5f95SSascha Wildner
122*d2fa5f95SSascha Wildner	# Parse operand
123*d2fa5f95SSascha Wildner	OPERAND = trans_sign(SIGN);
124*d2fa5f95SSascha Wildner
125*d2fa5f95SSascha Wildner	printf("\t{ \"%s\", CREATOR_REV, {.op = %s}, {.rev = %s} },\n",
126*d2fa5f95SSascha Wildner	    TABLE, OPERAND, VALUE) > OUTPUT;
127*d2fa5f95SSascha Wildner}
128*d2fa5f95SSascha Wildner
129*d2fa5f95SSascha Wildner#
130*d2fa5f95SSascha Wildner# QUIRKS field: This is the last line of every entry
131*d2fa5f95SSascha Wildner#
132*d2fa5f95SSascha Wildner$1 == "quirks:" {
133*d2fa5f95SSascha Wildner	printf("\t{ \"\" }\n};\n\n") > OUTPUT;
134*d2fa5f95SSascha Wildner
135*d2fa5f95SSascha Wildner	QUIRKS = $0;
136*d2fa5f95SSascha Wildner	sub(/^quirks:[ ]*/ , "", QUIRKS);
137*d2fa5f95SSascha Wildner
138*d2fa5f95SSascha Wildner	QUIRK_COUNT++;
139*d2fa5f95SSascha Wildner	QUIRK_LIST[QUIRK_COUNT] = QUIRKS;
140*d2fa5f95SSascha Wildner	QUIRK_NAME[QUIRK_COUNT] = ENTRY_NAME;
141*d2fa5f95SSascha Wildner}
142*d2fa5f95SSascha Wildner
143*d2fa5f95SSascha Wildner#
144*d2fa5f95SSascha Wildner# All information is gathered, now create acpi_quirks_table
145*d2fa5f95SSascha Wildner#
146*d2fa5f95SSascha WildnerEND {
147*d2fa5f95SSascha Wildner	# Header
148*d2fa5f95SSascha Wildner	printf("const struct acpi_q_entry acpi_quirks_table[] = {\n") \
149*d2fa5f95SSascha Wildner	    > OUTPUT;
150*d2fa5f95SSascha Wildner
151*d2fa5f95SSascha Wildner	# Array of all quirks
152*d2fa5f95SSascha Wildner	for (i = 1; i <= QUIRK_COUNT; i++) {
153*d2fa5f95SSascha Wildner		printf("\t{ %s, %s },\n", QUIRK_NAME[i], QUIRK_LIST[i]) \
154*d2fa5f95SSascha Wildner		    > OUTPUT;
155*d2fa5f95SSascha Wildner	}
156*d2fa5f95SSascha Wildner
157*d2fa5f95SSascha Wildner	# Footer
158*d2fa5f95SSascha Wildner	printf("\t{ NULL, 0 }\n") > OUTPUT;
159*d2fa5f95SSascha Wildner	printf("};\n") > OUTPUT;
160*d2fa5f95SSascha Wildner
161*d2fa5f95SSascha Wildner	exit(0);
162*d2fa5f95SSascha Wildner}
163*d2fa5f95SSascha Wildner
164*d2fa5f95SSascha Wildner#
165*d2fa5f95SSascha Wildner# Translate math SIGN into verbal OPERAND
166*d2fa5f95SSascha Wildner#
167*d2fa5f95SSascha Wildnerfunction trans_sign(TMP_SIGN)
168*d2fa5f95SSascha Wildner{
169*d2fa5f95SSascha Wildner	if (TMP_SIGN == "=")
170*d2fa5f95SSascha Wildner		TMP_OPERAND = "OP_EQL";
171*d2fa5f95SSascha Wildner	else if (TMP_SIGN == "!=")
172*d2fa5f95SSascha Wildner		TMP_OPERAND = "OP_NEQ";
173*d2fa5f95SSascha Wildner	else if (TMP_SIGN == "<=")
174*d2fa5f95SSascha Wildner		TMP_OPERAND = "OP_LEQ";
175*d2fa5f95SSascha Wildner	else if (TMP_SIGN == ">=")
176*d2fa5f95SSascha Wildner		TMP_OPERAND = "OP_GEQ";
177*d2fa5f95SSascha Wildner	else if (TMP_SIGN == ">")
178*d2fa5f95SSascha Wildner		TMP_OPERAND = "OP_GTR";
179*d2fa5f95SSascha Wildner	else if (TMP_SIGN == "<")
180*d2fa5f95SSascha Wildner		TMP_OPERAND = "OP_LES";
181*d2fa5f95SSascha Wildner	else {
182*d2fa5f95SSascha Wildner		printf("error: unknown sign: " TMP_SIGN "\n");
183*d2fa5f95SSascha Wildner		exit(1);
184*d2fa5f95SSascha Wildner	}
185*d2fa5f95SSascha Wildner
186*d2fa5f95SSascha Wildner	return (TMP_OPERAND);
187*d2fa5f95SSascha Wildner}
188