Jump to content

Qualcomm Snapdragon 710 (SDM710)

From postmarketOS Wiki
Qualcomm SDM710
Manufacturer Qualcomm
Name SDM710
Architecture aarch64
CPU 2x 2.2 GHz Kryo 360 Gold
6x 1.7 GHz Kryo 360 Silver
GPU Adreno 616
Year 2018
Process 10nm
Mainline yes
Community Page
A link to a git{hub,lab} organisation/repo where development happens.
https://gitlab.com/sdm670-mainline/linux
Components
CPU
SMP (bring up secondary CPU cores), CPU frequency scaling, CPUidle
Works
UART
Untested
Storage
eMMC, SD cards, UFS, ...
Works
USB
Partial
Display
Works
GPU
Works
Pinctrl
Works
I²C
Works
SPI
Serial Peripheral Interface
Works
Audio
Partial
Video
Hardware-accelerated video de/encoding
Works
Thermal
Partial
WiFi
Broken
Bluetooth
Works
Modem
Calls, SMS, Internet
Works
GPS
Works
Camera
Partial
Suspend
Partial
Note Note: Support for this SoC is a work in progress

The Snapdragon 710 is a mid-range Qualcomm SoC released in 2018.

It's manufactured on TSMC's 10nm node, which makes it a better-binned version of SDM670 (manufactured on Samsung's 10nm node). Likely better power efficiency as well.

Differences compared to Qualcomm_Snapdragon_670_(SDM670):

  • CPU: Faster clocks (and different OPP tables).
  • GPU: Adreno 616 (instead of Adreno 615). Likely the same GPU under the hood.
  • Modem: Qualcomm X15 (instead of X12 in SDM670).
  • DSPs: Process bump.

Feature matrix

Component Status Notes
CPU Y DT with OPP tables and storage options
UART - No access on any devices known to use this SoC.
SDHC Y Usually sdhc1 is for eMMC, while sdhc2 is used for microSD slot.
UFS Y Works \o/
USB P Gadget mode works. Host mode requires manual switch and PMIC doesn't enable power (requires powered hub/dock to use).
DSI Y Single-DSI works, AFAIK there are no Dual-DSI devices on the market.
GPU Y Reports itself as Adreno 615, but works just fine.
GPIO Y sdm670-pinctrl.
I2C Y Works
SPI Y Seems to work?
Audio P Work in progress.
Venus Y Seems to work as well as you'd expect
Thermal P sensors report temperatures correctly.
WiFi N Crashes right after successful initialisation. Help wanted!
Bluetooth Y Works
Modem/GNSS Y Works
Camera ISP P ISP seems to initialise, untested due to lacking sensor drivers in mainline. WIP!
Suspend P "echo mem > /sys/power/state" suspends successfully, but devices wake right back. Likely caused by one of remoteprocs, more work needed.
ADSP Y Sensors connected over LPI, sound. Needs files from Android for hexagonrpcd to serve them.

Devices

Device Codename Category
Motorola One Fusion motorola-astro
Realme 3 Pro realme-rmx1851 downstream
Xiaomi Mi 9 Lite xiaomi-pyxis testing

CPU

SDM710 "Kryo Gold" cores run at 2.2GHz (as opposed to 2GHz on SDM670). This required adding missing OPP tables to CPU6 node.

UART

Default debug on this platform is uart12 located at memory address 0x00a90000. None of developers working on this SoC have access to UART testpoints on their devices, therefore UART is considered as "untested".

Storage

Both SDHC interfaces and UFS are working.

USB

Mode switching is possible if done manually:

  • echo device > /sys/kernel/debug/usb/a600000.usb/mode for Gadget mode (default)
  • echo host > /sys/kernel/debug/usb/a600000.usb/mode for host mode

Automatic switching currently doesn't work. If you pipe "auto" into sysfs, your device will be stuck in a loop of switching between modes.

PMIC is missing logic to enable power output, so host mode works only with powered devices (such as hubs or docks).

Only USB2.0 speeds have been tested due to vendors cheaping out.

Pincontrol (SoC/LPI GPIOs)

Exclude ranges "gpio-reserved-ranges = <0 4>, <80 4>;" in your devicetree. First range is usually used by secure element, while the latter is used by a fingerprint sensor.

Pincontrol driver tries to read state of GPIOs after loading, which will crash as those GPIOs are controlled by "secure world".

LPI GPIOs connected to ADSP (used for audio and sensors) seem to work just fine as well.

Display, GPU, Venus

We recommend using MSM8996_Mainlining#Simple_Framebuffer for initial bringup if you don't have UART on your device. Much like most newer Qualcomm platforms (2018+), XBL sets up the framebuffer at memory region 0x9c000000.

Panel driver can be generated using panel driver generator as long as your device is using a single-DSI mode.

GPU and DPU work, although DT compatible string has to be set to qcom,adreno-615.0 (SDM670 default) as Linux driver doesn't recognise A616.

Venus (hardware-accelerated video decoder/encoder) works, but is flaky and not widely supported (typical for v4l2-m2m). Works in mpv as long as you're playing H264 1080p under 60fps.

WiFi

Generate board-2.bin using qca-swiss-army-knife and place it in /lib/firmware/ath10k/WCN3990/hw1.0/.

It crashes for no apparent reason right after initialising successfully, hard-shutdown of the device seem to suggest an XPU violation. Weird.

Firmware, Remoteprocs (ADSP, CDSP etc.)

While running android:

adb kill-server
adb root
adb pull /vendor

You're interested in following directories/files:

  • /vendor/firmware_mnt/image
  • /vendor/firmware

Those files need to be combined with pil-squasher and placed in /lib/firmware/qcom/sdm710/$device_codename/. Compress them with zstd to save space on rootfs.

  • /vendor/lib/rfsa/adsp
  • /vendor/dsp/adsp
  • /vendor/dsp/cdsp
  • /vendor/etc/sensors/config

Those files need to be placed in /usr/share/qcom/sdm710/$Vendor/$device_codename on mainline.

Example of valid configuration

/home/elly # tree /lib/firmware/qcom/sdm710/
/lib/firmware/qcom/sdm710/
└── pyxis
    ├── Global_cal.acdb
    ├── a615_zap.mbn.zst
    ├── adsp.mbn.zst
    ├── adspr.jsn
    ├── adspua.jsn
    ├── cdsp.mbn.zst
    ├── cdspr.jsn
    ├── ipa_fws.mbn.zst
    ├── mba.mbn.zst
    ├── modem.mbn.zst
    ├── modemr.jsn
    ├── modemuw.jsn
    ├── qdsp6m.qdb
    ├── venus.mbn.zst
    └── wlanmdsp.mbn.zst
/home/elly # tree /usr/share/qcom/sdm710/Xiaomi/pyxis/
/usr/share/qcom/sdm710/Xiaomi/pyxis/
├── acdb
│   ├── Forte
│   │   ├── Forte_Bluetooth_cal.acdb
│   │   ├── Forte_General_cal.acdb
│   │   ├── Forte_Global_cal.acdb
│   │   ├── Forte_Handset_cal.acdb
│   │   ├── Forte_Hdmi_cal.acdb
│   │   ├── Forte_Headset_cal.acdb
│   │   ├── Forte_Speaker_cal.acdb
│   │   └── Forte_workspaceFile.qwsp
│   └── adsp_avs_config.acdb
├── dsp
│   ├── adsp
│   │   ├── AlacDecoderModule.so.1
│   │   ├── ApeDecoderModule.so.1
│   │   ├── AudioSphereModule.so.1
│   │   ├── CFCMModule.so.1
│   │   ├── CeltModule.so.1
│   │   ├── EtsiAmrWbPlusDecModule.so.1
│   │   ├── EtsiEaacPlusEncAndCmnModule.so.1
│   │   ├── FlacDecoderModule.so.1
│   │   ├── HeaacDecoderModule.so.1
│   │   ├── LdacModule.so.1
│   │   ├── MIC2AMBModule.so.1
│   │   ├── SAPlusCmnModule.so.1
│   │   ├── VorbisDecoderModule.so.1
│   │   ├── WmaProDecoderModule.so.1
│   │   ├── WmaStdDecoderModule.so.1
│   │   ├── capi_v2_voice_imc_rx.so.1
│   │   ├── capi_v2_voice_imc_tx.so.1
│   │   ├── cellinfo_tools.so
│   │   ├── chre_app_coverage.so
│   │   ├── chre_app_coverage2.so
│   │   ├── chre_app_oem.so
│   │   ├── chre_app_sensor_cfg.so
│   │   ├── chre_drv_bt.so
│   │   ├── chre_drv_gf.so
│   │   ├── chre_drv_loc.so
│   │   ├── chre_drv_modem.so
│   │   ├── chre_drv_wifi.so
│   │   ├── chre_pal.so
│   │   ├── fastrpc_shell_0
│   │   ├── fluence_voiceplus_module.so.1
│   │   ├── hbtpcfg_sdm670_800h_qhd.dat
│   │   ├── hbtpcfg_sdm670_800s_fhd.dat
│   │   ├── hbtpcfg_sdm670_801s_qhd.dat
│   │   ├── libFastRPC_UTF_Forward_skel.so
│   │   ├── libchre_slpi_skel.so
│   │   ├── libstabilitydomain_skel.so
│   │   ├── libsysmon_skel.so
│   │   ├── libsysmondomain_skel.so
│   │   ├── lowi_client.so
│   │   ├── map_AVS_SHARED_LIBS_670.adsp.prodQ.txt
│   │   ├── map_CHRE_SHARED_LIBS_670.adsp.prodQ.txt
│   │   ├── map_CUSTOM_SHARED_LIBS_670.adsp.prodQ.txt
│   │   ├── map_SHARED_LIBS_670.adsp.prodQ.txt
│   │   ├── mmecns_module.so.1
│   │   ├── qtc800h.bin
│   │   ├── qtc800s_dsp.bin
│   │   ├── qtc801s.bin
│   │   └── sensor_testapp_40.so
│   └── cdsp
│       ├── fastrpc_shell_3
│       ├── libbenchmark_skel.so
│       ├── libc++.so.1
│       ├── libc++abi.so.1
│       ├── libhcp_rpc_skel.so
│       ├── libstabilitydomain_skel.so
│       ├── libsysmon_skel.so
│       ├── libsysmondomain_skel.so
│       ├── libsysmonhvxthrottle_skel.so
│       ├── libvpp_aie.so
│       ├── libvpp_diagtools.so
│       ├── libvpp_frc.so
│       ├── libvpp_mvp.so
│       ├── libvpp_nr.so
│       ├── libvpp_qbr.so
│       ├── libvpp_svc_skel.so
│       ├── map_SHARED_LIBS_670.cdsp.prodQ.txt
│       └── ubwcdma_dynlib.so
├── sensors
│   ├── PSensor_ct1.txt
│   ├── PSensor_ct2.txt
│   ├── acc_caldata.txt
│   ├── config
│   │   ├── adux1050_0.json
│   │   ├── ak991x_dri_0.json
│   │   ├── bmi160_0.json
│   │   ├── cm3526_0.json
│   │   ├── config_list.txt
│   │   ├── sdm670_adux1050_0.json
│   │   ├── sdm670_ak991x_0.json
│   │   ├── sdm670_bmi160_0-spi.json
│   │   ├── sdm670_tcs3701.json
│   │   ├── sdm670_tmd3702_0.json
│   │   ├── sdm670_tsl2540_0.json
│   │   ├── sns_amd.json
│   │   ├── sns_aod.json
│   │   ├── sns_basic_gestures.json
│   │   ├── sns_bring_to_ear.json
│   │   ├── sns_cm.json
│   │   ├── sns_diag_filter.json
│   │   ├── sns_distance_bound.json
│   │   ├── sns_dpc.json
│   │   ├── sns_facing.json
│   │   ├── sns_fmv.json
│   │   ├── sns_geomag_rv.json
│   │   ├── sns_gyro_cal.json
│   │   ├── sns_multishake.json
│   │   ├── sns_pedometer.json
│   │   ├── sns_rmd.json
│   │   ├── sns_rotv.json
│   │   ├── sns_smd.json
│   │   ├── tcs3701.json
│   │   ├── tmd3702_0.json
│   │   └── tsl2540_0.json
│   ├── file1
│   ├── gyro_caldata.txt
│   ├── hals.conf
│   ├── registry
│   │   ├── adux1050_0
│   │   ├── adux1050_0.custom
│   │   ├── adux1050_0.custom.config
│   │   ├── adux1050_0.proximity
│   │   ├── adux1050_0.proximity.config
│   │   ├── adux1050_0_platform
│   │   ├── adux1050_0_platform.config
│   │   ├── adux1050_0_platform.placement
│   │   ├── ak0991x_0
│   │   ├── ak0991x_0.mag
│   │   ├── ak0991x_0.mag.config
│   │   ├── ak0991x_0.mag.config_2
│   │   ├── ak0991x_0_platform
│   │   ├── ak0991x_0_platform.config
│   │   ├── ak0991x_0_platform.mag
│   │   ├── ak0991x_0_platform.mag.fac_cal
│   │   ├── ak0991x_0_platform.mag.fac_cal.bias
│   │   ├── ak0991x_0_platform.mag.fac_cal.corr_mat
│   │   ├── ak0991x_0_platform.orient
│   │   ├── ak0991x_0_platform.placement
│   │   ├── bmi160_0
│   │   ├── bmi160_0.accel
│   │   ├── bmi160_0.accel.config
│   │   ├── bmi160_0.gyro
│   │   ├── bmi160_0.gyro.config
│   │   ├── bmi160_0.md
│   │   ├── bmi160_0.md.config
│   │   ├── bmi160_0.temp
│   │   ├── bmi160_0.temp.config
│   │   ├── bmi160_0_platform
│   │   ├── bmi160_0_platform.accel
│   │   ├── bmi160_0_platform.accel.fac_cal
│   │   ├── bmi160_0_platform.accel.fac_cal.bias
│   │   ├── bmi160_0_platform.accel.fac_cal.corr_mat
│   │   ├── bmi160_0_platform.config
│   │   ├── bmi160_0_platform.gyro
│   │   ├── bmi160_0_platform.gyro.fac_cal
│   │   ├── bmi160_0_platform.gyro.fac_cal.bias
│   │   ├── bmi160_0_platform.gyro.fac_cal.corr_mat
│   │   ├── bmi160_0_platform.md
│   │   ├── bmi160_0_platform.md.config
│   │   ├── bmi160_0_platform.orient
│   │   ├── bmi160_0_platform.placement
│   │   ├── bmi160_0_platform.temp
│   │   ├── bmi160_0_platform.temp.fac_cal
│   │   ├── bmi160_0_platform.temp.fac_cal.bias
│   │   ├── bmi160_0_platform.temp.fac_cal.scale
│   │   ├── cm3526_0
│   │   ├── cm3526_0.uv
│   │   ├── cm3526_0.uv.config
│   │   ├── sensors_registry
│   │   ├── sns_amd
│   │   ├── sns_aod
│   │   ├── sns_aod.params
│   │   ├── sns_basic_gestures
│   │   ├── sns_bring_to_ear
│   │   ├── sns_cm
│   │   ├── sns_cm.heap_config
│   │   ├── sns_diag_sensor_datatype
│   │   ├── sns_distance_bound_speed_for_motion_states
│   │   ├── sns_dpc
│   │   ├── sns_facing
│   │   ├── sns_fmv_platform
│   │   ├── sns_fmv_platform.config
│   │   ├── sns_geomag_rv
│   │   ├── sns_geomag_rv.config
│   │   ├── sns_gyro_cal_config
│   │   ├── sns_gyro_cal_persist_s0
│   │   ├── sns_gyro_cal_persist_s0.bias
│   │   ├── sns_gyro_cal_persist_s0.compensation_matrix
│   │   ├── sns_gyro_cal_persist_s0.scale_factor
│   │   ├── sns_mag_cal_persist_s0c0
│   │   ├── sns_mag_cal_persist_s0c0.bias
│   │   ├── sns_multishake
│   │   ├── sns_pedometer
│   │   ├── sns_reg_config
│   │   ├── sns_rmd
│   │   ├── sns_rotv_platform
│   │   ├── sns_rotv_platform.config
│   │   ├── sns_smd
│   │   ├── tcs3701
│   │   ├── tcs3701.als
│   │   ├── tcs3701.als.config
│   │   ├── tcs3701.prox
│   │   ├── tcs3701.prox.config
│   │   ├── tcs3701_platform
│   │   ├── tcs3701_platform.als
│   │   ├── tcs3701_platform.als.fac_cal
│   │   ├── tcs3701_platform.coefficient
│   │   ├── tcs3701_platform.config
│   │   ├── tcs3701_platform.oled_cal_factor
│   │   ├── tcs3701_platform.prox
│   │   ├── tcs3701_platform.prox.fac_cal
│   │   ├── tmd3702
│   │   ├── tmd3702.prox
│   │   ├── tmd3702.prox.config
│   │   ├── tmd3702_platform
│   │   ├── tmd3702_platform.als
│   │   ├── tmd3702_platform.als.fac_cal
│   │   ├── tmd3702_platform.coefficient
│   │   ├── tmd3702_platform.config
│   │   ├── tmd3702_platform.prox
│   │   ├── tmd3702_platform.prox.fac_cal
│   │   ├── tmd3702_platform.rgb
│   │   ├── tmd3702_platform.rgb.fac_cal
│   │   ├── tsl2540
│   │   ├── tsl2540.als
│   │   ├── tsl2540.als.config
│   │   ├── tsl2540_platform
│   │   ├── tsl2540_platform.als
│   │   ├── tsl2540_platform.als.fac_cal
│   │   ├── tsl2540_platform.coefficient
│   │   └── tsl2540_platform.config
│   ├── sensors_list.txt
│   ├── sensors_settings
│   ├── sns_reg_config
│   ├── sns_reg_ctrl
│   └── sns_reg_version
└── socinfo
    ├── hw_platform
    ├── platform_subtype
    ├── platform_subtype_id
    ├── platform_version
    ├── revision
    └── soc_id

9 directories, 236 files

TODO: Where to find sensors registry and acdb?


Notes

Considering similarities with SDM670, we decided to merge our efforts with developers working on Qualcomm_Snapdragon_670_(SDM670).

Who's working on it