commit-gnuradio
[Top][All Lists]
Advanced

[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),





reply via email to

[Prev in Thread] Current Thread [Next in Thread]