# intel/intel-edge-graphics-driver architecture

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

- Interactive diagram: https://gitdiagram.com/intel/intel-edge-graphics-driver
- Repository: https://github.com/intel/intel-edge-graphics-driver

## Overview

IEGD is a lightweight reference driver for Intel Xe integrated GPUs, with a Linux out-of-tree module as its reference port. Its main workflow begins with the kernel detecting and initializing a device, then exposes IOCTLs for applications to allocate or share buffers, submit GPU work, and configure scanout. GPU execution uses GuC submission; display setup includes protocol-specific link handling and pipe/plane programming. The README also documents PMU utilization and an optional source-bundle configurator. The tree and sampled excerpts support these subsystem boundaries, but not every internal call edge, so uncertain wiring is omitted.

Main entry points: [`hal/display/init.c`](https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/display/init.c) (Display bringup), [`ial/iegd_ioctl.c`](https://github.com/intel/intel-edge-graphics-driver/blob/main/ial/iegd_ioctl.c) (IOCTL interface), [`hal/guc_submit.c`](https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/guc_submit.c) (GuC submission), [`hal/buffer.c`](https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/buffer.c) (Buffer management)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interface["Driver interface"]
  node_device["Device lifecycle<br/>[iegd.c]"]
  node_pci["PCI matching<br/>[iegd_pci.c]"]
  node_ioctl["IOCTL interface<br/>[iegd_ioctl.c]"]
  node_sysfs["Sysfs interface<br/>[iegd_sysfs.c]"]
end

subgraph group_memory["GPU memory"]
  node_buffer["Buffer management<br/>[buffer.c]"]
  node_ppgtt["Per-process GPU VA<br/>[ppgtt.c]"]
  node_ggtt["Global GPU VA<br/>[ggtt.c]"]
  node_vam["Virtual address management<br/>[vam.c]"]
end

subgraph group_execution["GPU execution"]
  node_execqueue["Execution queues<br/>[exec_queue.c]"]
  node_guc["GuC control<br/>[guc.c]"]
  node_gucsubmit["GuC submission<br/>[guc_submit.c]"]
  node_engine["Hardware engines<br/>[hw_engine.c]"]
  node_fence["Hardware fences<br/>[hw_fence.c]"]
  node_pmu["Engine utilization<br/>[pmu_engines.c]"]
end

subgraph group_display["Display subsystem"]
  node_displayinit["Display bringup<br/>[init.c]"]
  node_dp["DisplayPort link<br/>[dp.c]"]
  node_hdmi["HDMI handling<br/>[hdmi.c]"]
  node_edid["Display identification<br/>[edid.c]"]
  node_phy["Display PHY<br/>[phy.c]"]
  node_pipe["Pipe and plane<br/>[pipe.c]"]
end

subgraph group_tools["Optional tooling"]
  node_configurator["Bundle configurator<br/>[server.py]"]
  node_archive["Configured source archive"]
end

node_kernel(("Linux kernel"))
node_application(("User application"))
node_gpu["Xe GPU"]
node_monitor["Display hardware"]

node_kernel -->|"probes device"| node_pci
node_pci -->|"initializes"| node_device
node_kernel -->|"accesses"| node_sysfs
node_application -->|"issues requests"| node_ioctl
node_ioctl -->|"allocates or imports"| node_buffer
node_ioctl -->|"manages queues"| node_execqueue
node_ioctl -->|"requests display operations"| node_displayinit
node_buffer -->|"uses address space"| node_ppgtt
node_buffer -->|"binds global mappings"| node_ggtt
node_ppgtt -->|"allocates GPU ranges"| node_vam
node_execqueue -->|"submits work"| node_gucsubmit
node_gucsubmit -->|"uses GuC control"| node_guc
node_gucsubmit -->|"targets engines"| node_engine
node_engine -->|"binds status buffers"| node_ggtt
node_engine -->|"sets up fence IRQ"| node_fence
node_gucsubmit -->|"accounts submissions"| node_pmu
node_displayinit -->|"reads display data"| node_edid
node_displayinit -->|"sets up DP link"| node_dp
node_displayinit -->|"configures HDMI"| node_hdmi
node_displayinit -->|"configures PHY"| node_phy
node_displayinit -->|"programs pipe"| node_pipe
node_dp -->|"trains link"| node_monitor
node_hdmi -->|"configures link"| node_monitor
node_application -.->|"selects components"| node_configurator
node_configurator -.->|"creates archive"| node_archive

click node_device "https://github.com/intel/intel-edge-graphics-driver/blob/main/ial/iegd.c"
click node_pci "https://github.com/intel/intel-edge-graphics-driver/blob/main/ial/iegd_pci.c"
click node_ioctl "https://github.com/intel/intel-edge-graphics-driver/blob/main/ial/iegd_ioctl.c"
click node_sysfs "https://github.com/intel/intel-edge-graphics-driver/blob/main/ial/iegd_sysfs.c"
click node_buffer "https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/buffer.c"
click node_ppgtt "https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/ppgtt.c"
click node_ggtt "https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/ggtt.c"
click node_vam "https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/vam.c"
click node_execqueue "https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/exec_queue.c"
click node_guc "https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/guc.c"
click node_gucsubmit "https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/guc_submit.c"
click node_engine "https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/hw_engine.c"
click node_fence "https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/hw_fence.c"
click node_pmu "https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/pmu/pmu_engines.c"
click node_displayinit "https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/display/init.c"
click node_dp "https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/display/dp.c"
click node_hdmi "https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/display/hdmi.c"
click node_edid "https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/display/edid.c"
click node_phy "https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/display/phy.c"
click node_pipe "https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/display/pipe.c"
click node_configurator "https://github.com/intel/intel-edge-graphics-driver/blob/main/tools/configurator/server.py"

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_device,node_pci,node_ioctl,node_sysfs,node_application toneBlue
class node_buffer,node_ppgtt,node_ggtt,node_vam toneAmber
class node_execqueue,node_guc,node_gucsubmit,node_engine,node_fence,node_pmu toneMint
class node_displayinit,node_dp,node_hdmi,node_edid,node_phy,node_pipe toneRose
class node_configurator,node_archive,node_kernel,node_gpu,node_monitor toneIndigo
```

## Components

### Driver interface

- [Device lifecycle](https://github.com/intel/intel-edge-graphics-driver/blob/main/ial/iegd.c): `ial/iegd.c`
- [PCI matching](https://github.com/intel/intel-edge-graphics-driver/blob/main/ial/iegd_pci.c): `ial/iegd_pci.c`
- [IOCTL interface](https://github.com/intel/intel-edge-graphics-driver/blob/main/ial/iegd_ioctl.c): `ial/iegd_ioctl.c`
- [Sysfs interface](https://github.com/intel/intel-edge-graphics-driver/blob/main/ial/iegd_sysfs.c): `ial/iegd_sysfs.c`

### GPU memory

- [Buffer management](https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/buffer.c): `hal/buffer.c`
- [Per-process GPU VA](https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/ppgtt.c): `hal/ppgtt.c`
- [Global GPU VA](https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/ggtt.c): `hal/ggtt.c`
- [Virtual address management](https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/vam.c): `hal/vam.c`

### GPU execution

- [Execution queues](https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/exec_queue.c): `hal/exec_queue.c`
- [GuC control](https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/guc.c): `hal/guc.c`
- [GuC submission](https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/guc_submit.c): `hal/guc_submit.c`
- [Hardware engines](https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/hw_engine.c): `hal/hw_engine.c`
- [Hardware fences](https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/hw_fence.c): `hal/hw_fence.c`
- [Engine utilization](https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/pmu/pmu_engines.c): `hal/pmu/pmu_engines.c`

### Display subsystem

- [Display bringup](https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/display/init.c): `hal/display/init.c`
- [DisplayPort link](https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/display/dp.c): `hal/display/dp.c`
- [HDMI handling](https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/display/hdmi.c): `hal/display/hdmi.c`
- [Display identification](https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/display/edid.c): `hal/display/edid.c`
- [Display PHY](https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/display/phy.c): `hal/display/phy.c`
- [Pipe and plane](https://github.com/intel/intel-edge-graphics-driver/blob/main/hal/display/pipe.c): `hal/display/pipe.c`

### Optional tooling

- [Bundle configurator](https://github.com/intel/intel-edge-graphics-driver/blob/main/tools/configurator/server.py): `tools/configurator/server.py`
- **Configured source archive**

### Other components

- **Linux kernel**
- **User application**
- **Xe GPU**
- **Display hardware**

## Connections

- Linux kernel → PCI matching: probes device
- PCI matching → Device lifecycle: initializes
- Linux kernel → Sysfs interface: accesses
- User application → IOCTL interface: issues requests
- IOCTL interface → Buffer management: allocates or imports
- IOCTL interface → Execution queues: manages queues
- IOCTL interface → Display bringup: requests display operations
- Buffer management → Per-process GPU VA: uses address space
- Buffer management → Global GPU VA: binds global mappings
- Per-process GPU VA → Virtual address management: allocates GPU ranges
- Execution queues → GuC submission: submits work
- GuC submission → GuC control: uses GuC control
- GuC submission → Hardware engines: targets engines
- Hardware engines → Global GPU VA: binds status buffers
- Hardware engines → Hardware fences: sets up fence IRQ
- GuC submission → Engine utilization: accounts submissions
- Display bringup → Display identification: reads display data
- Display bringup → DisplayPort link: sets up DP link
- Display bringup → HDMI handling: configures HDMI
- Display bringup → Display PHY: configures PHY
- Display bringup → Pipe and plane: programs pipe
- DisplayPort link → Display hardware: trains link
- HDMI handling → Display hardware: configures link
- User application → Bundle configurator: selects components
- Bundle configurator → Configured source archive: creates archive
