Skip to main content
This guide describes the low-speed and high-speed I/O peripheral interface subsystems used in the Qualcomm Dragonwing IQ-8275 SoC. Low-speed interfaces (via QUP v3 serial engine):
  • UART, SPI, I2C, I3C
High-speed interfaces:
  • PCIe, USB

IQ-8275 Interface Overview

2× QUP v3 Serial EngineQUP0_V3QUP1_V3QUP2_V3
Application processor serial engine instances771
3× USB Controller0xa6000000xa8000000xa400000
Maximum speedUSB 3.x SuperSpeedUSB 3.x SuperSpeedUSB 2.0 High Speed
2× PCIe ControllerRC1RC0
SpeedGen4 2L (8 GT/s)Gen4 4L (8 GT/s)
Config space0x40100000 (1 MB)0x60100000 (1 MB)
BAR space0x40300000 (509 MB)0x60300000 (509 MB)
Power managementASPM (L1/L1ss, L0s)ASPM (L1/L1ss, L0s)

QUP v3 Protocol and GPIO Mapping

QUP0 (SE0–SE5)

QUP_SE (addr)SPI-MI2C-MUARTHS UARTGPIO mapping
qup0_se0 (0x980000)spi0i2c0uart020, 21, 22, 23
qup0_se1 (0x984000)spi1i2c1uart124, 25, 26, 27
qup0_se2 (0x988000)spi2i2c2uart2uart236, 37, 38, 39
qup0_se3 (0x98c000)spi3i2c3uart3uart328, 29, 30, 31
qup0_se4 (0x990000)spi4i2c4uart432, 33, 34, 35
qup0_se5 (0x994000)spi5i2c5uart536, 37, 38, 39

QUP1 (SE0–SE6)

QUP_SE (addr)SPI-MI2C-MUARTHS UARTGPIO mapping
qup1_se0 (0xa80000)spi7i2c7uart740, 41, 42, 43
qup1_se1 (0xa84000)spi8i2c8uart842, 43, 40, 41
qup1_se2 (0xa88000)spi9i2c9uart9uart946, 47, 44, 45
qup1_se3 (0xa8c000)spi10i2c10uart10uart1044, 45, 46, 47
qup1_se4 (0xa90000)spi11i2c11uart1148, 49, 50, 51
qup1_se5 (0xa94000)spi12i2c12uart1252, 53, 54, 55
qup1_se6 (0xa9c000)i2c13uart1356, 57, 56, 57

QUP2 (SE0–SE6)

QUP_SE (addr)SPI-MI2C-MUARTHS UARTGPIO mapping
qup2_se0 (0x880000)spi14i2c14uart1480, 81, 82, 83
qup2_se1 (0x884000)spi15i2c15uart1584, 85, 99, 100
qup2_se2 (0x888000)spi16i2c16uart16uart1686, 87, 88, 89, 90
qup2_se3 (0x88c000)spi17i2c17uart17uart1791, 92, 93, 94
qup2_se4 (0x890000)spi18i2c18uart1895, 96, 97, 98
qup2_se5 (0x894000)spi19i2c19uart1999, 100, 95, 96
qup2_se6 (0x898000)spi20i2c20uart2097, 98, 95, 96
SPI-M = SPI Master

QUP Lane to Function Mapping

InterfaceL0L1L2L3L4L5
UARTCTSRFRTxRx
HS UARTCTSRFRTxRx
I2CSDASCL
SPI masterMISOMOSISCLKCS_0CS_1CS_2

Set Up the Device Interface

Obtain Boot Logs

dmesg

List Enabled Interfaces

# UART
ls /dev/tty*

# I2C
ls /dev/i2c*

Load QUP v3 Firmware

Firmware files are at:
/lib/firmware/qcom/<target-name>/qupv3fw.elf
Enable in kernel config:
CONFIG_QCOM_QUP_FW_LOAD=y

Device Tree Configuration

IQ-8275 EVK reference device tree: arch/arm64/boot/dts/qcom/sa8295p.dtsi

Sample Configurations

i2c10: i2c@a8c000 {
  compatible = "qcom,geni-i2c";
  reg = <0x0 0xa8c000 0x0 0x4000>;
  clocks = <&gcc GCC_QUPV3_WRAP1_S3_CLK>;
  clock-names = "se";
  power-domains = <&rpmhpd SA8295P_CX>;
  dmas = <&gpi_dma1 0 3 QCOM_GPI_I2C>,
         <&gpi_dma1 1 3 QCOM_GPI_I2C>;
  dma-names = "tx", "rx";
  status = "disabled";
};

Modify Serial Engine Node

As a first step, refer to the “How to build the linux-qcom kernel for Qualcomm platform?” section from Ubuntu Qualcomm IOT Platform Support.
1

Set up host machine

sudo apt update && sudo apt build-dep -y linux
sudo apt install build-essential gcc-aarch64-linux-gnu debhelper crossbuild-essential-amd64 dwarves
sudo snap install rustup --classic && rustup install stable
2

Identify kernel version on device

uname -a
3

Download and checkout kernel

git clone https://git.launchpad.net/~canonical-kernel/ubuntu/+source/linux-qcom/+git/noble
cd noble
git checkout <kernel-version>
4

Enable the interface in device tree

Device tree files for IQ-8275 EVK:
  • qcs8275-iq-8275-evk.dts
  • sa8295p.dtsi
Example — enable UART12:
&uart12 {
    status = "okay";
};
Example — enable I2C4:
&i2c4 {
    status = "okay";
};
5

Build and deploy

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
fakeroot debian/rules clean
fakeroot debian/rules binary
Extract DTB and copy to device, then reboot.

Switch Serial Engine Protocol

# Disable SPI, enable I2C on same engine
&spi10 { status = "disabled"; };
&i2c10 { status = "okay"; };

Troubleshooting

dmesg | grep -i qup
dmesg | grep -i geni
ls -la /sys/bus/i2c/devices/
ls -la /sys/bus/spi/devices/
ls -la /dev/ttyHS*
ls -la /lib/firmware/qcom/
Verify CONFIG_FW_LOADER=y in kernel config.
Verify device tree: status = "okay";
dmesg | grep -i qup
dmesg | grep -i geni
Ensure only one protocol is enabled per serial engine:
&qupv3_se5_i2c { status = "okay"; };
&qupv3_se5_spi { status = "disabled"; };

Enable Required Interfaces