summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/StorageKit
diff options
context:
space:
mode:
Diffstat (limited to 'dev/kernel/StorageKit')
-rw-r--r--dev/kernel/StorageKit/AHCI.h60
-rw-r--r--dev/kernel/StorageKit/ATA.h39
-rw-r--r--dev/kernel/StorageKit/NVME.h34
-rw-r--r--dev/kernel/StorageKit/PRDT.h36
-rw-r--r--dev/kernel/StorageKit/SCSI.h11
-rw-r--r--dev/kernel/StorageKit/StorageKit.h22
6 files changed, 202 insertions, 0 deletions
diff --git a/dev/kernel/StorageKit/AHCI.h b/dev/kernel/StorageKit/AHCI.h
new file mode 100644
index 00000000..43e81ba0
--- /dev/null
+++ b/dev/kernel/StorageKit/AHCI.h
@@ -0,0 +1,60 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024-2025, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <KernelKit/DeviceMgr.h>
+#include <KernelKit/DriveMgr.h>
+#include <NewKit/OwnPtr.h>
+
+namespace NeOS
+{
+ class AHCIDeviceInterface NE_DEVICE<MountpointInterface*>
+ {
+ public:
+ explicit AHCIDeviceInterface(void (*out)(IDeviceObject* self, MountpointInterface* out),
+ void (*in)(IDeviceObject* self, MountpointInterface* in),
+ void (*cleanup)(void));
+
+ virtual ~AHCIDeviceInterface() override;
+
+ public:
+ AHCIDeviceInterface& operator=(const AHCIDeviceInterface&) = default;
+ AHCIDeviceInterface(const AHCIDeviceInterface&) = default;
+
+ const Char* Name() const override;
+
+ const UInt16& GetPortsImplemented()
+ {
+ return this->fPortsImplemented;
+ }
+
+ Void SetPortsImplemented(const UInt16& pi)
+ {
+ MUST_PASS(pi > 0);
+ this->fPortsImplemented = pi;
+ }
+
+ const UInt32& GetIndex()
+ {
+ return this->fDriveIndex;
+ }
+
+ Void SetIndex(const UInt32& drv)
+ {
+ MUST_PASS(MountpointInterface::kDriveIndexInvalid != drv);
+ this->fDriveIndex = drv;
+ }
+
+ private:
+ Void (*fCleanup)(Void) = {nullptr};
+ UInt16 fPortsImplemented{0U};
+ UInt32 fDriveIndex{0U};
+ };
+
+ UInt16 sk_init_ahci_device(BOOL atapi);
+ ErrorOr<AHCIDeviceInterface> sk_acquire_ahci_device(Int32 drv_index);
+} // namespace NeOS
diff --git a/dev/kernel/StorageKit/ATA.h b/dev/kernel/StorageKit/ATA.h
new file mode 100644
index 00000000..5698fe85
--- /dev/null
+++ b/dev/kernel/StorageKit/ATA.h
@@ -0,0 +1,39 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024-2025, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <KernelKit/DeviceMgr.h>
+#include <KernelKit/DriveMgr.h>
+#include <NewKit/OwnPtr.h>
+#include <NewKit/Utils.h>
+
+namespace NeOS
+{
+ /// @brief ATA device interface type.
+ class ATADeviceInterface : public IDeviceObject<MountpointInterface*>
+ {
+ public:
+ explicit ATADeviceInterface(void (*Out)(IDeviceObject*, MountpointInterface* outpacket),
+ void (*In)(IDeviceObject*, MountpointInterface* inpacket),
+ void (*Cleanup)(void));
+
+ virtual ~ATADeviceInterface();
+
+ public:
+ ATADeviceInterface& operator<<(MountpointInterface* Data) override;
+ ATADeviceInterface& operator>>(MountpointInterface* Data) override;
+
+ public:
+ ATADeviceInterface& operator=(const ATADeviceInterface&) = default;
+ ATADeviceInterface(const ATADeviceInterface&) = default;
+
+ const Char* Name() const override;
+
+ private:
+ void (*fCleanup)(void) = {nullptr};
+ };
+} // namespace NeOS
diff --git a/dev/kernel/StorageKit/NVME.h b/dev/kernel/StorageKit/NVME.h
new file mode 100644
index 00000000..22300726
--- /dev/null
+++ b/dev/kernel/StorageKit/NVME.h
@@ -0,0 +1,34 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024-2025, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <KernelKit/DeviceMgr.h>
+#include <KernelKit/DriveMgr.h>
+
+namespace NeOS
+{
+ class NVMEDeviceInterface final NE_DEVICE<MountpointInterface*>
+ {
+ public:
+ explicit NVMEDeviceInterface(Void (*out)(IDeviceObject*, MountpointInterface* out_packet),
+ Void (*in)(IDeviceObject*, MountpointInterface* in_packet),
+ Void (*cleanup)(Void));
+
+ ~NVMEDeviceInterface() override;
+
+ public:
+ NE_COPY_DEFAULT(NVMEDeviceInterface);
+
+ const Char* Name() const override;
+
+ public:
+ OwnPtr<MountpointInterface*> operator()(UInt32 dma_low, UInt32 dma_high, SizeT dma_sz);
+
+ private:
+ Void (*fCleanup)(Void) = {nullptr};
+ };
+} // namespace NeOS
diff --git a/dev/kernel/StorageKit/PRDT.h b/dev/kernel/StorageKit/PRDT.h
new file mode 100644
index 00000000..40ba11e0
--- /dev/null
+++ b/dev/kernel/StorageKit/PRDT.h
@@ -0,0 +1,36 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024-2025, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <KernelKit/PCI/DMA.h>
+#include <KernelKit/PCI/Iterator.h>
+#include <NewKit/Ref.h>
+
+#define kPrdtTransferSize (sizeof(NeOS::UShort))
+
+namespace NeOS
+{
+ /// @brief Tranfer information about PRD.
+ enum kPRDTTransfer
+ {
+ kPRDTTransferInProgress,
+ kPRDTTransferIsDone,
+ kPRDTTransferCount,
+ };
+
+ /// @brief Physical Region Descriptor Table.
+ struct PRDT
+ {
+ UInt32 fPhysAddress;
+ UInt32 fSectorCount;
+ UInt8 fEndBit;
+ };
+
+ void construct_prdt(Ref<PRDT>& prd);
+
+ EXTERN_C Int32 kPRDTTransferStatus;
+} // namespace NeOS
diff --git a/dev/kernel/StorageKit/SCSI.h b/dev/kernel/StorageKit/SCSI.h
new file mode 100644
index 00000000..fc526447
--- /dev/null
+++ b/dev/kernel/StorageKit/SCSI.h
@@ -0,0 +1,11 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024-2025, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#include <modules/SCSI/SCSI.h>
+
+extern const scsi_packet_type<12> kCDRomPacketTemplate;
diff --git a/dev/kernel/StorageKit/StorageKit.h b/dev/kernel/StorageKit/StorageKit.h
new file mode 100644
index 00000000..a0f1a2d1
--- /dev/null
+++ b/dev/kernel/StorageKit/StorageKit.h
@@ -0,0 +1,22 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024-2025, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#pragma once
+
+#define kDriveSectorSizeHDD (512U)
+#define kDriveSectorSizeSSD (512U)
+#define kDriveSectorSizeOptical (2048)
+
+namespace NeOS
+{
+ template <typename T>
+ class IDeviceObject;
+
+ class NVMEDeviceInterface;
+ class AHCIDeviceInterface;
+ class ATADeviceInterface;
+ class SCSIDeviceInterface;
+} // namespace NeOS