1 #include <hal/ahci/hba.h>
2 #include <klibc/string.h>
4 #include <lunaix/block.h>
5 #include <lunaix/mm/cake.h>
6 #include <lunaix/mm/valloc.h>
7 #include <lunaix/syslog.h>
18 struct cake_pile* lbd_pile;
19 struct block_dev** dev_registry;
24 __block_mount_partitions(struct hba_device* hd_dev);
27 __block_register(struct block_dev* dev);
32 lbd_pile = cake_new_pile("block_dev", sizeof(struct block_dev), 1, 0);
33 dev_registry = vcalloc(sizeof(struct block_dev*), MAX_DEV);
37 block_mount_disk(struct hba_device* hd_dev)
40 struct block_dev* dev = cake_grab(lbd_pile);
41 strncpy(dev->name, hd_dev->model, PARTITION_NAME_SIZE);
44 dev->end_lba = hd_dev->max_lba;
45 if (!__block_register(dev)) {
50 if ((errno = __block_mount_partitions(hd_dev))) {
55 kprintf(KERROR "Fail to mount hd: %s[%s] (%x)",
62 __block_mount_partitions(struct hba_device* hd_dev)
65 void* buffer = valloc_dma(hd_dev->block_size);
66 if (!hd_dev->ops.read_buffer(hd_dev, 1, buffer, hd_dev->block_size)) {
71 struct lpt_header* header = (struct lpt_header*)buffer;
72 if (header->signature != LPT_SIG) {
77 if (header->crc != crc32b(buffer, sizeof(*header))) {
82 uint64_t lba = header->pt_start_lba;
84 int count_per_sector = hd_dev->block_size / sizeof(struct lpt_entry);
85 while (lba < header->pt_end_lba) {
86 if (!hd_dev->ops.read_buffer(hd_dev, lba, buffer, hd_dev->block_size)) {
90 struct lpt_entry* entry = (struct lpt_entry*)buffer;
91 for (int i = 0; i < count_per_sector; i++, j++) {
92 struct block_dev* dev = cake_grab(lbd_pile);
93 strncpy(dev->name, entry->part_name, PARTITION_NAME_SIZE);
95 dev->base_lba = entry->base_lba;
96 dev->end_lba = entry->end_lba;
97 __block_register(dev);
99 if (j >= header->table_len) {
111 __block_register(struct block_dev* dev)
113 if (free_slot >= MAX_DEV) {
117 dev_registry[free_slot++] = dev;