<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>PCIe on 0xc0de</title>
    <link>https://0xc0de.xyz/categories/pcie/</link>
    <description>Recent content in PCIe on 0xc0de</description>
    <image>
      <title>0xc0de</title>
      <url>https://0xc0de.xyz/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</url>
      <link>https://0xc0de.xyz/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</link>
    </image>
    <generator>Hugo</generator>
    <language>zh-tw</language>
    <lastBuildDate>Fri, 07 Jul 2023 14:08:12 +0800</lastBuildDate>
    <atom:link href="https://0xc0de.xyz/categories/pcie/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>QEMU PCI/PCIe Emulation (DesignWare PCIe Host Controller)</title>
      <link>https://0xc0de.xyz/posts/qemu-pcie/</link>
      <pubDate>Fri, 07 Jul 2023 14:08:12 +0800</pubDate>
      <guid>https://0xc0de.xyz/posts/qemu-pcie/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;SW 透過 host controller 設定 BAR 的位址，實際上在 QEMU 中就是新增/改變對應到該 BAR memory region 的 memory subregion base address
&lt;ul&gt;
&lt;li&gt;BAR 空間記錄的是 PCI/PCIe 自己的 address space，而不是 memory address space，兩者實際上是不相通的。但由於大部分系統都會將 PCI/PCIe address space 映射到相同位址的 memory address space，因此”看起來”就像是 CPU 直接對 memory address space 做存取，可其實兩個 address spaces 是需要透過 host controller 做轉換的
&lt;ul&gt;
&lt;li&gt;CPU 存取 PCI/PCIe device 的時候，實際硬體是必須透過 host controller 來將 MMIO transaction (e.g., AXI transaction) / address 轉換成 PCI/PCIe transaction / address 才能存取到該 PCI/PCIe device 的。但 QEMU 的模擬並不會真的透過 host controller，而是直接存取前述之 BAR memory subregion&lt;/li&gt;
&lt;li&gt;反之，當 PCI/PCIe master device 做 DMA 的時候，也是需要透過 host controller 才能將其所發出的 PCI/PCIe transaction / address 轉換成 MMIO transaction (e.g., AXI transaction) / address&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在配置 BAR 位址後，CPU 就可以透過存取 BAR 空間 (通常會被映射到 PCI/PCIe device 的 controller registers) 來控制該 PCI/PCIe device
&lt;ul&gt;
&lt;li&gt;e.g., PCIe BAR0 所記錄之 base address = &lt;code&gt;0x40000000&lt;/code&gt;, size = &lt;code&gt;0x1000000&lt;/code&gt; (16 MB)，CPU 就可以透過存取 &lt;code&gt;0x40000000 ~ 0x40FFFFFF&lt;/code&gt; 來控制該 PCI/PCIe device&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PCI/PCIe Device:&lt;/strong&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<ul>
<li>SW 透過 host controller 設定 BAR 的位址，實際上在 QEMU 中就是新增/改變對應到該 BAR memory region 的 memory subregion base address
<ul>
<li>BAR 空間記錄的是 PCI/PCIe 自己的 address space，而不是 memory address space，兩者實際上是不相通的。但由於大部分系統都會將 PCI/PCIe address space 映射到相同位址的 memory address space，因此”看起來”就像是 CPU 直接對 memory address space 做存取，可其實兩個 address spaces 是需要透過 host controller 做轉換的
<ul>
<li>CPU 存取 PCI/PCIe device 的時候，實際硬體是必須透過 host controller 來將 MMIO transaction (e.g., AXI transaction) / address 轉換成 PCI/PCIe transaction / address 才能存取到該 PCI/PCIe device 的。但 QEMU 的模擬並不會真的透過 host controller，而是直接存取前述之 BAR memory subregion</li>
<li>反之，當 PCI/PCIe master device 做 DMA 的時候，也是需要透過 host controller 才能將其所發出的 PCI/PCIe transaction / address 轉換成 MMIO transaction (e.g., AXI transaction) / address</li>
</ul>
</li>
</ul>
</li>
<li>在配置 BAR 位址後，CPU 就可以透過存取 BAR 空間 (通常會被映射到 PCI/PCIe device 的 controller registers) 來控制該 PCI/PCIe device
<ul>
<li>e.g., PCIe BAR0 所記錄之 base address = <code>0x40000000</code>, size = <code>0x1000000</code> (16 MB)，CPU 就可以透過存取 <code>0x40000000 ~ 0x40FFFFFF</code> 來控制該 PCI/PCIe device</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li>
<p><strong>PCI/PCIe Device:</strong></p>
<ul>
<li><strong>TYPE_PCI_DEVICE</strong> (<code>struct PCIDevice</code>, <code>hw/pci/pci.c</code>)
<ul>
<li>
<p><strong>TYPE_DEVICE</strong> (<code>struct DeviceState</code>, <code>hw/core/qdev.c</code>)</p>
</li>
<li>
<p>There no such <strong>TYPE_PCIE_DEVICE</strong>. PCIe related structure is embedded in <code>struct PCIDevice</code>:</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-1">1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-2">2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-3">3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-4">4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-5">5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-6">6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-7">7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-0-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-0-8">8</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#66d9ef">struct</span> PCIDevice {
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">/* PCI Express */</span>
</span></span><span style="display:flex;"><span>    PCIExpressDevice exp;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    ....
</span></span><span style="display:flex;"><span>};
</span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
</li>
</ul>
</li>
<li>
<p><strong>PCI Bus:</strong></p>
<ul>
<li><strong>TYPE_PCI_BUS</strong> (<code>struct PCIBus</code>, <code>hw/pci/pci.c</code>)
<ul>
<li><strong>TYPE_BUS</strong> (<code>struct BusState</code>, <code>hw/core/bus.c</code>)</li>
</ul>
</li>
</ul>
</li>
<li>
<p><strong>PCIe Bus:</strong></p>
<ul>
<li><strong>TYPE_PCIE_BUS</strong> (<code>hw/pci/pci.c</code>)
<ul>
<li><strong>TYPE_PCI_BUS</strong> (<code>struct PCIBus</code>, <code>hw/pci/pci.c</code>)
<ul>
<li><strong>TYPE_BUS</strong> (<code>struct BusState</code>, <code>hw/core/bus.c</code>)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p><strong>CXL Bus:</strong></p>
<ul>
<li><strong>TYPE_CXL_BUS</strong> (<code>hw/pci/pci.c</code>)
<ul>
<li><strong>TYPE_PCIE_BUS</strong> (<code>hw/pci/pci.c</code>)
<ul>
<li><strong>TYPE_PCI_BUS</strong> (<code>struct PCIBus</code>, <code>hw/pci/pci.c</code>)
<ul>
<li><strong>TYPE_BUS</strong> (<code>struct BusState</code>, <code>hw/core/bus.c</code>)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p><strong>PCI-PCI Bridge</strong> - PCI-PCI bridge itself is a <code>PCIDevice</code>, but also includes a <code>PCIBus</code>:</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-1-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-1-10">10</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#66d9ef">struct</span> PCIBridge {
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">/*&lt; private &gt;*/</span>
</span></span><span style="display:flex;"><span>    PCIDevice parent_obj;
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">/*&lt; public &gt;*/</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">/* private member */</span>
</span></span><span style="display:flex;"><span>    PCIBus sec_bus;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>};
</span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li><strong>TYPE_PCI_BRIDGE</strong> (<code>struct PCIBridge</code>, <code>hw/pci/pci_bridge.c</code>)
<ul>
<li><strong>TYPE_PCI_DEVICE</strong> (<code>struct PCIDevice</code>, <code>hw/pci/pci.c</code>)
<ul>
<li><strong>TYPE_DEVICE</strong> (<code>struct DeviceState</code>, <code>hw/core/qdev.c</code>)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p><strong>PCIe-PCI Bridge:</strong></p>
<ul>
<li><strong>TYPE_PCIE_PCI_BRIDGE_DEV</strong> (<code>struct PCIBridgeDev</code>, <code>hw/pci-bridge/pcie_pci_bridge.c</code>)
<ul>
<li><strong>TYPE_PCI_BRIDGE</strong> (<code>struct PCIBridge</code>, <code>hw/pci/pci_bridge.c</code>)
<ul>
<li><strong>TYPE_PCI_DEVICE</strong> (<code>struct PCIDevice</code>, <code>hw/pci/pci.c</code>)
<ul>
<li><strong>TYPE_DEVICE</strong> (<code>struct DeviceState</code>, <code>hw/core/qdev.c</code>)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p><strong>PCIe Root Port:</strong></p>
<ul>
<li><strong>TYPE_PCIE_ROOT_PORT</strong> (<code>hw/pci-bridge/pcie_root_port.c</code>)
<ul>
<li><strong>TYPE_PCIE_SLOT</strong>  (<code>struct PCIESlot</code>, <code>hw/pci/pcie_port.c</code>)
<ul>
<li><strong>TYPE_PCIE_PORT</strong> (<code>struct PCIEPort</code>, <code>hw/pci/pcie_port.c</code>)
<ul>
<li><strong>TYPE_PCI_BRIDGE</strong> (<code>struct PCIBridge</code>, <code>hw/pci/pci_bridge.c</code>)
<ul>
<li><strong>TYPE_PCI_DEVICE</strong> (<code>struct PCIDevice</code>, <code>hw/pci/pci.c</code>)
<ul>
<li><strong>TYPE_DEVICE</strong> (<code>struct DeviceState</code>, <code>hw/core/qdev.c</code>)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p><strong>PCI Host Bridge</strong> - For CPU to access the PCI bus, converts the memory loads/stores to PCI loads/stores. It also includes a <code>PCIBus</code>, which is created with <code>pci_register_root_bus()</code>.</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-1">1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-2">2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-3">3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-4">4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-5">5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-6">6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-7">7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-8">8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-2-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-2-9">9</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#66d9ef">struct</span> PCIHostState {
</span></span><span style="display:flex;"><span>    SysBusDevice busdev;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    PCIBus <span style="color:#f92672">*</span>bus;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>};
</span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li><strong>TYPE_PCI_HOST_BRIDGE</strong> (<code>struct PCIHostState</code>, <code>hw/pci/pci_host.c</code>)
<ul>
<li><strong>TYPE_SYS_BUS_DEVICE</strong> (<code>struct SysBusDevice</code>,<code>hw/core/sysbus.c</code>)</li>
</ul>
</li>
</ul>
</li>
<li>
<p><strong>PCIe Host Bridge</strong> - For CPU to access the PCIe bus, converts the memory loads/stores to PCI loads/stores.</p>
<ul>
<li><strong>TYPE_PCIE_HOST_BRIDGE</strong> (<code>struct PCIExpressHost</code>, <code>hw/pci/pcie_host.c</code>)
<ul>
<li><strong>TYPE_PCI_HOST_BRIDGE</strong> (<code>struct PCIHostState</code>, <code>hw/pci/pci_host.c</code>)
<ul>
<li><strong>TYPE_SYS_BUS_DEVICE</strong> (<code>struct SysBusDevice</code>,<code>hw/core/sysbus.c</code>)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li>DesignWare PCIe host controller (<code>hw/pci-host/designware.c</code>):
<ul>
<li><strong>TYPE_DESIGNWARE_PCIE_HOST</strong> (<code>struct DesignwarePCIEHost</code>) - Host-facing part
<ul>
<li><strong>TYPE_PCI_HOST_BRIDGE</strong> (<code>struct PCIHostState</code>, <code>hw/pci/pci_host.c</code>)</li>
</ul>
</li>
<li><strong>TYPE_DESIGNWARE_PCIE_ROOT</strong> (<code>struct DesignwarePCIERoot</code>) - PCI-facing part
<ul>
<li><strong>TYPE_PCI_BRIDGE</strong> (<code>struct PCIBridge</code>, <code>hw/pci/pci_bridge.c</code>)</li>
</ul>
</li>
</ul>
</li>
<li>QEMU Generic PCIe host controller (<code>hw/pci-host/gpex.c</code>)
<ul>
<li><strong>TYPE_GPEX_HOST</strong> (<code>struct GPEXHost</code>) - Host-facing part
<ul>
<li><strong>TYPE_PCIE_HOST_BRIDGE</strong> (<code>struct PCIExpressHost</code>, <code>hw/pci/pcie_host.c</code>)</li>
</ul>
</li>
<li><strong>TYPE_GPEX_ROOT_DEVICE</strong> (<code>struct GPEXRootState</code>) - PCI-facing part
<ul>
<li><strong>TYPE_PCI_DEVICE</strong> (<code>struct PCIDevice</code>, <code>hw/pci/pci.c</code>)</li>
</ul>
</li>
</ul>
</li>
<li>Xilinx PCIe host controller (<code>hw/pci-host/xilinx-pcie.c</code>)
<ul>
<li><strong>TYPE_XILINX_PCIE_HOST</strong> (<code>struct XilinxPCIEHost</code>) - Host-facing part
<ul>
<li><strong>TYPE_PCIE_HOST_BRIDGE</strong> (<code>struct PCIExpressHost</code>, <code>hw/pci/pcie_host.c</code>)</li>
</ul>
</li>
<li><strong>TYPE_XILINX_PCIE_ROOT</strong> (<code>struct XilinxPCIERoot</code>) - PCI-facing part
<ul>
<li><strong>TYPE_PCI_BRIDGE</strong> (<code>struct PCIBridge</code>, <code>hw/pci/pci_bridge.c</code>)</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-3-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-3-19">19</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// include/hw/pci-host/designware.h
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">struct</span> DesignwarePCIEHost {
</span></span><span style="display:flex;"><span>    PCIHostState parent_obj;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    DesignwarePCIERoot root;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">struct</span> {
</span></span><span style="display:flex;"><span>        AddressSpace address_space;
</span></span><span style="display:flex;"><span>        MemoryRegion address_space_root;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        MemoryRegion memory;
</span></span><span style="display:flex;"><span>        MemoryRegion io;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        qemu_irq     irqs[<span style="color:#ae81ff">4</span>];
</span></span><span style="display:flex;"><span>    } pci;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    MemoryRegion mmio;
</span></span><span style="display:flex;"><span>};
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-4-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-4-14">14</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// include/hw/pci-host/designware.h
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">struct</span> DesignwarePCIERoot {
</span></span><span style="display:flex;"><span>    PCIBridge parent_obj;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">uint32_t</span> atu_viewport;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#define DESIGNWARE_PCIE_VIEWPORT_OUTBOUND    0
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">#define DESIGNWARE_PCIE_VIEWPORT_INBOUND     1
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">#define DESIGNWARE_PCIE_NUM_VIEWPORTS        4
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    DesignwarePCIEViewport viewports[<span style="color:#ae81ff">2</span>][DESIGNWARE_PCIE_NUM_VIEWPORTS];
</span></span><span style="display:flex;"><span>    DesignwarePCIEMSI msi;
</span></span><span style="display:flex;"><span>};
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-19">19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-20">20</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-21">21</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-22">22</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-23"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-23">23</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-24"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-24">24</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-25"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-25">25</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-26"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-26">26</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-27"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-27">27</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-28"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-28">28</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-29"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-29">29</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-30"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-30">30</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-31"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-31">31</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-32"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-32">32</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-33"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-33">33</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-34"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-34">34</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-35"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-35">35</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-36"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-36">36</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-37"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-37">37</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-38"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-38">38</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-39"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-39">39</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-40"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-40">40</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-41"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-41">41</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-42"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-42">42</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-43"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-43">43</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-44"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-44">44</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-45"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-45">45</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-46"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-46">46</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-47"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-47">47</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-48"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-48">48</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-49"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-49">49</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-50"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-50">50</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-51"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-51">51</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-5-52"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-5-52">52</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci-host/designware.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">designware_pcie_host_realize</span>(DeviceState <span style="color:#f92672">*</span>dev, Error <span style="color:#f92672">**</span>errp)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    PCIHostState <span style="color:#f92672">*</span>pci <span style="color:#f92672">=</span> <span style="color:#a6e22e">PCI_HOST_BRIDGE</span>(dev);
</span></span><span style="display:flex;"><span>    DesignwarePCIEHost <span style="color:#f92672">*</span>s <span style="color:#f92672">=</span> <span style="color:#a6e22e">DESIGNWARE_PCIE_HOST</span>(dev);
</span></span><span style="display:flex;"><span>    SysBusDevice <span style="color:#f92672">*</span>sbd <span style="color:#f92672">=</span> <span style="color:#a6e22e">SYS_BUS_DEVICE</span>(dev);
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">size_t</span> i;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memory_region_init</span>(<span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.io, <span style="color:#a6e22e">OBJECT</span>(s), <span style="color:#e6db74">&#34;pcie-pio&#34;</span>, <span style="color:#ae81ff">16</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Initialize PCIe root sub-container MemoryRegion.
</span></span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memory_region_init</span>(<span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.memory, <span style="color:#a6e22e">OBJECT</span>(s),
</span></span><span style="display:flex;"><span>                       <span style="color:#e6db74">&#34;pcie-bus-memory&#34;</span>,
</span></span><span style="display:flex;"><span>                       UINT64_MAX);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Create and assign DesignwarePCIEHost =&gt; PCIHostState-&gt;PCIBus
</span></span></span><span style="display:flex;"><span>    <span style="color:#75715e">// PCIBus&#39; parent (DeviceState) is DesignwarePCIEHost.
</span></span></span><span style="display:flex;"><span>    <span style="color:#75715e">// pci.memory is the MemoryRegion for PCIe address space.
</span></span></span><span style="display:flex;"><span>    <span style="color:#75715e">// pci.io is the I/O MemoryRegion for PCIe address space.
</span></span></span><span style="display:flex;"><span>    pci<span style="color:#f92672">-&gt;</span>bus <span style="color:#f92672">=</span> <span style="color:#a6e22e">pci_register_root_bus</span>(dev, <span style="color:#e6db74">&#34;pcie&#34;</span>,
</span></span><span style="display:flex;"><span>                                     designware_pcie_set_irq,
</span></span><span style="display:flex;"><span>                                     pci_swizzle_map_irq_fn,
</span></span><span style="display:flex;"><span>                                     s,
</span></span><span style="display:flex;"><span>                                     <span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.memory,
</span></span><span style="display:flex;"><span>                                     <span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.io,
</span></span><span style="display:flex;"><span>                                     <span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">4</span>,
</span></span><span style="display:flex;"><span>                                     TYPE_PCIE_BUS);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    ....
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Initialize PCIe root container MemoryRegion.
</span></span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memory_region_init</span>(<span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.address_space_root,
</span></span><span style="display:flex;"><span>                       <span style="color:#a6e22e">OBJECT</span>(s),
</span></span><span style="display:flex;"><span>                       <span style="color:#e6db74">&#34;pcie-bus-address-space-root&#34;</span>,
</span></span><span style="display:flex;"><span>                       UINT64_MAX);
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Add pcie.memory as the subregion of PCIe root container MemoryRegion.
</span></span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memory_region_add_subregion</span>(<span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.address_space_root,
</span></span><span style="display:flex;"><span>                                <span style="color:#ae81ff">0x0</span>, <span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.memory);
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Initialize PCIe root address space with root container MemoryRegion.
</span></span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">address_space_init</span>(<span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.address_space,
</span></span><span style="display:flex;"><span>                       <span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.address_space_root,
</span></span><span style="display:flex;"><span>                       <span style="color:#e6db74">&#34;pcie-bus-address-space&#34;</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Specify pci.address_space as the address space of
</span></span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">pci_setup_iommu</span>(pci<span style="color:#f92672">-&gt;</span>bus, designware_pcie_host_set_iommu, s);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Set DesignwarePCIERoot&#39;s parent_bus to:
</span></span></span><span style="display:flex;"><span>    <span style="color:#75715e">// DesignwarePCIEHost =&gt; PCIHostState-&gt;PCIBus.
</span></span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">qdev_realize</span>(<span style="color:#a6e22e">DEVICE</span>(<span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>root), <span style="color:#a6e22e">BUS</span>(pci<span style="color:#f92672">-&gt;</span>bus), <span style="color:#f92672">&amp;</span>error_fatal);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-1">1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-2">2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-3">3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-4">4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-5">5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-6">6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-7">7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-8">8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-6-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-6-9">9</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci-host/designware.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> AddressSpace <span style="color:#f92672">*</span><span style="color:#a6e22e">designware_pcie_host_set_iommu</span>(PCIBus <span style="color:#f92672">*</span>bus, <span style="color:#66d9ef">void</span> <span style="color:#f92672">*</span>opaque,
</span></span><span style="display:flex;"><span>                                                    <span style="color:#66d9ef">int</span> devfn)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    DesignwarePCIEHost <span style="color:#f92672">*</span>s <span style="color:#f92672">=</span> <span style="color:#a6e22e">DESIGNWARE_PCIE_HOST</span>(opaque);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.address_space;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-19">19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-20">20</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-21">21</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-22">22</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-23"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-23">23</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-24"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-24">24</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-25"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-25">25</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-26"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-26">26</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-27"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-27">27</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-28"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-28">28</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-29"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-29">29</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-30"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-30">30</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-31"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-31">31</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-32"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-32">32</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-33"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-33">33</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-7-34"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-7-34">34</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci/pci.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// DesignwarePCIERoot is a PCIDevice.
</span></span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">pci_qdev_realize</span>(DeviceState <span style="color:#f92672">*</span>qdev, Error <span style="color:#f92672">**</span>errp)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    PCIDevice <span style="color:#f92672">*</span>pci_dev <span style="color:#f92672">=</span> (PCIDevice <span style="color:#f92672">*</span>)qdev;
</span></span><span style="display:flex;"><span>    PCIDeviceClass <span style="color:#f92672">*</span>pc <span style="color:#f92672">=</span> <span style="color:#a6e22e">PCI_DEVICE_GET_CLASS</span>(pci_dev);
</span></span><span style="display:flex;"><span>    ObjectClass <span style="color:#f92672">*</span>klass <span style="color:#f92672">=</span> <span style="color:#a6e22e">OBJECT_CLASS</span>(pc);
</span></span><span style="display:flex;"><span>    Error <span style="color:#f92672">*</span>local_err <span style="color:#f92672">=</span> NULL;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">bool</span> is_default_rom;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">uint16_t</span> class_id;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Add DesignwarePCIERoot to DesignwarePCIEHost =&gt; PCIHostState-&gt;PCIBus&#39;s
</span></span></span><span style="display:flex;"><span>    <span style="color:#75715e">// device list.
</span></span></span><span style="display:flex;"><span>    pci_dev <span style="color:#f92672">=</span> <span style="color:#a6e22e">do_pci_register_device</span>(pci_dev,
</span></span><span style="display:flex;"><span>                                     <span style="color:#a6e22e">object_get_typename</span>(<span style="color:#a6e22e">OBJECT</span>(qdev)),
</span></span><span style="display:flex;"><span>                                     pci_dev<span style="color:#f92672">-&gt;</span>devfn, errp);
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (pci_dev <span style="color:#f92672">==</span> NULL)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// This will call designware_pcie_root_realize().
</span></span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (pc<span style="color:#f92672">-&gt;</span>realize) {
</span></span><span style="display:flex;"><span>        pc<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">realize</span>(pci_dev, <span style="color:#f92672">&amp;</span>local_err);
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> (local_err) {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">error_propagate</span>(errp, local_err);
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">do_pci_unregister_device</span>(pci_dev);
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">return</span>;
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>      ...
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-19">19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-20">20</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-21">21</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-22">22</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-23"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-23">23</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-24"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-24">24</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-25"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-25">25</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-26"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-26">26</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-27"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-27">27</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-28"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-28">28</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-29"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-29">29</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-30"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-30">30</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-31"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-31">31</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-32"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-32">32</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-33"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-33">33</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-34"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-34">34</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-35"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-35">35</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-36"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-36">36</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-37"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-37">37</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-8-38"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-8-38">38</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci/pci.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">/* -1 for devfn means auto assign */</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> PCIDevice <span style="color:#f92672">*</span><span style="color:#a6e22e">do_pci_register_device</span>(PCIDevice <span style="color:#f92672">*</span>pci_dev,
</span></span><span style="display:flex;"><span>                                         <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>name, <span style="color:#66d9ef">int</span> devfn,
</span></span><span style="display:flex;"><span>                                         Error <span style="color:#f92672">**</span>errp)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    PCIDeviceClass <span style="color:#f92672">*</span>pc <span style="color:#f92672">=</span> <span style="color:#a6e22e">PCI_DEVICE_GET_CLASS</span>(pci_dev);
</span></span><span style="display:flex;"><span>    PCIConfigReadFunc <span style="color:#f92672">*</span>config_read <span style="color:#f92672">=</span> pc<span style="color:#f92672">-&gt;</span>config_read;
</span></span><span style="display:flex;"><span>    PCIConfigWriteFunc <span style="color:#f92672">*</span>config_write <span style="color:#f92672">=</span> pc<span style="color:#f92672">-&gt;</span>config_write;
</span></span><span style="display:flex;"><span>    Error <span style="color:#f92672">*</span>local_err <span style="color:#f92672">=</span> NULL;
</span></span><span style="display:flex;"><span>    DeviceState <span style="color:#f92672">*</span>dev <span style="color:#f92672">=</span> <span style="color:#a6e22e">DEVICE</span>(pci_dev);
</span></span><span style="display:flex;"><span>    PCIBus <span style="color:#f92672">*</span>bus <span style="color:#f92672">=</span> <span style="color:#a6e22e">pci_get_bus</span>(pci_dev);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    pci_dev<span style="color:#f92672">-&gt;</span>devfn <span style="color:#f92672">=</span> devfn;
</span></span><span style="display:flex;"><span>    pci_dev<span style="color:#f92672">-&gt;</span>requester_id_cache <span style="color:#f92672">=</span> <span style="color:#a6e22e">pci_req_id_cache_get</span>(pci_dev);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">pstrcpy</span>(pci_dev<span style="color:#f92672">-&gt;</span>name, <span style="color:#66d9ef">sizeof</span>(pci_dev<span style="color:#f92672">-&gt;</span>name), name);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memory_region_init</span>(<span style="color:#f92672">&amp;</span>pci_dev<span style="color:#f92672">-&gt;</span>bus_master_container_region, <span style="color:#a6e22e">OBJECT</span>(pci_dev),
</span></span><span style="display:flex;"><span>                       <span style="color:#e6db74">&#34;bus master container&#34;</span>, UINT64_MAX);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">address_space_init</span>(<span style="color:#f92672">&amp;</span>pci_dev<span style="color:#f92672">-&gt;</span>bus_master_as,
</span></span><span style="display:flex;"><span>                       <span style="color:#f92672">&amp;</span>pci_dev<span style="color:#f92672">-&gt;</span>bus_master_container_region, pci_dev<span style="color:#f92672">-&gt;</span>name);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>config_read)
</span></span><span style="display:flex;"><span>        config_read <span style="color:#f92672">=</span> pci_default_read_config;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>config_write)
</span></span><span style="display:flex;"><span>        config_write <span style="color:#f92672">=</span> pci_default_write_config;
</span></span><span style="display:flex;"><span>    pci_dev<span style="color:#f92672">-&gt;</span>config_read <span style="color:#f92672">=</span> config_read;
</span></span><span style="display:flex;"><span>    pci_dev<span style="color:#f92672">-&gt;</span>config_write <span style="color:#f92672">=</span> config_write;
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Add this PCIDevice to its parent bus&#39;s (PCIBus) device list.
</span></span></span><span style="display:flex;"><span>    bus<span style="color:#f92672">-&gt;</span>devices[devfn] <span style="color:#f92672">=</span> pci_dev;
</span></span><span style="display:flex;"><span>    pci_dev<span style="color:#f92672">-&gt;</span>version_id <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span>; <span style="color:#75715e">/* Current pci device vmstate version */</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> pci_dev;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-9-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-9-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-9-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-9-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-9-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-9-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-9-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-9-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-9-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-9-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-9-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-9-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-9-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-9-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-9-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-9-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-9-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-9-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-9-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-9-10">10</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci-host/designware.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> DesignwarePCIEHost <span style="color:#f92672">*</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">designware_pcie_root_to_host</span>(DesignwarePCIERoot <span style="color:#f92672">*</span>root)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// DesignwarePCIEHost =&gt; PCIHostState-&gt;PCIBus
</span></span></span><span style="display:flex;"><span>    BusState <span style="color:#f92672">*</span>bus <span style="color:#f92672">=</span> <span style="color:#a6e22e">qdev_get_parent_bus</span>(<span style="color:#a6e22e">DEVICE</span>(root));
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// PCIBus&#39; parent (DeviceState) is DesignwarePCIEHost
</span></span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">DESIGNWARE_PCIE_HOST</span>(bus<span style="color:#f92672">-&gt;</span>parent);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-19">19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-20">20</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-21">21</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-22">22</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-23"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-23">23</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-24"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-24">24</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-10-25"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-10-25">25</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci-host/designware.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">designware_pcie_root_realize</span>(PCIDevice <span style="color:#f92672">*</span>dev, Error <span style="color:#f92672">**</span>errp)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    DesignwarePCIERoot <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> <span style="color:#a6e22e">DESIGNWARE_PCIE_ROOT</span>(dev);
</span></span><span style="display:flex;"><span>    DesignwarePCIEHost <span style="color:#f92672">*</span>host <span style="color:#f92672">=</span> <span style="color:#a6e22e">designware_pcie_root_to_host</span>(root);
</span></span><span style="display:flex;"><span>    MemoryRegion <span style="color:#f92672">*</span>address_space <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>host<span style="color:#f92672">-&gt;</span>pci.memory;
</span></span><span style="display:flex;"><span>    PCIBridge <span style="color:#f92672">*</span>br <span style="color:#f92672">=</span> <span style="color:#a6e22e">PCI_BRIDGE</span>(dev);
</span></span><span style="display:flex;"><span>    DesignwarePCIEViewport <span style="color:#f92672">*</span>viewport;
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">/*
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * Dummy values used for initial configuration of MemoryRegions
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * that belong to a given viewport
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     */</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">const</span> hwaddr dummy_offset <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">uint64_t</span> dummy_size <span style="color:#f92672">=</span> <span style="color:#ae81ff">4</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">size_t</span> i;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    br<span style="color:#f92672">-&gt;</span>bus_name  <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;dw-pcie&#34;</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">pci_bridge_initfn</span>(dev, TYPE_PCIE_BUS);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-19">19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-20">20</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-21">21</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-22">22</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-23"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-23">23</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-24"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-24">24</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-11-25"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-11-25">25</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// include/hw/pci/pci_bridge.h
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">struct</span> PCIBridge {
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">/*&lt; private &gt;*/</span>
</span></span><span style="display:flex;"><span>    PCIDevice parent_obj;
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">/*&lt; public &gt;*/</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">/* private member */</span>
</span></span><span style="display:flex;"><span>    PCIBus sec_bus;
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">/*
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * Memory regions for the bridge&#39;s address spaces.  These regions are not
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * directly added to system_memory/system_io or its descendants.
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * Bridge&#39;s secondary bus points to these, so that devices
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * under the bridge see these regions as its address spaces.
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * The regions are as large as the entire address space -
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * they don&#39;t take into account any windows.
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     */</span>
</span></span><span style="display:flex;"><span>    MemoryRegion address_space_mem;
</span></span><span style="display:flex;"><span>    MemoryRegion address_space_io;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    PCIBridgeWindows <span style="color:#f92672">*</span>windows;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    pci_map_irq_fn map_irq;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>bus_name;
</span></span><span style="display:flex;"><span>};
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-19">19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-20">20</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-21">21</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-22">22</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-23"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-23">23</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-24"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-24">24</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-25"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-25">25</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-26"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-26">26</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-27"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-27">27</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-28"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-28">28</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-29"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-29">29</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-30"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-30">30</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-31"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-31">31</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-32"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-32">32</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-33"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-33">33</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-34"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-34">34</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-35"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-35">35</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-36"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-36">36</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-37"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-37">37</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-38"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-38">38</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-39"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-39">39</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-12-40"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-12-40">40</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci/pci_bridge.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">void</span> <span style="color:#a6e22e">pci_bridge_initfn</span>(PCIDevice <span style="color:#f92672">*</span>dev, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span><span style="color:#66d9ef">typename</span>)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// dev is DesignwarePCIERoot
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// DesignwarePCIERoot&#39;s parent_bus is:
</span></span></span><span style="display:flex;"><span>    <span style="color:#75715e">// DesignwarePCIEHost =&gt; PCIHostState-&gt;PCIBus.
</span></span></span><span style="display:flex;"><span>    PCIBus <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> <span style="color:#a6e22e">pci_get_bus</span>(dev);
</span></span><span style="display:flex;"><span>    PCIBridge <span style="color:#f92672">*</span>br <span style="color:#f92672">=</span> <span style="color:#a6e22e">PCI_BRIDGE</span>(dev);
</span></span><span style="display:flex;"><span>    PCIBus <span style="color:#f92672">*</span>sec_bus <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>br<span style="color:#f92672">-&gt;</span>sec_bus;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">/*
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * If we don&#39;t specify the name, the bus will be addressed as &amp;lt;id&amp;gt;.0, where
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * id is the device id.
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * Since PCI Bridge devices have a single bus each, we don&#39;t need the index:
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * let users address the bus using the device name.
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     */</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>br<span style="color:#f92672">-&gt;</span>bus_name <span style="color:#f92672">&amp;&amp;</span> dev<span style="color:#f92672">-&gt;</span>qdev.id <span style="color:#f92672">&amp;&amp;</span> <span style="color:#f92672">*</span>dev<span style="color:#f92672">-&gt;</span>qdev.id) {
</span></span><span style="display:flex;"><span>            br<span style="color:#f92672">-&gt;</span>bus_name <span style="color:#f92672">=</span> dev<span style="color:#f92672">-&gt;</span>qdev.id;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Initialize sec_bus.
</span></span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">qbus_init</span>(sec_bus, <span style="color:#66d9ef">sizeof</span>(br<span style="color:#f92672">-&gt;</span>sec_bus), <span style="color:#66d9ef">typename</span>, <span style="color:#a6e22e">DEVICE</span>(dev),
</span></span><span style="display:flex;"><span>              br<span style="color:#f92672">-&gt;</span>bus_name);
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// sec_bus&#39;s parent_dev (PCIDevice) is DesignwarePCIERoot.
</span></span></span><span style="display:flex;"><span>    sec_bus<span style="color:#f92672">-&gt;</span>parent_dev <span style="color:#f92672">=</span> dev;
</span></span><span style="display:flex;"><span>    sec_bus<span style="color:#f92672">-&gt;</span>map_irq <span style="color:#f92672">=</span> br<span style="color:#f92672">-&gt;</span>map_irq <span style="color:#f92672">?</span> br<span style="color:#f92672">-&gt;</span>map_irq : pci_swizzle_map_irq_fn;
</span></span><span style="display:flex;"><span>    sec_bus<span style="color:#f92672">-&gt;</span>address_space_mem <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>br<span style="color:#f92672">-&gt;</span>address_space_mem;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memory_region_init</span>(<span style="color:#f92672">&amp;</span>br<span style="color:#f92672">-&gt;</span>address_space_mem, <span style="color:#a6e22e">OBJECT</span>(br), <span style="color:#e6db74">&#34;pci_bridge_pci&#34;</span>, UINT64_MAX);
</span></span><span style="display:flex;"><span>    sec_bus<span style="color:#f92672">-&gt;</span>address_space_io <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>br<span style="color:#f92672">-&gt;</span>address_space_io;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memory_region_init</span>(<span style="color:#f92672">&amp;</span>br<span style="color:#f92672">-&gt;</span>address_space_io, <span style="color:#a6e22e">OBJECT</span>(br), <span style="color:#e6db74">&#34;pci_bridge_io&#34;</span>,
</span></span><span style="display:flex;"><span>                       <span style="color:#ae81ff">4</span> <span style="color:#f92672">*</span> GiB);
</span></span><span style="display:flex;"><span>    br<span style="color:#f92672">-&gt;</span>windows <span style="color:#f92672">=</span> <span style="color:#a6e22e">pci_bridge_region_init</span>(br);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">QLIST_INIT</span>(<span style="color:#f92672">&amp;</span>sec_bus<span style="color:#f92672">-&gt;</span>child);
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Add sec_bus to DesignwarePCIEHost =&gt; PCIHostState-&gt;PCIBus&#39;s child list.
</span></span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">QLIST_INSERT_HEAD</span>(<span style="color:#f92672">&amp;</span>parent<span style="color:#f92672">-&gt;</span>child, sec_bus, sibling);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-19">19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-20">20</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-21">21</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-22">22</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-23"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-23">23</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-24"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-24">24</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-25"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-25">25</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-26"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-26">26</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-27"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-27">27</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-28"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-28">28</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-29"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-29">29</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-30"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-30">30</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-31"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-31">31</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-32"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-32">32</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-33"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-33">33</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-34"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-34">34</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-35"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-35">35</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-36"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-36">36</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-37"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-37">37</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-38"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-38">38</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-39"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-39">39</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-40"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-40">40</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-41"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-41">41</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-13-42"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-13-42">42</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>        +--------------------------+    +--------------------------------------------------------------------------------------------------------+
</span></span><span style="display:flex;"><span>        |                          |    |                                                                                                        |
</span></span><span style="display:flex;"><span>        |    DesignwarePCIEHost    | &lt;--+                                                                                                        |
</span></span><span style="display:flex;"><span>        |                          |        +----------------------+   +-------------------------------------------------------------------------|----+
</span></span><span style="display:flex;"><span>        +--------------------------+        |                      |   |                                                                         |    |
</span></span><span style="display:flex;"><span>        | PCIHostState parent_obj; | =====&gt; |     PCIHostState     |   |                                                                         |    |
</span></span><span style="display:flex;"><span>        +--------------------------+        |                      |   |                                                                         |    |
</span></span><span style="display:flex;"><span>   +--&gt; | DesignwarePCIERoot root; | ===+   +----------------------+   |                                                                         |    |
</span></span><span style="display:flex;"><span>   |    +--------------------------+    |   | SysBusDevice busdev; |   |    +------------------------------+                                     |    |
</span></span><span style="display:flex;"><span>   |                                    |   +----------------------+   |    |                              |                                     |    |
</span></span><span style="display:flex;"><span>   |                                    |   | PCIBus *bus;         | ==|==&gt; |            PCIBus            |                                     |    |
</span></span><span style="display:flex;"><span>   |                                    |   | (&#34;pcie&#34;)             |   |    |                              |        +----------------------+     |    |
</span></span><span style="display:flex;"><span>   |                                    |   +----------------------+   |    +------------------------------+        |                      |     |    |
</span></span><span style="display:flex;"><span>   |                                    |               ^              |    | BusState qbus;               | =====&gt; |       BusState       |     |    |
</span></span><span style="display:flex;"><span>   |                                    v               |              |    +------------------------------+        |                      |     |    |
</span></span><span style="display:flex;"><span>   |                        +-----------------------+   +--------------+    | PCIDevice *parent_dev;       |        +----------------------+     |    |
</span></span><span style="display:flex;"><span>   |                        |                       |                       +------------------------------+        | Object obj;          |     |    |
</span></span><span style="display:flex;"><span>   |                        |   DesignwarePCIERoot  |                       | QLIST_HEAD(, PCIBus) child;  | &lt;--+   +----------------------+     |    |
</span></span><span style="display:flex;"><span>   |                        |                       |                       +------------------------------+    |   | DeviceState *parent; | ----+    |
</span></span><span style="display:flex;"><span>   |                        +-----------------------+                       | QLIST_ENTRY(PCIBus) sibling; |    |   +----------------------+          |
</span></span><span style="display:flex;"><span>   |                        | PCIBridge parent_obj; | =============+        +------------------------------+    |                                     |
</span></span><span style="display:flex;"><span>   |                        +-----------------------+              |                                            |                                     |
</span></span><span style="display:flex;"><span>   |                                                               |                                            |                                     |
</span></span><span style="display:flex;"><span>   |                                                               v                                            |                                     |
</span></span><span style="display:flex;"><span>   |                                                   +-----------------------+                                |                                     |
</span></span><span style="display:flex;"><span>   |                                                   |                       |   +----------------------------+                                     |
</span></span><span style="display:flex;"><span>   |                                                   |       PCIBridge       |   |                                                                  |
</span></span><span style="display:flex;"><span>   |                                                   |                       |   |    +-------------------+                                         |
</span></span><span style="display:flex;"><span>   |                                                   +-----------------------+   |    |                   |                                         |
</span></span><span style="display:flex;"><span>   |           +------------------------------+        | PCIDevice parent_obj; | ==|==&gt; |     PCIDevice     |                                         |
</span></span><span style="display:flex;"><span>   |           |                              |        +-----------------------+   |    |                   |        +-----------------------+        |
</span></span><span style="display:flex;"><span>   |           |            PCIBus            | &lt;===== | PCIBus sec_bus;       |   |    +-------------------+        |                       |        |
</span></span><span style="display:flex;"><span>   |           |                              |        | (&#34;dw-pcie&#34;)           |   |    | DeviceState qdev; | =====&gt; |      DeviceState      |        |
</span></span><span style="display:flex;"><span>   |           +------------------------------+        +-----------------------+   |    +-------------------+        |                       |        |
</span></span><span style="display:flex;"><span>   |           | BusState qbus;               |                    |               |                                 +-----------------------+        |
</span></span><span style="display:flex;"><span>   |           +------------------------------+                Added to            |                                 | Object parent_obj;    |        |
</span></span><span style="display:flex;"><span>   +---------- | PCIDevice *parent_dev;       |                    |               |                                 +-----------------------+        |
</span></span><span style="display:flex;"><span>               +------------------------------+                    +---------------+                                 | BusState *parent_bus; | -------+
</span></span><span style="display:flex;"><span>               | QLIST_HEAD(, PCIBus) child;  |                                                                      +-----------------------+
</span></span><span style="display:flex;"><span>               +------------------------------+
</span></span><span style="display:flex;"><span>               | QLIST_ENTRY(PCIBus) sibling; |
</span></span><span style="display:flex;"><span>               +------------------------------+
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="pcie-host-readwrite">PCIe Host Read/Write</h2>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-14-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-14-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-14-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-14-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-14-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-14-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-14-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-14-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-14-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-14-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-14-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-14-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-14-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-14-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-14-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-14-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-14-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-14-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-14-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-14-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-14-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-14-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-14-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-14-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-14-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-14-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-14-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-14-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-14-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-14-15">15</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci-host/designware.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">designware_pcie_host_realize</span>(DeviceState <span style="color:#f92672">*</span>dev, Error <span style="color:#f92672">**</span>errp)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memory_region_init_io</span>(<span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>mmio,
</span></span><span style="display:flex;"><span>                          <span style="color:#a6e22e">OBJECT</span>(s),
</span></span><span style="display:flex;"><span>                          <span style="color:#f92672">&amp;</span>designware_pci_mmio_ops,
</span></span><span style="display:flex;"><span>                          s,
</span></span><span style="display:flex;"><span>                          <span style="color:#e6db74">&#34;pcie.reg&#34;</span>, <span style="color:#ae81ff">4</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">1024</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">sysbus_init_mmio</span>(sbd, <span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>mmio);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-15-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-15-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-15-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-15-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-15-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-15-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-15-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-15-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-15-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-15-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-15-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-15-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-15-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-15-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-15-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-15-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-15-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-15-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-15-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-15-10">10</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci-host/designware.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">const</span> MemoryRegionOps designware_pci_mmio_ops <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>    .read       <span style="color:#f92672">=</span> designware_pcie_host_mmio_read,
</span></span><span style="display:flex;"><span>    .write      <span style="color:#f92672">=</span> designware_pcie_host_mmio_write,
</span></span><span style="display:flex;"><span>    .endianness <span style="color:#f92672">=</span> DEVICE_LITTLE_ENDIAN,
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        ...
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>};
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-16-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-16-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-16-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-16-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-16-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-16-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-16-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-16-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-16-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-16-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-16-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-16-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-16-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-16-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-16-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-16-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-16-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-16-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-16-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-16-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-16-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-16-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-16-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-16-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-16-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-16-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-16-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-16-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-16-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-16-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-16-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-16-16">16</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci-host/designware.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">uint64_t</span> <span style="color:#a6e22e">designware_pcie_host_mmio_read</span>(<span style="color:#66d9ef">void</span> <span style="color:#f92672">*</span>opaque, hwaddr addr,
</span></span><span style="display:flex;"><span>                                               <span style="color:#66d9ef">unsigned</span> <span style="color:#66d9ef">int</span> size)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    PCIHostState <span style="color:#f92672">*</span>pci <span style="color:#f92672">=</span> <span style="color:#a6e22e">PCI_HOST_BRIDGE</span>(opaque);
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Write to DesignwarePCIEHost will issue the PCIe config read
</span></span></span><span style="display:flex;"><span>    <span style="color:#75715e">// request to DesignwarePCIERoot.
</span></span></span><span style="display:flex;"><span>    <span style="color:#75715e">// device =&gt; DesignwarePCIERoot.
</span></span></span><span style="display:flex;"><span>    PCIDevice <span style="color:#f92672">*</span>device <span style="color:#f92672">=</span> <span style="color:#a6e22e">pci_find_device</span>(pci<span style="color:#f92672">-&gt;</span>bus, <span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">0</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">pci_host_config_read_common</span>(device,
</span></span><span style="display:flex;"><span>                                       addr,
</span></span><span style="display:flex;"><span>                                       <span style="color:#a6e22e">pci_config_size</span>(device),
</span></span><span style="display:flex;"><span>                                       size);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-17-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-17-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-17-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-17-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-17-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-17-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-17-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-17-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-17-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-17-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-17-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-17-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-17-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-17-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-17-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-17-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-17-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-17-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-17-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-17-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-17-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-17-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-17-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-17-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-17-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-17-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-17-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-17-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-17-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-17-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-17-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-17-16">16</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci-host/designware.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">designware_pcie_host_mmio_write</span>(<span style="color:#66d9ef">void</span> <span style="color:#f92672">*</span>opaque, hwaddr addr,
</span></span><span style="display:flex;"><span>                                            <span style="color:#66d9ef">uint64_t</span> val, <span style="color:#66d9ef">unsigned</span> <span style="color:#66d9ef">int</span> size)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    PCIHostState <span style="color:#f92672">*</span>pci <span style="color:#f92672">=</span> <span style="color:#a6e22e">PCI_HOST_BRIDGE</span>(opaque);
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Read from DesignwarePCIEHost will issue the PCIe config read
</span></span></span><span style="display:flex;"><span>    <span style="color:#75715e">// request to DesignwarePCIERoot.
</span></span></span><span style="display:flex;"><span>    <span style="color:#75715e">// device =&gt; DesignwarePCIERoot.
</span></span></span><span style="display:flex;"><span>    PCIDevice <span style="color:#f92672">*</span>device <span style="color:#f92672">=</span> <span style="color:#a6e22e">pci_find_device</span>(pci<span style="color:#f92672">-&gt;</span>bus, <span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">0</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">pci_host_config_write_common</span>(device,
</span></span><span style="display:flex;"><span>                                        addr,
</span></span><span style="display:flex;"><span>                                        <span style="color:#a6e22e">pci_config_size</span>(device),
</span></span><span style="display:flex;"><span>                                        val, size);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-18-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-18-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-18-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-18-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-18-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-18-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-18-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-18-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-18-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-18-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-18-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-18-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-18-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-18-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-18-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-18-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-18-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-18-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-18-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-18-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-18-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-18-11">11</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci-host/designware.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">designware_pcie_root_class_init</span>(ObjectClass <span style="color:#f92672">*</span>klass, <span style="color:#66d9ef">void</span> <span style="color:#f92672">*</span>data)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    k<span style="color:#f92672">-&gt;</span>config_read <span style="color:#f92672">=</span> designware_pcie_root_config_read;
</span></span><span style="display:flex;"><span>    k<span style="color:#f92672">-&gt;</span>config_write <span style="color:#f92672">=</span> designware_pcie_root_config_write;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-19">19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-20">20</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-21">21</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-22">22</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-23"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-23">23</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-24"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-24">24</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-25"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-25">25</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-26"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-26">26</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-27"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-27">27</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-28"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-28">28</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-29"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-29">29</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-30"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-30">30</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-31"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-31">31</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-32"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-32">32</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-33"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-33">33</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-34"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-34">34</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-35"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-35">35</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-19-36"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-19-36">36</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci-host/designware.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">uint32_t</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">designware_pcie_root_config_read</span>(PCIDevice <span style="color:#f92672">*</span>d, <span style="color:#66d9ef">uint32_t</span> address, <span style="color:#66d9ef">int</span> len)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    DesignwarePCIERoot <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> <span style="color:#a6e22e">DESIGNWARE_PCIE_ROOT</span>(d);
</span></span><span style="display:flex;"><span>    DesignwarePCIEViewport <span style="color:#f92672">*</span>viewport <span style="color:#f92672">=</span>
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">designware_pcie_root_get_current_viewport</span>(root);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">uint32_t</span> val;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">switch</span> (address) {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">case</span> DESIGNWARE_PCIE_PORT_LINK_CONTROL:
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">/*
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">         * Linux guest uses this register only to configure number of
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">         * PCIE lane (which in our case is irrelevant) and doesn&#39;t
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">         * really care about the value it reads from this register
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">         */</span>
</span></span><span style="display:flex;"><span>        val <span style="color:#f92672">=</span> <span style="color:#ae81ff">0xDEADBEEF</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">break</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">case</span> DESIGNWARE_PCIE_ATU_CR1:
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">case</span> DESIGNWARE_PCIE_ATU_CR2:
</span></span><span style="display:flex;"><span>        val <span style="color:#f92672">=</span> viewport<span style="color:#f92672">-&gt;</span>cr[(address <span style="color:#f92672">-</span> DESIGNWARE_PCIE_ATU_CR1) <span style="color:#f92672">/</span>
</span></span><span style="display:flex;"><span>                           <span style="color:#66d9ef">sizeof</span>(<span style="color:#66d9ef">uint32_t</span>)];
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">break</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">default</span><span style="color:#f92672">:</span>
</span></span><span style="display:flex;"><span>        val <span style="color:#f92672">=</span> <span style="color:#a6e22e">pci_default_read_config</span>(d, address, len);
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">break</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> val;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-19">19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-20">20</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-21">21</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-22">22</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-23"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-23">23</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-24"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-24">24</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-25"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-25">25</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-26"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-26">26</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-27"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-27">27</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-28"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-28">28</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-29"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-29">29</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-30"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-30">30</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-31"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-31">31</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-20-32"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-20-32">32</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci-host/designware.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">designware_pcie_root_config_write</span>(PCIDevice <span style="color:#f92672">*</span>d, <span style="color:#66d9ef">uint32_t</span> address,
</span></span><span style="display:flex;"><span>                                              <span style="color:#66d9ef">uint32_t</span> val, <span style="color:#66d9ef">int</span> len)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    DesignwarePCIERoot <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> <span style="color:#a6e22e">DESIGNWARE_PCIE_ROOT</span>(d);
</span></span><span style="display:flex;"><span>    DesignwarePCIEHost <span style="color:#f92672">*</span>host <span style="color:#f92672">=</span> <span style="color:#a6e22e">designware_pcie_root_to_host</span>(root);
</span></span><span style="display:flex;"><span>    DesignwarePCIEViewport <span style="color:#f92672">*</span>viewport <span style="color:#f92672">=</span>
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">designware_pcie_root_get_current_viewport</span>(root);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">switch</span> (address) {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">case</span> DESIGNWARE_PCIE_PORT_LINK_CONTROL:
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">case</span> DESIGNWARE_PCIE_LINK_WIDTH_SPEED_CONTROL:
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">case</span> DESIGNWARE_PCIE_PHY_DEBUG_R1:
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">/* No-op */</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">break</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>      ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">case</span> DESIGNWARE_PCIE_ATU_CR1:
</span></span><span style="display:flex;"><span>        viewport<span style="color:#f92672">-&gt;</span>cr[<span style="color:#ae81ff">0</span>] <span style="color:#f92672">=</span> val;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">break</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">case</span> DESIGNWARE_PCIE_ATU_CR2:
</span></span><span style="display:flex;"><span>        viewport<span style="color:#f92672">-&gt;</span>cr[<span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> val;
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">designware_pcie_update_viewport</span>(root, viewport);
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">break</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">default</span><span style="color:#f92672">:</span>
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">pci_bridge_write_config</span>(d, address, val, len);
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">break</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="viewport-memcfg-readwrite">ViewPort MEM/CFG Read/Write</h2>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-1">  1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-2">  2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-3">  3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-4">  4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-5">  5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-6">  6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-7">  7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-8">  8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-9">  9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-10"> 10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-11"> 11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-12"> 12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-13"> 13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-14"> 14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-15"> 15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-16"> 16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-17"> 17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-18"> 18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-19"> 19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-20"> 20</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-21"> 21</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-22"> 22</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-23"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-23"> 23</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-24"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-24"> 24</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-25"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-25"> 25</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-26"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-26"> 26</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-27"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-27"> 27</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-28"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-28"> 28</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-29"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-29"> 29</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-30"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-30"> 30</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-31"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-31"> 31</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-32"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-32"> 32</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-33"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-33"> 33</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-34"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-34"> 34</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-35"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-35"> 35</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-36"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-36"> 36</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-37"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-37"> 37</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-38"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-38"> 38</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-39"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-39"> 39</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-40"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-40"> 40</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-41"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-41"> 41</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-42"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-42"> 42</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-43"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-43"> 43</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-44"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-44"> 44</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-45"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-45"> 45</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-46"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-46"> 46</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-47"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-47"> 47</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-48"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-48"> 48</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-49"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-49"> 49</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-50"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-50"> 50</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-51"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-51"> 51</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-52"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-52"> 52</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-53"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-53"> 53</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-54"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-54"> 54</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-55"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-55"> 55</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-56"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-56"> 56</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-57"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-57"> 57</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-58"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-58"> 58</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-59"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-59"> 59</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-60"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-60"> 60</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-61"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-61"> 61</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-62"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-62"> 62</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-63"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-63"> 63</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-64"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-64"> 64</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-65"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-65"> 65</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-66"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-66"> 66</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-67"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-67"> 67</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-68"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-68"> 68</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-69"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-69"> 69</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-70"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-70"> 70</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-71"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-71"> 71</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-72"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-72"> 72</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-73"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-73"> 73</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-74"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-74"> 74</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-75"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-75"> 75</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-76"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-76"> 76</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-77"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-77"> 77</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-78"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-78"> 78</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-79"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-79"> 79</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-80"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-80"> 80</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-81"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-81"> 81</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-82"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-82"> 82</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-83"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-83"> 83</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-84"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-84"> 84</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-85"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-85"> 85</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-86"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-86"> 86</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-87"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-87"> 87</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-88"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-88"> 88</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-89"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-89"> 89</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-90"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-90"> 90</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-91"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-91"> 91</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-92"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-92"> 92</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-93"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-93"> 93</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-94"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-94"> 94</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-95"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-95"> 95</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-96"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-96"> 96</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-97"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-97"> 97</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-98"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-98"> 98</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-99"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-99"> 99</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-100"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-100">100</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-101"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-101">101</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-102"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-102">102</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-103"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-103">103</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-104"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-104">104</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-105"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-105">105</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-106"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-106">106</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-107"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-107">107</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-108"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-108">108</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-109"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-109">109</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-110"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-110">110</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-111"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-111">111</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-112"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-112">112</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-113"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-113">113</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-114"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-114">114</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-115"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-115">115</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-116"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-116">116</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-117"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-117">117</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-118"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-118">118</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-119"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-119">119</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-21-120"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-21-120">120</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci-host/designware.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">designware_pcie_root_realize</span>(PCIDevice <span style="color:#f92672">*</span>dev, Error <span style="color:#f92672">**</span>errp)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    DesignwarePCIERoot <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> <span style="color:#a6e22e">DESIGNWARE_PCIE_ROOT</span>(dev);
</span></span><span style="display:flex;"><span>    DesignwarePCIEHost <span style="color:#f92672">*</span>host <span style="color:#f92672">=</span> <span style="color:#a6e22e">designware_pcie_root_to_host</span>(root);
</span></span><span style="display:flex;"><span>    MemoryRegion <span style="color:#f92672">*</span>address_space <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>host<span style="color:#f92672">-&gt;</span>pci.memory;
</span></span><span style="display:flex;"><span>    PCIBridge <span style="color:#f92672">*</span>br <span style="color:#f92672">=</span> <span style="color:#a6e22e">PCI_BRIDGE</span>(dev);
</span></span><span style="display:flex;"><span>    DesignwarePCIEViewport <span style="color:#f92672">*</span>viewport;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> (i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> DESIGNWARE_PCIE_NUM_VIEWPORTS; i<span style="color:#f92672">++</span>) {
</span></span><span style="display:flex;"><span>        MemoryRegion <span style="color:#f92672">*</span>source, <span style="color:#f92672">*</span>destination, <span style="color:#f92672">*</span>mem;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>direction;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>name;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        viewport <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>root<span style="color:#f92672">-&gt;</span>viewports[DESIGNWARE_PCIE_VIEWPORT_INBOUND][i];
</span></span><span style="display:flex;"><span>        viewport<span style="color:#f92672">-&gt;</span>inbound <span style="color:#f92672">=</span> true;
</span></span><span style="display:flex;"><span>        viewport<span style="color:#f92672">-&gt;</span>base    <span style="color:#f92672">=</span> <span style="color:#ae81ff">0x0000000000000000ULL</span>;
</span></span><span style="display:flex;"><span>        viewport<span style="color:#f92672">-&gt;</span>target  <span style="color:#f92672">=</span> <span style="color:#ae81ff">0x0000000000000000ULL</span>;
</span></span><span style="display:flex;"><span>        viewport<span style="color:#f92672">-&gt;</span>limit   <span style="color:#f92672">=</span> UINT32_MAX;
</span></span><span style="display:flex;"><span>        viewport<span style="color:#f92672">-&gt;</span>cr[<span style="color:#ae81ff">0</span>]   <span style="color:#f92672">=</span> DESIGNWARE_PCIE_ATU_TYPE_MEM;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        source      <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>host<span style="color:#f92672">-&gt;</span>pci.address_space_root;
</span></span><span style="display:flex;"><span>        destination <span style="color:#f92672">=</span> <span style="color:#a6e22e">get_system_memory</span>();
</span></span><span style="display:flex;"><span>        direction   <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;Inbound&#34;</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">/*
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">         * Configure MemoryRegion implementing PCI -&gt; CPU memory
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">         * access
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">         */</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">// Assign ViewPort&#39;s MEM MemoryRegion as the alias of System memory
</span></span></span><span style="display:flex;"><span>        <span style="color:#75715e">// (destination).
</span></span></span><span style="display:flex;"><span>        <span style="color:#75715e">// The actual offset/size will be updated in
</span></span></span><span style="display:flex;"><span>        <span style="color:#75715e">// designware_pcie_update_viewport().
</span></span></span><span style="display:flex;"><span>        mem  <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>viewport<span style="color:#f92672">-&gt;</span>mem;
</span></span><span style="display:flex;"><span>        name <span style="color:#f92672">=</span> <span style="color:#a6e22e">designware_pcie_viewport_name</span>(direction, i, <span style="color:#e6db74">&#34;MEM&#34;</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">memory_region_init_alias</span>(mem, <span style="color:#a6e22e">OBJECT</span>(root), name, destination,
</span></span><span style="display:flex;"><span>                                 dummy_offset, dummy_size);
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">// Add ViewPort&#39;s MEM MemoryRegion as the subregion of PCIe
</span></span></span><span style="display:flex;"><span>        <span style="color:#75715e">// Host Controller root memory (source).
</span></span></span><span style="display:flex;"><span>        <span style="color:#75715e">// =&gt; PCIe Host Controller root memory -&gt; ViewPort MEM -&gt; System memory.
</span></span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">memory_region_add_subregion_overlap</span>(source, dummy_offset, mem, <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">memory_region_set_enabled</span>(mem, false);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">g_free</span>(name);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        viewport <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>root<span style="color:#f92672">-&gt;</span>viewports[DESIGNWARE_PCIE_VIEWPORT_OUTBOUND][i];
</span></span><span style="display:flex;"><span>        viewport<span style="color:#f92672">-&gt;</span>root    <span style="color:#f92672">=</span> root;
</span></span><span style="display:flex;"><span>        viewport<span style="color:#f92672">-&gt;</span>inbound <span style="color:#f92672">=</span> false;
</span></span><span style="display:flex;"><span>        viewport<span style="color:#f92672">-&gt;</span>base    <span style="color:#f92672">=</span> <span style="color:#ae81ff">0x0000000000000000ULL</span>;
</span></span><span style="display:flex;"><span>        viewport<span style="color:#f92672">-&gt;</span>target  <span style="color:#f92672">=</span> <span style="color:#ae81ff">0x0000000000000000ULL</span>;
</span></span><span style="display:flex;"><span>        viewport<span style="color:#f92672">-&gt;</span>limit   <span style="color:#f92672">=</span> UINT32_MAX;
</span></span><span style="display:flex;"><span>        viewport<span style="color:#f92672">-&gt;</span>cr[<span style="color:#ae81ff">0</span>]   <span style="color:#f92672">=</span> DESIGNWARE_PCIE_ATU_TYPE_MEM;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        destination <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>host<span style="color:#f92672">-&gt;</span>pci.memory;
</span></span><span style="display:flex;"><span>        direction   <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;Outbound&#34;</span>;
</span></span><span style="display:flex;"><span>        source      <span style="color:#f92672">=</span> <span style="color:#a6e22e">get_system_memory</span>();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">/*
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">         * Configure MemoryRegion implementing CPU -&gt; PCI memory
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">         * access
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">         */</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">// Assign ViewPort&#39;s MEM MemoryRegion as the alias of PCIe Host
</span></span></span><span style="display:flex;"><span>        <span style="color:#75715e">// Controller root memory (destination).
</span></span></span><span style="display:flex;"><span>        <span style="color:#75715e">// The actual offset/size will be updated in
</span></span></span><span style="display:flex;"><span>        <span style="color:#75715e">// designware_pcie_update_viewport().
</span></span></span><span style="display:flex;"><span>        mem  <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>viewport<span style="color:#f92672">-&gt;</span>mem;
</span></span><span style="display:flex;"><span>        name <span style="color:#f92672">=</span> <span style="color:#a6e22e">designware_pcie_viewport_name</span>(direction, i, <span style="color:#e6db74">&#34;MEM&#34;</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">memory_region_init_alias</span>(mem, <span style="color:#a6e22e">OBJECT</span>(root), name, destination,
</span></span><span style="display:flex;"><span>                                 dummy_offset, dummy_size);
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">// Add ViewPort&#39;s MEM MemoryRegion as the subregion of System memory
</span></span></span><span style="display:flex;"><span>        <span style="color:#75715e">// (source).
</span></span></span><span style="display:flex;"><span>        <span style="color:#75715e">// System memory -&gt; ViewPort MEM -&gt; PCIe Host Controller root memory.
</span></span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">memory_region_add_subregion</span>(source, dummy_offset, mem);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">memory_region_set_enabled</span>(mem, false);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">g_free</span>(name);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">/*
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">         * Configure MemoryRegion implementing access to configuration
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">         * space
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">         */</span>
</span></span><span style="display:flex;"><span>        mem  <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>viewport<span style="color:#f92672">-&gt;</span>cfg;
</span></span><span style="display:flex;"><span>        name <span style="color:#f92672">=</span> <span style="color:#a6e22e">designware_pcie_viewport_name</span>(direction, i, <span style="color:#e6db74">&#34;CFG&#34;</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">memory_region_init_io</span>(<span style="color:#f92672">&amp;</span>viewport<span style="color:#f92672">-&gt;</span>cfg, <span style="color:#a6e22e">OBJECT</span>(root),
</span></span><span style="display:flex;"><span>                              <span style="color:#f92672">&amp;</span>designware_pci_host_conf_ops,
</span></span><span style="display:flex;"><span>                              viewport, name, dummy_size);
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">// Add ViewPort&#39;s CFG MemoryRegion as the subregion of System memory
</span></span></span><span style="display:flex;"><span>        <span style="color:#75715e">// (source).
</span></span></span><span style="display:flex;"><span>        <span style="color:#75715e">// System memory -&gt; ViewPort CFG -&gt; designware_pci_host_conf_ops().
</span></span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">memory_region_add_subregion</span>(source, dummy_offset, mem);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">memory_region_set_enabled</span>(mem, false);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">g_free</span>(name);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">/*
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * If no inbound iATU windows are configured, HW defaults to
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * letting inbound TLPs to pass in. We emulate that by exlicitly
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * configuring first inbound window to cover all of target&#39;s
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * address space.
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     *
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * NOTE: This will not work correctly for the case when first
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * configured inbound window is window 0
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     */</span>
</span></span><span style="display:flex;"><span>    viewport <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>root<span style="color:#f92672">-&gt;</span>viewports[DESIGNWARE_PCIE_VIEWPORT_INBOUND][<span style="color:#ae81ff">0</span>];
</span></span><span style="display:flex;"><span>    viewport<span style="color:#f92672">-&gt;</span>cr[<span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> DESIGNWARE_PCIE_ATU_ENABLE;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">designware_pcie_update_viewport</span>(root, viewport);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memory_region_init_io</span>(<span style="color:#f92672">&amp;</span>root<span style="color:#f92672">-&gt;</span>msi.iomem, <span style="color:#a6e22e">OBJECT</span>(root),
</span></span><span style="display:flex;"><span>                          <span style="color:#f92672">&amp;</span>designware_pci_host_msi_ops,
</span></span><span style="display:flex;"><span>                          root, <span style="color:#e6db74">&#34;pcie-msi&#34;</span>, <span style="color:#ae81ff">0x4</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">/*
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * We initially place MSI interrupt I/O region a adress 0 and
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * disable it. It&#39;ll be later moved to correct offset and enabled
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * in designware_pcie_root_update_msi_mapping() as a part of
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     * initialization done by guest OS
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">     */</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memory_region_add_subregion</span>(address_space, dummy_offset, <span style="color:#f92672">&amp;</span>root<span style="color:#f92672">-&gt;</span>msi.iomem);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memory_region_set_enabled</span>(<span style="color:#f92672">&amp;</span>root<span style="color:#f92672">-&gt;</span>msi.iomem, false);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-22-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-22-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-22-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-22-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-22-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-22-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-22-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-22-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-22-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-22-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-22-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-22-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-22-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-22-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-22-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-22-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-22-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-22-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-22-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-22-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-22-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-22-11">11</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci-host/designware.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">const</span> MemoryRegionOps designware_pci_host_conf_ops <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>    .read <span style="color:#f92672">=</span> designware_pcie_root_data_read,
</span></span><span style="display:flex;"><span>    .write <span style="color:#f92672">=</span> designware_pcie_root_data_write,
</span></span><span style="display:flex;"><span>    .endianness <span style="color:#f92672">=</span> DEVICE_LITTLE_ENDIAN,
</span></span><span style="display:flex;"><span>    .valid <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>        .min_access_size <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>,
</span></span><span style="display:flex;"><span>        .max_access_size <span style="color:#f92672">=</span> <span style="color:#ae81ff">4</span>,
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>};
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-23-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-23-1">1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-23-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-23-2">2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-23-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-23-3">3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-23-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-23-4">4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-23-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-23-5">5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-23-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-23-6">6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-23-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-23-7">7</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci-host/designware.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">uint64_t</span> <span style="color:#a6e22e">designware_pcie_root_data_read</span>(<span style="color:#66d9ef">void</span> <span style="color:#f92672">*</span>opaque, hwaddr addr,
</span></span><span style="display:flex;"><span>                                               <span style="color:#66d9ef">unsigned</span> len)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">designware_pcie_root_data_access</span>(opaque, addr, NULL, len);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-24-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-24-1">1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-24-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-24-2">2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-24-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-24-3">3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-24-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-24-4">4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-24-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-24-5">5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-24-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-24-6">6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-24-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-24-7">7</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci-host/designware.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">designware_pcie_root_data_write</span>(<span style="color:#66d9ef">void</span> <span style="color:#f92672">*</span>opaque, hwaddr addr,
</span></span><span style="display:flex;"><span>                                            <span style="color:#66d9ef">uint64_t</span> val, <span style="color:#66d9ef">unsigned</span> len)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">designware_pcie_root_data_access</span>(opaque, addr, <span style="color:#f92672">&amp;</span>val, len);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-19">19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-20">20</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-21">21</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-22">22</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-23"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-23">23</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-24"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-24">24</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-25"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-25">25</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-26"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-26">26</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-27"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-27">27</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-28"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-28">28</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-29"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-29">29</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-25-30"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-25-30">30</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci-host/designware.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">uint64_t</span> <span style="color:#a6e22e">designware_pcie_root_data_access</span>(<span style="color:#66d9ef">void</span> <span style="color:#f92672">*</span>opaque, hwaddr addr,
</span></span><span style="display:flex;"><span>                                                 <span style="color:#66d9ef">uint64_t</span> <span style="color:#f92672">*</span>val, <span style="color:#66d9ef">unsigned</span> len)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    DesignwarePCIEViewport <span style="color:#f92672">*</span>viewport <span style="color:#f92672">=</span> opaque;
</span></span><span style="display:flex;"><span>    DesignwarePCIERoot <span style="color:#f92672">*</span>root <span style="color:#f92672">=</span> viewport<span style="color:#f92672">-&gt;</span>root;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">// Config the PCIe devices (BDF) managed by PCIe Host Controller.
</span></span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">uint8_t</span> busnum <span style="color:#f92672">=</span> <span style="color:#a6e22e">DESIGNWARE_PCIE_ATU_BUS</span>(viewport<span style="color:#f92672">-&gt;</span>target);
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">uint8_t</span> devfn  <span style="color:#f92672">=</span> <span style="color:#a6e22e">DESIGNWARE_PCIE_ATU_DEVFN</span>(viewport<span style="color:#f92672">-&gt;</span>target);
</span></span><span style="display:flex;"><span>    PCIBus    <span style="color:#f92672">*</span>pcibus    <span style="color:#f92672">=</span> <span style="color:#a6e22e">pci_get_bus</span>(<span style="color:#a6e22e">PCI_DEVICE</span>(root));
</span></span><span style="display:flex;"><span>    PCIDevice <span style="color:#f92672">*</span>pcidev    <span style="color:#f92672">=</span> <span style="color:#a6e22e">pci_find_device</span>(pcibus, busnum, devfn);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (pcidev) {
</span></span><span style="display:flex;"><span>        addr <span style="color:#f92672">&amp;=</span> <span style="color:#a6e22e">pci_config_size</span>(pcidev) <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> (val) {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">pci_host_config_write_common</span>(pcidev, addr,
</span></span><span style="display:flex;"><span>                                         <span style="color:#a6e22e">pci_config_size</span>(pcidev),
</span></span><span style="display:flex;"><span>                                         <span style="color:#f92672">*</span>val, len);
</span></span><span style="display:flex;"><span>        } <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">pci_host_config_read_common</span>(pcidev, addr,
</span></span><span style="display:flex;"><span>                                               <span style="color:#a6e22e">pci_config_size</span>(pcidev),
</span></span><span style="display:flex;"><span>                                               len);
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> UINT64_MAX;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-19">19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-20">20</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-21">21</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-22">22</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-23"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-23">23</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-24"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-24">24</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-25"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-25">25</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-26"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-26">26</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-27"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-27">27</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-26-28"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-26-28">28</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span>    dmpcie<span style="color:#960050;background-color:#1e0010">@</span><span style="color:#ae81ff">1200000000</span> {
</span></span><span style="display:flex;"><span>        compatible <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;snps,dw-pcie&#34;</span>;
</span></span><span style="display:flex;"><span>        interrupt<span style="color:#f92672">-</span>map<span style="color:#f92672">-</span>mask <span style="color:#f92672">=</span> <span style="color:#f92672">&lt;</span><span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x07</span><span style="color:#f92672">&gt;</span>;
</span></span><span style="display:flex;"><span>        interrupt<span style="color:#f92672">-</span>map <span style="color:#f92672">=</span> <span style="color:#f92672">&lt;</span><span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x01</span> <span style="color:#ae81ff">0x0f</span> <span style="color:#ae81ff">0x10</span> <span style="color:#ae81ff">0x04</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x02</span> <span style="color:#ae81ff">0x0f</span> <span style="color:#ae81ff">0x11</span> <span style="color:#ae81ff">0x04</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x03</span> <span style="color:#ae81ff">0x0f</span> <span style="color:#ae81ff">0x12</span> <span style="color:#ae81ff">0x04</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x04</span> <span style="color:#ae81ff">0x0f</span> <span style="color:#ae81ff">0x13</span> <span style="color:#ae81ff">0x04</span><span style="color:#f92672">&gt;</span>;
</span></span><span style="display:flex;"><span>        interrupt<span style="color:#f92672">-</span>names <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;inta&#34;</span>, <span style="color:#e6db74">&#34;intb&#34;</span>, <span style="color:#e6db74">&#34;intc&#34;</span>, <span style="color:#e6db74">&#34;msi&#34;</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">#interrupt-cells = &lt;0x01&gt;;
</span></span></span><span style="display:flex;"><span>        interrupts <span style="color:#f92672">=</span> <span style="color:#f92672">&lt;</span><span style="color:#ae81ff">0x0f</span> <span style="color:#ae81ff">0x04</span> <span style="color:#ae81ff">0x10</span> <span style="color:#ae81ff">0x04</span> <span style="color:#ae81ff">0x11</span> <span style="color:#ae81ff">0x04</span> <span style="color:#ae81ff">0x12</span> <span style="color:#ae81ff">0x04</span> <span style="color:#ae81ff">0x13</span> <span style="color:#ae81ff">0x04</span><span style="color:#f92672">&gt;</span>;
</span></span><span style="display:flex;"><span>        interrupt<span style="color:#f92672">-</span>parent <span style="color:#f92672">=</span> <span style="color:#f92672">&lt;</span><span style="color:#ae81ff">0x0f</span><span style="color:#f92672">&gt;</span>;
</span></span><span style="display:flex;"><span>        dma<span style="color:#f92672">-</span>ranges <span style="color:#f92672">=</span> <span style="color:#f92672">&lt;</span><span style="color:#ae81ff">0x2000000</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x80000000</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x80000000</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x80000000</span><span style="color:#f92672">&gt;</span>;
</span></span><span style="display:flex;"><span>        ranges <span style="color:#f92672">=</span> <span style="color:#f92672">&lt;</span><span style="color:#ae81ff">0x81000000</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x60080000</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x60080000</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x10000</span>
</span></span><span style="display:flex;"><span>            <span style="color:#ae81ff">0x82000000</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x60090000</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x60090000</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0xff70000</span>
</span></span><span style="display:flex;"><span>            <span style="color:#ae81ff">0x82000000</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x70000000</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x70000000</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x10000000</span>
</span></span><span style="display:flex;"><span>            <span style="color:#ae81ff">0xc3000000</span> <span style="color:#ae81ff">0x20</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x20</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x01</span> <span style="color:#ae81ff">0x00</span><span style="color:#f92672">&gt;</span>;
</span></span><span style="display:flex;"><span>        bus<span style="color:#f92672">-</span>range <span style="color:#f92672">=</span> <span style="color:#f92672">&lt;</span><span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0xff</span><span style="color:#f92672">&gt;</span>;
</span></span><span style="display:flex;"><span>        num<span style="color:#f92672">-</span>lanes <span style="color:#f92672">=</span> <span style="color:#f92672">&lt;</span><span style="color:#ae81ff">0x04</span><span style="color:#f92672">&gt;</span>;
</span></span><span style="display:flex;"><span>        dma<span style="color:#f92672">-</span>coherent;
</span></span><span style="display:flex;"><span>        device_type <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;pci&#34;</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">#size-cells = &lt;0x02&gt;;
</span></span></span><span style="display:flex;"><span>        <span style="color:#75715e">#address-cells = &lt;0x03&gt;;
</span></span></span><span style="display:flex;"><span>        reg<span style="color:#f92672">-</span>names <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;config&#34;</span>, <span style="color:#e6db74">&#34;dbi&#34;</span>, <span style="color:#e6db74">&#34;mgmt&#34;</span>;
</span></span><span style="display:flex;"><span>        reg <span style="color:#f92672">=</span> <span style="color:#f92672">&lt;</span><span style="color:#ae81ff">0x12</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x10000000</span>
</span></span><span style="display:flex;"><span>               <span style="color:#ae81ff">0x11</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x01</span> <span style="color:#ae81ff">0x00</span>
</span></span><span style="display:flex;"><span>               <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x20004000</span> <span style="color:#ae81ff">0x00</span> <span style="color:#ae81ff">0x1000</span><span style="color:#f92672">&gt;</span>;
</span></span><span style="display:flex;"><span>        interrupt<span style="color:#f92672">-</span>controller {
</span></span><span style="display:flex;"><span>            interrupt<span style="color:#f92672">-</span>controller;
</span></span><span style="display:flex;"><span>            <span style="color:#75715e">#address-cell = &lt;0x00&gt;;
</span></span></span><span style="display:flex;"><span>        };
</span></span><span style="display:flex;"><span>    };
</span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li>
<p><code>regs</code>:</p>
<ul>
<li><code>config</code>: Read/write the PCIe devices’ configuration space registers (e.g., Vendor ID, Device ID, BAR 0, BAR 1… etc) under DW PCIe host controller
<ul>
<li>base: <code>0x12_00000000</code></li>
<li>size: <code>0x10000000</code>
<ul>
<li><code>hw/pci-host/designware.c</code>:
<ul>
<li><code>viewport-&gt;cfg</code>
<ul>
<li><code>designware_pci_host_conf_ops</code>:
<ul>
<li>.read = <code>designware_pcie_root_data_read()</code></li>
<li>.write = <code>designware_pcie_root_data_write()</code>
<ul>
<li><code>designware_pcie_root_data_access()</code>, get PCIe device’s BDF from <code>viewport-&gt;target</code>
<ul>
<li><code>pci_host_config_write_common()</code></li>
<li><code>pci_host_config_read_common()</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><code>dbi</code>: Data Bus Interface, read/write DW PCIe host controller itself’s configuration space registers (e.g., Vendor ID, Device ID, BAR 0, BAR 1… etc)
<ul>
<li>base: <code>0x11_00000000</code></li>
<li>size: <code>0x1_00000000</code>
<ul>
<li><code>hw/pci-host/designware.c</code>:
<ul>
<li><code>designware_pci_mmio_ops</code>:
<ul>
<li>.read = <code>designware_pcie_host_mmio_read()</code>, Device/Function ID are hard-coded to <code>0</code>/<code>0</code> (i.e. DWPCIe host controller itself)
<ul>
<li><code>pci_host_config_read_common()</code></li>
</ul>
</li>
<li>.write: <code>designware_pcie_host_mmio_write()</code>
<ul>
<li><code>pci_host_config_write_common()</code></li>
<li><code>designware_pcie_root_class_init()</code>
<ul>
<li>k-&gt;config_read = <code>designware_pcie_root_config_read()</code></li>
<li>k-&gt;config_write = <code>designware_pcie_root_config_write()</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><code>mgmt</code>: PHY management
<ul>
<li>base: <code>0x20004000</code></li>
<li>size: <code>0x1000</code></li>
</ul>
</li>
</ul>
</li>
<li>
<p><code>ranges</code>:</p>
<ul>
<li>
<p>Outbound viewports (CPU address space → PCIe address space):</p>
<ul>
<li>e.g., Configure BAR to store the base address (in PCI address space) of PCIe device’s MMIO registers…etc. CPU can then access PCIe device’s MMIO register by the CPU address. The value written to BAR is allocated by the Linux from the given memory regions specified in <code>ranges</code>.</li>
</ul>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-27-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-27-1">1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-27-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-27-2">2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-27-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-27-3">3</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span>destination <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>host<span style="color:#f92672">-&gt;</span>pci.memory;
</span></span><span style="display:flex;"><span>direction   <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;Outbound&#34;</span>;
</span></span><span style="display:flex;"><span>source      <span style="color:#f92672">=</span> <span style="color:#a6e22e">get_system_memory</span>();
</span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
</li>
<li>
<p><code>dma-ranges</code>:</p>
<ul>
<li>
<p>Inbound viewports (PCIe address space → CPU address space):</p>
<ul>
<li>e.g., PCIe device DMA.</li>
</ul>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-28-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-28-1">1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-28-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-28-2">2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-28-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-28-3">3</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span>source      <span style="color:#f92672">=</span> <span style="color:#f92672">&amp;</span>host<span style="color:#f92672">-&gt;</span>pci.address_space_root;
</span></span><span style="display:flex;"><span>destination <span style="color:#f92672">=</span> <span style="color:#a6e22e">get_system_memory</span>();
</span></span><span style="display:flex;"><span>direction   <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;Inbound&#34;</span>;
</span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
</li>
</ul>
<hr>
<ul>
<li>
<p>DW PCIe host controller registers root PCI bus’ MemoryRegion:</p>
<ul>
<li><code>host-&gt;pci.address_space</code> (AddressSpace)
<ul>
<li>Container: <code>host-&gt;pci.address_space_root</code> (MemoryRegion; size: <code>UINT64_MAX</code>)
<ul>
<li>Aliases: <code>root-&gt;viewports[inbound][i]-&gt;mem</code> (MemoryRegion; base and size are run-time configurable)</li>
<li>Container: <code>host-&gt;pci.memory</code> (MemoryRegion; base: <code>0x0</code>, size: <code>UINT64_MAX</code>)
<ul>
<li>Aliases: <code>root-&gt;viewports[outbound][i]-&gt;mem</code> (MemoryRegion; base and size are run-time configurable)</li>
<li><code>root-&gt;msi.iomem</code> (MemoryRegion; base is run-time configurable, size: <code>0x4</code>)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-19">19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-20">20</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-21">21</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-22">22</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-23"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-23">23</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-24"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-24">24</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-25"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-25">25</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-26"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-26">26</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-27"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-27">27</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-29-28"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-29-28">28</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci-host/designware.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">designware_pcie_host_realize</span>(DeviceState <span style="color:#f92672">*</span>dev, Error <span style="color:#f92672">**</span>errp)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    pci<span style="color:#f92672">-&gt;</span>bus <span style="color:#f92672">=</span> <span style="color:#a6e22e">pci_register_root_bus</span>(dev, <span style="color:#e6db74">&#34;pcie&#34;</span>,
</span></span><span style="display:flex;"><span>                                     designware_pcie_set_irq,
</span></span><span style="display:flex;"><span>                                     pci_swizzle_map_irq_fn,
</span></span><span style="display:flex;"><span>                                     s,
</span></span><span style="display:flex;"><span>                                     <span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.memory,
</span></span><span style="display:flex;"><span>                                     <span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.io,
</span></span><span style="display:flex;"><span>                                     <span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">4</span>,
</span></span><span style="display:flex;"><span>                                     TYPE_PCIE_BUS);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memory_region_init</span>(<span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.address_space_root,
</span></span><span style="display:flex;"><span>                       <span style="color:#a6e22e">OBJECT</span>(s),
</span></span><span style="display:flex;"><span>                       <span style="color:#e6db74">&#34;pcie-bus-address-space-root&#34;</span>,
</span></span><span style="display:flex;"><span>                       UINT64_MAX);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memory_region_add_subregion</span>(<span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.address_space_root,
</span></span><span style="display:flex;"><span>                                <span style="color:#ae81ff">0x0</span>, <span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.memory);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">address_space_init</span>(<span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.address_space,
</span></span><span style="display:flex;"><span>                        <span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.address_space_root,
</span></span><span style="display:flex;"><span>                       <span style="color:#e6db74">&#34;pcie-bus-address-space&#34;</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">pci_setup_iommu</span>(pci<span style="color:#f92672">-&gt;</span>bus, designware_pcie_host_set_iommu, s);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">qdev_realize</span>(<span style="color:#a6e22e">DEVICE</span>(<span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>root), <span style="color:#a6e22e">BUS</span>(pci<span style="color:#f92672">-&gt;</span>bus), <span style="color:#f92672">&amp;</span>error_fatal);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-30-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-30-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-30-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-30-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-30-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-30-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-30-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-30-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-30-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-30-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-30-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-30-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-30-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-30-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-30-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-30-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-30-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-30-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-30-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-30-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-30-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-30-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-30-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-30-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-30-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-30-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-30-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-30-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-30-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-30-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-30-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-30-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-30-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-30-17">17</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci/pci.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>PCIBus <span style="color:#f92672">*</span><span style="color:#a6e22e">pci_register_root_bus</span>(DeviceState <span style="color:#f92672">*</span>parent, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>name,
</span></span><span style="display:flex;"><span>                              pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
</span></span><span style="display:flex;"><span>                              <span style="color:#66d9ef">void</span> <span style="color:#f92672">*</span>irq_opaque,
</span></span><span style="display:flex;"><span>                              MemoryRegion <span style="color:#f92672">*</span>address_space_mem,
</span></span><span style="display:flex;"><span>                              MemoryRegion <span style="color:#f92672">*</span>address_space_io,
</span></span><span style="display:flex;"><span>                              <span style="color:#66d9ef">uint8_t</span> devfn_min, <span style="color:#66d9ef">int</span> nirq,
</span></span><span style="display:flex;"><span>                              <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span><span style="color:#66d9ef">typename</span>)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    PCIBus <span style="color:#f92672">*</span>bus;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    bus <span style="color:#f92672">=</span> <span style="color:#a6e22e">pci_root_bus_new</span>(parent, name, address_space_mem,
</span></span><span style="display:flex;"><span>                           address_space_io, devfn_min, <span style="color:#66d9ef">typename</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">pci_bus_irqs</span>(bus, set_irq, map_irq, irq_opaque, nirq);
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> bus;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-31-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-31-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-31-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-31-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-31-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-31-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-31-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-31-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-31-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-31-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-31-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-31-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-31-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-31-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-31-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-31-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-31-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-31-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-31-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-31-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-31-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-31-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-31-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-31-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-31-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-31-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-31-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-31-14">14</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci/pci.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>PCIBus <span style="color:#f92672">*</span><span style="color:#a6e22e">pci_root_bus_new</span>(DeviceState <span style="color:#f92672">*</span>parent, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>name,
</span></span><span style="display:flex;"><span>                         MemoryRegion <span style="color:#f92672">*</span>address_space_mem,
</span></span><span style="display:flex;"><span>                         MemoryRegion <span style="color:#f92672">*</span>address_space_io,
</span></span><span style="display:flex;"><span>                         <span style="color:#66d9ef">uint8_t</span> devfn_min, <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span><span style="color:#66d9ef">typename</span>)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    PCIBus <span style="color:#f92672">*</span>bus;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    bus <span style="color:#f92672">=</span> <span style="color:#a6e22e">PCI_BUS</span>(<span style="color:#a6e22e">qbus_new</span>(<span style="color:#66d9ef">typename</span>, parent, name));
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">pci_root_bus_internal_init</span>(bus, parent, address_space_mem,
</span></span><span style="display:flex;"><span>                               address_space_io, devfn_min);
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> bus;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-32-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-32-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-32-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-32-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-32-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-32-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-32-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-32-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-32-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-32-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-32-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-32-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-32-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-32-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-32-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-32-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-32-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-32-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-32-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-32-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-32-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-32-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-32-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-32-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-32-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-32-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-32-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-32-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-32-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-32-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-32-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-32-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-32-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-32-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-32-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-32-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-32-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-32-19">19</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci/pci.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">pci_root_bus_internal_init</span>(PCIBus <span style="color:#f92672">*</span>bus, DeviceState <span style="color:#f92672">*</span>parent,
</span></span><span style="display:flex;"><span>                                       MemoryRegion <span style="color:#f92672">*</span>address_space_mem,
</span></span><span style="display:flex;"><span>                                       MemoryRegion <span style="color:#f92672">*</span>address_space_io,
</span></span><span style="display:flex;"><span>                                       <span style="color:#66d9ef">uint8_t</span> devfn_min)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">assert</span>(<span style="color:#a6e22e">PCI_FUNC</span>(devfn_min) <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>);
</span></span><span style="display:flex;"><span>    bus<span style="color:#f92672">-&gt;</span>devfn_min <span style="color:#f92672">=</span> devfn_min;
</span></span><span style="display:flex;"><span>    bus<span style="color:#f92672">-&gt;</span>slot_reserved_mask <span style="color:#f92672">=</span> <span style="color:#ae81ff">0x0</span>;
</span></span><span style="display:flex;"><span>    bus<span style="color:#f92672">-&gt;</span>address_space_mem <span style="color:#f92672">=</span> address_space_mem;
</span></span><span style="display:flex;"><span>    bus<span style="color:#f92672">-&gt;</span>address_space_io <span style="color:#f92672">=</span> address_space_io;
</span></span><span style="display:flex;"><span>    bus<span style="color:#f92672">-&gt;</span>flags <span style="color:#f92672">|=</span> PCI_BUS_IS_ROOT;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">/* host bridge */</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">QLIST_INIT</span>(<span style="color:#f92672">&amp;</span>bus<span style="color:#f92672">-&gt;</span>child);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">pci_host_bus_register</span>(parent);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p>PCIe device’s <code>bus_master_as</code>:</p>
<ul>
<li>PCI device <code>bus_master_as</code>, e.g., DW PCIe host controller + e1000e:
<ul>
<li><code>pci-dev-&gt;bus_master_as</code> (AddressSpace, e1000e):
<ul>
<li>Container: <code>pci_dev-&gt;bus_master_container_region</code> (MemoryRegion, e1000e)
<ul>
<li>Alias: <code>pci_dev-&gt;bus_master_enable_region</code> (MemoryRegion, e1000e), alias of <code>host-&gt;pci.address_space</code>&rsquo;s (AddressSpace, DW PCIe) root MemoryRegion ⇒ Container: <code>host-&gt;pci.address_space_root</code> (MemoryRegion, DW PCIe, size: <code>UINT64_MAX</code>); base: <code>0x0</code>, size: <code>host-&gt;pci.address_space_root</code>&rsquo;s size ⇒ <code>UINT64_MAX</code>.
<ul>
<li>Aliases: <code>root-&gt;viewports[inbound][i]-&gt;mem</code> (MemoryRegion; base and size are run-time configurable)</li>
<li>Container: <code>host-&gt;pci.memory</code> (MemoryRegion; base: <code>0x0</code>, size: <code>UINT64_MAX</code>)
<ul>
<li>Aliases: <code>root-&gt;viewports[outbound][i]-&gt;mem</code> (MemoryRegion; base and size are run-time configurable)</li>
<li><code>root-&gt;msi.iomem</code> (MemoryRegion; base is run-time configurable, size: <code>0x4</code>)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-19">19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-20">20</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-21">21</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-22">22</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-23"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-23">23</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-24"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-24">24</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-25"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-25">25</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-26"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-26">26</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-27"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-27">27</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-33-28"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-33-28">28</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci/pci.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">/* -1 for devfn means auto assign */</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> PCIDevice <span style="color:#f92672">*</span><span style="color:#a6e22e">do_pci_register_device</span>(PCIDevice <span style="color:#f92672">*</span>pci_dev,
</span></span><span style="display:flex;"><span>                                         <span style="color:#66d9ef">const</span> <span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>name, <span style="color:#66d9ef">int</span> devfn,
</span></span><span style="display:flex;"><span>                                         Error <span style="color:#f92672">**</span>errp)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    PCIDeviceClass <span style="color:#f92672">*</span>pc <span style="color:#f92672">=</span> <span style="color:#a6e22e">PCI_DEVICE_GET_CLASS</span>(pci_dev);
</span></span><span style="display:flex;"><span>    PCIConfigReadFunc <span style="color:#f92672">*</span>config_read <span style="color:#f92672">=</span> pc<span style="color:#f92672">-&gt;</span>config_read;
</span></span><span style="display:flex;"><span>    PCIConfigWriteFunc <span style="color:#f92672">*</span>config_write <span style="color:#f92672">=</span> pc<span style="color:#f92672">-&gt;</span>config_write;
</span></span><span style="display:flex;"><span>    Error <span style="color:#f92672">*</span>local_err <span style="color:#f92672">=</span> NULL;
</span></span><span style="display:flex;"><span>    DeviceState <span style="color:#f92672">*</span>dev <span style="color:#f92672">=</span> <span style="color:#a6e22e">DEVICE</span>(pci_dev);
</span></span><span style="display:flex;"><span>    PCIBus <span style="color:#f92672">*</span>bus <span style="color:#f92672">=</span> <span style="color:#a6e22e">pci_get_bus</span>(pci_dev);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memory_region_init</span>(<span style="color:#f92672">&amp;</span>pci_dev<span style="color:#f92672">-&gt;</span>bus_master_container_region, <span style="color:#a6e22e">OBJECT</span>(pci_dev),
</span></span><span style="display:flex;"><span>                       <span style="color:#e6db74">&#34;bus master container&#34;</span>, UINT64_MAX);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">address_space_init</span>(<span style="color:#f92672">&amp;</span>pci_dev<span style="color:#f92672">-&gt;</span>bus_master_as,
</span></span><span style="display:flex;"><span>                       <span style="color:#f92672">&amp;</span>pci_dev<span style="color:#f92672">-&gt;</span>bus_master_container_region, pci_dev<span style="color:#f92672">-&gt;</span>name);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">phase_check</span>(MACHINE_INIT_PHASE_READY)) {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">pci_init_bus_master</span>(pci_dev);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> pci_dev;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-34-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-34-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-34-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-34-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-34-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-34-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-34-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-34-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-34-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-34-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-34-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-34-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-34-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-34-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-34-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-34-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-34-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-34-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-34-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-34-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-34-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-34-11">11</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci/pci.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">pci_bus_realize</span>(BusState <span style="color:#f92672">*</span>qbus, Error <span style="color:#f92672">**</span>errp)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    PCIBus <span style="color:#f92672">*</span>bus <span style="color:#f92672">=</span> <span style="color:#a6e22e">PCI_BUS</span>(qbus);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    bus<span style="color:#f92672">-&gt;</span>machine_done.notify <span style="color:#f92672">=</span> pcibus_machine_done;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">qemu_add_machine_init_done_notifier</span>(<span style="color:#f92672">&amp;</span>bus<span style="color:#f92672">-&gt;</span>machine_done);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">vmstate_register</span>(NULL, VMSTATE_INSTANCE_ID_ANY, <span style="color:#f92672">&amp;</span>vmstate_pcibus, bus);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-35-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-35-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-35-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-35-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-35-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-35-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-35-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-35-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-35-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-35-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-35-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-35-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-35-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-35-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-35-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-35-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-35-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-35-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-35-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-35-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-35-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-35-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-35-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-35-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-35-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-35-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-35-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-35-14">14</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci/pci.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">pcibus_machine_done</span>(Notifier <span style="color:#f92672">*</span>notifier, <span style="color:#66d9ef">void</span> <span style="color:#f92672">*</span>data)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    PCIBus <span style="color:#f92672">*</span>bus <span style="color:#f92672">=</span> <span style="color:#a6e22e">container_of</span>(notifier, PCIBus, machine_done);
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">int</span> i;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> (i <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; i <span style="color:#f92672">&lt;</span> <span style="color:#a6e22e">ARRAY_SIZE</span>(bus<span style="color:#f92672">-&gt;</span>devices); <span style="color:#f92672">++</span>i) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> (bus<span style="color:#f92672">-&gt;</span>devices[i]) {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">pci_init_bus_master</span>(bus<span style="color:#f92672">-&gt;</span>devices[i]);
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">pci_init_mem_attrs</span>(bus<span style="color:#f92672">-&gt;</span>devices[i]);
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-36-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-36-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-36-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-36-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-36-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-36-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-36-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-36-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-36-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-36-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-36-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-36-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-36-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-36-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-36-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-36-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-36-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-36-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-36-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-36-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-36-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-36-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-36-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-36-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-36-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-36-13">13</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci/pci.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">pci_init_bus_master</span>(PCIDevice <span style="color:#f92672">*</span>pci_dev)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    AddressSpace <span style="color:#f92672">*</span>dma_as <span style="color:#f92672">=</span> <span style="color:#a6e22e">pci_device_iommu_address_space</span>(pci_dev);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memory_region_init_alias</span>(<span style="color:#f92672">&amp;</span>pci_dev<span style="color:#f92672">-&gt;</span>bus_master_enable_region,
</span></span><span style="display:flex;"><span>                             <span style="color:#a6e22e">OBJECT</span>(pci_dev), <span style="color:#e6db74">&#34;bus master&#34;</span>,
</span></span><span style="display:flex;"><span>                             dma_as<span style="color:#f92672">-&gt;</span>root, <span style="color:#ae81ff">0</span>, <span style="color:#a6e22e">memory_region_size</span>(dma_as<span style="color:#f92672">-&gt;</span>root));
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memory_region_set_enabled</span>(<span style="color:#f92672">&amp;</span>pci_dev<span style="color:#f92672">-&gt;</span>bus_master_enable_region, false);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memory_region_add_subregion</span>(<span style="color:#f92672">&amp;</span>pci_dev<span style="color:#f92672">-&gt;</span>bus_master_container_region, <span style="color:#ae81ff">0</span>,
</span></span><span style="display:flex;"><span>                                <span style="color:#f92672">&amp;</span>pci_dev<span style="color:#f92672">-&gt;</span>bus_master_enable_region);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-19">19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-20">20</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-21">21</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-22">22</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-23"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-23">23</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-24"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-24">24</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-25"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-25">25</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-26"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-26">26</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-27"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-27">27</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-28"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-28">28</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-29"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-29">29</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-30"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-30">30</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-31"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-31">31</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-32"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-32">32</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-37-33"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-37-33">33</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci/pci.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>AddressSpace <span style="color:#f92672">*</span><span style="color:#a6e22e">pci_device_iommu_address_space</span>(PCIDevice <span style="color:#f92672">*</span>dev)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    PCIBus <span style="color:#f92672">*</span>bus <span style="color:#f92672">=</span> <span style="color:#a6e22e">pci_get_bus</span>(dev);
</span></span><span style="display:flex;"><span>    PCIBus <span style="color:#f92672">*</span>iommu_bus <span style="color:#f92672">=</span> bus;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">uint8_t</span> devfn <span style="color:#f92672">=</span> dev<span style="color:#f92672">-&gt;</span>devfn;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">while</span> (iommu_bus <span style="color:#f92672">&amp;&amp;</span> <span style="color:#f92672">!</span>iommu_bus<span style="color:#f92672">-&gt;</span>iommu_fn <span style="color:#f92672">&amp;&amp;</span> iommu_bus<span style="color:#f92672">-&gt;</span>parent_dev) {
</span></span><span style="display:flex;"><span>        PCIBus <span style="color:#f92672">*</span>parent_bus <span style="color:#f92672">=</span> <span style="color:#a6e22e">pci_get_bus</span>(iommu_bus<span style="color:#f92672">-&gt;</span>parent_dev);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span><span style="color:#a6e22e">pci_bus_is_express</span>(iommu_bus)) {
</span></span><span style="display:flex;"><span>            PCIDevice <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> iommu_bus<span style="color:#f92672">-&gt;</span>parent_dev;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">pci_is_express</span>(parent) <span style="color:#f92672">&amp;&amp;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">pcie_cap_get_type</span>(parent) <span style="color:#f92672">==</span> PCI_EXP_TYPE_PCI_BRIDGE) {
</span></span><span style="display:flex;"><span>                devfn <span style="color:#f92672">=</span> <span style="color:#a6e22e">PCI_DEVFN</span>(<span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">0</span>);
</span></span><span style="display:flex;"><span>                bus <span style="color:#f92672">=</span> iommu_bus;
</span></span><span style="display:flex;"><span>            } <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>                devfn <span style="color:#f92672">=</span> parent<span style="color:#f92672">-&gt;</span>devfn;
</span></span><span style="display:flex;"><span>                bus <span style="color:#f92672">=</span> parent_bus;
</span></span><span style="display:flex;"><span>            }
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        iommu_bus <span style="color:#f92672">=</span> parent_bus;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span><span style="color:#a6e22e">pci_bus_bypass_iommu</span>(bus) <span style="color:#f92672">&amp;&amp;</span> iommu_bus <span style="color:#f92672">&amp;&amp;</span> iommu_bus<span style="color:#f92672">-&gt;</span>iommu_fn) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> iommu_bus<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">iommu_fn</span>(bus, iommu_bus<span style="color:#f92672">-&gt;</span>iommu_opaque, devfn);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#f92672">&amp;</span>address_space_memory;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-38-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-38-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-38-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-38-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-38-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-38-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-38-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-38-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-38-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-38-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-38-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-38-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-38-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-38-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-38-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-38-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-38-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-38-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-38-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-38-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-38-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-38-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-38-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-38-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-38-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-38-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-38-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-38-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-38-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-38-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-38-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-38-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-38-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-38-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-38-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-38-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-38-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-38-19">19</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci-host/designware.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">designware_pcie_host_realize</span>(DeviceState <span style="color:#f92672">*</span>dev, Error <span style="color:#f92672">**</span>errp)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    ...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memory_region_init</span>(<span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.address_space_root,
</span></span><span style="display:flex;"><span>                       <span style="color:#a6e22e">OBJECT</span>(s),
</span></span><span style="display:flex;"><span>                       <span style="color:#e6db74">&#34;pcie-bus-address-space-root&#34;</span>,
</span></span><span style="display:flex;"><span>                       UINT64_MAX);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">memory_region_add_subregion</span>(<span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.address_space_root,
</span></span><span style="display:flex;"><span>                                <span style="color:#ae81ff">0x0</span>, <span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.memory);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">address_space_init</span>(<span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.address_space,
</span></span><span style="display:flex;"><span>                       <span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.address_space_root,
</span></span><span style="display:flex;"><span>                       <span style="color:#e6db74">&#34;pcie-bus-address-space&#34;</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">pci_setup_iommu</span>(pci<span style="color:#f92672">-&gt;</span>bus, designware_pcie_host_set_iommu, s);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">qdev_realize</span>(<span style="color:#a6e22e">DEVICE</span>(<span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>root), <span style="color:#a6e22e">BUS</span>(pci<span style="color:#f92672">-&gt;</span>bus), <span style="color:#f92672">&amp;</span>error_fatal);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-39-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-39-1">1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-39-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-39-2">2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-39-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-39-3">3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-39-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-39-4">4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-39-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-39-5">5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-39-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-39-6">6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-39-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-39-7">7</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci/pci.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">void</span> <span style="color:#a6e22e">pci_setup_iommu</span>(PCIBus <span style="color:#f92672">*</span>bus, PCIIOMMUFunc fn, <span style="color:#66d9ef">void</span> <span style="color:#f92672">*</span>opaque)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    bus<span style="color:#f92672">-&gt;</span>iommu_fn <span style="color:#f92672">=</span> fn;
</span></span><span style="display:flex;"><span>    bus<span style="color:#f92672">-&gt;</span>iommu_opaque <span style="color:#f92672">=</span> opaque;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-40-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-40-1">1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-40-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-40-2">2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-40-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-40-3">3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-40-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-40-4">4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-40-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-40-5">5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-40-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-40-6">6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-40-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-40-7">7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-40-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-40-8">8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-40-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-40-9">9</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci-host/designware.c
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> AddressSpace <span style="color:#f92672">*</span><span style="color:#a6e22e">designware_pcie_host_set_iommu</span>(PCIBus <span style="color:#f92672">*</span>bus, <span style="color:#66d9ef">void</span> <span style="color:#f92672">*</span>opaque,
</span></span><span style="display:flex;"><span>                                                    <span style="color:#66d9ef">int</span> devfn)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    DesignwarePCIEHost <span style="color:#f92672">*</span>s <span style="color:#f92672">=</span> <span style="color:#a6e22e">DESIGNWARE_PCIE_HOST</span>(opaque);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#f92672">&amp;</span>s<span style="color:#f92672">-&gt;</span>pci.address_space;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p>PCI device’s DMA:</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-19">19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-41-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-41-20">20</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci/pci.h
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">/**
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * pci_dma_read: Read from an address space from PCI device.
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> *
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * Return a MemTxResult indicating whether the operation succeeded
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * or failed (eg unassigned memory, device rejected the transaction,
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * IOMMU fault).  Called within RCU critical section.
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> *
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * @dev: #PCIDevice doing the memory access
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * @addr: address within the #PCIDevice address space
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * @buf: buffer with the data transferred
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * @len: length of the data transferred
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> */</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">inline</span> MemTxResult <span style="color:#a6e22e">pci_dma_read</span>(PCIDevice <span style="color:#f92672">*</span>dev, <span style="color:#66d9ef">dma_addr_t</span> addr,
</span></span><span style="display:flex;"><span>                                       <span style="color:#66d9ef">void</span> <span style="color:#f92672">*</span>buf, <span style="color:#66d9ef">dma_addr_t</span> len)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">pci_dma_rw</span>(dev, addr, buf, len,
</span></span><span style="display:flex;"><span>                      DMA_DIRECTION_TO_DEVICE, MEMTXATTRS_UNSPECIFIED);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-1"> 1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-2"> 2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-3"> 3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-4"> 4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-5"> 5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-6"> 6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-7"> 7</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-8"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-8"> 8</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-9"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-9"> 9</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-10"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-10">10</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-11"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-11">11</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-12"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-12">12</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-13"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-13">13</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-14"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-14">14</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-15"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-15">15</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-16"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-16">16</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-17"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-17">17</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-18"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-18">18</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-19"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-19">19</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-20"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-20">20</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-21"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-21">21</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-42-22"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-42-22">22</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci/pci.h
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">/**
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * pci_dma_rw: Read from or write to an address space from PCI device.
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> *
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * Return a MemTxResult indicating whether the operation succeeded
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * or failed (eg unassigned memory, device rejected the transaction,
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * IOMMU fault).
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> *
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * @dev: #PCIDevice doing the memory access
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * @addr: address within the #PCIDevice address space
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * @buf: buffer with the data transferred
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * @len: the number of bytes to read or write
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> * @dir: indicates the transfer direction
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"> */</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">inline</span> MemTxResult <span style="color:#a6e22e">pci_dma_rw</span>(PCIDevice <span style="color:#f92672">*</span>dev, <span style="color:#66d9ef">dma_addr_t</span> addr,
</span></span><span style="display:flex;"><span>                                     <span style="color:#66d9ef">void</span> <span style="color:#f92672">*</span>buf, <span style="color:#66d9ef">dma_addr_t</span> len,
</span></span><span style="display:flex;"><span>                                     DMADirection dir, MemTxAttrs attrs)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">dma_memory_rw</span>(<span style="color:#a6e22e">pci_get_address_space</span>(dev), addr, buf, len,
</span></span><span style="display:flex;"><span>                         dir, attrs);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-43-1"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-43-1">1</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-43-2"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-43-2">2</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-43-3"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-43-3">3</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-43-4"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-43-4">4</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-43-5"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-43-5">5</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-43-6"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-43-6">6</a>
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" id="hl-43-7"><a style="outline:none;text-decoration:none;color:inherit" href="#hl-43-7">7</a>
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">// hw/pci/pci.h
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">/* DMA access functions */</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">static</span> <span style="color:#66d9ef">inline</span> AddressSpace <span style="color:#f92672">*</span><span style="color:#a6e22e">pci_get_address_space</span>(PCIDevice <span style="color:#f92672">*</span>dev)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#f92672">&amp;</span>dev<span style="color:#f92672">-&gt;</span>bus_master_as;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
]]></content:encoded>
    </item>
  </channel>
</rss>
