Commit Graph
9087 Commits
Author SHA1 Message Date
Robert Schmidt 4fe8d3cd8e nr_schedule_response(): break up in separate dl_tti_req + tx_req phases 2025-01-27 10:59:19 +01:00
Robert Schmidt 6a630f4646 nr_schedule_response(): Separate dlsch_fill into DL_tti_req and TX_req part
FAPI sends those independently, so we cannot treat both on the arrival
of the first one.
2025-01-27 10:59:19 +01:00
Robert Schmidt c37bf20501 nr_schedule_response() is not used in VNF, only monolithic 2025-01-27 10:59:19 +01:00
Robert Schmidt 16ead1d001 nr_slot_select() and set_tdd_config_nr(): remove useless second frame
FAPI says these lists should be for MAX_TDD_PERIODICITY (which is maybe
a frame, or a TDD period? but likely not two frames). Reduce to one
frame.

Also, the nFAPI code assumes one entire frame, so use that (this commit
necessary to actually make the PNF work, otherwise, the
packing/unpacking of the FAPI message would need to do 2 frames).

Closes: #876
2025-01-27 10:59:19 +01:00
Robert Schmidt 412446077f IF module slot_indication: send message in PNF
Use this function to implement distinct behavior for monolithic or PNF:

- monolithic: run the scheduler, as normal
- PNF: send a slot indication; the VNF will send an answer which the PNF
  will handle elsewhere.

Add function declarations to make nr_ulsim compile, as NR_IF_Module.c is
part of the MAC sources. As of now, this is necessary; I think the right
way would be to take NR_IF_Module.c out of the MAC, and make this a
"glue" library that sticks L1 and L2 together, in monolithic (in VNF, in
that case, we should not link in L1, and for the PNF not the L2,
creating separate executables... Rome was not built in one day).
2025-01-27 10:59:15 +01:00
Robert Schmidt 9f80c82f54 Only use refcount if monolithic
There is a reference counting mechanism used in monolithic. It does not
apply for the PNF.
2025-01-27 10:59:15 +01:00
Robert Schmidt 1b44f6448b Allow to use multiple PUCCH at once
We are required to store multiple PUCCH (e.g., for multiple UEs).
However, nr_fill_pucch() automatically freed the previously active PUCCH
structure. Of course(!) this does not make sense.

However, the problem is that init_nr_transport() allocated only one
PUCCH structure. Also this does not make sense to me. The problem was
that slot_ahead was 0, which logically cannot happen in this function
(because slot_ahead is illogical, we must give the radio some time). The
reason is that it uses if_inst->sl_ahead, which, prior to this commit,
was not set.

The init_nr_transport() function is called normally from main() through
init_eNB_afterRU(). In this case, we initialize if_inst->sl_ahead to
what is set in main(). In the PNF case, however, we call
init_nr_transport() from the PNF thread, when receiving the start
request. In the main(), we wait for this to happen, before setting
if_inst->sl_ahead. Hence, initializing this variable (which we should
safely be able to do) before solves the problem.
2025-01-27 10:59:15 +01:00
Robert Schmidt 84d9df501d No special handling for PNF for RX procedures
See also a later commit "Allow to use multiple PUCCH at once", in which
PUCCH handling in the case of PNF is reworked.

We might squash both commits.
2025-01-27 10:59:15 +01:00
Rúben Soares da Silva a6b40ace23 Assign NFAPI_NR_CONFIG_SLOT_CONFIG_TAG tag in TLVs used for transmitting the TDD Slot configuration through CONFIG.request. 2025-01-27 10:59:15 +01:00
Robert Schmidt 998d8c9480 Merge remote-tracking branch 'origin/pucch-rssi-fix' into integration_2025_w03 (!3205)
Fix calculation of RSSI in pucch_rx.c

Fix two issues with RSSI calculation in PUCCH:

- RSSI was calculated using partial sum instead of average of squared samples.
- There was a missing parentheses pair which causes the RSSI value to underflow.

The proper way to calculate power in dBFS is

    let signal_energy = average of squared samples of received signal over resource elements, antennas and symbols under measurement

then:

    rssi[dBFS] = -10log10(max_sample^2 / signal_energy),

or (to avoid division):

    rssi[dBFS] = -(10log10(max_sample^2) - 10log10(signal_energy))
2025-01-15 22:07:31 +01:00
Robert Schmidt a20d229b6b Merge remote-tracking branch 'origin/pucch2-delay-compensation' into integration_2025_w03 (!3034)
Delay compensation for PUCCH2

- Implementation of delay compensation for PUCCH2, which minimizes for
  exampe logs "reported RSRP index XXX invalid"
- Adding a test to the CI to perform the delay compensation in PUCCH2
- Refactor code to use c16_t data type in PUCCH decoder
2025-01-15 18:34:53 +01:00
Robert Schmidt 77ddc36236 Merge remote-tracking branch 'origin/tpool-nospinlock' into integration_2025_w03 (!3193)
Remove spinlock from threadpool task return

The idea to use atomic aligned to cache line for counting finished jobs
is reused, but instead of polling a semaphore was added.
2025-01-15 15:04:37 +01:00
Bartosz Podrygajlo 7bd048e6af Fix calculation of RSSI in pucch_rx.c
Fix two issues with RSSI calculation in PUCCH:
 - RSSI was calculated using partial sum instead of average of squared samples.
 - There was a missing parentheses pair which causes the RSSI value to underflow.
   The proper way to calculate power in dBFS is

    let signal_energy = average of squared samples of received signal over resource
     elements, antennas and symbols under measurement

    then:
     rssi[dBFS] = -10log10(max_sample^2 / signal_energy),
    or (to avoid division):
     rssi[dBFS] = -(10log10(max_sample^2) - 10log10(signal_energy))
2025-01-15 13:49:05 +01:00
Bartosz Podrygajlo 0657ab2275 Remove spinlock from threadpool task return
The idea to use atomic aligned to cache line for counting finished jobs
is reused, but instead of polling a semaphore was added
2025-01-14 15:17:19 +01:00
Laurent THOMAS 48226d10bf add cpu measurement option in nr_pucchsim 2025-01-14 11:34:22 +01:00
rmagueta dc5f4bf868 Apply delay compensation only when delay is different from 0 2025-01-14 11:34:22 +01:00
Laurent THOMAS 6384517c01 Better code for PUCCH2 decoding 2025-01-14 11:34:22 +01:00
rmagueta 39a50faa6e Delay compensation for PUCCH2 2025-01-14 11:34:22 +01:00
Laurent THOMAS f919246121 remove part of code using _m64 type (so old mmx instructions) 2025-01-14 10:07:59 +01:00
Laurent THOMAS ba27aefe4e add some const and remove dead code 2025-01-14 10:07:31 +01:00
Laurent THOMAS 7d0c89185c gcc warning on #define duplicated 2025-01-14 10:07:31 +01:00
Laurent THOMAS d5c72cf843 remove a race condition in viberti_lte and a useless global table 2025-01-14 10:07:30 +01:00
Laurent THOMAS a0d6057294 remove calls to clear SIMD registers, that was a historical issue 2025-01-14 10:06:06 +01:00
Robert Schmidt 72aaf45fa8 Merge remote-tracking branch 'origin/race-ue-rrc-mac' into integration_2025_w02 (!3103)
Introduce ITTI queue in RRC-to-MAC direction

resolve ue rcc to mac race conditions by a itti queue, but it doesn't
resolve the problem of exact slot we should apply the new cell
configurtion
2025-01-13 10:10:07 +01:00
Robert Schmidt 39d9d32eda Merge remote-tracking branch 'origin/local-UL_INFO' into integration_2025_w02 (!3076)
Move UL_INFO structure allocation local to a rx slot processing

UL_INFO is allocated a gNB, so require mutex and obscur information
passing function to function.  Instead, make a local UL_INFO per slot,
removing the mutex and making the code easier to understand.
2025-01-13 07:46:05 +01:00
francescomani 9d9902d883 apply ITTI queue to SIB19 2025-01-10 18:28:27 +01:00
Laurent THOMASandRobert Schmidt b4bc7c96ba Move UL_INFO structure allocation local to a rx slot processing
Use UL_INFO on the stack, to simplify the code.  move in the same struct
the associated rach, pdu, crc, srs arrays that where pointed from
directly in gNB structure Keep in nfapi the existing logic that make
malloc for theses rach, pdu, crc, srs array lists

Pass only relevant fields, where appropriate.

Co-authored-by: Robert Schmidt <robert.schmidt@openairinterface.org>
2025-01-10 18:05:58 +01:00
Robert Schmidt 189396aac2 Merge remote-tracking branch 'origin/nrLDPC_coding_improvements_2' into integration_2025_w02 (!3187)
nrLDPC_coding: Fix naming, comments, superfluous variables and documentation typos in coding library interfaces

This MR is clarifying the interfaces to the LDPC coding libraries.  It
aims to improve the readability of the interfaces and compliance of
naming with specification 38.212.
2025-01-10 18:00:35 +01:00
Robert Schmidt 38f9436837 Merge remote-tracking branch 'origin/NR_UE_DCI_mask_size' into integration_2025_w02 (!3188)
NR UE fix DCI mask size

Previous maximum size was 15 but in practice it could be at least up to
18. Also moved assertion on non-contiguous type0 DLSCH allocation to L1
(to remove blocking point for L2 implementation).
2025-01-10 11:47:27 +01:00
Robert Schmidt d892732ff7 Merge remote-tracking branch 'origin/improve-pusch-per-symbol-processing' into integration_2025_w02 (!3175)
Improvements for PUSCH per symbol processing

- Improved the assert in task_ans.c
- Fixed and issue with PUSCH per-symbol processing that could cause an
  issue in case num_pusch_symbols_per_thread is not 1.
2025-01-10 11:45:50 +01:00
Romain Beurdouche f9c7057ed1 fix(nrLDPC_coding): Apply clang-format to segment coding code 2025-01-10 09:00:35 +00:00
Romain Beurdouche c54e7a7035 fix(nrLDPC_coding): in segment decoder, move useless memset on decoder output c to the oly case where it is useful 2025-01-10 09:00:35 +00:00
Romain Beurdouche 6eb0913de9 fix(documentation): typos and strengthen the explanation of the adaptation layer between slot coding and segment coding 2025-01-10 09:00:35 +00:00
Romain Beurdouche c959f41987 fix(nrLDPC_coding): remove T2 legacy setCombIn from segment decoder parameters 2025-01-10 09:00:35 +00:00
Romain Beurdouche 15fc29843c fix(nrLDPC_coding): cleanup the naming of the K, Kprime and Zc variables to comply with the standard 38.212-5.2.2 2025-01-10 09:00:32 +00:00
Romain Beurdouche 9586db6bfd fix(nrLDPC_decoder): Rename E in Kprime in segment decoder parameters to comply with standard naming 2025-01-10 08:54:37 +00:00
Robert Schmidt 7720d7c821 Merge remote-tracking branch 'origin/fix-tpool-deadlock' into integration_2025_w02 (!3181)
Use UL actor for processSlotTx

Use UL actor instead of Thread pool for processSlotTX.

Closes #887
2025-01-10 07:56:36 +01:00
Robert Schmidt 8805b78d3f Merge remote-tracking branch 'origin/nrLDPC_coding_improvements_1' into integration_2025_w02 (!3173)
nrLDPC_coding: improvements

One improvement in this changeset: Functions nr_interleaving_ldpc,
nr_deinterleaving_ldpc, nr_rate_matching_ldpc and
nr_rate_matching_ldpc_rx that were previously linked with the PHY layer
in the executables are now linked with the LDPC coding implementations
where they are called.
2025-01-10 07:55:46 +01:00
Robert Schmidt e2a3cde4b7 Further cleanup: define oai_exit for 4G
The parent commit cleans up and groups oai_exit in one place,
nr-softmodem-common.h. Therefore, this 5G file is included in the 4G
defs_common.h (at least it's mostly 4G), which is not nice. Instead,
define oai_exit also in 4G softmodem-common.h, and include this in
defs_common.h. Remove the cyclic inclusion of defs_common.h in
softmodem-common.h, and resolve all subsequent errors around unknown
types and extern definition mismatches.
2025-01-09 15:28:25 +01:00
Laurent THOMAS e0ca70c36d replace a set of #define by a C bit array, remove duplicated extern global variable declaration 2025-01-09 15:28:25 +01:00
Romain Beurdouche fc2bd36788 fix(nrLDPC_coding_segment): missing dependency of nr_coding_segment_decoder, nr_coding_segment_encoder, nr_coding_segment_utils and nr_coding_xdma_decoder on generate_T 2025-01-08 08:31:11 +00:00
Romain Beurdouche 61cb2bcc5a fix(nrLDPC_coding_segment): Reorganize segment and xdma CMakeFiles.txt to avoid redundant compilation 2025-01-08 08:31:06 +00:00
Romain Beurdouche 244355a3d2 fix(nrLDPC_coding_segment): move rate matching, interleaving and their counterparts to segment coding implementation 2025-01-08 08:13:43 +00:00
francescomani a7b9a85640 move temporary code to process type0 as type1 when the RB allocation is contiguous to L1 2025-01-06 12:07:15 +01:00
Bartosz Podrygajlo 88cde50d4c Refactor PUSCH per-symbol threadpool utilization
A small refactor for PUSCH per-symbol processing. This fixes a possible
issue in case num_pusch_symbols_per_thread is not 1
2025-01-03 08:11:35 +01:00
Bartosz Podrygajlo f3e60a1417 Use UL actor for processSlotTx
Use UL actor instead of Thread pool for processSlotTX.
2024-12-20 16:28:34 +01:00
Jaroslava Fiedlerova 40584b5b32 Merge remote-tracking branch 'origin/fix_and_refactor_channel_average' into integration_2024_w51 (!3164)
Fix and refactor channel average

- Fixing missing init average variable with zero and refactor the code #86b11ab7
Fixes just the missing avg1=0
- Refactor the code to a common SSE/AVX2 inline function using also horizontal add.
- We use int64_t result from now on.
- We decided to fix length to x12 instead of old x9 openair1/PHY/NR_UE_TRANSPORT/dci_nr.c

//compute average channel_level on each (TX,RX) antenna pair
void nr_pdcch_channel_level(int32_t rx_size,
                            c16_t dl_ch_estimates_ext[][rx_size],
                            NR_DL_FRAME_PARMS *frame_parms,
                            int32_t *avg,
                            int symbol,
                            int nb_rb)
{
  for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
    //clear average level
    simde__m128i avg128P = simde_mm_setzero_si128();
    simde__m128i *dl_ch128 = (simde__m128i *)&dl_ch_estimates_ext[aarx][symbol * nb_rb * 12];

    for (int rb = 0; rb < (nb_rb * 12) >> 2; rb++) {     <-------------- here
      avg128P = simde_mm_add_epi32(avg128P, simde_mm_madd_epi16(dl_ch128[rb], dl_ch128[rb]));
    }

    DevAssert(nb_rb);
    avg[aarx] = 0;
    for (int i = 0; i < 4; i++)
      avg[aarx] += ((int32_t *)&avg128P)[i] / (nb_rb * 12); <-------------- and here
    LOG_DDD("Channel level : %d\n",avg[aarx]);
  }
}
2024-12-20 15:26:57 +01:00
Jaroslava Fiedlerova 90057df3cc Merge remote-tracking branch 'origin/opt-cp-insertion' into integration_2024_w51 (!3151)
Optimize PHY_ofdm_mod CYCLIC_PREFIX in case of incidentally aligned pointers

It seems that the cyclic prefix is in most cases a multiple of 512 samples.
This means that in most cases the idft output pointer is already aligned and
there is no need to perform an extra memcpy. This saves the memcpy time in
most cyclic prefix insertion cases.
2024-12-20 15:24:45 +01:00
Matthias Mehlhose 5ae69ce484 refactor: average 64 bit calculations with shift and internal division (SSE and AVX2) 2024-12-18 07:36:22 +00:00
Matthias Mehlhose 276a17902e fix: UE average 2024-12-18 07:36:22 +00:00