Commit 1fe93051 authored by Raymond Knopp's avatar Raymond Knopp

handling of buffers in oaioran.c for arbitrary transport element sizes

and bandwidths. Induce gcc to generate AVX2 for ECPRI payload generation
and extraction.
parent 06e2a585
...@@ -358,8 +358,7 @@ static size_t dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output, size ...@@ -358,8 +358,7 @@ static size_t dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output, size
output += print_meas_log(&ru->ofdm_total_stats,"feptx_total",NULL,NULL, output, end - output); output += print_meas_log(&ru->ofdm_total_stats,"feptx_total",NULL,NULL, output, end - output);
} }
if (ru->fh_north_asynch_in) output += print_meas_log(&ru->rx_fhaul,"rx_fhaul",NULL,NULL, output, end - output);
output += print_meas_log(&ru->rx_fhaul,"rx_fhaul",NULL,NULL, output, end - output);
output += print_meas_log(&ru->tx_fhaul,"tx_fhaul",NULL,NULL, output, end - output); output += print_meas_log(&ru->tx_fhaul,"tx_fhaul",NULL,NULL, output, end - output);
......
...@@ -991,9 +991,9 @@ void *ru_stats_thread(void *param) { ...@@ -991,9 +991,9 @@ void *ru_stats_thread(void *param) {
print_meas(&ru->txdataF_copy_stats,"txdataF_copy",NULL,NULL); print_meas(&ru->txdataF_copy_stats,"txdataF_copy",NULL,NULL);
print_meas(&ru->ofdm_total_stats,"feptx_total",NULL,NULL); print_meas(&ru->ofdm_total_stats,"feptx_total",NULL,NULL);
} }
print_meas(&ru->rx_fhaul,"rx_fhaul",NULL,NULL); //print_meas(&ru->rx_fhaul,"rx_fhaul",NULL,NULL);
if (ru->if_south == REMOTE_IF5) print_meas(&ru->ifdevice.tx_fhaul,"tx_fhaul (IF5)",NULL,NULL); if (ru->if_south == REMOTE_IF5) print_meas(&ru->ifdevice.tx_fhaul,"tx_fhaul (IF5)",NULL,NULL);
else print_meas(&ru->tx_fhaul,"tx_fhaul",NULL,NULL); //else print_meas(&ru->tx_fhaul,"tx_fhaul",NULL,NULL);
if (ru->fh_north_out) { if (ru->fh_north_out) {
print_meas(&ru->compression,"compression",NULL,NULL); print_meas(&ru->compression,"compression",NULL,NULL);
......
...@@ -258,95 +258,98 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot){ ...@@ -258,95 +258,98 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot){
read_prach_data(ru, *frame, *slot); read_prach_data(ru, *frame, *slot);
struct xran_device_ctx *xran_ctx = xran_dev_get_ctx(); struct xran_device_ctx *xran_ctx = xran_dev_get_ctx();
#ifdef ORAN_BRONZE #ifdef ORAN_BRONZE
int num_eaxc = xranConf.neAxc; int num_eaxc = xranConf.neAxc;
int num_eaxc_ul = xranConf.neAxcUl; int num_eaxc_ul = xranConf.neAxcUl;
int nPRBs = xranConf.nULRBs;
int fftsize = 1<<xranConf.ru_conf.fftSize;
#else #else
int num_eaxc = app_io_xran_fh_config[0].neAxc; int num_eaxc = app_io_xran_fh_config[0].neAxc;
int num_eaxc_ul = app_io_xran_fh_config[0].neAxcUl; int num_eaxc_ul = app_io_xran_fh_config[0].neAxcUl;
#endif #endif
uint32_t xran_max_antenna_nr = RTE_MAX(num_eaxc, num_eaxc_ul); uint32_t xran_max_antenna_nr = RTE_MAX(num_eaxc, num_eaxc_ul);
int slot_offset_rxdata = 3&(*slot); int slot_offset_rxdata = 3&(*slot);
uint32_t slot_size = 4*14*4096; uint32_t slot_size = 4*14*4096;
uint8_t *rx_data = (uint8_t *)ru->rxdataF[0]; uint8_t *rx_data = (uint8_t *)ru->rxdataF[0];
uint8_t *start_ptr = NULL; uint8_t *start_ptr = NULL;
for(uint16_t cc_id=0; cc_id<1/*nSectorNum*/; cc_id++){ // OAI does not support multiple CC yet. for(uint16_t cc_id=0; cc_id<1/*nSectorNum*/; cc_id++){ // OAI does not support multiple CC yet.
for(uint8_t ant_id = 0; ant_id < xran_max_antenna_nr && ant_id<ru->nb_rx; ant_id++){ for(uint8_t ant_id = 0; ant_id < xran_max_antenna_nr && ant_id<ru->nb_rx; ant_id++){
rx_data = (uint8_t *)ru->rxdataF[ant_id]; rx_data = (uint8_t *)ru->rxdataF[ant_id];
start_ptr = rx_data + (slot_size*slot_offset_rxdata); start_ptr = rx_data + (slot_size*slot_offset_rxdata);
// This loop would better be more inner to avoid confusion and maybe also errors. // This loop would better be more inner to avoid confusion and maybe also errors.
for(int32_t sym_idx = 0; sym_idx < XRAN_NUM_OF_SYMBOL_PER_SLOT; sym_idx++) { for(int32_t sym_idx = 0; sym_idx < XRAN_NUM_OF_SYMBOL_PER_SLOT; sym_idx++) {
LOG_D(PHY,"ORAN RX: CC %d, ant %d, sym %d, tti %d\n",cc_id,ant_id,sym_idx,tti); LOG_D(PHY,"ORAN RX: CC %d, ant %d, sym %d, tti %d\n",cc_id,ant_id,sym_idx,tti);
uint8_t *pData = xran_ctx->sFrontHaulRxBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers[sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT].pData; uint8_t *pData = xran_ctx->sFrontHaulRxBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers[sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT].pData;
uint8_t *pPrbMapData = xran_ctx->sFrontHaulRxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers->pData; uint8_t *pPrbMapData = xran_ctx->sFrontHaulRxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers->pData;
struct xran_prb_map *pPrbMap = (struct xran_prb_map *)pPrbMapData; struct xran_prb_map *pPrbMap = (struct xran_prb_map *)pPrbMapData;
ptr = pData; ptr = pData;
pos = (int32_t *)(start_ptr + (4*sym_idx*4096)); pos = (int32_t *)(start_ptr + (4*sym_idx*4096));
uint8_t *u8dptr; uint8_t *u8dptr;
struct xran_prb_map *pRbMap = pPrbMap; struct xran_prb_map *pRbMap = pPrbMap;
int32_t sym_id = sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT; int32_t sym_id = sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT;
if(ptr && pos){ if(ptr && pos){
uint32_t idxElm = 0; uint32_t idxElm = 0;
u8dptr = (uint8_t*)ptr; u8dptr = (uint8_t*)ptr;
int16_t payload_len = 0; int16_t payload_len = 0;
uint8_t *src = (uint8_t *)u8dptr; uint8_t *src = (uint8_t *)u8dptr;
// first half
uint8_t *src1 = (uint8_t *)u8dptr; struct xran_prb_elm* p_prbMapElm = &pRbMap->prbMap[idxElm];
uint8_t *dst1 = (uint8_t *)pos;
// second half LOG_D(PHY,"pRbMap->nPrbElm %d\n",pRbMap->nPrbElm);
uint8_t *src2 = (uint8_t *)u8dptr; for (idxElm = 0; idxElm < pRbMap->nPrbElm; idxElm++) {
uint8_t *dst2 = (uint8_t *)pos; LOG_D(PHY,"prbMap[%d] : PRBstart %d nPRBs %d\n",
idxElm,pRbMap->prbMap[idxElm].nRBStart,pRbMap->prbMap[idxElm].nRBSize);
struct xran_prb_elm* p_prbMapElm = &pRbMap->prbMap[idxElm]; struct xran_section_desc *p_sec_desc = NULL;
p_prbMapElm = &pRbMap->prbMap[idxElm];
LOG_D(PHY,"pRbMap->nPrbElm %d\n",pRbMap->nPrbElm); int pos_len=0;
for (idxElm = 0; idxElm < pRbMap->nPrbElm; idxElm++) { int neg_len=0;
LOG_D(PHY,"prbMap[%d] : PRBstart %d nPRBs %d\n",
idxElm,pRbMap->prbMap[idxElm].nRBStart,pRbMap->prbMap[idxElm].nRBSize); if (p_prbMapElm->nRBStart < (nPRBs>>1)) // there are PRBs left of DC
struct xran_section_desc *p_sec_desc = NULL; neg_len = min((nPRBs*6) - (p_prbMapElm->nRBStart*12),
p_prbMapElm = &pRbMap->prbMap[idxElm]; p_prbMapElm->nRBSize*N_SC_PER_PRB);
#ifdef ORAN_BRONZE pos_len = (p_prbMapElm->nRBSize*N_SC_PER_PRB) - neg_len;
p_sec_desc = p_prbMapElm->p_sec_desc[sym_id];
if(pRbMap->nPrbElm==1 && idxElm==0){
src = pData;
}
else if(p_sec_desc->pData==NULL){
LOG_E(PHY,"p_sec_desc->pData is NULL for sym_id %d\n",sym_id);
exit(-1);
return -1;
}else{
src = p_sec_desc->pData;
}
src2 = src; #ifdef ORAN_BRONZE
p_sec_desc = p_prbMapElm->p_sec_desc[sym_id];
if(p_sec_desc == NULL){ if(pRbMap->nPrbElm==1 && idxElm==0){
printf ("p_sec_desc == NULL\n"); src = pData;
exit(-1); }
} else if(p_sec_desc->pData==NULL){
// Calculation of the pointer for the section in the buffer. LOG_E(PHY,"p_sec_desc->pData is NULL for sym_id %d\n",sym_id);
// first half exit(-1);
dst1 = (uint8_t *)(pos + p_prbMapElm->nRBStart*N_SC_PER_PRB); return -1;
// second half }else{
dst2 = (uint8_t *)(pos + (p_prbMapElm->nRBStart*N_SC_PER_PRB + 3276/2) + 4096 - 3276); src = p_sec_desc->pData;
if(p_prbMapElm->compMethod == XRAN_COMPMETHOD_NONE) { }
payload_len = p_prbMapElm->nRBSize*N_SC_PER_PRB*4L;
src1 = src2 + payload_len/2;
for (idx = 0; idx < payload_len/(2*sizeof(int16_t)); idx++) { if(p_sec_desc == NULL){
((int16_t *)dst1)[idx] = ((int16_t)ntohs(((uint16_t *)src1)[idx]))>>4; printf ("p_sec_desc == NULL\n");
((int16_t *)dst2)[idx] = ((int16_t)ntohs(((uint16_t *)src2)[idx]))>>4; exit(-1);
//if (sym_idx==0 && idx<16) LOG_I(PHY,"%d: %d,%d\n",idx,((int16_t *)dst1)[idx],((int16_t *)dst1)[idx]); }
} // Calculation of the pointer for the section in the buffer.
} else if (p_prbMapElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) { // positive half
struct xranlib_decompress_request bfp_decom_req_2; uint8_t *dst1 = (uint8_t *)(pos+(neg_len == 0 ? ((p_prbMapElm->nRBStart*N_SC_PER_PRB)-(nPRBs*6)) : 0));
struct xranlib_decompress_response bfp_decom_rsp_2; // negative half
struct xranlib_decompress_request bfp_decom_req_1; uint8_t *dst2 = (uint8_t *)(pos + (p_prbMapElm->nRBStart*N_SC_PER_PRB) + fftsize - (nPRBs*6));
struct xranlib_decompress_response bfp_decom_rsp_1; // NOTE: ggc 11 knows how to generate AVX2 for this!
if(p_prbMapElm->compMethod == XRAN_COMPMETHOD_NONE) {
int32_t local_dst[p_prbMapElm->nRBSize*N_SC_PER_PRB] __attribute__((aligned(64)));
for (idx = 0; idx < p_prbMapElm->nRBSize*N_SC_PER_PRB*2; idx++)
((int16_t *)local_dst)[idx] = ((int16_t)ntohs(((uint16_t *)src)[idx]))>>2;
memcpy((void*)dst2,(void*)local_dst,neg_len*4);
memcpy((void*)dst1,(void*)&local_dst[neg_len],pos_len*4);
} else if (p_prbMapElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) {
struct xranlib_decompress_request bfp_decom_req_2;
struct xranlib_decompress_response bfp_decom_rsp_2;
struct xranlib_decompress_request bfp_decom_req_1;
struct xranlib_decompress_response bfp_decom_rsp_1;
payload_len = (3* p_prbMapElm->iqWidth + 1)*p_prbMapElm->nRBSize; payload_len = (3* p_prbMapElm->iqWidth + 1)*p_prbMapElm->nRBSize;
...@@ -355,7 +358,7 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot){ ...@@ -355,7 +358,7 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot){
memset(&bfp_decom_rsp_2, 0, sizeof(struct xranlib_decompress_response)); memset(&bfp_decom_rsp_2, 0, sizeof(struct xranlib_decompress_response));
memset(&bfp_decom_req_1, 0, sizeof(struct xranlib_decompress_request)); memset(&bfp_decom_req_1, 0, sizeof(struct xranlib_decompress_request));
memset(&bfp_decom_rsp_1, 0, sizeof(struct xranlib_decompress_response)); memset(&bfp_decom_rsp_1, 0, sizeof(struct xranlib_decompress_response));
/*
bfp_decom_req_2.data_in = (int8_t*)src2; bfp_decom_req_2.data_in = (int8_t*)src2;
bfp_decom_req_2.numRBs = p_prbMapElm->nRBSize/2; bfp_decom_req_2.numRBs = p_prbMapElm->nRBSize/2;
bfp_decom_req_2.len = payload_len/2; bfp_decom_req_2.len = payload_len/2;
...@@ -381,11 +384,12 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot){ ...@@ -381,11 +384,12 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot){
xranlib_decompress_avx512(&bfp_decom_req_1, &bfp_decom_rsp_1); xranlib_decompress_avx512(&bfp_decom_req_1, &bfp_decom_rsp_1);
payload_len = bfp_decom_rsp_1.len+first_half_len; payload_len = bfp_decom_rsp_1.len+first_half_len;
}else { */
printf ("p_prbMapElm->compMethod == %d is not supported\n", } else {
p_prbMapElm->compMethod); printf ("p_prbMapElm->compMethod == %d is not supported\n",
exit(-1); p_prbMapElm->compMethod);
} exit(-1);
}
#else #else
if(idxElm==0) src = pData; if(idxElm==0) src = pData;
...@@ -502,15 +506,17 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp) ...@@ -502,15 +506,17 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp)
int idx = 0; int idx = 0;
struct xran_device_ctx *xran_ctx = xran_dev_get_ctx(); struct xran_device_ctx *xran_ctx = xran_dev_get_ctx();
#ifdef ORAN_BRONZE #ifdef ORAN_BRONZE
int num_eaxc = xranConf.neAxc; int num_eaxc = xranConf.neAxc;
int num_eaxc_ul = xranConf.neAxcUl; int num_eaxc_ul = xranConf.neAxcUl;
int nPRBs = xranConf.nDLRBs;
int fftsize = 1<<xranConf.ru_conf.fftSize;
#else #else
int num_eaxc = app_io_xran_fh_config[0].neAxc; int num_eaxc = app_io_xran_fh_config[0].neAxc;
int num_eaxc_ul = app_io_xran_fh_config[0].neAxcUl; int num_eaxc_ul = app_io_xran_fh_config[0].neAxcUl;
#endif #endif
uint32_t xran_max_antenna_nr = RTE_MAX(num_eaxc, num_eaxc_ul); uint32_t xran_max_antenna_nr = RTE_MAX(num_eaxc, num_eaxc_ul);
/* /*
for (nSectorNum = 0; nSectorNum < XRAN_MAX_SECTOR_NR; nSectorNum++) for (nSectorNum = 0; nSectorNum < XRAN_MAX_SECTOR_NR; nSectorNum++)
{ {
...@@ -518,124 +524,128 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp) ...@@ -518,124 +524,128 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp)
} }
*/ */
for(uint16_t cc_id=0; cc_id<1/*nSectorNum*/; cc_id++){ // OAI does not support multiple CC yet. for(uint16_t cc_id=0; cc_id<1/*nSectorNum*/; cc_id++){ // OAI does not support multiple CC yet.
for(uint8_t ant_id = 0; ant_id < xran_max_antenna_nr && ant_id<ru->nb_tx; ant_id++){ for(uint8_t ant_id = 0; ant_id < xran_max_antenna_nr && ant_id<ru->nb_tx; ant_id++){
// This loop would better be more inner to avoid confusion and maybe also errors. // This loop would better be more inner to avoid confusion and maybe also errors.
for(int32_t sym_idx = 0; sym_idx < XRAN_NUM_OF_SYMBOL_PER_SLOT; sym_idx++) { for(int32_t sym_idx = 0; sym_idx < XRAN_NUM_OF_SYMBOL_PER_SLOT; sym_idx++) {
uint8_t *pData = xran_ctx->sFrontHaulTxBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers[sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT].pData; uint8_t *pData = xran_ctx->sFrontHaulTxBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers[sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT].pData;
uint8_t *pPrbMapData = xran_ctx->sFrontHaulTxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers->pData; uint8_t *pPrbMapData = xran_ctx->sFrontHaulTxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers->pData;
struct xran_prb_map *pPrbMap = (struct xran_prb_map *)pPrbMapData; struct xran_prb_map *pPrbMap = (struct xran_prb_map *)pPrbMapData;
ptr = pData; ptr = pData;
pos = &ru->txdataF_BF[ant_id][sym_idx * 4096 /*fp->ofdm_symbol_size*/]; // We had to use a different ru structure than benetel so the access to the buffer is not the same. pos = &ru->txdataF_BF[ant_id][sym_idx * 4096 /*fp->ofdm_symbol_size*/]; // We had to use a different ru structure than benetel so the access to the buffer is not the same.
uint8_t *u8dptr; uint8_t *u8dptr;
struct xran_prb_map *pRbMap = pPrbMap; struct xran_prb_map *pRbMap = pPrbMap;
int32_t sym_id = sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT; int32_t sym_id = sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT;
if(ptr && pos){ if(ptr && pos){
uint32_t idxElm = 0; uint32_t idxElm = 0;
u8dptr = (uint8_t*)ptr; u8dptr = (uint8_t*)ptr;
int16_t payload_len = 0; int16_t payload_len = 0;
uint8_t *dst = (uint8_t *)u8dptr; uint8_t *dst = (uint8_t *)u8dptr;
// first half
uint8_t *dst1 = (uint8_t *)u8dptr; struct xran_prb_elm* p_prbMapElm = &pRbMap->prbMap[idxElm];
uint8_t *src1 = (uint8_t *)pos;
// second half for (idxElm = 0; idxElm < pRbMap->nPrbElm; idxElm++) {
uint8_t *dst2 = (uint8_t *)u8dptr; struct xran_section_desc *p_sec_desc = NULL;
uint8_t *src2 = (uint8_t *)pos; p_prbMapElm = &pRbMap->prbMap[idxElm];
p_sec_desc =
struct xran_prb_elm* p_prbMapElm = &pRbMap->prbMap[idxElm];
for (idxElm = 0; idxElm < pRbMap->nPrbElm; idxElm++) {
struct xran_section_desc *p_sec_desc = NULL;
p_prbMapElm = &pRbMap->prbMap[idxElm];
p_sec_desc =
#ifdef ORAN_BRONZE #ifdef ORAN_BRONZE
p_prbMapElm->p_sec_desc[sym_id]; p_prbMapElm->p_sec_desc[sym_id];
#else #else
//assumes on section descriptor per symbol //assumes on section descriptor per symbol
&p_prbMapElm->sec_desc[sym_id][0]; &p_prbMapElm->sec_desc[sym_id][0];
#endif #endif
payload_len = p_prbMapElm->nRBSize*N_SC_PER_PRB*4L; payload_len = p_prbMapElm->nRBSize*N_SC_PER_PRB*4L;
dst = xran_add_hdr_offset(dst, p_prbMapElm->compMethod); dst = xran_add_hdr_offset(dst, p_prbMapElm->compMethod);
dst2 = dst;
dst1 = dst2 + payload_len/2;
if(p_sec_desc == NULL){ if(p_sec_desc == NULL){
printf ("p_sec_desc == NULL\n"); printf ("p_sec_desc == NULL\n");
exit(-1); exit(-1);
} }
// Calculation of the pointer for the section in the buffer. uint16_t *dst16 = (uint16_t *)dst;
// first half
src1 = (uint8_t *)(pos + p_prbMapElm->nRBStart*N_SC_PER_PRB); int pos_len=0;
// second half int neg_len=0;
src2 = (uint8_t *)(pos + (p_prbMapElm->nRBStart*N_SC_PER_PRB + 3276/2) + 4096 - 3276);
if(p_prbMapElm->compMethod == XRAN_COMPMETHOD_NONE) { if (p_prbMapElm->nRBStart < (nPRBs>>1)) // there are PRBs left of DC
neg_len = min((nPRBs*6) - (p_prbMapElm->nRBStart*12),
p_prbMapElm->nRBSize*N_SC_PER_PRB);
pos_len = (p_prbMapElm->nRBSize*N_SC_PER_PRB) - neg_len;
// Calculation of the pointer for the section in the buffer.
// start of positive frequency component
uint16_t *src1 = (uint16_t *)&pos[(neg_len==0)?((p_prbMapElm->nRBStart*N_SC_PER_PRB)-(nPRBs*6)):0];
// start of negative frequency component
uint16_t *src2 = (uint16_t *)&pos[(p_prbMapElm->nRBStart*N_SC_PER_PRB) + fftsize - (nPRBs*6)];
if(p_prbMapElm->compMethod == XRAN_COMPMETHOD_NONE) {
/* convert to Network order */ /* convert to Network order */
for (idx = 0; idx < payload_len/(2*sizeof(uint16_t)); idx++) uint32_t local_src[p_prbMapElm->nRBSize*N_SC_PER_PRB] __attribute__((aligned(64)));
{ // NOTE: ggc 11 knows how to generate AVX2 for this!
((uint16_t *)dst1)[idx] = htons(((uint16_t *)src1)[idx]); memcpy((void*)local_src,(void*)src2,neg_len*4);
((uint16_t *)dst2)[idx] = htons(((uint16_t *)src2)[idx]); memcpy((void*)&local_src[neg_len],(void*)src1,pos_len*4);
} for (idx = 0; idx < (pos_len+neg_len)*2 ; idx++)
} else if (p_prbMapElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) { ((uint16_t *)dst16)[idx] = htons(((uint16_t *)local_src)[idx]);
printf("idxElm=%d, compMeth==BLKFLOAT\n",idxElm); } else if (p_prbMapElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) {
struct xranlib_compress_request bfp_com_req; printf("idxElm=%d, compMeth==BLKFLOAT\n",idxElm);
struct xranlib_compress_response bfp_com_rsp; struct xranlib_compress_request bfp_com_req;
struct xranlib_compress_response bfp_com_rsp;
memset(&bfp_com_req, 0, sizeof(struct xranlib_compress_request));
memset(&bfp_com_rsp, 0, sizeof(struct xranlib_compress_response)); memset(&bfp_com_req, 0, sizeof(struct xranlib_compress_request));
memset(&bfp_com_rsp, 0, sizeof(struct xranlib_compress_response));
bfp_com_req.data_in = (int16_t*)src2; /*
bfp_com_req.numRBs = p_prbMapElm->nRBSize/2; bfp_com_req.data_in = (int16_t*)src2;
bfp_com_req.len = payload_len/2; bfp_com_req.numRBs = first_len;//p_prbMapElm->nRBSize/2;
bfp_com_req.compMethod = p_prbMapElm->compMethod; bfp_com_req.len = first_len;//payload_len/2;
bfp_com_req.iqWidth = p_prbMapElm->iqWidth; bfp_com_req.compMethod = p_prbMapElm->compMethod;
bfp_com_req.iqWidth = p_prbMapElm->iqWidth;
bfp_com_rsp.data_out = (int8_t*)dst2; bfp_com_rsp.data_out = (int8_t*)dst2;
bfp_com_rsp.len = 0; bfp_com_rsp.len = 0;
xranlib_compress_avx512(&bfp_com_req, &bfp_com_rsp); xranlib_compress_avx512(&bfp_com_req, &bfp_com_rsp);
int16_t first_half_len = bfp_com_rsp.len; int16_t first_half_len = bfp_com_rsp.len;
dst1 = dst2 + first_half_len; dst1 = dst2 + first_half_len;
bfp_com_req.data_in = (int16_t*)src1; bfp_com_req.data_in = (int16_t*)src1;
bfp_com_req.numRBs = p_prbMapElm->nRBSize/2; bfp_com_req.numRBs = p_prbMapElm->nRBSize/2;
bfp_com_req.len = payload_len/2; bfp_com_req.len = payload_len/2;
bfp_com_req.compMethod = p_prbMapElm->compMethod; bfp_com_req.compMethod = p_prbMapElm->compMethod;
bfp_com_req.iqWidth = p_prbMapElm->iqWidth; bfp_com_req.iqWidth = p_prbMapElm->iqWidth;
bfp_com_rsp.data_out = (int8_t*)dst1; bfp_com_rsp.data_out = (int8_t*)dst1;
bfp_com_rsp.len = 0; bfp_com_rsp.len = 0;
xranlib_compress_avx512(&bfp_com_req, &bfp_com_rsp); xranlib_compress_avx512(&bfp_com_req, &bfp_com_rsp);
payload_len = bfp_com_rsp.len+first_half_len; payload_len = bfp_com_rsp.len+first_half_len;
}else { */
printf ("p_prbMapElm->compMethod == %d is not supported\n", }else {
p_prbMapElm->compMethod); printf ("p_prbMapElm->compMethod == %d is not supported\n",
exit(-1); p_prbMapElm->compMethod);
} exit(-1);
}
p_sec_desc->iq_buffer_offset = RTE_PTR_DIFF(dst, u8dptr); p_sec_desc->iq_buffer_offset = RTE_PTR_DIFF(dst, u8dptr);
p_sec_desc->iq_buffer_len = payload_len; p_sec_desc->iq_buffer_len = payload_len;
dst += payload_len; dst += payload_len;
dst = xran_add_hdr_offset(dst, p_prbMapElm->compMethod); dst = xran_add_hdr_offset(dst, p_prbMapElm->compMethod);
} }
// The tti should be updated as it increased. // The tti should be updated as it increased.
pRbMap->tti_id = tti; pRbMap->tti_id = tti;
} else { } else {
exit(-1); exit(-1);
printf("ptr ==NULL\n"); printf("ptr ==NULL\n");
} }
} }
} }
} }
return(0); return(0);
} }
......
...@@ -221,8 +221,9 @@ void oran_fh_if4p5_south_in(RU_t *ru, ...@@ -221,8 +221,9 @@ void oran_fh_if4p5_south_in(RU_t *ru,
RU_proc_t *proc = &ru->proc; RU_proc_t *proc = &ru->proc;
extern uint16_t sl_ahead; extern uint16_t sl_ahead;
int f, sl; int f, sl;
start_meas(&ru->rx_fhaul);
int ret = xran_fh_rx_read_slot(&ru_info, &f, &sl); int ret = xran_fh_rx_read_slot(&ru_info, &f, &sl);
stop_meas(&ru->rx_fhaul);
LOG_D(PHY,"Read %d.%d\n",f,sl); LOG_D(PHY,"Read %d.%d\n",f,sl);
if (ret != 0){ if (ret != 0){
printf("ORAN: %d.%d ORAN_fh_if4p5_south_in ERROR in RX function \n",f,sl); printf("ORAN: %d.%d ORAN_fh_if4p5_south_in ERROR in RX function \n",f,sl);
...@@ -261,7 +262,7 @@ void oran_fh_if4p5_south_out(RU_t *ru, ...@@ -261,7 +262,7 @@ void oran_fh_if4p5_south_out(RU_t *ru,
{ {
openair0_device *device = &ru->ifdevice; openair0_device *device = &ru->ifdevice;
oran_eth_state_t *s = device->priv; oran_eth_state_t *s = device->priv;
start_meas(&ru->tx_fhaul);
ru_info_t ru_info; ru_info_t ru_info;
ru_info.nb_tx = ru->nb_tx; ru_info.nb_tx = ru->nb_tx;
ru_info.txdataF_BF = ru->common.txdataF_BF; ru_info.txdataF_BF = ru->common.txdataF_BF;
...@@ -271,6 +272,7 @@ void oran_fh_if4p5_south_out(RU_t *ru, ...@@ -271,6 +272,7 @@ void oran_fh_if4p5_south_out(RU_t *ru,
if (ret != 0){ if (ret != 0){
printf("ORAN: ORAN_fh_if4p5_south_out ERROR in TX function \n"); printf("ORAN: ORAN_fh_if4p5_south_out ERROR in TX function \n");
} }
stop_meas(&ru->tx_fhaul);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment