PUSCH — Uplink Shared Channel in 5G NR
How uplink data is carried — CP-OFDM vs DFT-s-OFDM, codebook/non-codebook, and grant vs configured grant.
The Physical Uplink Shared Channel (PUSCH) is the uplink counterpart of PDSCH: it carries the UL-SCH transport channel — your uploaded data and uplink RRC signalling — and can piggyback control information on top. But the uplink lives under a constraint the downlink never faces: the UE runs on a battery and a modest power amplifier, and it may sit at the very edge of the cell. That single fact is why PUSCH offers two waveforms, two scheduling styles, and two precoding modes, each trading raw capacity against coverage, power efficiency and latency.
Introduction
PUSCH is the physical channel that carries everything the UE has to send that is not a tiny piece of control information: user-plane packets, and uplink RRC messages such as RRCSetupComplete, RRCReconfigurationComplete or measurement reports. It is defined physically in TS 38.211, its coding chain in TS 38.212, its power-control and procedural rules in TS 38.213, and its resource-mapping, MCS/TBS and precoding rules in TS 38.214.
PUSCH first appears very early in the UE lifecycle: the random-access Msg3 is a PUSCH, scheduled by the RAR uplink grant, and every subsequent scheduled uplink transmission — from a browser upload to a periodic VoIP frame — rides the same channel. Understanding it therefore matters from the first moment a UE talks to the network right through to steady-state data transfer.
Because the uplink is power- and coverage-limited, PUSCH is built with far more configurability than PDSCH: the gNB can switch the waveform, restrict the number of layers, turn on frequency hopping, choose a precoding philosophy, and steer transmit power — all per UE and per situation. This page walks through those choices, how PUSCH is laid out in time and frequency, how reference signals ride with it, how control multiplexes onto it, and how its transport block size is fixed.
On this page
Why PUSCH is shaped the way it is
In plain words: a downlink transmitter is like a mains-powered stadium speaker — it has power to burn and can shout in every direction. The uplink is a person at the back of that stadium trying to be heard with only their own lungs. To be understood they must face the right way (precoding), speak in a focused direction rather than mumbling everywhere (a single-carrier, low-PAPR waveform), and repeat into different acoustics if the first attempt is swallowed (frequency hopping). PUSCH is that toolkit for a UE that has to make its limited power count.
Concretely, three pressures shape PUSCH. First, the amplifier: a UE power amplifier must stay linear, and a high peak-to-average-power ratio (PAPR) forces it to back off from saturation, wasting precious dB — hence the low-PAPR DFT-s-OFDM option. Second, path loss and fading: a cell-edge UE cannot spread thin power across a wide band, so it concentrates into a narrow allocation and uses hopping to escape fades. Third, battery and interference: transmitting harder than necessary drains the UE and raises noise for everyone, so tight open- plus closed-loop power control keeps each PUSCH at just the level the gNB needs to decode it. Every PUSCH feature below is one of these three pressures made concrete.
One-line intuition: PDSCH optimises for throughput; PUSCH constantly balances throughput against the UE's power budget and its distance from the cell.
What PUSCH carries
PUSCH is the workhorse of the uplink. Its primary payload is the Uplink Shared Channel (UL-SCH): user-plane data, and uplink RRC messages such as RRCSetupComplete or measurement reports. But PUSCH is more than a data pipe. When the UE has Uplink Control Information (UCI) to send — a HARQ-ACK for a downlink transport block, or a CSI report — in a slot where it is also transmitting PUSCH, that control is normally multiplexed onto the PUSCH rather than sent separately on PUCCH. This keeps the UE to a single-carrier-friendly transmission and avoids the power split of simultaneous PUSCH+PUCCH.
The very first PUSCH a UE ever sends is special: Msg3 during random access, scheduled by the RAR uplink grant and carrying the RRC connection request. It is a stripped-down PUSCH — no configured DMRS flexibility, fixed to the initial UL BWP — but it is the same physical channel, which is why understanding PUSCH matters from the very first moment a UE talks to the network.
The shared, scheduled uplink data channel. It transports the UL-SCH and can multiplex UCI on top (UCI-on-PUSCH). Msg3 is its first appearance.
The uplink is power- and coverage-limited, so PUSCH is built with knobs — waveform, hopping, precoding, power control — that a gNB can tune per UE and per situation.
PUSCH is either dynamically granted by an uplink DCI on the PDCCH, or transmitted on a pre-configured (configured-grant) occasion. Its waveform, layers and precoder are set by RRC and DCI together.
Waveform: CP-OFDM vs DFT-s-OFDM
PUSCH is the only NR physical channel that can use either of two waveforms, and the choice is a single RRC switch: transformPrecoder inside PUSCH-Config (for dynamic grants) or ConfiguredGrantConfig (values enabled/disabled; when absent the UE follows msg3-transformPrecoder from rach-ConfigCommon). The two options are cyclic-prefix OFDM and DFT-spread OFDM, and they sit at opposite ends of the capacity-versus-coverage trade.
CP-OFDM (transform precoding disabled) is the same multi-carrier waveform used on the downlink. Because it maps modulation symbols straight onto subcarriers, it supports true spatial multiplexing — up to four layers on PUSCH — and delivers the highest spectral efficiency when the UE has power to spare and good SINR near the cell centre. Its downside is a higher peak-to-average power ratio (PAPR): the amplifier must back off from its saturation point to stay linear, wasting power headroom.
DFT-s-OFDM (transform precoding enabled) inserts a DFT "spreading" stage before the OFDM modulator. The result is a signal that behaves almost like single-carrier transmission, with a markedly lower PAPR (typically a few dB lower, which the UE can convert into extra transmit power via a smaller Maximum Power Reduction). The amplifier can run closer to its limit without distortion, so the UE radiates more usable power — directly extending uplink coverage for cell-edge and power-limited devices. The price is that DFT-s-OFDM is restricted to a single layer (no uplink MIMO) and its modulation options include a special π/2-BPSK for the most coverage-limited cases.
| Property | CP-OFDM | DFT-s-OFDM |
|---|---|---|
transformPrecoder | disabled | enabled |
| Layers | Up to 4 (spatial multiplexing) | Single layer only |
| PAPR | Higher (more amplifier back-off) | Lower (extra DFT spreading) |
| Modulation | QPSK … 256QAM | Adds π/2-BPSK for deep coverage |
| DMRS type | Type 1 or Type 2 | Type 1-style, low-PAPR sequences |
| Best for | High capacity, cell centre, power to spare | Coverage / cell edge; power-limited UEs |
LTE ↔ NR: LTE's uplink was always single-carrier SC-FDMA (essentially DFT-s-OFDM) — there was no CP-OFDM uplink and no uplink spatial multiplexing beyond transmit diversity. NR makes the waveform a switch, adding CP-OFDM so that a well-powered UE can run up to 4 uplink layers, while keeping the LTE-style low-PAPR waveform for coverage.
Spec anchor: the two uplink waveforms and the transformPrecoder switch are defined in TS 38.211; the selection procedure, layer restrictions and modulation sets in TS 38.214.
Time-domain mapping, DMRS and PT-RS
Where PUSCH sits inside a slot follows the same framework as PDSCH. The DCI's time-domain resource assignment (TDRA) field indexes a row of pusch-TimeDomainAllocationList giving K2 (the DCI-to-PUSCH slot offset, integer range 0…32), a SLIV (start symbol S and length L), and the mapping type.
Mapping Type A is slot-based: the allocation is referenced to the start of the slot and the first DMRS symbol sits at a fixed position (symbol 2 or 3, set by dmrs-TypeA-Position), so it suits longer allocations that fill most of the slot. Mapping Type B is non-slot-based: it can start on almost any symbol and the first DMRS is placed on the first allocated symbol, which makes it ideal for short, latency-sensitive transmissions that must begin mid-slot.
DMRS (Demodulation Reference Signal) lets the gNB estimate the uplink channel so it can coherently demodulate PUSCH. NR defines two configuration types that differ in how reference-signal density trades against the number of orthogonal ports. Configuration Type 1 packs up to 4 ports in one front-loaded symbol (8 across two symbols) using a comb-2 + cyclic-shift structure; Configuration Type 2 gives up to 6 ports in one symbol (12 across two) using frequency-domain code division, favouring higher-order MU-MIMO at the cost of slightly coarser frequency estimation. Both start with a front-loaded DMRS, and additional DMRS symbols (dmrs-AdditionalPosition, values pos0…pos3) can be inserted deeper into the slot so the channel estimate tracks fast fading for high-mobility UEs.
| Aspect | DMRS Config Type 1 | DMRS Config Type 2 |
|---|---|---|
| Multiplexing | Comb-2 (FDM) + cyclic shift + TD-OCC | Frequency-domain OCC over RE pairs |
| Max ports (1 front-loaded symbol) | 4 | 6 |
| Max ports (double-symbol) | 8 | 12 |
| RE density per RB | 6 REs (every other subcarrier) | 4 REs (two RE pairs) |
| Best for | Better channel estimation, fewer users | Higher-order MU-MIMO pairing |
PT-RS (Phase-Tracking Reference Signal) is an uplink companion to DMRS that matters mainly at high carrier frequencies (FR2) and high MCS, where oscillator phase noise rotates the constellation across the slot. PT-RS is sparse in frequency but dense in time, letting the receiver track and undo common phase error symbol by symbol. Its presence and density (PTRS-UplinkConfig) scale with the scheduled bandwidth and MCS via the RRC thresholds timeDensity and frequencyDensity. For CP-OFDM the PT-RS maps to specific subcarriers/ports; for DFT-s-OFDM it is inserted as time-domain sample groups (sampleDensity) before the DFT.
Rule of thumb: DMRS answers "what is the channel?"; PT-RS answers "how is my phase drifting?"; additional DMRS answers "is the channel changing within the slot?"
Frequency hopping
A power-limited UE at the cell edge often cannot afford to transmit across a wide band, so it concentrates its power into a narrow allocation. That narrow allocation is vulnerable to a frequency-selective fade. Frequency hopping solves this by moving the allocation between two (or more) frequency regions so the transmission samples independent parts of the channel — buying frequency diversity for free.
NR PUSCH supports two hopping modes, enabled by frequencyHopping and parameterised by frequencyHoppingOffset (one of up to four RRC-listed offsets, selected by a field in the DCI):
- Intra-slot hopping — the PUSCH transmits its first half of symbols in one frequency region and its second half in another, all inside a single slot. This is the common case and works even for a one-shot transmission.
- Inter-slot hopping — the frequency position alternates from slot to slot across a multi-slot (repetition) transmission, so each repetition lands on a different part of the band. This suits slot-aggregated coverage extension.
For configured-grant and Msg3 PUSCH the hopping offsets are similarly signalled, and when hopping is on, DMRS is transmitted in each hop so the gNB can re-estimate the channel at the new frequency. Hopping combines naturally with DFT-s-OFDM: both target exactly the cell-edge, power-limited regime.
Codebook vs non-codebook transmission
When PUSCH uses CP-OFDM with multiple transmit antennas, the UE must apply a precoder — a matrix that maps the data layers onto physical antenna ports. NR defines two philosophies for choosing it, and both lean on the Sounding Reference Signal (SRS) that the UE transmits so the gNB can measure the uplink channel. The choice is set by txConfig = codebook or nonCodebook in PUSCH-Config.
Codebook-based transmission puts the gNB in charge. The gNB measures the UE's (non-precoded) SRS — from an SRS resource set with usage = codebook — decides how many layers to use and which precoding matrix from a standardised uplink codebook fits best, and signals its decision in the uplink DCI (0_1/0_2) using three fields: the SRI (SRS Resource Indicator) selecting which SRS resource — hence which antenna ports and beam — to transmit on; the TPMI (Transmitted Precoding Matrix Indicator) selecting the precoding matrix; and precodingAndNumberOfLayers, the joint field that actually encodes rank + TPMI. The UE simply applies what it is told. Which TPMIs are usable depends on the UE's antenna coherence capability — how well it can maintain a stable relative phase across its transmit chains:
- Full coherence — the UE can control relative phase across all ports, so the whole codebook (including precoders that combine all antennas coherently) is available.
- Partial coherence — the UE can keep phase coherent within pairs of ports but not across pairs; only a subset of the codebook is allowed.
- Non-coherent — the UE cannot maintain phase across ports, so only antenna-selection precoders (one layer per antenna, no coherent combining) are permitted.
RRC advertises the UE's coherence via codebookSubset (fullyAndPartialAndNonCoherent / partialAndNonCoherent / nonCoherent), which restricts the TPMIs the gNB may signal, and maxRank caps the number of layers.
Non-codebook-based transmission flips the roles. The UE computes its own candidate precoders — typically from downlink CSI-RS measurements (the resource named by NZP-CSI-RS-ResourceId in the SRS set with usage = nonCodebook), exploiting channel reciprocity — and applies each candidate to a different SRS resource. It sounds the channel through those precoders. The gNB then picks the best combination and returns only the SRI, which points at one or more SRS resources; the UE reuses the precoder tied to each indicated SRS. There is no TPMI, because the precoder is baked into the SRS. Non-codebook supports up to 4 layers, one SRS resource selected per layer.
| Aspect | Codebook-based | Non-codebook-based |
|---|---|---|
txConfig | codebook | nonCodebook |
| Who chooses the precoder | gNB (from a standardised codebook) | UE (own candidates), gNB selects among them |
| DCI fields | SRI + precodingAndNumberOfLayers (TPMI) | SRI only |
| SRS usage | Non-precoded SRS to sound the channel | SRS pre-coded with UE candidates |
| Max layers | Up to 4 (subject to coherence) | Up to 4 (one SRS resource per layer) |
| Coherence dependence | Yes — codebookSubset limits TPMIs | Not applicable (precoder is UE-formed) |
| Best when | gNB has good uplink CSI; simpler UE | Reciprocity holds; UE has good DL CSI |
Spec anchor: codebook and non-codebook uplink transmission, TPMI/SRI usage, coherence subsets and the uplink codebooks are specified in TS 38.214 and TS 38.211; the DCI fields in TS 38.212.
Scheduling: dynamic grant vs configured grant
A PUSCH transmission has to be authorised before the UE may send it. NR offers two authorisation styles that differ in overhead and latency.
Dynamic grant. The gNB sends an uplink DCI on the PDCCH, and that single DCI schedules one PUSCH. Three formats exist: DCI format 0_0 is the compact fallback grant (small, robust, monitored in both common and UE-specific search spaces, CRC scrambled by C-RNTI/TC-RNTI); DCI format 0_1 is the full-feature non-fallback grant carrying SRI, TPMI, DMRS, PT-RS, CSI-request and more (UE-specific search space, C-RNTI/CS-RNTI/MCS-C-RNTI); and DCI format 0_2 is a configurable grant designed for URLLC, where many field sizes are RRC-tunable to shrink the DCI for low latency. The DCI's TDRA field yields K2 and the SLIV, so a grant received in slot n produces a PUSCH in slot n + K2. See PDCCH & DCI.
Configured grant. For periodic or predictable traffic — VoIP, industrial sensors, URLLC — sending a DCI for every transmission is wasteful and adds latency. A configured grant pre-arranges recurring PUSCH occasions so the UE can transmit without a per-transmission DCI:
- Type 1 — fully configured by RRC in
ConfiguredGrantConfig→rrc-ConfiguredUplinkGrant(time/frequency resources, periodicity, MCS, DMRS, power). It is truly grant-free: once RRC sets it up the UE simply uses the occasions, with no activation DCI at all. - Type 2 — the parameters come from RRC, but the grant is activated and released by a DCI (
DCI format 0_0/0_1) scrambled withCS-RNTI. RRC arms it; an activation DCI switches it on (and supplies the frequency/MCS), and a release DCI switches it off. This blends RRC's low overhead with DCI's flexibility.
| Aspect | Configured Grant Type 1 | Configured Grant Type 2 |
|---|---|---|
| Setup | Entirely by RRC | RRC arms; DCI activates |
| Activation | None — active on RRC config | DCI scrambled by CS-RNTI |
| Release | RRC reconfiguration | Release DCI (CS-RNTI) |
| Resource/MCS source | RRC (rrc-ConfiguredUplinkGrant) | RRC periodicity + activation DCI fields |
| Latency to first Tx | Lowest (no DCI needed) | Low (one activation DCI) |
| Typical use | Deterministic periodic traffic | Semi-persistent traffic needing quick on/off |
LTE ↔ NR: LTE's grant-free uplink was SPS (semi-persistent scheduling), activated by a PDCCH scrambled with SPS-C-RNTI — conceptually the ancestor of NR Configured Grant Type 2. NR adds Type 1 (pure RRC, no activation DCI at all) specifically to shave the activation latency for URLLC, which LTE SPS could not do.
UCI-on-PUSCH, TBS, power control and Msg3
UCI multiplexing. When HARQ-ACK or CSI must be sent in a slot that already carries PUSCH, the control is rate-matched or punctured onto the PUSCH resources rather than sent on PUCCH. HARQ-ACK is placed right after the front-loaded DMRS (so it is well protected and available early); CSI is spread across the allocation. The amount of resource each UCI type steals from data is set by beta-offsets — per-UCI scaling factors (betaOffsets, semi-static or dynamic via a DCI field) that trade UCI reliability against data throughput. CSI is split into two parts so it can be decoded incrementally: CSI part 1 (fixed size — RI, CQI, and the count of part-2 payload) and CSI part 2 (variable size, e.g. the PMI whose size depends on part 1). Each of HARQ-ACK, CSI part 1 and CSI part 2 has its own beta-offset.
| UCI type | Beta-offset | Placement / notes |
|---|---|---|
| HARQ-ACK | betaOffsetACK | Mapped adjacent to front-loaded DMRS; may puncture data (≤2 bits) or rate-match |
| CSI part 1 | betaOffsetCSI-Part1 | Fixed size: RI/CQI + descriptor of part-2 size |
| CSI part 2 | betaOffsetCSI-Part2 | Variable size (e.g. PMI); dropped first if resources are tight |
Transport block size (TBS). PUSCH determines its TBS with the same chain as PDSCH: from the MCS index (0…31, looked up in the mcs-Table in force) the UE reads a modulation order Qm and target code rate R; it counts the resource elements available for data per RB (subtracting DMRS, and any UCI/PT-RS overhead, plus the RRC xOverhead term); multiplies by allocated RBs, layers, Qm and R to get an intermediate number of information bits; then quantises that through the standardised TBS steps and rounds so the block is byte-aligned and LDPC-friendly.
The MCS table in force (64QAM, 256QAM, or the low-spectral-efficiency table for coverage) is selected by RRC (mcs-Table) and the RNTI used (MCS-C-RNTI forces the low-SE table). Because the arithmetic is identical to the downlink, if you know PDSCH TBS you already know PUSCH TBS — only the overhead terms differ.
Power control hooks. PUSCH transmit power is set by an open-loop term — a target received power P0 (p0-NominalWithGrant plus a UE-specific offset) plus a fractional pathloss compensation factor alpha (enumerated 0, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1) — scaled by the number of allocated RBs and the MCS (via a delta-MCS term), and adjusted by a closed-loop accumulation driven by TPC commands in the uplink DCI (or group-common DCI format 2_2):
The details, including multiple power-control loops and pathloss reference RS, live on the Power Control page; the point here is that PUSCH is the channel these loops ultimately steer, capped by the UE's maximum power P-Max/PCMAX.
Msg3 PUSCH. The random-access Msg3 is a constrained PUSCH: it is scheduled by the RAR uplink grant (not a normal DCI), transmitted in the initial UL BWP, uses transform precoding per msg3-transformPrecoder, and its power is set by a dedicated Msg3 power-control formula because there is no established closed loop yet. HARQ retransmissions of Msg3 are scheduled by a DCI format 0_0 scrambled with TC-RNTI in the Type1-PDCCH common search space. It is the bridge between random access and normal scheduled uplink.
⚠ Common pitfalls / gotchas
- Coverage set to 256QAM by accident. Forcing a high
mcs-Tableon a cell-edge UE wastes the DFT-s-OFDM power gain — the block simply will not decode. Coverage needs the low-SE table (orMCS-C-RNTI) plusπ/2-BPSK, not a bigger constellation. - Requesting 4 layers with DFT-s-OFDM enabled. Transform precoding is single-layer only; a scheduler that leaves
transformPrecoder = enabledand expects uplink MIMO will silently be capped at rank 1. - Coherence mismatch. Signalling a TPMI that coherently combines antennas to a UE that reported
nonCoherentincodebookSubsetis illegal and will not be applied — check the capability before choosing the codebook subset. - Configured-grant DMRS collisions. Two UEs sharing configured-grant occasions with the same DMRS port/scrambling become indistinguishable to the gNB; the DMRS ID and port must differ.
- Too little K2 for the UE's processing time. Scheduling PUSCH before the UE's minimum processing capability (N2) means the grant is dropped; K2 must respect the reported processing timeline.
Summary
PUSCH is the uplink data channel, and almost everything about it is a response to the UE being power- and coverage-limited. You pick a waveform with transformPrecoder — CP-OFDM for up to 4 layers of capacity near the cell centre, DFT-s-OFDM for low-PAPR coverage at the edge. You place it in the slot with a TDRA row (mapping Type A or B, K2 = 0…32), let DMRS (Config Type 1 or 2, plus additional positions) and PT-RS keep the channel and phase estimates honest, and optionally turn on frequency hopping for diversity. You choose a precoding philosophy — codebook (gNB sends SRI + TPMI, bounded by the UE's coherence) or non-codebook (UE pre-codes its own SRS, gNB returns just the SRI). You authorise it dynamically with DCI 0_0/0_1/0_2 or via a configured grant (Type 1 pure-RRC, Type 2 CS-RNTI-activated). And you let it carry UCI when a control-bearing slot overlaps, size its TBS exactly as PDSCH does, and steer its power with the open- plus closed-loop formula — the whole toolkit for making a battery-powered transmitter heard at the cell edge.
Quick Q&A
Q. When is DFT-s-OFDM used instead of CP-OFDM, and what is the cost?
A. When transformPrecoder is enabled — typically for coverage- or power-limited, cell-edge UEs, because its lower PAPR lets the amplifier run more efficiently and radiate more usable power. The cost is single-layer only, so no uplink spatial multiplexing.
Q. Dynamic grant vs configured grant, and Type 1 vs Type 2?
A. A dynamic grant is a per-transmission uplink DCI (0_0/0_1/0_2). A configured grant is RRC-configured periodic resources: Type 1 is grant-free (RRC only, no activation DCI); Type 2 is RRC-armed but activated and released by a CS-RNTI DCI.
Q. Codebook vs non-codebook precoding — who chooses the precoder?
A. Codebook: the gNB reads the UE's non-precoded SRS and signals SRI + precodingAndNumberOfLayers (rank + TPMI), and the UE applies that codebook precoder, limited by its coherence subset. Non-codebook: the UE pre-codes its own SRS with candidate precoders and the gNB returns only the SRI to select among them (up to 4 layers).
Q. What do full / partial / non-coherent mean?
A. They describe how well the UE keeps a stable relative phase across its transmit chains. Full coherence unlocks the whole codebook; partial allows coherent combining only within antenna pairs; non-coherent permits only antenna-selection precoders. codebookSubset tells the gNB which TPMIs it may signal.
Q. How does UCI ride on PUSCH, and what are beta-offsets?
A. HARQ-ACK and CSI are multiplexed onto the PUSCH REs (HARQ-ACK next to the front-loaded DMRS; CSI split into part 1 fixed and part 2 variable). Beta-offsets (betaOffsetACK, betaOffsetCSI-Part1/2) set how many resources each UCI type takes, trading UCI reliability against data throughput.
Q. How is PUSCH TBS determined?
A. Exactly like PDSCH: from MCS get Qm and target code rate R, count data REs per RB after DMRS/UCI/PT-RS overhead, multiply by RBs, layers, Qm and R, then quantise through the standardised TBS steps. Only the overhead terms differ.
Where to go next
You have seen how the uplink data channel is shaped, scheduled, precoded and power-controlled. Follow the threads that feed it.