xref: /freebsd/sys/tools/acpi_quirks2h.awk (revision 031beb4e239bfce798af17f5fe8dba8bcaf13d99)
194f52979SNate Lawson#!/usr/bin/awk -f
294f52979SNate Lawson#
360727d8bSWarner Losh
460727d8bSWarner Losh#-
5*4d846d26SWarner Losh# SPDX-License-Identifier: BSD-2-Clause
6fe267a55SPedro F. Giffuni#
794f52979SNate Lawson# Copyright (c) 2004 Mark Santcroos <marks@ripe.net>
894f52979SNate Lawson# All rights reserved.
994f52979SNate Lawson#
1094f52979SNate Lawson# Redistribution and use in source and binary forms, with or without
1194f52979SNate Lawson# modification, are permitted provided that the following conditions
1294f52979SNate Lawson# are met:
1394f52979SNate Lawson# 1. Redistributions of source code must retain the above copyright
1494f52979SNate Lawson#    notice, this list of conditions and the following disclaimer.
1594f52979SNate Lawson# 2. Redistributions in binary form must reproduce the above copyright
1694f52979SNate Lawson#    notice, this list of conditions and the following disclaimer in the
1794f52979SNate Lawson#    documentation and/or other materials provided with the distribution.
1894f52979SNate Lawson#
1994f52979SNate Lawson# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
2094f52979SNate Lawson# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2194f52979SNate Lawson# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2294f52979SNate Lawson# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2394f52979SNate Lawson# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2494f52979SNate Lawson# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2594f52979SNate Lawson# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2694f52979SNate Lawson# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2794f52979SNate Lawson# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2894f52979SNate Lawson# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2994f52979SNate Lawson# SUCH DAMAGE.
3094f52979SNate Lawson#
3194f52979SNate Lawson
3294f52979SNate LawsonBEGIN {
3394f52979SNate Lawson	OUTPUT="acpi_quirks.h"
3494f52979SNate Lawson}
3594f52979SNate Lawson
3694f52979SNate Lawson# Print header and id
3794f52979SNate LawsonNR == 1 {
3894f52979SNate Lawson	VERSION = $0;
3994f52979SNate Lawson	gsub("\^# ", "", VERSION)
4094f52979SNate Lawson	gsub("\\$", "", VERSION)
4194f52979SNate Lawson
4294f52979SNate Lawson	printf("/*\n") > OUTPUT;
4394f52979SNate Lawson	printf(" * THIS FILE IS AUTOMAGICALLY GENERATED.  DO NOT EDIT.\n") \
4494f52979SNate Lawson	    > OUTPUT;
4594f52979SNate Lawson	printf(" *\n") > OUTPUT;
4694f52979SNate Lawson	printf(" * Generated from:\n") > OUTPUT;
4794f52979SNate Lawson	printf(" * %s\n", VERSION) > OUTPUT;
4894f52979SNate Lawson	printf(" */\n\n") > OUTPUT;
4994f52979SNate Lawson}
5094f52979SNate Lawson
5194f52979SNate Lawson# Ignore comments and empty lines
5294f52979SNate Lawson/^#/, NF == 0 {
5394f52979SNate Lawson}
5494f52979SNate Lawson
5594f52979SNate Lawson#
5694f52979SNate Lawson# NAME field: this is the first line of every entry
5794f52979SNate Lawson#
5894f52979SNate Lawson$1 == "name:" {
5994f52979SNate Lawson	ENTRY_NAME = $2;
60bcc2d4d5SNate Lawson	printf("const struct acpi_q_rule %s[] = {\n", ENTRY_NAME) > OUTPUT;
6194f52979SNate Lawson}
6294f52979SNate Lawson
6394f52979SNate Lawson#
6494f52979SNate Lawson# OEM field
6594f52979SNate Lawson#
6694f52979SNate Lawson$1 == "oem:" {
6794f52979SNate Lawson	LENGTH = length();
6894f52979SNate Lawson
6994f52979SNate Lawson	# Parse table type to match
7094f52979SNate Lawson	TABLE = $2;
7194f52979SNate Lawson
7294f52979SNate Lawson	# Parse OEM ID
7394f52979SNate Lawson	M = match ($0, /\"[^\"]*\"/);
7494f52979SNate Lawson	OEM_ID = substr($0, M, RLENGTH);
7594f52979SNate Lawson
7694f52979SNate Lawson	# Parse OEM Table ID
7794f52979SNate Lawson	ANCHOR = LENGTH - (M + RLENGTH - 1);
7894f52979SNate Lawson	REMAINDER = substr($0, M + RLENGTH, ANCHOR);
7994f52979SNate Lawson	M = match (REMAINDER, /\"[^\"]*\"/);
8094f52979SNate Lawson	OEM_TABLE_ID = substr(REMAINDER, M, RLENGTH);
8194f52979SNate Lawson
822be4e471SJung-uk Kim	printf("\t{ \"%s\", OEM, {%s}, {%s} },\n",
8394f52979SNate Lawson	    TABLE, OEM_ID, OEM_TABLE_ID) > OUTPUT;
8494f52979SNate Lawson}
8594f52979SNate Lawson
8694f52979SNate Lawson#
8794f52979SNate Lawson# CREATOR field
8894f52979SNate Lawson#
8994f52979SNate Lawson$1 == "creator:" {
9094f52979SNate Lawson	# Parse table type to match
9194f52979SNate Lawson	TABLE = $2;
9294f52979SNate Lawson
9394f52979SNate Lawson	M = match ($0, /\"[^\"]*\"/);
9494f52979SNate Lawson	CREATOR = substr($0, M, RLENGTH);
9594f52979SNate Lawson
962be4e471SJung-uk Kim	printf("\t{ \"%s\", CREATOR, {%s} },\n",
97bcc2d4d5SNate Lawson	    TABLE, CREATOR) > OUTPUT;
9894f52979SNate Lawson}
9994f52979SNate Lawson
10094f52979SNate Lawson#
10194f52979SNate Lawson# OEM REVISION field
10294f52979SNate Lawson#
10394f52979SNate Lawson$1 == "oem_rev:" {
104bcc2d4d5SNate Lawson	TABLE = $2;
10594f52979SNate Lawson	SIGN = $3;
10694f52979SNate Lawson	VALUE = $4;
10794f52979SNate Lawson
10894f52979SNate Lawson	# Parse operand
10994f52979SNate Lawson	OPERAND = trans_sign(SIGN);
11094f52979SNate Lawson
1112be4e471SJung-uk Kim	printf("\t{ \"%s\", OEM_REV, {.op = %s}, {.rev = %s} },\n",
112bcc2d4d5SNate Lawson	    TABLE, OPERAND, VALUE) > OUTPUT;
11394f52979SNate Lawson}
11494f52979SNate Lawson
11594f52979SNate Lawson#
11694f52979SNate Lawson# CREATOR REVISION field
11794f52979SNate Lawson#
11894f52979SNate Lawson$1 == "creator_rev:" {
119bcc2d4d5SNate Lawson	TABLE = $2;
12094f52979SNate Lawson	SIGN = $3;
12194f52979SNate Lawson	VALUE = $4;
12294f52979SNate Lawson
12394f52979SNate Lawson	# Parse operand
12494f52979SNate Lawson	OPERAND = trans_sign(SIGN);
12594f52979SNate Lawson
1262be4e471SJung-uk Kim	printf("\t{ \"%s\", CREATOR_REV, {.op = %s}, {.rev = %s} },\n",
127bcc2d4d5SNate Lawson	    TABLE, OPERAND, VALUE) > OUTPUT;
12894f52979SNate Lawson}
12994f52979SNate Lawson
13094f52979SNate Lawson#
13194f52979SNate Lawson# QUIRKS field: This is the last line of every entry
13294f52979SNate Lawson#
13394f52979SNate Lawson$1 == "quirks:" {
1342be4e471SJung-uk Kim	printf("\t{ \"\" }\n};\n\n") > OUTPUT;
13594f52979SNate Lawson
13694f52979SNate Lawson	QUIRKS = $0;
13794f52979SNate Lawson	sub(/^quirks:[ ]*/ , "", QUIRKS);
13894f52979SNate Lawson
13994f52979SNate Lawson	QUIRK_COUNT++;
14094f52979SNate Lawson	QUIRK_LIST[QUIRK_COUNT] = QUIRKS;
14194f52979SNate Lawson	QUIRK_NAME[QUIRK_COUNT] = ENTRY_NAME;
14294f52979SNate Lawson}
14394f52979SNate Lawson
14494f52979SNate Lawson#
14594f52979SNate Lawson# All information is gathered, now create acpi_quirks_table
14694f52979SNate Lawson#
14794f52979SNate LawsonEND {
14894f52979SNate Lawson	# Header
149bcc2d4d5SNate Lawson	printf("const struct acpi_q_entry acpi_quirks_table[] = {\n") \
15094f52979SNate Lawson	    > OUTPUT;
15194f52979SNate Lawson
15294f52979SNate Lawson	# Array of all quirks
15394f52979SNate Lawson	for (i = 1; i <= QUIRK_COUNT; i++) {
15494f52979SNate Lawson		printf("\t{ %s, %s },\n", QUIRK_NAME[i], QUIRK_LIST[i]) \
15594f52979SNate Lawson		    > OUTPUT;
15694f52979SNate Lawson	}
15794f52979SNate Lawson
15894f52979SNate Lawson	# Footer
15994f52979SNate Lawson	printf("\t{ NULL, 0 }\n") > OUTPUT;
16094f52979SNate Lawson	printf("};\n") > OUTPUT;
16194f52979SNate Lawson
16294f52979SNate Lawson	exit(0);
16394f52979SNate Lawson}
16494f52979SNate Lawson
16594f52979SNate Lawson#
16694f52979SNate Lawson# Translate math SIGN into verbal OPERAND
16794f52979SNate Lawson#
16894f52979SNate Lawsonfunction trans_sign(TMP_SIGN)
16994f52979SNate Lawson{
17094f52979SNate Lawson	if (TMP_SIGN == "=")
17194f52979SNate Lawson		TMP_OPERAND = "OP_EQL";
17294f52979SNate Lawson	else if (TMP_SIGN == "!=")
17394f52979SNate Lawson		TMP_OPERAND = "OP_NEQ";
17494f52979SNate Lawson	else if (TMP_SIGN == "<=")
17594f52979SNate Lawson		TMP_OPERAND = "OP_LEQ";
17694f52979SNate Lawson	else if (TMP_SIGN == ">=")
17794f52979SNate Lawson		TMP_OPERAND = "OP_GEQ";
17894f52979SNate Lawson	else if (TMP_SIGN == ">")
17994f52979SNate Lawson		TMP_OPERAND = "OP_GTR";
18094f52979SNate Lawson	else if (TMP_SIGN == "<")
18194f52979SNate Lawson		TMP_OPERAND = "OP_LES";
18294f52979SNate Lawson	else {
18394f52979SNate Lawson		printf("error: unknown sign: " TMP_SIGN "\n");
18494f52979SNate Lawson		exit(1);
18594f52979SNate Lawson	}
18694f52979SNate Lawson
18794f52979SNate Lawson	return (TMP_OPERAND);
18894f52979SNate Lawson}
189