1*** Settings *** 2Documentation Utility for error injection scenarios through HOST & BMC. 3Resource ../../lib/rest_client.robot 4Resource ../../lib/utils.robot 5Variables ../../lib/ras/variables.py 6Library ../../lib/bmc_ssh_utils.py 7Library OperatingSystem 8Library ../../lib/gen_print.py 9Library ../../lib/gen_robot_print.py 10 11*** Keywords *** 12 13Getscom Operations On OS 14 [Documentation] Executes getscom command on OS with the given 15 ... input command. 16 [Arguments] ${input_cmd} 17 # Description of arguments: 18 # input_cmd -l|--list-chips 19 # -c|--chip <chip-id> <addr> 20 21 ${output} ${stderr} ${rc}= OS Execute Command getscom ${input_cmd} 22 [Return] ${output} 23 24Gard Operations On OS 25 [Documentation] Executes opal-gard command on OS with the given 26 ... input command. 27 [Arguments] ${input_cmd} 28 # Description of arguments: 29 # input_cmd list/clear all/show <gard_record_id> 30 31 ${output} ${stderr} ${rc}= OS Execute Command opal-gard ${input_cmd} 32 [Return] ${output} 33 34Putscom Operations On OS 35 [Documentation] Executes putscom command on OS with the given 36 ... input arguments. 37 [Arguments] ${proc_chip_id} ${fru} ${address} 38 # Description of arguments: 39 # proc_chip_id Processor ID (e.g '0', '8'). 40 # fru FRU value (e.g. 2011400). 41 # address Chip address (e.g 4000000000000000). 42 43 ${cmd}= Catenate putscom -c 0x${proc_chip_id} 0x${fru} 0x${address} 44 Start Command ${cmd} 45 46Get ProcChipId From OS 47 [Documentation] Get processor chip ID values based on the input. 48 [Arguments] ${chip_type} ${master_proc_chip} 49 # Description of arguments: 50 # chip_type The chip type (Processor/Centaur). 51 # master_proc_chip Processor chip type ('True' or 'False'). 52 53 ${cmd}= Catenate -l | grep -i ${chip_type} | cut -c1-8 54 ${proc_chip_id}= Getscom Operations On OS ${cmd} 55 # Example output: 56 # getscom -l | grep processor | cut -c1-8 57 # 00000008 - False 58 # 00000000 - True 59 60 ${proc_ids}= Split String ${proc_chip_id} 61 ${proc_id}= Run Keyword If '${master_proc_chip}' == 'True' 62 \ ... Get From List ${proc_ids} 1 63 \ ... ELSE Get From List ${proc_ids} 0 64 65 # Example output: 66 # 00000008 67 [Return] ${proc_id} 68 69Get Core IDs From OS 70 [Documentation] Get Core IDs corresponding to the input processor chip ID. 71 [Arguments] ${proc_chip_id} 72 # Description of argument(s): 73 # proc_chip_id Processor ID (e.g '0', '8'). 74 75 ${cmd}= Catenate set -o pipefail ; ${probe_cpu_file_path} 76 ... | grep -i 'CHIP ID: ${proc_chip_id}' | cut -c21-22 77 ${output} ${stderr} ${rc}= OS Execute Command ${cmd} 78 ${core_ids}= Split String ${output} 79 # Example output: 80 # ['2', '3', '4', '5', '6'] 81 [Return] ${core_ids} 82 83FIR Address Translation Through HOST 84 [Documentation] Do FIR address translation through host for given FIR, 85 ... core value & target type. 86 [Arguments] ${fir} ${core_id} ${target_type} 87 # Description of argument(s): 88 # fir FIR (Fault isolation register) value (e.g. 2011400). 89 # core_id Core ID (e.g. 9). 90 # target_type Target type (e.g. 'EQ', 'EX', 'C'). 91 92 ${cmd}= Catenate set -o pipefail ; ${addr_translation_file_path} ${fir} 93 ... ${core_id} | grep -i ${target_type} 94 ${output} ${stderr} ${rc}= OS Execute Command ${cmd} 95 ${translated_addr}= Split String ${output} :${SPACE}0x 96 # Example output: 97 # 0x10010c00 98 [Return] ${translated_addr[1]} 99 100Inject Error Through HOST 101 [Documentation] Inject checkstop on multiple targets like 102 ... CPU/CME/OCC/NPU/CAPP/MCA etc through HOST. 103 ... Test sequence: 104 ... 1. Boot To HOST 105 ... 2. Clear any existing gard records 106 ... 3. Inject Error on processor/centaur 107 [Arguments] ${fir} ${chip_address} ${threshold_limit} 108 ... ${master_proc_chip}=True 109 # Description of argument(s): 110 # fir FIR (Fault isolation register) value (e.g. 2011400). 111 # chip_address chip address (e.g 2000000000000000). 112 # threshold_limit Threshold limit (e.g 1, 5, 32). 113 # master_proc_chip Processor chip type (True' or 'False'). 114 115 Delete Error Logs 116 Login To OS Host 117 Gard Operations On OS clear all 118 119 # Fetch processor chip IDs. 120 ${proc_chip_id}= Get ProcChipId From OS Processor ${master_proc_chip} 121 122 ${threshold_limit}= Convert To Integer ${threshold_limit} 123 :FOR ${count} IN RANGE ${threshold_limit} 124 \ Run Keyword Putscom Operations On OS ${proc_chip_id} ${fir} 125 ... ${chip_address} 126 # Adding delay after each error injection. 127 \ Sleep 10s 128 # Adding delay to get error log after error injection. 129 Sleep 120s 130 131Code Update Unrecoverable Error Inject 132 [Documentation] Inject UE MCACALFIR checkstop on processor through 133 ... host during PNOR code update. 134 135 Inject Error Through HOST 05010800 4000000000000000 1 136 137Disable CPU States Through HOST 138 [Documentation] Disable CPU states through host. 139 140 # Fetch number of states present for cpu0. 141 ${cmd}= Catenate ls /sys/devices/system/cpu/cpu0/cpuidle|grep state|wc -l 142 ${output} ${stderr} ${rc}= OS Execute Command ${cmd} 143 ${no_of_states}= Convert To Integer ${output} 144 145 # Disable state for all cpus. 146 :FOR ${count} IN RANGE ${no_of_states} 147 \ ${cmd}= Catenate SEPARATOR= for file_path in /sys/devices/system/cpu/ 148 ... cpu*/cpuidle/state${i}/disable; do echo 1 > $file_path; done 149 \ ${output} ${stderr} ${rc}= Run Keyword OS Execute Command ${cmd} 150 151Is Opal-PRD Service Enabled 152 [Documentation] Check if Opal-PRD service is running & return either 153 ... 'enabled' or 'disabled'. 154 155 ${cmd}= Catenate systemctl list-unit-files | grep opal-prd 156 ${output} ${stderr} ${rc}= OS Execute Command ${cmd} 157 ${opal_prd_state}= Split String ${output} 158 159 # Example output from prior command: 160 # opal-prd.service enabled 161 [Return] ${opal_prd_state[1]} 162 163Enable Opal-PRD Service On HOST 164 [Documentation] Enable Opal-PRD service on host. 165 166 OS Execute Command service opal-prd start 167 ${opal_prd_state}= Is Opal-PRD Service Enabled 168 Should Contain ${opal_prd_state} enabled 169 170BMC Putscom 171 [Documentation] Executes putscom command through BMC. 172 173 [Arguments] ${proc_chip_id} ${fru} ${chip_address} 174 175 # Description of argument(s): 176 # proc_chip_id Processor ID (e.g '0', '8'). 177 # fru FRU (field replaceable unit) (e.g. '2011400'). 178 # chip_address Chip address (e.g. '4000000000000000'). 179 180 ${cmd}= Catenate pdbg -d p9w -p${proc_chip_id} putscom 0x${fru} 0x${chip_address} 181 182 BMC Execute Command ${cmd} 183 184Inject Error Through BMC 185 [Documentation] Inject checkstop on multiple targets like 186 ... CPU/CME/OCC/NPU/CAPP/MCA etc through BMC. 187 ... Test sequence: 188 ... 1. Boot To HOST. 189 ... 2. Clear any existing gard records. 190 ... 3. Inject Error on processor/centaur. 191 [Arguments] ${fir} ${chip_address} ${threshold_limit} 192 ... ${master_proc_chip}=True 193 # Description of argument(s): 194 # fir FIR (Fault isolation register) value (e.g. '2011400'). 195 # chip_address Chip address (e.g. '2000000000000000'). 196 # threshold_limit Recoverable error threshold limit (e.g. '1', '5', '32'). 197 198 Delete Error Logs 199 Login To OS Host 200 Gard Operations On OS clear all 201 202 ${threshold_limit}= Convert To Integer ${threshold_limit} 203 :FOR ${count} IN RANGE ${threshold_limit} 204 \ BMC Putscom 0 ${fir} 205 ... ${chip_address} 206 # Adding delay after each error injection. 207 \ Sleep 10s 208 # Adding delay to get error log after error injection. 209 Sleep 120s 210