Serenity Operating System
at master 73 lines 2.5 kB view raw
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}