mirror of
https://gitlab.eurecom.fr/oai/openairinterface5g.git
synced 2026-07-13 04:30:28 +00:00
fapi: add spatial steam mapping for MU-MIMO
Update copy functions and ctest. Signed-off-by: Sakthivel Velumani <s.velumani@northeastern.edu>
This commit is contained in:
@@ -52,7 +52,7 @@ uint32_t pullarray32(uint8_t **values_to_pull,
|
||||
uint32_t pullarrays32(uint8_t **in, int32_t out[], uint32_t max_len, uint32_t len, uint8_t *end);
|
||||
|
||||
uint32_t pusharray8(uint8_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
|
||||
uint32_t pusharray16(uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
|
||||
uint32_t pusharray16(const uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
|
||||
uint32_t pusharrays16(int16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end);
|
||||
uint32_t pusharray32(const uint32_t *values_to_push,
|
||||
uint32_t max_num_values_to_push,
|
||||
|
||||
@@ -381,7 +381,7 @@ uint32_t pullarrays16(uint8_t **in, int16_t out[], uint32_t max_len, uint32_t le
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
uint32_t pusharray16(uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end)
|
||||
uint32_t pusharray16(const uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end)
|
||||
{
|
||||
if (len == 0)
|
||||
return 1;
|
||||
|
||||
@@ -268,6 +268,17 @@ static uint8_t pack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppWritePa
|
||||
if(!pack_nr_tx_beamforming_pdu(&value->precodingAndBeamforming,ppWritePackedMsg, end)) {
|
||||
return 0;
|
||||
}
|
||||
#ifndef ENABLE_AERIAL
|
||||
if (!push8(value->param_v4.numSpatialStreamIndices, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
|
||||
if (!pusharray8(value->param_v4.spatialStreamIndices,
|
||||
MAX_NUM_SPATIAL_STREAMS,
|
||||
value->param_v4.numSpatialStreamIndices,
|
||||
ppWritePackedMsg,
|
||||
end))
|
||||
return 0;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -307,6 +318,31 @@ static uint8_t pack_dl_tti_pdcch_pdu_rel15_value(void *tlv, uint8_t **ppWritePac
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef ENABLE_AERIAL
|
||||
// Spatial steam indices for MU-MIMO
|
||||
const nfapi_v4_pdcch_pdu_parameters_t *p = &value->param_v4;
|
||||
if (!push16(p->numSpatialStreams, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
|
||||
for (uint_fast16_t i = 0; i < p->numSpatialStreams; i++)
|
||||
if (!(push16(p->dci_spatialStreamIndices[i].dci_index, ppWritePackedMsg, end)
|
||||
&& push16(p->dci_spatialStreamIndices[i].spatial_stream_index, ppWritePackedMsg, end)))
|
||||
return 0;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline uint8_t pack_spatial_stream_indices(const nfapi_nr_spatial_stream_index_t *ss,
|
||||
uint8_t **ppWritePackedMsg,
|
||||
uint8_t *end)
|
||||
{
|
||||
if (!push8(ss->numSpatialStreamIndices, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
|
||||
if (!pusharray16(ss->spatialStreamIndices, MAX_NUM_SPATIAL_STREAMS, ss->numSpatialStreamIndices, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -369,6 +405,14 @@ static uint8_t pack_dl_tti_pdsch_pdu_rel15_value(void *tlv, uint8_t **ppWritePac
|
||||
if (!push8(value->maintenance_parms_v3.ldpcBaseGraph, ppWritePackedMsg, end)
|
||||
|| !push32(value->maintenance_parms_v3.tbSizeLbrmBytes, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
|
||||
// PDSCH parameter in FAPI v4 for MU-MIMO spatial stream indexing
|
||||
if (!push8(value->param_v4.numberCodewords, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
|
||||
for (uint_fast8_t c = 0; c < value->param_v4.numberCodewords; c++)
|
||||
if (!pack_spatial_stream_indices(value->param_v4.spatialStreamsCw + c, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
@@ -390,6 +434,11 @@ static uint8_t pack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppWritePacke
|
||||
if(!pack_nr_tx_beamforming_pdu(&value->precoding_and_beamforming,ppWritePackedMsg, end)) {
|
||||
return 0;
|
||||
}
|
||||
#ifndef ENABLE_AERIAL
|
||||
if (!(push8(value->param_v4.spatialStreamIndexPresent, ppWritePackedMsg, end)
|
||||
&& push16(value->param_v4.spatialStreamIndex, ppWritePackedMsg, end)))
|
||||
return 0;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -517,6 +566,30 @@ static uint8_t unpack_dl_tti_pdcch_pdu_rel15_value(void *tlv, uint8_t **ppReadPa
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef ENABLE_AERIAL
|
||||
// Spatial steam indices for MU-MIMO
|
||||
nfapi_v4_pdcch_pdu_parameters_t *p = &value->param_v4;
|
||||
if (!pull16(ppReadPackedMsg, &p->numSpatialStreams, end))
|
||||
return 0;
|
||||
|
||||
for (uint_fast16_t i = 0; i < p->numSpatialStreams; i++) {
|
||||
if (!(pull16(ppReadPackedMsg, &p->dci_spatialStreamIndices[i].dci_index, end)
|
||||
&& pull16(ppReadPackedMsg, &p->dci_spatialStreamIndices[i].spatial_stream_index, end)))
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline uint8_t unpack_spatial_stream_indices(nfapi_nr_spatial_stream_index_t *ss, uint8_t **ppReadPackedMsg, uint8_t *end)
|
||||
{
|
||||
if (!pull8(ppReadPackedMsg, &ss->numSpatialStreamIndices, end))
|
||||
return 0;
|
||||
|
||||
if (!pullarray16(ppReadPackedMsg, ss->spatialStreamIndices, MAX_NUM_SPATIAL_STREAMS, ss->numSpatialStreamIndices, end))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -579,6 +652,14 @@ static uint8_t unpack_dl_tti_pdsch_pdu_rel15_value(void *tlv, uint8_t **ppReadPa
|
||||
if (!pull8(ppReadPackedMsg, &value->maintenance_parms_v3.ldpcBaseGraph, end)
|
||||
|| !pull32(ppReadPackedMsg, &value->maintenance_parms_v3.tbSizeLbrmBytes, end))
|
||||
return 0;
|
||||
|
||||
// PDSCH parameter in FAPI v4 for MU-MIMO spatial stream indexing
|
||||
if (!pull8(ppReadPackedMsg, &value->param_v4.numberCodewords, end))
|
||||
return 0;
|
||||
|
||||
for (uint_fast8_t c = 0; c < value->param_v4.numberCodewords; c++)
|
||||
if (!unpack_spatial_stream_indices(value->param_v4.spatialStreamsCw + c, ppReadPackedMsg, end))
|
||||
return 0;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
@@ -602,6 +683,17 @@ static uint8_t unpack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppReadP
|
||||
if(!unpack_nr_tx_beamforming_pdu(&value->precodingAndBeamforming, ppReadPackedMsg, end)) {
|
||||
return 0;
|
||||
}
|
||||
#ifndef ENABLE_AERIAL
|
||||
if (!pull8(ppReadPackedMsg, &value->param_v4.numSpatialStreamIndices, end))
|
||||
return 0;
|
||||
|
||||
if (!pullarray8(ppReadPackedMsg,
|
||||
value->param_v4.spatialStreamIndices,
|
||||
MAX_NUM_SPATIAL_STREAMS,
|
||||
value->param_v4.numSpatialStreamIndices,
|
||||
end))
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -626,6 +718,11 @@ static uint8_t unpack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppReadPack
|
||||
if(!unpack_nr_tx_beamforming_pdu(&value->precoding_and_beamforming, ppReadPackedMsg, end)) {
|
||||
return 0;
|
||||
}
|
||||
#ifndef ENABLE_AERIAL
|
||||
if (!(pull8(ppReadPackedMsg, &value->param_v4.spatialStreamIndexPresent, end)
|
||||
&& pull16(ppReadPackedMsg, &value->param_v4.spatialStreamIndex, end)))
|
||||
return 0;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -725,7 +822,14 @@ static uint8_t pack_ul_tti_request_prach_pdu(const nfapi_nr_prach_pdu_t *prach_p
|
||||
return 0;
|
||||
}
|
||||
|
||||
return pack_nr_rx_beamforming_pdu(&prach_pdu->beamforming, ppWritePackedMsg, end);
|
||||
if (!pack_nr_rx_beamforming_pdu(&prach_pdu->beamforming, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
|
||||
const nfapi_nr_spatial_stream_index_t *p = &prach_pdu->param_v4;
|
||||
if (!pack_spatial_stream_indices(p, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uint8_t pack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
|
||||
@@ -817,7 +921,8 @@ static uint8_t pack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, ui
|
||||
}
|
||||
#ifndef ENABLE_AERIAL
|
||||
if (!(push8(pusch_pdu->maintenance_parms_v3.ldpcBaseGraph, ppWritePackedMsg, end)
|
||||
&& push32(pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes, ppWritePackedMsg, end)))
|
||||
&& push32(pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes, ppWritePackedMsg, end)
|
||||
&& pack_spatial_stream_indices(&pusch_pdu->param_v4, ppWritePackedMsg, end)))
|
||||
return 0;
|
||||
#endif
|
||||
return 1;
|
||||
@@ -845,7 +950,15 @@ static uint8_t pack_ul_tti_request_pucch_pdu(const nfapi_nr_pucch_pdu_t *pucch_p
|
||||
return 0;
|
||||
}
|
||||
|
||||
return pack_nr_rx_beamforming_pdu(&pucch_pdu->beamforming, ppWritePackedMsg, end);
|
||||
if (!pack_nr_rx_beamforming_pdu(&pucch_pdu->beamforming, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
|
||||
#ifndef ENABLE_AERIAL
|
||||
if (!pack_spatial_stream_indices(&pucch_pdu->param_v4, ppWritePackedMsg, end))
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uint8_t pack_ul_tti_request_srs_parameters_v4(nfapi_v4_srs_parameters_t *srsParameters,
|
||||
@@ -1050,7 +1163,14 @@ static uint8_t unpack_ul_tti_request_prach_pdu(nfapi_nr_prach_pdu_t *prach_pdu,
|
||||
return 0;
|
||||
}
|
||||
|
||||
return unpack_nr_rx_beamforming_pdu(&prach_pdu->beamforming, ppReadPackedMsg, end);
|
||||
if (!unpack_nr_rx_beamforming_pdu(&prach_pdu->beamforming, ppReadPackedMsg, end))
|
||||
return 0;
|
||||
#ifndef ENABLE_AERIAL
|
||||
if (!unpack_spatial_stream_indices(&prach_pdu->param_v4, ppReadPackedMsg, end))
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uint8_t unpack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, uint8_t **ppReadPackedMsg, uint8_t *end)
|
||||
@@ -1139,7 +1259,8 @@ static uint8_t unpack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu,
|
||||
}
|
||||
#ifndef ENABLE_AERIAL
|
||||
if (!(pull8(ppReadPackedMsg, &pusch_pdu->maintenance_parms_v3.ldpcBaseGraph, end)
|
||||
&& pull32(ppReadPackedMsg, &pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes, end)))
|
||||
&& pull32(ppReadPackedMsg, &pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes, end)
|
||||
&& unpack_spatial_stream_indices(&pusch_pdu->param_v4, ppReadPackedMsg, end)))
|
||||
return 0;
|
||||
#endif
|
||||
return 1;
|
||||
@@ -1166,7 +1287,14 @@ static uint8_t unpack_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t *pucch_pdu,
|
||||
&& pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part2, end))) {
|
||||
return 0;
|
||||
}
|
||||
return unpack_nr_rx_beamforming_pdu(&pucch_pdu->beamforming, ppReadPackedMsg, end);
|
||||
if (!unpack_nr_rx_beamforming_pdu(&pucch_pdu->beamforming, ppReadPackedMsg, end))
|
||||
return 0;
|
||||
|
||||
#ifndef ENABLE_AERIAL
|
||||
if (!unpack_spatial_stream_indices(&pucch_pdu->param_v4, ppReadPackedMsg, end))
|
||||
return 0;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
static uint8_t unpack_ul_tti_request_srs_parameters_v4(nfapi_v4_srs_parameters_t *srsParameters,
|
||||
|
||||
@@ -1020,6 +1020,10 @@ static void copy_dl_tti_request_pdcch_pdu(const nfapi_nr_dl_tti_pdcch_pdu_rel15_
|
||||
copy_dl_tti_beamforming(&src_dci_pdu->precodingAndBeamforming, &dst_dci_pdu->precodingAndBeamforming);
|
||||
PARTIAL_COPY_RANGE(dst_dci_pdu, src_dci_pdu, nfapi_nr_dl_dci_pdu_t, beta_PDCCH_1_0, Payload);
|
||||
}
|
||||
dst->param_v4.numSpatialStreams = src->param_v4.numSpatialStreams;
|
||||
for (uint_fast16_t i = 0; i < dst->param_v4.numSpatialStreams; i++) {
|
||||
dst->param_v4.dci_spatialStreamIndices[i] = src->param_v4.dci_spatialStreamIndices[i];
|
||||
}
|
||||
}
|
||||
|
||||
static void copy_dl_tti_request_pdsch_pdu(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t *src, nfapi_nr_dl_tti_pdsch_pdu_rel15_t *dst)
|
||||
@@ -1027,18 +1031,28 @@ static void copy_dl_tti_request_pdsch_pdu(const nfapi_nr_dl_tti_pdsch_pdu_rel15_
|
||||
PARTIAL_COPY(dst, src, nfapi_nr_dl_tti_pdsch_pdu_rel15_t, nEpreRatioOfPDSCHToPTRS);
|
||||
copy_dl_tti_beamforming(&src->precodingAndBeamforming, &dst->precodingAndBeamforming);
|
||||
PARTIAL_COPY_RANGE(dst, src, nfapi_nr_dl_tti_pdsch_pdu_rel15_t, powerControlOffset, maintenance_parms_v3);
|
||||
dst->param_v4.numberCodewords = src->param_v4.numberCodewords;
|
||||
for (uint_fast8_t i = 0; i < dst->param_v4.numberCodewords; i++) {
|
||||
const nfapi_nr_spatial_stream_index_t *s = src->param_v4.spatialStreamsCw + i;
|
||||
nfapi_nr_spatial_stream_index_t *d = dst->param_v4.spatialStreamsCw + i;
|
||||
COPY_STRUCT_ARRAY(d, s, spatialStreamIndices, numSpatialStreamIndices);
|
||||
}
|
||||
}
|
||||
|
||||
static void copy_dl_tti_request_csi_rs_pdu(const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *src, nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *dst)
|
||||
{
|
||||
PARTIAL_COPY(dst, src, nfapi_nr_dl_tti_csi_rs_pdu_rel15_t, power_control_offset_ss);
|
||||
copy_dl_tti_beamforming(&src->precodingAndBeamforming, &dst->precodingAndBeamforming);
|
||||
const struct nfapi_nr_csi_spatial_stream_index *s = &src->param_v4;
|
||||
struct nfapi_nr_csi_spatial_stream_index *d = &dst->param_v4;
|
||||
COPY_STRUCT_ARRAY(d, s, spatialStreamIndices, numSpatialStreamIndices);
|
||||
}
|
||||
|
||||
static void copy_dl_tti_request_ssb_pdu(const nfapi_nr_dl_tti_ssb_pdu_rel15_t *src, nfapi_nr_dl_tti_ssb_pdu_rel15_t *dst)
|
||||
{
|
||||
PARTIAL_COPY(dst, src, nfapi_nr_dl_tti_ssb_pdu_rel15_t, ssbRsrp);
|
||||
copy_dl_tti_beamforming(&src->precoding_and_beamforming, &dst->precoding_and_beamforming);
|
||||
dst->param_v4 = src->param_v4;
|
||||
}
|
||||
|
||||
static void copy_dl_tti_request_pdu(const nfapi_nr_dl_tti_request_pdu_t *src, nfapi_nr_dl_tti_request_pdu_t *dst)
|
||||
@@ -1113,6 +1127,9 @@ static void copy_ul_tti_request_prach_pdu(const nfapi_nr_prach_pdu_t *src, nfapi
|
||||
{
|
||||
PARTIAL_COPY(dst, src, nfapi_nr_prach_pdu_t, num_cs);
|
||||
copy_ul_tti_beamforming(&src->beamforming, &dst->beamforming);
|
||||
const nfapi_nr_spatial_stream_index_t *s = &src->param_v4;
|
||||
nfapi_nr_spatial_stream_index_t *d = &dst->param_v4;
|
||||
COPY_STRUCT_ARRAY(d, s, spatialStreamIndices, numSpatialStreamIndices);
|
||||
}
|
||||
|
||||
static void copy_ul_tti_request_pusch_pdu(const nfapi_nr_pusch_pdu_t *src, nfapi_nr_pusch_pdu_t *dst)
|
||||
@@ -1152,12 +1169,18 @@ static void copy_ul_tti_request_pusch_pdu(const nfapi_nr_pusch_pdu_t *src, nfapi
|
||||
copy_ul_tti_beamforming(&src->beamforming, &dst->beamforming);
|
||||
dst->maintenance_parms_v3.ldpcBaseGraph = src->maintenance_parms_v3.ldpcBaseGraph;
|
||||
dst->maintenance_parms_v3.tbSizeLbrmBytes = src->maintenance_parms_v3.tbSizeLbrmBytes;
|
||||
const nfapi_nr_spatial_stream_index_t *s = &src->param_v4;
|
||||
nfapi_nr_spatial_stream_index_t *d = &dst->param_v4;
|
||||
COPY_STRUCT_ARRAY(d, s, spatialStreamIndices, numSpatialStreamIndices);
|
||||
}
|
||||
|
||||
static void copy_ul_tti_request_pucch_pdu(const nfapi_nr_pucch_pdu_t *src, nfapi_nr_pucch_pdu_t *dst)
|
||||
{
|
||||
PARTIAL_COPY(dst, src, nfapi_nr_pucch_pdu_t, bit_len_csi_part2);
|
||||
copy_ul_tti_beamforming(&src->beamforming, &dst->beamforming);
|
||||
const nfapi_nr_spatial_stream_index_t *s = &src->param_v4;
|
||||
nfapi_nr_spatial_stream_index_t *d = &dst->param_v4;
|
||||
COPY_STRUCT_ARRAY(d, s, spatialStreamIndices, numSpatialStreamIndices);
|
||||
}
|
||||
|
||||
static void copy_ul_tti_request_srs_parameters(const nfapi_v4_srs_parameters_t *src,
|
||||
|
||||
@@ -853,6 +853,21 @@ typedef struct {
|
||||
|
||||
} nfapi_nr_dl_dci_pdu_t;
|
||||
|
||||
// The maximum number of spatial streams to be mapped depends on TLV 0x16E and
|
||||
// the number of streams could be same as number of layers or number of antenna
|
||||
// ports or number of baseband ports. Hence we set this to be the maximum number
|
||||
// of baseband ports
|
||||
#define MAX_NUM_SPATIAL_STREAMS 16
|
||||
|
||||
typedef struct {
|
||||
uint16_t dci_index;
|
||||
uint16_t spatial_stream_index;
|
||||
} nfapi_v4_dci_spatial_stream_index_t;
|
||||
|
||||
typedef struct {
|
||||
uint16_t numSpatialStreams;
|
||||
nfapi_v4_dci_spatial_stream_index_t dci_spatialStreamIndices[MAX_NUM_SPATIAL_STREAMS];
|
||||
} nfapi_v4_pdcch_pdu_parameters_t;
|
||||
|
||||
typedef struct {
|
||||
///Bandwidth part size [TS38.213 sec12]. Number of contiguous PRBs allocated to the BWP,Value: 1->275
|
||||
@@ -885,13 +900,32 @@ typedef struct {
|
||||
uint16_t numDlDci;
|
||||
///DL DCI PDU
|
||||
nfapi_nr_dl_dci_pdu_t dci_pdu[MAX_DCI_CORESET];
|
||||
} nfapi_nr_dl_tti_pdcch_pdu_rel15_t;
|
||||
/// Spatial stream indexing for MU-MIMO
|
||||
nfapi_v4_pdcch_pdu_parameters_t param_v4;
|
||||
} nfapi_nr_dl_tti_pdcch_pdu_rel15_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t ldpcBaseGraph;
|
||||
uint32_t tbSizeLbrmBytes;
|
||||
}nfapi_v3_pdsch_maintenance_parameters_t;
|
||||
|
||||
typedef struct {
|
||||
/// Number of spatial streams used in the index array
|
||||
uint8_t numSpatialStreamIndices;
|
||||
/// Spatial stream index array
|
||||
uint16_t spatialStreamIndices[MAX_NUM_SPATIAL_STREAMS];
|
||||
} nfapi_nr_spatial_stream_index_t;
|
||||
|
||||
#define MAX_NUM_CODEWORDS 2
|
||||
|
||||
typedef struct {
|
||||
// MU-MIMO support in FAPIv4
|
||||
/// Number of codewords with spatial stream indices
|
||||
uint8_t numberCodewords;
|
||||
/// Spatial stream indexing for codeworeds
|
||||
nfapi_nr_spatial_stream_index_t spatialStreamsCw[MAX_NUM_CODEWORDS];
|
||||
} nfapi_v4_pdsch_parameters_t;
|
||||
|
||||
typedef struct {
|
||||
uint16_t pduBitmap;
|
||||
uint16_t rnti;
|
||||
@@ -984,8 +1018,9 @@ typedef struct {
|
||||
uint32_t dlTbCrc;
|
||||
|
||||
nfapi_v3_pdsch_maintenance_parameters_t maintenance_parms_v3;
|
||||
}nfapi_nr_dl_tti_pdsch_pdu_rel15_t;
|
||||
|
||||
/// PDSCH parameters FAPI v4. used only for spatial stream indexing in MU-MIMO
|
||||
nfapi_v4_pdsch_parameters_t param_v4;
|
||||
} nfapi_nr_dl_tti_pdsch_pdu_rel15_t;
|
||||
|
||||
//for pdsch_pdu:
|
||||
/*
|
||||
@@ -1069,9 +1104,15 @@ typedef struct
|
||||
uint8_t power_control_offset; // Ratio of PDSCH EPRE to NZP CSI-RSEPRE [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->23 representing -8 to 15 dB in 1dB steps; 255: L1 is configured with ProfileSSS
|
||||
uint8_t power_control_offset_ss; // Ratio of NZP CSI-RS EPRE to SSB/PBCH block EPRE [3GPP TS 38.214, sec 5.2.2.3.1], Values: 0: -3dB; 1: 0dB; 2: 3dB; 3: 6dB; 255: L1 is configured with ProfileSSS
|
||||
nfapi_nr_tx_precoding_and_beamforming_t precodingAndBeamforming;
|
||||
/// Spatial stream indexing for MU-MIMO
|
||||
struct nfapi_nr_csi_spatial_stream_index {
|
||||
/// Number of spatial streams used in the index array
|
||||
uint8_t numSpatialStreamIndices;
|
||||
/// Spatial stream index array
|
||||
uint8_t spatialStreamIndices[MAX_NUM_SPATIAL_STREAMS];
|
||||
} param_v4;
|
||||
} nfapi_nr_dl_tti_csi_rs_pdu_rel15_t;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t bch_payload;//BCH payload. The valid bits are indicated in the PARAM/CONFIG TLVs. If PARAM/CONFIG TLVs indicate MAC generates full bchPayload then the payload length is 31 bits with the 8 LSB bits being. Otherwise timing PBCH bits are generated by the PHY. And for bchPayload the 24 LSB are used.
|
||||
@@ -1112,6 +1153,11 @@ typedef struct {
|
||||
/// A value indicating the channel quality between the gNB and nrUE. Value: 0->255 dBM
|
||||
uint8_t ssbRsrp;
|
||||
nfapi_nr_tx_precoding_and_beamforming_t precoding_and_beamforming;
|
||||
/// Spatial stream indexing
|
||||
struct nfapi_v4_ssb_param {
|
||||
uint8_t spatialStreamIndexPresent;
|
||||
uint16_t spatialStreamIndex;
|
||||
} param_v4;
|
||||
} nfapi_nr_dl_tti_ssb_pdu_rel15_t;
|
||||
|
||||
typedef struct {
|
||||
@@ -1279,7 +1325,7 @@ typedef struct
|
||||
uint8_t prach_start_symbol;
|
||||
uint16_t num_cs;
|
||||
nfapi_nr_ul_beamforming_t beamforming;
|
||||
|
||||
nfapi_nr_spatial_stream_index_t param_v4;
|
||||
} nfapi_nr_prach_pdu_t;
|
||||
|
||||
//for pusch_pdu:
|
||||
@@ -1392,6 +1438,8 @@ typedef struct
|
||||
//beamforming
|
||||
nfapi_nr_ul_beamforming_t beamforming;
|
||||
nfapi_v3_pdsch_maintenance_parameters_t maintenance_parms_v3;
|
||||
// Spatial stream indexing for MU-MIMO
|
||||
nfapi_nr_spatial_stream_index_t param_v4;
|
||||
} nfapi_nr_pusch_pdu_t;
|
||||
|
||||
//for pucch_pdu:
|
||||
@@ -1437,7 +1485,7 @@ typedef struct
|
||||
uint16_t bit_len_csi_part2;
|
||||
|
||||
nfapi_nr_ul_beamforming_t beamforming;
|
||||
|
||||
nfapi_nr_spatial_stream_index_t param_v4;
|
||||
} nfapi_nr_pucch_pdu_t;
|
||||
|
||||
typedef struct {
|
||||
|
||||
20
nfapi/tests/p7/nr_fapi_common_util_test.h
Normal file
20
nfapi/tests/p7/nr_fapi_common_util_test.h
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* SPDX-License-Identifier: LicenseRef-CSSL-1.0
|
||||
*/
|
||||
#ifndef OPENAIRINTERFACE_NR_FAPI_COMMON_UTIL_TEST_H
|
||||
#define OPENAIRINTERFACE_NR_FAPI_COMMON_UTIL_TEST_H
|
||||
#include "nfapi/tests/nr_fapi_test.h"
|
||||
|
||||
static uint8_t get_num_spatial_streams(void)
|
||||
{
|
||||
const uint16_t max_logical_ant_ports = MAX_NUM_SPATIAL_STREAMS;
|
||||
return rand8_range(0, max_logical_ant_ports);
|
||||
}
|
||||
|
||||
static void fill_spatial_streams(const uint8_t num_s, uint16_t s[MAX_NUM_SPATIAL_STREAMS])
|
||||
{
|
||||
for (int n = 0; n < num_s; n++)
|
||||
s[n] = rand16_range(0, num_s - 1);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "dci_payload_utils.h"
|
||||
#include "nr_fapi_p7.h"
|
||||
#include "nr_fapi_p7_utils.h"
|
||||
#include "nr_fapi_common_util_test.h"
|
||||
|
||||
static void fill_dl_tti_request_beamforming(nfapi_nr_tx_precoding_and_beamforming_t *precodingAndBeamforming)
|
||||
{
|
||||
@@ -48,6 +49,11 @@ static void fill_dl_tti_request_pdcch_pdu(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdu
|
||||
pdu->dci_pdu[dl_dci].PayloadSizeBits = rand16_range(0, DCI_PAYLOAD_BYTE_LEN * 8);
|
||||
generate_payload(pdu->dci_pdu[dl_dci].PayloadSizeBits, pdu->dci_pdu[dl_dci].Payload);
|
||||
}
|
||||
pdu->param_v4.numSpatialStreams = get_num_spatial_streams();
|
||||
for (int n = 0; n < pdu->param_v4.numSpatialStreams; n++) {
|
||||
pdu->param_v4.dci_spatialStreamIndices[n].dci_index = rand16();
|
||||
pdu->param_v4.dci_spatialStreamIndices[n].spatial_stream_index = rand16_range(0, pdu->param_v4.numSpatialStreams - 1);
|
||||
}
|
||||
}
|
||||
|
||||
static void fill_dl_tti_request_pdsch_pdu(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdu)
|
||||
@@ -109,6 +115,12 @@ static void fill_dl_tti_request_pdsch_pdu(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdu
|
||||
}
|
||||
pdu->maintenance_parms_v3.ldpcBaseGraph = rand8();
|
||||
pdu->maintenance_parms_v3.tbSizeLbrmBytes = rand32();
|
||||
pdu->param_v4.numberCodewords = rand8_range(0, MAX_NUM_CODEWORDS);
|
||||
for (int c = 0; c < pdu->param_v4.numberCodewords; c++) {
|
||||
pdu->param_v4.spatialStreamsCw[c].numSpatialStreamIndices = get_num_spatial_streams();
|
||||
fill_spatial_streams(pdu->param_v4.spatialStreamsCw[c].numSpatialStreamIndices,
|
||||
pdu->param_v4.spatialStreamsCw[c].spatialStreamIndices);
|
||||
}
|
||||
}
|
||||
|
||||
static void fill_dl_tti_request_csi_rs_pdu(nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *pdu)
|
||||
@@ -147,6 +159,9 @@ static void fill_dl_tti_request_csi_rs_pdu(nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *p
|
||||
pdu->power_control_offset = rand8_range(0, 23);
|
||||
pdu->power_control_offset_ss = rand8_range(0, 3);
|
||||
fill_dl_tti_request_beamforming(&pdu->precodingAndBeamforming);
|
||||
pdu->param_v4.numSpatialStreamIndices = get_num_spatial_streams();
|
||||
for (int n = 0; n < pdu->param_v4.numSpatialStreamIndices; n++)
|
||||
pdu->param_v4.spatialStreamIndices[n] = rand8_range(0, pdu->param_v4.numSpatialStreamIndices - 1);
|
||||
}
|
||||
|
||||
static void fill_dl_tti_request_ssb_pdu(nfapi_nr_dl_tti_ssb_pdu_rel15_t *pdu)
|
||||
@@ -159,6 +174,8 @@ static void fill_dl_tti_request_ssb_pdu(nfapi_nr_dl_tti_ssb_pdu_rel15_t *pdu)
|
||||
pdu->bchPayloadFlag = rand8_range(0, 2);
|
||||
pdu->bchPayload = rand24();
|
||||
fill_dl_tti_request_beamforming(&pdu->precoding_and_beamforming);
|
||||
pdu->param_v4.spatialStreamIndexPresent = rand8(0, 1);
|
||||
pdu->param_v4.spatialStreamIndex = rand16_range(0, MAX_NUM_SPATIAL_STREAMS);
|
||||
}
|
||||
|
||||
static void fill_dl_tti_request(nfapi_nr_dl_tti_request_t *msg)
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "dci_payload_utils.h"
|
||||
#include "nr_fapi_p7.h"
|
||||
#include "nr_fapi_p7_utils.h"
|
||||
#include "nr_fapi_common_util_test.h"
|
||||
|
||||
static void fill_ul_tti_request_beamforming(nfapi_nr_ul_beamforming_t *beamforming_pdu)
|
||||
{
|
||||
@@ -28,6 +29,8 @@ static void fill_ul_tti_request_prach_pdu(nfapi_nr_prach_pdu_t *pdu)
|
||||
pdu->prach_start_symbol = rand8_range(0, 13);
|
||||
pdu->num_cs = rand16_range(0, 419);
|
||||
fill_ul_tti_request_beamforming(&pdu->beamforming);
|
||||
pdu->param_v4.numSpatialStreamIndices = get_num_spatial_streams();
|
||||
fill_spatial_streams(pdu->param_v4.numSpatialStreamIndices, pdu->param_v4.spatialStreamIndices);
|
||||
}
|
||||
|
||||
static void fill_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pdu)
|
||||
@@ -133,6 +136,8 @@ static void fill_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pdu)
|
||||
fill_ul_tti_request_beamforming(&pdu->beamforming);
|
||||
pdu->maintenance_parms_v3.ldpcBaseGraph = rand8();
|
||||
pdu->maintenance_parms_v3.tbSizeLbrmBytes = rand32();
|
||||
pdu->param_v4.numSpatialStreamIndices = get_num_spatial_streams();
|
||||
fill_spatial_streams(pdu->param_v4.numSpatialStreamIndices, pdu->param_v4.spatialStreamIndices);
|
||||
}
|
||||
|
||||
static void fill_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t *pdu)
|
||||
@@ -247,6 +252,8 @@ static void fill_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t *pdu)
|
||||
}
|
||||
|
||||
fill_ul_tti_request_beamforming(&pdu->beamforming);
|
||||
pdu->param_v4.numSpatialStreamIndices = get_num_spatial_streams();
|
||||
fill_spatial_streams(pdu->param_v4.numSpatialStreamIndices, pdu->param_v4.spatialStreamIndices);
|
||||
}
|
||||
|
||||
static void fill_ul_tti_request_srs_parameters(nfapi_v4_srs_parameters_t *params, const uint8_t num_symbols){
|
||||
|
||||
Reference in New Issue
Block a user