Changeset 518 for soft/giet_vm/giet_drivers/mwr_driver.c
- Timestamp:
- Mar 10, 2015, 2:58:59 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
soft/giet_vm/giet_drivers/mwr_driver.c
r456 r518 1 1 /////////////////////////////////////////////////////////////////////////////////// 2 2 // File : mwr_driver.c 3 // Date : 2 3/05/20133 // Date : 27/02/2015 4 4 // Author : alain greiner 5 5 // Copyright (c) UPMC-LIP6 6 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 // SEG_MWR_BASE + cluster_xy * PERI_CLUSTER_INCREMENT14 //15 // SEG_MWR_BASE and PERI_CLUSTER_INCREMENT must be defined in hard_config.h16 ////////////////////////////////////////////////////////////////////////////////17 7 18 8 #include <giet_config.h> 19 9 #include <hard_config.h> 10 #include <mapping_info.h> 20 11 #include <mwr_driver.h> 21 12 #include <utils.h> 22 13 #include <tty0.h> 14 #include <io.h> 23 15 24 16 #if !defined(X_SIZE) … … 46 38 #endif 47 39 48 ////////////////////////////////////////////////////////////////////////////////// 49 // _mwr_hw_init() 50 // This function initializes one MWMR controller channel (i.e. one coprocessor 51 // port) in a given cluster. 52 // - cluster_xy : cluster index 53 // _ port_id : port index 54 // - way : direction (to_coproc/from_coproc) 55 // - channel_pbase : physical base address of the MWMR channel 56 // TODO : The MWMR controler should be modified to support 40 bits addresses... 57 // Introduce a MWMR_CONFIG_PADDR_EXT register in the MWMR coprocessor 58 ////////////////////////////////////////////////////////////////////////////////// 59 // Returns 0 if success, returns > 0 if error. 60 ////////////////////////////////////////////////////////////////////////////////// 61 unsigned int _mwr_hw_init( unsigned int cluster_xy, 62 unsigned int port_id, 63 unsigned int from_coproc, 64 paddr_t channel_pbase ) 40 extern unsigned int _coproc_done[X_SIZE*Y_SIZE]; 41 42 ///////////////////////////////////////////////////////////////////////////// 43 // This function returns the value contained in a private register 44 // of the coprocessor contained in cluster "cluster_xy". 45 ///////////////////////////////////////////////////////////////////////////// 46 unsigned int _mwr_get_coproc_register( unsigned int cluster_xy, // cluster 47 unsigned int index ) // register 65 48 { 66 _puts(" [GIET_ERROR] _mwr_hw_init() function not supported yet\n"); 67 _exit(); 49 unsigned int vaddr = 50 SEG_MWR_BASE + 51 (cluster_xy * PERI_CLUSTER_INCREMENT) + 52 (index << 2); 68 53 69 /* 70 // parameters checking 71 unsigned int x = cluster_xy >> Y_WIDTH; 72 unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1); 73 if (x >= X_SIZE) return 1; 74 if (y >= Y_SIZE) return 1; 54 return ioread32( (void*)vaddr ); 55 } 75 56 76 // compute base address 77 unsigned int* mwr_address = (unsigned int*) ( SEG_MWR_BASE + 78 (cluster_xy * PERI_CLUSTER_INCREMENT) ); 57 ///////////////////////////////////////////////////////////////////////////// 58 // This function sets a new value in a private register 59 // of the coprocessor contained in cluster "clustenr_xy". 60 ///////////////////////////////////////////////////////////////////////////// 61 void _mwr_set_coproc_register( unsigned int cluster_xy, // cluster index 62 unsigned int index, // register index 63 unsigned int value ) // writte value 64 { 65 unsigned int vaddr = 66 SEG_MWR_BASE + 67 (cluster_xy * PERI_CLUSTER_INCREMENT) + 68 (index << 2); 69 70 iowrite32( (void*)vaddr, value ); 71 } 79 72 80 unsigned int lsb = (unsigned int)channel_pbase; 81 unsigned int msb = (unsigned int)(channel_pbase>>32); 73 ///////////////////////////////////////////////////////////////////////////// 74 // This function returns the value contained in a channel register 75 // defined by the "index" and "channel" arguments, in the MWMR_DMA component 76 // contained in cluster "cluster_xy". 77 ///////////////////////////////////////////////////////////////////////////// 78 unsigned int _mwr_get_channel_register( unsigned int cluster_xy, // cluster 79 unsigned int channel, // channel 80 unsigned int index ) // register 81 { 82 unsigned int vaddr = 83 SEG_MWR_BASE + 84 (cluster_xy * PERI_CLUSTER_INCREMENT) + 85 ((channel + 1) * (CHANNEL_SPAN << 2)) + 86 (index << 2); 82 87 83 // get depth and width from channel itself 84 unsigned int depth = _physical_read( channel_pbase + 16 ); 85 unsigned int width = _physical_read( channel_pbase + 20 ); 88 return ioread32( (void*)vaddr ); 89 } 86 90 87 // initializes and launches mwmr controler 88 mwr_address[port_id * MWMR_SPAN + MWMR_CONFIG_FIFO_WAY] = from_coproc; 89 mwr_address[port_id * MWMR_SPAN + MWMR_CONFIG_FIFO_NO] = port_id; 90 mwr_address[port_id * MWMR_SPAN + MWMR_CONFIG_WIDTH] = width; 91 mwr_address[port_id * MWMR_SPAN + MWMR_CONFIG_DEPTH] = depth; 92 mwr_address[port_id * MWMR_SPAN + MWMR_CONFIG_STATUS] = lsb; 93 mwr_address[port_id * MWMR_SPAN + MWMR_CONFIG_DATA] = lsb + 24; 94 mwr_address[port_id * MWMR_SPAN + MWMR_CONFIG_EXT] = msb; 95 mwr_address[port_id * MWMR_SPAN + MWMR_CONFIG_RUNNING] = 1; 96 */ 97 return 0; 91 ///////////////////////////////////////////////////////////////////////////// 92 // This function sets a new value in a channel register 93 // defined by the "index" and "channel") arguments, in the MWMR_DMA component 94 // contained in cluster "cluster_xy". 95 ///////////////////////////////////////////////////////////////////////////// 96 void _mwr_set_channel_register( unsigned int cluster_xy, // cluster index 97 unsigned int channel, // channel index 98 unsigned int index, // register index 99 unsigned int value ) // written value 100 { 101 unsigned int vaddr = 102 SEG_MWR_BASE + 103 (cluster_xy * PERI_CLUSTER_INCREMENT) + 104 ((channel + 1) * (CHANNEL_SPAN << 2)) + 105 (index << 2); 106 107 iowrite32( (void*)vaddr, value ); 98 108 } 109 110 /////////////////////////////////////////////////////// 111 void _mwr_isr( unsigned int irq_type, // should be HWI 112 unsigned int irq_id, // index returned by XCU 113 unsigned int channel ) // MWMR_DMA channel 114 { 115 unsigned int gpid = _get_procid(); 116 unsigned int cluster_xy = gpid >> P_WIDTH; 117 unsigned int x = cluster_xy >> Y_WIDTH; 118 unsigned int y = cluster_xy & ((1<<Y_WIDTH)-1); 119 120 // acknowledge IRQ 121 _mwr_set_channel_register( cluster_xy, channel, CHANNEL_RUNNING, 0 ); 122 123 // compute coproc_id from cluster coordinates 124 unsigned int coproc_id = x * Y_SIZE + y; 125 126 // set synchronisation variable 127 _coproc_done[coproc_id] = 1; 128 } 129 99 130 100 131
Note: See TracChangeset
for help on using the changeset viewer.