32 static int spe_read_tag_status_block(
spe_context_ptr_t spectx,
unsigned int mask,
unsigned int *tag_status);
33 static int spe_read_tag_status_noblock(
spe_context_ptr_t spectx,
unsigned int mask,
unsigned int *tag_status);
36 unsigned size,
unsigned tag,
unsigned tid,
unsigned rid,
42 (
unsigned long)ea, size, tag, tid, rid, (
unsigned)cmd);
45 if (tag > 0x0f || tid > 0xff || rid > 0xff) {
53 unsigned int eal = (uintptr_t) ea & 0xFFFFFFFF;
54 unsigned int eah = (
unsigned long long)(uintptr_t) ea >> 32;
77 .ea = (
unsigned long) ea,
80 .
class = (tid << 8) | rid,
83 ret = write(fd, &parm,
sizeof (parm));
84 if ((ret < 0) && (errno != EIO)) {
85 perror(
"spe_do_mfc_put: internal error");
87 return ret < 0 ? -1 : 0;
95 unsigned size,
unsigned tag,
unsigned tid,
unsigned rid,
99 ret = issue_mfc_command(spectx, src, dst, size, tag, tid, rid, cmd);
111 unsigned int size,
unsigned int tag,
unsigned tid,
unsigned rid,
115 ret = issue_mfc_command(spectx, dst, src, size, tag, tid, rid, cmd);
134 return spe_do_mfc_put(spectx, ls, ea, size, tag, tid, rid,
MFC_CMD_PUT);
145 return spe_do_mfc_put(spectx, ls, ea, size, tag, tid, rid,
MFC_CMD_PUTB);
156 return spe_do_mfc_put(spectx, ls, ea, size, tag, tid, rid,
MFC_CMD_PUTF);
168 return spe_do_mfc_get(spectx, ls, ea, size, tag, tid, rid,
MFC_CMD_GET);
179 return spe_do_mfc_get(spectx, ls, ea, size, tag, rid, rid,
MFC_CMD_GETB);
190 return spe_do_mfc_get(spectx, ls, ea, size, tag, tid, rid,
MFC_CMD_GETF);
194 unsigned int mask,
unsigned int *tag_status)
199 return spe_read_tag_status_block(spectx, mask, tag_status);
206 if (fsync(fd) != 0) {
210 return spe_read_tag_status_block(spectx, mask, tag_status);
215 unsigned int mask,
unsigned int *tag_status)
217 return spe_read_tag_status_block(spectx, mask, tag_status);
221 unsigned int mask,
unsigned int *tag_status)
223 return spe_read_tag_status_noblock(spectx, mask, tag_status);
231 static int spe_read_tag_status_block(
spe_context_ptr_t spectx,
unsigned int mask,
unsigned int *tag_status)
242 DEBUG_PRINTF(
"unset active tagmask = 0x%04x, tag_status = 0x%04x\n",
244 }
while (*tag_status ^ mask);
254 if (read(fd,tag_status,4) == 4) {
261 static int spe_read_tag_status_noblock(
spe_context_ptr_t spectx,
unsigned int mask,
unsigned int *tag_status)
274 DEBUG_PRINTF(
"unset active tagmask = 0x%04x, tag_status = 0x%04x\n",
279 struct pollfd poll_fd;
288 poll_fd.events = POLLIN;
290 ret = poll(&poll_fd, 1, 0);
295 if (ret == 0 || !(poll_fd.revents & POLLIN)) {
300 if (read(fd,tag_status,4) == 4) {
324 return spe_mfcio_tag_status_read_all(spectx, mask, tag_status);
326 return spe_mfcio_tag_status_read_any(spectx, mask, tag_status);
328 return spe_mfcio_tag_status_read_immediate(spectx, mask, tag_status);
338 unsigned int data = 1;
349 ret = write(fd, &data,
sizeof (data));
350 if ((ret < 0) && (errno != EIO)) {
351 perror(
"spe_mssync_start: internal error");
353 return ret < 0 ? -1 : 0;
372 ret = read(fd, &data,
sizeof (data));
373 if ((ret < 0) && (errno != EIO)) {
374 perror(
"spe_mssync_start: internal error");
376 return ret < 0 ? -1 : data;