1 /*
2  * SPU file system
3  *
4  * (C) Copyright IBM Deutschland Entwicklung GmbH 2005
5  *
6  * Author: Arnd Bergmann <arndb@de.ibm.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2, or (at your option)
11  * any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21  */
22 #ifndef SPUFS_H
23 #define SPUFS_H
24 
25 #include <linux/kref.h>
26 #include <linux/mutex.h>
27 #include <linux/spinlock.h>
28 #include <linux/fs.h>
29 
30 #include <asm/spu.h>
31 #include <asm/spu_csa.h>
32 #include <asm/spu_info.h>
33 
34 /* The magic number for our file system */
35 enum {
36 	SPUFS_MAGIC = 0x23c9b64e,
37 };
38 
39 struct spu_context_ops;
40 struct spu_gang;
41 
42 /* ctx->sched_flags */
43 enum {
44 	SPU_SCHED_EXITING = 0,
45 };
46 
47 struct spu_context {
48 	struct spu *spu;		  /* pointer to a physical SPU */
49 	struct spu_state csa;		  /* SPU context save area. */
50 	spinlock_t mmio_lock;		  /* protects mmio access */
51 	struct address_space *local_store; /* local store mapping.  */
52 	struct address_space *mfc;	   /* 'mfc' area mappings. */
53 	struct address_space *cntl;	   /* 'control' area mappings. */
54 	struct address_space *signal1;	   /* 'signal1' area mappings. */
55 	struct address_space *signal2;	   /* 'signal2' area mappings. */
56 	struct address_space *mss;	   /* 'mss' area mappings. */
57 	struct address_space *psmap;	   /* 'psmap' area mappings. */
58 	struct mutex mapping_lock;
59 	u64 object_id;		   /* user space pointer for oprofile */
60 
61 	enum { SPU_STATE_RUNNABLE, SPU_STATE_SAVED } state;
62 	struct mutex state_mutex;
63 	struct mutex run_mutex;
64 
65 	struct mm_struct *owner;
66 
67 	struct kref kref;
68 	wait_queue_head_t ibox_wq;
69 	wait_queue_head_t wbox_wq;
70 	wait_queue_head_t stop_wq;
71 	wait_queue_head_t mfc_wq;
72 	struct fasync_struct *ibox_fasync;
73 	struct fasync_struct *wbox_fasync;
74 	struct fasync_struct *mfc_fasync;
75 	u32 tagwait;
76 	struct spu_context_ops *ops;
77 	struct work_struct reap_work;
78 	unsigned long flags;
79 	unsigned long event_return;
80 
81 	struct list_head gang_list;
82 	struct spu_gang *gang;
83 
84 	/* scheduler fields */
85  	struct list_head rq;
86 	struct delayed_work sched_work;
87 	unsigned long sched_flags;
88 	unsigned long rt_priority;
89 	int policy;
90 	int prio;
91 };
92 
93 struct spu_gang {
94 	struct list_head list;
95 	struct mutex mutex;
96 	struct kref kref;
97 	int contexts;
98 };
99 
100 struct mfc_dma_command {
101 	int32_t pad;	/* reserved */
102 	uint32_t lsa;	/* local storage address */
103 	uint64_t ea;	/* effective address */
104 	uint16_t size;	/* transfer size */
105 	uint16_t tag;	/* command tag */
106 	uint16_t class;	/* class ID */
107 	uint16_t cmd;	/* command opcode */
108 };
109 
110 
111 /* SPU context query/set operations. */
112 struct spu_context_ops {
113 	int (*mbox_read) (struct spu_context * ctx, u32 * data);
114 	 u32(*mbox_stat_read) (struct spu_context * ctx);
115 	unsigned int (*mbox_stat_poll)(struct spu_context *ctx,
116 					unsigned int events);
117 	int (*ibox_read) (struct spu_context * ctx, u32 * data);
118 	int (*wbox_write) (struct spu_context * ctx, u32 data);
119 	 u32(*signal1_read) (struct spu_context * ctx);
120 	void (*signal1_write) (struct spu_context * ctx, u32 data);
121 	 u32(*signal2_read) (struct spu_context * ctx);
122 	void (*signal2_write) (struct spu_context * ctx, u32 data);
123 	void (*signal1_type_set) (struct spu_context * ctx, u64 val);
124 	 u64(*signal1_type_get) (struct spu_context * ctx);
125 	void (*signal2_type_set) (struct spu_context * ctx, u64 val);
126 	 u64(*signal2_type_get) (struct spu_context * ctx);
127 	 u32(*npc_read) (struct spu_context * ctx);
128 	void (*npc_write) (struct spu_context * ctx, u32 data);
129 	 u32(*status_read) (struct spu_context * ctx);
130 	char*(*get_ls) (struct spu_context * ctx);
131 	 u32 (*runcntl_read) (struct spu_context * ctx);
132 	void (*runcntl_write) (struct spu_context * ctx, u32 data);
133 	void (*master_start) (struct spu_context * ctx);
134 	void (*master_stop) (struct spu_context * ctx);
135 	int (*set_mfc_query)(struct spu_context * ctx, u32 mask, u32 mode);
136 	u32 (*read_mfc_tagstatus)(struct spu_context * ctx);
137 	u32 (*get_mfc_free_elements)(struct spu_context *ctx);
138 	int (*send_mfc_command)(struct spu_context * ctx,
139 				struct mfc_dma_command * cmd);
140 	void (*dma_info_read) (struct spu_context * ctx,
141 			       struct spu_dma_info * info);
142 	void (*proxydma_info_read) (struct spu_context * ctx,
143 				    struct spu_proxydma_info * info);
144 	void (*restart_dma)(struct spu_context *ctx);
145 };
146 
147 extern struct spu_context_ops spu_hw_ops;
148 extern struct spu_context_ops spu_backing_ops;
149 
150 struct spufs_inode_info {
151 	struct spu_context *i_ctx;
152 	struct spu_gang *i_gang;
153 	struct inode vfs_inode;
154 	int i_openers;
155 };
156 #define SPUFS_I(inode) \
157 	container_of(inode, struct spufs_inode_info, vfs_inode)
158 
159 extern struct tree_descr spufs_dir_contents[];
160 extern struct tree_descr spufs_dir_nosched_contents[];
161 
162 /* system call implementation */
163 long spufs_run_spu(struct file *file,
164 		   struct spu_context *ctx, u32 *npc, u32 *status);
165 long spufs_create(struct nameidata *nd,
166 			 unsigned int flags, mode_t mode);
167 extern const struct file_operations spufs_context_fops;
168 
169 /* gang management */
170 struct spu_gang *alloc_spu_gang(void);
171 struct spu_gang *get_spu_gang(struct spu_gang *gang);
172 int put_spu_gang(struct spu_gang *gang);
173 void spu_gang_remove_ctx(struct spu_gang *gang, struct spu_context *ctx);
174 void spu_gang_add_ctx(struct spu_gang *gang, struct spu_context *ctx);
175 
176 /* fault handling */
177 int spufs_handle_class1(struct spu_context *ctx);
178 
179 /* context management */
180 static inline void spu_acquire(struct spu_context *ctx)
181 {
182 	mutex_lock(&ctx->state_mutex);
183 }
184 
185 static inline void spu_release(struct spu_context *ctx)
186 {
187 	mutex_unlock(&ctx->state_mutex);
188 }
189 
190 struct spu_context * alloc_spu_context(struct spu_gang *gang);
191 void destroy_spu_context(struct kref *kref);
192 struct spu_context * get_spu_context(struct spu_context *ctx);
193 int put_spu_context(struct spu_context *ctx);
194 void spu_unmap_mappings(struct spu_context *ctx);
195 
196 void spu_forget(struct spu_context *ctx);
197 int spu_acquire_runnable(struct spu_context *ctx, unsigned long flags);
198 void spu_acquire_saved(struct spu_context *ctx);
199 
200 int spu_activate(struct spu_context *ctx, unsigned long flags);
201 void spu_deactivate(struct spu_context *ctx);
202 void spu_yield(struct spu_context *ctx);
203 void spu_start_tick(struct spu_context *ctx);
204 void spu_stop_tick(struct spu_context *ctx);
205 void spu_sched_tick(struct work_struct *work);
206 int __init spu_sched_init(void);
207 void __exit spu_sched_exit(void);
208 
209 extern char *isolated_loader;
210 
211 /*
212  * spufs_wait
213  * 	Same as wait_event_interruptible(), except that here
214  *	we need to call spu_release(ctx) before sleeping, and
215  *	then spu_acquire(ctx) when awoken.
216  */
217 
218 #define spufs_wait(wq, condition)					\
219 ({									\
220 	int __ret = 0;							\
221 	DEFINE_WAIT(__wait);						\
222 	for (;;) {							\
223 		prepare_to_wait(&(wq), &__wait, TASK_INTERRUPTIBLE);	\
224 		if (condition)						\
225 			break;						\
226 		if (signal_pending(current)) {				\
227 			__ret = -ERESTARTSYS;				\
228 			break;						\
229 		}							\
230 		spu_release(ctx);					\
231 		schedule();						\
232 		spu_acquire(ctx);					\
233 	}								\
234 	finish_wait(&(wq), &__wait);					\
235 	__ret;								\
236 })
237 
238 size_t spu_wbox_write(struct spu_context *ctx, u32 data);
239 size_t spu_ibox_read(struct spu_context *ctx, u32 *data);
240 
241 /* irq callback funcs. */
242 void spufs_ibox_callback(struct spu *spu);
243 void spufs_wbox_callback(struct spu *spu);
244 void spufs_stop_callback(struct spu *spu);
245 void spufs_mfc_callback(struct spu *spu);
246 void spufs_dma_callback(struct spu *spu, int type);
247 
248 extern struct spu_coredump_calls spufs_coredump_calls;
249 struct spufs_coredump_reader {
250 	char *name;
251 	ssize_t (*read)(struct spu_context *ctx,
252 			char __user *buffer, size_t size, loff_t *pos);
253 	u64 (*get)(void *data);
254 	size_t size;
255 };
256 extern struct spufs_coredump_reader spufs_coredump_read[];
257 extern int spufs_coredump_num_notes;
258 
259 #endif
260