2023-05-15 16:13:58 +00:00
|
|
|
// This file is part of noxos and licensed under the MIT open source license
|
|
|
|
|
|
|
|
#ifndef NOXOS_DRIVE_MANAGER_H
|
|
|
|
#define NOXOS_DRIVE_MANAGER_H
|
|
|
|
|
2023-05-28 19:06:06 +00:00
|
|
|
#include "drivers/builtin/fs/vfs.h"
|
2023-05-15 16:13:58 +00:00
|
|
|
#include "utils/stdtypes.h"
|
|
|
|
#include "utils/bitmap.h"
|
|
|
|
|
|
|
|
#define DRIVE_CHUNK_SIZE 16
|
|
|
|
#define DRIVE_PARTITION_CHUNK_SIZE 16
|
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
DRIVE_CONTROLLER_AHCI
|
|
|
|
} drive_controller_types_E;
|
|
|
|
|
|
|
|
typedef struct drive_chunk_T drive_chunk_T;
|
|
|
|
typedef struct drive_partition_chunk_T drive_partition_chunk_T;
|
|
|
|
typedef struct drive_partition_T drive_partition_T;
|
|
|
|
typedef struct drive_T drive_T;
|
|
|
|
|
|
|
|
struct drive_partition_T{
|
|
|
|
drive_partition_chunk_T* chunk;
|
|
|
|
uint32_t id_in_chunk;
|
|
|
|
uint32_t id;
|
|
|
|
drive_T* drive;
|
|
|
|
fs_T filesystem;
|
|
|
|
uint32_t start_sector;
|
|
|
|
uint32_t end_sector;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct drive_T {
|
|
|
|
drive_chunk_T* chunk;
|
|
|
|
uint32_t id_in_chunk;
|
|
|
|
uint32_t id;
|
|
|
|
drive_partition_chunk_T* partitions_chunks;
|
|
|
|
drive_controller_types_E controller_type;
|
|
|
|
void* controller;
|
2023-05-16 21:38:14 +00:00
|
|
|
void* device;
|
2023-05-15 16:13:58 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct drive_chunk_T {
|
|
|
|
drive_T drives [DRIVE_CHUNK_SIZE];
|
|
|
|
bitmap_T drives_bitmap;
|
|
|
|
uint32_t num_drives;
|
|
|
|
drive_chunk_T* prev;
|
|
|
|
drive_chunk_T* next;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct drive_partition_chunk_T {
|
|
|
|
drive_partition_T partitions [DRIVE_PARTITION_CHUNK_SIZE];
|
|
|
|
bitmap_T partitions_bitmap;
|
|
|
|
uint32_t num_partitions;
|
|
|
|
drive_partition_chunk_T* prev;
|
|
|
|
drive_partition_chunk_T* next;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
drive_chunk_T* chunks;
|
|
|
|
} drive_manager_T;
|
|
|
|
|
|
|
|
drive_chunk_T* drive_chunk_alloc (drive_chunk_T* prev);
|
|
|
|
drive_partition_chunk_T* drive_partition_chunk_alloc (drive_partition_chunk_T* prev);
|
|
|
|
void drive_partition_chunk_destruct (drive_partition_chunk_T* chunk);
|
|
|
|
|
|
|
|
void drive_manager_init ();
|
|
|
|
drive_T* drive_manager_add_drive (drive_controller_types_E controller_type, void* controller, void* device);
|
|
|
|
void drive_manager_remove_drive (drive_T* drive);
|
|
|
|
drive_partition_T* drive_manager_add_partition (drive_T* drive, uint32_t start_sector, uint32_t end_sector);
|
|
|
|
void drive_manager_remove_partition (drive_partition_T* partition);
|
|
|
|
|
|
|
|
#endif //NOXOS_DRIVE_MANAGER_H
|