\chapter{Introduction}

\input{abstract.tex}

  Straightforward: Virtio devices use normal bus mechanisms of
  interrupts and DMA which should be familiar to any device driver
  author. There is no exotic page-flipping or COW mechanism: it's just
  a normal device.
\footnote{This lack of page-sharing implies that the implementation of the
device (e.g. the hypervisor or host) needs full access to the
guest memory. Communication with untrusted parties (i.e.
inter-guest communication) requires copying.
}

  Efficient: Virtio devices consist of rings of descriptors
  for input and output, which are neatly separated to avoid cache
  effects from both guest and device writing to the same cache
  lines.

  Standard: Virtio makes no assumptions about the environment in which
  it operates, beyond supporting the bus attaching the device.  Virtio
  devices are implemented over PCI and other buses, and earlier drafts
  been implemented on other buses not included in this spec.
\footnote{The Linux implementation further separates the PCI virtio code
from the specific virtio drivers: these drivers are shared with
the non-PCI implementations (currently lguest and S/390).
}

  Extensible: Virtio PCI devices contain feature bits which are
  acknowledged by the guest operating system during device setup.
  This allows forwards and backwards compatibility: the device
  offers all the features it knows about, and the driver
  acknowledges those it understands and wishes to use.

\section{Terminology}\label{Terminology}

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in \hyperref[intro:rfc2119]{[RFC2119]}.

\section{Normative References}

\begin{longtable}{l p{5in}}
	\phantomsection\label{intro:rfc2119}\textbf{[RFC2119]} & S. Bradner, Key words for use in RFCs to Indicate Requirement Levels, \newline\url{http://www.ietf.org/rfc/rfc2119.txt}, March 1997\\
	\phantomsection\label{intro:S390 PoP}\textbf{[S390 PoP]} & z/Architecture Principles of Operation, \newline IBM Publication SA22-7832\\
	\phantomsection\label{intro:S390 Common I/O}\textbf{[S390 Common I/O]} & ESA/390 Common I/O-Device and Self-Description, \newline IBM Publication SA22-7204\\
\end{longtable}


\section{Non-Normative References}


\newpage

orm>
</td></tr></table>
<div class='path'>path: <a href='/renesas/drm.git/tree/?h=live&amp;id=733ff568346e8fe40e9790f21f8b7efc659d5d12'>root</a>/<a href='/renesas/drm.git/tree/shared-core?h=live&amp;id=733ff568346e8fe40e9790f21f8b7efc659d5d12'>shared-core</a>/<a href='/renesas/drm.git/tree/shared-core/nouveau_drv.h?h=live&amp;id=733ff568346e8fe40e9790f21f8b7efc659d5d12'>nouveau_drv.h</a></div><div class='content'>blob: e5cef075ce7d1db28a825bb00995280bc73ee6c9 (<a href='/renesas/drm.git/plain/shared-core/nouveau_drv.h?h=live&amp;id=733ff568346e8fe40e9790f21f8b7efc659d5d12'>plain</a>)
<table summary='blob content' class='blob'>
<tr><td class='linenumbers'><pre><a id='n1' href='#n1'>1</a>
<a id='n2' href='#n2'>2</a>
<a id='n3' href='#n3'>3</a>
<a id='n4' href='#n4'>4</a>
<a id='n5' href='#n5'>5</a>
<a id='n6' href='#n6'>6</a>
<a id='n7' href='#n7'>7</a>
<a id='n8' href='#n8'>8</a>
<a id='n9' href='#n9'>9</a>
<a id='n10' href='#n10'>10</a>
<a id='n11' href='#n11'>11</a>
<a id='n12' href='#n12'>12</a>
<a id='n13' href='#n13'>13</a>
<a id='n14' href='#n14'>14</a>
<a id='n15' href='#n15'>15</a>
<a id='n16' href='#n16'>16</a>
<a id='n17' href='#n17'>17</a>
<a id='n18' href='#n18'>18</a>
<a id='n19' href='#n19'>19</a>
<a id='n20' href='#n20'>20</a>
<a id='n21' href='#n21'>21</a>
<a id='n22' href='#n22'>22</a>
<a id='n23' href='#n23'>23</a>
<a id='n24' href='#n24'>24</a>
<a id='n25' href='#n25'>25</a>
<a id='n26' href='#n26'>26</a>
<a id='n27' href='#n27'>27</a>
<a id='n28' href='#n28'>28</a>
<a id='n29' href='#n29'>29</a>
<a id='n30' href='#n30'>30</a>
<a id='n31' href='#n31'>31</a>
<a id='n32' href='#n32'>32</a>
<a id='n33' href='#n33'>33</a>
<a id='n34' href='#n34'>34</a>
<a id='n35' href='#n35'>35</a>
<a id='n36' href='#n36'>36</a>
<a id='n37' href='#n37'>37</a>
<a id='n38' href='#n38'>38</a>
<a id='n39' href='#n39'>39</a>
<a id='n40' href='#n40'>40</a>
<a id='n41' href='#n41'>41</a>
<a id='n42' href='#n42'>42</a>
<a id='n43' href='#n43'>43</a>
<a id='n44' href='#n44'>44</a>
<a id='n45' href='#n45'>45</a>
<a id='n46' href='#n46'>46</a>
<a id='n47' href='#n47'>47</a>
<a id='n48' href='#n48'>48</a>
<a id='n49' href='#n49'>49</a>
<a id='n50' href='#n50'>50</a>
<a id='n51' href='#n51'>51</a>
<a id='n52' href='#n52'>52</a>
<a id='n53' href='#n53'>53</a>
<a id='n54' href='#n54'>54</a>
<a id='n55' href='#n55'>55</a>
<a id='n56' href='#n56'>56</a>
<a id='n57' href='#n57'>57</a>
<a id='n58' href='#n58'>58</a>
<a id='n59' href='#n59'>59</a>
<a id='n60' href='#n60'>60</a>
<a id='n61' href='#n61'>61</a>
<a id='n62' href='#n62'>62</a>
<a id='n63' href='#n63'>63</a>
<a id='n64' href='#n64'>64</a>
<a id='n65' href='#n65'>65</a>
<a id='n66' href='#n66'>66</a>
<a id='n67' href='#n67'>67</a>
<a id='n68' href='#n68'>68</a>
<a id='n69' href='#n69'>69</a>
<a id='n70' href='#n70'>70</a>
<a id='n71' href='#n71'>71</a>
<a id='n72' href='#n72'>72</a>
<a id='n73' href='#n73'>73</a>
<a id='n74' href='#n74'>74</a>
<a id='n75' href='#n75'>75</a>
<a id='n76' href='#n76'>76</a>
<a id='n77' href='#n77'>77</a>
<a id='n78' href='#n78'>78</a>
<a id='n79' href='#n79'>79</a>
<a id='n80' href='#n80'>80</a>
<a id='n81' href='#n81'>81</a>
<a id='n82' href='#n82'>82</a>
<a id='n83' href='#n83'>83</a>
<a id='n84' href='#n84'>84</a>
<a id='n85' href='#n85'>85</a>
<a id='n86' href='#n86'>86</a>
<a id='n87' href='#n87'>87</a>
<a id='n88' href='#n88'>88</a>
<a id='n89' href='#n89'>89</a>
<a id='n90' href='#n90'>90</a>
<a id='n91' href='#n91'>91</a>
<a id='n92' href='#n92'>92</a>
<a id='n93' href='#n93'>93</a>
<a id='n94' href='#n94'>94</a>
<a id='n95' href='#n95'>95</a>
<a id='n96' href='#n96'>96</a>
<a id='n97' href='#n97'>97</a>
<a id='n98' href='#n98'>98</a>
<a id='n99' href='#n99'>99</a>
<a id='n100' href='#n100'>100</a>
<a id='n101' href='#n101'>101</a>
<a id='n102' href='#n102'>102</a>
<a id='n103' href='#n103'>103</a>
<a id='n104' href='#n104'>104</a>
<a id='n105' href='#n105'>105</a>
<a id='n106' href='#n106'>106</a>
<a id='n107' href='#n107'>107</a>
<a id='n108' href='#n108'>108</a>
<a id='n109' href='#n109'>109</a>
<a id='n110' href='#n110'>110</a>
<a id='n111' href='#n111'>111</a>
<a id='n112' href='#n112'>112</a>
<a id='n113' href='#n113'>113</a>
<a id='n114' href='#n114'>114</a>
<a id='n115' href='#n115'>115</a>
<a id='n116' href='#n116'>116</a>
<a id='n117' href='#n117'>117</a>
<a id='n118' href='#n118'>118</a>
<a id='n119' href='#n119'>119</a>
<a id='n120' href='#n120'>120</a>
<a id='n121' href='#n121'>121</a>
<a id='n122' href='#n122'>122</a>
<a id='n123' href='#n123'>123</a>
<a id='n124' href='#n124'>124</a>
<a id='n125' href='#n125'>125</a>
<a id='n126' href='#n126'>126</a>
<a id='n127' href='#n127'>127</a>
<a id='n128' href='#n128'>128</a>
<a id='n129' href='#n129'>129</a>
<a id='n130' href='#n130'>130</a>
<a id='n131' href='#n131'>131</a>
<a id='n132' href='#n132'>132</a>
<a id='n133' href='#n133'>133</a>
<a id='n134' href='#n134'>134</a>
<a id='n135' href='#n135'>135</a>
<a id='n136' href='#n136'>136</a>
<a id='n137' href='#n137'>137</a>
<a id='n138' href='#n138'>138</a>
<a id='n139' href='#n139'>139</a>
<a id='n140' href='#n140'>140</a>
<a id='n141' href='#n141'>141</a>
<a id='n142' href='#n142'>142</a>
<a id='n143' href='#n143'>143</a>
<a id='n144' href='#n144'>144</a>
<a id='n145' href='#n145'>145</a>
<a id='n146' href='#n146'>146</a>
<a id='n147' href='#n147'>147</a>
<a id='n148' href='#n148'>148</a>
<a id='n149' href='#n149'>149</a>
<a id='n150' href='#n150'>150</a>
<a id='n151' href='#n151'>151</a>
<a id='n152' href='#n152'>152</a>
<a id='n153' href='#n153'>153</a>
<a id='n154' href='#n154'>154</a>
<a id='n155' href='#n155'>155</a>
<a id='n156' href='#n156'>156</a>
<a id='n157' href='#n157'>157</a>
<a id='n158' href='#n158'>158</a>
<a id='n159' href='#n159'>159</a>
<a id='n160' href='#n160'>160</a>
<a id='n161' href='#n161'>161</a>
<a id='n162' href='#n162'>162</a>
<a id='n163' href='#n163'>163</a>
<a id='n164' href='#n164'>164</a>
<a id='n165' href='#n165'>165</a>
<a id='n166' href='#n166'>166</a>
<a id='n167' href='#n167'>167</a>
<a id='n168' href='#n168'>168</a>
<a id='n169' href='#n169'>169</a>
<a id='n170' href='#n170'>170</a>
<a id='n171' href='#n171'>171</a>
<a id='n172' href='#n172'>172</a>
<a id='n173' href='#n173'>173</a>
<a id='n174' href='#n174'>174</a>
<a id='n175' href='#n175'>175</a>
<a id='n176' href='#n176'>176</a>
<a id='n177' href='#n177'>177</a>
<a id='n178' href='#n178'>178</a>
<a id='n179' href='#n179'>179</a>
<a id='n180' href='#n180'>180</a>
<a id='n181' href='#n181'>181</a>
<a id='n182' href='#n182'>182</a>
<a id='n183' href='#n183'>183</a>
<a id='n184' href='#n184'>184</a>
<a id='n185' href='#n185'>185</a>
<a id='n186' href='#n186'>186</a>
<a id='n187' href='#n187'>187</a>
<a id='n188' href='#n188'>188</a>
<a id='n189' href='#n189'>189</a>
<a id='n190' href='#n190'>190</a>
<a id='n191' href='#n191'>191</a>
<a id='n192' href='#n192'>192</a>
<a id='n193' href='#n193'>193</a>
<a id='n194' href='#n194'>194</a>
<a id='n195' href='#n195'>195</a>
<a id='n196' href='#n196'>196</a>
<a id='n197' href='#n197'>197</a>
<a id='n198' href='#n198'>198</a>
<a id='n199' href='#n199'>199</a>
<a id='n200' href='#n200'>200</a>
<a id='n201' href='#n201'>201</a>
<a id='n202' href='#n202'>202</a>
<a id='n203' href='#n203'>203</a>
<a id='n204' href='#n204'>204</a>
<a id='n205' href='#n205'>205</a>
<a id='n206' href='#n206'>206</a>
<a id='n207' href='#n207'>207</a>
<a id='n208' href='#n208'>208</a>
<a id='n209' href='#n209'>209</a>
<a id='n210' href='#n210'>210</a>
<a id='n211' href='#n211'>211</a>
<a id='n212' href='#n212'>212</a>
<a id='n213' href='#n213'>213</a>
<a id='n214' href='#n214'>214</a>
<a id='n215' href='#n215'>215</a>
<a id='n216' href='#n216'>216</a>
<a id='n217' href='#n217'>217</a>
<a id='n218' href='#n218'>218</a>
<a id='n219' href='#n219'>219</a>
<a id='n220' href='#n220'>220</a>
<a id='n221' href='#n221'>221</a>
<a id='n222' href='#n222'>222</a>
<a id='n223' href='#n223'>223</a>
<a id='n224' href='#n224'>224</a>
<a id='n225' href='#n225'>225</a>
<a id='n226' href='#n226'>226</a>
<a id='n227' href='#n227'>227</a>
<a id='n228' href='#n228'>228</a>
<a id='n229' href='#n229'>229</a>
<a id='n230' href='#n230'>230</a>
<a id='n231' href='#n231'>231</a>
<a id='n232' href='#n232'>232</a>
<a id='n233' href='#n233'>233</a>
<a id='n234' href='#n234'>234</a>
<a id='n235' href='#n235'>235</a>
<a id='n236' href='#n236'>236</a>
<a id='n237' href='#n237'>237</a>
<a id='n238' href='#n238'>238</a>
<a id='n239' href='#n239'>239</a>
<a id='n240' href='#n240'>240</a>
<a id='n241' href='#n241'>241</a>
<a id='n242' href='#n242'>242</a>
<a id='n243' href='#n243'>243</a>
<a id='n244' href='#n244'>244</a>
<a id='n245' href='#n245'>245</a>
<a id='n246' href='#n246'>246</a>
<a id='n247' href='#n247'>247</a>
<a id='n248' href='#n248'>248</a>
<a id='n249' href='#n249'>249</a>
<a id='n250' href='#n250'>250</a>
<a id='n251' href='#n251'>251</a>
<a id='n252' href='#n252'>252</a>
<a id='n253' href='#n253'>253</a>
<a id='n254' href='#n254'>254</a>
<a id='n255' href='#n255'>255</a>
<a id='n256' href='#n256'>256</a>
<a id='n257' href='#n257'>257</a>
<a id='n258' href='#n258'>258</a>
<a id='n259' href='#n259'>259</a>
<a id='n260' href='#n260'>260</a>
<a id='n261' href='#n261'>261</a>
<a id='n262' href='#n262'>262</a>
<a id='n263' href='#n263'>263</a>
<a id='n264' href='#n264'>264</a>
<a id='n265' href='#n265'>265</a>
<a id='n266' href='#n266'>266</a>
<a id='n267' href='#n267'>267</a>
<a id='n268' href='#n268'>268</a>
<a id='n269' href='#n269'>269</a>
<a id='n270' href='#n270'>270</a>
<a id='n271' href='#n271'>271</a>
<a id='n272' href='#n272'>272</a>
<a id='n273' href='#n273'>273</a>
<a id='n274' href='#n274'>274</a>
<a id='n275' href='#n275'>275</a>
<a id='n276' href='#n276'>276</a>
<a id='n277' href='#n277'>277</a>
<a id='n278' href='#n278'>278</a>
<a id='n279' href='#n279'>279</a>
<a id='n280' href='#n280'>280</a>
<a id='n281' href='#n281'>281</a>
<a id='n282' href='#n282'>282</a>
<a id='n283' href='#n283'>283</a>
<a id='n284' href='#n284'>284</a>
<a id='n285' href='#n285'>285</a>
<a id='n286' href='#n286'>286</a>
<a id='n287' href='#n287'>287</a>
<a id='n288' href='#n288'>288</a>
<a id='n289' href='#n289'>289</a>
<a id='n290' href='#n290'>290</a>
<a id='n291' href='#n291'>291</a>
<a id='n292' href='#n292'>292</a>
<a id='n293' href='#n293'>293</a>
<a id='n294' href='#n294'>294</a>
<a id='n295' href='#n295'>295</a>
<a id='n296' href='#n296'>296</a>
<a id='n297' href='#n297'>297</a>
<a id='n298' href='#n298'>298</a>
<a id='n299' href='#n299'>299</a>
<a id='n300' href='#n300'>300</a>
<a id='n301' href='#n301'>301</a>
<a id='n302' href='#n302'>302</a>
<a id='n303' href='#n303'>303</a>
<a id='n304' href='#n304'>304</a>
<a id='n305' href='#n305'>305</a>
<a id='n306' href='#n306'>306</a>
<a id='n307' href='#n307'>307</a>
<a id='n308' href='#n308'>308</a>
<a id='n309' href='#n309'>309</a>
<a id='n310' href='#n310'>310</a>
<a id='n311' href='#n311'>311</a>
<a id='n312' href='#n312'>312</a>
<a id='n313' href='#n313'>313</a>
<a id='n314' href='#n314'>314</a>
<a id='n315' href='#n315'>315</a>
<a id='n316' href='#n316'>316</a>
<a id='n317' href='#n317'>317</a>
<a id='n318' href='#n318'>318</a>
<a id='n319' href='#n319'>319</a>
<a id='n320' href='#n320'>320</a>
<a id='n321' href='#n321'>321</a>
<a id='n322' href='#n322'>322</a>
<a id='n323' href='#n323'>323</a>
<a id='n324' href='#n324'>324</a>
<a id='n325' href='#n325'>325</a>
<a id='n326' href='#n326'>326</a>
<a id='n327' href='#n327'>327</a>
<a id='n328' href='#n328'>328</a>
<a id='n329' href='#n329'>329</a>
<a id='n330' href='#n330'>330</a>
<a id='n331' href='#n331'>331</a>
<a id='n332' href='#n332'>332</a>
<a id='n333' href='#n333'>333</a>
<a id='n334' href='#n334'>334</a>
<a id='n335' href='#n335'>335</a>
<a id='n336' href='#n336'>336</a>
<a id='n337' href='#n337'>337</a>
<a id='n338' href='#n338'>338</a>
<a id='n339' href='#n339'>339</a>
<a id='n340' href='#n340'>340</a>
<a id='n341' href='#n341'>341</a>
<a id='n342' href='#n342'>342</a>
<a id='n343' href='#n343'>343</a>
<a id='n344' href='#n344'>344</a>
<a id='n345' href='#n345'>345</a>
<a id='n346' href='#n346'>346</a>
<a id='n347' href='#n347'>347</a>
<a id='n348' href='#n348'>348</a>
<a id='n349' href='#n349'>349</a>
<a id='n350' href='#n350'>350</a>
<a id='n351' href='#n351'>351</a>
<a id='n352' href='#n352'>352</a>
<a id='n353' href='#n353'>353</a>
<a id='n354' href='#n354'>354</a>
<a id='n355' href='#n355'>355</a>
<a id='n356' href='#n356'>356</a>
<a id='n357' href='#n357'>357</a>
<a id='n358' href='#n358'>358</a>
<a id='n359' href='#n359'>359</a>
<a id='n360' href='#n360'>360</a>
<a id='n361' href='#n361'>361</a>
<a id='n362' href='#n362'>362</a>
<a id='n363' href='#n363'>363</a>
<a id='n364' href='#n364'>364</a>
<a id='n365' href='#n365'>365</a>
<a id='n366' href='#n366'>366</a>
<a id='n367' href='#n367'>367</a>
<a id='n368' href='#n368'>368</a>
<a id='n369' href='#n369'>369</a>
<a id='n370' href='#n370'>370</a>
<a id='n371' href='#n371'>371</a>
<a id='n372' href='#n372'>372</a>
<a id='n373' href='#n373'>373</a>
<a id='n374' href='#n374'>374</a>
<a id='n375' href='#n375'>375</a>
<a id='n376' href='#n376'>376</a>
<a id='n377' href='#n377'>377</a>
<a id='n378' href='#n378'>378</a>
<a id='n379' href='#n379'>379</a>
<a id='n380' href='#n380'>380</a>
<a id='n381' href='#n381'>381</a>
<a id='n382' href='#n382'>382</a>
<a id='n383' href='#n383'>383</a>
<a id='n384' href='#n384'>384</a>
<a id='n385' href='#n385'>385</a>
<a id='n386' href='#n386'>386</a>
<a id='n387' href='#n387'>387</a>
<a id='n388' href='#n388'>388</a>
<a id='n389' href='#n389'>389</a>
<a id='n390' href='#n390'>390</a>
<a id='n391' href='#n391'>391</a>
<a id='n392' href='#n392'>392</a>
<a id='n393' href='#n393'>393</a>
<a id='n394' href='#n394'>394</a>
<a id='n395' href='#n395'>395</a>
<a id='n396' href='#n396'>396</a>
<a id='n397' href='#n397'>397</a>
<a id='n398' href='#n398'>398</a>
<a id='n399' href='#n399'>399</a>
<a id='n400' href='#n400'>400</a>
<a id='n401' href='#n401'>401</a>
<a id='n402' href='#n402'>402</a>
<a id='n403' href='#n403'>403</a>
<a id='n404' href='#n404'>404</a>
<a id='n405' href='#n405'>405</a>
<a id='n406' href='#n406'>406</a>
<a id='n407' href='#n407'>407</a>
<a id='n408' href='#n408'>408</a>
<a id='n409' href='#n409'>409</a>
<a id='n410' href='#n410'>410</a>
<a id='n411' href='#n411'>411</a>
<a id='n412' href='#n412'>412</a>
<a id='n413' href='#n413'>413</a>
<a id='n414' href='#n414'>414</a>
<a id='n415' href='#n415'>415</a>
<a id='n416' href='#n416'>416</a>
<a id='n417' href='#n417'>417</a>
<a id='n418' href='#n418'>418</a>
<a id='n419' href='#n419'>419</a>
<a id='n420' href='#n420'>420</a>
<a id='n421' href='#n421'>421</a>
<a id='n422' href='#n422'>422</a>
<a id='n423' href='#n423'>423</a>
<a id='n424' href='#n424'>424</a>
<a id='n425' href='#n425'>425</a>
<a id='n426' href='#n426'>426</a>
<a id='n427' href='#n427'>427</a>
<a id='n428' href='#n428'>428</a>
<a id='n429' href='#n429'>429</a>
<a id='n430' href='#n430'>430</a>
<a id='n431' href='#n431'>431</a>
<a id='n432' href='#n432'>432</a>
<a id='n433' href='#n433'>433</a>
<a id='n434' href='#n434'>434</a>
<a id='n435' href='#n435'>435</a>
<a id='n436' href='#n436'>436</a>
<a id='n437' href='#n437'>437</a>
<a id='n438' href='#n438'>438</a>
<a id='n439' href='#n439'>439</a>
<a id='n440' href='#n440'>440</a>
<a id='n441' href='#n441'>441</a>
<a id='n442' href='#n442'>442</a>
<a id='n443' href='#n443'>443</a>
<a id='n444' href='#n444'>444</a>
<a id='n445' href='#n445'>445</a>
<a id='n446' href='#n446'>446</a>
<a id='n447' href='#n447'>447</a>
<a id='n448' href='#n448'>448</a>
<a id='n449' href='#n449'>449</a>
<a id='n450' href='#n450'>450</a>
<a id='n451' href='#n451'>451</a>
<a id='n452' href='#n452'>452</a>
<a id='n453' href='#n453'>453</a>
<a id='n454' href='#n454'>454</a>
<a id='n455' href='#n455'>455</a>
<a id='n456' href='#n456'>456</a>
<a id='n457' href='#n457'>457</a>
<a id='n458' href='#n458'>458</a>
<a id='n459' href='#n459'>459</a>
<a id='n460' href='#n460'>460</a>
<a id='n461' href='#n461'>461</a>
<a id='n462' href='#n462'>462</a>
<a id='n463' href='#n463'>463</a>
<a id='n464' href='#n464'>464</a>
<a id='n465' href='#n465'>465</a>
<a id='n466' href='#n466'>466</a>
<a id='n467' href='#n467'>467</a>
<a id='n468' href='#n468'>468</a>
<a id='n469' href='#n469'>469</a>
<a id='n470' href='#n470'>470</a>
<a id='n471' href='#n471'>471</a>
<a id='n472' href='#n472'>472</a>
<a id='n473' href='#n473'>473</a>
<a id='n474' href='#n474'>474</a>
<a id='n475' href='#n475'>475</a>
<a id='n476' href='#n476'>476</a>
<a id='n477' href='#n477'>477</a>
<a id='n478' href='#n478'>478</a>
<a id='n479' href='#n479'>479</a>
<a id='n480' href='#n480'>480</a>
<a id='n481' href='#n481'>481</a>
<a id='n482' href='#n482'>482</a>
<a id='n483' href='#n483'>483</a>
<a id='n484' href='#n484'>484</a>
<a id='n485' href='#n485'>485</a>
<a id='n486' href='#n486'>486</a>
<a id='n487' href='#n487'>487</a>
<a id='n488' href='#n488'>488</a>
<a id='n489' href='#n489'>489</a>
<a id='n490' href='#n490'>490</a>
<a id='n491' href='#n491'>491</a>
<a id='n492' href='#n492'>492</a>
<a id='n493' href='#n493'>493</a>
<a id='n494' href='#n494'>494</a>
<a id='n495' href='#n495'>495</a>
<a id='n496' href='#n496'>496</a>
<a id='n497' href='#n497'>497</a>
<a id='n498' href='#n498'>498</a>
<a id='n499' href='#n499'>499</a>
<a id='n500' href='#n500'>500</a>
<a id='n501' href='#n501'>501</a>
<a id='n502' href='#n502'>502</a>
<a id='n503' href='#n503'>503</a>
<a id='n504' href='#n504'>504</a>
<a id='n505' href='#n505'>505</a>
<a id='n506' href='#n506'>506</a>
<a id='n507' href='#n507'>507</a>
<a id='n508' href='#n508'>508</a>
<a id='n509' href='#n509'>509</a>
<a id='n510' href='#n510'>510</a>
<a id='n511' href='#n511'>511</a>
<a id='n512' href='#n512'>512</a>
<a id='n513' href='#n513'>513</a>
<a id='n514' href='#n514'>514</a>
<a id='n515' href='#n515'>515</a>
<a id='n516' href='#n516'>516</a>
<a id='n517' href='#n517'>517</a>
<a id='n518' href='#n518'>518</a>
<a id='n519' href='#n519'>519</a>
<a id='n520' href='#n520'>520</a>
<a id='n521' href='#n521'>521</a>
<a id='n522' href='#n522'>522</a>
<a id='n523' href='#n523'>523</a>
<a id='n524' href='#n524'>524</a>
<a id='n525' href='#n525'>525</a>
<a id='n526' href='#n526'>526</a>
<a id='n527' href='#n527'>527</a>
<a id='n528' href='#n528'>528</a>
<a id='n529' href='#n529'>529</a>
<a id='n530' href='#n530'>530</a>
<a id='n531' href='#n531'>531</a>
<a id='n532' href='#n532'>532</a>
<a id='n533' href='#n533'>533</a>
<a id='n534' href='#n534'>534</a>
<a id='n535' href='#n535'>535</a>
<a id='n536' href='#n536'>536</a>
<a id='n537' href='#n537'>537</a>
<a id='n538' href='#n538'>538</a>
<a id='n539' href='#n539'>539</a>
<a id='n540' href='#n540'>540</a>
<a id='n541' href='#n541'>541</a>
<a id='n542' href='#n542'>542</a>
<a id='n543' href='#n543'>543</a>
<a id='n544' href='#n544'>544</a>
<a id='n545' href='#n545'>545</a>
<a id='n546' href='#n546'>546</a>
<a id='n547' href='#n547'>547</a>
<a id='n548' href='#n548'>548</a>
<a id='n549' href='#n549'>549</a>
<a id='n550' href='#n550'>550</a>
<a id='n551' href='#n551'>551</a>
<a id='n552' href='#n552'>552</a>
<a id='n553' href='#n553'>553</a>
<a id='n554' href='#n554'>554</a>
<a id='n555' href='#n555'>555</a>
<a id='n556' href='#n556'>556</a>
<a id='n557' href='#n557'>557</a>
<a id='n558' href='#n558'>558</a>
<a id='n559' href='#n559'>559</a>
<a id='n560' href='#n560'>560</a>
<a id='n561' href='#n561'>561</a>
<a id='n562' href='#n562'>562</a>
<a id='n563' href='#n563'>563</a>
<a id='n564' href='#n564'>564</a>
<a id='n565' href='#n565'>565</a>
<a id='n566' href='#n566'>566</a>
<a id='n567' href='#n567'>567</a>
<a id='n568' href='#n568'>568</a>
<a id='n569' href='#n569'>569</a>
<a id='n570' href='#n570'>570</a>
<a id='n571' href='#n571'>571</a>
<a id='n572' href='#n572'>572</a>
<a id='n573' href='#n573'>573</a>
<a id='n574' href='#n574'>574</a>
<a id='n575' href='#n575'>575</a>
<a id='n576' href='#n576'>576</a>
<a id='n577' href='#n577'>577</a>
</pre></td>
<td class='lines'><pre><code><span class="hl com">/*</span>
<span class="hl com"> * Copyright 2005 Stephane Marchesin.</span>
<span class="hl com"> * All Rights Reserved.</span>
<span class="hl com"> *</span>
<span class="hl com"> * Permission is hereby granted, free of charge, to any person obtaining a</span>
<span class="hl com"> * copy of this software and associated documentation files (the &quot;Software&quot;),</span>
<span class="hl com"> * to deal in the Software without restriction, including without limitation</span>
<span class="hl com"> * the rights to use, copy, modify, merge, publish, distribute, sublicense,</span>
<span class="hl com"> * and/or sell copies of the Software, and to permit persons to whom the</span>
<span class="hl com"> * Software is furnished to do so, subject to the following conditions:</span>
<span class="hl com"> *</span>
<span class="hl com"> * The above copyright notice and this permission notice (including the next</span>
<span class="hl com"> * paragraph) shall be included in all copies or substantial portions of the</span>
<span class="hl com"> * Software.</span>
<span class="hl com"> *</span>
<span class="hl com"> * THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
<span class="hl com"> * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span>
<span class="hl com"> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL</span>
<span class="hl com"> * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR</span>
<span class="hl com"> * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,</span>
<span class="hl com"> * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR</span>
<span class="hl com"> * OTHER DEALINGS IN THE SOFTWARE.</span>
<span class="hl com"> */</span>

<span class="hl ppc">#ifndef __NOUVEAU_DRV_H__</span>
<span class="hl ppc">#define __NOUVEAU_DRV_H__</span>

<span class="hl ppc">#define DRIVER_AUTHOR</span>		<span class="hl pps">&quot;Stephane Marchesin&quot;</span><span class="hl ppc"></span>
<span class="hl ppc">#define DRIVER_EMAIL</span>		<span class="hl pps">&quot;dri-devel&#64;lists.sourceforge.net&quot;</span><span class="hl ppc"></span>

<span class="hl ppc">#define DRIVER_NAME</span>		<span class="hl pps">&quot;nouveau&quot;</span><span class="hl ppc"></span>
<span class="hl ppc">#define DRIVER_DESC</span>		<span class="hl pps">&quot;nVidia Riva/TNT/GeForce&quot;</span><span class="hl ppc"></span>
<span class="hl ppc">#define DRIVER_DATE</span>		<span class="hl pps">&quot;20060213&quot;</span><span class="hl ppc"></span>

<span class="hl ppc">#define DRIVER_MAJOR		0</span>
<span class="hl ppc">#define DRIVER_MINOR		0</span>
<span class="hl ppc">#define DRIVER_PATCHLEVEL	10</span>

<span class="hl ppc">#define NOUVEAU_FAMILY   0x0000FFFF</span>
<span class="hl ppc">#define NOUVEAU_FLAGS    0xFFFF0000</span>

<span class="hl ppc">#include</span> <span class="hl pps">&quot;nouveau_drm.h&quot;</span><span class="hl ppc"></span>
<span class="hl ppc">#include</span> <span class="hl pps">&quot;nouveau_reg.h&quot;</span><span class="hl ppc"></span>

<span class="hl kwb">struct</span> mem_block <span class="hl opt">{</span>
	<span class="hl kwb">struct</span> mem_block <span class="hl opt">*</span>next<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> mem_block <span class="hl opt">*</span>prev<span class="hl opt">;</span>
	<span class="hl kwb">uint64_t</span> start<span class="hl opt">;</span>
	<span class="hl kwb">uint64_t</span> size<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> drm_file <span class="hl opt">*</span>file_priv<span class="hl opt">;</span> <span class="hl com">/* NULL: free, -1: heap, other: real files */</span>
	<span class="hl kwb">int</span> flags<span class="hl opt">;</span>
	drm_local_map_t <span class="hl opt">*</span>map<span class="hl opt">;</span>
	drm_handle_t map_handle<span class="hl opt">;</span>
<span class="hl opt">};</span>

<span class="hl kwb">enum</span> nouveau_flags <span class="hl opt">{</span>
	NV_NFORCE   <span class="hl opt">=</span><span class="hl num">0x10000000</span><span class="hl opt">,</span>
	NV_NFORCE2  <span class="hl opt">=</span><span class="hl num">0x20000000</span>
<span class="hl opt">};</span>

<span class="hl ppc">#define NVOBJ_ENGINE_SW		0</span>
<span class="hl ppc">#define NVOBJ_ENGINE_GR  	1</span>
<span class="hl ppc">#define NVOBJ_ENGINE_INT	0xdeadbeef</span>

<span class="hl ppc">#define NVOBJ_FLAG_ALLOW_NO_REFS	(1 &lt;&lt; 0)</span>
<span class="hl ppc">#define NVOBJ_FLAG_ZERO_ALLOC		(1 &lt;&lt; 1)</span>
<span class="hl ppc">#define NVOBJ_FLAG_ZERO_FREE		(1 &lt;&lt; 2)</span>
<span class="hl ppc">#define NVOBJ_FLAG_FAKE			(1 &lt;&lt; 3)</span>
<span class="hl kwb">struct</span> nouveau_gpuobj <span class="hl opt">{</span>
	<span class="hl kwb">struct</span> list_head list<span class="hl opt">;</span>

	<span class="hl kwb">int</span> im_channel<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> mem_block <span class="hl opt">*</span>im_pramin<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> mem_block <span class="hl opt">*</span>im_backing<span class="hl opt">;</span>
	<span class="hl kwb">int</span> im_bound<span class="hl opt">;</span>

	<span class="hl kwb">uint32_t</span> flags<span class="hl opt">;</span>
	<span class="hl kwb">int</span> refcount<span class="hl opt">;</span>

	<span class="hl kwb">uint32_t</span> engine<span class="hl opt">;</span>
	<span class="hl kwb">uint32_t</span> <span class="hl kwc">class</span><span class="hl opt">;</span>

	<span class="hl kwb">void</span> <span class="hl opt">(*</span>dtor<span class="hl opt">)(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*,</span> <span class="hl kwb">struct</span> nouveau_gpuobj <span class="hl opt">*);</span>
	<span class="hl kwb">void</span> <span class="hl opt">*</span>priv<span class="hl opt">;</span>
<span class="hl opt">};</span>

<span class="hl kwb">struct</span> nouveau_gpuobj_ref <span class="hl opt">{</span>
	<span class="hl kwb">struct</span> list_head list<span class="hl opt">;</span>

	<span class="hl kwb">struct</span> nouveau_gpuobj <span class="hl opt">*</span>gpuobj<span class="hl opt">;</span>
	<span class="hl kwb">uint32_t</span> instance<span class="hl opt">;</span>

	<span class="hl kwb">int</span> channel<span class="hl opt">;</span>
	<span class="hl kwb">int</span> handle<span class="hl opt">;</span>
<span class="hl opt">};</span>

<span class="hl kwb">struct</span> nouveau_channel
<span class="hl opt">{</span>
	<span class="hl kwb">struct</span> drm_device <span class="hl opt">*</span>dev<span class="hl opt">;</span>
	<span class="hl kwb">int</span> id<span class="hl opt">;</span>

	<span class="hl com">/* owner of this fifo */</span>
	<span class="hl kwb">struct</span> drm_file <span class="hl opt">*</span>file_priv<span class="hl opt">;</span>
	<span class="hl com">/* mapping of the fifo itself */</span>
	drm_local_map_t <span class="hl opt">*</span>map<span class="hl opt">;</span>
	<span class="hl com">/* mapping of the regs controling the fifo */</span>
	drm_local_map_t <span class="hl opt">*</span>regs<span class="hl opt">;</span>

	<span class="hl com">/* DMA push buffer */</span>
	<span class="hl kwb">struct</span> nouveau_gpuobj_ref <span class="hl opt">*</span>pushbuf<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> mem_block          <span class="hl opt">*</span>pushbuf_mem<span class="hl opt">;</span>
	<span class="hl kwb">uint32_t</span>                   pushbuf_base<span class="hl opt">;</span>

	<span class="hl com">/* Notifier memory */</span>
	<span class="hl kwb">struct</span> mem_block <span class="hl opt">*</span>notifier_block<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> mem_block <span class="hl opt">*</span>notifier_heap<span class="hl opt">;</span>
	drm_local_map_t  <span class="hl opt">*</span>notifier_map<span class="hl opt">;</span>

	<span class="hl com">/* PFIFO context */</span>
	<span class="hl kwb">struct</span> nouveau_gpuobj_ref <span class="hl opt">*</span>ramfc<span class="hl opt">;</span>

	<span class="hl com">/* PGRAPH context */</span>
	<span class="hl com">/* XXX may be merge 2 pointers as private data ??? */</span>
	<span class="hl kwb">struct</span> nouveau_gpuobj_ref <span class="hl opt">*</span>ramin_grctx<span class="hl opt">;</span>
	<span class="hl kwb">void</span> <span class="hl opt">*</span>pgraph_ctx<span class="hl opt">;</span>

	<span class="hl com">/* NV50 VM */</span>
	<span class="hl kwb">struct</span> nouveau_gpuobj     <span class="hl opt">*</span>vm_pd<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> nouveau_gpuobj_ref <span class="hl opt">*</span>vm_gart_pt<span class="hl opt">;</span>

	<span class="hl com">/* Objects */</span>
	<span class="hl kwb">struct</span> nouveau_gpuobj_ref <span class="hl opt">*</span>ramin<span class="hl opt">;</span> <span class="hl com">/* Private instmem */</span>
	<span class="hl kwb">struct</span> mem_block          <span class="hl opt">*</span>ramin_heap<span class="hl opt">;</span> <span class="hl com">/* Private PRAMIN heap */</span>
	<span class="hl kwb">struct</span> nouveau_gpuobj_ref <span class="hl opt">*</span>ramht<span class="hl opt">;</span> <span class="hl com">/* Hash table */</span>
	<span class="hl kwb">struct</span> list_head           ramht_refs<span class="hl opt">;</span> <span class="hl com">/* Objects referenced by RAMHT */</span>
<span class="hl opt">};</span>

<span class="hl kwb">struct</span> nouveau_drm_channel <span class="hl opt">{</span>
	<span class="hl kwb">struct</span> nouveau_channel <span class="hl opt">*</span>chan<span class="hl opt">;</span>

	<span class="hl com">/* DMA state */</span>
	<span class="hl kwb">int</span> max<span class="hl opt">,</span> put<span class="hl opt">,</span> cur<span class="hl opt">,</span> free<span class="hl opt">;</span>
	<span class="hl kwb">int</span> push_free<span class="hl opt">;</span>
	<span class="hl kwc">volatile</span> <span class="hl kwb">uint32_t</span> <span class="hl opt">*</span>pushbuf<span class="hl opt">;</span>

	<span class="hl com">/* Notifiers */</span>
	<span class="hl kwb">uint32_t</span> notify0_offset<span class="hl opt">;</span>

	<span class="hl com">/* Buffer moves */</span>
	<span class="hl kwb">uint32_t</span> m2mf_dma_source<span class="hl opt">;</span>
	<span class="hl kwb">uint32_t</span> m2mf_dma_destin<span class="hl opt">;</span>
<span class="hl opt">};</span>

<span class="hl kwb">struct</span> nouveau_config <span class="hl opt">{</span>
	<span class="hl kwb">struct</span> <span class="hl opt">{</span>
		<span class="hl kwb">int</span> location<span class="hl opt">;</span>
		<span class="hl kwb">int</span> size<span class="hl opt">;</span>
	<span class="hl opt">}</span> cmdbuf<span class="hl opt">;</span>
<span class="hl opt">};</span>

<span class="hl kwb">struct</span> nouveau_instmem_engine <span class="hl opt">{</span>
	<span class="hl kwb">void</span>	<span class="hl opt">*</span>priv<span class="hl opt">;</span>

	<span class="hl kwb">int</span>	<span class="hl opt">(*</span>init<span class="hl opt">)(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*</span>dev<span class="hl opt">);</span>
	<span class="hl kwb">void</span>	<span class="hl opt">(*</span>takedown<span class="hl opt">)(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*</span>dev<span class="hl opt">);</span>

	<span class="hl kwb">int</span>	<span class="hl opt">(*</span>populate<span class="hl opt">)(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*,</span> <span class="hl kwb">struct</span> nouveau_gpuobj <span class="hl opt">*,</span>
			    <span class="hl kwb">uint32_t</span> <span class="hl opt">*</span>size<span class="hl opt">);</span>
	<span class="hl kwb">void</span>	<span class="hl opt">(*</span>clear<span class="hl opt">)(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*,</span> <span class="hl kwb">struct</span> nouveau_gpuobj <span class="hl opt">*);</span>
	<span class="hl kwb">int</span>	<span class="hl opt">(*</span>bind<span class="hl opt">)(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*,</span> <span class="hl kwb">struct</span> nouveau_gpuobj <span class="hl opt">*);</span>
	<span class="hl kwb">int</span>	<span class="hl opt">(*</span>unbind<span class="hl opt">)(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*,</span> <span class="hl kwb">struct</span> nouveau_gpuobj <span class="hl opt">*);</span>
<span class="hl opt">};</span>

<span class="hl kwb">struct</span> nouveau_mc_engine <span class="hl opt">{</span>
	<span class="hl kwb">int</span>  <span class="hl opt">(*</span>init<span class="hl opt">)(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*</span>dev<span class="hl opt">);</span>
	<span class="hl kwb">void</span> <span class="hl opt">(*</span>takedown<span class="hl opt">)(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*</span>dev<span class="hl opt">);</span>
<span class="hl opt">};</span>

<span class="hl kwb">struct</span> nouveau_timer_engine <span class="hl opt">{</span>
	<span class="hl kwb">int</span>      <span class="hl opt">(*</span>init<span class="hl opt">)(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*</span>dev<span class="hl opt">);</span>
	<span class="hl kwb">void</span>     <span class="hl opt">(*</span>takedown<span class="hl opt">)(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*</span>dev<span class="hl opt">);</span>
	<span class="hl kwb">uint64_t</span> <span class="hl opt">(*</span>read<span class="hl opt">)(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*</span>dev<span class="hl opt">);</span>
<span class="hl opt">};</span>

<span class="hl kwb">struct</span> nouveau_fb_engine <span class="hl opt">{</span>
	<span class="hl kwb">int</span>  <span class="hl opt">(*</span>init<span class="hl opt">)(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*</span>dev<span class="hl opt">);</span>
	<span class="hl kwb">void</span> <span class="hl opt">(*</span>takedown<span class="hl opt">)(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*</span>dev<span class="hl opt">);</span>
<span class="hl opt">};</span>

<span class="hl kwb">struct</span> nouveau_fifo_engine <span class="hl opt">{</span>
	<span class="hl kwb">void</span> <span class="hl opt">*</span>priv<span class="hl opt">;</span>

	<span class="hl kwb">int</span>  <span class="hl opt">(*</span>init<span class="hl opt">)(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*);</span>
	<span class="hl kwb">void</span> <span class="hl opt">(*</span>takedown<span class="hl opt">)(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*);</span>

	<span class="hl kwb">int</span>  <span class="hl opt">(*</span>create_context<span class="hl opt">)(</span><span class="hl kwb">struct</span> nouveau_channel <span class="hl opt">*);</span>
	<span class="hl kwb">void</span> <span class="hl opt">(*</span>destroy_context<span class="hl opt">)(</span><span class="hl kwb">struct</span> nouveau_channel <span class="hl opt">*);</span>
	<span class="hl kwb">int</span>  <span class="hl opt">(*</span>load_context<span class="hl opt">)(</span><span class="hl kwb">struct</span> nouveau_channel <span class="hl opt">*);</span>
	<span class="hl kwb">int</span>  <span class="hl opt">(*</span>save_context<span class="hl opt">)(</span><span class="hl kwb">struct</span> nouveau_channel <span class="hl opt">*);</span>
<span class="hl opt">};</span>

<span class="hl kwb">struct</span> nouveau_pgraph_engine <span class="hl opt">{</span>
	<span class="hl kwb">int</span>  <span class="hl opt">(*</span>init<span class="hl opt">)(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*);</span>
	<span class="hl kwb">void</span> <span class="hl opt">(*</span>takedown<span class="hl opt">)(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*);</span>

	<span class="hl kwb">int</span>  <span class="hl opt">(*</span>create_context<span class="hl opt">)(</span><span class="hl kwb">struct</span> nouveau_channel <span class="hl opt">*);</span>
	<span class="hl kwb">void</span> <span class="hl opt">(*</span>destroy_context<span class="hl opt">)(</span><span class="hl kwb">struct</span> nouveau_channel <span class="hl opt">*);</span>
	<span class="hl kwb">int</span>  <span class="hl opt">(*</span>load_context<span class="hl opt">)(</span><span class="hl kwb">struct</span> nouveau_channel <span class="hl opt">*);</span>
	<span class="hl kwb">int</span>  <span class="hl opt">(*</span>save_context<span class="hl opt">)(</span><span class="hl kwb">struct</span> nouveau_channel <span class="hl opt">*);</span>
<span class="hl opt">};</span>

<span class="hl kwb">struct</span> nouveau_engine <span class="hl opt">{</span>
	<span class="hl kwb">struct</span> nouveau_instmem_engine instmem<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> nouveau_mc_engine      mc<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> nouveau_timer_engine   timer<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> nouveau_fb_engine      fb<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> nouveau_pgraph_engine  graph<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> nouveau_fifo_engine    fifo<span class="hl opt">;</span>
<span class="hl opt">};</span>

<span class="hl kwb">struct</span> drm_nouveau_private <span class="hl opt">{</span>
	<span class="hl kwb">enum</span> <span class="hl opt">{</span>
		NOUVEAU_CARD_INIT_DOWN<span class="hl opt">,</span>
		NOUVEAU_CARD_INIT_DONE<span class="hl opt">,</span>
		NOUVEAU_CARD_INIT_FAILED
	<span class="hl opt">}</span> init_state<span class="hl opt">;</span>

	<span class="hl com">/* the card type, takes NV_* as values */</span>
	<span class="hl kwb">int</span> card_type<span class="hl opt">;</span>
	<span class="hl com">/* exact chipset, derived from NV_PMC_BOOT_0 */</span>
	<span class="hl kwb">int</span> chipset<span class="hl opt">;</span>
	<span class="hl kwb">int</span> flags<span class="hl opt">;</span>

	drm_local_map_t <span class="hl opt">*</span>mmio<span class="hl opt">;</span>
	drm_local_map_t <span class="hl opt">*</span>fb<span class="hl opt">;</span>
	drm_local_map_t <span class="hl opt">*</span>ramin<span class="hl opt">;</span> <span class="hl com">/* NV40 onwards */</span>

	<span class="hl kwb">int</span> fifo_alloc_count<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> nouveau_channel <span class="hl opt">*</span>fifos<span class="hl opt">[</span>NV_MAX_FIFO_NUMBER<span class="hl opt">];</span>

	<span class="hl kwb">struct</span> nouveau_engine Engine<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> nouveau_drm_channel channel<span class="hl opt">;</span>

	<span class="hl com">/* RAMIN configuration, RAMFC, RAMHT and RAMRO offsets */</span>
	<span class="hl kwb">struct</span> nouveau_gpuobj <span class="hl opt">*</span>ramht<span class="hl opt">;</span>
	<span class="hl kwb">uint32_t</span> ramin_rsvd_vram<span class="hl opt">;</span>
	<span class="hl kwb">uint32_t</span> ramht_offset<span class="hl opt">;</span>
	<span class="hl kwb">uint32_t</span> ramht_size<span class="hl opt">;</span>
	<span class="hl kwb">uint32_t</span> ramht_bits<span class="hl opt">;</span>
	<span class="hl kwb">uint32_t</span> ramfc_offset<span class="hl opt">;</span>
	<span class="hl kwb">uint32_t</span> ramfc_size<span class="hl opt">;</span>
	<span class="hl kwb">uint32_t</span> ramro_offset<span class="hl opt">;</span>
	<span class="hl kwb">uint32_t</span> ramro_size<span class="hl opt">;</span>

	<span class="hl com">/* base physical adresses */</span>
	<span class="hl kwb">uint64_t</span> fb_phys<span class="hl opt">;</span>
	<span class="hl kwb">uint64_t</span> fb_available_size<span class="hl opt">;</span>

	<span class="hl kwb">struct</span> <span class="hl opt">{</span>
		<span class="hl kwb">enum</span> <span class="hl opt">{</span>
			NOUVEAU_GART_NONE <span class="hl opt">=</span> <span class="hl num">0</span><span class="hl opt">,</span>
			NOUVEAU_GART_AGP<span class="hl opt">,</span>
			NOUVEAU_GART_SGDMA
		<span class="hl opt">}</span> type<span class="hl opt">;</span>
		<span class="hl kwb">uint64_t</span> aper_base<span class="hl opt">;</span>
		<span class="hl kwb">uint64_t</span> aper_size<span class="hl opt">;</span>

		<span class="hl kwb">struct</span> nouveau_gpuobj <span class="hl opt">*</span>sg_ctxdma<span class="hl opt">;</span>
		<span class="hl kwb">struct</span> page <span class="hl opt">*</span>sg_dummy_page<span class="hl opt">;</span>
		dma_addr_t sg_dummy_bus<span class="hl opt">;</span>

		<span class="hl com">/* nottm hack */</span>
		<span class="hl kwb">struct</span> drm_ttm_backend <span class="hl opt">*</span>sg_be<span class="hl opt">;</span>
		<span class="hl kwb">unsigned long</span> sg_handle<span class="hl opt">;</span>
	<span class="hl opt">}</span> gart_info<span class="hl opt">;</span>

	<span class="hl com">/* the mtrr covering the FB */</span>
	<span class="hl kwb">int</span> fb_mtrr<span class="hl opt">;</span>

	<span class="hl kwb">struct</span> mem_block <span class="hl opt">*</span>agp_heap<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> mem_block <span class="hl opt">*</span>fb_heap<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> mem_block <span class="hl opt">*</span>fb_nomap_heap<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> mem_block <span class="hl opt">*</span>ramin_heap<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> mem_block <span class="hl opt">*</span>pci_heap<span class="hl opt">;</span>

        <span class="hl com">/* context table pointed to be NV_PGRAPH_CHANNEL_CTX_TABLE (0x400780) */</span>
        <span class="hl kwb">uint32_t</span> ctx_table_size<span class="hl opt">;</span>
	<span class="hl kwb">struct</span> nouveau_gpuobj_ref <span class="hl opt">*</span>ctx_table<span class="hl opt">;</span>

	<span class="hl kwb">struct</span> nouveau_config config<span class="hl opt">;</span>

	<span class="hl kwb">struct</span> list_head gpuobj_list<span class="hl opt">;</span>
<span class="hl opt">};</span>

<span class="hl ppc">#define NOUVEAU_CHECK_INITIALISED_WITH_RETURN do {         \</span>
<span class="hl ppc">	struct drm_nouveau_private *nv = dev-&gt;dev_private; \</span>
<span class="hl ppc">	if (nv-&gt;init_state != NOUVEAU_CARD_INIT_DONE) {    \</span>
<span class="hl ppc">		DRM_ERROR(</span><span class="hl pps">&quot;called without init</span><span class="hl esc">\n</span><span class="hl pps">&quot;</span><span class="hl ppc">);        \</span>
<span class="hl ppc">		return -EINVAL;                            \</span>
<span class="hl ppc">	}                                                  \</span>
<span class="hl ppc">} while(0)</span>

<span class="hl ppc">#define NOUVEAU_GET_USER_CHANNEL_WITH_RETURN(id,cl,ch) do {  \</span>
<span class="hl ppc">	struct drm_nouveau_private *nv = dev-&gt;dev_private;   \</span>
<span class="hl ppc">	if (!nouveau_fifo_owner(dev, (cl), (id))) {          \</span>
<span class="hl ppc">		DRM_ERROR(</span><span class="hl pps">&quot;pid %d doesn&apos;t own channel %d</span><span class="hl esc">\n</span><span class="hl pps">&quot;</span><span class="hl ppc">, \</span>
<span class="hl ppc">			  DRM_CURRENTPID, (id));             \</span>
<span class="hl ppc">		return -EPERM;                               \</span>
<span class="hl ppc">	}                                                    \</span>
<span class="hl ppc">	(ch) = nv-&gt;fifos[(id)];                              \</span>
<span class="hl ppc">} while(0)</span>

<span class="hl com">/* nouveau_state.c */</span>
<span class="hl kwc">extern</span> <span class="hl kwb">void</span> <span class="hl kwd">nouveau_preclose</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*</span>dev<span class="hl opt">,</span> <span class="hl kwb">struct</span> drm_file <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_load</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*,</span> <span class="hl kwb">unsigned long</span> flags<span class="hl opt">);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_firstopen</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">void</span> <span class="hl kwd">nouveau_lastclose</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_unload</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_ioctl_getparam</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*,</span> <span class="hl kwb">void</span> <span class="hl opt">*</span>data<span class="hl opt">,</span>
				   <span class="hl kwb">struct</span> drm_file <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_ioctl_setparam</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*,</span> <span class="hl kwb">void</span> <span class="hl opt">*</span>data<span class="hl opt">,</span>
				   <span class="hl kwb">struct</span> drm_file <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">void</span> <span class="hl kwd">nouveau_wait_for_idle</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_card_init</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_ioctl_card_init</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*,</span> <span class="hl kwb">void</span> <span class="hl opt">*</span>data<span class="hl opt">,</span>
				    <span class="hl kwb">struct</span> drm_file <span class="hl opt">*);</span>

<span class="hl com">/* nouveau_mem.c */</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_mem_init_heap</span><span class="hl opt">(</span><span class="hl kwb">struct</span> mem_block <span class="hl opt">**,</span> <span class="hl kwb">uint64_t</span> start<span class="hl opt">,</span>
				 <span class="hl kwb">uint64_t</span> size<span class="hl opt">);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">struct</span> mem_block <span class="hl opt">*</span><span class="hl kwd">nouveau_mem_alloc_block</span><span class="hl opt">(</span><span class="hl kwb">struct</span> mem_block <span class="hl opt">*,</span>
						 <span class="hl kwb">uint64_t</span> size<span class="hl opt">,</span> <span class="hl kwb">int</span> align2<span class="hl opt">,</span>
						 <span class="hl kwb">struct</span> drm_file <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">void</span> <span class="hl kwd">nouveau_mem_takedown</span><span class="hl opt">(</span><span class="hl kwb">struct</span> mem_block <span class="hl opt">**</span>heap<span class="hl opt">);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">void</span> <span class="hl kwd">nouveau_mem_free_block</span><span class="hl opt">(</span><span class="hl kwb">struct</span> mem_block <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">uint64_t</span> <span class="hl kwd">nouveau_mem_fb_amount</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">void</span> <span class="hl kwd">nouveau_mem_release</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_file <span class="hl opt">*,</span> <span class="hl kwb">struct</span> mem_block <span class="hl opt">*</span>heap<span class="hl opt">);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_ioctl_mem_alloc</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*,</span> <span class="hl kwb">void</span> <span class="hl opt">*</span>data<span class="hl opt">,</span>
				    <span class="hl kwb">struct</span> drm_file <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_ioctl_mem_free</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*,</span> <span class="hl kwb">void</span> <span class="hl opt">*</span>data<span class="hl opt">,</span>
				   <span class="hl kwb">struct</span> drm_file <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">struct</span> mem_block<span class="hl opt">*</span> <span class="hl kwd">nouveau_mem_alloc</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*,</span>
					   <span class="hl kwb">int</span> alignment<span class="hl opt">,</span> <span class="hl kwb">uint64_t</span> size<span class="hl opt">,</span>
					   <span class="hl kwb">int</span> flags<span class="hl opt">,</span> <span class="hl kwb">struct</span> drm_file <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">void</span> <span class="hl kwd">nouveau_mem_free</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*</span>dev<span class="hl opt">,</span> <span class="hl kwb">struct</span> mem_block<span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_mem_init</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">void</span> <span class="hl kwd">nouveau_mem_close</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*);</span>

<span class="hl com">/* nouveau_notifier.c */</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_notifier_init_channel</span><span class="hl opt">(</span><span class="hl kwb">struct</span> nouveau_channel <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">void</span> <span class="hl kwd">nouveau_notifier_takedown_channel</span><span class="hl opt">(</span><span class="hl kwb">struct</span> nouveau_channel <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_notifier_alloc</span><span class="hl opt">(</span><span class="hl kwb">struct</span> nouveau_channel <span class="hl opt">*,</span> <span class="hl kwb">uint32_t</span> handle<span class="hl opt">,</span>
				   <span class="hl kwb">int</span> cout<span class="hl opt">,</span> <span class="hl kwb">uint32_t</span> <span class="hl opt">*</span>offset<span class="hl opt">);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_ioctl_notifier_alloc</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*,</span> <span class="hl kwb">void</span> <span class="hl opt">*</span>data<span class="hl opt">,</span>
					 <span class="hl kwb">struct</span> drm_file <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_ioctl_notifier_free</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*,</span> <span class="hl kwb">void</span> <span class="hl opt">*</span>data<span class="hl opt">,</span>
					<span class="hl kwb">struct</span> drm_file <span class="hl opt">*);</span>

<span class="hl com">/* nouveau_fifo.c */</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_fifo_init</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_fifo_number</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_fifo_ctx_size</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">void</span> <span class="hl kwd">nouveau_fifo_cleanup</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*,</span> <span class="hl kwb">struct</span> drm_file <span class="hl opt">*);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_fifo_owner</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*,</span> <span class="hl kwb">struct</span> drm_file <span class="hl opt">*,</span>
			       <span class="hl kwb">int</span> channel<span class="hl opt">);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_fifo_alloc</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*</span>dev<span class="hl opt">,</span>
			       <span class="hl kwb">struct</span> nouveau_channel <span class="hl opt">**</span>chan<span class="hl opt">,</span>
			       <span class="hl kwb">struct</span> drm_file <span class="hl opt">*</span>file_priv<span class="hl opt">,</span>
			       <span class="hl kwb">struct</span> mem_block <span class="hl opt">*</span>pushbuf<span class="hl opt">,</span>
			       <span class="hl kwb">uint32_t</span> fb_ctxdma<span class="hl opt">,</span> <span class="hl kwb">uint32_t</span> tt_ctxdma<span class="hl opt">);</span>
<span class="hl kwc">extern</span> <span class="hl kwb">void</span> <span class="hl kwd">nouveau_fifo_free</span><span class="hl opt">(</span><span class="hl kwb">struct</span> nouveau_channel <span class="hl opt">*);</span>

<span class="hl com">/* nouveau_object.c */</span>
<span class="hl kwc">extern</span> <span class="hl kwb">int</span>  <span class="hl kwd">nouveau_gpuobj_early_init</span><span class="hl opt">(</span><span class="hl kwb">struct</span> drm_device <span class="hl opt">*);