| SPUFS(2) Linux Programmer's Manual SPUFS(2) |
| |
| |
| |
| NAME |
| spufs - the SPU file system |
| |
| |
| DESCRIPTION |
| The SPU file system is used on PowerPC machines that implement the Cell |
| Broadband Engine Architecture in order to access Synergistic Processor |
| Units (SPUs). |
| |
| The file system provides a name space similar to posix shared memory or |
| message queues. Users that have write permissions on the file system |
| can use spu_create(2) to establish SPU contexts in the spufs root. |
| |
| Every SPU context is represented by a directory containing a predefined |
| set of files. These files can be used for manipulating the state of the |
| logical SPU. Users can change permissions on those files, but not actu- |
| ally add or remove files. |
| |
| |
| MOUNT OPTIONS |
| uid=<uid> |
| set the user owning the mount point, the default is 0 (root). |
| |
| gid=<gid> |
| set the group owning the mount point, the default is 0 (root). |
| |
| |
| FILES |
| The files in spufs mostly follow the standard behavior for regular sys- |
| tem calls like read(2) or write(2), but often support only a subset of |
| the operations supported on regular file systems. This list details the |
| supported operations and the deviations from the behaviour in the |
| respective man pages. |
| |
| All files that support the read(2) operation also support readv(2) and |
| all files that support the write(2) operation also support writev(2). |
| All files support the access(2) and stat(2) family of operations, but |
| only the st_mode, st_nlink, st_uid and st_gid fields of struct stat |
| contain reliable information. |
| |
| All files support the chmod(2)/fchmod(2) and chown(2)/fchown(2) opera- |
| tions, but will not be able to grant permissions that contradict the |
| possible operations, e.g. read access on the wbox file. |
| |
| The current set of files is: |
| |
| |
| /mem |
| the contents of the local storage memory of the SPU. This can be |
| accessed like a regular shared memory file and contains both code and |
| data in the address space of the SPU. The possible operations on an |
| open mem file are: |
| |
| read(2), pread(2), write(2), pwrite(2), lseek(2) |
| These operate as documented, with the exception that seek(2), |
| write(2) and pwrite(2) are not supported beyond the end of the |
| file. The file size is the size of the local storage of the SPU, |
| which normally is 256 kilobytes. |
| |
| mmap(2) |
| Mapping mem into the process address space gives access to the |
| SPU local storage within the process address space. Only |
| MAP_SHARED mappings are allowed. |
| |
| |
| /mbox |
| The first SPU to CPU communication mailbox. This file is read-only and |
| can be read in units of 32 bits. The file can only be used in non- |
| blocking mode and it even poll() will not block on it. The possible |
| operations on an open mbox file are: |
| |
| read(2) |
| If a count smaller than four is requested, read returns -1 and |
| sets errno to EINVAL. If there is no data available in the mail |
| box, the return value is set to -1 and errno becomes EAGAIN. |
| When data has been read successfully, four bytes are placed in |
| the data buffer and the value four is returned. |
| |
| |
| /ibox |
| The second SPU to CPU communication mailbox. This file is similar to |
| the first mailbox file, but can be read in blocking I/O mode, and the |
| poll family of system calls can be used to wait for it. The possible |
| operations on an open ibox file are: |
| |
| read(2) |
| If a count smaller than four is requested, read returns -1 and |
| sets errno to EINVAL. If there is no data available in the mail |
| box and the file descriptor has been opened with O_NONBLOCK, the |
| return value is set to -1 and errno becomes EAGAIN. |
| |
| If there is no data available in the mail box and the file |
| descriptor has been opened without O_NONBLOCK, the call will |
| block until the SPU writes to its interrupt mailbox channel. |
| When data has been read successfully, four bytes are placed in |
| the data buffer and the value four is returned. |
| |
| poll(2) |
| Poll on the ibox file returns (POLLIN | POLLRDNORM) whenever |
| data is available for reading. |
| |
| |
| /wbox |
| The CPU to SPU communation mailbox. It is write-only can can be written |
| in units of 32 bits. If the mailbox is full, write() will block and |
| poll can be used to wait for it becoming empty again. The possible |
| operations on an open wbox file are: write(2) If a count smaller than |
| four is requested, write returns -1 and sets errno to EINVAL. If there |
| is no space available in the mail box and the file descriptor has been |
| opened with O_NONBLOCK, the return value is set to -1 and errno becomes |
| EAGAIN. |
| |
| If there is no space available in the mail box and the file descriptor |
| has been opened without O_NONBLOCK, the call will block until the SPU |
| reads from its PPE mailbox channel. When data has been read success- |
| fully, four bytes are placed in the data buffer and the value four is |
| returned. |
| |
| poll(2) |
| Poll on the ibox file returns (POLLOUT | POLLWRNORM) whenever |
| space is available for writing. |
| |
| |
| /mbox_stat |
| /ibox_stat |
| /wbox_stat |
| Read-only files that contain the length of the current queue, i.e. how |
| many words can be read from mbox or ibox or how many words can be |
| written to wbox without blocking. The files can be read only in 4-byte |
| units and return a big-endian binary integer number. The possible |
| operations on an open *box_stat file are: |
| |
| read(2) |
| If a count smaller than four is requested, read returns -1 and |
| sets errno to EINVAL. Otherwise, a four byte value is placed in |
| the data buffer, containing the number of elements that can be |
| read from (for mbox_stat and ibox_stat) or written to (for |
| wbox_stat) the respective mail box without blocking or resulting |
| in EAGAIN. |
| |
| |
| /npc |
| /decr |
| /decr_status |
| /spu_tag_mask |
| /event_mask |
| /srr0 |
| Internal registers of the SPU. The representation is an ASCII string |
| with the numeric value of the next instruction to be executed. These |
| can be used in read/write mode for debugging, but normal operation of |
| programs should not rely on them because access to any of them except |
| npc requires an SPU context save and is therefore very inefficient. |
| |
| The contents of these files are: |
| |
| npc Next Program Counter |
| |
| decr SPU Decrementer |
| |
| decr_status Decrementer Status |
| |
| spu_tag_mask MFC tag mask for SPU DMA |
| |
| event_mask Event mask for SPU interrupts |
| |
| srr0 Interrupt Return address register |
| |
| |
| The possible operations on an open npc, decr, decr_status, |
| spu_tag_mask, event_mask or srr0 file are: |
| |
| read(2) |
| When the count supplied to the read call is shorter than the |
| required length for the pointer value plus a newline character, |
| subsequent reads from the same file descriptor will result in |
| completing the string, regardless of changes to the register by |
| a running SPU task. When a complete string has been read, all |
| subsequent read operations will return zero bytes and a new file |
| descriptor needs to be opened to read the value again. |
| |
| write(2) |
| A write operation on the file results in setting the register to |
| the value given in the string. The string is parsed from the |
| beginning to the first non-numeric character or the end of the |
| buffer. Subsequent writes to the same file descriptor overwrite |
| the previous setting. |
| |
| |
| /fpcr |
| This file gives access to the Floating Point Status and Control Regis- |
| ter as a four byte long file. The operations on the fpcr file are: |
| |
| read(2) |
| If a count smaller than four is requested, read returns -1 and |
| sets errno to EINVAL. Otherwise, a four byte value is placed in |
| the data buffer, containing the current value of the fpcr regis- |
| ter. |
| |
| write(2) |
| If a count smaller than four is requested, write returns -1 and |
| sets errno to EINVAL. Otherwise, a four byte value is copied |
| from the data buffer, updating the value of the fpcr register. |
| |
| |
| /signal1 |
| /signal2 |
| The two signal notification channels of an SPU. These are read-write |
| files that operate on a 32 bit word. Writing to one of these files |
| triggers an interrupt on the SPU. The value writting to the signal |
| files can be read from the SPU through a channel read or from host user |
| space through the file. After the value has been read by the SPU, it |
| is reset to zero. The possible operations on an open signal1 or sig- |
| nal2 file are: |
| |
| read(2) |
| If a count smaller than four is requested, read returns -1 and |
| sets errno to EINVAL. Otherwise, a four byte value is placed in |
| the data buffer, containing the current value of the specified |
| signal notification register. |
| |
| write(2) |
| If a count smaller than four is requested, write returns -1 and |
| sets errno to EINVAL. Otherwise, a four byte value is copied |
| from the data buffer, updating the value of the specified signal |
| notification register. The signal notification register will |
| either be replaced with the input data or will be updated to the |
| bitwise OR or the old value and the input data, depending on the |
| contents of the signal1_type, or signal2_type respectively, |
| file. |
| |
| |
| /signal1_type |
| /signal2_type |
| These two files change the behavior of the signal1 and signal2 notifi- |
| cation files. The contain a numerical ASCII string which is read as |
| either "1" or "0". In mode 0 (overwrite), the hardware replaces the |
| contents of the signal channel with the data that is written to it. in |
| mode 1 (logical OR), the hardware accumulates the bits that are subse- |
| quently written to it. The possible operations on an open signal1_type |
| or signal2_type file are: |
| |
| read(2) |
| When the count supplied to the read call is shorter than the |
| required length for the digit plus a newline character, subse- |
| quent reads from the same file descriptor will result in com- |
| pleting the string. When a complete string has been read, all |
| subsequent read operations will return zero bytes and a new file |
| descriptor needs to be opened to read the value again. |
| |
| write(2) |
| A write operation on the file results in setting the register to |
| the value given in the string. The string is parsed from the |
| beginning to the first non-numeric character or the end of the |
| buffer. Subsequent writes to the same file descriptor overwrite |
| the previous setting. |
| |
| |
| EXAMPLES |
| /etc/fstab entry |
| none /spu spufs gid=spu 0 0 |
| |
| |
| AUTHORS |
| Arnd Bergmann <arndb@de.ibm.com>, Mark Nutter <mnutter@us.ibm.com>, |
| Ulrich Weigand <Ulrich.Weigand@de.ibm.com> |
| |
| SEE ALSO |
| capabilities(7), close(2), spu_create(2), spu_run(2), spufs(7) |
| |
| |
| |
| Linux 2005-09-28 SPUFS(2) |
| |
| ------------------------------------------------------------------------------ |
| |
| SPU_RUN(2) Linux Programmer's Manual SPU_RUN(2) |
| |
| |
| |
| NAME |
| spu_run - execute an spu context |
| |
| |
| SYNOPSIS |
| #include <sys/spu.h> |
| |
| int spu_run(int fd, unsigned int *npc, unsigned int *event); |
| |
| DESCRIPTION |
| The spu_run system call is used on PowerPC machines that implement the |
| Cell Broadband Engine Architecture in order to access Synergistic Pro- |
| cessor Units (SPUs). It uses the fd that was returned from spu_cre- |
| ate(2) to address a specific SPU context. When the context gets sched- |
| uled to a physical SPU, it starts execution at the instruction pointer |
| passed in npc. |
| |
| Execution of SPU code happens synchronously, meaning that spu_run does |
| not return while the SPU is still running. If there is a need to exe- |
| cute SPU code in parallel with other code on either the main CPU or |
| other SPUs, you need to create a new thread of execution first, e.g. |
| using the pthread_create(3) call. |
| |
| When spu_run returns, the current value of the SPU instruction pointer |
| is written back to npc, so you can call spu_run again without updating |
| the pointers. |
| |
| event can be a NULL pointer or point to an extended status code that |
| gets filled when spu_run returns. It can be one of the following con- |
| stants: |
| |
| SPE_EVENT_DMA_ALIGNMENT |
| A DMA alignment error |
| |
| SPE_EVENT_SPE_DATA_SEGMENT |
| A DMA segmentation error |
| |
| SPE_EVENT_SPE_DATA_STORAGE |
| A DMA storage error |
| |
| If NULL is passed as the event argument, these errors will result in a |
| signal delivered to the calling process. |
| |
| RETURN VALUE |
| spu_run returns the value of the spu_status register or -1 to indicate |
| an error and set errno to one of the error codes listed below. The |
| spu_status register value contains a bit mask of status codes and |
| optionally a 14 bit code returned from the stop-and-signal instruction |
| on the SPU. The bit masks for the status codes are: |
| |
| 0x02 SPU was stopped by stop-and-signal. |
| |
| 0x04 SPU was stopped by halt. |
| |
| 0x08 SPU is waiting for a channel. |
| |
| 0x10 SPU is in single-step mode. |
| |
| 0x20 SPU has tried to execute an invalid instruction. |
| |
| 0x40 SPU has tried to access an invalid channel. |
| |
| 0x3fff0000 |
| The bits masked with this value contain the code returned from |
| stop-and-signal. |
| |
| There are always one or more of the lower eight bits set or an error |
| code is returned from spu_run. |
| |
| ERRORS |
| EAGAIN or EWOULDBLOCK |
| fd is in non-blocking mode and spu_run would block. |
| |
| EBADF fd is not a valid file descriptor. |
| |
| EFAULT npc is not a valid pointer or status is neither NULL nor a valid |
| pointer. |
| |
| EINTR A signal occurred while spu_run was in progress. The npc value |
| has been updated to the new program counter value if necessary. |
| |
| EINVAL fd is not a file descriptor returned from spu_create(2). |
| |
| ENOMEM Insufficient memory was available to handle a page fault result- |
| ing from an MFC direct memory access. |
| |
| ENOSYS the functionality is not provided by the current system, because |
| either the hardware does not provide SPUs or the spufs module is |
| not loaded. |
| |
| |
| NOTES |
| spu_run is meant to be used from libraries that implement a more |
| abstract interface to SPUs, not to be used from regular applications. |
| See http://www.bsc.es/projects/deepcomputing/linuxoncell/ for the rec- |
| ommended libraries. |
| |
| |
| CONFORMING TO |
| This call is Linux specific and only implemented by the ppc64 architec- |
| ture. Programs using this system call are not portable. |
| |
| |
| BUGS |
| The code does not yet fully implement all features lined out here. |
| |
| |
| AUTHOR |
| Arnd Bergmann <arndb@de.ibm.com> |
| |
| SEE ALSO |
| capabilities(7), close(2), spu_create(2), spufs(7) |
| |
| |
| |
| Linux 2005-09-28 SPU_RUN(2) |
| |
| ------------------------------------------------------------------------------ |
| |
| SPU_CREATE(2) Linux Programmer's Manual SPU_CREATE(2) |
| |
| |
| |
| NAME |
| spu_create - create a new spu context |
| |
| |
| SYNOPSIS |
| #include <sys/types.h> |
| #include <sys/spu.h> |
| |
| int spu_create(const char *pathname, int flags, mode_t mode); |
| |
| DESCRIPTION |
| The spu_create system call is used on PowerPC machines that implement |
| the Cell Broadband Engine Architecture in order to access Synergistic |
| Processor Units (SPUs). It creates a new logical context for an SPU in |
| pathname and returns a handle to associated with it. pathname must |
| point to a non-existing directory in the mount point of the SPU file |
| system (spufs). When spu_create is successful, a directory gets cre- |
| ated on pathname and it is populated with files. |
| |
| The returned file handle can only be passed to spu_run(2) or closed, |
| other operations are not defined on it. When it is closed, all associ- |
| ated directory entries in spufs are removed. When the last file handle |
| pointing either inside of the context directory or to this file |
| descriptor is closed, the logical SPU context is destroyed. |
| |
| The parameter flags can be zero or any bitwise or'd combination of the |
| following constants: |
| |
| SPU_RAWIO |
| Allow mapping of some of the hardware registers of the SPU into |
| user space. This flag requires the CAP_SYS_RAWIO capability, see |
| capabilities(7). |
| |
| The mode parameter specifies the permissions used for creating the new |
| directory in spufs. mode is modified with the user's umask(2) value |
| and then used for both the directory and the files contained in it. The |
| file permissions mask out some more bits of mode because they typically |
| support only read or write access. See stat(2) for a full list of the |
| possible mode values. |
| |
| |
| RETURN VALUE |
| spu_create returns a new file descriptor. It may return -1 to indicate |
| an error condition and set errno to one of the error codes listed |
| below. |
| |
| |
| ERRORS |
| EACCESS |
| The current user does not have write access on the spufs mount |
| point. |
| |
| EEXIST An SPU context already exists at the given path name. |
| |
| EFAULT pathname is not a valid string pointer in the current address |
| space. |
| |
| EINVAL pathname is not a directory in the spufs mount point. |
| |
| ELOOP Too many symlinks were found while resolving pathname. |
| |
| EMFILE The process has reached its maximum open file limit. |
| |
| ENAMETOOLONG |
| pathname was too long. |
| |
| ENFILE The system has reached the global open file limit. |
| |
| ENOENT Part of pathname could not be resolved. |
| |
| ENOMEM The kernel could not allocate all resources required. |
| |
| ENOSPC There are not enough SPU resources available to create a new |
| context or the user specific limit for the number of SPU con- |
| texts has been reached. |
| |
| ENOSYS the functionality is not provided by the current system, because |
| either the hardware does not provide SPUs or the spufs module is |
| not loaded. |
| |
| ENOTDIR |
| A part of pathname is not a directory. |
| |
| |
| |
| NOTES |
| spu_create is meant to be used from libraries that implement a more |
| abstract interface to SPUs, not to be used from regular applications. |
| See http://www.bsc.es/projects/deepcomputing/linuxoncell/ for the rec- |
| ommended libraries. |
| |
| |
| FILES |
| pathname must point to a location beneath the mount point of spufs. By |
| convention, it gets mounted in /spu. |
| |
| |
| CONFORMING TO |
| This call is Linux specific and only implemented by the ppc64 architec- |
| ture. Programs using this system call are not portable. |
| |
| |
| BUGS |
| The code does not yet fully implement all features lined out here. |
| |
| |
| AUTHOR |
| Arnd Bergmann <arndb@de.ibm.com> |
| |
| SEE ALSO |
| capabilities(7), close(2), spu_run(2), spufs(7) |
| |
| |
| |
| Linux 2005-09-28 SPU_CREATE(2) |