Lines Matching +full:mode +full:- +full:loader

1 // SPDX-License-Identifier: GPL-2.0
14 /* interrupt-level stop callback function. */
17 struct spu_context *ctx = spu->ctx; in spufs_stop_callback()
30 ctx->csa.class_0_pending = spu->class_0_pending; in spufs_stop_callback()
31 ctx->csa.class_0_dar = spu->class_0_dar; in spufs_stop_callback()
34 ctx->csa.class_1_dsisr = spu->class_1_dsisr; in spufs_stop_callback()
35 ctx->csa.class_1_dar = spu->class_1_dar; in spufs_stop_callback()
45 wake_up_all(&ctx->stop_wq); in spufs_stop_callback()
58 *stat = ctx->ops->status_read(ctx); in spu_stopped()
62 * re-read the register to get the stopped value. in spu_stopped()
69 if (test_bit(SPU_SCHED_NOTIFY_ACTIVE, &ctx->sched_flags)) in spu_stopped()
72 dsisr = ctx->csa.class_1_dsisr; in spu_stopped()
76 if (ctx->csa.class_0_pending) in spu_stopped()
92 ret = -ENODEV; in spu_setup_isolated()
104 mfc_cntl = &ctx->spu->priv2->mfc_control_RW; in spu_setup_isolated()
107 * enter kernel mode */ in spu_setup_isolated()
115 ret = -EIO; in spu_setup_isolated()
124 /* put the SPE in kernel mode to allow access to the loader */ in spu_setup_isolated()
125 sr1 = spu_mfc_sr1_get(ctx->spu); in spu_setup_isolated()
127 spu_mfc_sr1_set(ctx->spu, sr1); in spu_setup_isolated()
129 /* start the loader */ in spu_setup_isolated()
130 ctx->ops->signal1_write(ctx, (unsigned long)isolated_loader >> 32); in spu_setup_isolated()
131 ctx->ops->signal2_write(ctx, in spu_setup_isolated()
134 ctx->ops->runcntl_write(ctx, in spu_setup_isolated()
139 while (((status = ctx->ops->status_read(ctx)) & status_loading) == in spu_setup_isolated()
142 printk(KERN_ERR "%s: timeout waiting for loader\n", in spu_setup_isolated()
144 ret = -EIO; in spu_setup_isolated()
151 /* If isolated LOAD has failed: run SPU, we will get a stop-and in spu_setup_isolated()
154 ctx->ops->runcntl_write(ctx, SPU_RUNCNTL_RUNNABLE); in spu_setup_isolated()
155 ret = -EACCES; in spu_setup_isolated()
161 pr_debug("%s: SPU fell out of isolated mode?\n", __func__); in spu_setup_isolated()
162 ctx->ops->runcntl_write(ctx, SPU_RUNCNTL_STOP); in spu_setup_isolated()
163 ret = -EINVAL; in spu_setup_isolated()
168 /* Finished accessing the loader. Drop kernel mode */ in spu_setup_isolated()
170 spu_mfc_sr1_set(ctx->spu, sr1); in spu_setup_isolated()
187 if (ctx->flags & SPU_CREATE_NOSCHED) { in spu_run_init()
188 if (ctx->state == SPU_STATE_SAVED) { in spu_run_init()
198 if (ctx->flags & SPU_CREATE_ISOLATE) { in spu_run_init()
199 if (!(ctx->ops->status_read(ctx) & SPU_STATUS_ISOLATED_STATE)) { in spu_run_init()
207 * issue an isolated exit), we need to re-set it here in spu_run_init()
209 runcntl = ctx->ops->runcntl_read(ctx) & in spu_run_init()
221 ctx->ops->privcntl_write(ctx, privcntl); in spu_run_init()
222 ctx->ops->npc_write(ctx, *npc); in spu_run_init()
225 ctx->ops->runcntl_write(ctx, runcntl); in spu_run_init()
227 if (ctx->flags & SPU_CREATE_NOSCHED) { in spu_run_init()
231 if (ctx->state == SPU_STATE_SAVED) { in spu_run_init()
240 set_bit(SPU_SCHED_SPU_RUN, &ctx->sched_flags); in spu_run_init()
251 *status = ctx->ops->status_read(ctx); in spu_run_fini()
252 *npc = ctx->ops->npc_read(ctx); in spu_run_fini()
255 clear_bit(SPU_SCHED_SPU_RUN, &ctx->sched_flags); in spu_run_fini()
260 ret = -ERESTARTSYS; in spu_run_fini()
279 case -ERESTARTSYS: in spu_handle_restartsys()
280 case -ERESTARTNOINTR: in spu_handle_restartsys()
286 *npc -= 8; in spu_handle_restartsys()
287 ret = -ERESTARTSYS; in spu_handle_restartsys()
289 case -ERESTARTNOHAND: in spu_handle_restartsys()
290 case -ERESTART_RESTARTBLOCK: in spu_handle_restartsys()
292 * Restart block is too hard for now, just return -EINTR in spu_handle_restartsys()
295 * -EINTR from there. in spu_handle_restartsys()
298 *spu_ret = -EINTR; in spu_handle_restartsys()
299 ret = -ERESTARTSYS; in spu_handle_restartsys()
318 npc = ctx->ops->npc_read(ctx) & ~3; in spu_process_callback()
319 ls = (void __iomem *)ctx->ops->get_ls(ctx); in spu_process_callback()
321 if (ls_pointer > (LS_SIZE - sizeof(s))) in spu_process_callback()
322 return -EFAULT; in spu_process_callback()
327 spu_ret = -ENOSYS; in spu_process_callback()
334 if (spu_ret <= -ERESTARTSYS) { in spu_process_callback()
337 mutex_lock(&ctx->state_mutex); in spu_process_callback()
338 if (ret == -ERESTARTSYS) in spu_process_callback()
342 /* need to re-get the ls, as it may have changed when we released the in spu_process_callback()
344 ls = (void __iomem *)ctx->ops->get_ls(ctx); in spu_process_callback()
348 ctx->ops->npc_write(ctx, npc); in spu_process_callback()
349 ctx->ops->runcntl_write(ctx, SPU_RUNCNTL_RUNNABLE); in spu_process_callback()
358 if (mutex_lock_interruptible(&ctx->run_mutex)) in spufs_run_spu()
359 return -ERESTARTSYS; in spufs_run_spu()
361 ctx->event_return = 0; in spufs_run_spu()
378 ret = spufs_wait(ctx->stop_wq, spu_stopped(ctx, &status)); in spufs_run_spu()
385 mutex_lock(&ctx->state_mutex); in spufs_run_spu()
389 &ctx->sched_flags))) { in spufs_run_spu()
412 ret = -ERESTARTSYS; in spufs_run_spu()
423 ctx->stats.libassist++; in spufs_run_spu()
426 ((ret == -ERESTARTSYS) && in spufs_run_spu()
433 /* Note: we don't need to force_sig SIGTRAP on single-step in spufs_run_spu()
438 ret = -ERESTARTSYS; in spufs_run_spu()
443 ret = -ERESTARTSYS; in spufs_run_spu()
447 *event = ctx->event_return; in spufs_run_spu()
449 mutex_unlock(&ctx->run_mutex); in spufs_run_spu()