From 01b091a119b7e8f1af2dc8eea964744d7133071b Mon Sep 17 00:00:00 2001
From: Kiss
Date: Wed, 13 May 2026 12:54:35 +0200
Subject: [PATCH 1/3] Add markdown button and make llms.txt available
---
docs/conf.py | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 54 insertions(+)
diff --git a/docs/conf.py b/docs/conf.py
index b063e50..8c7f54e 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -1,5 +1,7 @@
"""Configuration file for the Sphinx documentation builder."""
import os
+from pathlib import Path
+import shutil
html_baseurl = os.environ.get("READTHEDOCS_CANONICAL_URL", "instinct.docs.amd.com")
html_context = {}
@@ -45,6 +47,7 @@
"flavor": "amdgpu",
"announcement": f"AMD GPU Driver 31.20.0 is a technology preview intended for use only with AMD ROCm 7.12.0 technology preview. For production use, continue to use AMD GPU Driver {version} documentation.",
"link_main_doc": True,
+ "use_download_button": True,
# Add any additional theme options here
}
extensions = [
@@ -58,6 +61,57 @@
exclude_patterns = ['.venv']
+EXCLUDED_DIRS = {
+ "_build",
+ "_templates",
+ "_static",
+ ".git",
+ ".venv",
+}
+
+def should_skip(path: Path) -> bool:
+ return any(part in EXCLUDED_DIRS for part in path.parts)
+
+
+def generate_combined_markdown(app, exception):
+ if exception:
+ return
+
+ docs_root = Path(app.srcdir)
+ output_file = Path(app.outdir) / "llms.txt"
+
+ print(output_file)
+
+ all_files = sorted(docs_root.rglob("*.md"))
+
+ combined = []
+ combined.append("# Combined Documentation\n")
+
+ for doc_file in all_files:
+ if should_skip(doc_file):
+ continue
+
+ relative = doc_file.relative_to(docs_root)
+
+ combined.append(f"\n---\n")
+ combined.append(f"\n# {relative}\n")
+
+ try:
+ content = doc_file.read_text(encoding="utf-8")
+ combined.append(content)
+ combined.append("\n")
+
+ except Exception as e:
+ combined.append(f"\n[ERROR reading file: {e}]\n")
+
+ output_file.write_text(
+ "\n".join(combined),
+ encoding="utf-8",
+ )
+
+def setup(app):
+ app.connect("build-finished", generate_combined_markdown)
+
# Add the following replacements to every RST file.
rst_prolog = f"""
.. |version| replace:: {version}
From 00ee1cd113b6022e613e1ba32f5d7054deaa8805 Mon Sep 17 00:00:00 2001
From: Kiss
Date: Tue, 19 May 2026 14:40:41 +0200
Subject: [PATCH 2/3] Add base llms.txt and add treshold
---
docs/conf.py | 97 ++++++++++++++++++++++++++++++++++++++++++---------
docs/llms.txt | 30 ++++++++++++++++
2 files changed, 111 insertions(+), 16 deletions(-)
create mode 100644 docs/llms.txt
diff --git a/docs/conf.py b/docs/conf.py
index 8c7f54e..bb3ba6a 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -1,7 +1,7 @@
"""Configuration file for the Sphinx documentation builder."""
import os
+import re
from pathlib import Path
-import shutil
html_baseurl = os.environ.get("READTHEDOCS_CANONICAL_URL", "instinct.docs.amd.com")
html_context = {}
@@ -29,7 +29,7 @@
ol_version_numbers = ['10.1', '9.7', '8.10']
rl_version_numbers = ['9.7']
-html_context = {
+html_context.update({
"ubuntu_version_numbers" : ubuntu_version_numbers,
"debian_version_numbers" : debian_version_numbers,
"sles_version_numbers" : sles_version_numbers,
@@ -38,7 +38,7 @@
"ol_release_version_numbers" : ol_release_version_numbers,
"ol_version_numbers" : ol_version_numbers,
"rl_version_numbers" : rl_version_numbers
-}
+})
# Required settings
@@ -69,46 +69,111 @@
".venv",
}
+MARKUP_PREFIXES = (
+ ":::",
+ "```{",
+ "```",
+ ":img-top:",
+ ":class",
+ ":link:",
+ ":link-type:",
+ ":shadow:",
+ ":columns:",
+ ":padding:",
+ ":gutter:",
+ ":open:",
+ ":name:",
+ ":header-rows:",
+ ":alt:",
+ "+++",
+ "<",
+ "-->",
+ "{bdg-",
+)
+
+# Matches lines like "align: center", "alt:", "name: foo" (directive options
+# not starting with a colon, common in MyST figure/table fences)
+_BARE_DIRECTIVE_RE = re.compile(r"^[a-z][a-z_-]*:\s*\S*$")
+
+# Matches MyST/RST anchor labels like "(some-label)="
+_ANCHOR_LABEL_RE = re.compile(r"^\(\w[\w-]*\)=$")
+
+MIN_PROSE_LINES = 10
+
+
def should_skip(path: Path) -> bool:
return any(part in EXCLUDED_DIRS for part in path.parts)
+def is_prose_line(line: str) -> bool:
+ stripped = line.strip()
+ if not stripped:
+ return False
+ if stripped.startswith(MARKUP_PREFIXES):
+ return False
+ # Drop bare directive-option lines (e.g. "align: center", "alt:")
+ if _BARE_DIRECTIVE_RE.match(stripped):
+ return False
+ # Drop MyST/RST anchor labels (e.g. "(some-label)=")
+ if _ANCHOR_LABEL_RE.match(stripped):
+ return False
+ # Drop lines that contain an HTML tag anywhere (e.g. ".
")
+ if re.search(r"?[a-zA-Z]", stripped):
+ return False
+ return True
+
+
def generate_combined_markdown(app, exception):
if exception:
return
docs_root = Path(app.srcdir)
output_file = Path(app.outdir) / "llms.txt"
+ base_file = docs_root / "llms.txt"
- print(output_file)
+ combined = []
- all_files = sorted(docs_root.rglob("*.md"))
+ if base_file.exists():
+ base_text = base_file.read_text(encoding="utf-8").rstrip().rstrip("-").rstrip()
+ combined.append(base_text)
+ else:
+ combined.append("# AMD GPU Driver (amdgpu)")
- combined = []
- combined.append("# Combined Documentation\n")
+ all_files = sorted(docs_root.rglob("*.md"))
for doc_file in all_files:
if should_skip(doc_file):
continue
- relative = doc_file.relative_to(docs_root)
-
- combined.append(f"\n---\n")
- combined.append(f"\n# {relative}\n")
+ if doc_file == base_file:
+ continue
try:
content = doc_file.read_text(encoding="utf-8")
- combined.append(content)
- combined.append("\n")
+ except Exception:
+ continue
- except Exception as e:
- combined.append(f"\n[ERROR reading file: {e}]\n")
+ lines = content.splitlines()
+ prose_lines = [line for line in lines if is_prose_line(line)]
+
+ if len(prose_lines) < MIN_PROSE_LINES:
+ continue
+
+ relative = doc_file.relative_to(docs_root)
+ cleaned = "\n".join(
+ line for line in lines
+ if line.strip() == "" or is_prose_line(line)
+ )
+
+ combined.append(f"\n\n---\n\n# {relative}\n")
+ combined.append(cleaned.strip())
output_file.write_text(
- "\n".join(combined),
+ "\n".join(combined) + "\n",
encoding="utf-8",
)
+
def setup(app):
app.connect("build-finished", generate_combined_markdown)
diff --git a/docs/llms.txt b/docs/llms.txt
new file mode 100644
index 0000000..3febee6
--- /dev/null
+++ b/docs/llms.txt
@@ -0,0 +1,30 @@
+# AMD GPU Driver (amdgpu)
+
+> Install, configure, and optimize the AMD GPU driver (amdgpu) for AMD Instinct and Radeon GPUs on Linux. Covers package manager installation across major distributions, post-install steps, system optimization tuning guides for MI300X and MI300A, GPU partitioning, and conceptual reference for IOMMU, PCIe atomics, and resource oversubscription.
+
+## Install AMD GPU Driver
+
+- [Prerequisites](https://instinct.docs.amd.com/projects/amdgpu-docs/en/latest/install/detailed-install/prerequisites.html): System requirements and prerequisites before installing the AMD GPU driver, including kernel version and dependency checks.
+- [Install via package manager](https://instinct.docs.amd.com/projects/amdgpu-docs/en/latest/install/package-manager-index.html): Install the AMD GPU driver using native package managers on Ubuntu, Debian, RHEL, Oracle Linux, Rocky Linux, and SUSE Linux Enterprise Server.
+- [Post-install instructions](https://instinct.docs.amd.com/projects/amdgpu-docs/en/latest/install/detailed-install/post-install.html): Configure user groups, verify driver loading, and complete required post-installation steps after installing the AMD GPU driver.
+
+## How to
+
+- [System optimization](https://instinct.docs.amd.com/projects/amdgpu-docs/en/latest/system-optimization/index.html): Hardware and OS tuning guides for AMD Instinct GPU workloads, including BIOS settings, GRUB configuration, NBIO tuning, and environment variable recommendations.
+- [MI300X system optimization](https://instinct.docs.amd.com/projects/amdgpu-docs/en/latest/system-optimization/mi300x.html): AMD Instinct MI300X-specific system settings for HPC and AI workloads, including BIOS, NBIO, and ROCm environment variable tuning.
+- [MI300A system optimization](https://instinct.docs.amd.com/projects/amdgpu-docs/en/latest/system-optimization/mi300a.html): AMD Instinct MI300A APU-specific system tuning for high-performance computing workloads.
+- [MI200 system optimization](https://instinct.docs.amd.com/projects/amdgpu-docs/en/latest/system-optimization/mi200.html): Performance and system tuning guide for AMD Instinct MI200 series GPUs.
+- [MI100 system optimization](https://instinct.docs.amd.com/projects/amdgpu-docs/en/latest/system-optimization/mi100.html): Performance and system tuning guide for AMD Instinct MI100 GPUs.
+- [MI300X GPU partitioning overview](https://instinct.docs.amd.com/projects/amdgpu-docs/en/latest/gpu-partitioning/mi300x/overview.html): Overview of GPU partitioning capabilities on AMD Instinct MI300X, including partition modes and resource isolation.
+- [MI300X GPU partitioning requirements](https://instinct.docs.amd.com/projects/amdgpu-docs/en/latest/gpu-partitioning/mi300x/requirements.html): Hardware and software requirements for enabling GPU partitioning on AMD Instinct MI300X.
+- [MI300X GPU partitioning quick start](https://instinct.docs.amd.com/projects/amdgpu-docs/en/latest/gpu-partitioning/mi300x/quick-start-guide.html): Step-by-step guide to configuring and activating GPU partitioning on AMD Instinct MI300X.
+- [MI300X GPU partitioning troubleshooting](https://instinct.docs.amd.com/projects/amdgpu-docs/en/latest/gpu-partitioning/mi300x/troubleshooting.html): Diagnose and resolve common issues when configuring GPU partitioning on AMD Instinct MI300X.
+- [MI300A GPU partitioning overview](https://instinct.docs.amd.com/projects/amdgpu-docs/en/latest/gpu-partitioning/mi300a/overview.html): Overview of GPU partitioning on the AMD Instinct MI300A APU.
+
+## Conceptual
+
+- [IOMMU](https://instinct.docs.amd.com/projects/amdgpu-docs/en/latest/conceptual/iommu.html): How Input-Output Memory Management Unit (IOMMU) affects AMD GPU DMA operations, PCIe topology, and xGMI configurations.
+- [PCIe atomics](https://instinct.docs.amd.com/projects/amdgpu-docs/en/latest/conceptual/pcie-atomics.html): PCIe atomic operations support in ROCm and their role in GPU peer-to-peer communication.
+- [Oversubscription](https://instinct.docs.amd.com/projects/amdgpu-docs/en/latest/conceptual/oversubscription.html): Considerations and tradeoffs when oversubscribing hardware resources with AMD GPU workloads.
+
+---
From 34aa66e8be48d958ff38f81aa5ca6d574d24f9dd Mon Sep 17 00:00:00 2001
From: Kiss
Date: Thu, 21 May 2026 12:21:20 +0200
Subject: [PATCH 3/3] Add llms-full.txt and keep the llms.txt as base
---
docs/conf.py | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/docs/conf.py b/docs/conf.py
index bb3ba6a..24ff988 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -61,6 +61,8 @@
exclude_patterns = ['.venv']
+html_extra_path = ["llms.txt"]
+
EXCLUDED_DIRS = {
"_build",
"_templates",
@@ -98,6 +100,9 @@
# Matches MyST/RST anchor labels like "(some-label)="
_ANCHOR_LABEL_RE = re.compile(r"^\(\w[\w-]*\)=$")
+# Matches RST section underlines (e.g. "====", "----", "~~~~")
+_RST_UNDERLINE_RE = re.compile(r"^[=\-~^\"\'#*+]{3,}$")
+
MIN_PROSE_LINES = 10
@@ -120,6 +125,15 @@ def is_prose_line(line: str) -> bool:
# Drop lines that contain an HTML tag anywhere (e.g. ".")
if re.search(r"?[a-zA-Z]", stripped):
return False
+ # Drop RST directives, comments, hyperlink targets, and substitution definitions
+ if stripped.startswith(".."):
+ return False
+ # Drop RST field list items (e.g. ":type: int") and MyST directive options not in MARKUP_PREFIXES
+ if re.match(r"^:[A-Za-z]", stripped):
+ return False
+ # Drop RST section underlines (e.g. "====", "----", "~~~~")
+ if _RST_UNDERLINE_RE.match(stripped):
+ return False
return True
@@ -128,7 +142,7 @@ def generate_combined_markdown(app, exception):
return
docs_root = Path(app.srcdir)
- output_file = Path(app.outdir) / "llms.txt"
+ output_file = Path(app.outdir) / "llms-full.txt"
base_file = docs_root / "llms.txt"
combined = []
@@ -139,7 +153,9 @@ def generate_combined_markdown(app, exception):
else:
combined.append("# AMD GPU Driver (amdgpu)")
- all_files = sorted(docs_root.rglob("*.md"))
+ all_files = sorted(
+ list(docs_root.rglob("*.md")) + list(docs_root.rglob("*.rst"))
+ )
for doc_file in all_files:
if should_skip(doc_file):