From 957f10c3a0ddf1f9417ee064a97d054c4ec0bfce Mon Sep 17 00:00:00 2001 From: Andrey VOLKOV Date: Thu, 5 Sep 2024 16:23:01 +0200 Subject: [PATCH] edtlib: add new tests for 'interrupt-map' Add tests to check the correctness of '#address-cells' usage. The missing tests have allowed bug #77890 to persist for years. Signed-off-by: Andrey VOLKOV --- scripts/dts/python-devicetree/tests/test.dts | 40 +++++++++++++++++++ .../python-devicetree/tests/test_edtlib.py | 28 +++++++++++++ 2 files changed, 68 insertions(+) diff --git a/scripts/dts/python-devicetree/tests/test.dts b/scripts/dts/python-devicetree/tests/test.dts index bc54fd049d5..032eb8c843c 100644 --- a/scripts/dts/python-devicetree/tests/test.dts +++ b/scripts/dts/python-devicetree/tests/test.dts @@ -80,6 +80,22 @@ 0 1 0 1 &{/interrupt-map-test/controller-1} 0 0 0 4 0 1 0 2 &{/interrupt-map-test/controller-2} 0 0 0 0 0 5>; }; + nexus-0 { + #address-cells = <0>; + #interrupt-cells = <2>; + interrupt-map = < + 0 0 &{/interrupt-map-test/controller-0} 0 0 + 0 1 &{/interrupt-map-test/controller-1} 0 0 0 1 + 1 2 &{/interrupt-map-test/controller-2} 0 0 0 0 0 2>; + }; + nexus-1 { + #address-cells = <1>; + #interrupt-cells = <1>; + interrupt-map = < + 4 0 &{/interrupt-map-test/controller-0} 0 3 + 4 1 &{/interrupt-map-test/controller-1} 0 0 0 4 + 4 2 &{/interrupt-map-test/controller-2} 0 0 0 0 0 5>; + }; node@0 { reg = <0 0>; interrupts = <0 0 0 1 0 2>; @@ -92,6 +108,30 @@ &{/interrupt-map-test/nexus} 0 1 &{/interrupt-map-test/nexus} 0 2>; }; + node@2 { + reg = <0 2>; + interrupts = <0 0 0 1 1 2>; + interrupt-parent = <&{/interrupt-map-test/nexus-0}>; + }; + node@3 { /* Test the precedence of interrupts/interrupts-extended too */ + reg = <0 3>; + interrupts = <1 2 0 0 0 1>; + interrupt-parent = <&{/interrupt-map-test/nexus-0}>; + interrupts-extended = < + &{/interrupt-map-test/nexus-0} 0 0 + &{/interrupt-map-test/nexus-0} 0 1 + &{/interrupt-map-test/nexus-0} 1 2>; + }; + node@4 { + reg = <0 4>; + interrupts = <0 1 2>; + interrupt-parent = <&{/interrupt-map-test/nexus-1}>; + }; + node@100000004 { + reg = <1 4>; + interrupts = <0 1 2>; + interrupt-parent = <&{/interrupt-map-test/nexus-1}>; + }; }; interrupt-map-bitops-test { #address-cells = <2>; diff --git a/scripts/dts/python-devicetree/tests/test_edtlib.py b/scripts/dts/python-devicetree/tests/test_edtlib.py index 8c826225c9b..6318f92b6a9 100644 --- a/scripts/dts/python-devicetree/tests/test_edtlib.py +++ b/scripts/dts/python-devicetree/tests/test_edtlib.py @@ -97,6 +97,34 @@ def test_interrupts(): edtlib.ControllerAndData(node=node, controller=controller_2, data={'one': 0, 'two': 0, 'three': 5}, name=None, basename=None) ] + node = edt.get_node("/interrupt-map-test/node@2") + assert node.interrupts == [ + edtlib.ControllerAndData(node=node, controller=controller_0, data={'one': 0}, name=None, basename=None), + edtlib.ControllerAndData(node=node, controller=controller_1, data={'one': 0, 'two': 1}, name=None, basename=None), + edtlib.ControllerAndData(node=node, controller=controller_2, data={'one': 0, 'two': 0, 'three': 2}, name=None, basename=None) + ] + + node = edt.get_node("/interrupt-map-test/node@3") + assert node.interrupts == [ + edtlib.ControllerAndData(node=node, controller=controller_0, data={'one': 0}, name=None, basename=None), + edtlib.ControllerAndData(node=node, controller=controller_1, data={'one': 0, 'two': 1}, name=None, basename=None), + edtlib.ControllerAndData(node=node, controller=controller_2, data={'one': 0, 'two': 0, 'three': 2}, name=None, basename=None) + ] + + node = edt.get_node("/interrupt-map-test/node@4") + assert node.interrupts == [ + edtlib.ControllerAndData(node=node, controller=controller_0, data={'one': 3}, name=None, basename=None), + edtlib.ControllerAndData(node=node, controller=controller_1, data={'one': 0, 'two': 4}, name=None, basename=None), + edtlib.ControllerAndData(node=node, controller=controller_2, data={'one': 0, 'two': 0, 'three': 5}, name=None, basename=None) + ] + + node = edt.get_node("/interrupt-map-test/node@100000004") + assert node.interrupts == [ + edtlib.ControllerAndData(node=node, controller=controller_0, data={'one': 3}, name=None, basename=None), + edtlib.ControllerAndData(node=node, controller=controller_1, data={'one': 0, 'two': 4}, name=None, basename=None), + edtlib.ControllerAndData(node=node, controller=controller_2, data={'one': 0, 'two': 0, 'three': 5}, name=None, basename=None) + ] + node = edt.get_node("/interrupt-map-bitops-test/node@70000000E") assert node.interrupts == [ edtlib.ControllerAndData(node=node, controller=edt.get_node('/interrupt-map-bitops-test/controller'), data={'one': 3, 'two': 2}, name=None, basename=None)