source: trunk/kernel/kern/core.h @ 9

Last change on this file since 9 was 5, checked in by alain, 8 years ago

Introduce the chdev_t structure in place of the device_t structure.

File size: 8.7 KB
Line 
1/*
2 * core.h - core descriptor and associated access functions définition
3 *
4 * Authors  Ghassan Almaless (2008,2009,2010,2011,2012)
5 *          Mohamed Lamine Karaoui (2015)
6 *          Alain Greiner (2016)
7 *
8 * Copyright (c) UPMC Sorbonne Universites
9 *
10 * This file is part of ALMOS-MKH.
11 *
12 * ALMOS-MKH is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; version 2.0 of the License.
15 *
16 * ALMOS-MKH is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19 * General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with ALMOS-MKH; if not, write to the Free Software Foundation,
23 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24 */
25
26#ifndef _CORE_H_
27#define _CORE_H_
28
29#include <almos_config.h>
30#include <hal_types.h>
31#include <list.h>
32#include <rpc.h>
33#include <scheduler.h>
34#include <sysfs.h>
35
36/****  Forward declarations  ****/
37
38struct thread_s;
39struct chdev_s;
40
41
42/****************************************************************************************
43 * This structure defines the core descriptor.
44 * It contains the three interrupt vectors, that are implemented as array of pointers
45 * on the source channel devices, for all IRQs allocated to a given core.
46 ***************************************************************************************/
47
48typedef struct core_s
49{
50        lid_t               lid;            /*! core local index in cluster                */
51        gid_t               gid;            /*! core global identifier (hardware index)    */   
52        uint64_t            cycles;         /*! total number of cycles (from hard reset)   */
53        uint32_t            time_stamp;     /*! previous time stamp (read from register)   */
54        uint32_t            ticks_nr;       /*! number of elapsed ticks                    */
55        uint32_t            ticks_period;   /*! number of cycles between two ticks         */
56        uint32_t            usage;          /*! cumulated busy_percent (idle / total)      */
57        uint32_t            spurious_irqs;  /*! for instrumentation...                     */
58        struct thread_s   * thread_rpc;     /*! pointer on current RPC thread descriptor   */
59        struct thread_s   * thread_idle;    /*! pointer on idle thread descriptor          */
60        struct thread_s   * fpu_owner;      /*! pointer on current FPU owner thread        */ 
61    uint32_t            rand_last;      /*! last computed random value                 */
62        uint32_t            rpc_threads;    /*! total number of RPC threads for this core  */
63        list_entry_t        rpc_free_list;  /*! root of the list of free RPC threads       */
64        rpc_fifo_t          rpc_fifo;       /*! embedded private RPC fifo (one per core)   */
65        scheduler_t         scheduler;      /*! embedded private scheduler                 */
66
67    struct chdev_s    * hwi_vector[CONFIG_MAX_HWIS_PER_ICU];     /*! on source device  */
68    struct chdev_s    * pti_vector[CONFIG_MAX_PTIS_PER_ICU];     /*! on source device  */
69    struct chdev_s    * wti_vector[CONFIG_MAX_WTIS_PER_ICU];     /*! on source device  */
70
71        sysfs_entry_t       node;
72} 
73core_t;
74
75/***************************************************************************************
76 * This macro returns a pointer on the calling core descriptor.
77 **************************************************************************************/
78
79#define CURRENT_CORE  (CURRENT_THREAD->core)
80
81/***************************************************************************************
82 * TODO this initialisation must be completed for the thread_idle field... [AG]
83 * This function initializes a core descriptor from information found in arch_info.
84 * It makes the association [gid] <=> [lid], as defined in arch_info, via the
85 * boot_info_t structure build by the bootloader in each cluster.
86 ***************************************************************************************
87 * @ core      : pointer on core descriptor to initialise.
88 * @ lid       : local core index
89 * @ gid       : global core identifier (hardware index)
90 **************************************************************************************/
91void core_init( core_t   * core, 
92                lid_t      lid, 
93                gid_t      gid );
94
95/***************************************************************************************
96 * This function returns a pseudo random number from the core descriptor
97 * private random generator.
98 ***************************************************************************************
99 * @ core       : pointer on core descriptor.
100 * @ returns the pseudo random value.
101 **************************************************************************************/
102inline uint32_t core_get_rand( core_t * core );
103
104/***************************************************************************************
105 * This function returns the current date (cycles) from both
106 * the hardware 32 bits cycles counter and the core descriptor cycles counter,
107 * taking into account the 32 bits hardware register overflow.
108 * The core descriptor time is updated.
109 ***************************************************************************************
110 * @ core       : pointer on core descriptor.
111 * @ returns the number of cycles.
112 **************************************************************************************/
113inline uint64_t core_get_cycles( core_t * core );
114
115/***************************************************************************************
116 * This function returns the current date (seconds & micro-seconds) from both
117 * the hardware 32 bits cycles counter and the core descriptor cycles counter,
118 * taking into account the 32 bits hardware register overflow.
119 * The core descriptor time is updated.
120 ***************************************************************************************
121 * @ core      : pointer on core descriptor.
122 * @ tm_s      : number of seconds.
123 * @ tm_us     : number of micro-seconds.
124 **************************************************************************************/
125void core_get_time( core_t   * core,
126                    uint32_t * tm_s,
127                    uint32_t * tm_us );
128
129/***************************************************************************************
130 * This function must be called at each TICK.
131 * It updates the  cycles and ticks counter in the calling core descriptor.
132 * It handles all pending alarms depending on the ticks counter value.
133 * It handles the scheduling, depending on the ticks counter value.
134 * It handles the global DQDT update, depending on the ticks counter vakue.
135 ***************************************************************************************
136 * @ core       : pointer on core descriptor.
137 **************************************************************************************/
138void core_clock( core_t * core );
139
140/***************************************************************************************
141 * This function updates the usage statistics for the calling core descriptor,
142 * based on the ratio between the idle_ticks and total_ticks.
143 ***************************************************************************************
144 * @ core       : pointer on core descriptor.
145 **************************************************************************************/
146void core_compute_stats( core_t * core );
147
148/***************************************************************************************
149 * This function and reset the usage statistics.
150 ***************************************************************************************
151 * @ core       : pointer on core descriptor.
152 **************************************************************************************/
153void core_reset_stats( core_t * core );
154
155/***************************************************************************************
156 * This function set/reset a selected entry in one interrupt vector for a remote core.
157 * The written value is an extended pointer on the "source" device (or the XPTR_NULL
158 * value in case of reset). As it uses remote access, this function can be called by
159 * any thread in any cluster.
160 ***************************************************************************************
161 * @ core       : local pointer on the core descriptor.
162 * @ irq_type   : type of IRQ (HWI/WTI/PTI).
163 * @ irq_id     : index in the IRQ vector.
164 * @ chdev      : local pointer on the "source" chdev descriptor.
165 **************************************************************************************/
166void core_set_irq_vector_entry( core_t          * core,
167                                uint32_t          irq_type,
168                                uint32_t          irq_id,
169                                struct chdev_s  * chdev );
170
171
172#endif  /* _CORE_H_ */
Note: See TracBrowser for help on using the repository browser.