#!/usr/bin/perl -w # Purpose: This perl script will parse HWP Attribute XML files # and add attribute information to a file called fapi2AttributeIds.H use strict; sub help { print ("Usage: ppeParseAttributeInfo.pl [ ...]\n"); print (" This perl script will parse attribute XML files and create the following files:\n"); print (" - fapi2AttributeIds.H. Contains IDs, type, value enums and other information\n"); print (" - fapi2ChipEcFeature.C. Contains a function to query chip EC features\n"); print (" - fapi2AttributePlatCheck.H. Contains compile time checks that all attributes are\n"); print (" handled by the platform\n"); print (" - fapi2AttributesSupported.html Contains the HWPF attributes supported\n"); print (" - fapi2AttrInfo.csv Used to process Attribute Override Text files\n"); print (" - fapi2AttrEnumInfo.csv Used to process Attribute Override Text files\n"); } my $DEBUG = 0; my $VERBOSE = 0; my $help = 0; #------------------------------------------------------------------------------ # Print Command Line Help #------------------------------------------------------------------------------ my $numArgs = $#ARGV + 1; if ($numArgs < 2) { print ("Invalid number of arguments\n\n"); help(); exit(1); } #------------------------------------------------------------------------------ # Specify perl modules to use #------------------------------------------------------------------------------ use Getopt::Long; use Digest::MD5 qw(md5_hex); use XML::Simple; my $xml = new XML::Simple (KeyAttr=>[]); GetOptions ("verbose" => \$VERBOSE, "help" => \$help, "debug" => \$DEBUG, ); if ($help) { help(); exit(0); } if ($DEBUG) { print "DEBUG enabled!!!!\n"; } # Uncomment to enable debug output #use Data::Dumper; #------------------------------------------------------------------------------ # Set PREFERRED_PARSER to XML::Parser. Otherwise it uses XML::SAX which contains # bugs that result in XML parse errors that can be fixed by adjusting white- # space (i.e. parse errors that do not make sense). #------------------------------------------------------------------------------ $XML::Simple::PREFERRED_PARSER = 'XML::Parser'; #------------------------------------------------------------------------------ # Open output files for writing #------------------------------------------------------------------------------ my $aiFile = $ARGV[0]; $aiFile .= "/"; $aiFile .= "fapi2AttributeIds.H"; open(AIFILE, ">", $aiFile); my $ecFile = $ARGV[0]; $ecFile .= "/"; $ecFile .= "fapi2ChipEcFeature.C"; open(ECFILE, ">", $ecFile); my $acFile = $ARGV[0]; $acFile .= "/"; $acFile .= "fapi2AttributePlatCheck.H"; open(ACFILE, ">", $acFile); my $asFile = $ARGV[0]; $asFile .= "/"; $asFile .= "fapi2AttributesSupported.html"; open(ASFILE, ">", $asFile); my $itFile = $ARGV[0]; $itFile .= "/"; $itFile .= "fapi2AttrInfo.csv"; open(ITFILE, ">", $itFile); my $etFile = $ARGV[0]; $etFile .= "/"; $etFile .= "fapi2AttrEnumInfo.csv"; open(ETFILE, ">", $etFile); #------------------------------------------------------------------------------ # Print Start of file information to fapiAttributeIds.H #------------------------------------------------------------------------------ print AIFILE "// fapi2AttributeIds.H\n"; print AIFILE "// This file is generated by perl script fapiParseAttributeInfo.pl\n\n"; print AIFILE "#ifndef FAPI2ATTRIBUTEIDS_H_\n"; print AIFILE "#define FAPI2ATTRIBUTEIDS_H_\n\n"; print AIFILE "#ifndef __ASSEMBLER__\n\n"; print AIFILE "#include \n"; print AIFILE "#include \n\n"; print AIFILE "namespace fapi2\n"; print AIFILE "{\n\n"; print AIFILE "\/**\n"; print AIFILE " * \@brief Enumeration of attribute IDs\n"; print AIFILE " *\/\n"; print AIFILE "enum AttributeId\n{\n"; #------------------------------------------------------------------------------ # Print Start of file information to fapiChipEcFeature.C #------------------------------------------------------------------------------ print ECFILE "// fapiChipEcFeature.C\n"; print ECFILE "// This file is generated by perl script fapiParseAttributeInfo.pl\n"; print ECFILE "// It implements the fapiQueryChipEcFeature function\n\n"; print ECFILE "#include \n"; print ECFILE "#include \n"; print ECFILE "#include \n"; print ECFILE "#include \n\n"; print ECFILE "namespace fapi2\n"; print ECFILE "{\n\n"; print ECFILE "fapi::ReturnCode fapiQueryChipEcFeature(fapi::AttributeId i_id,\n"; print ECFILE " const fapi::Target * i_pTarget,\n"; print ECFILE " uint8_t & o_hasFeature)\n"; print ECFILE "{\n"; print ECFILE " o_hasFeature = false;\n"; print ECFILE " fapi::ReturnCode l_rc;\n"; print ECFILE " uint8_t l_chipName = 0;\n"; print ECFILE " uint8_t l_chipEc = 0;\n"; print ECFILE " fapi::Target l_target = *i_pTarget;\n\n"; print ECFILE " if (i_pTarget->isChiplet())\n"; print ECFILE " {\n"; print ECFILE " l_rc = fapiGetParentChip(*i_pTarget, l_target);\n\n"; print ECFILE " if (l_rc)\n"; print ECFILE " {\n"; print ECFILE " FAPI_ERR(\"fapiQueryChipEcFeature: error getting parent chip\");\n"; print ECFILE " }\n"; print ECFILE " }\n\n"; print ECFILE " if (!l_rc)\n"; print ECFILE " {\n"; print ECFILE " l_rc = FAPI_ATTR_GET_PRIVILEGED(ATTR_NAME, &l_target, l_chipName);\n\n"; print ECFILE " if (l_rc)\n"; print ECFILE " {\n"; print ECFILE " FAPI_ERR(\"fapiQueryChipEcFeature: error getting chip name\");\n"; print ECFILE " }\n"; print ECFILE " else\n"; print ECFILE " {\n"; print ECFILE " l_rc = FAPI_ATTR_GET_PRIVILEGED(ATTR_EC, &l_target, l_chipEc);\n\n"; print ECFILE " if (l_rc)\n"; print ECFILE " {\n"; print ECFILE " FAPI_ERR(\"fapiQueryChipEcFeature: error getting chip ec\");\n"; print ECFILE " }\n"; print ECFILE " else\n"; print ECFILE " {\n"; print ECFILE " switch (i_id)\n"; print ECFILE " {\n"; #------------------------------------------------------------------------------ # Print Start of file information to fapiAttributePlatCheck.H #------------------------------------------------------------------------------ print ACFILE "// fapiAttributePlatCheck.H\n"; print ACFILE "// This file is generated by perl script fapiParseAttributeInfo.pl\n"; print ACFILE "// A platform can include it to ensure that it handles all HWPF\n"; print ACFILE "// attributes\n\n"; print ACFILE "#ifndef FAPIATTRIBUTEPLATCHECK_H_\n"; print ACFILE "#define FAPIATTRIBUTEPLATCHECK_H_\n\n"; #------------------------------------------------------------------------------ # Print Start of file information to fapiAttributesSupported.html #------------------------------------------------------------------------------ print ASFILE "\n"; print ASFILE "\n\n"; print ASFILE "\n"; print ASFILE "\n"; print ASFILE "\n\n"; print ASFILE "

HWPF Attributes supported by this build.

\n"; print ASFILE "\n"; print ASFILE ""; #------------------------------------------------------------------------------ # Print Start of file information to fapiAttrInfo.csv #------------------------------------------------------------------------------ print ITFILE "# fapiAttrInfo.csv\n"; print ITFILE "# This file is generated by perl script fapiParseAttributeInfo.pl\n"; print ITFILE "# It lists information about FAPI attributes and is used to\n"; print ITFILE "# process FAPI Attribute text files (overrides/syncs)\n"; print ITFILE "# Format:\n"; print ITFILE "# ,,,\n"; print ITFILE "# Note that for the AttributeTanks at the FAPI layer, the\n"; print ITFILE "# FAPI-ATTR-ID-STR and LAYER-ATTR-ID-STR will be identical\n"; #------------------------------------------------------------------------------ # Print Start of file information to fapiAttrEnumInfo.csv #------------------------------------------------------------------------------ print ETFILE "# fapiAttrEnumInfo.csv\n"; print ETFILE "# This file is generated by perl script fapiParseAttributeInfo.pl\n"; print ETFILE "# It lists information about FAPI attribute enumeratorss and is\n"; print ETFILE "# used to process FAPI Attribute text files (overrides/syncs)\n"; print ETFILE "# Format:\n"; print ETFILE "# ,\n"; my %attrIdHash; # Records which Attribute IDs have been used my %attrValHash; # Records which Attribute values have been used #------------------------------------------------------------------------------ # For each XML file #------------------------------------------------------------------------------ #my $argfile = "p9_ppe_attributes.xml"; my $argfile = $ARGV[1]; if ($DEBUG) { print "DEBUG:: XML filter file - $argfile\n" } my $entries = $xml->XMLin($argfile, ForceArray => ['entry']); foreach my $entr (@{$entries->{entry}}) { my $inname = $entr->{name}; if ($DEBUG) { print "DEBUG:: entr->file = $entr->{file}; \n" } foreach my $argnum (2 .. $#ARGV) { my $infile = $ARGV[$argnum]; # read XML file. The ForceArray option ensures that there is an array of # elements even if there is only one such element in the file my $attributes = $xml->XMLin($infile, ForceArray => ['attribute']); if ($DEBUG) { print "DEBUG:: File: ", $infile, "\n", Dumper($attributes), "\n"; } #-------------------------------------------------------------------------- # For each Attribute #-------------------------------------------------------------------------- foreach my $attr (@{$attributes->{attribute}}) { #print "? $attr->{id}, $inname\n"; if($attr->{id} eq $inname) { #print "yes $attr->{id}, $inname\n"; #---------------------------------------------------------------------- # Print the Attribute ID and calculated value to fapiAttributeIds.H and # fapiAttributeIds.txt. The value for an attribute is a hash value # generated from the attribute name, this ties a specific value to a # specific attribute name. This is done for Cronus so that if a HWP is # not recompiled against a new eCMD/Cronus version where the attributes # have changed then there will not be a mismatch in enumerator values. # This is a 28bit hash value because the Initfile compiler has a # requirement that the top nibble of the 32 bit attribute ID be zero to # store flags #---------------------------------------------------------------------- if (! exists $attr->{id}) { print ("fapiParseAttributeInfo.pl ERROR. Attribute 'id' missing in $infile\n"); exit(1); } if (exists($attrIdHash{$attr->{id}})) { # Two different attributes with the same id! print ("fapiParseAttributeInfo.pl ERROR. Duplicate Attribute id $attr->{id} in $infile\\n"); exit(1); } # Calculate a 28 bit hash value. my $attrHash128Bit = md5_hex($attr->{id}); my $attrHash28Bit = substr($attrHash128Bit, 0, 7); # Print the attribute ID/value to fapiAttributeIds.H print AIFILE " $attr->{id} = 0x$attrHash28Bit,\n"; if (exists($attrValHash{$attrHash28Bit})) { # Two different attributes generate the same hash-value! print ("fapiParseAttributeInfo.pl ERROR. Duplicate attr id hash value for $attr->{id} in $infile\ \n"); exit(1); } $attrIdHash{$attr->{id}} = $attrHash28Bit; $attrValHash{$attrHash28Bit} = 1; } }; } } #------------------------------------------------------------------------------ # Print AttributeId enumeration end to fapiAttributeIds.H #------------------------------------------------------------------------------ print AIFILE "};\n\n"; #------------------------------------------------------------------------------ # Print Attribute Information comment to fapiAttributeIds.H #------------------------------------------------------------------------------ print AIFILE "\/**\n"; print AIFILE " * \@brief Attribute Information\n"; print AIFILE " *\/\n"; foreach my $entr (@{$entries->{entry}}) { # print " $entr->{file}, $entr->{name}\n"; # my $infile = $entr->{file}; my $inname = $entr->{name}; # read XML file. The ForceArray option ensures that there is an array of # elements even if there is only one such element in the file foreach my $argnum (2 .. $#ARGV) { my $infile = $ARGV[$argnum]; my $attributes = $xml->XMLin($infile, ForceArray => ['attribute']); # Uncomment to get debug output of all attributes if ($DEBUG) { print "DEBUG:: File: ", $infile, "\n", Dumper($attributes), "\n"; } #-------------------------------------------------------------------------- # For each Attribute #-------------------------------------------------------------------------- foreach my $attr (@{$attributes->{attribute}}) { if($attr->{id} eq $inname) { #---------------------------------------------------------------------- # Print a comment with the attribute ID fapiAttributeIds.H #---------------------------------------------------------------------- print AIFILE "/* $attr->{id} */\n"; #---------------------------------------------------------------------- # Print the AttributeId and description to fapiAttributesSupported.html #---------------------------------------------------------------------- if (! exists $attr->{description}) { print ("fapiParseAttributeInfo.pl ERROR. Attribute 'description' missing for $attr->{id} in $infile\n"); exit(1); } #---------------------------------------------------------------------- # Figure out the attribute array dimensions (if array) #---------------------------------------------------------------------- my $arrayDimensions = ""; my $numArrayDimensions = 0; if ($attr->{array}) { # Remove leading whitespace my $dimText = $attr->{array}; $dimText =~ s/^\s+//; # Split on commas or whitespace my @vals = split(/\s*,\s*|\s+/, $dimText); foreach my $val (@vals) { $arrayDimensions .= "[${val}]"; $numArrayDimensions++; } } #---------------------------------------------------------------------- # Print the typedef for each attribute's val type to fapiAttributeIds.H # Print the attribute information to fapiAttrInfo.csv #---------------------------------------------------------------------- if (exists $attr->{chipEcFeature}) { # The value type of chip EC feature attributes is uint8_t print AIFILE "typedef uint8_t $attr->{id}_Type;\n"; print ITFILE "$attr->{id},$attr->{id},0x$attrIdHash{$attr->{id}},u8\n" } else { if (! exists $attr->{valueType}) { print ("fapiParseAttributeInfo.pl ERROR. Att 'valueType' missing for $attr->{id} in $infile\n"); exit(1); } if ($attr->{valueType} eq 'uint8') { print AIFILE "typedef uint8_t $attr->{id}_Type$arrayDimensions;\n"; print ITFILE "$attr->{id},$attr->{id},0x$attrIdHash{$attr->{id}},u8" . "$arrayDimensions\n"; } elsif ($attr->{valueType} eq 'uint16') { print AIFILE "typedef uint16_t $attr->{id}_Type$arrayDimensions;\n"; print ITFILE "$attr->{id},$attr->{id},0x$attrIdHash{$attr->{id}},u8" . "$arrayDimensions\n"; } elsif ($attr->{valueType} eq 'uint32') { print AIFILE "typedef uint32_t $attr->{id}_Type$arrayDimensions;\n"; print ITFILE "$attr->{id},$attr->{id},0x$attrIdHash{$attr->{id}},u32" . "$arrayDimensions\n"; } elsif ($attr->{valueType} eq 'uint64') { print AIFILE "typedef uint64_t $attr->{id}_Type$arrayDimensions;\n"; print ITFILE "$attr->{id},$attr->{id},0x$attrIdHash{$attr->{id}},u64" . "$arrayDimensions\n"; } elsif ($attr->{valueType} eq 'int8') { print AIFILE "typedef int8_t $attr->{id}_Type$arrayDimensions;\n"; print ITFILE "$attr->{id},$attr->{id},0x$attrIdHash{$attr->{id}},8" . "$arrayDimensions\n"; } elsif ($attr->{valueType} eq 'int16') { print AIFILE "typedef int16_t $attr->{id}_Type$arrayDimensions;\n"; print ITFILE "$attr->{id},$attr->{id},0x$attrIdHash{$attr->{id}},32" . "$arrayDimensions\n"; } elsif ($attr->{valueType} eq 'int32') { print AIFILE "typedef int32_t $attr->{id}_Type$arrayDimensions;\n"; print ITFILE "$attr->{id},$attr->{id},0x$attrIdHash{$attr->{id}},32" . "$arrayDimensions\n"; } elsif ($attr->{valueType} eq 'int64') { print AIFILE "typedef int64_t $attr->{id}_Type$arrayDimensions;\n"; print ITFILE "$attr->{id},$attr->{id},0x$attrIdHash{$attr->{id}},64" . "$arrayDimensions\n"; } else { print ("fapi2ParseAttributeInfo.pl ERROR. valueType not recognized: "); print $attr->{valueType}, " for $attr->{id} in $infile\n"; exit(1); } } #---------------------------------------------------------------------- # Print if the attribute is privileged #---------------------------------------------------------------------- if (exists $attr->{privileged}) { print AIFILE "const bool $attr->{id}_Privileged = true;\n"; } else { print AIFILE "const bool $attr->{id}_Privileged = false;\n"; } #---------------------------------------------------------------------- # Print the target type(s) that the attribute is associated with #---------------------------------------------------------------------- if (! exists $attr->{targetType}) { print ("fapiParseAttributeInfo.pl ERROR. Att 'targetType' missing for $attr->{id} in $infile\n"); exit(1); } print AIFILE "const TargetTypes_t $attr->{id}_TargetTypes = "; # Split on commas my @targTypes = split(',', $attr->{targetType}); my $targTypeCount = 0; foreach my $targType (@targTypes) { # Remove newlines and leading/trailing whitespace $targType =~ s/\n//; $targType =~ s/^\s+//; $targType =~ s/\s+$//; if ($targTypeCount != 0) { print AIFILE " | "; } print AIFILE "$targType"; $targTypeCount++; } print AIFILE ";\n"; #---------------------------------------------------------------------- # Print if the attribute is a platInit attribute #---------------------------------------------------------------------- if (exists $attr->{platInit}) { print AIFILE "const bool $attr->{id}_PlatInit = true;\n"; } else { print AIFILE "const bool $attr->{id}_PlatInit = false;\n"; } #---------------------------------------------------------------------- # Print if the attribute is a initToZero attribute #---------------------------------------------------------------------- if (exists $attr->{initToZero}) { print AIFILE "const bool $attr->{id}_InitToZero = true;\n"; } else { print AIFILE "const bool $attr->{id}_InitToZero = false;\n"; } #---------------------------------------------------------------------- # Print the value enumeration (if specified) to fapiAttributeIds.H and # fapiAttributeEnums.txt #---------------------------------------------------------------------- if (exists $attr->{enum}) { print AIFILE "enum $attr->{id}_Enum\n{\n"; # Values must be separated by commas to allow for values to be # specified: VAL_A = 3, VAL_B = 5, VAL_C = 0x23 my @vals = split(',', $attr->{enum}); foreach my $val (@vals) { # Remove newlines and leading/trailing whitespace $val =~ s/\n//; $val =~ s/^\s+//; $val =~ s/\s+$//; # Print the attribute enum to fapiAttributeIds.H print AIFILE " ENUM_$attr->{id}_${val}"; # Print the attribute enum to fapiAttrEnumInfo.csv my $attrEnumTxt = "$attr->{id}_${val}\n"; $attrEnumTxt =~ s/ = /,/; print ETFILE $attrEnumTxt; if ($attr->{valueType} eq 'uint64') { print AIFILE "ULL"; } print AIFILE ",\n"; } print AIFILE "};\n"; } #---------------------------------------------------------------------- # Print _GETMACRO and _SETMACRO where appropriate to fapiAttributeIds.H #---------------------------------------------------------------------- if (exists $attr->{chipEcFeature}) { #------------------------------------------------------------------ # The attribute is a Chip EC Feature, define _GETMACRO to call a # fapi function and define _SETMACRO to something that will cause a # compile failure if a set is attempted #------------------------------------------------------------------ print AIFILE "#define $attr->{id}_GETMACRO(ID, PTARGET, VAL) \\\n"; print AIFILE " PLAT_GET_CHIP_EC_FEATURE_OVERRIDE(ID, PTARGET, VAL) ? fapi::FAPI_RC_SUCCESS : \\\n"; print AIFILE " fapi::fapiQueryChipEcFeature(fapi::ID, PTARGET, VAL)\n"; print AIFILE "#define $attr->{id}_SETMACRO(ID, PTARGET, VAL) "; print AIFILE "CHIP_EC_FEATURE_ATTRIBUTE_NOT_WRITABLE\n"; } elsif (! exists $attr->{writeable}) { #------------------------------------------------------------------ # The attribute is read-only, define the _SETMACRO to something # that will cause a compile failure if a set is attempted #------------------------------------------------------------------ if (! exists $attr->{writeable}) { print AIFILE "#define $attr->{id}_SETMACRO ATTRIBUTE_NOT_WRITABLE\n"; } } #---------------------------------------------------------------------- # If the attribute is a Chip EC Feature, print the chip EC feature # query to fapiChipEcFeature.C #---------------------------------------------------------------------- if (exists $attr->{chipEcFeature}) { my $chipCount = 0; print ECFILE " case $attr->{id}:\n"; print ECFILE " if (\n"; foreach my $chip (@{$attr->{chipEcFeature}->{chip}}) { $chipCount++; if (! exists $chip->{name}) { print ("fapiParseAttributeInfo.pl ERROR. Att 'name' missing\n"); exit(1); } if (! exists $chip->{ec}) { print ("fapiParseAttributeInfo.pl ERROR. Att 'ec' missing\n"); exit(1); } if (! exists $chip->{ec}->{value}) { print ("fapiParseAttributeInfo.pl ERROR. Att 'value' missing\n"); exit(1); } if (! exists $chip->{ec}->{test}) { print ("fapiParseAttributeInfo.pl ERROR. Att 'test' missing\n"); exit(1); } my $test; if ($chip->{ec}->{test} eq 'EQUAL') { $test = '=='; } elsif ($chip->{ec}->{test} eq 'GREATER_THAN') { $test = '>'; } elsif ($chip->{ec}->{test} eq 'GREATER_THAN_OR_EQUAL') { $test = '>='; } elsif ($chip->{ec}->{test} eq 'LESS_THAN') { $test = '<'; } elsif ($chip->{ec}->{test} eq 'LESS_THAN_OR_EQUAL') { $test = '<='; } else { print ("fapiParseAttributeInfo.pl ERROR. test '$chip->{ec}->{test}' unrecognized\n"); exit(1); } if ($chipCount > 1) { print ECFILE " ||\n"; } print ECFILE " ((l_chipName == $chip->{name}) &&\n"; print ECFILE " (l_chipEc $test $chip->{ec}->{value}))\n"; } print ECFILE " )\n"; print ECFILE " {\n"; print ECFILE " o_hasFeature = true;\n"; print ECFILE " }\n"; print ECFILE " break;\n"; } #---------------------------------------------------------------------- # Print the platform attribute checks to fapiAttributePlatCheck.H #---------------------------------------------------------------------- if (exists $attr->{writeable}) { print ACFILE "#ifndef $attr->{id}_SETMACRO\n"; print ACFILE "#error Platform does not support set of HWPF attr $attr->{id}\n"; print ACFILE "#endif\n"; } print ACFILE "#ifndef $attr->{id}_GETMACRO\n"; print ACFILE "#error Platform does not support get of HWPF attr $attr->{id}\n"; print ACFILE "#endif\n\n"; #---------------------------------------------------------------------- # Print newline between each attribute's info to fapiAttributeIds.H #---------------------------------------------------------------------- print AIFILE "\n"; } }; } } =for comment #------------------------------------------------------------------------------ # For each XML file #------------------------------------------------------------------------------ foreach my $argnum (1 .. $#ARGV) { my $infile = $ARGV[$argnum]; # read XML file. The ForceArray option ensures that there is an array of # elements even if there is only one such element in the file my $attributes = $xml->XMLin($infile, ForceArray => ['attribute', 'chip']); #-------------------------------------------------------------------------- # For each Attribute #-------------------------------------------------------------------------- foreach my $attr (@{$attributes->{attribute}}) { #---------------------------------------------------------------------- # Print a comment with the attribute ID fapiAttributeIds.H #---------------------------------------------------------------------- print AIFILE "/* $attr->{id} */\n"; #---------------------------------------------------------------------- # Print the AttributeId and description to fapiAttributesSupported.html #---------------------------------------------------------------------- if (! exists $attr->{description}) { print ("fapiParseAttributeInfo.pl ERROR. Att 'description' missing\n"); exit(1); } print ASFILE "\n"; print ASFILE " \n"; print ASFILE " \n"; print ASFILE "\n"; #---------------------------------------------------------------------- # Figure out the attribute array dimensions (if array) #---------------------------------------------------------------------- my $arrayDimensions = ""; my $numArrayDimensions = 0; if ($attr->{array}) { # Remove leading whitespace my $dimText = $attr->{array}; $dimText =~ s/^\s+//; # Split on commas or whitespace my @vals = split(/\s*,\s*|\s+/, $dimText); foreach my $val (@vals) { $arrayDimensions .= "[${val}]"; $numArrayDimensions++; } } #---------------------------------------------------------------------- # Print the typedef for each attribute's val type to fapiAttributeIds.H # Print the attribute information to fapiAttrInfo.csv #---------------------------------------------------------------------- if (exists $attr->{chipEcFeature}) { # The value type of chip EC feature attributes is uint8_t print AIFILE "typedef uint8_t $attr->{id}_Type;\n"; print ITFILE "$attr->{id},$attr->{id},0x$attrIdHash{$attr->{id}},u8\n" } else { if (! exists $attr->{valueType}) { print ("fapiParseAttributeInfo.pl ERROR. Att 'valueType' missing\n"); exit(1); } if ($attr->{valueType} eq 'uint8') { print AIFILE "typedef uint8_t $attr->{id}_Type$arrayDimensions;\n"; print ITFILE "$attr->{id},$attr->{id},0x$attrIdHash{$attr->{id}},u8" . "$arrayDimensions\n"; } elsif ($attr->{valueType} eq 'uint32') { print AIFILE "typedef uint32_t $attr->{id}_Type$arrayDimensions;\n"; print ITFILE "$attr->{id},$attr->{id},0x$attrIdHash{$attr->{id}},u32" . "$arrayDimensions\n"; } elsif ($attr->{valueType} eq 'uint64') { print AIFILE "typedef uint64_t $attr->{id}_Type$arrayDimensions;\n"; print ITFILE "$attr->{id},$attr->{id},0x$attrIdHash{$attr->{id}},u64" . "$arrayDimensions\n"; } else { print ("fapiParseAttributeInfo.pl ERROR. valueType not recognized: "); print $attr->{valueType}, "\n"; exit(1); } } #---------------------------------------------------------------------- # Print if the attribute is privileged #---------------------------------------------------------------------- if (exists $attr->{privileged}) { print AIFILE "const bool $attr->{id}_Privileged = true;\n"; } else { print AIFILE "const bool $attr->{id}_Privileged = false;\n"; } #---------------------------------------------------------------------- # Print the target type(s) that the attribute is associated with #---------------------------------------------------------------------- if (! exists $attr->{targetType}) { print ("fapiParseAttributeInfo.pl ERROR. Att 'targetType' missing\n"); exit(1); } print AIFILE "const TargetTypes_t $attr->{id}_TargetTypes = "; # Split on commas my @targTypes = split(',', $attr->{targetType}); my $targTypeCount = 0; foreach my $targType (@targTypes) { # Remove newlines and leading/trailing whitespace $targType =~ s/\n//; $targType =~ s/^\s+//; $targType =~ s/\s+$//; if ($targTypeCount != 0) { print AIFILE " | "; } print AIFILE "$targType"; $targTypeCount++; } print AIFILE ";\n"; #---------------------------------------------------------------------- # Print if the attribute is a platInit attribute #---------------------------------------------------------------------- if (exists $attr->{platInit}) { print AIFILE "const bool $attr->{id}_PlatInit = true;\n"; } else { print AIFILE "const bool $attr->{id}_PlatInit = false;\n"; } #---------------------------------------------------------------------- # Print if the attribute is a initToZero attribute #---------------------------------------------------------------------- if (exists $attr->{initToZero}) { print AIFILE "const bool $attr->{id}_InitToZero = true;\n"; } else { print AIFILE "const bool $attr->{id}_InitToZero = false;\n"; } #---------------------------------------------------------------------- # Print the value enumeration (if specified) to fapiAttributeIds.H and # fapiAttributeEnums.txt #---------------------------------------------------------------------- if (exists $attr->{enum}) { print AIFILE "enum $attr->{id}_Enum\n{\n"; # Values must be separated by commas to allow for values to be # specified: VAL_A = 3, VAL_B = 5, VAL_C = 0x23 my @vals = split(',', $attr->{enum}); foreach my $val (@vals) { # Remove newlines and leading/trailing whitespace $val =~ s/\n//; $val =~ s/^\s+//; $val =~ s/\s+$//; # Print the attribute enum to fapiAttributeIds.H print AIFILE " ENUM_$attr->{id}_${val}"; # Print the attribute enum to fapiAttrEnumInfo.csv my $attrEnumTxt = "$attr->{id}_${val}\n"; $attrEnumTxt =~ s/ = /,/; print ETFILE $attrEnumTxt; if ($attr->{valueType} eq 'uint64') { print AIFILE "ULL"; } print AIFILE ",\n"; } print AIFILE "};\n"; } #---------------------------------------------------------------------- # Print _GETMACRO and _SETMACRO where appropriate to fapiAttributeIds.H #---------------------------------------------------------------------- if (exists $attr->{chipEcFeature}) { #------------------------------------------------------------------ # The attribute is a Chip EC Feature, define _GETMACRO to call a # fapi function and define _SETMACRO to something that will cause a # compile failure if a set is attempted #------------------------------------------------------------------ print AIFILE "#define $attr->{id}_GETMACRO(ID, PTARGET, VAL) \\\n"; print AIFILE " PLAT_GET_CHIP_EC_FEATURE_OVERRIDE(ID, PTARGET, VAL) ? fapi::FAPI_RC_SUCCESS : \\\n"; print AIFILE " fapi::fapiQueryChipEcFeature(fapi::ID, PTARGET, VAL)\n"; print AIFILE "#define $attr->{id}_SETMACRO(ID, PTARGET, VAL) "; print AIFILE "CHIP_EC_FEATURE_ATTRIBUTE_NOT_WRITABLE\n"; } elsif (! exists $attr->{writeable}) { #------------------------------------------------------------------ # The attribute is read-only, define the _SETMACRO to something # that will cause a compile failure if a set is attempted #------------------------------------------------------------------ if (! exists $attr->{writeable}) { print AIFILE "#define $attr->{id}_SETMACRO ATTRIBUTE_NOT_WRITABLE\n"; } } #---------------------------------------------------------------------- # If the attribute is a Chip EC Feature, print the chip EC feature # query to fapiChipEcFeature.C #---------------------------------------------------------------------- if (exists $attr->{chipEcFeature}) { my $chipCount = 0; print ECFILE " case $attr->{id}:\n"; print ECFILE " if (\n"; foreach my $chip (@{$attr->{chipEcFeature}->{chip}}) { $chipCount++; if (! exists $chip->{name}) { print ("fapiParseAttributeInfo.pl ERROR. Att 'name' missing\n"); exit(1); } if (! exists $chip->{ec}) { print ("fapiParseAttributeInfo.pl ERROR. Att 'ec' missing\n"); exit(1); } if (! exists $chip->{ec}->{value}) { print ("fapiParseAttributeInfo.pl ERROR. Att 'value' missing\n"); exit(1); } if (! exists $chip->{ec}->{test}) { print ("fapiParseAttributeInfo.pl ERROR. Att 'test' missing\n"); exit(1); } my $test; if ($chip->{ec}->{test} eq 'EQUAL') { $test = '=='; } elsif ($chip->{ec}->{test} eq 'GREATER_THAN') { $test = '>'; } elsif ($chip->{ec}->{test} eq 'GREATER_THAN_OR_EQUAL') { $test = '>='; } elsif ($chip->{ec}->{test} eq 'LESS_THAN') { $test = '<'; } elsif ($chip->{ec}->{test} eq 'LESS_THAN_OR_EQUAL') { $test = '<='; } else { print ("fapiParseAttributeInfo.pl ERROR. test '$chip->{ec}->{test}' unrecognized\n"); exit(1); } if ($chipCount > 1) { print ECFILE " ||\n"; } print ECFILE " ((l_chipName == $chip->{name}) &&\n"; print ECFILE " (l_chipEc $test $chip->{ec}->{value}))\n"; } print ECFILE " )\n"; print ECFILE " {\n"; print ECFILE " o_hasFeature = true;\n"; print ECFILE " }\n"; print ECFILE " break;\n"; } #---------------------------------------------------------------------- # Print the platform attribute checks to fapiAttributePlatCheck.H #---------------------------------------------------------------------- if (exists $attr->{writeable}) { print ACFILE "#ifndef $attr->{id}_SETMACRO\n"; print ACFILE "#error Platform does not support set of HWPF attr $attr->{id}\n"; print ACFILE "#endif\n"; } print ACFILE "#ifndef $attr->{id}_GETMACRO\n"; print ACFILE "#error Platform does not support get of HWPF attr $attr->{id}\n"; print ACFILE "#endif\n\n"; #---------------------------------------------------------------------- # Print newline between each attribute's info to fapiAttributeIds.H #---------------------------------------------------------------------- print AIFILE "\n"; }; } =cut #------------------------------------------------------------------------------ # Print End of file information to fapiAttributeIds.H #------------------------------------------------------------------------------ print AIFILE "} //fapi2 \n\n"; print AIFILE "#endif // __ASSEMBLER__\n\n"; print AIFILE "#endif\n"; #------------------------------------------------------------------------------ # Print End of file information to fapiChipEcFeature.C #------------------------------------------------------------------------------ print ECFILE " default:\n"; print ECFILE " FAPI_ERR(\"fapiQueryChipEcFeature: Unknown feature 0x%x\",\n"; print ECFILE " i_id);\n"; print ECFILE " l_rc.setFapiError(FAPI_RC_INVALID_CHIP_EC_FEATURE_GET);\n"; print ECFILE " l_rc.addEIFfdc(0, &i_id, sizeof(i_id));\n"; print ECFILE " break;\n"; print ECFILE " }\n\n"; print ECFILE " if (o_hasFeature)\n"; print ECFILE " {\n"; print ECFILE " FAPI_INF(\"fapiQueryChipEcFeature: Chip (0x%x:0x%x) has "; print ECFILE "feature (0x%x)\", l_chipName, l_chipEc, i_id);\n"; print ECFILE " }\n"; print ECFILE " else\n"; print ECFILE " {\n"; print ECFILE " FAPI_INF(\"fapiQueryChipEcFeature: Chip (0x%x:0x%x) does not "; print ECFILE "have feature (0x%x)\", l_chipName, l_chipEc, i_id);\n"; print ECFILE " }\n"; print ECFILE " }\n"; print ECFILE " }\n"; print ECFILE " }\n"; print ECFILE " return l_rc;\n"; print ECFILE "}\n\n"; print ECFILE "}\n"; #------------------------------------------------------------------------------ # Print End of file information to fapiAttributePlatCheck.H #------------------------------------------------------------------------------ print ACFILE "#endif\n"; #------------------------------------------------------------------------------ # Print End of file information to fapiAttributesSupported.html #------------------------------------------------------------------------------ print ASFILE "
Attribute IDAttribute Description
$attr->{id}$attr->{description}
\n\n"; print ASFILE "\n"; print ASFILE "\n"; #------------------------------------------------------------------------------ # Close output files #------------------------------------------------------------------------------ close(AIFILE); close(ECFILE); close(ACFILE); close(ASFILE); close(ITFILE); close(ETFILE);