diff --git a/src/dev/arm/Gic.py b/src/dev/arm/Gic.py index e2229b85b6..17a553fcc3 100644 --- a/src/dev/arm/Gic.py +++ b/src/dev/arm/Gic.py @@ -1,4 +1,4 @@ -# Copyright (c) 2012-2013, 2017-2019 ARM Limited +# Copyright (c) 2012-2013, 2017-2020 ARM Limited # All rights reserved. # # The license below extends only to copyright in the software and shall @@ -70,6 +70,19 @@ class BaseGic(PioDevice): assert self._state.interrupt_cells == 3 return [ int_type, int_num, int_flag ] +class ArmInterruptType(ScopedEnum): + """ + The values of the scoped enum are matching Linux macroes + defined in include/linux/irq.h. They are mainly meant + to be used for DTB autogen + """ + map = { + 'IRQ_TYPE_EDGE_RISING' : 0x1, + 'IRQ_TYPE_EDGE_FALLING' : 0x2, + 'IRQ_TYPE_LEVEL_HIGH' : 0x4, + 'IRQ_TYPE_LEVEL_LOW' : 0x8 + } + class ArmInterruptPin(SimObject): type = 'ArmInterruptPin' cxx_header = "dev/arm/base_gic.hh" @@ -78,6 +91,8 @@ class ArmInterruptPin(SimObject): platform = Param.Platform(Parent.any, "Platform with interrupt controller") num = Param.UInt32("Interrupt number in GIC") + int_type = Param.ArmInterruptType('IRQ_TYPE_LEVEL_HIGH', + "Interrupt type (level/edge triggered)") class ArmSPI(ArmInterruptPin): type = 'ArmSPI' diff --git a/src/dev/arm/base_gic.cc b/src/dev/arm/base_gic.cc index 493ffa68f3..f94d197c8f 100644 --- a/src/dev/arm/base_gic.cc +++ b/src/dev/arm/base_gic.cc @@ -81,7 +81,7 @@ ArmInterruptPinGen::ArmInterruptPinGen(const ArmInterruptPinParams &p) } ArmSPIGen::ArmSPIGen(const ArmSPIParams &p) - : ArmInterruptPinGen(p), pin(new ArmSPI(p.platform, p.num)) + : ArmInterruptPinGen(p), pin(new ArmSPI(p)) { } @@ -110,7 +110,7 @@ ArmPPIGen::get(ThreadContext* tc) } else { // Generate PPI Pin auto &p = static_cast(_params); - ArmPPI *pin = new ArmPPI(p.platform, tc, p.num); + ArmPPI *pin = new ArmPPI(p, tc); pins.insert({cid, pin}); @@ -119,9 +119,9 @@ ArmPPIGen::get(ThreadContext* tc) } ArmInterruptPin::ArmInterruptPin( - Platform *_platform, ThreadContext *tc, uint32_t int_num) - : threadContext(tc), platform(dynamic_cast(_platform)), - intNum(int_num), _active(false) + const ArmInterruptPinParams &p, ThreadContext *tc) + : threadContext(tc), platform(dynamic_cast(p.platform)), + intNum(p.num), triggerType(p.int_type), _active(false) { fatal_if(!platform, "Interrupt not connected to a RealView platform"); } @@ -156,8 +156,8 @@ ArmInterruptPin::unserialize(CheckpointIn &cp) } ArmSPI::ArmSPI( - Platform *_platform, uint32_t int_num) - : ArmInterruptPin(_platform, nullptr, int_num) + const ArmSPIParams &p) + : ArmInterruptPin(p, nullptr) { } @@ -176,8 +176,8 @@ ArmSPI::clear() } ArmPPI::ArmPPI( - Platform *_platform, ThreadContext *tc, uint32_t int_num) - : ArmInterruptPin(_platform, tc, int_num) + const ArmPPIParams &p, ThreadContext *tc) + : ArmInterruptPin(p, tc) { } diff --git a/src/dev/arm/base_gic.hh b/src/dev/arm/base_gic.hh index 1d86550787..4eef85b5a7 100644 --- a/src/dev/arm/base_gic.hh +++ b/src/dev/arm/base_gic.hh @@ -47,6 +47,8 @@ #include "arch/arm/system.hh" #include "dev/io_device.hh" +#include "enums/ArmInterruptType.hh" + class Platform; class RealView; class ThreadContext; @@ -177,8 +179,7 @@ class ArmInterruptPin : public Serializable { friend class ArmInterruptPinGen; protected: - ArmInterruptPin(Platform *platform, ThreadContext *tc, - uint32_t int_num); + ArmInterruptPin(const ArmInterruptPinParams &p, ThreadContext *tc); public: /* Public interface */ /** @@ -226,6 +227,9 @@ class ArmInterruptPin : public Serializable /** Interrupt number to generate */ const uint32_t intNum; + /** Interrupt triggering type */ + const ArmInterruptType triggerType; + /** True if interrupt pin is active, false otherwise */ bool _active; }; @@ -234,7 +238,7 @@ class ArmSPI : public ArmInterruptPin { friend class ArmSPIGen; private: - ArmSPI(Platform *platform, uint32_t int_num); + ArmSPI(const ArmSPIParams &p); public: void raise() override; @@ -245,7 +249,7 @@ class ArmPPI : public ArmInterruptPin { friend class ArmPPIGen; private: - ArmPPI(Platform *platform, ThreadContext *tc, uint32_t int_num); + ArmPPI(const ArmPPIParams &p, ThreadContext *tc); public: void raise() override;