source: trunk/kernel/drivers/soclib/soclib_bdv.h @ 26

Last change on this file since 26 was 4, checked in by alain, 8 years ago

Introduce the chdev_t structure in place of device_t.

File size: 4.7 KB
RevLine 
[1]1/*
2 * soclib_bdv.h - SOCLIB_BDV (simple block device) driver definition.
3 *
4 * Author    Alain Greiner
5 *
6 * Copyright (c) UPMC Sorbonne Universites
7 *
8 * This file is part of ALMOS-MKH.
9 *
10 * ALMOS-MKH is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; version 2.0 of the License.
13 *
14 * ALMOS-MKH is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with ALMOS-MKH; if not, write to the Free Software Foundation,
21 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24#ifndef _SOCLIB_BDV_H_
25#define _SOCLIB_BDV_H_
26
[4]27#include <chdev.h>
[1]28#include <hal_types.h>
29
30/********************************************************************************************
31 * This driver supports the SocLib VciBlockDevice component, that is a simgle channel,
32 * block oriented, external storage controler, supporting only one I/O transaction,
33 * at a given time.
34 *******************************************************************************************/
35
36/********************************************************************************************
37 *       SOCLIB_BDV registers offset
38 *******************************************************************************************/
39
40enum SoclibBlockDeviceRegisters
41{
42    BDV_BUFFER_REG     = 0,
43    BDV_LBA_REG        = 1,
44    BDV_COUNT_REG      = 2,
45    BDV_OP_REG         = 3,
46    BDV_STATUS_REG         = 4,
47    BDV_IRQ_ENABLE_REG = 5,
48    BDV_SIZE_REG       = 6,
49    BDV_BLOCK_SIZE_REG = 7,
50    BDV_BUFFER_EXT_REG = 8,
51};
52
53/********************************************************************************************
54 *       SOCLIB_BDV status values
55 *******************************************************************************************/
56
57#define BDV_IDLE                0
58#define BDV_BUSY                1
59#define BDV_READ_SUCCESS        2
60#define BDV_WRITE_SUCCESS       3
61#define BDV_READ_ERROR      4
62#define BDV_WRITE_ERROR     5
63#define BDV_ERROR               6
64
65/********************************************************************************************
66 *        SOCLIB_BDV operations
67 *******************************************************************************************/
68
69#define BDV_OP_NOP          0
70#define BDV_OP_READ         1
71#define BDV_OP_WRITE        2
72
73/********************************************************************************************
74 * This function access the SOCLIB_BDV hardware registers to get the block size and the
75 * number of blocks, and initialises the "extension" field of the IOC device descriptor.
76 ********************************************************************************************
[4]77 * @ chdev     : local pointer on the generic IOC chdev descriptor.
[1]78 *******************************************************************************************/
[4]79extern void soclib_bdv_init( chdev_t * chdev );
[1]80
81/********************************************************************************************
82 * This function is called by the server thread associated to the IOC device.
83 * It decode the IOC device command embedded in the calling thread descriptor,
84 * (format defined in the dev_ioc.h file) and starts execution of this generic command,
85 * accessing the relevant SOCLIB_BDV hardware registers.
86 * Then it blocks on the THREAD_BLOCKED_DEV_ISR and deschedule, because the SOCLIB_BDV
87 * device cannot register several commands. It is re-activated by the ISR signaling the
88 * I/O operation completion.
89 ********************************************************************************************
90 * @ thread_xp  : extended pointer on the client thread.
91 *******************************************************************************************/
[4]92extern void soclib_bdv_cmd( xptr_t thread_xp );
[1]93
94/********************************************************************************************
95 * This Interrupt Service Routine is executed when the IRQ signaling the completion of
96 * an IOC command is received by a core. It acknowledge the IRQ by accessing the proper
97 * SOCLIB_BDV register, unblock the client thread, and unblock the server thread that
98 * can starts execution of a new command if the waiting queue is not emppty.
99 ********************************************************************************************
[4]100 * @ chdev     : local pointer on the generic IOC device descriptor.
[1]101 *******************************************************************************************/
[4]102extern void soclib_bdv_isr( chdev_t * chdev );
[1]103
104
105#endif /* _BLOCK_H_ */
Note: See TracBrowser for help on using the repository browser.