<?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=GSP_RPC_Emulation</id>
	<title>GSP RPC Emulation - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://open-iov.org/index.php?action=history&amp;feed=atom&amp;title=GSP_RPC_Emulation"/>
	<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=GSP_RPC_Emulation&amp;action=history"/>
	<updated>2026-10-12T06:39:54Z</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=GSP_RPC_Emulation&amp;diff=23971&amp;oldid=prev</id>
		<title>WikiBot: Fix repository links: point to the cgit tree URLs (git.vgpu.io/open-iov.git/tree/...)</title>
		<link rel="alternate" type="text/html" href="https://open-iov.org/index.php?title=GSP_RPC_Emulation&amp;diff=23971&amp;oldid=prev"/>
		<updated>2026-10-12T04:40:10Z</updated>

		<summary type="html">&lt;p&gt;Fix repository links: point to the cgit tree URLs (git.vgpu.io/open-iov.git/tree/...)&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:40, 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;= GSP vGPU RPC Emulation =&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;= GSP vGPU RPC Emulation =&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 page describes an earlier emulation-mode design and is retained for reference only. The project does '''not''' use NVIDIA's proprietary vGPU stack. Canonical documentation: [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/03-gsp-and-gsp-rm.md &amp;lt;code&amp;gt;../docs/03-architecture/03-gsp-and-gsp-rm.md&amp;lt;/code&amp;gt;] and [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;].&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 page describes an earlier emulation-mode design and is retained for reference only. The project does '''not''' use NVIDIA's proprietary vGPU stack. Canonical documentation: [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/03-gsp-and-gsp-rm.md &amp;lt;code&amp;gt;../docs/03-architecture/03-gsp-and-gsp-rm.md&amp;lt;/code&amp;gt;] and [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;].&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-23942:rev-23971 --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=GSP_RPC_Emulation&amp;diff=23942&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=GSP_RPC_Emulation&amp;diff=23942&amp;oldid=prev"/>
		<updated>2026-10-12T04:29:46Z</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;= GSP vGPU RPC Emulation =&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;= GSP vGPU RPC Emulation =&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-23853:rev-23942 --&gt;
&lt;/table&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=GSP_RPC_Emulation&amp;diff=23853&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=GSP_RPC_Emulation&amp;diff=23853&amp;oldid=prev"/>
		<updated>2026-10-12T04:10:03Z</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=GSP_RPC_Emulation&amp;amp;diff=23853&amp;amp;oldid=23837&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
	<entry>
		<id>https://open-iov.org/index.php?title=GSP_RPC_Emulation&amp;diff=23837&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=GSP_RPC_Emulation&amp;diff=23837&amp;oldid=prev"/>
		<updated>2026-10-12T03:58:31Z</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;gsp-vgpu-rpc-emulation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= GSP vGPU RPC Emulation =&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;
Open-IOV includes '''emulation mode''' that allows operation with unmodified consumer/OpenRM GSP firmware by emulating missing vGPU RPC handlers locally in kernel and userspace.&lt;br /&gt;
&amp;lt;span id=&amp;quot;problem&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Problem ==&lt;br /&gt;
&lt;br /&gt;
The NVIDIA GSP firmware on consumer drivers (550.163.01) and OpenRM lacks the vGPU-specific RPC handlers that exist only in the GRID host driver firmware:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Handler&lt;br /&gt;
! Address&lt;br /&gt;
! Size&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| BAR Trap&lt;br /&gt;
| 0x04CB8188&lt;br /&gt;
| 40KB&lt;br /&gt;
| BAR1/ForceBarAccess/Aperture&lt;br /&gt;
|-&lt;br /&gt;
| WPR Handler 1&lt;br /&gt;
| 0x04F00B0C&lt;br /&gt;
| 62KB&lt;br /&gt;
| Write/Read Protect Regions&lt;br /&gt;
|-&lt;br /&gt;
| WPR Handler 2&lt;br /&gt;
| 0x04F00C78&lt;br /&gt;
| 62KB&lt;br /&gt;
| Write/Read Protect Regions&lt;br /&gt;
|-&lt;br /&gt;
| Migration&lt;br /&gt;
| 0x04179ED8/0x04179FBC&lt;br /&gt;
| -&lt;br /&gt;
| Live migration&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Without these handlers, VF creation times out at BAR configuration (RPC to 0x04CB8188).&lt;br /&gt;
&amp;lt;span id=&amp;quot;solution-emulation-mode&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Solution: Emulation Mode ==&lt;br /&gt;
&lt;br /&gt;
Emulation mode intercepts vGPU RPC calls and handles them locally instead of sending to GSP:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;┌─────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                    Emulation Architecture                        │&lt;br /&gt;
├─────────────────────────────────────────────────────────────────┤&lt;br /&gt;
│                                                                  │&lt;br /&gt;
│  Userspace App (libiov.so)                                       │&lt;br /&gt;
│       │                                                          │&lt;br /&gt;
│       ▼                                                          │&lt;br /&gt;
│  ┌─────────────────┐     ┌─────────────────┐                   │&lt;br /&gt;
│  │ Kernel IOCTL    │────▶│ Emulation Layer │                   │&lt;br /&gt;
│  │ Handler         │     │ (kernel)        │                   │&lt;br /&gt;
│  └─────────────────┘     └────────┬────────┘                   │&lt;br /&gt;
│                                    │                            │&lt;br /&gt;
│                    ┌───────────────┼───────────────┐           │&lt;br /&gt;
│                    ▼               ▼               ▼           │&lt;br /&gt;
│             ┌──────────┐    ┌──────────┐    ┌──────────┐      │&lt;br /&gt;
│             │ BAR Emu  │    │ WPR Emu  │    │ Mem Emu  │      │&lt;br /&gt;
│             │ (kernel) │    │ (kernel) │    │ (kernel) │      │&lt;br /&gt;
│             └──────────┘    └──────────┘    └──────────┘      │&lt;br /&gt;
│                    │               │               │           │&lt;br /&gt;
│                    ▼               ▼               ▼           │&lt;br /&gt;
│             ┌──────────────────────────────────────────┐       │&lt;br /&gt;
│             │         Userspace Emulator (libiov.so)   │       │&lt;br /&gt;
│             │  rpc_emu_bar_*, rpc_emu_wpr_*        │       │&lt;br /&gt;
│             └──────────────────────────────────────────┘       │&lt;br /&gt;
│                                                                  │&lt;br /&gt;
└─────────────────────────────────────────────────────────────────┘&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;auto-detection-default-behavior&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Auto-Detection (Default Behavior) ==&lt;br /&gt;
&lt;br /&gt;
'''Emulation mode is ON by default''' and auto-detects at driver load:&lt;br /&gt;
&lt;br /&gt;
# Driver initializes RPC communication with GSP&lt;br /&gt;
# Sends test &amp;lt;code&amp;gt;BAR_TRAP&amp;lt;/code&amp;gt; RPC (non-destructive READ)&lt;br /&gt;
# '''If GSP responds''' (ret=0) → vGPU handlers present → '''emulation disabled'''&lt;br /&gt;
# '''If GSP times out/errors''' (ret=-ETIMEDOUT/-EIO/-ENODEV) → handlers missing → '''emulation enabled'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;dmesg output:&lt;br /&gt;
  gsp-vgpu: Auto-detecting GSP vGPU RPC handler support..&lt;br /&gt;
  gsp-vgpu: GSP lacks vGPU RPC handlers (ret=-110) - ENABLING emulation mode&lt;br /&gt;
  # or&lt;br /&gt;
  gsp-vgpu: GSP has vGPU RPC handlers - DISABLING emulation mode&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;module-parameters&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Module Parameters ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parameter&lt;br /&gt;
! Type&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;emulation_mode&amp;lt;/code&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| 1 (ON)&lt;br /&gt;
| Current state (read-only, shows auto-detected value)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;emulation_override&amp;lt;/code&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| 0 (auto)&lt;br /&gt;
| Override: 1=force emulation ON, 0=force emulation OFF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Default: auto-detect&lt;br /&gt;
sudo insmod gsp-vgpu.ko firmware_name=gsp-570.144.fwimage.bin&lt;br /&gt;
&lt;br /&gt;
# Force emulation ON (testing with GRID GSP)&lt;br /&gt;
sudo insmod gsp-vgpu.ko firmware_name=gsp-570.144.fwimage.bin emulation_override=1&lt;br /&gt;
&lt;br /&gt;
# Force emulation OFF (requires GRID GSP)&lt;br /&gt;
sudo insmod gsp-vgpu.ko firmware_name=gsp-570.144.fwimage.bin emulation_override=0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;emulated-rpc-handlers&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Emulated RPC Handlers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;kernel-emulation-driver&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Kernel Emulation (&amp;lt;code&amp;gt;driver/&amp;lt;/code&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! RPC Type&lt;br /&gt;
! Handler&lt;br /&gt;
! Emulation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GSP_RPC_ALLOC&amp;lt;/code&amp;gt; (0x01)&lt;br /&gt;
| &amp;lt;code&amp;gt;gsp_vf_mem_alloc&amp;lt;/code&amp;gt;&lt;br /&gt;
| Synthetic handles/VAs from local counter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GSP_RPC_PIN&amp;lt;/code&amp;gt; (0x05)&lt;br /&gt;
| &amp;lt;code&amp;gt;gsp_vf_mem_pin&amp;lt;/code&amp;gt;&lt;br /&gt;
| Synthetic DMA addresses from local counter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GSP_RPC_MAP&amp;lt;/code&amp;gt; (0x03)&lt;br /&gt;
| &amp;lt;code&amp;gt;gsp_vf_mem_map&amp;lt;/code&amp;gt;&lt;br /&gt;
| Identity map (return requested VA)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GSP_RPC_BAR_TRAP&amp;lt;/code&amp;gt; (0x0A)&lt;br /&gt;
| &amp;lt;code&amp;gt;gsp_bar_trap_handler&amp;lt;/code&amp;gt;&lt;br /&gt;
| Local aperture/force_access state&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GSP_RPC_MAP&amp;lt;/code&amp;gt; (WPR)&lt;br /&gt;
| &amp;lt;code&amp;gt;gsp_vf_wpr_protect&amp;lt;/code&amp;gt;&lt;br /&gt;
| Local WPR region list&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GSP_RPC_UNMAP&amp;lt;/code&amp;gt; (WPR)&lt;br /&gt;
| &amp;lt;code&amp;gt;gsp_vf_wpr_unprotect&amp;lt;/code&amp;gt;&lt;br /&gt;
| Local WPR region removal&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;userspace-emulation-userspacelibrpc_emulatorc&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Userspace Emulation (&amp;lt;code&amp;gt;userspace/lib/rpc_emulator.c&amp;lt;/code&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Function&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rpc_emu_bar_config&amp;lt;/code&amp;gt;&lt;br /&gt;
| Local aperture offset/size + backing store&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rpc_emu_bar_force_access&amp;lt;/code&amp;gt;&lt;br /&gt;
| Local force_access state&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rpc_emu_bar_save/restore&amp;lt;/code&amp;gt;&lt;br /&gt;
| Migration state serialization&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rpc_emu_wpr_protect_write/read&amp;lt;/code&amp;gt;&lt;br /&gt;
| Local WPR region tracking&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rpc_emu_wpr_unprotect&amp;lt;/code&amp;gt;&lt;br /&gt;
| Local WPR region removal&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rpc_emu_wpr_set_timeout&amp;lt;/code&amp;gt;&lt;br /&gt;
| Local timeout tracking&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rpc_emu_wpr_check_access&amp;lt;/code&amp;gt;&lt;br /&gt;
| Access violation detection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;emulation-data-structures&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Emulation Data Structures ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bar-state-per-vf&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== BAR State (per VF) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;struct gsp_bar_state {&lt;br /&gt;
    uint64_t aperture_offset;   // BAR1 aperture base&lt;br /&gt;
    uint64_t aperture_size;     // BAR1 aperture size (max 256KB)&lt;br /&gt;
    bool force_access;          // ForceBarAccess enabled&lt;br /&gt;
    uint32_t force_vf;          // VF holding force access&lt;br /&gt;
    void *backing_store;        // Emulated BAR memory&lt;br /&gt;
    size_t backing_size;        // Backing store size&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;wpr-region-list-per-vf&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== WPR Region List (per VF) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;struct gsp_wpr_region {&lt;br /&gt;
    struct list_head list;&lt;br /&gt;
    uint64_t base;              // Region base address&lt;br /&gt;
    uint64_t size;              // Region size&lt;br /&gt;
    uint32_t flags;             // GSP_WPR_WRITE/READ/EXECUTE&lt;br /&gt;
    uint32_t vf_id;             // Owning VF&lt;br /&gt;
    void (*completion_cb)(..); // Write/read complete callback&lt;br /&gt;
    void (*timeout_cb)(..);    // Timeout callback&lt;br /&gt;
    uint64_t timeout_ns;        // Timeout in nanoseconds&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;userspace-emulator-state&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Userspace Emulator State ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;struct emu_bar_state {&lt;br /&gt;
    uint64_t aperture_offset;&lt;br /&gt;
    uint64_t aperture_size;&lt;br /&gt;
    bool force_access;&lt;br /&gt;
    uint32_t force_vf;&lt;br /&gt;
    void *backing_store;&lt;br /&gt;
    size_t backing_size;&lt;br /&gt;
    pthread_mutex_t lock;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct emu_wpr_state {&lt;br /&gt;
    struct emu_wpr_region *regions;  // Linked list&lt;br /&gt;
    pthread_mutex_t lock;&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;fallback-logic&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Fallback Logic ==&lt;br /&gt;
&lt;br /&gt;
Userspace library (&amp;lt;code&amp;gt;libiov.so&amp;lt;/code&amp;gt;) implements fallback:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;vgpu_error_t vgpu_bar_config(vgpu_vf_t vf, uint64_t offset, uint64_t size) {&lt;br /&gt;
    // 1. Try kernel IOCTL (sends RPC to GSP)&lt;br /&gt;
    ret = ioctl(fd, GSP_IOCTL_BAR_CONFIG, &amp;amp;args);&lt;br /&gt;
    &lt;br /&gt;
    // 2. If GSP lacks handlers (ENOTSUP/ETIMEDOUT/EIO), use emulator&lt;br /&gt;
    if (ret &amp;lt; 0 &amp;amp;&amp;amp; dev-&amp;gt;emulation_enabled &amp;amp;&amp;amp; &lt;br /&gt;
        (errno == ENOTSUP || errno == ETIMEDOUT || errno == EIO)) {&lt;br /&gt;
        return rpc_emu_bar_config(vf-&amp;gt;id, offset, size);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return map_errno(errno);&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;limitations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature&lt;br /&gt;
! Emulation Status&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| BAR Aperture Config&lt;br /&gt;
| ✅ Full&lt;br /&gt;
| Local state + backing store&lt;br /&gt;
|-&lt;br /&gt;
| ForceBarAccess&lt;br /&gt;
| ✅ Full&lt;br /&gt;
| Per-VF exclusive access&lt;br /&gt;
|-&lt;br /&gt;
| BAR Save/Restore&lt;br /&gt;
| ✅ Full&lt;br /&gt;
| Migration support&lt;br /&gt;
|-&lt;br /&gt;
| WPR Write Protect&lt;br /&gt;
| ✅ Full&lt;br /&gt;
| Region tracking + access check&lt;br /&gt;
|-&lt;br /&gt;
| WPR Read Protect&lt;br /&gt;
| ✅ Full&lt;br /&gt;
| Region tracking + access check&lt;br /&gt;
|-&lt;br /&gt;
| WPR Timeout&lt;br /&gt;
| ✅ Partial&lt;br /&gt;
| Timeout stored, callbacks not wired&lt;br /&gt;
|-&lt;br /&gt;
| Memory Alloc&lt;br /&gt;
| ✅ Basic&lt;br /&gt;
| Synthetic handles/VAs&lt;br /&gt;
|-&lt;br /&gt;
| Memory Pin&lt;br /&gt;
| ✅ Basic&lt;br /&gt;
| Synthetic DMA addresses&lt;br /&gt;
|-&lt;br /&gt;
| Memory Map&lt;br /&gt;
| ✅ Basic&lt;br /&gt;
| Identity mapping&lt;br /&gt;
|-&lt;br /&gt;
| Migration&lt;br /&gt;
| ⚠️ Partial&lt;br /&gt;
| BAR/WPR state only&lt;br /&gt;
|-&lt;br /&gt;
| Scheduling&lt;br /&gt;
| ❌ No&lt;br /&gt;
| Returns success, no actual scheduling&lt;br /&gt;
|-&lt;br /&gt;
| Notifications&lt;br /&gt;
| ❌ No&lt;br /&gt;
| No async event delivery&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;testing-emulation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Testing Emulation ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# 1. Load driver (auto-enables emulation on consumer GSP)&lt;br /&gt;
sudo insmod driver/gsp-vgpu.ko firmware_name=gsp-570.144.fwimage.bin&lt;br /&gt;
&lt;br /&gt;
# 2. Verify emulation enabled in dmesg&lt;br /&gt;
dmesg -T | grep -i emulation&lt;br /&gt;
# gsp-vgpu: GSP lacks vGPU RPC handlers (ret=-110) - ENABLING emulation mode&lt;br /&gt;
&lt;br /&gt;
# 3. Run example - should complete without timeouts&lt;br /&gt;
sudo LD_LIBRARY_PATH=userspace/lib./userspace/examples/example_vgpu /dev/gsp-vgpu&lt;br /&gt;
&lt;br /&gt;
# 4. Check debugfs for emulated state&lt;br /&gt;
cat /sys/kernel/debug/gsp-vgpu/vfs/vf1/bar_state&lt;br /&gt;
cat /sys/kernel/debug/gsp-vgpu/vfs/vf1/wpr_regions&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;future-work&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Future Work ==&lt;br /&gt;
&lt;br /&gt;
* ☐ Wire WPR timeout callbacks to kernel timers&lt;br /&gt;
* ☐ Implement emulated scheduling with work queues&lt;br /&gt;
* ☐ Add async notification support via eventfd&lt;br /&gt;
* ☐ Complete migration state for WPR regions&lt;br /&gt;
* ☐ Performance optimization (batch RPC emulation)&lt;br /&gt;
* ☐ Conformance tests vs GRID GSP behavior&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;related-documentation&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Related Documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[BAR Emulation Specification]]&lt;br /&gt;
* [[WPR Management]]&lt;br /&gt;
* [[RPC Message Format]]&lt;br /&gt;
* [[vGPU-IO Integration Guide]]&lt;/div&gt;</summary>
		<author><name>WikiBot</name></author>
	</entry>
</feed>