The Pedigree Project 0.1
Pic.h
1/*
2 * Copyright (c) 2008-2014, Pedigree Developers
3 *
4 * Please see the CONTRIB file in the root of the source tree for a full
5 * list of contributors.
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#ifndef KERNEL_MACHINE_X86_COMMON_PIC_H
21#define KERNEL_MACHINE_X86_COMMON_PIC_H
22#include "pedigree/kernel/compiler.h"
23#include "pedigree/kernel/machine/IrqDiagnosticSnapshotStore.h"
24#include "pedigree/kernel/machine/IrqHandler.h"
25#include "pedigree/kernel/machine/IrqHandlerRegistry.h"
26#include "pedigree/kernel/machine/IrqManager.h"
27#include "pedigree/kernel/machine/ThreadedIrqDispatcher.h"
28#include "pedigree/kernel/machine/types.h"
29#include "pedigree/kernel/process/Mutex.h"
30#include "pedigree/kernel/processor/InterruptHandler.h"
31#include "pedigree/kernel/processor/IoPort.h"
32#include "pedigree/kernel/processor/state_forward.h"
33#include "pedigree/kernel/processor/types.h"
34#include "pedigree/kernel/utilities/new"
35
36#include <config.h>
37
38#include "PicIrqState.h"
39
40class Device;
41class HardIrqHandler;
42class IrqHandler;
43class IrqHandlerBase;
45class PciMessageInterrupts;
46class PciIoApicInterrupts;
47
52class Pic : public IrqManager, private InterruptHandler {
53 public:
56 inline static Pic& instance() {
57 return m_Instance;
58 }
59
61 bool reservePciRoute(uint8_t irq);
62
63 EXPORTED_PUBLIC bool hasIoApic() const;
64 EXPORTED_PUBLIC bool reservePciGsi(uint32_t gsi, bool activeLow);
65
66 //
67 // IrqManager interface
68 //
69 virtual irq_id_t registerIsaIrqHandler(uint8_t irq, IrqHandler* handler, const IrqPolicy& policy);
70 virtual irq_id_t registerPciIrqHandler(IrqHandler* handler, Device* pDevice,
71 const IrqPolicy& policy);
72 virtual irq_id_t registerHardIsaIrqHandler(uint8_t irq, HardIrqHandler* handler,
73 const IrqPolicy& policy);
74 virtual irq_id_t registerHardPciIrqHandler(HardIrqHandler* handler, Device* pDevice,
75 const IrqPolicy& policy);
76 irq_id_t registerPciMessageIrqHandler(IrqHandler* handler, Device* device,
77 const IrqPolicy& intxFallbackPolicy) override;
78 bool registerPciMsixIrqHandlers(Device* device, IrqHandler* const* handlers, size_t count,
79 irq_id_t* ids, bool& fallbackSafe,
80 const size_t* processors = nullptr) override;
82 const IrqPolicy& intxFallbackPolicy) override;
83 virtual irq_id_t registerSchedulerIrqHandler(uint8_t irq, SchedulerIrqHandler* handler,
84 const IrqPolicy& policy);
85 virtual bool unregisterSchedulerIrqHandler(irq_id_t Id, SchedulerIrqHandler* handler);
86 virtual bool unregisterHandler(irq_id_t Id, IrqHandlerBase* handler);
87 virtual size_t snapshotIrqLines(IrqLineDiagnosticSnapshot* out, size_t capacity) const;
88
93
95 bool initialiseThreaded();
96
98 bool shutdownThreaded();
99
101 virtual void tick();
102
104 virtual bool control(uint8_t irq, ControlCode code, size_t argument);
105
106 private:
107 class StateGuard;
108 class HardStateGuard;
109
113 inline virtual ~Pic() {}
116 Pic(const Pic&);
119 Pic& operator=(const Pic&);
120
121 //
122 // InterruptHandler interface
123 //
124 virtual void interrupt(size_t interruptNumber, InterruptState& state);
125
126 static void dispatchThreadedLine(void* context, uint8_t irq, size_t cookie);
127#if MULTIPROCESSOR
128 static bool promptThreadedWorker(void* context, uint8_t line, size_t workerProcessor);
129#endif
130 static constexpr uint8_t ControllerWorkLine = PicIrqState::LineCount;
131 bool drainOnePendingControllerBatchLocked();
132 void drainPendingControllerActionsLocked();
133 void releaseControllerState();
134 void releaseControllerStateFromInterrupt();
135 bool handControllerStateToWorker();
136 void finishDeferredLineTransitionsLocked();
137 void clearControllerTemporaryMaskLocked(uint16_t restoreMask = 0xFFFF);
138 uint16_t effectiveMaskLocked() const;
139 void beginLineTransitionLocked(uint8_t irq);
140 void finishLineTransitionLocked(uint8_t irq);
141 void finishHandlerUnregisterLocked(uint8_t irq, IrqHandlerRegistry::UnregisterResult result,
142 IrqHandlerRegistry::LineMode removedDelivery);
143 bool claimPciTriggerLocked(uint8_t irq);
144 void restorePciTriggerLocked(uint8_t irq);
145 void admitThreadedOccurrenceLocked(uint8_t irq);
146 void finishHardDispatchLocked(const PicHardTailRecord& record);
147 void finishHardDispatchFromInterrupt(const PicHardTailRecord& record);
148 size_t advanceThreadedCookieLocked(uint8_t irq);
149 void publishDiagnosticLineLocked(uint8_t irq);
150 void publishAllDiagnosticLinesLocked();
151
152 enum FailClosedReason : uint8_t {
153 HardHandoffQuarantine = 1U << 0,
154 ThreadedPublicationQuarantine = 1U << 1,
155 UnhandledQuarantine = 1U << 2,
156 ControllerContentionQuarantine = 1U << 3,
157 };
158
159 void eoiLocked(uint8_t irq);
160 void applyMaskLocked();
161 void setEnabledLocked(uint8_t irq, bool enable);
162 void enable(uint8_t irq, bool enable);
163 void enableAll(bool enable);
164
166 bool spuriousLocked(size_t irq);
167
172 IoPort m_ElcrPort;
173 uint16_t m_OwnedElcr;
174 uint16_t m_OriginalElcr;
175
178#if MULTIPROCESSOR
179 PciMessageInterrupts* m_Messages;
180#if ACPI
181 PciIoApicInterrupts* m_Intx;
182#endif
183#endif
197 size_t m_ThreadedCookies[PicIrqState::LineCount];
199 size_t m_ThreadedDispatchGenerations[PicIrqState::LineCount];
201 size_t m_HardStageGenerations[PicIrqState::LineCount];
203 bool m_ThreadedHadHardStage[PicIrqState::LineCount];
204 bool m_ThreadedHardAdmitted[PicIrqState::LineCount];
205 HardIrqDisposition m_ThreadedHardDisposition[PicIrqState::LineCount];
206 bool m_ThreadedHardVetoRecovery[PicIrqState::LineCount];
207 size_t m_ThreadedHardVetoRecoveryGenerations[PicIrqState::LineCount];
209 uint8_t m_FailClosedReasons[PicIrqState::LineCount];
211 size_t m_ThreadedPublicationFailures[PicIrqState::LineCount];
212 size_t m_RemovalRejections[PicIrqState::LineCount];
214 size_t m_ControllerContentions[PicIrqState::LineCount];
217 size_t m_ControllerPromptFailures;
218 size_t m_ControllerPromptDestination;
219 size_t m_ControllerPromptState;
233 size_t m_UnregisterReservations[PicIrqState::LineCount];
237 size_t m_IrqCount[16];
247 static EXPORTED_PUBLIC Pic m_Instance;
248};
249
252#endif
Abstract base class for interrupt-handlers.
I/O port range.
Definition IoPort.h:33
Definition Mutex.h:56
Definition Pic.h:52
size_t m_UnregisterReservations[PicIrqState::LineCount]
Definition Pic.h:233
size_t m_ThreadedPublicationFailures[PicIrqState::LineCount]
Definition Pic.h:211
size_t m_ThreadedDispatchGenerations[PicIrqState::LineCount]
Definition Pic.h:199
static EXPORTED_PUBLIC Pic m_Instance
Definition Pic.h:247
virtual bool unregisterHandler(irq_id_t Id, IrqHandlerBase *handler)
Definition Pic.cc:592
virtual bool unregisterSchedulerIrqHandler(irq_id_t Id, SchedulerIrqHandler *handler)
Definition Pic.cc:507
size_t m_HardStageGenerations[PicIrqState::LineCount]
Definition Pic.h:201
IrqDiagnosticSnapshotStore< PicIrqState::LineCount > m_Diagnostics
Definition Pic.h:231
static Pic & instance()
Definition Pic.h:56
uint8_t m_DeliveryApicId
Definition Pic.h:229
virtual bool control(uint8_t irq, ControlCode code, size_t argument)
Definition Pic.cc:144
virtual irq_id_t registerIsaIrqHandler(uint8_t irq, IrqHandler *handler, const IrqPolicy &policy)
Definition Pic.cc:167
virtual irq_id_t registerHardIsaIrqHandler(uint8_t irq, HardIrqHandler *handler, const IrqPolicy &policy)
Definition Pic.cc:200
virtual irq_id_t registerPciIrqHandler(IrqHandler *handler, Device *pDevice, const IrqPolicy &policy)
Definition Pic.cc:329
Mutex m_ControllerThreadMutex
Definition Pic.h:193
size_t m_ThreadedCookies[PicIrqState::LineCount]
Definition Pic.h:197
PicControllerStateGate m_ControllerStateGate
Definition Pic.h:189
IoPort m_MasterPort
Definition Pic.h:171
uint16_t m_ControllerTemporaryMask
Definition Pic.h:221
PicHardTailQueue m_HardTailQueue
Definition Pic.h:191
Pic(const Pic &)
virtual irq_id_t registerSchedulerIrqHandler(uint8_t irq, SchedulerIrqHandler *handler, const IrqPolicy &policy)
Definition Pic.cc:489
uint8_t m_FailClosedReasons[PicIrqState::LineCount]
Definition Pic.h:209
size_t m_UnhandledIrqCount[16]
Definition Pic.h:241
virtual void tick()
Definition Pic.cc:142
bool m_ThreadedHadHardStage[PicIrqState::LineCount]
Definition Pic.h:203
size_t m_DeliveryProcessor
Definition Pic.h:227
virtual void interrupt(size_t interruptNumber, InterruptState &state)
Definition Pic.cc:1367
Pic & operator=(const Pic &)
bool m_ShuttingDown
Definition Pic.h:235
size_t m_ControllerPromptAttempts
Definition Pic.h:216
IoPort m_SlavePort
Definition Pic.h:169
ThreadedIrqDispatcher m_ThreadedDispatcher
Definition Pic.h:195
virtual irq_id_t registerHardPciIrqHandler(HardIrqHandler *handler, Device *pDevice, const IrqPolicy &policy)
Definition Pic.cc:381
SchedulerIrqHandler * m_SchedulerIrqHandler
Definition Pic.h:185
bool registerPciMsixIrqHandlers(Device *device, IrqHandler *const *handlers, size_t count, irq_id_t *ids, bool &fallbackSafe, const size_t *processors=nullptr) override
Definition Pic.cc:455
uint16_t m_DeferredLineTransitions
Definition Pic.h:225
bool initialiseThreaded()
Definition Pic.cc:715
bool reservePciRoute(uint8_t irq)
Definition Pic.cc:232
size_t m_SpuriousIrqCount[16]
Definition Pic.h:239
bool m_MitigatedIrqs[16]
Definition Pic.h:243
irq_id_t registerHardPciMessageIrqHandler(HardIrqHandler *handler, Device *device, const IrqPolicy &intxFallbackPolicy) override
Definition Pic.cc:467
irq_id_t registerPciMessageIrqHandler(IrqHandler *handler, Device *device, const IrqPolicy &intxFallbackPolicy) override
Definition Pic.cc:433
size_t m_MitigationThreshold[16]
Definition Pic.h:245
IrqHandlerRegistry m_Handlers
Definition Pic.h:177
bool shutdownThreaded()
Definition Pic.cc:752
PicIrqState m_IrqState
Definition Pic.h:187
size_t m_ControllerContentions[PicIrqState::LineCount]
Definition Pic.h:214
bool spuriousLocked(size_t irq)
Definition Pic.cc:1020
virtual size_t snapshotIrqLines(IrqLineDiagnosticSnapshot *out, size_t capacity) const
Definition Pic.cc:928
bool initialise() INITIALISATION_ONLY
Definition Pic.cc:648
uint16_t m_AppliedControllerMask
Definition Pic.h:223
size_t m_IrqCount[16]
Definition Pic.h:237
HardIrqDisposition
Definition IrqHandler.h:44