| 
									
										
										
										
											2005-11-15 15:53:52 -05:00
										 |  |  | /* hw_ops.c - query/set operations on active SPU context.
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (C) IBM 2005 | 
					
						
							|  |  |  |  * Author: Mark Nutter <mnutter@us.ibm.com> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation; either version 2, or (at your option) | 
					
						
							|  |  |  |  * any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							|  |  |  |  * GNU General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |  * along with this program; if not, write to the Free Software | 
					
						
							|  |  |  |  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/errno.h>
 | 
					
						
							|  |  |  | #include <linux/sched.h>
 | 
					
						
							|  |  |  | #include <linux/kernel.h>
 | 
					
						
							|  |  |  | #include <linux/mm.h>
 | 
					
						
							| 
									
										
										
										
											2005-12-05 22:52:27 -05:00
										 |  |  | #include <linux/poll.h>
 | 
					
						
							| 
									
										
										
										
											2005-11-15 15:53:52 -05:00
										 |  |  | #include <linux/smp.h>
 | 
					
						
							|  |  |  | #include <linux/stddef.h>
 | 
					
						
							|  |  |  | #include <linux/unistd.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <asm/io.h>
 | 
					
						
							|  |  |  | #include <asm/spu.h>
 | 
					
						
							| 
									
										
										
										
											2006-06-19 20:33:29 +02:00
										 |  |  | #include <asm/spu_priv1.h>
 | 
					
						
							| 
									
										
										
										
											2005-11-15 15:53:52 -05:00
										 |  |  | #include <asm/spu_csa.h>
 | 
					
						
							|  |  |  | #include <asm/mmu_context.h>
 | 
					
						
							|  |  |  | #include "spufs.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int spu_hw_mbox_read(struct spu_context *ctx, u32 * data) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct spu *spu = ctx->spu; | 
					
						
							|  |  |  | 	struct spu_problem __iomem *prob = spu->problem; | 
					
						
							|  |  |  | 	u32 mbox_stat; | 
					
						
							|  |  |  | 	int ret = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	spin_lock_irq(&spu->register_lock); | 
					
						
							|  |  |  | 	mbox_stat = in_be32(&prob->mb_stat_R); | 
					
						
							|  |  |  | 	if (mbox_stat & 0x0000ff) { | 
					
						
							|  |  |  | 		*data = in_be32(&prob->pu_mb_R); | 
					
						
							|  |  |  | 		ret = 4; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	spin_unlock_irq(&spu->register_lock); | 
					
						
							|  |  |  | 	return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static u32 spu_hw_mbox_stat_read(struct spu_context *ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return in_be32(&ctx->spu->problem->mb_stat_R); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-05 22:52:27 -05:00
										 |  |  | static unsigned int spu_hw_mbox_stat_poll(struct spu_context *ctx, | 
					
						
							|  |  |  | 					  unsigned int events) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct spu *spu = ctx->spu; | 
					
						
							|  |  |  | 	int ret = 0; | 
					
						
							|  |  |  | 	u32 stat; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	spin_lock_irq(&spu->register_lock); | 
					
						
							|  |  |  | 	stat = in_be32(&spu->problem->mb_stat_R); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* if the requested event is there, return the poll
 | 
					
						
							|  |  |  | 	   mask, otherwise enable the interrupt to get notified, | 
					
						
							|  |  |  | 	   but first mark any pending interrupts as done so | 
					
						
							|  |  |  | 	   we don't get woken up unnecessarily */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (events & (POLLIN | POLLRDNORM)) { | 
					
						
							|  |  |  | 		if (stat & 0xff0000) | 
					
						
							|  |  |  | 			ret |= POLLIN | POLLRDNORM; | 
					
						
							|  |  |  | 		else { | 
					
						
							| 
									
										
										
										
											2007-12-20 16:39:59 +09:00
										 |  |  | 			spu_int_stat_clear(spu, 2, CLASS2_MAILBOX_INTR); | 
					
						
							|  |  |  | 			spu_int_mask_or(spu, 2, CLASS2_ENABLE_MAILBOX_INTR); | 
					
						
							| 
									
										
										
										
											2005-12-05 22:52:27 -05:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (events & (POLLOUT | POLLWRNORM)) { | 
					
						
							|  |  |  | 		if (stat & 0x00ff00) | 
					
						
							|  |  |  | 			ret = POLLOUT | POLLWRNORM; | 
					
						
							|  |  |  | 		else { | 
					
						
							| 
									
										
										
										
											2007-12-20 16:39:59 +09:00
										 |  |  | 			spu_int_stat_clear(spu, 2, | 
					
						
							|  |  |  | 					CLASS2_MAILBOX_THRESHOLD_INTR); | 
					
						
							|  |  |  | 			spu_int_mask_or(spu, 2, | 
					
						
							|  |  |  | 					CLASS2_ENABLE_MAILBOX_THRESHOLD_INTR); | 
					
						
							| 
									
										
										
										
											2005-12-05 22:52:27 -05:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	spin_unlock_irq(&spu->register_lock); | 
					
						
							|  |  |  | 	return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-15 15:53:52 -05:00
										 |  |  | static int spu_hw_ibox_read(struct spu_context *ctx, u32 * data) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct spu *spu = ctx->spu; | 
					
						
							|  |  |  | 	struct spu_problem __iomem *prob = spu->problem; | 
					
						
							|  |  |  | 	struct spu_priv2 __iomem *priv2 = spu->priv2; | 
					
						
							|  |  |  | 	int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	spin_lock_irq(&spu->register_lock); | 
					
						
							|  |  |  | 	if (in_be32(&prob->mb_stat_R) & 0xff0000) { | 
					
						
							|  |  |  | 		/* read the first available word */ | 
					
						
							|  |  |  | 		*data = in_be64(&priv2->puint_mb_R); | 
					
						
							|  |  |  | 		ret = 4; | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		/* make sure we get woken up by the interrupt */ | 
					
						
							| 
									
										
										
										
											2007-12-20 16:39:59 +09:00
										 |  |  | 		spu_int_mask_or(spu, 2, CLASS2_ENABLE_MAILBOX_INTR); | 
					
						
							| 
									
										
										
										
											2005-11-15 15:53:52 -05:00
										 |  |  | 		ret = 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	spin_unlock_irq(&spu->register_lock); | 
					
						
							|  |  |  | 	return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int spu_hw_wbox_write(struct spu_context *ctx, u32 data) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct spu *spu = ctx->spu; | 
					
						
							|  |  |  | 	struct spu_problem __iomem *prob = spu->problem; | 
					
						
							|  |  |  | 	int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	spin_lock_irq(&spu->register_lock); | 
					
						
							|  |  |  | 	if (in_be32(&prob->mb_stat_R) & 0x00ff00) { | 
					
						
							|  |  |  | 		/* we have space to write wbox_data to */ | 
					
						
							|  |  |  | 		out_be32(&prob->spu_mb_W, data); | 
					
						
							|  |  |  | 		ret = 4; | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		/* make sure we get woken up by the interrupt when space
 | 
					
						
							|  |  |  | 		   becomes available */ | 
					
						
							| 
									
										
										
										
											2007-12-20 16:39:59 +09:00
										 |  |  | 		spu_int_mask_or(spu, 2, CLASS2_ENABLE_MAILBOX_THRESHOLD_INTR); | 
					
						
							| 
									
										
										
										
											2005-11-15 15:53:52 -05:00
										 |  |  | 		ret = 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	spin_unlock_irq(&spu->register_lock); | 
					
						
							|  |  |  | 	return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void spu_hw_signal1_write(struct spu_context *ctx, u32 data) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	out_be32(&ctx->spu->problem->signal_notify1, data); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void spu_hw_signal2_write(struct spu_context *ctx, u32 data) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	out_be32(&ctx->spu->problem->signal_notify2, data); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void spu_hw_signal1_type_set(struct spu_context *ctx, u64 val) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct spu *spu = ctx->spu; | 
					
						
							|  |  |  | 	struct spu_priv2 __iomem *priv2 = spu->priv2; | 
					
						
							|  |  |  | 	u64 tmp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	spin_lock_irq(&spu->register_lock); | 
					
						
							|  |  |  | 	tmp = in_be64(&priv2->spu_cfg_RW); | 
					
						
							|  |  |  | 	if (val) | 
					
						
							|  |  |  | 		tmp |= 1; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		tmp &= ~1; | 
					
						
							|  |  |  | 	out_be64(&priv2->spu_cfg_RW, tmp); | 
					
						
							|  |  |  | 	spin_unlock_irq(&spu->register_lock); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static u64 spu_hw_signal1_type_get(struct spu_context *ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return ((in_be64(&ctx->spu->priv2->spu_cfg_RW) & 1) != 0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void spu_hw_signal2_type_set(struct spu_context *ctx, u64 val) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct spu *spu = ctx->spu; | 
					
						
							|  |  |  | 	struct spu_priv2 __iomem *priv2 = spu->priv2; | 
					
						
							|  |  |  | 	u64 tmp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	spin_lock_irq(&spu->register_lock); | 
					
						
							|  |  |  | 	tmp = in_be64(&priv2->spu_cfg_RW); | 
					
						
							|  |  |  | 	if (val) | 
					
						
							|  |  |  | 		tmp |= 2; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		tmp &= ~2; | 
					
						
							|  |  |  | 	out_be64(&priv2->spu_cfg_RW, tmp); | 
					
						
							|  |  |  | 	spin_unlock_irq(&spu->register_lock); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static u64 spu_hw_signal2_type_get(struct spu_context *ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return ((in_be64(&ctx->spu->priv2->spu_cfg_RW) & 2) != 0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static u32 spu_hw_npc_read(struct spu_context *ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return in_be32(&ctx->spu->problem->spu_npc_RW); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void spu_hw_npc_write(struct spu_context *ctx, u32 val) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	out_be32(&ctx->spu->problem->spu_npc_RW, val); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static u32 spu_hw_status_read(struct spu_context *ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return in_be32(&ctx->spu->problem->spu_status_R); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static char *spu_hw_get_ls(struct spu_context *ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return ctx->spu->local_store; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-20 16:39:59 +09:00
										 |  |  | static void spu_hw_privcntl_write(struct spu_context *ctx, u64 val) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	out_be64(&ctx->spu->priv2->spu_privcntl_RW, val); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-20 18:45:09 +01:00
										 |  |  | static u32 spu_hw_runcntl_read(struct spu_context *ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return in_be32(&ctx->spu->problem->spu_runcntl_RW); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-12-05 22:52:25 -05:00
										 |  |  | static void spu_hw_runcntl_write(struct spu_context *ctx, u32 val) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-10-24 18:31:16 +02:00
										 |  |  | 	spin_lock_irq(&ctx->spu->register_lock); | 
					
						
							|  |  |  | 	if (val & SPU_RUNCNTL_ISOLATE) | 
					
						
							| 
									
										
										
										
											2007-12-20 16:39:59 +09:00
										 |  |  | 		spu_hw_privcntl_write(ctx, | 
					
						
							|  |  |  | 			SPU_PRIVCNT_LOAD_REQUEST_ENABLE_MASK); | 
					
						
							| 
									
										
										
										
											2005-12-05 22:52:25 -05:00
										 |  |  | 	out_be32(&ctx->spu->problem->spu_runcntl_RW, val); | 
					
						
							| 
									
										
										
										
											2006-10-24 18:31:16 +02:00
										 |  |  | 	spin_unlock_irq(&ctx->spu->register_lock); | 
					
						
							| 
									
										
										
										
											2005-12-05 22:52:25 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-05 13:49:31 +11:00
										 |  |  | static void spu_hw_runcntl_stop(struct spu_context *ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	spin_lock_irq(&ctx->spu->register_lock); | 
					
						
							|  |  |  | 	out_be32(&ctx->spu->problem->spu_runcntl_RW, SPU_RUNCNTL_STOP); | 
					
						
							|  |  |  | 	while (in_be32(&ctx->spu->problem->spu_status_R) & SPU_STATUS_RUNNING) | 
					
						
							|  |  |  | 		cpu_relax(); | 
					
						
							|  |  |  | 	spin_unlock_irq(&ctx->spu->register_lock); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-20 18:45:08 +01:00
										 |  |  | static void spu_hw_master_start(struct spu_context *ctx) | 
					
						
							| 
									
										
										
										
											2005-12-05 22:52:25 -05:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-11-20 18:45:08 +01:00
										 |  |  | 	struct spu *spu = ctx->spu; | 
					
						
							|  |  |  | 	u64 sr1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	spin_lock_irq(&spu->register_lock); | 
					
						
							|  |  |  | 	sr1 = spu_mfc_sr1_get(spu) | MFC_STATE1_MASTER_RUN_CONTROL_MASK; | 
					
						
							|  |  |  | 	spu_mfc_sr1_set(spu, sr1); | 
					
						
							|  |  |  | 	spin_unlock_irq(&spu->register_lock); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void spu_hw_master_stop(struct spu_context *ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct spu *spu = ctx->spu; | 
					
						
							|  |  |  | 	u64 sr1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	spin_lock_irq(&spu->register_lock); | 
					
						
							|  |  |  | 	sr1 = spu_mfc_sr1_get(spu) & ~MFC_STATE1_MASTER_RUN_CONTROL_MASK; | 
					
						
							|  |  |  | 	spu_mfc_sr1_set(spu, sr1); | 
					
						
							|  |  |  | 	spin_unlock_irq(&spu->register_lock); | 
					
						
							| 
									
										
										
										
											2005-12-05 22:52:25 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-23 00:00:11 +01:00
										 |  |  | static int spu_hw_set_mfc_query(struct spu_context * ctx, u32 mask, u32 mode) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-09-23 01:37:41 +01:00
										 |  |  | 	struct spu_problem __iomem *prob = ctx->spu->problem; | 
					
						
							| 
									
										
										
										
											2006-03-23 00:00:11 +01:00
										 |  |  | 	int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	spin_lock_irq(&ctx->spu->register_lock); | 
					
						
							|  |  |  | 	ret = -EAGAIN; | 
					
						
							|  |  |  | 	if (in_be32(&prob->dma_querytype_RW)) | 
					
						
							|  |  |  | 		goto out; | 
					
						
							|  |  |  | 	ret = 0; | 
					
						
							|  |  |  | 	out_be32(&prob->dma_querymask_RW, mask); | 
					
						
							|  |  |  | 	out_be32(&prob->dma_querytype_RW, mode); | 
					
						
							|  |  |  | out: | 
					
						
							|  |  |  | 	spin_unlock_irq(&ctx->spu->register_lock); | 
					
						
							|  |  |  | 	return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static u32 spu_hw_read_mfc_tagstatus(struct spu_context * ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return in_be32(&ctx->spu->problem->dma_tagstatus_R); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static u32 spu_hw_get_mfc_free_elements(struct spu_context *ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return in_be32(&ctx->spu->problem->dma_qstatus_R); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int spu_hw_send_mfc_command(struct spu_context *ctx, | 
					
						
							|  |  |  | 					struct mfc_dma_command *cmd) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	u32 status; | 
					
						
							| 
									
										
										
										
											2006-09-23 01:37:41 +01:00
										 |  |  | 	struct spu_problem __iomem *prob = ctx->spu->problem; | 
					
						
							| 
									
										
										
										
											2006-03-23 00:00:11 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	spin_lock_irq(&ctx->spu->register_lock); | 
					
						
							|  |  |  | 	out_be32(&prob->mfc_lsa_W, cmd->lsa); | 
					
						
							|  |  |  | 	out_be64(&prob->mfc_ea_W, cmd->ea); | 
					
						
							|  |  |  | 	out_be32(&prob->mfc_union_W.by32.mfc_size_tag32, | 
					
						
							|  |  |  | 				cmd->size << 16 | cmd->tag); | 
					
						
							|  |  |  | 	out_be32(&prob->mfc_union_W.by32.mfc_class_cmd32, | 
					
						
							|  |  |  | 				cmd->class << 16 | cmd->cmd); | 
					
						
							|  |  |  | 	status = in_be32(&prob->mfc_union_W.by32.mfc_class_cmd32); | 
					
						
							|  |  |  | 	spin_unlock_irq(&ctx->spu->register_lock); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch (status & 0xffff) { | 
					
						
							|  |  |  | 	case 0: | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | 	case 2: | 
					
						
							|  |  |  | 		return -EAGAIN; | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		return -EINVAL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-23 21:08:15 +02:00
										 |  |  | static void spu_hw_restart_dma(struct spu_context *ctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct spu_priv2 __iomem *priv2 = ctx->spu->priv2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!test_bit(SPU_CONTEXT_SWITCH_PENDING, &ctx->spu->flags)) | 
					
						
							|  |  |  | 		out_be64(&priv2->mfc_control_RW, MFC_CNTL_RESTART_DMA_COMMAND); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-15 15:53:52 -05:00
										 |  |  | struct spu_context_ops spu_hw_ops = { | 
					
						
							|  |  |  | 	.mbox_read = spu_hw_mbox_read, | 
					
						
							|  |  |  | 	.mbox_stat_read = spu_hw_mbox_stat_read, | 
					
						
							| 
									
										
										
										
											2005-12-05 22:52:27 -05:00
										 |  |  | 	.mbox_stat_poll = spu_hw_mbox_stat_poll, | 
					
						
							| 
									
										
										
										
											2005-11-15 15:53:52 -05:00
										 |  |  | 	.ibox_read = spu_hw_ibox_read, | 
					
						
							|  |  |  | 	.wbox_write = spu_hw_wbox_write, | 
					
						
							|  |  |  | 	.signal1_write = spu_hw_signal1_write, | 
					
						
							|  |  |  | 	.signal2_write = spu_hw_signal2_write, | 
					
						
							|  |  |  | 	.signal1_type_set = spu_hw_signal1_type_set, | 
					
						
							|  |  |  | 	.signal1_type_get = spu_hw_signal1_type_get, | 
					
						
							|  |  |  | 	.signal2_type_set = spu_hw_signal2_type_set, | 
					
						
							|  |  |  | 	.signal2_type_get = spu_hw_signal2_type_get, | 
					
						
							|  |  |  | 	.npc_read = spu_hw_npc_read, | 
					
						
							|  |  |  | 	.npc_write = spu_hw_npc_write, | 
					
						
							|  |  |  | 	.status_read = spu_hw_status_read, | 
					
						
							|  |  |  | 	.get_ls = spu_hw_get_ls, | 
					
						
							| 
									
										
										
										
											2007-12-20 16:39:59 +09:00
										 |  |  | 	.privcntl_write = spu_hw_privcntl_write, | 
					
						
							| 
									
										
										
										
											2006-11-20 18:45:09 +01:00
										 |  |  | 	.runcntl_read = spu_hw_runcntl_read, | 
					
						
							| 
									
										
										
										
											2005-12-05 22:52:25 -05:00
										 |  |  | 	.runcntl_write = spu_hw_runcntl_write, | 
					
						
							| 
									
										
										
										
											2007-12-05 13:49:31 +11:00
										 |  |  | 	.runcntl_stop = spu_hw_runcntl_stop, | 
					
						
							| 
									
										
										
										
											2006-11-20 18:45:08 +01:00
										 |  |  | 	.master_start = spu_hw_master_start, | 
					
						
							|  |  |  | 	.master_stop = spu_hw_master_stop, | 
					
						
							| 
									
										
										
										
											2006-03-23 00:00:11 +01:00
										 |  |  | 	.set_mfc_query = spu_hw_set_mfc_query, | 
					
						
							|  |  |  | 	.read_mfc_tagstatus = spu_hw_read_mfc_tagstatus, | 
					
						
							|  |  |  | 	.get_mfc_free_elements = spu_hw_get_mfc_free_elements, | 
					
						
							|  |  |  | 	.send_mfc_command = spu_hw_send_mfc_command, | 
					
						
							| 
									
										
										
										
											2007-04-23 21:08:15 +02:00
										 |  |  | 	.restart_dma = spu_hw_restart_dma, | 
					
						
							| 
									
										
										
										
											2005-11-15 15:53:52 -05:00
										 |  |  | }; |