[PATCH] serial: msm_geni: validate RX data with IRQ status

Balaji Selvanathan balaji.selvanathan at oss.qualcomm.com
Tue Jul 7 11:57:18 CEST 2026


Hi Casey,

On 6/30/2026 1:27 PM, Casey Connolly wrote:
> Hi Balaji,
>
> On 6/29/26 13:31, Balaji Selvanathan wrote:
>> The GENI UART hardware can retain stale data in the RX FIFO.
>> The msm_serial_pending() function was reporting this stale data as
>> pending input, causing U-Boot to incorrectly assume a key press and
>> stop at the CLI prompt instead of continuing the boot process.
>>
>> Add IRQ status validation to distinguish between legitimate received
>> data and stale FIFO contents. Check the Secondary IRQ status register
>> for RX watermark or last flags before reporting pending data. If the
>> FIFO contains data but no valid IRQ flags are set, ignore it as stale.
>
> Taking a look here compared to the Linux polling mode driver I don't 
> think this is the right way to solve this.
>
> In qcom_geni_serial_stop_rx_fifo() in Linux after clearing the RX IRQs 
> the cancel command is sent (and polled on) and then if 
> S_RX_FIFO_LAST_EN is set the FIFO is drained.
>
> So the right fix here for U-Boot would be to do something similar in 
> msm_geni_serial_setup_rx(), send a cancel rather than an abort, wait 
> for it to complete (or timeout), drain the fifo, and then send an 
> abort if S_GENI_CMD_ACTIVE is still set to fully reset it.
>
> so NAK, please solve this properly by fixing the init sequence.

Fixed the init sequence in v2: 
https://lore.kernel.org/u-boot/20260707-uart-v2-0-d38277b6c4ce@oss.qualcomm.com/

But even after fixing init sequence, still the issue is observed, so 
seems SE_GENI_S_IRQ_STATUS register has to be checked to make sure data 
is valid 
(https://lore.kernel.org/u-boot/20260707-uart-v2-2-d38277b6c4ce@oss.qualcomm.com/).

Thanks,

Balaji

>
>>
>> Signed-off-by: Balaji Selvanathan <balaji.selvanathan at oss.qualcomm.com>
>> ---
>>   drivers/serial/serial_msm_geni.c | 27 ++++++++++++++++++++++-----
>>   1 file changed, 22 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/serial/serial_msm_geni.c 
>> b/drivers/serial/serial_msm_geni.c
>> index 3dca581f68f..6d30f150966 100644
>> --- a/drivers/serial/serial_msm_geni.c
>> +++ b/drivers/serial/serial_msm_geni.c
>> @@ -424,13 +424,30 @@ static int msm_serial_getc(struct udevice *dev)
>>   static int msm_serial_pending(struct udevice *dev, bool input)
>>   {
>>       struct msm_serial_data *priv = dev_get_priv(dev);
>> -
>> -    if (input)
>> -        return readl(priv->base + SE_GENI_RX_FIFO_STATUS) &
>> -               RX_FIFO_WC_MSK;
>> -    else
>> +    u32 rx_fifo_status, s_irq_status;
>> +    int result;
>> +
>> +    if (input) {
>> +        rx_fifo_status = readl(priv->base + SE_GENI_RX_FIFO_STATUS);
>> +        result = rx_fifo_status & RX_FIFO_WC_MSK;
>> +
>> +        /*
>> +         * Validate RX data with IRQ status
>> +         * Only report pending data if valid RX IRQ indicators are set.
>
> What does this mean "valid RX IRQ indicators"??? This comment is 
> fluff, use better variable names (result -> word_count)
>> +         */
>> +        if (result) {
>
> if (word_count > 0)> +            s_irq_status = readl(priv->base + 
> SE_GENI_S_IRQ_STATUS);
>> +
>> +            if (!(s_irq_status & (S_RX_FIFO_WATERMARK_EN | 
>> S_RX_FIFO_LAST_EN))) {
>> +                /* No valid RX IRQ, ignore stale data */
>> +                return 0;
>> +            }
>> +        }
>> +        return result;
>> +    } else {
>>           return readl(priv->base + SE_GENI_TX_FIFO_STATUS) &
>>                  TX_FIFO_WC_MSK;
>> +    }
>>         return 0;
>>   }
>>
>> ---
>> base-commit: 6902fb4c17faa375003124c451c2550deab5463d
>> change-id: 20260629-uart-e07d893e4508
>>
>> Best regards,
>


More information about the U-Boot mailing list