1*** Settings ***
2Documentation       This module is for OS checkstop opertions.
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 processor through HOST.
102    ...              Test sequence:
103    ...              1. Boot To HOST
104    ...              2. Clear any existing gard records
105    ...              3. Inject Error on processor/centaur
106    [Arguments]      ${fir}  ${chip_address}  ${threshold_limit}
107    ...  ${master_proc_chip}=True
108    # Description of argument(s):
109    # fir                 FIR (Fault isolation register) value (e.g. 2011400).
110    # chip_address        chip address (e.g 2000000000000000).
111    # threshold_limit     Threshold limit (e.g 1, 5, 32).
112    # master_proc_chip    Processor chip type (True' or 'False').
113
114    Delete Error Logs
115    Login To OS Host
116    Gard Operations On OS  clear all
117
118    # Fetch processor chip IDs.
119    ${proc_chip_id}=  Get ProcChipId From OS  Processor  ${master_proc_chip}
120
121    ${threshold_limit}=  Convert To Integer  ${threshold_limit}
122    :FOR  ${i}  IN RANGE  ${threshold_limit}
123    \  Run Keyword  Putscom Operations On OS  ${proc_chip_id}  ${fir}
124    ...  ${chip_address}
125    # Adding delay after each error injection.
126    \  Sleep  10s
127    # Adding delay to get error log after error injection.
128    Sleep  120s
129
130Code Update Unrecoverable Error Inject
131    [Documentation]  Inject UE MCACALFIR checkstop on processor through
132    ...   host during PNOR code update.
133
134    Inject Error Through HOST  05010800  4000000000000000  1
135
136Disable CPU States Through HOST
137    [Documentation]  Disable CPU states through host.
138
139    # Fetch number of states present for cpu0.
140    ${cmd}=  Catenate  ls /sys/devices/system/cpu/cpu0/cpuidle|grep state|wc -l
141    ${output}  ${stderr}  ${rc}=  OS Execute Command  ${cmd}
142    ${no_of_states}=  Convert To Integer  ${output}
143
144    # Disable state for all cpus.
145    :FOR  ${i}  IN RANGE  ${no_of_states}
146    \  ${cmd}=  Catenate  SEPARATOR=  for file_path in /sys/devices/system/cpu/
147     ...  cpu*/cpuidle/state${i}/disable; do echo 1 > $file_path; done
148    \  ${output}  ${stderr}  ${rc}=  Run Keyword  OS Execute Command  ${cmd}
149
150Is Opal-PRD Service Enabled
151    [Documentation]  Check if Opal-PRD service is running & return either
152    ...              'enabled' or 'disabled'.
153
154    ${cmd}=  Catenate  systemctl list-unit-files | grep opal-prd
155    ${output}  ${stderr}  ${rc}=  OS Execute Command  ${cmd}
156    ${opal_prd_state}=  Split String  ${output}
157
158    # Example output from prior command:
159    # opal-prd.service enabled
160    [Return]  ${opal_prd_state[1]}
161
162Enable Opal-PRD Service On HOST
163    [Documentation]  Enable Opal-PRD service on host.
164
165    OS Execute Command  service opal-prd start
166    ${opal_prd_state}=  Is Opal-PRD Service Enabled
167    Should Contain  ${opal_prd_state}  enabled
168
169BMC Putscom
170    [Documentation]  Executes putscom command through BMC.
171
172    [Arguments]      ${proc_chip_id}  ${fru}  ${chip_address}
173
174    # Description of argument(s):
175    # proc_chip_id        Processor ID (e.g '0', '8').
176    # fru                 FRU (field replaceable unit) (e.g. '2011400').
177    # chip_address        Chip address (e.g. '4000000000000000').
178
179    ${cmd}=  Catenate  pdbg -d p9w -${proc_chip_id} putscom 0x${fru} 0x${address}
180
181    BMC Execute Command  ${cmd}
182