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,7 +358,6 @@ static size_t dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output, size ...@@ -358,7 +358,6 @@ 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);
......
...@@ -262,6 +262,8 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot){ ...@@ -262,6 +262,8 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot){
#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;
...@@ -295,12 +297,6 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot){ ...@@ -295,12 +297,6 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot){
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;
uint8_t *dst1 = (uint8_t *)pos;
// second half
uint8_t *src2 = (uint8_t *)u8dptr;
uint8_t *dst2 = (uint8_t *)pos;
struct xran_prb_elm* p_prbMapElm = &pRbMap->prbMap[idxElm]; struct xran_prb_elm* p_prbMapElm = &pRbMap->prbMap[idxElm];
...@@ -310,6 +306,14 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot){ ...@@ -310,6 +306,14 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot){
idxElm,pRbMap->prbMap[idxElm].nRBStart,pRbMap->prbMap[idxElm].nRBSize); idxElm,pRbMap->prbMap[idxElm].nRBStart,pRbMap->prbMap[idxElm].nRBSize);
struct xran_section_desc *p_sec_desc = NULL; struct xran_section_desc *p_sec_desc = NULL;
p_prbMapElm = &pRbMap->prbMap[idxElm]; p_prbMapElm = &pRbMap->prbMap[idxElm];
int pos_len=0;
int neg_len=0;
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;
#ifdef ORAN_BRONZE #ifdef ORAN_BRONZE
p_sec_desc = p_prbMapElm->p_sec_desc[sym_id]; p_sec_desc = p_prbMapElm->p_sec_desc[sym_id];
if(pRbMap->nPrbElm==1 && idxElm==0){ if(pRbMap->nPrbElm==1 && idxElm==0){
...@@ -323,25 +327,24 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot){ ...@@ -323,25 +327,24 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot){
src = p_sec_desc->pData; src = p_sec_desc->pData;
} }
src2 = src;
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. // Calculation of the pointer for the section in the buffer.
// first half // positive half
dst1 = (uint8_t *)(pos + p_prbMapElm->nRBStart*N_SC_PER_PRB); uint8_t *dst1 = (uint8_t *)(pos+(neg_len == 0 ? ((p_prbMapElm->nRBStart*N_SC_PER_PRB)-(nPRBs*6)) : 0));
// second half // negative half
dst2 = (uint8_t *)(pos + (p_prbMapElm->nRBStart*N_SC_PER_PRB + 3276/2) + 4096 - 3276); uint8_t *dst2 = (uint8_t *)(pos + (p_prbMapElm->nRBStart*N_SC_PER_PRB) + fftsize - (nPRBs*6));
// NOTE: ggc 11 knows how to generate AVX2 for this!
if(p_prbMapElm->compMethod == XRAN_COMPMETHOD_NONE) { if(p_prbMapElm->compMethod == XRAN_COMPMETHOD_NONE) {
payload_len = p_prbMapElm->nRBSize*N_SC_PER_PRB*4L; int32_t local_dst[p_prbMapElm->nRBSize*N_SC_PER_PRB] __attribute__((aligned(64)));
src1 = src2 + payload_len/2; for (idx = 0; idx < p_prbMapElm->nRBSize*N_SC_PER_PRB*2; idx++)
for (idx = 0; idx < payload_len/(2*sizeof(int16_t)); idx++) { ((int16_t *)local_dst)[idx] = ((int16_t)ntohs(((uint16_t *)src)[idx]))>>2;
((int16_t *)dst1)[idx] = ((int16_t)ntohs(((uint16_t *)src1)[idx]))>>4;
((int16_t *)dst2)[idx] = ((int16_t)ntohs(((uint16_t *)src2)[idx]))>>4; memcpy((void*)dst2,(void*)local_dst,neg_len*4);
//if (sym_idx==0 && idx<16) LOG_I(PHY,"%d: %d,%d\n",idx,((int16_t *)dst1)[idx],((int16_t *)dst1)[idx]); memcpy((void*)dst1,(void*)&local_dst[neg_len],pos_len*4);
}
} else if (p_prbMapElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) { } else if (p_prbMapElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) {
struct xranlib_decompress_request bfp_decom_req_2; struct xranlib_decompress_request bfp_decom_req_2;
struct xranlib_decompress_response bfp_decom_rsp_2; struct xranlib_decompress_response bfp_decom_rsp_2;
...@@ -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,7 +384,8 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot){ ...@@ -381,7 +384,8 @@ 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 { */
} else {
printf ("p_prbMapElm->compMethod == %d is not supported\n", printf ("p_prbMapElm->compMethod == %d is not supported\n",
p_prbMapElm->compMethod); p_prbMapElm->compMethod);
exit(-1); exit(-1);
...@@ -506,6 +510,8 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp) ...@@ -506,6 +510,8 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp)
#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;
...@@ -538,12 +544,6 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp) ...@@ -538,12 +544,6 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp)
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;
uint8_t *src1 = (uint8_t *)pos;
// second half
uint8_t *dst2 = (uint8_t *)u8dptr;
uint8_t *src2 = (uint8_t *)pos;
struct xran_prb_elm* p_prbMapElm = &pRbMap->prbMap[idxElm]; struct xran_prb_elm* p_prbMapElm = &pRbMap->prbMap[idxElm];
...@@ -560,25 +560,34 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp) ...@@ -560,25 +560,34 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp)
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);
} }
uint16_t *dst16 = (uint16_t *)dst;
int pos_len=0;
int neg_len=0;
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. // Calculation of the pointer for the section in the buffer.
// first half // start of positive frequency component
src1 = (uint8_t *)(pos + p_prbMapElm->nRBStart*N_SC_PER_PRB); uint16_t *src1 = (uint16_t *)&pos[(neg_len==0)?((p_prbMapElm->nRBStart*N_SC_PER_PRB)-(nPRBs*6)):0];
// second half // start of negative frequency component
src2 = (uint8_t *)(pos + (p_prbMapElm->nRBStart*N_SC_PER_PRB + 3276/2) + 4096 - 3276); uint16_t *src2 = (uint16_t *)&pos[(p_prbMapElm->nRBStart*N_SC_PER_PRB) + fftsize - (nPRBs*6)];
if(p_prbMapElm->compMethod == XRAN_COMPMETHOD_NONE) { 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++)
((uint16_t *)dst16)[idx] = htons(((uint16_t *)local_src)[idx]);
} else if (p_prbMapElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) { } else if (p_prbMapElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) {
printf("idxElm=%d, compMeth==BLKFLOAT\n",idxElm); printf("idxElm=%d, compMeth==BLKFLOAT\n",idxElm);
struct xranlib_compress_request bfp_com_req; struct xranlib_compress_request bfp_com_req;
...@@ -586,10 +595,10 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp) ...@@ -586,10 +595,10 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp)
memset(&bfp_com_req, 0, sizeof(struct xranlib_compress_request)); memset(&bfp_com_req, 0, sizeof(struct xranlib_compress_request));
memset(&bfp_com_rsp, 0, sizeof(struct xranlib_compress_response)); memset(&bfp_com_rsp, 0, sizeof(struct xranlib_compress_response));
/*
bfp_com_req.data_in = (int16_t*)src2; bfp_com_req.data_in = (int16_t*)src2;
bfp_com_req.numRBs = p_prbMapElm->nRBSize/2; bfp_com_req.numRBs = first_len;//p_prbMapElm->nRBSize/2;
bfp_com_req.len = payload_len/2; bfp_com_req.len = first_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;
...@@ -613,6 +622,7 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp) ...@@ -613,6 +622,7 @@ int xran_fh_tx_send_slot(ru_info_t *ru, int frame, int slot, uint64_t timestamp)
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 { }else {
printf ("p_prbMapElm->compMethod == %d is not supported\n", printf ("p_prbMapElm->compMethod == %d is not supported\n",
p_prbMapElm->compMethod); p_prbMapElm->compMethod);
......
...@@ -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