[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r7567 - gnuradio/branches/developers/eb/gcell/src/lib
From: |
eb |
Subject: |
[Commit-gnuradio] r7567 - gnuradio/branches/developers/eb/gcell/src/lib |
Date: |
Tue, 5 Feb 2008 11:31:41 -0700 (MST) |
Author: eb
Date: 2008-02-05 11:31:40 -0700 (Tue, 05 Feb 2008)
New Revision: 7567
Modified:
gnuradio/branches/developers/eb/gcell/src/lib/gc_job_manager_impl.cc
gnuradio/branches/developers/eb/gcell/src/lib/gc_job_manager_impl.h
Log:
attempt sending signal using MMIO register
Modified: gnuradio/branches/developers/eb/gcell/src/lib/gc_job_manager_impl.cc
===================================================================
--- gnuradio/branches/developers/eb/gcell/src/lib/gc_job_manager_impl.cc
2008-02-05 17:50:13 UTC (rev 7566)
+++ gnuradio/branches/developers/eb/gcell/src/lib/gc_job_manager_impl.cc
2008-02-05 18:31:40 UTC (rev 7567)
@@ -24,6 +24,7 @@
#endif
#include "gc_job_manager_impl.h"
#include "gc_mbox.h"
+#include "memory_barrier.h"
#include <stdio.h>
#include <stdexcept>
@@ -219,7 +220,9 @@
int spe_flags = (SPE_EVENTS_ENABLE
| SPE_CFG_SIGNOTIFY1_OR
- | SPE_CFG_SIGNOTIFY2_OR);
+ | SPE_CFG_SIGNOTIFY2_OR
+ | SPE_MAP_PS
+ );
for (unsigned int i = 0; i < d_options.nspes; i++){
// FIXME affinity stuff goes here
@@ -234,6 +237,14 @@
d_worker[i].spu_args->spu_idx = i;
d_worker[i].state = WS_INIT;
+ // get a user-space pointer to the MMIO SIG_NOTIFY_1 register
+ void *p = spe_ps_area_get(d_worker[i].spe_ctx, SPE_SIG_NOTIFY_1_AREA);
+ if (p == 0){
+ perror("spe_ps_area_get");
+ throw std::runtime_error("spe_ps_area_get");
+ }
+ d_worker[i].spu_sig_notify_1 = &((spe_sig_notify_1_area_t
*)p)->SPU_Sig_Notify_1;
+
int r = spe_program_load(d_worker[i].spe_ctx, spe_image);
if (r != 0){
perror("spe_program_load");
@@ -595,12 +606,21 @@
bool
gc_job_manager_impl::signal_all_spes(int signal_reg, uint32_t data)
{
+#if 0
bool ok = true;
for (unsigned int i = 0; i < d_options.nspes; i++)
ok &= signal_spe(i, signal_reg, data);
return ok;
+#else
+
+ smp_wmb(); // order stores
+ for (unsigned int i = 0; i < d_options.nspes; i++)
+ *d_worker[i].spu_sig_notify_1 = data;
+
+ return true;
+#endif
}
bool
@@ -609,6 +629,8 @@
if (spe >= d_options.nspes)
return false;
+#if 0
+ smp_wmb();
int r = spe_signal_write(d_worker[spe].spe_ctx, signal_reg, data);
if (r == -1){
perror("spe_signal_write");
@@ -616,6 +638,11 @@
}
return true;
+#else
+ smp_wmb();
+ *d_worker[spe].spu_sig_notify_1 = data;
+ return true;
+#endif
}
////////////////////////////////////////////////////////////////////////
Modified: gnuradio/branches/developers/eb/gcell/src/lib/gc_job_manager_impl.h
===================================================================
--- gnuradio/branches/developers/eb/gcell/src/lib/gc_job_manager_impl.h
2008-02-05 17:50:13 UTC (rev 7566)
+++ gnuradio/branches/developers/eb/gcell/src/lib/gc_job_manager_impl.h
2008-02-05 18:31:40 UTC (rev 7567)
@@ -50,6 +50,7 @@
spe_context_ptr_t spe_ctx;
pthread_t thread;
gc_spu_args_t *spu_args; // pointer to 16-byte aligned
struct
+ unsigned int *spu_sig_notify_1; // pointer to MMIO reg
worker_ctx()
: state(WS_FREE), spe_idx(0), spe_ctx(0),
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r7567 - gnuradio/branches/developers/eb/gcell/src/lib,
eb <=