Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lizhongxiao
OpenXG-RAN
Commits
dd5ca817
Commit
dd5ca817
authored
2 years ago
by
francescomani
Committed by
Laurent THOMAS
1 year ago
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
MR2510 handling reception of CSI command for aperiodic CSI reporting
parent
77525618
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
245 additions
and
97 deletions
+245
-97
nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
+7
-13
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
+5
-0
openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
+1
-0
openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
+2
-2
openair2/LAYER2/NR_MAC_UE/mac_defs.h
openair2/LAYER2/NR_MAC_UE/mac_defs.h
+14
-1
openair2/LAYER2/NR_MAC_UE/mac_proto.h
openair2/LAYER2/NR_MAC_UE/mac_proto.h
+38
-17
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+102
-63
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+76
-1
No files found.
nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
View file @
dd5ca817
...
...
@@ -37,18 +37,6 @@
typedef signed char int8_t;
*/
typedef
struct
{
uint8_t
uci_format
;
uint8_t
uci_channel
;
uint8_t
harq_ack_bits
;
uint32_t
harq_ack
;
uint8_t
csi_bits
;
uint32_t
csi
;
uint8_t
sr_bits
;
uint32_t
sr
;
}
fapi_nr_uci_pdu_rel15_t
;
typedef
enum
{
RLM_no_monitoring
=
0
,
RLM_out_of_sync
=
1
,
...
...
@@ -250,10 +238,16 @@ typedef struct
typedef
struct
{
// payloads with fixed array size
// no place to free the dinamically allocated
// vector without L1 implementation
uint16_t
harq_ack_bit_length
;
uint64_t
harq_payload
;
uint16_t
csi_part1_bit_length
;
uint64_t
csi_part1_payload
;
uint16_t
csi_part2_bit_length
;
uint8_t
alpha_scaling
;
uint64_t
csi_part2_payload
;
uint8_t
alpha_scaling
;
// 0 = 0.5, 1 = 0.65, 2 = 0.8, 3 = 1
uint8_t
beta_offset_harq_ack
;
uint8_t
beta_offset_csi1
;
uint8_t
beta_offset_csi2
;
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
View file @
dd5ca817
...
...
@@ -132,6 +132,11 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
const
nfapi_nr_ue_pusch_pdu_t
*
pusch_pdu
=
&
ulsch_ue
->
pusch_pdu
;
uint32_t
tb_size
=
pusch_pdu
->
pusch_data
.
tb_size
;
AssertFatal
(
pusch_pdu
->
pusch_uci
.
harq_ack_bit_length
==
0
&&
pusch_pdu
->
pusch_uci
.
csi_part1_bit_length
==
0
&&
pusch_pdu
->
pusch_uci
.
csi_part2_bit_length
==
0
,
"UCI on PUSCH not supported
\n
"
);
int
start_symbol
=
pusch_pdu
->
start_symbol_index
;
uint16_t
ul_dmrs_symb_pos
=
pusch_pdu
->
ul_dmrs_symb_pos
;
uint8_t
number_of_symbols
=
pusch_pdu
->
nr_of_symbols
;
...
...
This diff is collapsed.
Click to expand it.
openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
View file @
dd5ca817
...
...
@@ -563,6 +563,7 @@ typedef struct NR_UE_UL_BWP {
NR_PUSCH_TimeDomainResourceAllocationList_t
*
tdaList_Common
;
NR_ConfiguredGrantConfig_t
*
configuredGrantConfig
;
NR_PUSCH_Config_t
*
pusch_Config
;
NR_UCI_OnPUSCH_t
*
uci_onPusch
;
NR_PUCCH_Config_t
*
pucch_Config
;
NR_PUCCH_ConfigCommon_t
*
pucch_ConfigCommon
;
NR_SRS_Config_t
*
srs_Config
;
...
...
This diff is collapsed.
Click to expand it.
openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
View file @
dd5ca817
...
...
@@ -5211,7 +5211,7 @@ void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, nr_csi_report_t *cs
int
csi_resourceidx
=
0
;
while
(
found_resource
==
0
&&
csi_resourceidx
<
csi_MeasConfig
->
csi_ResourceConfigToAddModList
->
list
.
count
)
{
csi_resourceconfig
=
csi_MeasConfig
->
csi_ResourceConfigToAddModList
->
list
.
array
[
csi_resourceidx
];
if
(
csi_resourceconfig
->
csi_ResourceConfigId
==
csi_ResourceConfigId
)
if
(
csi_resourceconfig
->
csi_ResourceConfigId
==
csi_ResourceConfigId
)
found_resource
=
1
;
csi_resourceidx
++
;
}
...
...
@@ -5229,7 +5229,7 @@ void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, nr_csi_report_t *cs
if
(
csi_MeasConfig
->
csi_SSB_ResourceSetToAddModList
->
list
.
array
[
csi_idx
]
->
csi_SSB_ResourceSetId
==
*
(
csi_resourceconfig
->
csi_RS_ResourceSetList
.
choice
.
nzp_CSI_RS_SSB
->
csi_SSB_ResourceSetList
->
list
.
array
[
0
])){
//We can configure only one SSB resource set from spec 38.331 IE CSI-ResourceConfig
nb_resources
=
csi_MeasConfig
->
csi_SSB_ResourceSetToAddModList
->
list
.
array
[
csi_idx
]
->
csi_SSB_ResourceList
.
list
.
count
;
nb_resources
=
csi_MeasConfig
->
csi_SSB_ResourceSetToAddModList
->
list
.
array
[
csi_idx
]
->
csi_SSB_ResourceList
.
list
.
count
;
csi_report
->
SSB_Index_list
=
csi_MeasConfig
->
csi_SSB_ResourceSetToAddModList
->
list
.
array
[
csi_idx
]
->
csi_SSB_ResourceList
.
list
.
array
;
csi_report
->
CSI_Index_list
=
NULL
;
break
;
...
...
This diff is collapsed.
Click to expand it.
openair2/LAYER2/NR_MAC_UE/mac_defs.h
View file @
dd5ca817
...
...
@@ -428,7 +428,7 @@ typedef struct ssb_info {
// List of all the possible SSBs and their details
typedef
struct
ssb_list_info
{
ssb_info_t
tx_ssb
[
MAX_NB_SSB
];
uint8_t
nb_tx_ssb
;
uint8_t
nb_tx_ssb
;
}
ssb_list_info_t
;
typedef
struct
nr_lcordered_info_s
{
...
...
@@ -455,6 +455,19 @@ typedef struct {
A_SEQUENCE_OF
(
NR_SearchSpace_t
)
list_SS
;
}
NR_BWP_PDCCH_t
;
typedef
struct
csi_payload
{
uint32_t
part1_payload
;
uint32_t
part2_payload
;
int
p1_bits
;
int
p2_bits
;
}
csi_payload_t
;
typedef
enum
{
WIDEBAND_ON_PUCCH
,
SUBBAND_ON_PUCCH
,
ON_PUSCH
}
CSI_mapping_t
;
/*!\brief Top level UE MAC structure */
typedef
struct
NR_UE_MAC_INST_s
{
module_id_t
ue_id
;
...
...
This diff is collapsed.
Click to expand it.
openair2/LAYER2/NR_MAC_UE/mac_proto.h
View file @
dd5ca817
...
...
@@ -216,6 +216,28 @@ void release_mac_configuration(NR_UE_MAC_INST_t *mac);
void
nr_ue_ul_scheduler
(
nr_uplink_indication_t
*
ul_info
);
void
nr_ue_dl_scheduler
(
nr_downlink_indication_t
*
dl_info
);
csi_payload_t
nr_ue_aperiodic_csi_reporting
(
NR_UE_MAC_INST_t
*
mac
,
dci_field_t
csi_request
,
int
tda
,
long
*
K2
);
/**\brief fill nr_scheduled_response struct instance
@param nr_scheduled_response_t * pointer to scheduled_response instance to fill
@param fapi_nr_dl_config_request_t* pointer to dl_config,
@param fapi_nr_ul_config_request_t* pointer to ul_config,
@param fapi_nr_tx_request_t* pointer to tx_request;
@param module_id_t mod_id module ID
@param int cc_id CC ID
@param frame_t frame frame number
@param int slot reference number
@param void *phy_pata pointer to a PHY specific structure to be filled in the scheduler response (can be null) */
void
fill_scheduled_response
(
nr_scheduled_response_t
*
scheduled_response
,
fapi_nr_dl_config_request_t
*
dl_config
,
fapi_nr_ul_config_request_t
*
ul_config
,
fapi_nr_tx_request_t
*
tx_request
,
module_id_t
mod_id
,
int
cc_id
,
frame_t
frame
,
int
slot
,
void
*
phy_data
);
/*! \fn int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, slot_t slotP);
\brief Called by PHY to get sdu for PUSCH transmission. It performs the following operations: Checks BSR for DCCH, DCCH1 and
DTCH corresponding to previous values computed either in SR or BSR procedures. It gets rlc status indications on DCCH,DCCH1 and
...
...
@@ -285,28 +307,26 @@ bool trigger_periodic_scheduling_request(NR_UE_MAC_INST_t *mac,
int
nr_get_csi_measurements
(
NR_UE_MAC_INST_t
*
mac
,
frame_t
frame
,
int
slot
,
PUCCH_sched_t
*
pucch
);
uint8_t
get_ssb_rsrp_payload
(
NR_UE_MAC_INST_t
*
mac
,
PUCCH_sched_t
*
pucch
,
struct
NR_CSI_ReportConfig
*
csi_reportconfig
,
NR_CSI_ResourceConfigId_t
csi_ResourceConfigId
,
NR_CSI_MeasConfig_t
*
csi_MeasConfig
);
csi_payload_t
get_ssb_rsrp_payload
(
NR_UE_MAC_INST_t
*
mac
,
struct
NR_CSI_ReportConfig
*
csi_reportconfig
,
NR_CSI_ResourceConfigId_t
csi_ResourceConfigId
,
NR_CSI_MeasConfig_t
*
csi_MeasConfig
);
csi_payload_t
get_csirs_RI_PMI_CQI_payload
(
NR_UE_MAC_INST_t
*
mac
,
struct
NR_CSI_ReportConfig
*
csi_reportconfig
,
NR_CSI_ResourceConfigId_t
csi_ResourceConfigId
,
NR_CSI_MeasConfig_t
*
csi_MeasConfig
,
CSI_mapping_t
mapping_type
);
uint8_t
get_csirs_RI_PMI_CQI_payload
(
NR_UE_MAC_INST_t
*
mac
,
PUCCH_sched_t
*
pucch
,
csi_payload_t
get_csirs_RSRP_payload
(
NR_UE_MAC_INST_t
*
mac
,
struct
NR_CSI_ReportConfig
*
csi_reportconfig
,
NR_CSI_ResourceConfigId_t
csi_ResourceConfigId
,
NR_CSI_MeasConfig_t
*
csi_MeasConfig
);
uint8_t
get_csirs_RSRP_payload
(
NR_UE_MAC_INST_t
*
mac
,
PUCCH_sched_t
*
pucch
,
struct
NR_CSI_ReportConfig
*
csi_reportconfig
,
NR_CSI_ResourceConfigId_t
csi_ResourceConfigId
,
NR_CSI_MeasConfig_t
*
csi_MeasConfig
);
uint8_t
nr_get_csi_payload
(
NR_UE_MAC_INST_t
*
mac
,
PUCCH_sched_t
*
pucch
,
int
csi_report_id
,
NR_CSI_MeasConfig_t
*
csi_MeasConfig
);
csi_payload_t
nr_get_csi_payload
(
NR_UE_MAC_INST_t
*
mac
,
int
csi_report_id
,
CSI_mapping_t
mapping_type
,
NR_CSI_MeasConfig_t
*
csi_MeasConfig
);
uint8_t
get_rsrp_index
(
int
rsrp
);
uint8_t
get_rsrp_diff_index
(
int
best_rsrp
,
int
current_rsrp
);
...
...
@@ -524,6 +544,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
NR_tda_info_t
*
tda_info
,
nfapi_nr_ue_pusch_pdu_t
*
pusch_config_pdu
,
dci_pdu_rel15_t
*
dci
,
csi_payload_t
*
csi_report
,
RAR_grant_t
*
rar_grant
,
uint16_t
rnti
,
const
nr_dci_format_t
dci_format
);
...
...
This diff is collapsed.
Click to expand it.
openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
View file @
dd5ca817
...
...
@@ -436,7 +436,7 @@ static int nr_ue_process_dci_ul_00(module_id_t module_id,
if
(
!
pdu
)
return
-
1
;
int
ret
=
nr_config_pusch_pdu
(
mac
,
&
tda_info
,
&
pdu
->
pusch_config_pdu
,
dci
,
NULL
,
dci_ind
->
rnti
,
NR_UL_DCI_FORMAT_0_0
);
int
ret
=
nr_config_pusch_pdu
(
mac
,
&
tda_info
,
&
pdu
->
pusch_config_pdu
,
dci
,
NULL
,
NULL
,
dci_ind
->
rnti
,
NR_UL_DCI_FORMAT_0_0
);
if
(
ret
!=
0
)
remove_ul_config_last_item
(
pdu
);
release_ul_config
(
pdu
,
false
);
...
...
@@ -484,6 +484,12 @@ static int nr_ue_process_dci_ul_01(module_id_t module_id,
// - SRS_RESOURCE_IND
NR_UE_MAC_INST_t
*
mac
=
get_mac_inst
(
module_id
);
/* CSI_REQUEST */
long
csi_K2
=
-
1
;
csi_payload_t
csi_report
=
{
0
};
if
(
dci
->
csi_request
.
nbits
>
0
&&
dci
->
csi_request
.
val
>
0
)
csi_report
=
nr_ue_aperiodic_csi_reporting
(
mac
,
dci
->
csi_request
,
dci
->
time_domain_assignment
.
val
,
&
csi_K2
);
/* SRS_REQUEST */
AssertFatal
(
dci
->
srs_request
.
nbits
==
2
,
"If SUL is supported in the cell, there is an additional bit in SRS request field
\n
"
);
if
(
dci
->
srs_request
.
val
>
0
)
...
...
@@ -499,6 +505,13 @@ static int nr_ue_process_dci_ul_01(module_id_t module_id,
dci_ind
->
ss_type
,
get_rnti_type
(
mac
,
dci_ind
->
rnti
),
dci
->
time_domain_assignment
.
val
);
if
(
dci
->
ulsch_indicator
==
0
)
{
// in case of CSI on PUSCH and no ULSCH we need to use reportSlotOffset in trigger state
AssertFatal
(
csi_K2
>
0
,
"Invalid CSI K2 value %ld
\n
"
,
csi_K2
);
tda_info
.
k2
=
csi_K2
;
}
if
(
tda_info
.
nrOfSymbols
==
0
)
return
-
1
;
...
...
@@ -510,7 +523,7 @@ static int nr_ue_process_dci_ul_01(module_id_t module_id,
fapi_nr_ul_config_request_pdu_t
*
pdu
=
lockGet_ul_config
(
mac
,
frame_tx
,
slot_tx
,
FAPI_NR_UL_CONFIG_TYPE_PUSCH
);
if
(
!
pdu
)
return
-
1
;
int
ret
=
nr_config_pusch_pdu
(
mac
,
&
tda_info
,
&
pdu
->
pusch_config_pdu
,
dci
,
NULL
,
dci_ind
->
rnti
,
NR_UL_DCI_FORMAT_0_1
);
int
ret
=
nr_config_pusch_pdu
(
mac
,
&
tda_info
,
&
pdu
->
pusch_config_pdu
,
dci
,
&
csi_report
,
NULL
,
dci_ind
->
rnti
,
NR_UL_DCI_FORMAT_0_1
);
if
(
ret
!=
0
)
remove_ul_config_last_item
(
pdu
);
release_ul_config
(
pdu
,
false
);
...
...
@@ -2539,14 +2552,12 @@ int nr_get_csi_measurements(NR_UE_MAC_INST_t *mac, frame_t frame, int slot, PUCC
NR_CSI_MeasConfig_t
*
csi_measconfig
=
mac
->
sc_info
.
csi_MeasConfig
;
int
csi_priority
=
INT_MAX
;
for
(
int
csi_report_id
=
0
;
csi_report_id
<
csi_measconfig
->
csi_ReportConfigToAddModList
->
list
.
count
;
csi_report_id
++
){
for
(
int
csi_report_id
=
0
;
csi_report_id
<
csi_measconfig
->
csi_ReportConfigToAddModList
->
list
.
count
;
csi_report_id
++
)
{
NR_CSI_ReportConfig_t
*
csirep
=
csi_measconfig
->
csi_ReportConfigToAddModList
->
list
.
array
[
csi_report_id
];
if
(
csirep
->
reportConfigType
.
present
==
NR_CSI_ReportConfig__reportConfigType_PR_periodic
){
if
(
csirep
->
reportConfigType
.
present
==
NR_CSI_ReportConfig__reportConfigType_PR_periodic
)
{
int
period
,
offset
;
csi_period_offset
(
csirep
,
NULL
,
&
period
,
&
offset
);
const
int
n_slots_frame
=
nr_slots_per_frame
[
current_UL_BWP
->
scs
];
if
(((
n_slots_frame
*
frame
+
slot
-
offset
)
%
period
)
==
0
&&
pucch_Config
)
{
int
csi_res_id
=
-
1
;
...
...
@@ -2574,47 +2585,50 @@ int nr_get_csi_measurements(NR_UE_MAC_INST_t *mac, frame_t frame, int slot, PUCC
// we discard previous report
csi_priority
=
temp_priority
;
num_csi
=
1
;
pucch
->
n_csi
=
nr_get_csi_payload
(
mac
,
pucch
,
csi_report_id
,
csi_measconfig
);
csi_payload_t
csi
=
nr_get_csi_payload
(
mac
,
csi_report_id
,
WIDEBAND_ON_PUCCH
,
csi_measconfig
);
pucch
->
n_csi
=
csi
.
p1_bits
;
pucch
->
csi_part1_payload
=
csi
.
part1_payload
;
pucch
->
pucch_resource
=
csi_pucch
;
}
else
continue
;
}
else
{
num_csi
=
1
;
csi_priority
=
temp_priority
;
pucch
->
n_csi
=
nr_get_csi_payload
(
mac
,
pucch
,
csi_report_id
,
csi_measconfig
);
csi_payload_t
csi
=
nr_get_csi_payload
(
mac
,
csi_report_id
,
WIDEBAND_ON_PUCCH
,
csi_measconfig
);
pucch
->
n_csi
=
csi
.
p1_bits
;
pucch
->
csi_part1_payload
=
csi
.
part1_payload
;
pucch
->
pucch_resource
=
csi_pucch
;
}
}
}
else
AssertFatal
(
1
==
0
,
"Only periodic CSI reporting is currently implemented
\n
"
);
AssertFatal
(
csirep
->
reportConfigType
.
present
==
NR_CSI_ReportConfig__reportConfigType_PR_aperiodic
,
"Not supported CSI report type
\n
"
);
}
}
return
num_csi
;
}
uint8_t
nr_get_csi_payload
(
NR_UE_MAC_INST_t
*
mac
,
PUCCH_sched_t
*
pucch
,
int
csi_report_id
,
NR_CSI_MeasConfig_t
*
csi_MeasConfig
)
{
int
n_csi_bits
=
0
;
AssertFatal
(
csi_MeasConfig
->
csi_ReportConfigToAddModList
->
list
.
count
>
0
,
"No CSI Report configuration available
\n
"
);
csi_payload_t
nr_get_csi_payload
(
NR_UE_MAC_INST_t
*
mac
,
int
csi_report_id
,
CSI_mapping_t
mapping_type
,
NR_CSI_MeasConfig_t
*
csi_MeasConfig
)
{
AssertFatal
(
csi_MeasConfig
->
csi_ReportConfigToAddModList
->
list
.
count
>
0
,
"No CSI Report configuration available
\n
"
);
csi_payload_t
csi
=
{
0
};
struct
NR_CSI_ReportConfig
*
csi_reportconfig
=
csi_MeasConfig
->
csi_ReportConfigToAddModList
->
list
.
array
[
csi_report_id
];
NR_CSI_ResourceConfigId_t
csi_ResourceConfigId
=
csi_reportconfig
->
resourcesForChannelMeasurement
;
switch
(
csi_reportconfig
->
reportQuantity
.
present
)
{
case
NR_CSI_ReportConfig__reportQuantity_PR_none
:
break
;
case
NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP
:
n_csi_bits
=
get_ssb_rsrp_payload
(
mac
,
pucch
,
csi_reportconfig
,
csi_ResourceConfigId
,
csi_MeasConfig
);
csi
=
get_ssb_rsrp_payload
(
mac
,
csi_reportconfig
,
csi_ResourceConfigId
,
csi_MeasConfig
);
break
;
case
NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI
:
n_csi_bits
=
get_csirs_RI_PMI_CQI_payload
(
mac
,
pucch
,
csi_reportconfig
,
csi_ResourceConfigId
,
csi_MeasConfig
);
csi
=
get_csirs_RI_PMI_CQI_payload
(
mac
,
csi_reportconfig
,
csi_ResourceConfigId
,
csi_MeasConfig
,
mapping_type
);
break
;
case
NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP
:
n_csi_bits
=
get_csirs_RSRP_payload
(
mac
,
pucch
,
csi_reportconfig
,
csi_ResourceConfigId
,
csi_MeasConfig
);
csi
=
get_csirs_RSRP_payload
(
mac
,
csi_reportconfig
,
csi_ResourceConfigId
,
csi_MeasConfig
);
break
;
case
NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1
:
case
NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1_CQI
:
...
...
@@ -2625,16 +2639,15 @@ uint8_t nr_get_csi_payload(NR_UE_MAC_INST_t *mac,
default:
AssertFatal
(
1
==
0
,
"Invalid CSI report quantity type %d
\n
"
,
csi_reportconfig
->
reportQuantity
.
present
);
}
return
(
n_csi_bits
)
;
return
csi
;
}
uint8_t
get_ssb_rsrp_payload
(
NR_UE_MAC_INST_t
*
mac
,
PUCCH_sched_t
*
pucch
,
struct
NR_CSI_ReportConfig
*
csi_reportconfig
,
NR_CSI_ResourceConfigId_t
csi_ResourceConfigId
,
NR_CSI_MeasConfig_t
*
csi_MeasConfig
)
{
csi_payload_t
get_ssb_rsrp_payload
(
NR_UE_MAC_INST_t
*
mac
,
struct
NR_CSI_ReportConfig
*
csi_reportconfig
,
NR_CSI_ResourceConfigId_t
csi_ResourceConfigId
,
NR_CSI_MeasConfig_t
*
csi_MeasConfig
)
{
int
nb_ssb
=
0
;
// nb of ssb in the resource
int
nb_meas
=
0
;
// nb of ssb to report measurements on
int
bits
=
0
;
...
...
@@ -2709,18 +2722,25 @@ uint8_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac,
break
;
// resorce found
}
}
pucch
->
csi_part1_payload
=
temp_payload
;
return
bits
;
AssertFatal
(
bits
<=
32
,
"Not supporting CSI report with more than 32 bits
\n
"
);
csi_payload_t
csi
;
csi
.
part1_payload
=
temp_payload
;
csi
.
p1_bits
=
bits
;
csi
.
p2_bits
=
0
;
return
csi
;
}
uint8_t
get_csirs_RI_PMI_CQI_payload
(
NR_UE_MAC_INST_t
*
mac
,
PUCCH_sched_t
*
pucch
,
struct
NR_CSI_ReportConfig
*
csi_reportconfig
,
NR_CSI_ResourceConfigId_t
csi_ResourceConfigId
,
NR_CSI_MeasConfig_t
*
csi_MeasConfig
)
{
int
n_bits
=
0
;
uint32_t
temp_payload
=
0
;
csi_payload_t
get_csirs_RI_PMI_CQI_payload
(
NR_UE_MAC_INST_t
*
mac
,
struct
NR_CSI_ReportConfig
*
csi_reportconfig
,
NR_CSI_ResourceConfigId_t
csi_ResourceConfigId
,
NR_CSI_MeasConfig_t
*
csi_MeasConfig
,
CSI_mapping_t
mapping_type
)
{
int
p1_bits
=
0
;
int
p2_bits
=
0
;
uint32_t
temp_payload_1
=
0
;
uint32_t
temp_payload_2
=
0
;
AssertFatal
(
mapping_type
!=
SUBBAND_ON_PUCCH
,
"CSI mapping for subband PMI and CQI not implemented
\n
"
);
for
(
int
csi_resourceidx
=
0
;
csi_resourceidx
<
csi_MeasConfig
->
csi_ResourceConfigToAddModList
->
list
.
count
;
csi_resourceidx
++
)
{
...
...
@@ -2733,14 +2753,12 @@ uint8_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac,
nr_csi_report_t
*
csi_report
=
&
mac
->
csi_report_template
[
csi_idx
];
compute_csi_bitlen
(
csi_MeasConfig
,
mac
->
csi_report_template
);
n_bits
=
nr_get_csi_bitlen
(
mac
->
csi_report_template
,
csi_idx
);
int
cri_bitlen
=
csi_report
->
csi_meas_bitlen
.
cri_bitlen
;
int
ri_bitlen
=
csi_report
->
csi_meas_bitlen
.
ri_bitlen
;
int
pmi_x1_bitlen
=
csi_report
->
csi_meas_bitlen
.
pmi_x1_bitlen
[
mac
->
csirs_measurements
.
rank_indicator
];
int
pmi_x2_bitlen
=
csi_report
->
csi_meas_bitlen
.
pmi_x2_bitlen
[
mac
->
csirs_measurements
.
rank_indicator
];
int
cqi_bitlen
=
csi_report
->
csi_meas_bitlen
.
cqi_bitlen
[
mac
->
csirs_measurements
.
rank_indicator
];
int
padding_bitlen
=
n_bits
-
(
cri_bitlen
+
ri_bitlen
+
pmi_x1_bitlen
+
pmi_x2_bitlen
+
cqi_bitlen
);
if
(
get_softmodem_params
()
->
emulate_l1
)
{
static
const
uint8_t
mcs_to_cqi
[]
=
{
0
,
1
,
2
,
3
,
3
,
4
,
4
,
5
,
5
,
6
,
6
,
7
,
7
,
8
,
8
,
9
,
9
,
...
...
@@ -2753,40 +2771,58 @@ uint8_t get_csirs_RI_PMI_CQI_payload(NR_UE_MAC_INST_t *mac,
mac
->
csirs_measurements
.
cqi
=
mcs_to_cqi
[
mcs
];
}
int
padding_bitlen
=
0
;
// TODO: Improvements will be needed to cri_bitlen>0 and pmi_x1_bitlen>0
temp_payload
=
(
mac
->
csirs_measurements
.
rank_indicator
<<
(
cri_bitlen
+
cqi_bitlen
+
pmi_x2_bitlen
+
padding_bitlen
+
pmi_x1_bitlen
))
|
(
mac
->
csirs_measurements
.
i1
<<
(
cri_bitlen
+
cqi_bitlen
+
pmi_x2_bitlen
))
|
(
mac
->
csirs_measurements
.
i2
<<
(
cri_bitlen
+
cqi_bitlen
))
|
(
mac
->
csirs_measurements
.
cqi
<<
cri_bitlen
)
|
0
;
if
(
mapping_type
==
ON_PUSCH
)
{
p1_bits
=
cri_bitlen
+
ri_bitlen
+
cqi_bitlen
;
p2_bits
=
pmi_x1_bitlen
+
pmi_x2_bitlen
;
temp_payload_1
=
(
0
/*mac->csi_measurements.cri*/
<<
(
cqi_bitlen
+
ri_bitlen
))
|
(
mac
->
csirs_measurements
.
rank_indicator
<<
cqi_bitlen
)
|
(
mac
->
csirs_measurements
.
cqi
);
temp_payload_2
=
(
mac
->
csirs_measurements
.
i1
<<
pmi_x2_bitlen
)
|
mac
->
csirs_measurements
.
i2
;
}
else
{
p1_bits
=
nr_get_csi_bitlen
(
mac
->
csi_report_template
,
csi_idx
);
padding_bitlen
=
p1_bits
-
(
cri_bitlen
+
ri_bitlen
+
pmi_x1_bitlen
+
pmi_x2_bitlen
+
cqi_bitlen
);
temp_payload_1
=
(
0
/*mac->csi_measurements.cri*/
<<
(
cqi_bitlen
+
pmi_x2_bitlen
+
pmi_x1_bitlen
+
padding_bitlen
+
ri_bitlen
))
|
(
mac
->
csirs_measurements
.
rank_indicator
<<
(
cqi_bitlen
+
pmi_x2_bitlen
+
pmi_x1_bitlen
+
padding_bitlen
))
|
(
mac
->
csirs_measurements
.
i1
<<
(
cqi_bitlen
+
pmi_x2_bitlen
))
|
(
mac
->
csirs_measurements
.
i2
<<
(
cqi_bitlen
))
|
(
mac
->
csirs_measurements
.
cqi
);
}
reverse_n_bits
((
uint8_t
*
)
&
temp_payload
,
n_bits
);
reverse_n_bits
((
uint8_t
*
)
&
temp_payload_1
,
p1_bits
);
reverse_n_bits
((
uint8_t
*
)
&
temp_payload_2
,
p2_bits
);
LOG_D
(
NR_MAC
,
"cri_bitlen = %d
\n
"
,
cri_bitlen
);
LOG_D
(
NR_MAC
,
"ri_bitlen = %d
\n
"
,
ri_bitlen
);
LOG_D
(
NR_MAC
,
"pmi_x1_bitlen = %d
\n
"
,
pmi_x1_bitlen
);
LOG_D
(
NR_MAC
,
"pmi_x2_bitlen = %d
\n
"
,
pmi_x2_bitlen
);
LOG_D
(
NR_MAC
,
"cqi_bitlen = %d
\n
"
,
cqi_bitlen
);
LOG_D
(
NR_MAC
,
"csi_part1_payload = 0x%x
\n
"
,
temp_payload
);
LOG_D
(
NR_MAC
,
"n_bits = %d
\n
"
,
n_bits
);
LOG_D
(
NR_MAC
,
"csi_part1_payload = 0x%x
\n
"
,
temp_payload
);
LOG_D
(
NR_MAC
,
"csi_part1_payload = 0x%x
\n
"
,
temp_payload_1
);
LOG_D
(
NR_MAC
,
"csi_part2_payload = 0x%x
\n
"
,
temp_payload_2
);
LOG_D
(
NR_MAC
,
"part1_bits = %d
\n
"
,
p1_bits
);
LOG_D
(
NR_MAC
,
"part2_bits = %d
\n
"
,
p2_bits
);
break
;
}
}
}
}
pucch
->
csi_part1_payload
=
temp_payload
;
return
n_bits
;
AssertFatal
(
p1_bits
<=
32
&&
p2_bits
<=
32
,
"Not supporting CSI report with more than 32 bits
\n
"
);
csi_payload_t
csi
;
csi
.
part1_payload
=
temp_payload_1
;
csi
.
part2_payload
=
temp_payload_2
;
csi
.
p1_bits
=
p1_bits
;
csi
.
p2_bits
=
p2_bits
;
return
csi
;
}
uint8_t
get_csirs_RSRP_payload
(
NR_UE_MAC_INST_t
*
mac
,
PUCCH_sched_t
*
pucch
,
struct
NR_CSI_ReportConfig
*
csi_reportconfig
,
NR_CSI_ResourceConfigId_t
csi_ResourceConfigId
,
NR_CSI_MeasConfig_t
*
csi_MeasConfig
)
{
csi_payload_t
get_csirs_RSRP_payload
(
NR_UE_MAC_INST_t
*
mac
,
struct
NR_CSI_ReportConfig
*
csi_reportconfig
,
NR_CSI_ResourceConfigId_t
csi_ResourceConfigId
,
NR_CSI_MeasConfig_t
*
csi_MeasConfig
)
{
int
n_bits
=
0
;
uint32_t
temp_payload
=
0
;
...
...
@@ -2836,9 +2872,12 @@ uint8_t get_csirs_RSRP_payload(NR_UE_MAC_INST_t *mac,
}
}
}
pucch
->
csi_part1_payload
=
temp_payload
;
return
n_bits
;
AssertFatal
(
n_bits
<=
32
,
"Not supporting CSI report with more than 32 bits
\n
"
);
csi_payload_t
csi
;
csi
.
part1_payload
=
temp_payload
;
csi
.
p1_bits
=
n_bits
;
csi
.
p2_bits
=
0
;
return
csi
;
}
// returns index from RSRP
...
...
@@ -4221,7 +4260,7 @@ static void nr_ue_process_rar(nr_downlink_indication_t *dl_info, int pdu_id)
if
(
!
pdu
)
return
;
// Config Msg3 PDU
int
ret
=
nr_config_pusch_pdu
(
mac
,
&
tda_info
,
&
pdu
->
pusch_config_pdu
,
NULL
,
&
rar_grant
,
rnti
,
NR_DCI_NONE
);
int
ret
=
nr_config_pusch_pdu
(
mac
,
&
tda_info
,
&
pdu
->
pusch_config_pdu
,
NULL
,
NULL
,
&
rar_grant
,
rnti
,
NR_DCI_NONE
);
if
(
ret
!=
0
)
remove_ul_config_last_item
(
pdu
);
release_ul_config
(
pdu
,
false
);
...
...
This diff is collapsed.
Click to expand it.
openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
View file @
dd5ca817
...
...
@@ -429,6 +429,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
NR_tda_info_t
*
tda_info
,
nfapi_nr_ue_pusch_pdu_t
*
pusch_config_pdu
,
dci_pdu_rel15_t
*
dci
,
csi_payload_t
*
csi_report
,
RAR_grant_t
*
rar_grant
,
uint16_t
rnti
,
const
nr_dci_format_t
dci_format
)
...
...
@@ -538,6 +539,38 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
pusch_config_pdu
->
tbslbrm
=
0
;
}
else
if
(
dci
)
{
if
(
dci
->
csi_request
.
nbits
>
0
&&
dci
->
csi_request
.
val
>
0
)
{
AssertFatal
(
csi_report
,
"CSI report needs to be present in case of CSI request
\n
"
);
pusch_config_pdu
->
pusch_uci
.
csi_part1_bit_length
=
csi_report
->
p1_bits
;
pusch_config_pdu
->
pusch_uci
.
csi_part1_payload
=
csi_report
->
part1_payload
;
pusch_config_pdu
->
pusch_uci
.
csi_part2_bit_length
=
csi_report
->
p2_bits
;
pusch_config_pdu
->
pusch_uci
.
csi_part2_payload
=
csi_report
->
part2_payload
;
AssertFatal
(
pusch_Config
&&
pusch_Config
->
uci_OnPUSCH
,
"UCI on PUSCH need to be configured
\n
"
);
pusch_config_pdu
->
pusch_uci
.
alpha_scaling
=
pusch_Config
->
uci_OnPUSCH
->
choice
.
setup
->
scaling
;
AssertFatal
(
pusch_Config
->
uci_OnPUSCH
->
choice
.
setup
->
betaOffsets
&&
pusch_Config
->
uci_OnPUSCH
->
choice
.
setup
->
betaOffsets
->
present
==
NR_UCI_OnPUSCH__betaOffsets_PR_semiStatic
,
"Only semistatic beta offset is supported
\n
"
);
NR_BetaOffsets_t
*
beta_offsets
=
pusch_Config
->
uci_OnPUSCH
->
choice
.
setup
->
betaOffsets
->
choice
.
semiStatic
;
pusch_config_pdu
->
pusch_uci
.
beta_offset_harq_ack
=
pusch_config_pdu
->
pusch_uci
.
harq_ack_bit_length
>
2
?
(
pusch_config_pdu
->
pusch_uci
.
harq_ack_bit_length
<
12
?
*
beta_offsets
->
betaOffsetACK_Index2
:
*
beta_offsets
->
betaOffsetACK_Index3
)
:
*
beta_offsets
->
betaOffsetACK_Index1
;
pusch_config_pdu
->
pusch_uci
.
beta_offset_csi1
=
pusch_config_pdu
->
pusch_uci
.
csi_part1_bit_length
<
12
?
*
beta_offsets
->
betaOffsetCSI_Part1_Index1
:
*
beta_offsets
->
betaOffsetCSI_Part1_Index2
;
pusch_config_pdu
->
pusch_uci
.
beta_offset_csi2
=
pusch_config_pdu
->
pusch_uci
.
csi_part2_bit_length
<
12
?
*
beta_offsets
->
betaOffsetCSI_Part2_Index1
:
*
beta_offsets
->
betaOffsetCSI_Part2_Index2
;
}
else
{
pusch_config_pdu
->
pusch_uci
.
csi_part1_bit_length
=
0
;
pusch_config_pdu
->
pusch_uci
.
csi_part2_bit_length
=
0
;
}
pusch_config_pdu
->
pusch_uci
.
harq_ack_bit_length
=
0
;
pusch_config_pdu
->
bwp_start
=
current_UL_BWP
->
BWPStart
;
pusch_config_pdu
->
bwp_size
=
current_UL_BWP
->
BWPSize
;
...
...
@@ -780,6 +813,48 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
return
0
;
}
csi_payload_t
nr_ue_aperiodic_csi_reporting
(
NR_UE_MAC_INST_t
*
mac
,
dci_field_t
csi_request
,
int
tda
,
long
*
k2
)
{
NR_CSI_AperiodicTriggerStateList_t
*
aperiodicTriggerStateList
=
mac
->
sc_info
.
aperiodicTriggerStateList
;
AssertFatal
(
aperiodicTriggerStateList
,
"Received CSI request via DCI but aperiodicTriggerStateList is not present
\n
"
);
int
n_states
=
aperiodicTriggerStateList
->
list
.
count
;
int
n_ts
=
csi_request
.
nbits
;
csi_payload_t
csi
=
{
0
};
AssertFatal
(
n_states
<=
((
1
<<
n_ts
)
-
1
),
"Case of subselection indication of trigger states not supported yet
\n
"
);
int
num_trig
=
0
;
for
(
int
i
=
0
;
i
<
n_ts
;
i
++
)
{
// A non-zero codepoint of the CSI request field in the DCI is mapped to a CSI triggering state
// according to the order of the associated positions of the up to (2^n_ts -1) trigger states
// in CSI-AperiodicTriggerStateList with codepoint 1 mapped to the triggering state in the first position
if
(
csi_request
.
val
&
(
1
<<
i
))
{
AssertFatal
(
num_trig
==
0
,
"Multiplexing more than 1 CSI report is not supported
\n
"
);
NR_CSI_AperiodicTriggerState_t
*
trigger_state
=
aperiodicTriggerStateList
->
list
.
array
[
i
];
AssertFatal
(
trigger_state
->
associatedReportConfigInfoList
.
list
.
count
==
1
,
"Cannot handle more than 1 report configuration per state
\n
"
);
NR_CSI_AssociatedReportConfigInfo_t
*
reportconfig
=
trigger_state
->
associatedReportConfigInfoList
.
list
.
array
[
0
];
NR_CSI_ReportConfigId_t
id
=
reportconfig
->
reportConfigId
;
NR_CSI_MeasConfig_t
*
csi_measconfig
=
mac
->
sc_info
.
csi_MeasConfig
;
int
found
=
-
1
;
for
(
int
c
=
0
;
c
<
csi_measconfig
->
csi_ReportConfigToAddModList
->
list
.
count
;
c
++
)
{
NR_CSI_ReportConfig_t
*
report_config
=
csi_measconfig
->
csi_ReportConfigToAddModList
->
list
.
array
[
c
];
if
(
report_config
->
reportConfigId
==
id
)
{
struct
NR_CSI_ReportConfig__reportConfigType__aperiodic__reportSlotOffsetList
*
offset_list
=
&
report_config
->
reportConfigType
.
choice
.
aperiodic
->
reportSlotOffsetList
;
AssertFatal
(
tda
<
offset_list
->
list
.
count
,
"TDA index from DCI %d exceeds slot offset list %d
\n
"
,
tda
,
offset_list
->
list
.
count
);
if
(
k2
==
NULL
||
*
k2
<
*
offset_list
->
list
.
array
[
tda
])
k2
=
offset_list
->
list
.
array
[
tda
];
found
=
c
;
break
;
}
}
AssertFatal
(
found
>=
0
,
"Couldn't find csi-ReportConfig with ID %ld
\n
"
,
id
);
num_trig
++
;
csi
=
nr_get_csi_payload
(
mac
,
found
,
ON_PUSCH
,
csi_measconfig
);
}
}
return
csi
;
}
int
configure_srs_pdu
(
NR_UE_MAC_INST_t
*
mac
,
NR_SRS_Resource_t
*
srs_resource
,
fapi_nr_ul_config_srs_pdu
*
srs_config_pdu
,
...
...
@@ -2294,7 +2369,7 @@ uint8_t set_csirs_measurement_bitmap(NR_CSI_MeasConfig_t *csi_measconfig, NR_CSI
if
(
csi_res_id
>
NR_maxNrofCSI_ResourceConfigurations
)
return
meas_bitmap
;
// CSI-RS for tracking
for
(
int
i
=
0
;
i
<
csi_measconfig
->
csi_ReportConfigToAddModList
->
list
.
count
;
i
++
)
{
struct
NR_CSI_ReportConfig
*
report_config
=
csi_measconfig
->
csi_ReportConfigToAddModList
->
list
.
array
[
i
];
NR_CSI_ReportConfig_t
*
report_config
=
csi_measconfig
->
csi_ReportConfigToAddModList
->
list
.
array
[
i
];
if
(
report_config
->
resourcesForChannelMeasurement
!=
csi_res_id
)
continue
;
// bit 0 RSRP bit 1 RI bit 2 LI bit 3 PMI bit 4 CQI bit 5 i1
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment