Serenity Operating System
1/*
2 * Copyright (c) 2020-2022, Liav A. <liavalb@hotmail.co.il>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <AK/IntrusiveList.h>
10#include <AK/Types.h>
11#include <Kernel/FileSystem/FileSystem.h>
12#include <Kernel/Library/NonnullLockRefPtr.h>
13#include <Kernel/Storage/DiskPartition.h>
14#include <Kernel/Storage/StorageController.h>
15#include <Kernel/Storage/StorageDevice.h>
16#include <LibPartition/PartitionTable.h>
17
18namespace Kernel {
19
20class ATAController;
21class NVMeController;
22class StorageManagement {
23
24public:
25 StorageManagement();
26 void initialize(StringView boot_argument, bool force_pio, bool nvme_poll);
27 static StorageManagement& the();
28
29 NonnullLockRefPtr<FileSystem> root_filesystem() const;
30
31 static MajorNumber storage_type_major_number();
32 static MinorNumber generate_storage_minor_number();
33
34 static MinorNumber generate_partition_minor_number();
35
36 static u32 generate_controller_id();
37
38 static u32 generate_relative_nvme_controller_id(Badge<NVMeController>);
39 static u32 generate_relative_ata_controller_id(Badge<ATAController>);
40
41 void remove_device(StorageDevice&);
42
43private:
44 void enumerate_pci_controllers(bool force_pio, bool nvme_poll);
45 void enumerate_storage_devices();
46 void enumerate_disk_partitions();
47
48 void determine_boot_device();
49 void determine_boot_device_with_partition_uuid();
50
51 void resolve_partition_from_boot_device_parameter(StorageDevice const& chosen_storage_device, StringView boot_device_prefix);
52 void determine_boot_device_with_logical_unit_number();
53 void determine_block_boot_device();
54 void determine_ramdisk_boot_device();
55 void determine_nvme_boot_device();
56 void determine_ata_boot_device();
57 void determine_hardware_relative_boot_device(StringView relative_hardware_prefix, Function<bool(StorageDevice const&)> filter_device_callback);
58 Array<unsigned, 3> extract_boot_device_address_parameters(StringView device_prefix);
59 Optional<unsigned> extract_boot_device_partition_number_parameter(StringView device_prefix);
60
61 void dump_storage_devices_and_partitions() const;
62
63 ErrorOr<NonnullOwnPtr<Partition::PartitionTable>> try_to_initialize_partition_table(StorageDevice&) const;
64
65 LockRefPtr<BlockDevice> boot_block_device() const;
66
67 StringView m_boot_argument;
68 LockWeakPtr<BlockDevice> m_boot_block_device;
69 Vector<NonnullLockRefPtr<StorageController>> m_controllers;
70 IntrusiveList<&StorageDevice::m_list_node> m_storage_devices;
71};
72
73}