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