source: soft/giet_vm/giet_drivers/mwr_driver.c @ 544

Last change on this file since 544 was 529, checked in by alain, 9 years ago

1) Removing the IOC driver (integrated in the FAT library).
2) Simplifying the BDV, HBA, SDC, RDK drivers: they support
only two modes (synchronous => polling / descheduling => IRQ),
and only one access function (for both read/write).

File size: 5.1 KB
Line 
1///////////////////////////////////////////////////////////////////////////////////
2// File     : mwr_driver.c
3// Date     : 27/02/2015
4// Author   : alain greiner
5// Copyright (c) UPMC-LIP6
6///////////////////////////////////////////////////////////////////////////////////
7
8#include <giet_config.h>
9#include <hard_config.h>
10#include <mapping_info.h>
11#include <mwr_driver.h>
12#include <utils.h>
13#include <kernel_locks.h>
14#include <tty0.h>
15#include <io.h>
16
17#if !defined(X_SIZE)
18# error: You must define X_SIZE in the hard_config.h file
19#endif
20
21#if !defined(Y_SIZE)
22# error: You must define X_SIZE in the hard_config.h file
23#endif
24
25#if !defined(X_WIDTH)
26# error: You must define X_WIDTH in the hard_config.h file
27#endif
28
29#if !defined(Y_WIDTH)
30# error: You must define X_WIDTH in the hard_config.h file
31#endif
32
33#if !defined(SEG_MWR_BASE)
34# error: You must define SEG_MWR_BASE in the hard_config.h file
35#endif
36
37#if !defined(PERI_CLUSTER_INCREMENT)
38# error: You must define PERI_CLUSTER_INCREMENT in the hard_config.h file
39#endif
40
41
42/////////////////////////////////////////////////////////////////////////////
43//      Global variables
44/////////////////////////////////////////////////////////////////////////////
45
46__attribute__((section(".kdata")))
47simple_lock_t  _coproc_lock[X_SIZE*Y_SIZE];
48
49__attribute__((section(".kdata")))
50unsigned int   _coproc_done[X_SIZE*Y_SIZE];
51
52/////////////////////////////////////////////////////////////////////////////
53// This function returns the value contained in a private register
54// of the coprocessor contained in cluster "cluster_xy".
55/////////////////////////////////////////////////////////////////////////////
56unsigned int _mwr_get_coproc_register( unsigned int cluster_xy, // cluster
57                                       unsigned int index )     // register
58{
59    unsigned int vaddr =
60        SEG_MWR_BASE + 
61        (cluster_xy * PERI_CLUSTER_INCREMENT) + 
62        (index << 2);
63
64    return ioread32( (void*)vaddr );
65}
66
67/////////////////////////////////////////////////////////////////////////////
68// This function sets a new value in a private register
69// of the coprocessor contained in cluster "clustenr_xy".
70/////////////////////////////////////////////////////////////////////////////
71void _mwr_set_coproc_register( unsigned int cluster_xy,   // cluster index
72                               unsigned int index,        // register index
73                               unsigned int value )       // writte value
74{
75    unsigned int vaddr =
76        SEG_MWR_BASE + 
77        (cluster_xy * PERI_CLUSTER_INCREMENT) +
78        (index << 2);
79       
80    iowrite32( (void*)vaddr, value );
81}
82
83/////////////////////////////////////////////////////////////////////////////
84// This function returns the value contained in a channel register
85// defined by the "index" and "channel" arguments, in the MWMR_DMA component
86// contained in cluster "cluster_xy".
87/////////////////////////////////////////////////////////////////////////////
88unsigned int _mwr_get_channel_register( unsigned int cluster_xy, // cluster
89                                        unsigned int channel,    // channel
90                                        unsigned int index )     // register
91{
92    unsigned int vaddr =
93        SEG_MWR_BASE + 
94        (cluster_xy * PERI_CLUSTER_INCREMENT) + 
95        ((channel + 1) * (CHANNEL_SPAN << 2)) +
96        (index << 2);
97
98    return ioread32( (void*)vaddr );
99}
100
101/////////////////////////////////////////////////////////////////////////////
102// This function sets a new value in a channel register
103// defined by the "index" and "channel") arguments, in the MWMR_DMA component
104// contained in cluster "cluster_xy".
105/////////////////////////////////////////////////////////////////////////////
106void _mwr_set_channel_register( unsigned int cluster_xy,  // cluster index
107                                unsigned int channel,     // channel index
108                                unsigned int index,       // register index
109                                unsigned int value )      // written value
110{
111    unsigned int vaddr =
112        SEG_MWR_BASE + 
113        (cluster_xy * PERI_CLUSTER_INCREMENT) +
114        ((channel + 1) * (CHANNEL_SPAN << 2)) +
115        (index << 2);
116       
117    iowrite32( (void*)vaddr, value );
118}
119
120///////////////////////////////////////////////////////
121void _mwr_isr( unsigned int irq_type,  // should be HWI
122               unsigned int irq_id,    // index returned by XCU
123               unsigned int channel )  // MWMR_DMA channel
124{
125    unsigned int gpid       = _get_procid();
126    unsigned int cluster_xy = gpid >> P_WIDTH;
127    unsigned int x          = cluster_xy >> Y_WIDTH;
128    unsigned int y          = cluster_xy & ((1<<Y_WIDTH)-1);
129
130    // acknowledge IRQ
131    _mwr_set_channel_register( cluster_xy, channel, CHANNEL_RUNNING, 0 );
132
133    // compute coproc_id from cluster coordinates
134    unsigned int coproc_id = x * Y_SIZE + y;
135
136    // set synchronisation variable
137    _coproc_done[coproc_id] = 1;
138}
139
140
141
142// Local Variables:
143// tab-width: 4
144// c-basic-offset: 4
145// c-file-offsets:((innamespace . 0)(inline-open . 0))
146// indent-tabs-mode: nil
147// End:
148// vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
149
Note: See TracBrowser for help on using the repository browser.