Commit | Line | Data |
---|---|---|
2600990e | 1 | /* |
5792bf64 SH |
2 | * This file is subject to the terms and conditions of the GNU General Public |
3 | * License. See the file "COPYING" in the main directory of this archive | |
4 | * for more details. | |
2600990e | 5 | * |
2600990e | 6 | * Copyright (C) 2005 MIPS Technologies, Inc. All rights reserved. |
1a2a6d7e | 7 | * Copyright (C) 2013 Imagination Technologies Ltd. |
2600990e | 8 | */ |
2600990e RB |
9 | #ifndef _ASM_VPE_H |
10 | #define _ASM_VPE_H | |
11 | ||
1a2a6d7e DCZ |
12 | #include <linux/init.h> |
13 | #include <linux/list.h> | |
14 | #include <linux/smp.h> | |
15 | #include <linux/spinlock.h> | |
16 | ||
17 | #define VPE_MODULE_NAME "vpe" | |
18 | #define VPE_MODULE_MINOR 1 | |
19 | ||
20 | /* grab the likely amount of memory we will need. */ | |
21 | #ifdef CONFIG_MIPS_VPE_LOADER_TOM | |
22 | #define P_SIZE (2 * 1024 * 1024) | |
23 | #else | |
24 | /* add an overhead to the max kmalloc size for non-striped symbols/etc */ | |
25 | #define P_SIZE (256 * 1024) | |
26 | #endif | |
27 | ||
28 | #define MAX_VPES 16 | |
29 | #define VPE_PATH_MAX 256 | |
30 | ||
31 | static inline int aprp_cpu_index(void) | |
32 | { | |
33 | #ifdef CONFIG_MIPS_CMP | |
34 | return setup_max_cpus; | |
35 | #else | |
36 | extern int tclimit; | |
37 | return tclimit; | |
38 | #endif | |
39 | } | |
40 | ||
41 | enum vpe_state { | |
42 | VPE_STATE_UNUSED = 0, | |
43 | VPE_STATE_INUSE, | |
44 | VPE_STATE_RUNNING | |
45 | }; | |
46 | ||
47 | enum tc_state { | |
48 | TC_STATE_UNUSED = 0, | |
49 | TC_STATE_INUSE, | |
50 | TC_STATE_RUNNING, | |
51 | TC_STATE_DYNAMIC | |
52 | }; | |
53 | ||
54 | struct vpe { | |
55 | enum vpe_state state; | |
56 | ||
57 | /* (device) minor associated with this vpe */ | |
58 | int minor; | |
59 | ||
60 | /* elfloader stuff */ | |
61 | void *load_addr; | |
62 | unsigned long len; | |
63 | char *pbuffer; | |
64 | unsigned long plen; | |
1a2a6d7e DCZ |
65 | char cwd[VPE_PATH_MAX]; |
66 | ||
67 | unsigned long __start; | |
68 | ||
69 | /* tc's associated with this vpe */ | |
70 | struct list_head tc; | |
71 | ||
72 | /* The list of vpe's */ | |
73 | struct list_head list; | |
74 | ||
75 | /* shared symbol address */ | |
76 | void *shared_ptr; | |
77 | ||
78 | /* the list of who wants to know when something major happens */ | |
79 | struct list_head notify; | |
80 | ||
81 | unsigned int ntcs; | |
82 | }; | |
83 | ||
84 | struct tc { | |
85 | enum tc_state state; | |
86 | int index; | |
87 | ||
88 | struct vpe *pvpe; /* parent VPE */ | |
89 | struct list_head tc; /* The list of TC's with this VPE */ | |
90 | struct list_head list; /* The global list of tc's */ | |
91 | }; | |
92 | ||
2600990e RB |
93 | struct vpe_notifications { |
94 | void (*start)(int vpe); | |
95 | void (*stop)(int vpe); | |
96 | ||
97 | struct list_head list; | |
98 | }; | |
99 | ||
1a2a6d7e DCZ |
100 | struct vpe_control { |
101 | spinlock_t vpe_list_lock; | |
102 | struct list_head vpe_list; /* Virtual processing elements */ | |
103 | spinlock_t tc_list_lock; | |
104 | struct list_head tc_list; /* Thread contexts */ | |
105 | }; | |
106 | ||
107 | extern unsigned long physical_memsize; | |
108 | extern struct vpe_control vpecontrol; | |
109 | extern const struct file_operations vpe_fops; | |
110 | ||
111 | int vpe_notify(int index, struct vpe_notifications *notify); | |
112 | ||
113 | void *vpe_get_shared(int index); | |
1a2a6d7e DCZ |
114 | char *vpe_getcwd(int index); |
115 | ||
116 | struct vpe *get_vpe(int minor); | |
117 | struct tc *get_tc(int index); | |
118 | struct vpe *alloc_vpe(int minor); | |
119 | struct tc *alloc_tc(int index); | |
120 | void release_vpe(struct vpe *v); | |
2600990e | 121 | |
1a2a6d7e DCZ |
122 | void *alloc_progmem(unsigned long len); |
123 | void release_progmem(void *ptr); | |
2600990e | 124 | |
c60f9944 | 125 | int vpe_run(struct vpe *v); |
1a2a6d7e | 126 | void cleanup_tc(struct tc *tc); |
2600990e | 127 | |
1a2a6d7e DCZ |
128 | int __init vpe_module_init(void); |
129 | void __exit vpe_module_exit(void); | |
2600990e | 130 | #endif /* _ASM_VPE_H */ |