summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 29001d6)
raw | patch | inline | side by side (parent: 29001d6)
author | David Lide <a0216552@gtudci01.(none)> | |
Fri, 13 Apr 2012 21:01:25 +0000 (17:01 -0400) | ||
committer | David Lide <a0216552@gtudci01.(none)> | |
Fri, 13 Apr 2012 21:01:25 +0000 (17:01 -0400) |
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)
\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
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
\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
{\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)
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)
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)
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)
/* 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)
//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)
\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
}\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
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
***************************************************************************** \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
***************************************************************************** \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
\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
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
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
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
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)
\r
\r
//************for multi pkt burst xfer test in loopback mode\r
-#define TX_BURST 4\r
+#define TX_BURST 8 \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
}\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
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
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
\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
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
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
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)
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;
#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
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;}