commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r7562 - in gnuradio/branches/developers/eb/gcell/src/l


From: eb
Subject: [Commit-gnuradio] r7562 - in gnuradio/branches/developers/eb/gcell/src/lib: . spu
Date: Mon, 4 Feb 2008 23:17:10 -0700 (MST)

Author: eb
Date: 2008-02-04 23:17:10 -0700 (Mon, 04 Feb 2008)
New Revision: 7562

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
   gnuradio/branches/developers/eb/gcell/src/lib/spu/test_spu.c
Log:
try using signal on QS21.  terrible on PS3

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 05:13:25 UTC (rev 7561)
+++ gnuradio/branches/developers/eb/gcell/src/lib/gc_job_manager_impl.cc        
2008-02-05 06:17:10 UTC (rev 7562)
@@ -483,6 +483,10 @@
   // FIXME keep count of jobs in progress?
   
   gc_jd_queue_enqueue(d_queue, jd);
+
+  // broadcast that there's work available
+  signal_all_spes(SPE_SIG_NOTIFY_REG_1, 0x1);
+
   return true;
 }
 
@@ -588,6 +592,34 @@
 
 ////////////////////////////////////////////////////////////////////////
 
+bool
+gc_job_manager_impl::signal_all_spes(int signal_reg, uint32_t data)
+{
+  bool ok = true;
+
+  for (unsigned int i = 0; i < d_options.nspes; i++)
+    ok &= signal_spe(i, signal_reg, data);
+
+  return ok;
+}
+
+bool
+gc_job_manager_impl::signal_spe(unsigned int spe, int signal_reg, uint32_t 
data)
+{
+  if (spe >= d_options.nspes)
+    return false;
+
+  int r = spe_signal_write(d_worker[spe].spe_ctx, signal_reg, data);
+  if (r == -1){
+    perror("spe_signal_write");
+    return false;
+  }
+
+  return true;
+}
+
+////////////////////////////////////////////////////////////////////////
+
 static void
 pthread_create_failure_msg(int r, const char *which)
 {

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 05:13:25 UTC (rev 7561)
+++ gnuradio/branches/developers/eb/gcell/src/lib/gc_job_manager_impl.h 
2008-02-05 06:17:10 UTC (rev 7562)
@@ -144,6 +144,8 @@
 private:
   bool send_all_spes(uint32_t msg);
   bool send_spe(unsigned int spe, uint32_t msg);
+  bool signal_all_spes(int signal_reg, uint32_t data);
+  bool signal_spe(unsigned int spe, int signal_reg, uint32_t data);
   void print_event(spe_event_unit_t *evt);
   void handle_event(spe_event_unit_t *evt);
 

Modified: gnuradio/branches/developers/eb/gcell/src/lib/spu/test_spu.c
===================================================================
--- gnuradio/branches/developers/eb/gcell/src/lib/spu/test_spu.c        
2008-02-05 05:13:25 UTC (rev 7561)
+++ gnuradio/branches/developers/eb/gcell/src/lib/spu/test_spu.c        
2008-02-05 06:17:10 UTC (rev 7562)
@@ -93,6 +93,8 @@
   static gc_job_desc_t jd;     // static gets us proper alignment
   gc_eaddr_t   jd_ea;
 
+  // FIXME we could reduce our power consumption by using events
+
   while (1){
 
     // any msgs for us?
@@ -104,13 +106,19 @@
        return;
     }
 
-    // try to get a job from the job queue
-    if (gc_jd_queue_dequeue(spu_args.queue, &jd_ea, &jd)){
-      process_job(jd_ea, &jd);
-      backoff_reset();
+    // any signal for us?
+    cnt = spu_readchcnt(SPU_RdSigNotify1);
+    if (unlikely(cnt > 0)){
+      int value = spu_readch(SPU_RdSigNotify1);
+      // printf("spu[%d] signal: 0x%08x\n", spu_args.spu_idx, value);
+
+      if (value & 0x1){
+       // try to get a job from the job queue
+       if (gc_jd_queue_dequeue(spu_args.queue, &jd_ea, &jd)){
+         process_job(jd_ea, &jd);
+       }
+      }
     }
-    else
-      backoff_delay();
   }
 }
 





reply via email to

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