Added a bunch of debugging information; messages are passed between wrap/core.
authorethereal <ethereal@ethv.net>
Wed, 10 Jun 2015 19:43:32 +0000 (19:43 +0000)
committerethereal <ethereal@ethv.net>
Wed, 10 Jun 2015 19:43:32 +0000 (19:43 +0000)
src/ecommon.h
src/ecore/ecore.c
src/ecore/render.c
src/ecore/render.h
src/ecore/rreq.c
src/ewrap/main.c

index 2e9daec..377b78e 100644 (file)
@@ -34,6 +34,12 @@ typedef struct __attribute__((packed)) {
     uint32_t finished;
 
     shm_cam_t cam;
+
+    uint32_t msg[16];
+
+    uint32_t interrupts_fired;
+    uint32_t messages_received;
+    uint32_t range_end;
 } shm_region_t;
 
 #endif
index bd1029b..c591f4a 100644 (file)
@@ -19,10 +19,18 @@ int main() {
 
     e_irq_global_mask(E_FALSE);
     e_irq_mask(E_USER_INT, E_FALSE);
+    e_irq_mask(E_MESSAGE_INT, E_FALSE);
 
     int id = y*e_group_config.group_rows + x;
     while(1) {
+        shm_region->msg[id] = 1;
         request_new_range(id);
+        shm_region->msg[id] = 9;
+
+        for(int i = 0; i < NUM_OUT_ELEMENTS; i ++) {
+            out_buffer_ptr[i] = i+1;
+        }
+
         // do rendering
         render_finished();
     }
index a1a1b6c..582b202 100644 (file)
@@ -4,8 +4,9 @@
 
 uint32_t render_start, render_end;
 uint8_t __attribute__((section(".data_bank2"))) in_buffer[0x2000];
-void *in_buffer_ptr;
 uint32_t __attribute__((section(".data_bank3"))) out_buffer[NUM_OUT_ELEMENTS];
+uint32_t *out_buffer_ptr = out_buffer;
+void *in_buffer_ptr = in_buffer;
 
 void render_finished() {
     // use DMA channel 1 to transfer results back
index 141f63f..339f594 100644 (file)
@@ -7,5 +7,6 @@ void render_finished();
 
 extern uint32_t render_start, render_end;
 extern void *in_buffer_ptr;
+extern uint32_t *out_buffer_ptr;
 
 #endif
index 3d6b81e..fbefdd3 100644 (file)
@@ -2,7 +2,7 @@
 #include "render.h"
 
 uint8_t range_requests[NCORES];
-uint8_t idle_core_count;
+uint32_t idle_cores;
 uint32_t range_start, range_end;
 uint32_t current_generation;
 
@@ -12,11 +12,14 @@ e_dma_desc_t __attribute__((aligned(8))) dma_desc;
 
 
 void handle_range_request(int id) {
+    shm_region->msg[id] = 6;
     if(range_start >= range_end) {
         // set core to be marked as idle
-        idle_core_count ++;
+        idle_cores |= (1<<id);
         return;
     }
+    shm_region->msg[id] = 7;
+    range_requests[id] = 0;
 
     uint8_t target_r = id%e_group_config.group_rows;
     uint8_t target_c = id/e_group_config.group_rows;
@@ -37,11 +40,14 @@ void handle_range_request(int id) {
     e_read(&e_group_config, &target_generation, target_r, target_c,
         &current_generation, 4);
 
+    shm_region->msg[id] = 8;
     if(target_generation != shm_region->generation) {
+        shm_region->msg[id] = 16 + target_generation;
         // first update generation ID
-        e_write(&e_group_config, &current_generation, target_r, target_c,
+        e_write(&e_group_config, &shm_region->generation, target_r, target_c,
             &current_generation, 4);
 
+#if 0
         // need to DMA in render data, using target core's DMA engine
         e_dma_desc_t desc;
         desc.config = E_DMA_ENABLE | E_DMA_WORD | E_DMA_MASTER | E_DMA_MSGMODE;
@@ -53,9 +59,13 @@ void handle_range_request(int id) {
         e_write(&e_group_config, &desc, target_r, target_c, &dma_desc,
             sizeof(desc));
         // initiate DMA
-        uint32_t value = 0x08 | ((uint32_t)&dma_desc & 0xffff << 16);
-        e_write(&e_group_config, &value, target_r, target_c, (void *)0xf0520,
-            4);
+        uint32_t value = E_DMA_STARTUP | ((uint32_t)&dma_desc & 0xffff) << 16;
+        e_write(&e_group_config, &value, target_r, target_c,
+            (void *)E_REG_DMA1CONFIG, 4);
+#endif
+
+        // XXX: debug
+        e_irq_set(target_r, target_c, E_MESSAGE_INT);
     }
     else {
         // render data already present, so just send a message IRQ
@@ -66,33 +76,36 @@ void handle_range_request(int id) {
 void __attribute((interrupt)) range_request_handler(
     int __attribute__((unused)) irq) {
 
+    shm_region->interrupts_fired ++;
+
     // clear ILAT entry to accept other pending requests
     e_reg_write(E_REG_ILATCL, 1<<9);
 
     for(int i = 0; i < NCORES; i ++) {
         if(range_requests[i]) {
-            range_requests[i] = 0;
             handle_range_request(i);
         }
     }
 
     // are all cores idle?
-    if(idle_core_count == NCORES) {
+    if(idle_cores == (1<<NCORES)-1) {
         shm_region->finished = 1;
         // if so, wait for next generation to be set up
         while(shm_region->generation == current_generation) {}
         // mark all cores as non-idle
-        idle_core_count = 0;
+        idle_cores = 0;
         shm_region->finished = 0;
         // set up rendering range appropriately
         range_start = 0, range_end = shm_region->height*shm_region->width;
+        shm_region->range_end = range_end;
         // trigger handler again
-        e_reg_write(E_REG_ILATCL, 1<<9);
+        e_reg_write(E_REG_ILATST, 1<<9);
     }
 }
 
 void __attribute((interrupt)) message_handler() {
     message_intr = 1;
+    shm_region->messages_received ++;
 }
 
 void setup_range_request() {
@@ -100,7 +113,7 @@ void setup_range_request() {
     current_generation = 0;
 
     e_irq_attach(E_USER_INT, range_request_handler);
-    e_irq_set(E_USER_INT, 0, 0);
+    e_irq_attach(E_MESSAGE_INT, message_handler);
 }
 
 void request_new_range(int id) {
@@ -109,6 +122,6 @@ void request_new_range(int id) {
 
     message_intr = 0;
     e_irq_set(0, 0, E_USER_INT);
-
+    shm_region->msg[id] = 5;
     while(!message_intr) {}
 }
index 465497d..697a4df 100644 (file)
@@ -19,7 +19,7 @@ int main() {
 
     e_set_host_verbosity(H_D0);
 
-    int r = e_shm_alloc(&mem, "raytrace_shm", platform.rows * platform.cols);
+    int r = e_shm_alloc(&mem, "raytrace_shm", 1<<20);
     if(r != E_OK) r = e_shm_attach(&mem, "raytrace_shm");
     if(r != E_OK) {
         printf("Failed to attach to shared memory!\n");
@@ -27,6 +27,8 @@ int main() {
     }
     shm_region = mem.base;
 
+    shm_region->generation = 0;
+
     e_open(&dev, 0, 0, platform.rows, platform.cols);
     printf("rows, cols: %i, %i\n", platform.rows, platform.cols);
 
@@ -56,6 +58,25 @@ int main() {
     // 
     while(shm_region->finished == 0) {}
     printf("Finished!\n");
+    shm_region->width = 0x10;
+    shm_region->height = 0x10;
+    shm_region->data_end = 0x100;
+    shm_region->generation = 1;
+    shm_region->fb_off = 0x100;
+    //for(int i = 0; i < 30; i ++) printf("finished: %lx\n", shm_region->finished);
+    for(int i = 0; i < 30; i ++) {
+        printf("state: [%lx, %2lx, %2lx, %lx]", shm_region->finished, shm_region->interrupts_fired, shm_region->range_end, shm_region->messages_received);
+        for(int j = 0; j < 16; j ++) printf(" %lx", shm_region->msg[j]);
+        printf("\n");
+    }
+    //while(shm_region->finished == 1) {}
+    //while(shm_region->finished == 0) {}
+
+    printf("fb: ");
+    for(int i = 0; i < 0x100; i ++) {
+        printf("%lx", *((uint32_t *)shm_region + 0x100/4 + i));
+    }
+    printf("\n");
 
     e_close(&dev);
     e_shm_release("raytrace_shm");