]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - keystone-rtos/netapi.git/commitdiff
support cached memory, benchmarking
authorDavid Lide <a0216552@gtudci01.(none)>
Fri, 13 Apr 2012 21:01:25 +0000 (17:01 -0400)
committerDavid Lide <a0216552@gtudci01.(none)>
Fri, 13 Apr 2012 21:01:25 +0000 (17:01 -0400)
ti/runtime/netapi/netapi_tune.h
ti/runtime/netapi/src/netapi.c
ti/runtime/netapi/src/netapi_init.c
ti/runtime/netapi/src/netapi_loc.h
ti/runtime/netapi/src/netapi_util.h
ti/runtime/netapi/src/netapi_vm.c
ti/runtime/netapi/src/netapi_vm.h
ti/runtime/netapi/src/osal.c
ti/runtime/netapi/src/pktio.c
ti/runtime/netapi/test/net_test.c
ti/runtime/netapi/tools/netapimod_test.c

index c57a1eda7cad90b4c9f391e634f8aaf39662aa54..7cea8b1296470050222eb3f5a093ca98bd182c4c 100755 (executable)
 /* at least as big as DEFAULT_NUM_SOLO+DEFAULT_NUM_BUFFERS but also a power of 2*/\r
 #define TUNE_NETAPI_NUM_GLOBAL_DESC  512 \r
 #define TUNE_NETAPI_DESC_SIZE  128 //don't change!!\r
-\r
+#ifdef NETAPI_USE_DDR\r
+#define TUNE_NETAPI_QM_START_INDEX  0x2000  //WARNING:  must reflect what kernel is using for their region, see device tree blob\r
+#define TUNE_NETAPI_QM_GLOBAL_REGION 18  //WARNING: must reflect what kernel is using for their region, see device tree blob\r
+#else //use msmc..\r
+#define TUNE_NETAPI_QM_START_INDEX  0  //ok to use 0 since kernel is somewhere higher\r
+#define TUNE_NETAPI_QM_GLOBAL_REGION 0  //ok to to use 0 since msmc addr < ddr addr \r
+#endif\r
 //(9) Define to 1 for DEBUG MODE [where NETCP just loops pkts that tx back to rx]\r
 #define TUNE_NETAPI_NWAL_ENABLE_PASS_LOOPBACK 0  /*1*/\r
 \r
index c8661809aae97616217205d21d2d9a6b87960e82..7cf66d5c2ae16cbf8335000a9942f0dd206d44e8 100755 (executable)
@@ -259,7 +259,7 @@ static int system_init(NETAPI_HANDLE_T * handle)
 \r
     /* Create Shared Heap with specified configuration. */\r
 #define SHARED_MAX_DATA_SIZE      (TUNE_NETAPI_DEFAULT_BUFFER_SIZE) \r
-   sharedHeapHandle = Pktlib_createHeap("netapi", Qmss_MemRegion_MEMORY_REGION0,\r
+   sharedHeapHandle = Pktlib_createHeap("netapi", NETAPI_GLOBAL_REGION,  //was 0\r
                                                 1,\r
                                                 SHARED_MAX_DATA_SIZE,\r
                                                 TUNE_NETAPI_DEFAULT_NUM_BUFFERS,\r
@@ -269,7 +269,7 @@ static int system_init(NETAPI_HANDLE_T * handle)
    if (!sharedHeapHandle) { printf(">'netapi' heap create failed\n"); return -1;}\r
    handle->netcp_heap= sharedHeapHandle;\r
 \r
-  controlHeapHandle = Pktlib_createHeap("netapi_control", Qmss_MemRegion_MEMORY_REGION0,\r
+  controlHeapHandle = Pktlib_createHeap("netapi_control", NETAPI_GLOBAL_REGION,\r
                                                1,\r
                                                TUNE_NETAPI_CONFIG_MAX_CTL_RXTX_BUF_SIZE,\r
                                                TUNE_NETAPI_CONFIG_NUM_CTL_BUF,\r
@@ -282,7 +282,7 @@ static int system_init(NETAPI_HANDLE_T * handle)
 \r
     /* now NWAL */\r
     result = netapi_init_nwal(\r
-                              Qmss_MemRegion_MEMORY_REGION0,\r
+                              NETAPI_GLOBAL_REGION,\r
                               &netapi_pktlib_ifTable, \r
                               &netapi_global.nwal_context);\r
     if (result<0) {printf(">netapi  init_nwal() failed\n"); return -1; }\r
@@ -343,6 +343,7 @@ void netapi_zapQ(int queueNum)
 {\r
 char * descPtr;\r
 int i;\r
+if (!queueNum) return;\r
 for (i=0;;i+=1 )\r
         {\r
                 /* Pop descriptor from source queue */\r
index 051ad14e35b90d22e74ba3d731194df5130eb967..373b818e3e79d826a0b980910d0581bcf1b29d2f 100755 (executable)
@@ -222,15 +222,15 @@ int netapi_qm_setup_mem_region(
   memInfo.descSize       = descSize;\r
   memInfo.descNum        = numDesc;\r
   memInfo.manageDescFlag = Qmss_ManageDesc_MANAGE_DESCRIPTOR;\r
-  memInfo.memRegion      = memRegion==NETAPI_GLOBAL_REGION ? Qmss_MemRegion_MEMORY_REGION0 : Qmss_MemRegion_MEMORY_REGION1;\r
+  memInfo.memRegion      = memRegion;\r
 \r
   if(memRegion == NETAPI_GLOBAL_REGION)\r
   {\r
-      memInfo.startIndex = 0;\r
+      memInfo.startIndex = TUNE_NETAPI_QM_START_INDEX;  //was 0\r
       netapi_qm_region_index += numDesc;\r
   }else if(memRegion ==NETAPI_LOCAL_REGION)\r
   {\r
-      /* Global shared memory for all descriptors to all cores */\r
+      /* 2nd region for descriptors (perhaps private?) */\r
       memInfo.startIndex     = netapi_qm_region_index;\r
   }\r
   else\r
index 0662057c53abc657a2311807a5d6038fdf67ab4d..cc9029ac21f586c625ff43515f794fa94b288594 100755 (executable)
@@ -232,8 +232,8 @@ int netapi_qm_setup_mem_region(
                       unsigned int*         pDescMemBase,\r
                       int                   memRegion);\r
 //for above\r
-#define NETAPI_GLOBAL_REGION 0\r
-#define NETAPI_LOCAL_REGION 1\r
+#define NETAPI_GLOBAL_REGION TUNE_NETAPI_QM_GLOBAL_REGION \r
+#define NETAPI_LOCAL_REGION ((NETAPI_GLOBAL_REGION)+1) \r
 \r
 int netapi_VM_memory_setup(void);\r
 void netapi_VM_memory_teardown(void);\r
index 82452437326ea2f23a8ecb9b5ca63b6c1ed47250..dc20ba1e826b22c605f189f3de55c2a19009f40f 100755 (executable)
@@ -60,4 +60,7 @@ unsigned long netap_utilGetSizeofBufferArea(void);
 int netapi_utilCacheWbInv(void *ptr, size_t size);\r
 unsigned long netapi_utilGetVaOfBufferArea(void);\r
 \r
+//for benchmarking\r
+void Osal_cache_op_measure_reset(void); \r
+unsigned int Osal_cache_op_measure(int * p_n) ;\r
 #endif\r
index 939e7aba677180d25a0fc92c1009cddc59babfac..e5945f7836efe22d7df2bb4d2c043617f8f7d58d 100755 (executable)
@@ -75,6 +75,7 @@ static uint32_t netapi_VM_mem_size = 0;
 /* File descriptor for /dev/mem */ \r
 static int dev_mem_fd;\r
 static int  our_netapi_module_fd;\r
+#define USE_MODULE_MMAP  //we will mmap through netapi kernel module, not /dev/mem\r
 #ifndef USE_MODULE_MMAP\r
 static int temp_fd;\r
 #endif\r
index 09cc3dec58a3186af5acc499b554bc27fa96e1e4..851894be0977e88d87ea527ea6b647b10ac445c3 100755 (executable)
@@ -52,8 +52,6 @@ extern unsigned char *netapi_VM_QMemGlobalDescRam;
 //SA context region\r
 extern unsigned char *netapi_VM_SaContextVaddr;\r
 \r
-#define NETAPI_GLOBAL_REGION 0 \r
-#define NETAPI_LOCAL_REGION 1 \r
 \r
 #endif\r
 \r
index a09136f7c1c84a3ac7e53f8c729d941425014529..f92d6514bfc4a22c6dd126897596ed12429c80c3 100755 (executable)
@@ -113,6 +113,19 @@ static inline void nwalTest_osalLeaveCS()
 \r
 #endif\r
 \r
+//utility to convert virt2phy, phy2virt\r
+static inline void* _Osal_qmssVirtToPhy (void *ptr)\r
+{\r
+    return (void *)(netapi_VM_mem_start_phy + ((uint8_t*)ptr - netapi_VM_mem_start));\r
+}\r
+\r
+static inline void * _Osal_qmssPhyToVirt (void *ptr)\r
+{\r
+    if (!ptr) return (void *) 0;\r
+    //todo, see if out of range of mem_start_phy and size!! (like mmu would do)\r
+    return (void *)(netapi_VM_mem_start + ((uint8_t*)ptr - netapi_VM_mem_start_phy));\r
+}\r
+\r
 /**********USE SPACE ACCESS TO KERNEL MEMORY SERVICES*************/\r
 static int netapi_fd;\r
 \r
@@ -172,7 +185,7 @@ static inline int netapi_utilCacheWb(void *ptr, size_t size)
 }\r
 \r
 /** write back & invalidate **/\r
-int netapi_utilCacheWbInv(void *ptr, size_t size)\r
+static inline int _netapi_utilCacheWbInv(void *ptr, size_t size)\r
 {\r
     struct netapimod_block block;\r
 \r
@@ -185,6 +198,7 @@ int netapi_utilCacheWbInv(void *ptr, size_t size)
     return 0;\r
 }\r
 \r
+int netapi_utilCacheWbInv(void *ptr, size_t size) {return _netapi_utilCacheWbInv(ptr,size);}\r
 /** just invalidate **/\r
 static inline int netapi_utilCacheInv(void *ptr, size_t size)\r
 {\r
@@ -224,13 +238,15 @@ unsigned long netapi_utilGetVaOfBufferArea(void)
  ***************************************************************************** \r
  * DESCRIPTION: Cache Invalidation Routine\r
  *****************************************************************************/\r
-void Osal_invalidateCache (void *blockPtr, uint32_t size) \r
+static inline void Osal_invalidateCache (void *blockPtr, uint32_t size) \r
 {\r
 \r
+#if 0  //do invalidate with writeback (when actually sending or freeing)\r
 #ifdef NETAPI_TUNE_USE_CACHE_OPS\r
     if ((blockPtr <netapi_VM_mem_start)||( blockPtr>netapi_VM_mem_end)) return;\r
     //netapi_utilCacheInv(blockPtr, size);\r
     netapi_utilCacheInv(Osal_saGetSCPhyAddr(blockPtr), size);\r
+#endif\r
 #endif\r
     return;\r
 }\r
@@ -240,12 +256,27 @@ void Osal_invalidateCache (void *blockPtr, uint32_t size)
  ***************************************************************************** \r
  * DESCRIPTION: Cache Invalidation Routine\r
  *****************************************************************************/\r
-void Osal_writeBackCache (void *blockPtr, uint32_t size) \r
+/* stats */\r
+static unsigned int cache_op_cycles=0;\r
+static unsigned int n_cache_op_cycles=0;\r
+void Osal_cache_op_measure_reset(void) { cache_op_cycles=0; n_cache_op_cycles=0;}\r
+unsigned int Osal_cache_op_measure(int * p_n) { *p_n = n_cache_op_cycles;  return cache_op_cycles;}\r
+\r
+static inline void Osal_writeBackCache (void *blockPtr, uint32_t size) \r
 {\r
 #ifdef NETAPI_TUNE_USE_CACHE_OPS\r
+    register unsigned int v1;\r
+    register unsigned int v2;\r
+     \r
+    v1= netapi_timing_stop();\r
     if ((blockPtr <netapi_VM_mem_start)||( blockPtr>netapi_VM_mem_end)) return;\r
     //netapi_utilCacheWbInv(blockPtr, size);\r
-    netapi_utilCacheWbInv(Osal_saGetSCPhyAddr(blockPtr), size);\r
+    //printf("osal> wbiv %x %x %d ..",  blockPtr, Osal_saGetSCPhyAddr(blockPtr), size);\r
+    _netapi_utilCacheWbInv(_Osal_qmssVirtToPhy(blockPtr), size);\r
+    v2= netapi_timing_stop();\r
+    cache_op_cycles += (v2-v1); \r
+    n_cache_op_cycles+=1;\r
+    //printf("done\n"); sleep(1);\r
 #endif\r
     return;\r
 }\r
@@ -403,7 +434,7 @@ void Osal_cppiFree (Ptr ptr, uint32_t size)
 \r
 void Osal_qmssBeginMemAccess (void *blockPtr, uint32_t size)\r
 {\r
-    Osal_invalidateCache(blockPtr,size);\r
+    //Osal_invalidateCache(blockPtr,size);\r
     return;\r
 }\r
 \r
@@ -601,43 +632,45 @@ void  Osal_pktLibExitCriticalSection(Pktlib_HeapHandle heapHandle, void* csHandl
     return;        \r
 }\r
 \r
+\r
 void* Osal_qmssVirtToPhy (void *ptr)\r
 {\r
-    return (void *)(netapi_VM_mem_start_phy + ((uint8_t*)ptr - netapi_VM_mem_start));\r
+    return _Osal_qmssVirtToPhy(ptr);\r
 }\r
 \r
-void* Osal_qmssPhyToVirt (void *ptr)\r
+void * Osal_qmssPhyToVirt (void *ptr)\r
 {\r
-    if (!ptr) return (void *) 0;\r
-    //todo, see if out of range of mem_start_phy and size!! (like mmu would do)\r
-    return (void *)(netapi_VM_mem_start + ((uint8_t*)ptr - netapi_VM_mem_start_phy));\r
+    return _Osal_qmssPhyToVirt(ptr);\r
 }\r
 \r
 /******************************************************************************\r
 * Function to traverse a CPPI descriptor and convert all address references\r
 * from virtual to physical.\r
 ******************************************************************************/\r
+//#define ASSUME_ALL_DESCRIPTOR   //define this if mono and host descriptors are present, else don't\r
+                                  //define and just host will be assumed (more efficient)\r
 void* Osal_qmssConvertDescVirtToPhy(void *descAddr)\r
 {\r
     if (!descAddr) return (void *)0;\r
-\r
+#ifdef ASSUME_ALL_DESCRIPTOR \r
     if (Cppi_getDescType((Cppi_Desc *)QMSS_DESC_PTR(descAddr)) == Cppi_DescType_HOST)\r
+#endif\r
     {\r
         Cppi_HostDesc *nextBDPtr = (Cppi_HostDesc *)QMSS_DESC_PTR(descAddr);\r
         Cppi_HostDesc *prevBDPtr = 0;\r
         while (nextBDPtr)\r
         {\r
-            void *buffPtr;\r
+            void *buffPtr=NULL;\r
             if (nextBDPtr->buffPtr)\r
             {\r
                 buffPtr = (void *)nextBDPtr->buffPtr;\r
-                nextBDPtr->buffPtr = (uint32_t)Osal_qmssVirtToPhy((void *)(nextBDPtr->buffPtr));\r
+                nextBDPtr->buffPtr = (uint32_t)_Osal_qmssVirtToPhy((void *)(nextBDPtr->buffPtr));\r
                 if (!(nextBDPtr->buffPtr)) return (void *)0;\r
             }\r
 \r
             if (nextBDPtr->origBuffPtr)\r
             {\r
-                nextBDPtr->origBuffPtr = (uint32_t)Osal_qmssVirtToPhy((void *)(nextBDPtr->origBuffPtr));\r
+                nextBDPtr->origBuffPtr = (uint32_t)_Osal_qmssVirtToPhy((void *)(nextBDPtr->origBuffPtr));\r
                 if (!(nextBDPtr->origBuffPtr)) return (void *)0;\r
             }\r
 \r
@@ -645,21 +678,23 @@ void* Osal_qmssConvertDescVirtToPhy(void *descAddr)
             nextBDPtr = (Cppi_HostDesc *)QMSS_DESC_PTR((nextBDPtr->nextBDPtr));\r
             if (prevBDPtr->nextBDPtr)\r
             {\r
-                prevBDPtr->nextBDPtr = (uint32_t)Osal_qmssVirtToPhy((void *)(prevBDPtr->nextBDPtr));\r
+                prevBDPtr->nextBDPtr = (uint32_t)_Osal_qmssVirtToPhy((void *)(prevBDPtr->nextBDPtr));\r
                 if (!(prevBDPtr->nextBDPtr)) return (void *)0;\r
             }\r
 \r
-            Qmss_osalEndMemAccess(buffPtr, prevBDPtr->buffLen);\r
-            Qmss_osalEndMemAccess(prevBDPtr, sizeof(Cppi_HostDesc));\r
+            if (buffPtr) Qmss_osalEndMemAccess(buffPtr, prevBDPtr->buffLen);\r
+            Qmss_osalEndMemAccess(prevBDPtr, TUNE_NETAPI_DESC_SIZE);\r
         }\r
-        descAddr = Osal_qmssVirtToPhy(descAddr);\r
+        descAddr = _Osal_qmssVirtToPhy(descAddr);\r
         if (!descAddr) return (void *)0;\r
     }\r
+#ifdef ASSUME_ALL_DESCRIPTOR \r
     else if (Cppi_getDescType((Cppi_Desc *)QMSS_DESC_PTR(descAddr)) == Cppi_DescType_MONOLITHIC)\r
     {\r
-        descAddr = Osal_qmssVirtToPhy(descAddr);\r
+        descAddr = _Osal_qmssVirtToPhy(descAddr);\r
         if (!descAddr) return (void *)0;\r
     }\r
+#endif\r
     return descAddr;\r
 \r
 }\r
@@ -672,41 +707,45 @@ void* Osal_qmssConvertDescVirtToPhy(void *descAddr)
 void* Osal_qmssConvertDescPhyToVirt(void *descAddr)\r
 {\r
     if (!descAddr) return (void *)0;\r
-    descAddr = Osal_qmssPhyToVirt(descAddr);\r
+    descAddr = _Osal_qmssPhyToVirt(descAddr);\r
 \r
+#ifdef ASSUME_ALL_DESCRIPTOR \r
     if (Cppi_getDescType((Cppi_Desc *)QMSS_DESC_PTR(descAddr)) == Cppi_DescType_HOST)\r
+#endif\r
     {\r
         Cppi_HostDesc *nextBDPtr = (Cppi_HostDesc *)QMSS_DESC_PTR(descAddr);\r
         while (nextBDPtr)\r
         {\r
-            Qmss_osalBeginMemAccess(nextBDPtr, sizeof(Cppi_HostDesc));\r
+            //Qmss_osalBeginMemAccess(nextBDPtr, TUNE_NETAPI_DESC_SIZE);\r
             if (nextBDPtr->buffPtr)\r
             {\r
-                nextBDPtr->buffPtr = (uint32_t)Osal_qmssPhyToVirt((void *)(nextBDPtr->buffPtr));\r
+                nextBDPtr->buffPtr = (uint32_t)_Osal_qmssPhyToVirt((void *)(nextBDPtr->buffPtr));\r
                 if (!(nextBDPtr->buffPtr)) return (void *)0;\r
+                //Qmss_osalBeginMemAccess((void *)(nextBDPtr->buffPtr), nextBDPtr->buffLen);\r
             }\r
 \r
             if (nextBDPtr->origBuffPtr)\r
             {\r
-                nextBDPtr->origBuffPtr = (uint32_t)Osal_qmssPhyToVirt((void *)(nextBDPtr->origBuffPtr));\r
+                nextBDPtr->origBuffPtr = (uint32_t)_Osal_qmssPhyToVirt((void *)(nextBDPtr->origBuffPtr));\r
                 if (!(nextBDPtr->origBuffPtr)) return (void *)0;\r
             }\r
 \r
             if (nextBDPtr->nextBDPtr)\r
             {\r
-                nextBDPtr->nextBDPtr = (uint32_t)Osal_qmssPhyToVirt((void *)(nextBDPtr->nextBDPtr));\r
+                nextBDPtr->nextBDPtr = (uint32_t)_Osal_qmssPhyToVirt((void *)(nextBDPtr->nextBDPtr));\r
                 if (!(nextBDPtr->nextBDPtr)) return (void *)0;\r
             }\r
 \r
-            Qmss_osalBeginMemAccess((void *)(nextBDPtr->buffPtr), nextBDPtr->buffLen);\r
             nextBDPtr = (void *)QMSS_DESC_PTR((nextBDPtr->nextBDPtr));\r
         }\r
     }\r
+#ifdef ASSUME_ALL_DESCRIPTOR \r
     else if (Cppi_getDescType((Cppi_Desc *)QMSS_DESC_PTR(descAddr)) == Cppi_DescType_MONOLITHIC)\r
     {\r
-        descAddr = Osal_qmssPhyToVirt(descAddr);\r
+        descAddr = _Osal_qmssPhyToVirt(descAddr);\r
         if (!descAddr) return (void *)0;\r
     }\r
+#endif\r
     return descAddr;\r
 }\r
 \r
index 0ad2965665364251e6e61b228a4bc4bb3655e2fa..50b5bd1325d97859104108c8e2a777fdea60e60b 100755 (executable)
 #include <string.h>\r
 #include "netapi.h"\r
 \r
+#define DO_BENCH\r
+#ifdef DO_BENCH\r
+/* for benchmarking .. need to be defined somewhere */\r
 extern unsigned int vv7p;\r
 extern unsigned int vv8p;\r
+extern unsigned int vv9p;\r
+extern unsigned int vv10p;\r
+extern unsigned int vv11p;\r
+extern unsigned int vv12p;\r
+\r
+#ifdef DAL_BENCH\r
+unsigned int pktio_get_qop_time(){return (BENCH_get_qpush_time());}\r
+unsigned int pktio_get_qpush_time(){return (BENCH_get_qop_time());}\r
+unsigned int pktio_get_pa2va_time(){return BENCH_get_pa2va_time();}\r
+#else\r
+unsigned int pktio_get_qop_time(){return 0;}\r
+unsigned int pktio_get_qpush_time(){return 0;}\r
+unsigned int pktio_get_pa2va_time(){return 0;}\r
+#endif\r
+#endif\r
 \r
 /*--------------------Utilites-----------------*/\r
+\r
+\r
 static PKTIO_HANDLE_T * pktiop_get_free_channel_slot(NETAPI_T n)\r
 {\r
        PKTIO_HANDLE_T ** pp = (PKTIO_HANDLE_T **) netapi_get_pktio_list(n);\r
@@ -305,7 +325,9 @@ int pktio_send(PKTIO_HANDLE_T * p, Ti_Pkt *pkt, PKTIO_METADATA_T *m, int * err)
        if ((p->use_nwal== PKTIO_DEF_NWAL) )\r
        {\r
                pPktInfo->pPkt = pkt;\r
+                vv11p=netapi_timing_stop();\r
                res=nwal_send(p->nwalInstanceHandle, m->sa_handle,pPktInfo);\r
+                vv12p=netapi_timing_stop();\r
                if (res != nwal_OK) *err = NETAPI_ERR_NWAL_TX_ERR -res;\r
        }\r
         else if ((p->use_nwal== PKTIO_DEF_SB) )\r
@@ -320,7 +342,12 @@ int pktio_send(PKTIO_HANDLE_T * p, Ti_Pkt *pkt, PKTIO_METADATA_T *m, int * err)
                 /* tod: meta data for non netcp xfers */\r
                /* process meta data */\r
                vv8p=netapi_timing_stop();\r
+#ifdef DAL_BENCH\r
+                        BENCH_Qmss_queuePushDesc (p->q, (void*)pkt);\r
+#else\r
                         Qmss_queuePushDesc (p->q, (void*)pkt);\r
+#endif\r
+               vv9p=netapi_timing_stop();\r
        }\r
        return 1;\r
 }\r
@@ -440,7 +467,12 @@ uint64_t ts= netapi_getTimestamp();  //get_ts
                for(r=0;r<n;r++)\r
                {\r
                         if (r==0) vv7p=netapi_timing_stop();\r
+#ifdef DAL_BENCH\r
+                       temp=(Ti_Pkt*)(Cppi_HostDesc*)QMSS_DESC_PTR(BENCH_Qmss_queuePop(p->q));\r
+#else\r
                        temp=(Ti_Pkt*)(Cppi_HostDesc*)QMSS_DESC_PTR(Qmss_queuePop(p->q));\r
+#endif\r
+                        if (r==0) vv10p=netapi_timing_stop();\r
                        if(!temp) break;\r
                                 /* process meta data */\r
                        pkt_list[r]= temp;\r
index ac13485448786138a47a24865d9917c87708c399..287679dc24ecaa59a0a6d7833336214d39a98847 100644 (file)
@@ -81,7 +81,7 @@ void dump_header(unsigned long *p, int n, int a, int r)
 \r
 \r
 //************for multi pkt burst  xfer test in loopback mode\r
-#define TX_BURST 4\r
+#define TX_BURST \r
 int pktloopback=TUNE_NETAPI_NWAL_ENABLE_PASS_LOOPBACK;\r
 \r
 //this device: 10.0.0.100, mac 0x,01,02,03,04,05  and .. 0x6\r
@@ -548,16 +548,25 @@ for(i=0;i<n;i++)
 }\r
 }\r
 \r
+//measurement test points\r
 unsigned int vv1;\r
 unsigned int vv2;\r
 unsigned int vv3;\r
 unsigned int vv4;\r
 unsigned int vv5;\r
 unsigned int vv6;\r
+//these are updated by pktio.\r
 unsigned int vv7p;\r
 unsigned int vv8p;\r
+unsigned int vv9p;\r
+unsigned int vv10p;\r
+unsigned int vv11p;\r
+unsigned int vv12p;\r
+\r
+unsigned int vv11;\r
 \r
 /*--------------basic pktio send/recv benchmark----------------------*/\r
+unsigned int timings[10];\r
 void our_pktio_bench(int ntrials)\r
 {\r
 int i;\r
@@ -567,6 +576,20 @@ unsigned char * pData;
 int len;\r
 int n;\r
 int err;\r
+int sum =0;\r
+\r
+   Osal_cache_op_measure_reset();\r
+   for(i=0;i<10;i++) timings[i]=0;\r
+   printf("calibration loop .. ");\r
+   for(i=0;i<1000;i++)\r
+   {\r
+   vv1= netapi_timing_stop();\r
+   vv2= netapi_timing_stop();\r
+   sum+=(vv2-vv1);\r
+   }\r
+   printf(" accuracy = +- %d cycles\n", sum/1000);\r
+   sleep(1);\r
+  \r
 PKTIO_METADATA_T meta[10]={0};\r
 //send single, recv single\r
 for(i=0;i<ntrials;i++)\r
@@ -580,13 +603,27 @@ for(i=0;i<ntrials;i++)
    vv4= netapi_timing_stop();\r
    n=pktio_poll(our_chan,NULL , &err);\r
    vv5=   netapi_timing_stop();\r
-   printf("pktio send. rx=%d (wcb%d) (toqm%d) tx=%d (toqm%d) alloc=%d\n", vv6-vv4,vv5-vv4,vv7p-vv4,  vv4-vv3, vv8p-vv4,  vv3-vv1);\r
-   \r
+   timings[0]+=(vv6-vv4);\r
+   timings[1]+=(vv5-vv4);\r
+   timings[2]+=(vv7p-vv4);\r
+   timings[3]+=(vv4-vv3);\r
+   timings[4]+=(vv8p-vv3); \r
+   timings[5]+=(vv3-vv1);\r
+   timings[6]+=(vv9p-vv8p);\r
+   timings[7]+=(vv10p-vv7p);\r
+   timings[8]+=(vv11-vv6);\r
 }\r
-\r
-//send multiple, rec multiple\r
-for(i=0;i<ntrials;i++)\r
+   printf("pktio bench. rx=%d (wcb%d) (toqm%d) tx=%d (toqm%d) alloc=%d qpush=%d qpop=%d free=%d\n", timings[0]/ntrials,\r
+           timings[1]/ntrials, timings[2]/ntrials,timings[3]/ntrials, timings[4]/ntrials,timings[5]/ntrials,\r
+           timings[6]/ntrials,timings[7]/ntrials, timings[8]/ntrials );\r
+   printf("raw qpop = %d  raw qpush = %d pa2va = %d  ", pktio_get_qop_time(), \r
+                                                        pktio_get_qpush_time(),\r
+                                                        pktio_get_pa2va_time());\r
 {\r
+   unsigned int ccycles;\r
+   int n_c_ops;\r
+   ccycles =Osal_cache_op_measure(&n_c_ops);\r
+   printf("n_c_ops=%d cache_op_time=%d (total) = %d (pp)\n", n_c_ops, ccycles,  n_c_ops? (ccycles/(n_c_ops)) : 0);\r
 }\r
 \r
 }\r
@@ -602,7 +639,7 @@ Ti_Pkt * get_pkt(int n, unsigned int *p_len)
 \r
   if (pktloopback==0)\r
   {\r
-       if (n>=4) return NULL;   //just gen pkts to warm swtich, so that it knows\r
+       if (n>=8) return NULL;   //just gen pkts to warm swtich, so that it knows\r
                                 //our mac is valid\r
   }  \r
   b=Pktlib_allocPacket(OurHeap,PKT_LEN);\r
@@ -813,6 +850,7 @@ void recv_cb_bench(struct PKTIO_HANDLE_Tag * channel, Ti_Pkt* p_recv[],
    int i;\r
    vv6=   netapi_timing_stop();\r
    for (i=0;i<n_pkts; i++) Pktlib_freePacket(p_recv[i]);\r
+   vv11 = netapi_timing_stop();\r
 }\r
 \r
 /****************************************************************************************/\r
@@ -1169,7 +1207,13 @@ static int house_pkts_gened=0;
 int p;\r
 unsigned char * pIpHdr,* pData;\r
 unsigned int vv1,vv2,vv3;\r
+unsigned int sum_vv1=0;\r
+unsigned int sum_vv2=0;\r
+unsigned int sum_vv3=0;\r
+unsigned int sum_vv4=0;\r
+unsigned int sum_vv5=0;\r
 \r
+Osal_cache_op_measure_reset();\r
 memset(&meta_tx,0,sizeof(meta_tx));\r
 for(p=0;p<TX_BURST;p++) {  \r
 //reguest stats \r
@@ -1225,11 +1269,26 @@ if ((house_pkts_gened>0) && (! (house_pkts_gened%400)) )
    vv2= netapi_timing_stop();\r
    pktio_send(netcp_tx_chan,tip,&meta,&err);\r
    vv3= netapi_timing_stop();\r
-   printf("pktio send. full=%d metadata=%d pktio_send=%d\n", vv3-vv1,  vv2-vv1,  vv3-vv2);\r
+   sum_vv1 += (vv3-vv1);\r
+   sum_vv2 += (vv2-vv1);\r
+   sum_vv3 += (vv3-vv2);\r
+   sum_vv4 += (vv11p-vv2);\r
+   sum_vv5 += (vv12p-vv11p);\r
+   // printf("pktio send. full=%d metadata=%d pktio_send=%d\n", vv3-vv1,  vv2-vv1,  vv3-vv2);\r
    if (err == 0) stats.itx +=1;\r
 \r
    house_pkts_gened +=1;\r
  }\r
+{\r
+   unsigned int ccycles;\r
+   int n_c_ops;\r
+   ccycles =Osal_cache_op_measure(&n_c_ops);\r
+   if (sum_vv1) \r
+      printf("BURST pktio send %d pkts. full=%d metadata=%d pktio_send=%d to_nwal=%d nwal_send= %d n_c_ops=%d cache_op_time=%d (pp-> %d)\n", stats.itx,\r
+   sum_vv1/stats.itx,  sum_vv2/stats.itx,  sum_vv3/stats.itx, \r
+   sum_vv4/stats.itx,  sum_vv5/stats.itx, n_c_ops, ccycles,  \r
+   n_c_ops? (ccycles/(n_c_ops/2)) : 0);\r
+}\r
 }\r
 \r
 \r
@@ -1318,6 +1377,20 @@ if (!netcp_sb_rx_chan) {printf("pktio open SB RX failed err=%d\n",err); exit(1);
 our_sched =netapi_schedOpen(netapi_handle,&our_sched_cfg, &err);\r
 if (!our_sched) {printf("sched create failed\n"); exit(1);}\r
 \r
+/********************************************\r
+* Basic pkt loopback test\r
+*********************************************/\r
+printf("...runnining pure push/pop benchmark\n");\r
+our_pktio_bench(1000);\r
+our_pktio_bench(1000);\r
+our_pktio_bench(1000);\r
+our_pktio_bench(1000);\r
+our_pktio_bench(1000);\r
+/*********************************************/\r
+\r
+\r
+\r
+\r
 /* add mac intefaces */\r
 netcp_cfgCreateMacInterface(\r
                   netapi_handle,\r
index 68dd42772cc0fd1ee298ce20e7beaf1126524ad3..701e0ada06e4e1abbe46d98612eb8f8f1a28b651 100644 (file)
@@ -174,9 +174,11 @@ long buffer[10000];
 int main()
 {
     unsigned long physp, virtp, size;
-    int i,j;
-    unsigned long v1;
-    unsigned long v2;
+    int i,j,k;
+    register unsigned long v1;
+    register unsigned long v2;
+    register unsigned long v3;
+    register unsigned long v4;
     register long sum=0;
     register long *p;
     int c;
@@ -226,31 +228,59 @@ int main()
   
 
 #ifdef AVOID_MMAP
+p = (long*) virtp;
 for(j=1;j<50;j++)
 {
     v1 = netapi_timing_start();
-    for(i=0;i<10000;i++)
+    for(i=0;i<1000;i++)
     {
     if (netapimod_cacheWb((void *)physp, 128*j)) return -1;
     }
     v2 = netapi_timing_stop();
-    printf("wb:  %d cycles for size = %d\n", (v2-v1)/10000, 128*j);
+    printf("wb (clean):  %d cycles for size = %d\n", (v2-v1)/1000, 128*j);
     sleep(1);
+    sum=0;
     v1 = netapi_timing_start();
-    for(i=0;i<10000;i++)
+    for(i=0;i<1000;i++)
+    {
+    v3 = netapi_timing_stop();
+    for(k=0;k<j*2;k++)  p[64*k] = i;
+    v4 = netapi_timing_stop();
+    sum += (v4-v3);
+    if (netapimod_cacheWb((void *)physp, 128*j)) return -1;
+    }
+    v2 = netapi_timing_stop();
+
+    printf("wb (dirty):  %d cycles for size = %d\n", (v2-v1-sum)/1000, 128*j);
+    sleep(1);
+    v1 = netapi_timing_start();
+    for(i=0;i<1000;i++)
     {
     if (netapimod_cacheInv((void *)physp, 128*j)) return -1;
     }
     v2 = netapi_timing_stop();
-    printf("Inv:  %d cycles for size = %d\n", (v2-v1)/10000, 128*j);
+    printf("Inv (no wb):  %d cycles for size = %d\n", (v2-v1)/1000, 128*j);
     sleep(1);
     v1 = netapi_timing_start();
-    for(i=0;i<10000;i++)
+    for(i=0;i<1000;i++)
+    {
+    if (netapimod_cacheWbInv((void *)physp, 128*j)) return -1;
+    }
+    v2 = netapi_timing_stop();
+    printf("wbInv (clean):  %d cycles for size = %d\n", (v2-v1)/1000, 128*j);
+    sleep(1);
+    sum=0;
+    v1 = netapi_timing_start();
+    for(i=0;i<1000;i++)
     {
+    v3 = netapi_timing_stop();
+    for(k=0;k<j*2;k++)  p[64*k] = i;
+    v4 = netapi_timing_stop();
+    sum += (v4-v3);
     if (netapimod_cacheWbInv((void *)physp, 128*j)) return -1;
     }
     v2 = netapi_timing_stop();
-    printf("wbInv:  %d cycles for size = %d\n", (v2-v1)/10000, 128*j);
+    printf("wbInv (dirty):  %d cycles for size = %d\n", (v2-v1)/1000, 128*j);
 }
 
 //stress test
@@ -264,9 +294,9 @@ for(i=0,c=0;c<1000000000;c++)
     memcpy(vp,(char *)&i,4);
     memcpy(vp+64,(char *) &c,4);
     if (netapimod_cacheWbInv((void *)pp, 128)) return -1;
-    if (!(c%0x4000)) {
-         v2 = netapi_timing_start();
-          printf("%d ; ok %d cycles per wbinv call (128 bytes) %x %x\n",c, (v2-v1)/10000, pp,vp); 
+    if (!(c%0xc0000)) {
+         v2 = netapi_timing_stop();
+          printf("%d ; ok %d cycles per wbinv call (128 bytes) %x %x\n",c, (v2-v1)/0xc0000, pp,vp); 
          v1 = netapi_timing_start();
     }
     if (i*128 > size-128){ i=0; pp = (char*) physp; vp = (char *) virtp;}