Library to get FIR address translation through HOST OS.

Resolves openbmc/openbmc-test-automation#1033

Change-Id: I33501fc9ba4a12b289096820f14874a50566c38c
Signed-off-by: Sridevi Ramesh <sridevra@in.ibm.com>
diff --git a/lib/ras/host_utils.robot b/lib/ras/host_utils.robot
index 1d332ee..ddfec43 100644
--- a/lib/ras/host_utils.robot
+++ b/lib/ras/host_utils.robot
@@ -2,6 +2,8 @@
 Documentation       This module is for OS checkstop opertions.
 Resource            ../../lib/rest_client.robot
 Resource            ../../lib/utils.robot
+Resource            ../../lib/ras/variables.py
+Resource            ../../lib/bmc_ssh_utils.py
 Library             OperatingSystem
 
 *** Keywords ***
@@ -14,8 +16,7 @@
     # input_cmd      -l|--list-chips
     #                -c|--chip <chip-id> <addr>
 
-    ${output}  ${stderr}=  Execute Command  getscom ${input_cmd}
-    ...        return_stderr=True
+    ${output}  ${stderr}  ${rc}=  OS Execute Command  getscom ${input_cmd}
     Should Be Empty  ${stderr}
     [Return]  ${output}
 
@@ -26,36 +27,64 @@
     # Description of arguments:
     # input_cmd      list/clear all/show <gard_record_id>
 
-    ${output}  ${stderr}=  Execute Command  opal-gard ${input_cmd}
-    ...        return_stderr=True
+    ${output}  ${stderr}  ${rc}=  OS Execute Command  opal-gard ${input_cmd}
     Should Be Empty  ${stderr}
     [Return]  ${output}
 
-Putscom Through OS
+Putscom Operations On OS
     [Documentation]  Executes putscom command on OS with the given
     ...              input arguments.
-    [Arguments]      ${chip_id}  ${fru}  ${address}
+    [Arguments]      ${proc_chip_id}  ${fru}  ${address}
     # Description of arguments:
-    # chip_id        processor ID (e.g 00000000).
+    # proc_chip_id        Processor ID (e.g '0', '8').
     # fru            FRU value (e.g. 2011400).
-    # address        chip address (e.g 4000000000000000).
+    # address        Chip address (e.g 4000000000000000).
 
-    ${cmd}=  Catenate  putscom -c 0x${chip_id} 0x${fru} 0x${address}
+    ${cmd}=  Catenate  putscom -c 0x${proc_chip_id} 0x${fru} 0x${address}
     Start Command  ${cmd}
 
-Get Cores Values From OS
-    [Documentation]  Check if cores present on HOST OS & return core values.
-    ${cmd}=  Catenate  cat /sys/firmware/opal/msglog|grep -i chip|grep -i core
-    ${output}=  Execute Command  ${cmd}
-    Should Not Be Empty  ${output}
-    [Return]  ${output}
-
-Get ChipID From OS
-    [Documentation]  Get chip ID values based on the input.
+Get ProcChipId From OS
+    [Documentation]  Get processor chip ID values based on the input.
     [Arguments]      ${chip_type}
     # Description of arguments:
     # chip_type      The chip type (Processor/Centaur).
 
     ${cmd}=  Catenate  -l | grep -i ${chip_type} | cut -c1-8
-    ${chip_id}=  Getscom Operations On OS  ${cmd}
-    [Return]  ${chip_id}
+    ${proc_chip_id}=  Getscom Operations On OS  ${cmd}
+    # Example output:
+    # 00000008
+    # 00000000
+    [Return]  ${proc_chip_id}
+
+Get Core IDs From OS
+    [Documentation]  Get Core IDs corresponding to the input processor chip ID.
+    [Arguments]      ${proc_chip_id}
+    # Description of argument(s):
+    # proc_chip_id        Processor ID (e.g '0', '8').
+
+    ${cmd}=  Catenate  set -o pipefail ; ${probe_cpu_file_path}
+    ...    | grep -i 'CHIP ID: ${proc_chip_id}' | cut -c21-22
+    ${output}  ${stderr}  ${rc}=  OS Execute Command  ${cmd}
+    Should Be Empty  ${stderr}
+    ${core_ids}=  Split String  ${output}
+    # Example output:
+    # ['2', '3', '4', '5', '6']
+    [Return]  ${core_ids}
+
+FIR Address Translation Through HOST
+    [Documentation]  Do FIR address translation through host for given FIR,
+    ...              core value & target type.
+    [Arguments]  ${fir}  ${core_id}  ${target_type}
+    # Description of argument(s):
+    # fir          FIR (Fault isolation register) value (e.g. 2011400).
+    # core_id      Core ID (e.g. 9).
+    # target_type  Target type (e.g. 'EQ', 'EX', 'C').
+
+    ${cmd}=  Catenate  set -o pipefail ; ${addr_translation_file_path} ${fir}
+    ...  ${core_id} | grep -i ${target_type}
+    ${output}  ${stderr}  ${rc}=  OS Execute Command  ${cmd}
+    Should Be Empty  ${stderr}
+    ${translated_addr}=  Split String  ${output}  :${SPACE}0x
+    # Example output:
+    # 0x10010c00
+    [Return]  ${translated_addr[1]}
diff --git a/lib/ras/variables.py b/lib/ras/variables.py
index cf5f100..bf69188 100644
--- a/lib/ras/variables.py
+++ b/lib/ras/variables.py
@@ -22,6 +22,17 @@
 
 DES_NPU0_RECV32 = "'pu.n0p0.*NPU0FIR[^13].*CQ CTL/SM ASBE Array single'"
 
+DES_L2_RECV1 = "'L2FIR[^8].*L2 directory CE'"
+DES_L2_RECV32 = "'L2FIR[^6].*L2 directory read CE'"
+
+DES_L3_RECV1 = "'L3FIR[^17].*Received addr_error cresp'"
+DES_L3_RECV32 = "'L3FIR[^7].*L3 cache write data CE'"
+
+DES_OCC_RECV1 = "'OCCFIR[^45].*C405_ECC_CE'"
+DES_CME_RECV1 = "'CMEFIR[^7].*PPE SRAM Uncorrectable Err'"
+DES_EQ_RECV32 = "'EQ_LFIR[^0].*CFIR internal parity'"
+DES_NCU_RECV1 = "'NCUFIR[^8].*NCU Store Queue Data'"
+
 # The following is an error injection dictionary with each entry consisting of:
 # - field_name: Targettype_threshold_limit .
 #   - A list consisting of the following fields:
@@ -42,6 +53,20 @@
              'CXA_RECV5': ['02010800', '0000000020000000', DES_CXA_RECV5],
              'CXA_RECV32': ['02010800', '2000000000000000', DES_CXA_RECV32],
              'OBUS_RECV32': ['0904000a', '8000000000000000', DES_OBUS_RECV32],
-             'NPU0_RECV32': ['05013C00', '0004000000000000', DES_NPU0_RECV32]
+             'NPU0_RECV32': ['05013C00', '0004000000000000', DES_NPU0_RECV32],
+             'L2FIR_RECV1': ['10010800', '0080000000000000', DES_L2_RECV1],
+             'L2FIR_RECV32': ['10010800', '0200000000000000', DES_L2_RECV32],
+             'L2FIR_UE': ['10010800', '4000000000000000', ''],
+             'L3FIR_RECV1': ['10011800','0000400000000000', DES_L3_RECV1],
+             'L3FIR_RECV32': ['10011800', '0100000000000000', DES_L3_RECV32],
+             'L3FIR_UE': ['10011800', '0100000000000000', ''],
+             'OCCFIR_RECV1': ['01010800', '0000000000040000', DES_OCC_RECV1],
+             'CMEFIR_RECV1': ['10012000', '0100000000000000', DES_CME_RECV1],
+             'EQFIR_RECV32': ['1004000A', '4000000000000000', DES_EQ_RECV32],
+             'NCUFIR_RECV1': ['10011400', '0080000000000000', DES_NCU_RECV1],
+
              }
 
+# Address translation files
+probe_cpu_file_path = '/root/probe_cpus.sh'
+addr_translation_file_path = '/root/scom_addr_p9.sh'
diff --git a/lib/utils.robot b/lib/utils.robot
index a341459..04ef793 100755
--- a/lib/utils.robot
+++ b/lib/utils.robot
@@ -13,6 +13,7 @@
 Library                 bmc_ssh_utils.py
 Library                 utils.py
 Library                 var_funcs.py
+Library                 SCPLibrary  WITH NAME  scp
 
 *** Variables ***
 ${pflash_cmd}           /usr/sbin/pflash -r /dev/stdout -P VERSION
@@ -52,6 +53,10 @@
 @{valid_power_policy_vars}        RESTORE_LAST_STATE  ALWAYS_POWER_ON
 ...                               ALWAYS_POWER_OFF
 
+${probe_cpu_tool_path}     ${EXECDIR}/tools/ras/probe_cpus.sh
+${scom_addrs_tool_path}    ${EXECDIR}/tools/ras/scom_addr_p9.sh
+${target_file_path}        /root/
+
 *** Keywords ***
 
 Check BMC Performance
@@ -1180,7 +1185,6 @@
     ${valueDict}=  Create Dictionary  data=${setting}
     Write Attribute  ${SENSORS_URI}host/TurboAllowed  value  data=${valueDict}
 
-
 Set Control Boot Mode
     [Documentation]  Set given boot mode on the boot object path attribute.
     [Arguments]  ${boot_path}  ${boot_mode}
@@ -1196,3 +1200,16 @@
 
     ${valueDict}=  Create Dictionary  data=${boot_mode}
     Write Attribute  ${boot_path}  BootMode  data=${valueDict}
+
+Copy Address Translation Utils To HOST OS
+    [Documentation]  Copy address translation utils to host OS.
+
+    OperatingSystem.File Should Exist  ${probe_cpu_tool_path}
+    ...  msg=${probe_cpu_tool_path} doesn't exist.
+    OperatingSystem.File Should Exist  ${probe_cpu_tool_path}
+    ...  msg=${probe_cpu_tool_path} doesn't exist.
+
+    scp.Open connection  ${OS_HOST}  username=${OS_USERNAME}
+    ...  password=${OS_PASSWORD}
+    scp.Put File  ${probe_cpu_tool_path}  ${target_file_path}
+    scp.Put File  ${scom_addrs_tool_path}  ${target_file_path}