From 9d10eb473d20fcee02d7e5976e50d92b2d05a7c3 Mon Sep 17 00:00:00 2001 From: Liav A Date: Fri, 18 Dec 2020 10:52:52 +0200 Subject: [PATCH] Kernel: Add the DeviceController class in the PCI subsystem Such device is not an IRQHandler by itself, but actually a controller of many IRQ or MSI devices. The purpose of this class is to manage multiple sources of interrupts. For example, a generic ISA IDE controller controls 2 IRQ sources - 14 and 15. So, when we initialize the IDE controller, it will initialize two IDE channels (also known as PATAChannels) to utilize IRQ 14 and 15, respectively. NVMe with MSI-X support can theoretically handle up to 2048 interrupts. --- Kernel/CMakeLists.txt | 1 + Kernel/PCI/Definitions.h | 2 ++ Kernel/PCI/DeviceController.cpp | 38 ++++++++++++++++++++++++++++ Kernel/PCI/DeviceController.h | 45 +++++++++++++++++++++++++++++++++ 4 files changed, 86 insertions(+) create mode 100644 Kernel/PCI/DeviceController.cpp create mode 100644 Kernel/PCI/DeviceController.h diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 81f1cc8ad0..1bd5adafad 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -83,6 +83,7 @@ set(KERNEL_SOURCES Net/UDPSocket.cpp PCI/Access.cpp PCI/Device.cpp + PCI/DeviceController.cpp PCI/IOAccess.cpp PCI/Initializer.cpp PCI/MMIOAccess.cpp diff --git a/Kernel/PCI/Definitions.h b/Kernel/PCI/Definitions.h index 5e1741d0db..1e29e3aac1 100644 --- a/Kernel/PCI/Definitions.h +++ b/Kernel/PCI/Definitions.h @@ -28,6 +28,7 @@ #include #include +#include #include namespace Kernel { @@ -221,6 +222,7 @@ class Access; class MMIOAccess; class IOAccess; class MMIOSegment; +class DeviceController; class Device; } diff --git a/Kernel/PCI/DeviceController.cpp b/Kernel/PCI/DeviceController.cpp new file mode 100644 index 0000000000..becf87c944 --- /dev/null +++ b/Kernel/PCI/DeviceController.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020, Liav A. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +namespace Kernel { +namespace PCI { + +DeviceController::DeviceController(Address address) + : m_pci_address(address) +{ +} + +} +} diff --git a/Kernel/PCI/DeviceController.h b/Kernel/PCI/DeviceController.h new file mode 100644 index 0000000000..bd42d6c1ec --- /dev/null +++ b/Kernel/PCI/DeviceController.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2020, Liav A. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include +#include + +namespace Kernel { +class PCI::DeviceController { +public: + Address pci_address() const { return m_pci_address; }; + + virtual ~DeviceController() { } + +protected: + explicit DeviceController(Address pci_address); + +private: + Address m_pci_address; +}; +}