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

Last change on this file since 315 was 295, checked in by alain, 11 years ago

Introducing a major release, to suppoort the tsar_generic_leti platform
and the various (external or internal) peripherals configurations.
The map.xml format has been modified, in order to support the new
vci_iopic componentand a new policy for peripherals initialisation.
The IRQs are nom described in the XICU and IOPIC components
(and not anymore in the processors).
To enforce this major change, the map.xml file signature changed:
The signature value must be: 0xDACE2014

This new release has been tested on the tsar_generic_leti platform
for the following mappings:

  • 4c_4p_sort_leti
  • 4c_4p_sort_leti_ext
  • 4c_4p_transpose_leti
  • 4c_4p_transpose_leti_ext
  • 4c_1p_four_leti_ext
File size: 3.9 KB
RevLine 
[258]1///////////////////////////////////////////////////////////////////////////////////
2// File     : mwr_driver.c
3// Date     : 23/05/2013
4// Author   : alain greiner
5// Copyright (c) UPMC-LIP6
6///////////////////////////////////////////////////////////////////////////////////
7// The mwmr_driver.c and mwmr_driver.h files are part ot the GIET-VM nano-kernel.
8// This driver supports the SoClib vci_mwmr_controller component.
9//
10// This peripheral can be replicated (at most one component per cluster).
11///////////////////////////////////////////////////////////////////////////////////
12// The (virtual) base address of the associated segment is:
13//
[263]14//       seg_mwr_base + cluster_xy * vseg_cluster_increment
[258]15//
16// The seg_mwr_base and vseg_cluster_increment values must be defined
17// in the giet_vsegs.ld file.
18////////////////////////////////////////////////////////////////////////////////
19
20#include <giet_config.h>
21#include <mwr_driver.h>
22#include <utils.h>
23
[263]24#if !defined(X_SIZE)
25# error: You must define X_SIZE in the hard_config.h file
[258]26#endif
27
[263]28#if !defined(Y_SIZE)
29# error: You must define X_SIZE in the hard_config.h file
[258]30#endif
31
[263]32#if !defined(X_WIDTH)
33# error: You must define X_WIDTH in the hard_config.h file
34#endif
35
36#if !defined(Y_WIDTH)
37# error: You must define X_WIDTH in the hard_config.h file
38#endif
39
[258]40//////////////////////////////////////////////////////////////////////////////////
[263]41//    _mwr_hw_init()
[258]42// This function initializes one MWMR controller channel (i.e. one coprocessor
43// port) in a given cluster.
[263]44// - cluster_xy    : cluster index
[258]45// _ port_id       : port index
46// - way           : direction (to_coproc/from_coproc)
47// - channel_pbase : physical base address of the MWMR channel
48// TODO : The MWMR controler should be modified to support 40 bits addresses...
49//        Introduce a MWMR_CONFIG_PADDR_EXT register in the MWMR coprocessor
50//////////////////////////////////////////////////////////////////////////////////
51// Returns 0 if success, returns > 0 if error.
52//////////////////////////////////////////////////////////////////////////////////
[263]53unsigned int _mwr_hw_init( unsigned int           cluster_xy, 
54                           unsigned int           port_id, 
55                           unsigned int           from_coproc,
56                           paddr_t                channel_pbase ) 
[258]57{
[295]58    _printf(" [GIET_ERROR] _mwr_hw_init() function not supported yet\n");
[258]59    _exit();
60
61/*
62    // parameters checking
[263]63    unsigned int x = cluster_xy >> Y_WIDTH;
64    unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1);
65    if (x >= X_SIZE)                    return 1;
66    if (y >= Y_SIZE)                    return 1;
[258]67
[263]68    // compute base address
69    unsigned int* mwr_address = (unsigned int*) ((unsigned int)&seg_mwr_base +
70                                 (cluster_xy * (unsigned int)&vseg_cluster_increment));
[258]71
72    unsigned int lsb = (unsigned int)channel_pbase;
73    unsigned int msb = (unsigned int)(channel_pbase>>32);
74
75    // get depth and width from channel itself
76    unsigned int depth = _physical_read( channel_pbase + 16 );
77    unsigned int width = _physical_read( channel_pbase + 20 );
78
79    // initializes and launches mwmr controler
[263]80    mwr_address[port_id * MWMR_SPAN + MWMR_CONFIG_FIFO_WAY]  = from_coproc;
81    mwr_address[port_id * MWMR_SPAN + MWMR_CONFIG_FIFO_NO]   = port_id;
82    mwr_address[port_id * MWMR_SPAN + MWMR_CONFIG_WIDTH]     = width;
83    mwr_address[port_id * MWMR_SPAN + MWMR_CONFIG_DEPTH]     = depth;
84    mwr_address[port_id * MWMR_SPAN + MWMR_CONFIG_STATUS]    = lsb;
85    mwr_address[port_id * MWMR_SPAN + MWMR_CONFIG_DATA]      = lsb + 24;
86    mwr_address[port_id * MWMR_SPAN + MWMR_CONFIG_EXT]       = msb;
87    mwr_address[port_id * MWMR_SPAN + MWMR_CONFIG_RUNNING]   = 1;
[258]88*/
89    return 0;
90}
91
92
93// Local Variables:
94// tab-width: 4
95// c-basic-offset: 4
96// c-file-offsets:((innamespace . 0)(inline-open . 0))
97// indent-tabs-mode: nil
98// End:
99// vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
100
Note: See TracBrowser for help on using the repository browser.