[PATCH 0/3] QRTR bus and Qualcomm Sensor Manager IIO drivers

Yassine Oudjana
2025-04-06T14:07:58Z

Sensor Manager is a QMI service available on several Qualcomm SoCs which
exposes available sensors and allows for getting data from them. This
service is provided by either:

- SSC (Snapdragon Sensor Core): Also known as SLPI (Sensor Low Power
Island). Has its own set of pins and peripherals to which sensors are
connected. These peripherals are generally inaccessible from the AP,
meaning sensors need to be operated exclusively through SSC. The only
known SoCs in this category are MSM8996 and MSM8998 (and their
derivatives).
- ADSP (Audio DSP): Shares pins and peripherals with the AP. At least on
some devices, these pins could be configured as GPIOs which allows the AP
to access sensors by bit-banging their interfaces. Some SoCs in this
category are SDM630/660, MSM8953, MSM8974 and MSM8226.

Before Sensor Manager becomes accessible, another service known as Sensor
Registry needs to be provided by the AP. The remote processor that provides
Sensor Manager will then request data from it, and once that process is
done, will expose several services including Sensor Manager.

This series adds kernel drivers for the Sensor Manager service, exposing
sensors accessible through it as IIO devices. To facilitate probing of the
Sensor Manager core driver, QRTR is turned into a bus, with services being
exposed as devices. Once the Sensor Manager service becomes available, the
kernel attaches its device to the driver added in this series. This allows
for dynamic probing of Sensor Manager without the need for static DT
bindings, which would also not be ideal because they would be describing
software rather than hardware. Sensor Manager is given as a working example
of the QRTR bus. Kernel drivers for other services may also be able
to benefit from this change.

As previously mentioned, a Sensor Registry server must run on the AP to
provide the remote processor (either SLPI or ADSP) with necessary data.
A userspace implementation of this server is made[1]. The server can be
supplied with the necessary data in the form of a plain-text configuration
file that can be pulled from the Android vendor partition (sample[2]), or
generated from a binary file that can be pulled from the persist partition.
A more recently developed kernel implementation of the Sensor Registry
server[3] can also be used. This last implementation only supports reading
data from the binary file pulled from persist. Sensor Registry remains out
of the scope of this patch series, as the Sensor Registry server and Sensor
Manager client (this series) are fully independent components.

Due to the total lack of documentation on Sensor Manager, this driver was
almost entirely the result of a process of capturing transactions between
SSC and the proprietary Android daemons with several methods and manually
decoding and interpreting them, sometimes by comparing with values acquired
from Android APIs. A blog post[4] describes part of this process more
detail. A little piece of downstream Android open-source code[5] was also
used as reference during later stages of development. All of this, as well
as a lack of time on my side for the last couple of years, meant that this
driver had to go through a slow and intermittent development process for
more than 3 years before reaching its current state.

Currently supported sensor types include accelerometers, gyroscopes,
magentometers, proximity and pressure sensors. Other types (namely
light and temperature sensors) are close to being implemented.

Some testing instructions may also be found here[6].

[1] https://gitlab.com/msm8996-mainline/sns-reg
[2] https://github.com/nian0114/android_vendor_xiaomi_scorpio/blob/mkn-mr1/proprietary/etc/sensors/sensor_def_qcomdev.conf
[3] https://github.com/sdm660-mainline/linux/pull/57
[4] https://emainline.gitlab.io/2022/04/08/Unlocking_SSC_P2.html
[5] https://android.googlesource.com/platform/system/chre/+/android-8.0.0_r2/platform/slpi
[6] https://gitlab.postmarketos.org/postmarketOS/pmaports/-/merge_requests/4118

Yassine Oudjana (3):
net: qrtr: Turn QRTR into a bus
net: qrtr: Define macro to convert QMI version and instance to QRTR
instance
iio: Add Qualcomm Sensor Manager drivers

MAINTAINERS | 18 +
drivers/iio/accel/Kconfig | 10 +
drivers/iio/accel/Makefile | 2 +
drivers/iio/accel/qcom_smgr_accel.c | 138 ++++
drivers/iio/common/Kconfig | 1 +
drivers/iio/common/Makefile | 1 +
drivers/iio/common/qcom_smgr/Kconfig | 16 +
drivers/iio/common/qcom_smgr/Makefile | 8 +
drivers/iio/common/qcom_smgr/qcom_smgr.c | 589 ++++++++++++++++
drivers/iio/common/qcom_smgr/qmi/Makefile | 3 +
drivers/iio/common/qcom_smgr/qmi/sns_smgr.c | 711 ++++++++++++++++++++
drivers/iio/common/qcom_smgr/qmi/sns_smgr.h | 163 +++++
drivers/iio/gyro/Kconfig | 10 +
drivers/iio/gyro/Makefile | 2 +
drivers/iio/gyro/qcom_smgr_gyro.c | 138 ++++
drivers/iio/magnetometer/Kconfig | 9 +
drivers/iio/magnetometer/Makefile | 2 +
drivers/iio/magnetometer/qcom_smgr_mag.c | 138 ++++
drivers/iio/pressure/Kconfig | 10 +
drivers/iio/pressure/Makefile | 1 +
drivers/iio/pressure/qcom_smgr_pressure.c | 106 +++
drivers/iio/proximity/Kconfig | 10 +
drivers/iio/proximity/Makefile | 1 +
drivers/iio/proximity/qcom_smgr_prox.c | 106 +++
drivers/soc/qcom/qmi_interface.c | 5 +-
include/linux/iio/common/qcom_smgr.h | 64 ++
include/linux/mod_devicetable.h | 9 +
include/linux/soc/qcom/qrtr.h | 36 +
net/qrtr/af_qrtr.c | 23 +-
net/qrtr/qrtr.h | 3 +
net/qrtr/smd.c | 250 ++++++-
scripts/mod/devicetable-offsets.c | 4 +
scripts/mod/file2alias.c | 10 +
33 files changed, 2573 insertions(+), 24 deletions(-)
create mode 100644 drivers/iio/accel/qcom_smgr_accel.c
create mode 100644 drivers/iio/common/qcom_smgr/Kconfig
create mode 100644 drivers/iio/common/qcom_smgr/Makefile
create mode 100644 drivers/iio/common/qcom_smgr/qcom_smgr.c
create mode 100644 drivers/iio/common/qcom_smgr/qmi/Makefile
create mode 100644 drivers/iio/common/qcom_smgr/qmi/sns_smgr.c
create mode 100644 drivers/iio/common/qcom_smgr/qmi/sns_smgr.h
create mode 100644 drivers/iio/gyro/qcom_smgr_gyro.c
create mode 100644 drivers/iio/magnetometer/qcom_smgr_mag.c
create mode 100644 drivers/iio/pressure/qcom_smgr_pressure.c
create mode 100644 drivers/iio/proximity/qcom_smgr_prox.c
create mode 100644 include/linux/iio/common/qcom_smgr.h
create mode 100644 include/linux/soc/qcom/qrtr.h

--
2.49.0