From d4e4d0d4af9447731eecf660c41b9e5000eca5eb Mon Sep 17 00:00:00 2001 From: "Richard J. Knight" Date: Thu, 7 Apr 2016 14:14:26 -0500 Subject: Procedure crashes when trying to query an EC feature -Updated queryEcFeature to have two parts, base attribute reading is now in a library, while feature checking logic is now in small individual inline functions. Change-Id: I4c3685d6a85946297af31f7f3da4d918bca88039 RTC:151184 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/23025 Tested-by: Jenkins Server Tested-by: PPE CI Tested-by: Hostboot CI Reviewed-by: Matt K. Light Reviewed-by: Daniel M. Crowell Reviewed-by: Thi N. Tran Reviewed-by: Jennifer A. Stofer Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/23029 Tested-by: FSP CI Jenkins --- src/import/hwpf/fapi2/tools/createIfAttrService.pl | 2 +- src/import/hwpf/fapi2/tools/parseAttributeInfo.mk | 2 +- src/import/hwpf/fapi2/tools/parseAttributeInfo.pl | 167 +++++++++------------ 3 files changed, 76 insertions(+), 95 deletions(-) (limited to 'src/import/hwpf/fapi2/tools') diff --git a/src/import/hwpf/fapi2/tools/createIfAttrService.pl b/src/import/hwpf/fapi2/tools/createIfAttrService.pl index 5f24f8b0c..e72b8dac7 100755 --- a/src/import/hwpf/fapi2/tools/createIfAttrService.pl +++ b/src/import/hwpf/fapi2/tools/createIfAttrService.pl @@ -8,7 +8,7 @@ # # EKB Project # -# COPYRIGHT 2015 +# COPYRIGHT 2015,2016 # [+] International Business Machines Corp. # # diff --git a/src/import/hwpf/fapi2/tools/parseAttributeInfo.mk b/src/import/hwpf/fapi2/tools/parseAttributeInfo.mk index 441cc4bc9..831d5291a 100644 --- a/src/import/hwpf/fapi2/tools/parseAttributeInfo.mk +++ b/src/import/hwpf/fapi2/tools/parseAttributeInfo.mk @@ -26,7 +26,7 @@ SOURCES += $(FAPI2_ATTR_XML) SOURCES += $(GENPATH)/empty_attribute.xml TARGETS += attribute_ids.H -TARGETS += fapi2_chip_ec_feature.C +TARGETS += fapi2_chip_ec_feature.H TARGETS += attribute_plat_check.H TARGETS += attributesSupported.html TARGETS += attrInfo.csv diff --git a/src/import/hwpf/fapi2/tools/parseAttributeInfo.pl b/src/import/hwpf/fapi2/tools/parseAttributeInfo.pl index e78c89d6b..35fd0977e 100755 --- a/src/import/hwpf/fapi2/tools/parseAttributeInfo.pl +++ b/src/import/hwpf/fapi2/tools/parseAttributeInfo.pl @@ -8,7 +8,7 @@ # # EKB Project # -# COPYRIGHT 2015 +# COPYRIGHT 2015,2016 # [+] International Business Machines Corp. # # @@ -36,12 +36,12 @@ if (($numArgs < 1) || ($arg_output_dir eq undef)) print ("Usage: parseAttributeInfo.pl --output-dir= [ ...]\n"); print (" This perl script will parse attribute XML files and create the following files:\n"); print (" - attribute_ids.H. Contains IDs, type, value enums and other information\n"); - print (" - fapi2_chip_ec_feature.C. Contains a function to query chip EC features\n"); - print (" - attribute_plat_check.H Contains compile time checks that all attributes are\n"); - print (" handled by the platform\n"); - print (" - attributesSupported.html Contains the HWPF attributes supported\n"); - print (" - attrInfo.csv Used to process Attribute Override Text files\n"); - print (" - attrEnumInfo.csv Used to process Attribute Override Text files\n"); + print (" - fapi2_chip_ec_feature.H Contains a function to query chip EC features\n"); + print (" - attribute_plat_check.H Contains compile time checks that all attributes are\n"); + print (" handled by the platform\n"); + print (" - attributesSupported.html Contains the HWPF attributes supported\n"); + print (" - attrInfo.csv Used to process Attribute Override Text files\n"); + print (" - attrEnumInfo.csv Used to process Attribute Override Text files\n"); exit(1); } @@ -70,10 +70,11 @@ $aiFile .= "/"; $aiFile .= "attribute_ids.H"; open(AIFILE, ">", $aiFile); -my $ecFile = $arg_output_dir; -$ecFile .= "/"; -$ecFile .= "fapi2_chip_ec_feature.C"; -open(ECFILE, ">", $ecFile); +my $ecHFile = $arg_output_dir; +$ecHFile .= "/"; +$ecHFile .= "fapi2_chip_ec_feature.H"; +open(ECHFILE, ">", $ecHFile); + my $acFile = $arg_output_dir; $acFile .= "/"; @@ -123,48 +124,45 @@ print AIFILE " *\/\n"; print AIFILE "enum AttributeId\n{\n"; #------------------------------------------------------------------------------ -# Print Start of file information to fapi2_chip_ec_feature.C -#------------------------------------------------------------------------------ -print ECFILE "// fapi2_chip_ec_feature.C\n"; -print ECFILE "// This file is generated by perl script parseAttributeInfo.pl\n"; -print ECFILE "// It implements the queryfapi2_chip_ec_feature function\n\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 "template< TargetType K >\n"; -print ECFILE "ReturnCode queryChipEcFeature(AttributeId i_id,\n"; -print ECFILE " const Target& i_pTarget,\n"; -print ECFILE " uint8_t & o_hasFeature)\n"; -print ECFILE "{\n"; -print ECFILE " o_hasFeature = false;\n"; -print ECFILE " ReturnCode l_rc;\n"; -print ECFILE " uint8_t l_chipName = 0;\n"; -print ECFILE " uint8_t l_chipEc = 0;\n\n"; -print ECFILE " Target l_target;\n\n"; -print ECFILE " if (i_pTarget.isChiplet())\n"; -print ECFILE " {\n"; -print ECFILE " l_target = i_pTarget.getParent();\n"; -print ECFILE " }\n\n"; -print ECFILE " if (!l_rc)\n"; -print ECFILE " {\n"; -print ECFILE " l_rc = FAPI_ATTR_GET_PRIVILEGED(fapi2::ATTR_NAME, l_target, l_chipName);\n\n"; -print ECFILE " if (l_rc)\n"; -print ECFILE " {\n"; -print ECFILE " FAPI_ERR(\"queryChipEcFeature: error getting chip name\");\n"; -print ECFILE " }\n"; -print ECFILE " else\n"; -print ECFILE " {\n"; -print ECFILE " l_rc = FAPI_ATTR_GET_PRIVILEGED(fapi2::ATTR_EC, l_target, l_chipEc);\n\n"; -print ECFILE " if (l_rc)\n"; -print ECFILE " {\n"; -print ECFILE " FAPI_ERR(\"queryChipEcFeature: 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 fapi2_chip_ec_feature.H +#------------------------------------------------------------------------------ +print ECHFILE "// This file is generated by perl script parseAttributeInfo.pl\n"; +print ECHFILE "// It implements the fapi2_chip_ec_feature function\n\n"; +print ECHFILE "#ifndef __FAPI2_CHIP_EC_FEATURE_H_\n"; +print ECHFILE "#define __FAPI2_CHIP_EC_FEATURE_H_\n"; +print ECHFILE "#include \n"; +print ECHFILE "#include \n"; +print ECHFILE "namespace fapi2\n"; +print ECHFILE "{\n\n"; +print ECHFILE "// create a unique type from an int ( or attribute id) \n"; +print ECHFILE "template\n"; +print ECHFILE "struct int2Type {\n"; +print ECHFILE "enum { value = I };\n"; +print ECHFILE "};\n"; +print ECHFILE "ReturnCode queryChipEcAndName(\n"; +print ECHFILE " const Target& i_target,\n"; +print ECHFILE " fapi2::ATTR_NAME_Type& , fapi2::ATTR_EC_Type & );\n\n"; +print ECHFILE "template\n"; +print ECHFILE "ReturnCode queryChipEcFeature(int2Type id,\n"; +print ECHFILE " const Target& i_target,\n"; +print ECHFILE " uint8_t & o_hasFeature)\n"; +print ECHFILE "{\n"; +print ECHFILE " fapi2::ATTR_NAME_Type l_chipName;\n"; +print ECHFILE " fapi2::ATTR_EC_Type l_chipEc;\n\n"; +print ECHFILE " o_hasFeature = 0;\n\n"; +print ECHFILE " ReturnCode l_rc = queryChipEcAndName(i_target, l_chipName, l_chipEc);\n"; +print ECHFILE " if (l_rc)\n"; +print ECHFILE " {\n"; +print ECHFILE " FAPI_ERR(\"queryChipEcFeature: error getting chip name\");\n"; +print ECHFILE " }\n"; +print ECHFILE " else\n"; +print ECHFILE " {\n"; +print ECHFILE " o_hasFeature = hasFeature(int2Type(), l_chipName, l_chipEc);\n"; +print ECHFILE " }\n"; +print ECHFILE " return l_rc;\n"; +print ECHFILE "}\n\n"; #------------------------------------------------------------------------------ # Print Start of file information to attribute_plat_check.H @@ -560,8 +558,8 @@ foreach my $argnum (0 .. $#ARGV) # 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) ? fapi2::FAPI2_RC_SUCCESS : \\\n"; - print AIFILE " fapi2::queryChipEcFeature(ID, PTARGET, VAL)\n"; + print AIFILE " PLAT_GET_CHIP_EC_FEATURE_OVERRIDE(ID, PTARGET, VAL) ? fapi2::ReturnCode() : \\\n"; + print AIFILE " queryChipEcFeature(fapi2::int2Type(), PTARGET, VAL)\n"; print AIFILE "#define $attr->{id}_SETMACRO(ID, PTARGET, VAL) "; print AIFILE "CHIP_EC_FEATURE_ATTRIBUTE_NOT_WRITABLE\n"; } @@ -579,13 +577,19 @@ foreach my $argnum (0 .. $#ARGV) #---------------------------------------------------------------------- # If the attribute is a Chip EC Feature, print the chip EC feature - # query to fapi2_chip_ec_feature.C + # query to fapi2_chip_ec_feature.H #---------------------------------------------------------------------- + # Each EC attribute will generate a new inline overloaded version of + # hasFeature with the attribute specific logic if (exists $attr->{chipEcFeature}) { my $chipCount = 0; - print ECFILE " case $attr->{id}:\n"; - print ECFILE " if (\n"; + print ECHFILE " inline uint8_t hasFeature(int2Type<$attr->{id}>,\n"; + print ECHFILE " fapi2::ATTR_NAME_Type i_name,\n"; + print ECHFILE " fapi2::ATTR_EC_Type i_ec)\n"; + print ECHFILE " {\n"; + print ECHFILE " uint8_t hasFeature = 0;\n\n"; + print ECHFILE " if("; foreach my $chip (@{$attr->{chipEcFeature}->{chip}}) { @@ -644,17 +648,17 @@ foreach my $argnum (0 .. $#ARGV) if ($chipCount > 1) { - print ECFILE " ||\n"; + print ECHFILE " ||\n\t"; } - print ECFILE " ((l_chipName == $chip->{name}) &&\n"; - print ECFILE " (l_chipEc $test $chip->{ec}->{value}))\n"; + print ECHFILE "((i_name == $chip->{name}) && "; + print ECHFILE " (i_ec $test $chip->{ec}->{value}))"; } - - print ECFILE " )\n"; - print ECFILE " {\n"; - print ECFILE " o_hasFeature = true;\n"; - print ECFILE " }\n"; - print ECFILE " break;\n"; + print ECHFILE ")\n"; + print ECHFILE " {\n"; + print ECHFILE " hasFeature = 1;\n"; + print ECHFILE " }\n"; + print ECHFILE " return hasFeature;\n"; + print ECHFILE " };\n"; } #---------------------------------------------------------------------- @@ -689,31 +693,8 @@ foreach my $argnum (0 .. $#ARGV) print AIFILE "}\n\n"; print AIFILE "#endif\n"; -#------------------------------------------------------------------------------ -# Print End of file information to fapi2_chip_ec_feature.C -#------------------------------------------------------------------------------ -print ECFILE " default:\n"; -print ECFILE " FAPI_ERR(\"queryChipEcFeature: Unknown feature 0x%x\",\n"; -print ECFILE " i_id);\n"; -print ECFILE " l_rc = FAPI2_RC_INVALID_CHIP_EC_FEATURE_GET;\n"; -print ECFILE " break;\n"; -print ECFILE " }\n\n"; -print ECFILE " if (o_hasFeature)\n"; -print ECFILE " {\n"; -print ECFILE " FAPI_INF(\"queryChipEcFeature: 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(\"queryChipEcFeature: 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 ECHFILE "}\n"; +print ECHFILE "#endif\n"; #------------------------------------------------------------------------------ @@ -750,7 +731,7 @@ print FEFILE "};\n"; # Close output files #------------------------------------------------------------------------------ close(AIFILE); -close(ECFILE); +close(ECHFILE); close(ACFILE); close(ASFILE); close(ITFILE); -- cgit v1.2.1