[POWERPC] spufs: Implement /mbox_info, /ibox_info, and /wbox_info.
This patch implements read only access to /mbox_info - SPU Write Outbound Mailbox /ibox_info - SPU Write Outbound Interrupt Mailbox /wbox_info - SPU Read Inbound Mailbox These files are used by gdb in order to look into the current mailbox queues without changing the contents at the same time. They are not meant for general programming use, since the access requires a context save and is therefore rather slow. It would be good to complement this patch with one that adds write support as well. Signed-off-by: Dwayne Grant McConnell <decimal@us.ibm.com> Signed-off-by: Arnd Bergmann <arnd.bergmann@de.ibm.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
Родитель
1182e1d351
Коммит
69a2f00ce5
|
@ -1552,6 +1552,93 @@ static int spufs_info_open(struct inode *inode, struct file *file)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ssize_t spufs_mbox_info_read(struct file *file, char __user *buf,
|
||||||
|
size_t len, loff_t *pos)
|
||||||
|
{
|
||||||
|
struct spu_context *ctx = file->private_data;
|
||||||
|
u32 mbox_stat;
|
||||||
|
u32 data;
|
||||||
|
|
||||||
|
if (!access_ok(VERIFY_WRITE, buf, len))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
spu_acquire_saved(ctx);
|
||||||
|
spin_lock(&ctx->csa.register_lock);
|
||||||
|
mbox_stat = ctx->csa.prob.mb_stat_R;
|
||||||
|
if (mbox_stat & 0x0000ff) {
|
||||||
|
data = ctx->csa.prob.pu_mb_R;
|
||||||
|
}
|
||||||
|
spin_unlock(&ctx->csa.register_lock);
|
||||||
|
spu_release(ctx);
|
||||||
|
|
||||||
|
return simple_read_from_buffer(buf, len, pos, &data, sizeof data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct file_operations spufs_mbox_info_fops = {
|
||||||
|
.open = spufs_info_open,
|
||||||
|
.read = spufs_mbox_info_read,
|
||||||
|
.llseek = generic_file_llseek,
|
||||||
|
};
|
||||||
|
|
||||||
|
static ssize_t spufs_ibox_info_read(struct file *file, char __user *buf,
|
||||||
|
size_t len, loff_t *pos)
|
||||||
|
{
|
||||||
|
struct spu_context *ctx = file->private_data;
|
||||||
|
u32 ibox_stat;
|
||||||
|
u32 data;
|
||||||
|
|
||||||
|
if (!access_ok(VERIFY_WRITE, buf, len))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
spu_acquire_saved(ctx);
|
||||||
|
spin_lock(&ctx->csa.register_lock);
|
||||||
|
ibox_stat = ctx->csa.prob.mb_stat_R;
|
||||||
|
if (ibox_stat & 0xff0000) {
|
||||||
|
data = ctx->csa.priv2.puint_mb_R;
|
||||||
|
}
|
||||||
|
spin_unlock(&ctx->csa.register_lock);
|
||||||
|
spu_release(ctx);
|
||||||
|
|
||||||
|
return simple_read_from_buffer(buf, len, pos, &data, sizeof data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct file_operations spufs_ibox_info_fops = {
|
||||||
|
.open = spufs_info_open,
|
||||||
|
.read = spufs_ibox_info_read,
|
||||||
|
.llseek = generic_file_llseek,
|
||||||
|
};
|
||||||
|
|
||||||
|
static ssize_t spufs_wbox_info_read(struct file *file, char __user *buf,
|
||||||
|
size_t len, loff_t *pos)
|
||||||
|
{
|
||||||
|
struct spu_context *ctx = file->private_data;
|
||||||
|
int i, cnt;
|
||||||
|
u32 data[4];
|
||||||
|
u32 wbox_stat;
|
||||||
|
|
||||||
|
if (!access_ok(VERIFY_WRITE, buf, len))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
spu_acquire_saved(ctx);
|
||||||
|
spin_lock(&ctx->csa.register_lock);
|
||||||
|
wbox_stat = ctx->csa.prob.mb_stat_R;
|
||||||
|
cnt = (wbox_stat & 0x00ff00) >> 8;
|
||||||
|
for (i = 0; i < cnt; i++) {
|
||||||
|
data[i] = ctx->csa.spu_mailbox_data[i];
|
||||||
|
}
|
||||||
|
spin_unlock(&ctx->csa.register_lock);
|
||||||
|
spu_release(ctx);
|
||||||
|
|
||||||
|
return simple_read_from_buffer(buf, len, pos, &data,
|
||||||
|
cnt * sizeof(u32));
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct file_operations spufs_wbox_info_fops = {
|
||||||
|
.open = spufs_info_open,
|
||||||
|
.read = spufs_wbox_info_read,
|
||||||
|
.llseek = generic_file_llseek,
|
||||||
|
};
|
||||||
|
|
||||||
static ssize_t spufs_dma_info_read(struct file *file, char __user *buf,
|
static ssize_t spufs_dma_info_read(struct file *file, char __user *buf,
|
||||||
size_t len, loff_t *pos)
|
size_t len, loff_t *pos)
|
||||||
{
|
{
|
||||||
|
@ -1661,6 +1748,9 @@ struct tree_descr spufs_dir_contents[] = {
|
||||||
{ "psmap", &spufs_psmap_fops, 0666, },
|
{ "psmap", &spufs_psmap_fops, 0666, },
|
||||||
{ "phys-id", &spufs_id_ops, 0666, },
|
{ "phys-id", &spufs_id_ops, 0666, },
|
||||||
{ "object-id", &spufs_object_id_ops, 0666, },
|
{ "object-id", &spufs_object_id_ops, 0666, },
|
||||||
|
{ "mbox_info", &spufs_mbox_info_fops, 0444, },
|
||||||
|
{ "ibox_info", &spufs_ibox_info_fops, 0444, },
|
||||||
|
{ "wbox_info", &spufs_wbox_info_fops, 0444, },
|
||||||
{ "dma_info", &spufs_dma_info_fops, 0444, },
|
{ "dma_info", &spufs_dma_info_fops, 0444, },
|
||||||
{ "proxydma_info", &spufs_proxydma_info_fops, 0444, },
|
{ "proxydma_info", &spufs_proxydma_info_fops, 0444, },
|
||||||
{},
|
{},
|
||||||
|
|
Загрузка…
Ссылка в новой задаче