refactor: make pci device driver loading passive, pci bus scanner will not load them...
[lunaix-os.git] / lunaix-os / kernel / block / blk_mapping.c
1 #include <lunaix/block.h>
2 #include <lunaix/fs/twifs.h>
3
4 static struct twifs_node* blk_root;
5
6 void
7 blk_mapping_init()
8 {
9     blk_root = twifs_dir_node(NULL, "block");
10 }
11
12 void
13 __blk_rd_lblksz(struct twimap* map)
14 {
15     struct block_dev* bdev = twimap_data(map, struct block_dev*);
16     size_t lblksz = bdev->blk_size;
17     twimap_printf(map, "%u", lblksz);
18 }
19
20 void
21 __blk_rd_name(struct twimap* map)
22 {
23     struct block_dev* bdev = twimap_data(map, struct block_dev*);
24     twimap_printf(map, "%s", bdev->name);
25 }
26
27 void
28 __blk_rd_start_lba(struct twimap* map)
29 {
30     struct block_dev* bdev = twimap_data(map, struct block_dev*);
31     twimap_printf(map, "%d", bdev->start_lba);
32 }
33
34 void
35 __blk_rd_end_lba(struct twimap* map)
36 {
37     struct block_dev* bdev = twimap_data(map, struct block_dev*);
38     twimap_printf(map, "%d", bdev->end_lba);
39 }
40
41 void
42 __blk_rd_size(struct twimap* map)
43 {
44     struct block_dev* bdev = twimap_data(map, struct block_dev*);
45     twimap_printf(
46       map, "%u", (u32_t)(bdev->end_lba - bdev->start_lba) * bdev->blk_size);
47 }
48
49 void
50 __map_internal(struct block_dev* bdev, void* fsnode)
51 {
52     struct twifs_node* dev_root = (struct twifs_node*)fsnode;
53
54     struct twimap* map = twifs_mapping(dev_root, bdev, "size");
55     map->read = __blk_rd_size;
56
57     map = twifs_mapping(dev_root, bdev, "lblk_size");
58     map->read = __blk_rd_lblksz;
59
60     map = twifs_mapping(dev_root, bdev, "name");
61     map->read = __blk_rd_name;
62
63     map = twifs_mapping(dev_root, bdev, "begin");
64     map->read = __blk_rd_start_lba;
65
66     map = twifs_mapping(dev_root, bdev, "end");
67     map->read = __blk_rd_end_lba;
68 }
69
70 void
71 blk_set_blkmapping(struct block_dev* bdev, void* fsnode)
72 {
73     struct twifs_node* dev_root = (struct twifs_node*)fsnode;
74
75     __map_internal(bdev, dev_root);
76
77     struct block_dev *pos, *n;
78     llist_for_each(pos, n, &bdev->parts, parts)
79     {
80         struct twifs_node* part_node = twifs_dir_node(dev_root, pos->bdev_id);
81         __map_internal(pos, part_node);
82     }
83 }