summaryrefslogtreecommitdiff
path: root/cpu-docs/README.md
blob: a4a8784382cb87b313ef86cad04ef6d1c03923b4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# cpu-docs — source documentation for the ESP32-P4's CPU

Primary documents only. Nothing here is written by hand except this index and the per-collector
manifests in `manifests/`; every other file is a vendor- or standards-body-official artifact,
fetched from its own site and verified (`file` + `pdfinfo` + first-page title/version check).
18 PDFs, one official HTML bundle, 7 text sources; 121 MB. The PDFs and the zip are deliberately
*untracked* (`.gitignore`) — this index and `manifests/` carry every source URL with a sha256, byte
count and page count, so the archive is re-fetchable and drift is detectable, and 121 MB of
third-party documents stay out of the repository history. Caveat worth knowing: the two TRMs and
both datasheets are **pre-release** documents served from *fixed* filenames, so espressif.com will
one day return different bytes at the same URL. The recorded hashes will detect that; they cannot
recover the superseded revision. If keeping these exact revisions matters more than a clean
history, drop the `/cpu-docs/**/*.pdf` rule and raise `jj config set --repo
snapshot.max-new-file-size 52m`.

## The part

| | |
|---|---|
| SoC | Espressif ESP32-P4, silicon revision **v1.3** (pre-v3, ESP-IDF register set `hw_ver1`) |
| HP CPU | dual-core 32-bit RISC-V, **RV32IMAFC** (+Zc), 360 MHz default on this revision |
| LP CPU | single-core **RV32IMAC**, no FPU, no vendor extensions |
| custom ISA | `xespv2p1` (PIE, 128-bit SIMD/DSP) and `xesploop` (hardware loop) |
| ESP-IDF `-march` for rev < v3 | `rv32imafc_zicsr_zifencei_zaamo_zalrsc_xesploop_xespv2p1 -mabi=ilp32f -mtune=esp-base` |
| debug module | RISC-V External Debug Support **0.13.2** (HP DM), 0.13 (LP DM) |
| interrupt controller | RISC-V **CLIC** + CLINT per core, behind the SoC Interrupt Matrix. There is no `INTPRI` on this chip — that is C3/S3-era naming |

## Two traps before you cite anything

**1. Espressif maintains two concurrent ESP32-P4 manual lines, and the generic one is the wrong
silicon.** `esp32-p4_technical-reference-manual_en_pre-release-v0.7.pdf` documents **v3.x**
silicon. The register- and feature-correct book for this board is
`esp32-p4-chip-revision-v1.3_technical-reference-manual_en_pre-release-v0.4.pdf`. Both are archived.
`esp32-p4-chip-revision-v3.x_user-guide_en_v1.0.pdf` §1 is the authoritative delta list: on v1.3
the max HP clock is 360 not 400 MHz, there is no Zb, there are fewer than 32 PMP entries, there is
no user-mode interrupt delegation and no Interrupt-Matrix remapping, CLIC CSR access is slower and
less compliant, the hardware-loop counter is narrower, and the cached region maps from the **top**
of L2MEM rather than the bottom.

**2. The PIE chapter exists only in the wrong-revision manual.** The rev-v1.3 TRM lists its
Processor Instruction Extensions chapter as "[to be added later]" and omits it from the body
entirely. PIE must therefore be cited from the v0.7 TRM ch.4 (p.210) plus §2.7.1 Hardware Loop
(p.119) — the only encoding-complete source anywhere. Related: `xesppie` is a dead arch-string
name; `riscv32-esp-elf-gcc` 15.2.0 rejects it outright.

## Which document answers which question

| question | document | where |
|---|---|---|
| memory map, address spaces, cache, flash/PSRAM MMU windows | rev-v1.3 TRM | ch.7 System and Memory p.450 — §7.3.1 Address Mapping, §7.3.3.1 External Memory Address Mapping p.456, §7.3.3.2 Cache p.457. No separate MMU or Cache chapter exists |
| CSRs the core implements | rev-v1.3 TRM | ch.1 §1.5 CSRs p.63 (summary + per-register description); §1.4 Address Map p.62 |
| which standard extensions, and their behaviour | rev-v1.3 TRM ch.1 §1.6 p.94–99, then RISC-V Vol I | M ch.12, A ch.13, F ch.20, C ch.27, Zc ch.28, Zicsr ch.6, Zifencei ch.5 |
| `cycle`/`cycleh` (CSR 0xC00/0xC80), `mcycle` | RISC-V Vol I ch.7.1 Zicntr; Vol II §3.1.10 | the counters `src/soc.zig:cycles()` reads |
| traps, `mtvec`/`mepc`/`mcause`, PMP, reset, NMI | RISC-V Vol II | §3.1.7, §3.1.14, §3.1.15, §3.7, §3.4, §3.5 |
| interrupts: CLIC, CLINT, priority/level encoding | rev-v1.3 TRM ch.1 §1.9 p.111 (§1.9.2 CLIC, §1.9.3 CLINT p.118); ch.12 Interrupt Matrix p.755 | architectural model in `riscv-fast-interrupt_clic_draft-v0.10` ch.3 `smclic` |
| timers | rev-v1.3 TRM | ch.15 System Timer p.1033, ch.16 Timer Group p.1058, ch.17 Watchdog Timers p.1083 (the RTC WDT the bootloader leaves armed) |
| boot: strapping, boot modes, ROM log routing | rev-v1.3 TRM ch.11 Chip Boot Control p.750; rev-v1.3 datasheet §3 (Tables 3-5/3-6 UART0 vs USB Serial-JTAG); `esptool_boot-mode-selection_*` | |
| ROM serial loader protocol (SLIP, `ESP_SYNC`, `FLASH_BEGIN/DATA/END`) | `esptool_serial-protocol_v5.3.1.rst` | what `tools/rom.zig` implements |
| flash image format, header, checksum, SHA-256 | `esptool_firmware-image-format_v5.3.1.rst`; ESP-IDF guide §2.9.1 p.1364, §2.9.2 p.1370 | what `tools/image.zig` implements |
| startup flow, second-stage bootloader, memory types, interrupt allocation, system time, LP-core, linker scripts, JTAG | ESP-IDF Programming Guide v5.3.2 PDF | p.1803 / p.1806 / p.1933 / p.1648 / p.1748 / p.1760 / p.1914 / p.1873 |
| PIE / SIMD instruction semantics | v0.7 TRM ch.4 p.210 (encodings) + `esp32p4-pie-simd_instruction-reference_esp-dl_2026-07-15.md` (346 mnemonics, no encodings) | covers all 8 mnemonics used by `examples/pie.zig`; enable via CSR 0x7F2 `CSR_PIE_STATE_REG` |
| LP core programming model | rev-v1.3 TRM ch.3 Low-Power CPU p.189 (**not** v0.7 ch.5); ESP-IDF guide ULP LP-Core p.1760 | `-march=rv32imac_zicsr_zifencei_zaamo_zalrsc` |
| silicon bugs, and detecting rev v1.3 at runtime | `esp32-p4_soc-errata_en_v1.3.pdf` | §1.2 + Table 1.1 give the exact `EFUSE_RD_MAC_SPI_SYS_2_REG[23]`/`[5:0]` pattern; ROM-764/770/816 are boot-ROM bugs live on v1.3 |
| debug port, triggers, JTAG DTM | `riscv-external-debug-support_v0.13.2` (the version P4 implements); 1.0 for the incompatibility list §1.2.1.2–1.2.1.4 | |
| calling convention, `e_flags`, relocations, `.riscv.attributes` | `riscv-elf-psabi_riscv-abi_draft-20260813.pdf` | §1.1/§1.3, §2.7–2.8 ilp32f, §5 code models, §9.4, §9.11.1 |

## Index

### `espressif-silicon/`

| file | version / date | pp | sha256:16 | source |
|---|---|---|---|---|
| `esp32-p4-chip-revision-v1.3_technical-reference-manual_en_pre-release-v0.4.pdf` | Pre-release v0.4, 2026-06-11 | 2975 | `ae1fa2a411776760` | espressif.com |
| `esp32-p4-chip-revision-v1.3_datasheet_en_v1.2.pdf` | v1.2, 2026-06-16 | 94 | `b2b0ae6fb8e92d23` | espressif.com |
| `esp32-p4_soc-errata_en_v1.3.pdf` | v1.3, PDF build 2026-08-23 | 19 | `5fd0fec5b306873a` | docs.espressif.com/projects/esp-chip-errata |
| `esp32-p4-chip-revision-v3.x_user-guide_en_v1.0.pdf` | v1.0, 2026-03-11 | 13 | `9329de55ef88f310` | espressif.com |
| `esp32-p4_technical-reference-manual_en_pre-release-v0.7.pdf` | Pre-release v0.7, 2026-08-20 | 3701 | `622fe9625d19cf00` | local copy, byte-identical to upstream |
| `esp32-p4_datasheet_en_pre-release-v0.7.pdf` | Pre-release v0.7, 2026-07-14 | 102 | `fb4f3e91cc2ac519` | local copy, byte-identical to upstream |

### `espressif-software/`

| file | version / date | pp | sha256:16 | source |
|---|---|---|---|---|
| `esp-idf-programming-guide_esp32p4_en_v5.3.2.pdf` | v5.3.2, 2024-12-06 | 2262 | `adf06f5531a5c845` | docs.espressif.com |
| `esp-idf-programming-guide_esp32p4_en_v6.0.2_html.zip` | v6.0.2 (the version `src/soc.zig` cites) | 393 html | `d3f0f339d4a86a04` | docs.espressif.com |
| `esptool_serial-protocol_v5.3.1.rst` + `_esp32p4_v5.3.1.html` | esptool v5.3.1, 2026-06-29 | — | `016dbe246a0c0edf` / `a00a70719b10fbd3` | github.com/espressif/esptool @ v5.3.1 + rendered page |
| `esptool_firmware-image-format_v5.3.1.rst` + `.html` | esptool v5.3.1 | — | `1f0cfe32a766b8ab` / `f9b6269b5d9f3601` | same |
| `esptool_boot-mode-selection_v5.3.1.rst` + `.html` | esptool v5.3.1 | — | `567510a46d727a51` / `100fdf423ba92cc0` | same |

Espressif stopped building ESP-IDF PDFs after v5.3.2; v6.0.2 exists only as the official HTML zip.
esptool has no PDF or zip artifact at all, hence the rendered HTML plus the version-pinned `.rst`
sources it is generated from. The `openocd-esp32` docs project is retired — `/en/latest/` 404s for
every target — so JTAG material comes from the ESP-IDF guide ch.4.13 instead.

### `riscv-isa/`

| file | version / date | pp | sha256:16 |
|---|---|---|---|
| `riscv-unprivileged-isa_vol1_ratified_20250508.pdf` | 20250508, **ratified** | 727 | `cef2e63c08c6f82c` |
| `riscv-privileged-architecture_vol2_ratified_20250508.pdf` | 20250508, **ratified** | 221 | `d0228bbecc76943a` |
| `riscv-external-debug-support_v0.13.2_20190322.pdf` | 0.13.2, 2019-03-22 — *the version P4 implements* | 94 | `f203abb93ee2ad60` |
| `riscv-external-debug-support_v1.0_20250221.pdf` | 1.0, ratified 2025-02-21 | 119 | `ce2787b25233a610` |
| `riscv-elf-psabi_riscv-abi_draft-20260813.pdf` | v1.1 pre-release | 118 | `ff94b93578a5ee44` |
| `riscv-fast-interrupt_clic_draft-v0.10_20250324.pdf` | v0.10 **draft** — last release carrying `clic.pdf` | 69 | `ddb80f16aecb98ff` |
| `riscv-fast-interrupt_aclic_draft-v0.20_20260731.pdf` | v0.20 **draft** — CLIC's successor document | 38 | `1892f06fd863fe73` |
| `riscv-assembly-programmers-manual_v0.0.1_20250205.pdf` | v0.0.1 | 50 | `2edf43ff39c0ca47` |
| `riscv-code-size-reduction_zc_v1.0.4-3_20231026.pdf` | v1.0.4-3 | 60 | `62cea3875763904b` |
| `riscv-plic_v1.0.0_20230312.pdf` | 1.0.0 ratified — low relevance, contrast only | 18 | `82644c7701601baa` |
| `riscv-aclint_v1.0-rc4_20220114.pdf` | 1.0-rc4 draft — low relevance, P4 uses systimer/TIMG | 11 | `fb7f1473470fbc2a` |

20250508 is the newest *ratified* ISA manual; every later tag is an unratified nightly build of the
merged in-development spec. The fast-interrupt task group has never ratified anything, so both
CLIC and ACLIC are drafts. The 0.13.2 debug PDF came from riscv.org and was `cmp`-verified
byte-identical to `riscv/riscv-debug-spec@4e0bb0fc:riscv-debug-release.pdf`.

### `espressif-custom-isa/`

| file | version / date | sha256:16 | source |
|---|---|---|---|
| `esp32p4-pie-simd_instruction-reference_esp-dl_2026-07-15.md` | `espressif/esp-dl` master @ `1def9a2d`, 2026-07-15 | `76576a92f85fb46a` | github.com/espressif/esp-dl |

No standalone PIE PDF exists; this is the only vendor reference document for the extension outside
the TRM. It condenses for machine consumption: 346 mnemonics against the assembler's 410, no
instruction encodings, and it drops the `sat` operand the TRM's syntax carries. Encodings come from
the v0.7 TRM ch.4 figures or from Espressif's `as` with `-march=…xespv2p1`.

## Not obtained

Summarised; each collector's manifest carries the evidence and the best pointer.

* No ESP32-P4 boot-ROM prose document exists anywhere. The authoritative artifacts are the ROM ELF
  and the ROM linker scripts (paths in `manifests/LocalHarvest.md`); code was deliberately not
  copied into this archive.
* No standalone LP-core ISA document. Its arch string was verified from
  `components/ulp/cmake/toolchain-lp-core-riscv.cmake`.
* No ESP-IDF v6.x PDF, no esptool PDF, no OpenOCD docs project — see `espressif-software/` above.
* ESP32-P4 Consolidated Pin Overview is `.xlsx` only, and is pin-mux material, so out of scope.
* Hardware design guidelines, packaging, RF certification, and all board-level documents
  (JC-ESP32P4-M3 dev-kit PDFs, schematics, the ESP32-C6-MINI-1 companion-module datasheet) are out
  of scope; they remain at `../../01-esp32p4-m3/docs/` and are listed in `manifests/LocalHarvest.md`.

## Provenance

`manifests/` holds one file per collector — `EspSilicon`, `EspSoftware`, `RiscvSpecs`,
`EspCustomIsa`, `LocalHarvest` — each with full URLs, byte counts, page counts, sha256 prefixes,
verified chapter/page numbers, and what it failed to find and why. Re-verify the archive with:

```
find . -name '*.pdf' -exec sh -c 'pdfinfo "$1" >/dev/null || echo "BAD $1"' _ {} \;
sha256sum $(find . -type f ! -path './manifests/*' | sort) | cut -c1-16
```