Qualcomm Snapdragon 710 (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 |
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: 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.
- All downstream devicetrees derive from Qualcomm_Snapdragon_670_(SDM670).
- Both SoCs are a cut-down versions of Qualcomm_Snapdragon_845/850_(SDM845/SDM850), which has excellent mainline support.
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.
sdhci1has been tested by User:Ysh on Realme_3_Pro_(realme-rmx1851).sdhci2andufshchas been tested by User:Ellyqw on Xiaomi_Mi_9_Lite_(xiaomi-pyxis).
USB
Mode switching is possible if done manually:
echo device > /sys/kernel/debug/usb/a600000.usb/modefor Gadget mode (default)echo host > /sys/kernel/debug/usb/a600000.usb/modefor 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).