<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://open-iov.org/index.php?action=history&amp;feed=atom&amp;title=VGPU-IO_Integration_Guide</id>
	<title>VGPU-IO Integration Guide - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://open-iov.org/index.php?action=history&amp;feed=atom&amp;title=VGPU-IO_Integration_Guide"/>
	<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=VGPU-IO_Integration_Guide&amp;action=history"/>
	<updated>2026-10-12T07:14:52Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://open-iov.org/index.php?title=VGPU-IO_Integration_Guide&amp;diff=23993&amp;oldid=prev</id>
		<title>WikiBot: Fix repository links: point to the cgit tree URLs</title>
		<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=VGPU-IO_Integration_Guide&amp;diff=23993&amp;oldid=prev"/>
		<updated>2026-10-12T04:41:03Z</updated>

		<summary type="html">&lt;p&gt;Fix repository links: point to the cgit tree URLs&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 04:41, 12 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l3&quot;&gt;Line 3:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 3:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= vGPU-IO Integration Guide =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= vGPU-IO Integration Guide =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;blockquote&amp;gt;'''Historical document — superseded.''' This earlier integration design predates the current stack and is retained for reference only. Canonical documentation: getting started [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/docs/02-getting-started &amp;lt;code&amp;gt;../docs/02-getting-started/&amp;lt;/code&amp;gt;], host module [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/docs/03-architecture/06-host-module-and-hybrid-model.md &amp;lt;code&amp;gt;../docs/03-architecture/06-host-module-and-hybrid-model.md&amp;lt;/code&amp;gt;], developer standards [https://git.vgpu.io/open-iov/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob/master&lt;/del&gt;/docs/07-developers &amp;lt;code&amp;gt;../docs/07-developers/&amp;lt;/code&amp;gt;].&amp;lt;/blockquote&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;blockquote&amp;gt;'''Historical document — superseded.''' This earlier integration design predates the current stack and is retained for reference only. Canonical documentation: getting started [https://git.vgpu.io/open-iov&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;.git&lt;/ins&gt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;tree&lt;/ins&gt;/docs/02-getting-started &amp;lt;code&amp;gt;../docs/02-getting-started/&amp;lt;/code&amp;gt;], host module [https://git.vgpu.io/open-iov&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;.git&lt;/ins&gt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;tree&lt;/ins&gt;/docs/03-architecture/06-host-module-and-hybrid-model.md &amp;lt;code&amp;gt;../docs/03-architecture/06-host-module-and-hybrid-model.md&amp;lt;/code&amp;gt;], developer standards [https://git.vgpu.io/open-iov&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;.git&lt;/ins&gt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;tree&lt;/ins&gt;/docs/07-developers &amp;lt;code&amp;gt;../docs/07-developers/&amp;lt;/code&amp;gt;].&amp;lt;/blockquote&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Overview ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Overview ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key my_wiki:diff::1.12:old-23959:rev-23993 --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=VGPU-IO_Integration_Guide&amp;diff=23959&amp;oldid=prev</id>
		<title>WikiBot: Carry the site-wide About/licensing message on every page (2026-10-12)</title>
		<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=VGPU-IO_Integration_Guide&amp;diff=23959&amp;oldid=prev"/>
		<updated>2026-10-12T04:29:54Z</updated>

		<summary type="html">&lt;p&gt;Carry the site-wide About/licensing message on every page (2026-10-12)&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 04:29, 12 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{About message}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= vGPU-IO Integration Guide =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= vGPU-IO Integration Guide =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key my_wiki:diff::1.12:old-23859:rev-23959 --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=VGPU-IO_Integration_Guide&amp;diff=23859&amp;oldid=prev</id>
		<title>WikiBot: Re-sync page from tracked wiki source: fix cross-document links and diagram; refresh status</title>
		<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=VGPU-IO_Integration_Guide&amp;diff=23859&amp;oldid=prev"/>
		<updated>2026-10-12T04:10:07Z</updated>

		<summary type="html">&lt;p&gt;Re-sync page from tracked wiki source: fix cross-document links and diagram; refresh status&lt;/p&gt;
&lt;a href=&quot;https://open-iov.org/index.php?title=VGPU-IO_Integration_Guide&amp;amp;diff=23859&amp;amp;oldid=23838&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=VGPU-IO_Integration_Guide&amp;diff=23838&amp;oldid=prev</id>
		<title>WikiBot: Remove unpaired blockquote tags left by reference cleanup</title>
		<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=VGPU-IO_Integration_Guide&amp;diff=23838&amp;oldid=prev"/>
		<updated>2026-10-12T03:58:32Z</updated>

		<summary type="html">&lt;p&gt;Remove unpaired blockquote tags left by reference cleanup&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;span id=&amp;quot;vgpu-io-integration-guide&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= vGPU-IO Integration Guide =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;overview&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This guide covers implementing a Linux kernel driver for vGPU-IO using the GSP 570.144W firmware RPC interface.&lt;br /&gt;
&amp;lt;span id=&amp;quot;architecture&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;┌─────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                    vGPU-IO Kernel Driver                     │&lt;br /&gt;
├─────────────────────────────────────────────────────────────┤&lt;br /&gt;
│  gsp_core.c      │  gsp_rpc.c    │  gsp_vf.c               │&lt;br /&gt;
│  - Device probe  │  - RPC client │  - VF lifecycle         │&lt;br /&gt;
│  - BAR mapping   │  - Doorbell   │  - Migration            │&lt;br /&gt;
│  - IRQ/MSI-X     │  - Completion │  - WPR/BAR integration  │&lt;br /&gt;
├─────────────────────────────────────────────────────────────┤&lt;br /&gt;
│                    GSP Firmware (570.144W)                   │&lt;br /&gt;
│  Primary Dispatcher (0x057A1AC0)  │  Secondary (0x04ED39DC) │&lt;br /&gt;
│  BAR Handler (0x04CB8188)         │  WPR Handlers           │&lt;br /&gt;
│  Migration (0x04179ED8/0x04179FBC)│  SCHED/ALLOC/PIN        │&lt;br /&gt;
└─────────────────────────────────────────────────────────────┘&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;module-structure&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Module Structure ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;drivers/gpu/nvidia/gsp/&lt;br /&gt;
├── gsp.h              # Core definitions&lt;br /&gt;
├── gsp_rpc.h          # RPC message formats&lt;br /&gt;
├── gsp_vf.h           # VF definitions&lt;br /&gt;
├── gsp_bar.h          # BAR emulation&lt;br /&gt;
├── gsp_wpr.h          # WPR management&lt;br /&gt;
├── gsp_migration.h    # Migration protocol&lt;br /&gt;
├── gsp_core.c         # Probe/remove, BAR/IRQ&lt;br /&gt;
├── gsp_rpc.c          # RPC client implementation&lt;br /&gt;
├── gsp_vf.c           # VF create/destroy&lt;br /&gt;
├── gsp_bar.c          # BAR trap handler&lt;br /&gt;
├── gsp_wpr.c          # WPR protect/unprotect&lt;br /&gt;
├── gsp_migration.c    # Live migration&lt;br /&gt;
└── gsp_debugfs.c      # Debug interface&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;core-data-structures&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Core Data Structures ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gsp-device&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== GSP Device ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;struct gsp_device {&lt;br /&gt;
    struct pci_dev *pdev;&lt;br /&gt;
    void __iomem *bar0;           // PCIe BAR0 mapping&lt;br /&gt;
    void __iomem *bar1;           // PCIe BAR1 (GSP FW)&lt;br /&gt;
    struct gsp_firmware *fw;      // Firmware image&lt;br /&gt;
    struct gsp_rpc_client *rpc;   // RPC client&lt;br /&gt;
    struct mutex vf_lock;&lt;br /&gt;
    struct idr vf_idr;            // VF ID allocator&lt;br /&gt;
    struct list_head vf_list;&lt;br /&gt;
    struct gsp_debugfs *debugfs;&lt;br /&gt;
    spinlock_t doorbell_lock;&lt;br /&gt;
    uint32_t doorbell_seq;&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;vf-virtual-function&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== VF (Virtual Function) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;struct gsp_vf {&lt;br /&gt;
    struct gsp_device *gsp;&lt;br /&gt;
    uint32_t id;                  // VF ID (1-7)&lt;br /&gt;
    struct kref ref;&lt;br /&gt;
    struct mutex lock;&lt;br /&gt;
    mig_state_t mig_state;&lt;br /&gt;
    struct gsp_migration *migration;&lt;br /&gt;
    uint64_t bar1_offset;         // BAR1 aperture offset&lt;br /&gt;
    uint64_t bar1_size;           // BAR1 aperture size&lt;br /&gt;
    uint64_t pt_base;             // Page table base&lt;br /&gt;
    uint64_t pt_size;             // Page table size&lt;br /&gt;
    uint64_t cmd_base;            // Command buffer base&lt;br /&gt;
    uint64_t cmd_size;            // Command buffer size&lt;br /&gt;
    struct gsp_wpr_region *wpr_regions;&lt;br /&gt;
    struct list_head wpr_list;&lt;br /&gt;
    struct gsp_bar_state bar_state;&lt;br /&gt;
    atomic_t refcount;&lt;br /&gt;
    bool active;&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;initialization-sequence&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Initialization Sequence ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;1-pci-probe&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1. PCI Probe ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;static int gsp_probe(struct pci_dev *pdev, const struct pci_device_id *id) {&lt;br /&gt;
    struct gsp_device *gsp;&lt;br /&gt;
    int ret;&lt;br /&gt;
    &lt;br /&gt;
    gsp = devm_kzalloc(&amp;amp;pdev-&amp;gt;dev, sizeof(*gsp), GFP_KERNEL);&lt;br /&gt;
    gsp-&amp;gt;pdev = pdev;&lt;br /&gt;
    pci_set_drvdata(pdev, gsp);&lt;br /&gt;
    &lt;br /&gt;
    // Enable PCI device&lt;br /&gt;
    ret = pcim_enable_device(pdev);&lt;br /&gt;
    if (ret) return ret;&lt;br /&gt;
    &lt;br /&gt;
    // Map BARs&lt;br /&gt;
    gsp-&amp;gt;bar0 = pcim_iomap(pdev, 0, 0);&lt;br /&gt;
    gsp-&amp;gt;bar1 = pcim_iomap(pdev, 1, 0);&lt;br /&gt;
    if (!gsp-&amp;gt;bar0 || !gsp-&amp;gt;bar1) return -ENOMEM;&lt;br /&gt;
    &lt;br /&gt;
    // Load firmware&lt;br /&gt;
    ret = gsp_firmware_load(gsp, &amp;quot;gsp-570.144.fwimage.bin&amp;quot;);&lt;br /&gt;
    if (ret) return ret;&lt;br /&gt;
    &lt;br /&gt;
    // Initialize RPC client&lt;br /&gt;
    gsp-&amp;gt;rpc = gsp_rpc_client_init(gsp);&lt;br /&gt;
    if (IS_ERR(gsp-&amp;gt;rpc)) return PTR_ERR(gsp-&amp;gt;rpc);&lt;br /&gt;
    &lt;br /&gt;
    // Setup IRQ/MSI-X&lt;br /&gt;
    ret = gsp_setup_irq(gsp);&lt;br /&gt;
    if (ret) return ret;&lt;br /&gt;
    &lt;br /&gt;
    // Initialize debugfs&lt;br /&gt;
    gsp_debugfs_init(gsp);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;2-firmware-loading&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2. Firmware Loading ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int gsp_firmware_load(struct gsp_device *gsp, const char *name) {&lt;br /&gt;
    const struct firmware *fw;&lt;br /&gt;
    int ret;&lt;br /&gt;
    &lt;br /&gt;
    ret = request_firmware(&amp;amp;fw, name, &amp;amp;gsp-&amp;gt;pdev-&amp;gt;dev);&lt;br /&gt;
    if (ret) return ret;&lt;br /&gt;
    &lt;br /&gt;
    // Verify MD5: 13ce12a392a31eeb79a2e6ebd3a4a93a&lt;br /&gt;
    if (!gsp_firmware_verify(fw-&amp;gt;data, fw-&amp;gt;size)) {&lt;br /&gt;
        release_firmware(fw);&lt;br /&gt;
        return -EINVAL;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Load to GSP memory (via BAR1)&lt;br /&gt;
    ret = gsp_firmware_upload(gsp, fw-&amp;gt;data, fw-&amp;gt;size);&lt;br /&gt;
    release_firmware(fw);&lt;br /&gt;
    &lt;br /&gt;
    return ret;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;3-gsp-boot&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3. GSP Boot ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int gsp_boot(struct gsp_device *gsp) {&lt;br /&gt;
    // 1. Reset GSP&lt;br /&gt;
    writel(1, gsp-&amp;gt;bar0 + GSP_RESET_REG);&lt;br /&gt;
    msleep(10);&lt;br /&gt;
    writel(0, gsp-&amp;gt;bar0 + GSP_RESET_REG);&lt;br /&gt;
    &lt;br /&gt;
    // 2. Wait for entry point (0x04009000) to signal ready&lt;br /&gt;
    ret = gsp_wait_for_ready(gsp, 5000);  // 5s timeout&lt;br /&gt;
    if (ret) return ret;&lt;br /&gt;
    &lt;br /&gt;
    // 3. Initialize RPC dispatchers&lt;br /&gt;
    ret = gsp_rpc_init_dispatchers(gsp);&lt;br /&gt;
    if (ret) return ret;&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;rpc-client-implementation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== RPC Client Implementation ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;doorbell-mechanism&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Doorbell Mechanism ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;#define GSP_DOORBELL_OFFSET   0x1000&lt;br /&gt;
#define GSP_MSG_RING_SIZE     256&lt;br /&gt;
#define GSP_MSG_MAX_SIZE      256&lt;br /&gt;
&lt;br /&gt;
struct gsp_rpc_client {&lt;br /&gt;
    struct gsp_device *gsp;&lt;br /&gt;
    struct mutex lock;&lt;br /&gt;
    uint32_t seq;&lt;br /&gt;
    wait_queue_head_t wq;&lt;br /&gt;
    struct gsp_msg_ring *ring;&lt;br /&gt;
    struct completion *pending[GSP_MAX_PENDING];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
static int gsp_rpc_send_sync(struct gsp_rpc_client *rpc,&lt;br /&gt;
                             uint32_t rpc_type,&lt;br /&gt;
                             void *payload, size_t payload_size,&lt;br /&gt;
                             void *response, size_t *response_size) {&lt;br /&gt;
    struct gsp_msg msg = {.hdr = {.magic = 0x47535052,.version = 1,.rpc_type = rpc_type,.sequence = atomic_inc_return(&amp;amp;rpc-&amp;gt;seq),.timestamp_ns = ktime_get_ns,.payload_size = payload_size,.flags = MSG_SYNC,&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    struct completion done;&lt;br /&gt;
    init_completion(&amp;amp;done);&lt;br /&gt;
    &lt;br /&gt;
    mutex_lock(&amp;amp;rpc-&amp;gt;lock);&lt;br /&gt;
    rpc-&amp;gt;pending[msg.hdr.sequence % GSP_MAX_PENDING] = &amp;amp;done;&lt;br /&gt;
    &lt;br /&gt;
    // Copy message to ring buffer&lt;br /&gt;
    memcpy(msg.hdr.payload, payload, payload_size);&lt;br /&gt;
    gsp_ring_write(rpc-&amp;gt;ring, &amp;amp;msg, GSP_MSG_MAX_SIZE);&lt;br /&gt;
    &lt;br /&gt;
    // Ring doorbell&lt;br /&gt;
    writel(1, rpc-&amp;gt;gsp-&amp;gt;bar0 + GSP_DOORBELL_OFFSET);&lt;br /&gt;
    &lt;br /&gt;
    mutex_unlock(&amp;amp;rpc-&amp;gt;lock);&lt;br /&gt;
    &lt;br /&gt;
    // Wait for completion&lt;br /&gt;
    if (!wait_for_completion_timeout(&amp;amp;done, msecs_to_jiffies(5000)))&lt;br /&gt;
        return -ETIMEDOUT;&lt;br /&gt;
    &lt;br /&gt;
    // Copy response&lt;br /&gt;
    if (response &amp;amp;&amp;amp; response_size) {&lt;br /&gt;
        *response_size = min(*response_size, done.payload_size);&lt;br /&gt;
        memcpy(response, done.payload, *response_size);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return done.status;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;completion-handler-isr&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Completion Handler (ISR) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;static irqreturn_t gsp_isr(int irq, void *data) {&lt;br /&gt;
    struct gsp_device *gsp = data;&lt;br /&gt;
    struct gsp_msg msg;&lt;br /&gt;
    &lt;br /&gt;
    while (gsp_ring_read(gsp-&amp;gt;rpc-&amp;gt;ring, &amp;amp;msg)) {&lt;br /&gt;
        if (msg.hdr.flags &amp;amp; MSG_SYNC) {&lt;br /&gt;
            struct completion *done = &lt;br /&gt;
                gsp-&amp;gt;rpc-&amp;gt;pending[msg.hdr.sequence % GSP_MAX_PENDING];&lt;br /&gt;
            if (done) {&lt;br /&gt;
                done-&amp;gt;status = msg.payload.status;&lt;br /&gt;
                done-&amp;gt;payload_size = msg.hdr.payload_size;&lt;br /&gt;
                memcpy(done-&amp;gt;payload, msg.payload.data, msg.hdr.payload_size);&lt;br /&gt;
                complete(done);&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            // Async notification&lt;br /&gt;
            gsp_handle_notification(gsp, &amp;amp;msg);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return IRQ_HANDLED;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;vf-lifecycle&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== VF Lifecycle ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;create-vf&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Create VF ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int gsp_vf_create(struct gsp_device *gsp, uint32_t vf_id,&lt;br /&gt;
                  const struct gsp_vf_config *config) {&lt;br /&gt;
    struct gsp_vf *vf;&lt;br /&gt;
    int ret;&lt;br /&gt;
    &lt;br /&gt;
    mutex_lock(&amp;amp;gsp-&amp;gt;vf_lock);&lt;br /&gt;
    &lt;br /&gt;
    if (idr_alloc(&amp;amp;gsp-&amp;gt;vf_idr, NULL, vf_id, vf_id + 1, GFP_KERNEL) &amp;lt; 0) {&lt;br /&gt;
        ret = -EBUSY;&lt;br /&gt;
        goto unlock;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    vf = kzalloc(sizeof(*vf), GFP_KERNEL);&lt;br /&gt;
    vf-&amp;gt;gsp = gsp;&lt;br /&gt;
    vf-&amp;gt;id = vf_id;&lt;br /&gt;
    kref_init(&amp;amp;vf-&amp;gt;ref);&lt;br /&gt;
    mutex_init(&amp;amp;vf-&amp;gt;lock);&lt;br /&gt;
    INIT_LIST_HEAD(&amp;amp;vf-&amp;gt;wpr_list);&lt;br /&gt;
    &lt;br /&gt;
    // Configure VF resources&lt;br /&gt;
    vf-&amp;gt;bar1_offset = config-&amp;gt;bar1_offset;&lt;br /&gt;
    vf-&amp;gt;bar1_size = config-&amp;gt;bar1_size;&lt;br /&gt;
    vf-&amp;gt;pt_base = config-&amp;gt;pt_base;&lt;br /&gt;
    vf-&amp;gt;pt_size = config-&amp;gt;pt_size;&lt;br /&gt;
    vf-&amp;gt;cmd_base = config-&amp;gt;cmd_base;&lt;br /&gt;
    vf-&amp;gt;cmd_size = config-&amp;gt;cmd_size;&lt;br /&gt;
    &lt;br /&gt;
    // Initialize WPR for VF&lt;br /&gt;
    ret = gsp_vf_wpr_init(vf);&lt;br /&gt;
    if (ret) goto err_wpr;&lt;br /&gt;
    &lt;br /&gt;
    // Initialize BAR for VF&lt;br /&gt;
    ret = gsp_vf_bar_init(vf);&lt;br /&gt;
    if (ret) goto err_bar;&lt;br /&gt;
    &lt;br /&gt;
    list_add(&amp;amp;vf-&amp;gt;list, &amp;amp;gsp-&amp;gt;vf_list);&lt;br /&gt;
    vf-&amp;gt;active = true;&lt;br /&gt;
    &lt;br /&gt;
    mutex_unlock(&amp;amp;gsp-&amp;gt;vf_lock);&lt;br /&gt;
    return 0;&lt;br /&gt;
    &lt;br /&gt;
err_bar:&lt;br /&gt;
    gsp_vf_wpr_fini(vf);&lt;br /&gt;
err_wpr:&lt;br /&gt;
    idr_remove(&amp;amp;gsp-&amp;gt;vf_idr, vf_id);&lt;br /&gt;
    kfree(vf);&lt;br /&gt;
unlock:&lt;br /&gt;
    mutex_unlock(&amp;amp;gsp-&amp;gt;vf_lock);&lt;br /&gt;
    return ret;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;destroy-vf&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Destroy VF ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;void gsp_vf_destroy(struct gsp_vf *vf) {&lt;br /&gt;
    struct gsp_device *gsp = vf-&amp;gt;gsp;&lt;br /&gt;
    uint32_t id = vf-&amp;gt;id;&lt;br /&gt;
    &lt;br /&gt;
    mutex_lock(&amp;amp;gsp-&amp;gt;vf_lock);&lt;br /&gt;
    vf-&amp;gt;active = false;&lt;br /&gt;
    list_del(&amp;amp;vf-&amp;gt;list);&lt;br /&gt;
    mutex_unlock(&amp;amp;gsp-&amp;gt;vf_lock);&lt;br /&gt;
    &lt;br /&gt;
    gsp_vf_bar_fini(vf);&lt;br /&gt;
    gsp_vf_wpr_fini(vf);&lt;br /&gt;
    &lt;br /&gt;
    if (vf-&amp;gt;migration)&lt;br /&gt;
        gsp_migration_cancel(vf-&amp;gt;migration);&lt;br /&gt;
    &lt;br /&gt;
    kref_put(&amp;amp;vf-&amp;gt;ref, gsp_vf_release);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void gsp_vf_release(struct kref *ref) {&lt;br /&gt;
    struct gsp_vf *vf = container_of(ref, struct gsp_vf, ref);&lt;br /&gt;
    kfree(vf);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;memory-management-allocpin&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Memory Management (ALLOC/PIN) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;allocate-vf-memory&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Allocate VF Memory ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int gsp_vf_mem_alloc(struct gsp_vf *vf, &lt;br /&gt;
                     uint64_t size, uint32_t flags,&lt;br /&gt;
                     uint64_t *handle, uint64_t *va) {&lt;br /&gt;
    struct alloc_payload payload = {.size = size,.type = MEM_TYPE_VRAM,.alignment = 0x1000,.va_hint = 0,.flags = flags,.pid = current-&amp;gt;pid,.vf_id = vf-&amp;gt;id,&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    struct alloc_response resp;&lt;br /&gt;
    size_t resp_size = sizeof(resp);&lt;br /&gt;
    &lt;br /&gt;
    return gsp_rpc_send_sync(vf-&amp;gt;gsp-&amp;gt;rpc, RPC_ALLOC,&lt;br /&gt;
                             &amp;amp;payload, sizeof(payload),&lt;br /&gt;
                             &amp;amp;resp, &amp;amp;resp_size);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;pin-memory-for-dma&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Pin Memory for DMA ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;int gsp_vf_mem_pin(struct gsp_vf *vf, uint64_t handle,&lt;br /&gt;
                   uint64_t offset, uint64_t size,&lt;br /&gt;
                   uint64_t *dma_addr) {&lt;br /&gt;
    struct pin_payload payload = {.handle = handle,.offset = offset,.size = size,.vf_id = vf-&amp;gt;id,.flags = PIN_WRITE | PIN_READ,&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    struct pin_response resp;&lt;br /&gt;
    size_t resp_size = sizeof(resp);&lt;br /&gt;
    &lt;br /&gt;
    return gsp_rpc_send_sync(vf-&amp;gt;gsp-&amp;gt;rpc, RPC_PIN,&lt;br /&gt;
                             &amp;amp;payload, sizeof(payload),&lt;br /&gt;
                             &amp;amp;resp, &amp;amp;resp_size);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;debugging--testing&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Debugging &amp;amp;amp; Testing ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;debugfs-interface&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Debugfs Interface ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# List VFs&lt;br /&gt;
cat /sys/kernel/debug/gsp/vfs&lt;br /&gt;
&lt;br /&gt;
# VF details&lt;br /&gt;
cat /sys/kernel/debug/gsp/vf/1/status&lt;br /&gt;
&lt;br /&gt;
# RPC statistics&lt;br /&gt;
cat /sys/kernel/debug/gsp/rpc/stats&lt;br /&gt;
&lt;br /&gt;
# BAR state&lt;br /&gt;
cat /sys/kernel/debug/gsp/vf/1/bar&lt;br /&gt;
&lt;br /&gt;
# WPR regions&lt;br /&gt;
cat /sys/kernel/debug/gsp/vf/1/wpr&lt;br /&gt;
&lt;br /&gt;
# Migration status&lt;br /&gt;
cat /sys/kernel/debug/gsp/vf/1/migration&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;trace-events&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Trace Events ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Enable tracing&lt;br /&gt;
echo 1 &amp;gt; /sys/kernel/debug/tracing/events/gsp/enable&lt;br /&gt;
&lt;br /&gt;
# Trace migration&lt;br /&gt;
trace-cmd record -e gsp_mig_phase -e gsp_mig_transfer&lt;br /&gt;
&lt;br /&gt;
# Trace WPR&lt;br /&gt;
trace-cmd record -e gsp_wpr_event&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;unit-tests&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Unit Tests ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;// kselftest for gsp-rpc&lt;br /&gt;
static void test_rpc_alloc(void) {&lt;br /&gt;
    struct gsp_vf *vf = create_test_vf;&lt;br /&gt;
    uint64_t handle, va;&lt;br /&gt;
    &lt;br /&gt;
    ASSERT_EQ(gsp_vf_mem_alloc(vf, 4096, 0, &amp;amp;handle, &amp;amp;va), 0);&lt;br /&gt;
    ASSERT_NE(handle, 0);&lt;br /&gt;
    ASSERT_NE(va, 0);&lt;br /&gt;
    &lt;br /&gt;
    gsp_vf_mem_free(vf, handle);&lt;br /&gt;
    destroy_test_vf(vf);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;error-handling-checklist&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Error Handling Checklist ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Scenario&lt;br /&gt;
! Detection&lt;br /&gt;
! Recovery&lt;br /&gt;
|-&lt;br /&gt;
| GSP firmware crash&lt;br /&gt;
| Watchdog timeout&lt;br /&gt;
| Reset GSP, reload FW&lt;br /&gt;
|-&lt;br /&gt;
| RPC timeout&lt;br /&gt;
| Doorbell no response&lt;br /&gt;
| Retry, then VF reset&lt;br /&gt;
|-&lt;br /&gt;
| BAR trap storm&lt;br /&gt;
| Rate limit exceeded&lt;br /&gt;
| Throttle VF&lt;br /&gt;
|-&lt;br /&gt;
| WPR violation&lt;br /&gt;
| Callback storm&lt;br /&gt;
| Quarantine VF&lt;br /&gt;
|-&lt;br /&gt;
| Migration fail&lt;br /&gt;
| Commit verify fail&lt;br /&gt;
| Rollback to source&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;performance-tuning&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Performance Tuning ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;rpc-batching&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== RPC Batching ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;// Batch multiple ALLOCs in single RPC&lt;br /&gt;
struct batch_alloc_payload {&lt;br /&gt;
    uint32_t count;&lt;br /&gt;
    struct alloc_payload allocs[MAX_BATCH];&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;async-completion&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Async Completion ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;// Use async RPC for non-critical paths&lt;br /&gt;
gsp_rpc_send_async(rpc, RPC_NOTIFY, payload, size, callback, ctx);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;memory-pool&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Memory Pool ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;// Pre-allocate bounce buffers&lt;br /&gt;
struct gsp_bounce_pool {&lt;br /&gt;
    struct page **pages;&lt;br /&gt;
    int count;&lt;br /&gt;
    spinlock_t lock;&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;reference&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Reference ==&lt;br /&gt;
&lt;br /&gt;
* GSP Firmware: gsp-570.144.fwimage.bin&lt;br /&gt;
* Base Address: 0x04000000&lt;br /&gt;
* Primary Dispatcher: 0x057A1AC0&lt;br /&gt;
* Secondary Dispatcher: 0x04ED39DC&lt;/div&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
</feed>