1 | /////////////////////////////////////////////////////////////////////////////////// |
---|
2 | // File : bdv_driver.h |
---|
3 | // Date : 01/11/2013 |
---|
4 | // Author : alain greiner |
---|
5 | // Maintainer: cesar fuguet |
---|
6 | // Copyright (c) UPMC-LIP6 |
---|
7 | /////////////////////////////////////////////////////////////////////////////////// |
---|
8 | // The bdv_driver.c and bdv_driver.h files are part ot the GIET-VM kernel. |
---|
9 | // This driver supports the SocLib vci_block_device component, that is |
---|
10 | // a single channel, block oriented, external storage contrÃŽler. |
---|
11 | // |
---|
12 | // The _bdv_access() function supports both read and write access to block device, |
---|
13 | // and implement two operating modes: |
---|
14 | // |
---|
15 | // - in "synchronous" mode, it uses a polling policy on the BDV STATUS |
---|
16 | // register to detect transfer completion, as interrupts are not activated. |
---|
17 | // This mode is used by the boot code to load the map.bin file into memory |
---|
18 | // (before MMU activation), or to load the .elf files (after MMU activation). |
---|
19 | // - In "descheduling" mode, ir uses a descheduling + IRQ policy. |
---|
20 | // The ISR executed when transfer completes should restart the calling task, |
---|
21 | // as the calling task global index has been saved in the _bdv_gtid variable. |
---|
22 | // |
---|
23 | // As the BDV component can be used by several programs running in parallel, |
---|
24 | // the _bdv_lock variable guaranties exclusive access to the device. |
---|
25 | // |
---|
26 | // The SEG_IOC_BASE address must be defined in the hard_config.h file. |
---|
27 | /////////////////////////////////////////////////////////////////////////////////// |
---|
28 | |
---|
29 | #ifndef _GIET_BDV_DRIVER_H_ |
---|
30 | #define _GIET_BDV_DRIVER_H_ |
---|
31 | |
---|
32 | #include "kernel_locks.h" |
---|
33 | |
---|
34 | /////////////////////////////////////////////////////////////////////////////////// |
---|
35 | // BDV registers, operations and status values |
---|
36 | /////////////////////////////////////////////////////////////////////////////////// |
---|
37 | |
---|
38 | enum BDV_registers |
---|
39 | { |
---|
40 | BLOCK_DEVICE_BUFFER, |
---|
41 | BLOCK_DEVICE_LBA, |
---|
42 | BLOCK_DEVICE_COUNT, |
---|
43 | BLOCK_DEVICE_OP, |
---|
44 | BLOCK_DEVICE_STATUS, |
---|
45 | BLOCK_DEVICE_IRQ_ENABLE, |
---|
46 | BLOCK_DEVICE_SIZE, |
---|
47 | BLOCK_DEVICE_BLOCK_SIZE, |
---|
48 | BLOCK_DEVICE_BUFFER_EXT, |
---|
49 | }; |
---|
50 | |
---|
51 | enum BDV_operations |
---|
52 | { |
---|
53 | BLOCK_DEVICE_NOOP, |
---|
54 | BLOCK_DEVICE_READ, |
---|
55 | BLOCK_DEVICE_WRITE, |
---|
56 | }; |
---|
57 | |
---|
58 | enum BDV_status |
---|
59 | { |
---|
60 | BLOCK_DEVICE_IDLE, |
---|
61 | BLOCK_DEVICE_BUSY, |
---|
62 | BLOCK_DEVICE_READ_SUCCESS, |
---|
63 | BLOCK_DEVICE_WRITE_SUCCESS, |
---|
64 | BLOCK_DEVICE_READ_ERROR, |
---|
65 | BLOCK_DEVICE_WRITE_ERROR, |
---|
66 | BLOCK_DEVICE_ERROR, |
---|
67 | }; |
---|
68 | |
---|
69 | /////////////////////////////////////////////////////////////////////////////// |
---|
70 | // Global variables |
---|
71 | /////////////////////////////////////////////////////////////////////////////// |
---|
72 | |
---|
73 | extern spin_lock_t _bdv_lock; |
---|
74 | |
---|
75 | extern unsigned int _bdv_gtid; |
---|
76 | |
---|
77 | extern unsigned int _bdv_status; |
---|
78 | |
---|
79 | /////////////////////////////////////////////////////////////////////////////////// |
---|
80 | // Access functions |
---|
81 | /////////////////////////////////////////////////////////////////////////////////// |
---|
82 | |
---|
83 | /////////////////////////////////////////////////////////////////////////////////// |
---|
84 | // This function cheks block size == 512, and desactivates the interrupts. |
---|
85 | // Return 0 for success, > 0 if error |
---|
86 | /////////////////////////////////////////////////////////////////////////////////// |
---|
87 | extern unsigned int _bdv_init(); |
---|
88 | |
---|
89 | /////////////////////////////////////////////////////////////////////////////////// |
---|
90 | // Transfer data to/from the block device from/to a memory buffer. |
---|
91 | // - use_irq : descheduling + IRQ if non zero / polling if zero |
---|
92 | // - to_mem : from external storage to memory when non 0. |
---|
93 | // - lba : first block index on the block device |
---|
94 | // - buffer : pbase address of the memory buffer (must be word aligned) |
---|
95 | // - count : number of blocks to be transfered. |
---|
96 | // Returns 0 if success, > 0 if error. |
---|
97 | /////////////////////////////////////////////////////////////////////////////////// |
---|
98 | extern unsigned int _bdv_access( unsigned int use_irq, |
---|
99 | unsigned int to_mem, |
---|
100 | unsigned int lba, |
---|
101 | unsigned long long buffer, |
---|
102 | unsigned int count ); |
---|
103 | |
---|
104 | /////////////////////////////////////////////////////////////////////////////////// |
---|
105 | // This ISR save the status, acknowledge the IRQ, and activates the task |
---|
106 | // waiting on IO transfer. It can be an HWI or a SWI. |
---|
107 | // |
---|
108 | // TODO the _set_task_slot access should be replaced by an atomic LL/SC |
---|
109 | // when the CTX_RUN bool will be replaced by a bit_vector. |
---|
110 | /////////////////////////////////////////////////////////////////////////////////// |
---|
111 | extern void _bdv_isr( unsigned irq_type, |
---|
112 | unsigned irq_id, |
---|
113 | unsigned channel ); |
---|
114 | |
---|
115 | |
---|
116 | #endif |
---|
117 | |
---|
118 | // Local Variables: |
---|
119 | // tab-width: 4 |
---|
120 | // c-basic-offset: 4 |
---|
121 | // c-file-offsets:((innamespace . 0)(inline-open . 0)) |
---|
122 | // indent-tabs-mode: nil |
---|
123 | // End: |
---|
124 | // vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4 |
---|
125 | |
---|