# audioreach/audioreach-kernel architecture

> Architecture diagram of the GitHub repository audioreach/audioreach-kernel, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/audioreach/audioreach-kernel
- Repository: https://github.com/audioreach/audioreach-kernel

## Overview

AudioReach Kernel is an out-of-tree Linux driver set that bridges userspace AudioReach graph services and audio processing on Qualcomm DSPs. The user-facing path is userspace packet I/O into kernel packet transport, with shared audio memory mapped for DSP use; DSP responses return through packet channels. Separate driver branches provide ASoC machine-card and LPASS DAI interfaces, plus proxy-resource clock/core requests. The README documents the bridge’s purpose but not its detailed wiring; uncertain cross-module relationships are therefore omitted or marked unverified.

Main entry points: [`audioreach-driver/q6apm_audio_pkt.c`](https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/q6apm_audio_pkt.c) (APM packet device), [`audioreach-driver/audioreach_pkt_rpmsg.c`](https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/audioreach_pkt_rpmsg.c) (RPMsg packet transport), [`audioreach-driver/q6apm_audio_mem.c`](https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/q6apm_audio_mem.c) (Audio memory driver), [`audioreach-driver/q6prm_audioreach.c`](https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/q6prm_audioreach.c) (Proxy resource manager)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_transport["Packet transport"]
  node_apm_pkt["APM packet device<br/>[q6apm_audio_pkt.c]"]
  node_rpmsg_pkt["RPMsg packet transport"]
  node_ipc_pkt["Audio packet IPC<br/>[audio-pkt.c]"]
  node_uapi["Audio UAPI<br/>[msm_audio.h]"]
  node_compat["Kernel compatibility<br/>[ar_kcompat.h]"]
end

subgraph group_memory["Shared audio memory"]
  node_mem_driver["Audio memory driver<br/>[q6apm_audio_mem.c]"]
  node_mem_cma["CMA memory backend"]
  node_dsp_mem["DSP memory support<br/>[msm_audio_mem.c]"]
  node_mem_api["Memory API<br/>[msm_audio_mem.h]"]
end

subgraph group_audio["Audio interfaces"]
  node_common["AudioReach common"]
  node_dummy_dais["LPASS dummy DAIs"]
  node_audio_api["Audio driver interfaces<br/>[q6apm_audio.h]"]
end

subgraph group_resources["DSP resources"]
  node_spf_core["SPF core<br/>[spf-core.c]"]
  node_prm["Proxy resource manager<br/>[q6prm_audioreach.c]"]
  node_prm_api["PRM definitions<br/>[q6prm_audioreach.h]"]
  node_prm_clock["LPASS clock provider"]
end

node_userspace(("Graph service"))
node_dsp(("Audio DSP"))

node_userspace -->|"uses packet device"| node_apm_pkt
node_apm_pkt -->|"looks up physical address"| node_mem_driver
node_apm_pkt -.->|"exchanges DSP packets"| node_dsp
node_rpmsg_pkt -.->|"transports packets"| node_dsp
node_userspace -.->|"uses driver channel"| node_rpmsg_pkt
node_userspace -.->|"uses packet IPC"| node_ipc_pkt
node_mem_driver -.->|"provides shared memory"| node_dsp
node_mem_cma -.->|"provides CMA memory"| node_dsp
node_dsp_mem -.->|"supports DSP memory"| node_dsp
node_common -.->|"uses audio configuration"| node_audio_api
node_dummy_dais -.->|"uses audio configuration"| node_audio_api
node_prm_clock -->|"registers clock operations"| node_prm
node_prm -->|"requests resources"| node_dsp
node_spf_core -.->|"supports framework runtime"| node_dsp

click node_apm_pkt "https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/q6apm_audio_pkt.c"
click node_rpmsg_pkt "https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/audioreach_pkt_rpmsg.c"
click node_common "https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/audioreach_common.c"
click node_dummy_dais "https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/q6apm_lpass_dummy_dais.c"
click node_audio_api "https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/q6apm_audio.h"
click node_mem_driver "https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/q6apm_audio_mem.c"
click node_mem_cma "https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/q6apm_audio_mem_cma.c"
click node_dsp_mem "https://github.com/audioreach/audioreach-kernel/blob/master/dsp/msm_audio_mem.c"
click node_mem_api "https://github.com/audioreach/audioreach-kernel/blob/master/include/dsp/msm_audio_mem.h"
click node_spf_core "https://github.com/audioreach/audioreach-kernel/blob/master/dsp/spf-core.c"
click node_prm "https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/q6prm_audioreach.c"
click node_prm_api "https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/q6prm_audioreach.h"
click node_prm_clock "https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/q6prm_audioreach_clock.c"
click node_ipc_pkt "https://github.com/audioreach/audioreach-kernel/blob/master/ipc/audio-pkt.c"
click node_uapi "https://github.com/audioreach/audioreach-kernel/blob/master/include/uapi/linux/msm_audio.h"
click node_compat "https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/ar_kcompat.h"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_apm_pkt,node_rpmsg_pkt,node_ipc_pkt,node_uapi,node_compat toneBlue
class node_mem_driver,node_mem_cma,node_dsp_mem,node_mem_api toneAmber
class node_common,node_dummy_dais,node_audio_api toneMint
class node_spf_core,node_prm,node_prm_api,node_prm_clock toneRose
class node_userspace,node_dsp toneIndigo
```

## Components

### Packet transport

- [APM packet device](https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/q6apm_audio_pkt.c): `audioreach-driver/q6apm_audio_pkt.c`
- [RPMsg packet transport](https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/audioreach_pkt_rpmsg.c): `audioreach-driver/audioreach_pkt_rpmsg.c`
- [Audio packet IPC](https://github.com/audioreach/audioreach-kernel/blob/master/ipc/audio-pkt.c): `ipc/audio-pkt.c`
- [Audio UAPI](https://github.com/audioreach/audioreach-kernel/blob/master/include/uapi/linux/msm_audio.h): `include/uapi/linux/msm_audio.h`
- [Kernel compatibility](https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/ar_kcompat.h): `audioreach-driver/ar_kcompat.h`

### Shared audio memory

- [Audio memory driver](https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/q6apm_audio_mem.c): `audioreach-driver/q6apm_audio_mem.c`
- [CMA memory backend](https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/q6apm_audio_mem_cma.c): `audioreach-driver/q6apm_audio_mem_cma.c`
- [DSP memory support](https://github.com/audioreach/audioreach-kernel/blob/master/dsp/msm_audio_mem.c): `dsp/msm_audio_mem.c`
- [Memory API](https://github.com/audioreach/audioreach-kernel/blob/master/include/dsp/msm_audio_mem.h): `include/dsp/msm_audio_mem.h`

### Audio interfaces

- [AudioReach common](https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/audioreach_common.c): `audioreach-driver/audioreach_common.c`
- [LPASS dummy DAIs](https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/q6apm_lpass_dummy_dais.c): `audioreach-driver/q6apm_lpass_dummy_dais.c`
- [Audio driver interfaces](https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/q6apm_audio.h): `audioreach-driver/q6apm_audio.h`

### DSP resources

- [SPF core](https://github.com/audioreach/audioreach-kernel/blob/master/dsp/spf-core.c): `dsp/spf-core.c`
- [Proxy resource manager](https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/q6prm_audioreach.c): `audioreach-driver/q6prm_audioreach.c`
- [PRM definitions](https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/q6prm_audioreach.h): `audioreach-driver/q6prm_audioreach.h`
- [LPASS clock provider](https://github.com/audioreach/audioreach-kernel/blob/master/audioreach-driver/q6prm_audioreach_clock.c): `audioreach-driver/q6prm_audioreach_clock.c`

### Other components

- **Graph service**
- **Audio DSP**

## Connections

- Graph service → APM packet device: uses packet device (evidence: `audioreach-driver/q6apm_audio_pkt.c`)
- APM packet device → Audio memory driver: looks up physical address
- APM packet device → Audio DSP: exchanges DSP packets
- RPMsg packet transport → Audio DSP: transports packets
- Graph service → RPMsg packet transport: uses driver channel (evidence: `README.md`)
- Graph service → Audio packet IPC: uses packet IPC
- Audio memory driver → Audio DSP: provides shared memory
- CMA memory backend → Audio DSP: provides CMA memory
- DSP memory support → Audio DSP: supports DSP memory
- AudioReach common → Audio driver interfaces: uses audio configuration
- LPASS dummy DAIs → Audio driver interfaces: uses audio configuration (evidence: `audioreach-driver/q6apm_lpass_dummy_dais.c`)
- LPASS clock provider → Proxy resource manager: registers clock operations (evidence: `audioreach-driver/q6prm_audioreach_clock.c`)
- Proxy resource manager → Audio DSP: requests resources (evidence: `audioreach-driver/q6prm_audioreach.c`)
- SPF core → Audio DSP: supports framework runtime
