| *** Variables *** |
| ${GICR_TYPER} 8 |
| ${GICR_ISENABLER0} 0x10100 |
| |
| *** Keywords *** |
| Prepare Machine |
| Execute Command using sysbus |
| Execute Command mach create |
| # The specific platform doesn't matter as long as it has GICv3 and more than one CPU |
| Execute Command machine LoadPlatformDescription @platforms/cpus/cortex-r52_smp.repl |
| |
| Write To Redistributor |
| [Arguments] ${index} ${reg} ${val} ${context} ${size}=Double |
| |
| ${addr}= Evaluate 0xAF100000 + 0x20000 * ${index.strip()} + ${reg.strip()} |
| Execute Command sysbus Write${size}Word ${addr} ${val} ${context} |
| |
| Read From Redistributor |
| [Arguments] ${index} ${reg} ${context} ${size}=Double |
| |
| ${addr}= Evaluate 0xAF100000 + 0x20000 * ${index.strip()} + ${reg.strip()} |
| ${val}= Execute Command sysbus Read${size}Word ${addr} ${context} |
| [Return] ${val} |
| |
| Compare ${cpu} Id With Redistributor ${rdist} |
| ${expected}= Execute Command ${cpu} MultiprocessingId |
| ${gicr_typer_val}= Read From Redistributor ${rdist} ${GICR_TYPER} ${cpu} size=Quad |
| ${gic_affinity}= Evaluate ${gicr_typer_val.strip()} >> 32 |
| ${result}= Evaluate ${expected.strip()} == ${gic_affinity} |
| [Return] ${result} |
| |
| *** Test Cases *** |
| Only Our Redistributor Should Match Our Affinity |
| Prepare Machine |
| |
| ${result}= Compare cpu Id With Redistributor 0 |
| Should Be True ${result} |
| ${result}= Compare cpu Id With Redistributor 1 |
| Should Not Be True ${result} |
| |
| ${result}= Compare cpu1 Id With Redistributor 1 |
| Should Be True ${result} |
| ${result}= Compare cpu1 Id With Redistributor 0 |
| Should Not Be True ${result} |
| |
| Wriiting To Own Redistributor Shouldn't Affect Others |
| Prepare Machine |
| |
| ${expected_our_gicr_isenabler0}= Evaluate 0xffffffff |
| ${expected_other_gicr_isenabler0}= Evaluate 0x00000000 |
| |
| Write To Redistributor 0 ${GICR_ISENABLER0} ${expected_our_gicr_isenabler0} cpu |
| Write To Redistributor 1 ${GICR_ISENABLER0} ${expected_other_gicr_isenabler0} cpu1 |
| |
| ${actual_our_gicr_isenabler0}= Read From Redistributor 0 ${GICR_ISENABLER0} cpu |
| ${actual_other_gicr_isenabler0}= Read From Redistributor 1 ${GICR_ISENABLER0} cpu |
| |
| Should Be Equal As Integers ${expected_our_gicr_isenabler0} ${actual_our_gicr_isenabler0} |
| Should Be Equal As Integers ${expected_other_gicr_isenabler0} ${actual_other_gicr_isenabler0} |
| |
| Writing To Other Redistributor Shouldn't Affect Own |
| Prepare Machine |
| |
| ${expected_our_gicr_isenabler0}= Evaluate 0x00000000 |
| ${expected_other_gicr_isenabler0}= Evaluate 0xffffffff |
| |
| Write To Redistributor 0 ${GICR_ISENABLER0} ${expected_our_gicr_isenabler0} cpu |
| Write To Redistributor 1 ${GICR_ISENABLER0} ${expected_other_gicr_isenabler0} cpu |
| |
| ${actual_our_gicr_isenabler0}= Read From Redistributor 0 ${GICR_ISENABLER0} cpu |
| ${actual_other_gicr_isenabler0}= Read From Redistributor 1 ${GICR_ISENABLER0} cpu1 |
| |
| Should Be Equal As Integers ${expected_our_gicr_isenabler0} ${actual_our_gicr_isenabler0} |
| Should Be Equal As Integers ${expected_other_gicr_isenabler0} ${actual_other_gicr_isenabler0} |