Serenity Operating System
1/*
2 * Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <AK/OwnPtr.h>
10#include <Kernel/Bus/PCI/Access.h>
11#include <Kernel/Bus/PCI/Device.h>
12#include <Kernel/Devices/Device.h>
13#include <Kernel/Library/LockRefPtr.h>
14#include <Kernel/Locking/Mutex.h>
15#include <Kernel/Memory/PhysicalPage.h>
16#include <Kernel/PhysicalAddress.h>
17#include <Kernel/Random.h>
18#include <Kernel/WaitQueue.h>
19
20namespace Kernel {
21
22class AsyncBlockDeviceRequest;
23class StorageDevice;
24class StorageController : public AtomicRefCounted<StorageController> {
25
26public:
27 virtual ~StorageController() = default;
28
29 virtual LockRefPtr<StorageDevice> device(u32 index) const = 0;
30 virtual size_t devices_count() const = 0;
31
32 u32 controller_id() const { return m_controller_id; }
33 u32 hardware_relative_controller_id() const { return m_hardware_relative_controller_id; }
34
35protected:
36 virtual bool reset() = 0;
37 virtual bool shutdown() = 0;
38
39 virtual void complete_current_request(AsyncDeviceRequest::RequestResult) = 0;
40
41 explicit StorageController(u32 hardware_relative_controller_id);
42
43private:
44 u32 const m_controller_id { 0 };
45
46 u32 const m_hardware_relative_controller_id { 0 };
47};
48}