1 #include <hal/ahci/hba.h>
2 #include <klibc/stdio.h>
3 #include <klibc/string.h>
5 #include <lunaix/block.h>
6 #include <lunaix/fs/twifs.h>
7 #include <lunaix/mm/cake.h>
8 #include <lunaix/mm/valloc.h>
9 #include <lunaix/syslog.h>
11 #include <lunaix/spike.h>
22 struct cake_pile* lbd_pile;
23 struct block_dev** dev_registry;
28 __block_mount_partitions(struct hba_device* hd_dev);
31 __block_register(struct block_dev* dev);
36 lbd_pile = cake_new_pile("block_dev", sizeof(struct block_dev), 1, 0);
37 dev_registry = vcalloc(sizeof(struct block_dev*), MAX_DEV);
44 __block_read(struct device* dev, void* buf, size_t offset, size_t len)
47 struct block_dev* bdev = (struct block_dev*)dev->underlay;
48 size_t acc_size = 0, rd_size = 0, bsize = bdev->hd_dev->block_size,
49 rd_block = offset / bsize, r = offset % bsize,
50 max_blk = (size_t)bdev->hd_dev->max_lba;
51 void* block = vzalloc(bsize);
53 while (acc_size < len && rd_block < max_blk) {
54 if (!bdev->hd_dev->ops.read_buffer(
55 bdev->hd_dev, rd_block, block, bsize)) {
59 rd_size = MIN(len - acc_size, bsize - r);
60 memcpy(buf + acc_size, block + r, rd_size);
75 __block_write(struct device* dev, void* buf, size_t offset, size_t len)
78 struct block_dev* bdev = (struct block_dev*)dev->underlay;
79 size_t acc_size = 0, wr_size = 0, bsize = bdev->hd_dev->block_size,
80 wr_block = offset / bsize, r = offset % bsize;
81 void* block = vzalloc(bsize);
83 while (acc_size < len) {
84 wr_size = MIN(len - acc_size, bsize - r);
85 memcpy(block + r, buf + acc_size, wr_size);
86 if (!bdev->hd_dev->ops.write_buffer(
87 bdev->hd_dev, wr_block, block, bsize)) {
105 block_mount_disk(struct hba_device* hd_dev)
108 struct block_dev* bdev = cake_grab(lbd_pile);
109 strncpy(bdev->name, hd_dev->model, PARTITION_NAME_SIZE);
110 bdev->hd_dev = hd_dev;
112 bdev->end_lba = hd_dev->max_lba;
113 if (!__block_register(bdev)) {
118 blk_set_blkmapping(bdev);
122 kprintf(KERROR "Fail to mount hd: %s[%s] (%x)\n",
130 __block_register(struct block_dev* bdev)
132 if (free_slot >= MAX_DEV) {
136 struct device* dev = device_addvol(NULL, bdev, "sd%c", 'a' + free_slot);
137 dev->write = __block_write;
138 dev->read = __block_read;
141 strcpy(bdev->bdev_id, dev->name_val);
142 dev_registry[free_slot++] = bdev;