1*** Variables ***
2${GICR_TYPER}                       8
3${GICR_ISENABLER0}                  0x10100
4
5*** Keywords ***
6Prepare Machine
7    Execute Command                 using sysbus
8    Execute Command                 mach create
9    # The specific platform doesn't matter as long as it has GICv3 and more than one CPU
10    Execute Command                 machine LoadPlatformDescription @platforms/cpus/cortex-r52_smp.repl
11
12Write To Redistributor
13    [Arguments]                     ${index}  ${reg}  ${val}  ${context}  ${size}=Double
14
15    ${addr}=                        Evaluate  0xAF100000 + 0x20000 * ${index.strip()} + ${reg.strip()}
16    Execute Command                 sysbus Write${size}Word ${addr} ${val} ${context}
17
18Read From Redistributor
19    [Arguments]                     ${index}  ${reg}  ${context}  ${size}=Double
20
21    ${addr}=                        Evaluate  0xAF100000 + 0x20000 * ${index.strip()} + ${reg.strip()}
22    ${val}=                         Execute Command  sysbus Read${size}Word ${addr} ${context}
23    [Return]                        ${val}
24
25Compare ${cpu} Id With Redistributor ${rdist}
26    ${expected}=                    Execute Command  ${cpu} MultiprocessingId
27    ${gicr_typer_val}=              Read From Redistributor  ${rdist}  ${GICR_TYPER}  ${cpu}  size=Quad
28    ${gic_affinity}=                Evaluate  ${gicr_typer_val.strip()} >> 32
29    ${result}=                      Evaluate  ${expected.strip()} == ${gic_affinity}
30    [Return]                        ${result}
31
32*** Test Cases ***
33Only Our Redistributor Should Match Our Affinity
34    Prepare Machine
35
36    ${result}=                      Compare cpu Id With Redistributor 0
37    Should Be True                  ${result}
38    ${result}=                      Compare cpu Id With Redistributor 1
39    Should Not Be True              ${result}
40
41    ${result}=                      Compare cpu1 Id With Redistributor 1
42    Should Be True                  ${result}
43    ${result}=                      Compare cpu1 Id With Redistributor 0
44    Should Not Be True              ${result}
45
46Wriiting To Own Redistributor Shouldn't Affect Others
47    Prepare Machine
48
49    ${expected_our_gicr_isenabler0}=  Evaluate  0xffffffff
50    ${expected_other_gicr_isenabler0}=  Evaluate  0x00000000
51
52    Write To Redistributor          0  ${GICR_ISENABLER0}  ${expected_our_gicr_isenabler0}  cpu
53    Write To Redistributor          1  ${GICR_ISENABLER0}  ${expected_other_gicr_isenabler0}  cpu1
54
55    ${actual_our_gicr_isenabler0}=  Read From Redistributor  0  ${GICR_ISENABLER0}  cpu
56    ${actual_other_gicr_isenabler0}=  Read From Redistributor  1  ${GICR_ISENABLER0}  cpu
57
58    Should Be Equal As Integers     ${expected_our_gicr_isenabler0}  ${actual_our_gicr_isenabler0}
59    Should Be Equal As Integers     ${expected_other_gicr_isenabler0}  ${actual_other_gicr_isenabler0}
60
61Writing To Other Redistributor Shouldn't Affect Own
62    Prepare Machine
63
64    ${expected_our_gicr_isenabler0}=  Evaluate  0x00000000
65    ${expected_other_gicr_isenabler0}=  Evaluate  0xffffffff
66
67    Write To Redistributor          0  ${GICR_ISENABLER0}  ${expected_our_gicr_isenabler0}  cpu
68    Write To Redistributor          1  ${GICR_ISENABLER0}  ${expected_other_gicr_isenabler0}  cpu
69
70    ${actual_our_gicr_isenabler0}=  Read From Redistributor  0  ${GICR_ISENABLER0}  cpu
71    ${actual_other_gicr_isenabler0}=  Read From Redistributor  1  ${GICR_ISENABLER0}  cpu1
72
73    Should Be Equal As Integers     ${expected_our_gicr_isenabler0}  ${actual_our_gicr_isenabler0}
74    Should Be Equal As Integers     ${expected_other_gicr_isenabler0}  ${actual_other_gicr_isenabler0}
75