memcpy.io - collaborahttps://memcpy.io/2018-08-24T12:32:00+02:00git reset upstream2018-08-24T12:32:00+02:002018-08-24T12:32:00+02:00Robert Fosstag:memcpy.io,2018-08-24:/git-reset-upstream.html<div class="highlight"><pre><span></span><code><span class="n">robertfoss</span><span class="p">@</span><span class="n">xps9570</span><span class="w"> </span><span class="o">~/</span><span class="n">work</span><span class="o">/</span><span class="n">libdrm</span><span class="w"> </span><span class="n">$</span><span class="w"> </span><span class="n">git</span><span class="w"> </span><span class="n">ru</span>
<span class="nl">remote</span><span class="p">:</span><span class="w"> </span><span class="n">Counting</span><span class="w"> </span><span class="n">objects</span><span class="o">:</span><span class="w"> </span><span class="mi">234</span><span class="p">,</span><span class="w"> </span><span class="n">done</span><span class="p">.</span>
<span class="nl">remote</span><span class="p">:</span><span class="w"> </span><span class="n">Compressing</span><span class="w"> </span><span class="n">objects</span><span class="o">:</span><span class="w"> </span><span class="mi">100</span><span class="o">%</span><span class="w"> </span><span class="p">(</span><span class="mi">233</span><span class="o">/</span><span class="mi">233</span><span class="p">),</span><span class="w"> </span><span class="n">done</span><span class="p">.</span>
<span class="nl">remote</span><span class="p">:</span><span class="w"> </span><span class="n">Total</span><span class="w"> </span><span class="mi">234</span><span class="w"> </span><span class="p">(</span><span class="n">delta</span><span class="w"> </span><span class="mi">177</span><span class="p">),</span><span class="w"> </span><span class="n">reused</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">(</span><span class="n">delta</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
<span class="n">Receiving</span><span class="w"> </span><span class="n">objects</span><span class="o">:</span><span class="w"> </span><span class="mi">100</span><span class="o">%</span><span class="w"> </span><span class="p">(</span><span class="mi">234</span><span class="o">/</span><span class="mi">234</span><span class="p">),</span><span class="w"> </span><span class="mf">53.20</span><span class="w"> </span><span class="n">KiB</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">939.00</span><span class="w"> </span><span class="n">KiB</span><span class="o">/</span><span class="n">s</span><span class="p">,</span><span class="w"> </span><span class="n">done</span><span class="p">.</span>
<span class="n">Resolving</span><span class="w"> </span><span class="n">deltas</span><span class="o">:</span><span class="w"> </span><span class="mi">100</span><span class="o">%</span><span class="w"> </span><span class="p">(</span><span class="mi">177</span><span class="o">/</span><span class="mi">177</span><span class="p">),</span><span class="w"> </span><span class="n">completed</span><span class="w"> </span><span class="n">with</span><span class="w"> </span><span class="mi">36</span><span class="w"> </span><span class="n">local</span><span class="w"> </span><span class="n">objects</span><span class="p">.</span>
<span class="n">From</span><span class="w"> </span><span class="n">git</span><span class="o">:</span><span class="c1">//anongit.freedesktop.org/mesa/drm</span>
<span class="w"> </span><span class="n">cb592ac8166e</span><span class="p">..</span><span class="n">bcb9d976cd91</span><span class="w"> </span><span class="n">master</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="n">upstream</span><span class="o">/</span><span class="n">master</span>
<span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="p">[</span><span class="n">new</span><span class="w"> </span><span class="n">tag</span><span class="p">]</span><span class="w"> </span><span class="n">libdrm</span><span class="mf">-2.4.93</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="n">libdrm</span><span class="mf">-2.4.93</span>
<span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="p">[</span><span class="n">new</span><span class="w"> </span><span class="n">tag</span><span class="p">]</span><span class="w"> </span><span class="n">libdrm</span><span class="mf">-2.4.94</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="n">libdrm</span><span class="mf">-2.4.94</span>
</code></pre></div>
<p>The idea here is that we by issuing a single short command can fetch the
latest master branch from the upstream repository of the codebase we're
working on and set our local master branch to point to the most recent
upstream/master one …</p><div class="highlight"><pre><span></span><code><span class="n">robertfoss</span><span class="p">@</span><span class="n">xps9570</span><span class="w"> </span><span class="o">~/</span><span class="n">work</span><span class="o">/</span><span class="n">libdrm</span><span class="w"> </span><span class="n">$</span><span class="w"> </span><span class="n">git</span><span class="w"> </span><span class="n">ru</span>
<span class="nl">remote</span><span class="p">:</span><span class="w"> </span><span class="n">Counting</span><span class="w"> </span><span class="n">objects</span><span class="o">:</span><span class="w"> </span><span class="mi">234</span><span class="p">,</span><span class="w"> </span><span class="n">done</span><span class="p">.</span>
<span class="nl">remote</span><span class="p">:</span><span class="w"> </span><span class="n">Compressing</span><span class="w"> </span><span class="n">objects</span><span class="o">:</span><span class="w"> </span><span class="mi">100</span><span class="o">%</span><span class="w"> </span><span class="p">(</span><span class="mi">233</span><span class="o">/</span><span class="mi">233</span><span class="p">),</span><span class="w"> </span><span class="n">done</span><span class="p">.</span>
<span class="nl">remote</span><span class="p">:</span><span class="w"> </span><span class="n">Total</span><span class="w"> </span><span class="mi">234</span><span class="w"> </span><span class="p">(</span><span class="n">delta</span><span class="w"> </span><span class="mi">177</span><span class="p">),</span><span class="w"> </span><span class="n">reused</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">(</span><span class="n">delta</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
<span class="n">Receiving</span><span class="w"> </span><span class="n">objects</span><span class="o">:</span><span class="w"> </span><span class="mi">100</span><span class="o">%</span><span class="w"> </span><span class="p">(</span><span class="mi">234</span><span class="o">/</span><span class="mi">234</span><span class="p">),</span><span class="w"> </span><span class="mf">53.20</span><span class="w"> </span><span class="n">KiB</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">939.00</span><span class="w"> </span><span class="n">KiB</span><span class="o">/</span><span class="n">s</span><span class="p">,</span><span class="w"> </span><span class="n">done</span><span class="p">.</span>
<span class="n">Resolving</span><span class="w"> </span><span class="n">deltas</span><span class="o">:</span><span class="w"> </span><span class="mi">100</span><span class="o">%</span><span class="w"> </span><span class="p">(</span><span class="mi">177</span><span class="o">/</span><span class="mi">177</span><span class="p">),</span><span class="w"> </span><span class="n">completed</span><span class="w"> </span><span class="n">with</span><span class="w"> </span><span class="mi">36</span><span class="w"> </span><span class="n">local</span><span class="w"> </span><span class="n">objects</span><span class="p">.</span>
<span class="n">From</span><span class="w"> </span><span class="n">git</span><span class="o">:</span><span class="c1">//anongit.freedesktop.org/mesa/drm</span>
<span class="w"> </span><span class="n">cb592ac8166e</span><span class="p">..</span><span class="n">bcb9d976cd91</span><span class="w"> </span><span class="n">master</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="n">upstream</span><span class="o">/</span><span class="n">master</span>
<span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="p">[</span><span class="n">new</span><span class="w"> </span><span class="n">tag</span><span class="p">]</span><span class="w"> </span><span class="n">libdrm</span><span class="mf">-2.4.93</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="n">libdrm</span><span class="mf">-2.4.93</span>
<span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="p">[</span><span class="n">new</span><span class="w"> </span><span class="n">tag</span><span class="p">]</span><span class="w"> </span><span class="n">libdrm</span><span class="mf">-2.4.94</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="n">libdrm</span><span class="mf">-2.4.94</span>
</code></pre></div>
<p>The idea here is that we by issuing a single short command can fetch the
latest master branch from the upstream repository of the codebase we're
working on and set our local master branch to point to the most recent
upstream/master one.</p>
<p>This works by looking for a remote called <code>upstream</code> (or falling back to
<code>origin</code> if it isn't found). And resetting the local master branch to point at
the upstream/master branch.</p>
<h2>~/.gitconfig</h2>
<p>Add this snippet under the <code>[alias]</code> section of your <code>~/.gitconfig</code> file.</p>
<div class="highlight"><pre><span></span><code><span class="k">[alias]</span>
<span class="w"> </span><span class="na">ru</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"!f() { </span>\
<span class="w"> </span><span class="s">REMOTES=$(git remote); </span>\
<span class="w"> </span><span class="s">REMOTE=\"origin\"; </span>\
<span class="w"> </span><span class="s">case \"$REMOTES\" in </span>\
<span class="w"> </span><span class="s">*upstream*) </span>\
<span class="w"> </span><span class="s">REMOTE=\"upstream\"; </span>\
<span class="w"> </span><span class="s">;; </span>\
<span class="w"> </span><span class="s">esac; </span>\
<span class="w"> </span><span class="s">git fetch $REMOTE; </span>\
<span class="w"> </span><span class="s">git update-ref refs/heads/master refs/remotes/$REMOTE/master; </span>\
<span class="w"> </span><span class="s">git checkout master >/dev/null 2>&1; </span>\
<span class="w"> </span><span class="s">git reset --hard $REMOTE/master >/dev/null 2>&1; </span>\
<span class="w"> </span><span class="s">git checkout - >/dev/null 2>&1; </span>\
<span class="w"> </span><span class="s">}; f</span>
</code></pre></div>
<p>If you have a closer look, you'll notice that the <code>upstream</code> remote is used if
has been added, otherwise the <code>origin</code> remote is used. This selection is
done using git running a shell script.</p>
<h2>Example</h2>
<p>This is what <code>git ru</code> might look like when used.</p>
<div class="highlight"><pre><span></span><code><span class="n">robertfoss</span><span class="p">@</span><span class="n">xps9570</span><span class="w"> </span><span class="o">~/</span><span class="n">work</span><span class="o">/</span><span class="n">libdrm</span><span class="w"> </span><span class="n">$</span><span class="w"> </span><span class="n">git</span><span class="w"> </span><span class="n">remote</span><span class="w"> </span><span class="o">-</span><span class="n">v</span>
<span class="n">origin</span><span class="w"> </span><span class="n">git</span><span class="p">@</span><span class="n">gitlab</span><span class="p">.</span><span class="n">collabora</span><span class="p">.</span><span class="n">com</span><span class="o">:</span><span class="n">robertfoss</span><span class="o">/</span><span class="n">libdrm</span><span class="p">.</span><span class="n">git</span><span class="w"> </span><span class="p">(</span><span class="n">fetch</span><span class="p">)</span>
<span class="n">origin</span><span class="w"> </span><span class="n">git</span><span class="p">@</span><span class="n">gitlab</span><span class="p">.</span><span class="n">collabora</span><span class="p">.</span><span class="n">com</span><span class="o">:</span><span class="n">robertfoss</span><span class="o">/</span><span class="n">libdrm</span><span class="p">.</span><span class="n">git</span><span class="w"> </span><span class="p">(</span><span class="n">push</span><span class="p">)</span>
<span class="n">upstream</span><span class="w"> </span><span class="n">git</span><span class="o">:</span><span class="c1">//anongit.freedesktop.org/mesa/drm (fetch)</span>
<span class="n">upstream</span><span class="w"> </span><span class="n">git</span><span class="o">:</span><span class="c1">//anongit.freedesktop.org/mesa/drm (push)</span>
<span class="n">robertfoss</span><span class="p">@</span><span class="n">xps9570</span><span class="w"> </span><span class="o">~/</span><span class="n">work</span><span class="o">/</span><span class="n">libdrm</span><span class="w"> </span><span class="n">$</span><span class="w"> </span><span class="n">git</span><span class="w"> </span><span class="n">log</span><span class="w"> </span><span class="o">--</span><span class="n">pretty</span><span class="o">=</span><span class="n">log</span><span class="w"> </span><span class="o">--</span><span class="n">abbrev</span><span class="o">-</span><span class="n">commit</span>
<span class="n">cb592ac8166e</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="p">(</span><span class="n">HEAD</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="n">master</span><span class="p">,</span><span class="w"> </span><span class="n">upstream</span><span class="o">/</span><span class="n">master</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">:</span><span class="w"> </span><span class="n">libdrm</span><span class="mf">-2.4.92</span><span class="p">)</span><span class="w"> </span><span class="n">bump</span><span class="w"> </span><span class="n">version</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="k">release</span><span class="w"> </span><span class="p">(</span><span class="mi">4</span><span class="w"> </span><span class="n">months</span><span class="w"> </span><span class="n">ago</span><span class="p">)</span><span class="w"> </span><span class="o"><</span><span class="n">Rob</span><span class="w"> </span><span class="n">Clark</span><span class="o">></span>
<span class="n">c5a656818492</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">freedreno</span><span class="o">:</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="n">fd_pipe</span><span class="w"> </span><span class="n">refcounting</span><span class="w"> </span><span class="p">(</span><span class="mi">4</span><span class="w"> </span><span class="n">months</span><span class="w"> </span><span class="n">ago</span><span class="p">)</span><span class="w"> </span><span class="o"><</span><span class="n">Rob</span><span class="w"> </span><span class="n">Clark</span><span class="o">></span>
<span class="mi">1</span><span class="n">ac3ecde2f2c</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">intel</span><span class="o">:</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="n">support</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">ICL</span><span class="w"> </span><span class="mi">11</span><span class="w"> </span><span class="p">(</span><span class="mi">4</span><span class="w"> </span><span class="n">months</span><span class="w"> </span><span class="n">ago</span><span class="p">)</span><span class="w"> </span><span class="o"><</span><span class="n">Paulo</span><span class="w"> </span><span class="n">Zanoni</span><span class="o">></span>
<span class="n">bc9c789073c8</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">amdgpu</span><span class="o">:</span><span class="w"> </span><span class="n">Deinitialize</span><span class="w"> </span><span class="n">vamgr_high</span><span class="p">{,</span><span class="n">_32</span><span class="p">}</span><span class="w"> </span><span class="p">(</span><span class="mi">4</span><span class="w"> </span><span class="n">months</span><span class="w"> </span><span class="n">ago</span><span class="p">)</span><span class="w"> </span><span class="o"><</span><span class="n">Michel</span><span class="w"> </span><span class="n">Dänzer</span><span class="o">></span>
<span class="p">[</span><span class="n">snip</span><span class="p">]</span>
<span class="n">robertfoss</span><span class="p">@</span><span class="n">xps9570</span><span class="w"> </span><span class="o">~/</span><span class="n">work</span><span class="o">/</span><span class="n">libdrm</span><span class="w"> </span><span class="n">$</span><span class="w"> </span><span class="n">git</span><span class="w"> </span><span class="n">ru</span>
<span class="nl">remote</span><span class="p">:</span><span class="w"> </span><span class="n">Counting</span><span class="w"> </span><span class="n">objects</span><span class="o">:</span><span class="w"> </span><span class="mi">234</span><span class="p">,</span><span class="w"> </span><span class="n">done</span><span class="p">.</span>
<span class="nl">remote</span><span class="p">:</span><span class="w"> </span><span class="n">Compressing</span><span class="w"> </span><span class="n">objects</span><span class="o">:</span><span class="w"> </span><span class="mi">100</span><span class="o">%</span><span class="w"> </span><span class="p">(</span><span class="mi">233</span><span class="o">/</span><span class="mi">233</span><span class="p">),</span><span class="w"> </span><span class="n">done</span><span class="p">.</span>
<span class="nl">remote</span><span class="p">:</span><span class="w"> </span><span class="n">Total</span><span class="w"> </span><span class="mi">234</span><span class="w"> </span><span class="p">(</span><span class="n">delta</span><span class="w"> </span><span class="mi">177</span><span class="p">),</span><span class="w"> </span><span class="n">reused</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">(</span><span class="n">delta</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
<span class="n">Receiving</span><span class="w"> </span><span class="n">objects</span><span class="o">:</span><span class="w"> </span><span class="mi">100</span><span class="o">%</span><span class="w"> </span><span class="p">(</span><span class="mi">234</span><span class="o">/</span><span class="mi">234</span><span class="p">),</span><span class="w"> </span><span class="mf">53.20</span><span class="w"> </span><span class="n">KiB</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="mf">939.00</span><span class="w"> </span><span class="n">KiB</span><span class="o">/</span><span class="n">s</span><span class="p">,</span><span class="w"> </span><span class="n">done</span><span class="p">.</span>
<span class="n">Resolving</span><span class="w"> </span><span class="n">deltas</span><span class="o">:</span><span class="w"> </span><span class="mi">100</span><span class="o">%</span><span class="w"> </span><span class="p">(</span><span class="mi">177</span><span class="o">/</span><span class="mi">177</span><span class="p">),</span><span class="w"> </span><span class="n">completed</span><span class="w"> </span><span class="n">with</span><span class="w"> </span><span class="mi">36</span><span class="w"> </span><span class="n">local</span><span class="w"> </span><span class="n">objects</span><span class="p">.</span>
<span class="n">From</span><span class="w"> </span><span class="n">git</span><span class="o">:</span><span class="c1">//anongit.freedesktop.org/mesa/drm</span>
<span class="w"> </span><span class="n">cb592ac8166e</span><span class="p">..</span><span class="n">bcb9d976cd91</span><span class="w"> </span><span class="n">master</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="n">upstream</span><span class="o">/</span><span class="n">master</span>
<span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="p">[</span><span class="n">new</span><span class="w"> </span><span class="n">tag</span><span class="p">]</span><span class="w"> </span><span class="n">libdrm</span><span class="mf">-2.4.93</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="n">libdrm</span><span class="mf">-2.4.93</span>
<span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="p">[</span><span class="n">new</span><span class="w"> </span><span class="n">tag</span><span class="p">]</span><span class="w"> </span><span class="n">libdrm</span><span class="mf">-2.4.94</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="n">libdrm</span><span class="mf">-2.4.94</span>
<span class="n">robertfoss</span><span class="p">@</span><span class="n">xps9570</span><span class="w"> </span><span class="o">~/</span><span class="n">work</span><span class="o">/</span><span class="n">libdrm</span><span class="w"> </span><span class="n">$</span><span class="w"> </span><span class="n">git</span><span class="w"> </span><span class="n">log</span><span class="w"> </span><span class="o">--</span><span class="n">pretty</span><span class="o">=</span><span class="n">log</span><span class="w"> </span><span class="o">--</span><span class="n">abbrev</span><span class="o">-</span><span class="n">commit</span>
<span class="n">cb9d976cd91</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="p">(</span><span class="n">HEAD</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="n">master</span><span class="p">,</span><span class="w"> </span><span class="n">upstream</span><span class="o">/</span><span class="n">master</span><span class="p">)</span><span class="w"> </span><span class="n">xf86drm</span><span class="o">:</span><span class="w"> </span><span class="n">fallback</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="n">normal</span><span class="w"> </span><span class="n">path</span><span class="w"> </span><span class="n">when</span><span class="w"> </span><span class="n">realpath</span><span class="w"> </span><span class="n">fails</span><span class="w"> </span><span class="p">(</span><span class="mi">4</span><span class="w"> </span><span class="n">hours</span><span class="w"> </span><span class="n">ago</span><span class="p">)</span><span class="w"> </span><span class="o"><</span><span class="n">Emil</span><span class="w"> </span><span class="n">Velikov</span><span class="o">></span>
<span class="mi">8389</span><span class="n">c5454804</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="p">(</span><span class="n">tag</span><span class="o">:</span><span class="w"> </span><span class="n">libdrm</span><span class="mf">-2.4.94</span><span class="p">)</span><span class="w"> </span><span class="n">Bump</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="n">version</span><span class="w"> </span><span class="mf">2.4.94</span><span class="w"> </span><span class="p">(</span><span class="mi">19</span><span class="w"> </span><span class="n">hours</span><span class="w"> </span><span class="n">ago</span><span class="p">)</span><span class="w"> </span><span class="o"><</span><span class="n">Kristian</span><span class="w"> </span><span class="n">H</span><span class="p">.</span><span class="w"> </span><span class="n">Kristensen</span><span class="o">></span>
<span class="n">f0c642e8df41</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">libdrm</span><span class="o">:</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="n">msm</span><span class="w"> </span><span class="n">drm</span><span class="w"> </span><span class="n">uapi</span><span class="w"> </span><span class="n">header</span><span class="w"> </span><span class="p">(</span><span class="mi">25</span><span class="w"> </span><span class="n">hours</span><span class="w"> </span><span class="n">ago</span><span class="p">)</span><span class="w"> </span><span class="o"><</span><span class="n">Tanmay</span><span class="w"> </span><span class="n">Shah</span><span class="o">></span>
<span class="p">[</span><span class="n">snip</span><span class="p">]</span>
</code></pre></div>
<h2>Thanks</h2>
<p>This post has been a part of work undertaken by my employer <a href="http://www.collabora.com">Collabora</a>.</p>
<p>And thanks <a href="https://twitter.com/widawsky">@widawsky</a> for pointing out some
improvements.</p>kms_swrast: A hardware-backed graphics driver2018-07-31T09:14:00+02:002018-07-31T09:14:00+02:00Robert Fosstag:memcpy.io,2018-07-31:/kms_swrast-a-hardware-backed-graphics-driver.html<h2>Stack overview</h2>
<p>Let's start with having a look at a high level overview of what the
graphics stack looks like.</p>
<p><a href="/images/2018-07-31_kms_swrast_overview.svg"><img alt="Alt text" src="/images/2018-07-31_kms_swrast_overview.svg" title="Linux graphics stack">
</a></p>
<p>Before digging too much further into this, lets cover some terminology.</p>
<p>DRM - Direct Rendering Manager - is the Linux kernel graphics subsystem,
which contains all of the graphics drivers and does all of the interfacing with
hardware.<br>
The DRM subsystem implements the KMS - kernel mode setting - API.</p>
<p>Mode setting is essentially configuring output settings like resolution
for the displays that are being used. And doing it using the kernel means that
userspace doesn't need access to setting these things directly.</p>
<p><a href="/images/2018-07-31_kms_swrast_mesa.svg"><img alt="Alt text" src="/images/2018-07-31_kms_swrast_mesa.svg" title="Mesa internals">
</a></p>
<p>The DRM subsystem talks to the hardware and Mesa is used by applications through
the APIs it implements. APIs like OpenGL, OpenGL ES, Vulkan, etc.
All …</p><h2>Stack overview</h2>
<p>Let's start with having a look at a high level overview of what the
graphics stack looks like.</p>
<p><a href="/images/2018-07-31_kms_swrast_overview.svg"><img alt="Alt text" src="/images/2018-07-31_kms_swrast_overview.svg" title="Linux graphics stack">
</a></p>
<p>Before digging too much further into this, lets cover some terminology.</p>
<p>DRM - Direct Rendering Manager - is the Linux kernel graphics subsystem,
which contains all of the graphics drivers and does all of the interfacing with
hardware.<br>
The DRM subsystem implements the KMS - kernel mode setting - API.</p>
<p>Mode setting is essentially configuring output settings like resolution
for the displays that are being used. And doing it using the kernel means that
userspace doesn't need access to setting these things directly.</p>
<p><a href="/images/2018-07-31_kms_swrast_mesa.svg"><img alt="Alt text" src="/images/2018-07-31_kms_swrast_mesa.svg" title="Mesa internals">
</a></p>
<p>The DRM subsystem talks to the hardware and Mesa is used by applications through
the APIs it implements. APIs like OpenGL, OpenGL ES, Vulkan, etc.
All of Mesa is built ontop of DRM and libdrm. </p>
<p>libdrm is a userspace library that wraps the DRM subsystem in order to simplify
talking to drivers and avoiding common bugs in every user of DRM.</p>
<p><a href="/images/2018-07-31_kms_swrast_detailed.svg"><img alt="Alt text" src="/images/2018-07-31_kms_swrast_detailed.svg" title="kms_swrast diagram">
</a></p>
<p>Looking inside Mesa we find the Gallium driver framework. It is what <em>most</em>
of the Mesa drivers are built using, with the Intel i965 driver being the major
exception.</p>
<p>kms_swrast is built using Gallium, with the intention of re-using as much of the
infrastructure provided by Gallium and KMS as possible instead.</p>
<p>kms_swrast itself is backed by a backend, like softpipe or the faster llvmpipe,
which actually implements the 3D primitives and functionality needed in order
to reach OpenGL and OpenGL ES compliance.</p>
<p>Softpipe is the older and less complicated of the two implementations,
whereas is llvmpipe is newer and relies on LLVM as an external dependency.<br>
But as a result llvmpipe support JIT-compilation for example, which
makes it a lot faster.</p>
<h2>Why is this a good idea?</h2>
<p>Re-using the Gallium framework gives you a lot of things for free. And the
driver can remain relatively lightweight. </p>
<p>Apart from the features that Gallium provides today, you'll also get free
access to new features in the future, without having to write them yourself.<br>
And since Gallium is shared between many drivers, it will be better tested and
have fewer bugs than any one driver.</p>
<p>kms_swrast is built using DRM and actual kernel drivers, but no rendering
hardware is actually used. Which may seem a bit odd. </p>
<p>So why are the kernel drivers used for a software renderer? The answer is
two-fold. </p>
<p>It is what Gallium expects, and there is a kernel driver called VGEM
(Virtual GEM) which was created specifically for this usecase. In order to
not have to make invasive changes to it or make the switch to VGEM right away,
just providing it with access to <em>some</em> driver
is the simplest possible solution. Since the actual hardware is mostly unused,
it doesn't really matter what hardware you use.</p>
<p>The DRM driver is actually only used for a single thing, to allocate a slice
of memory which can be used to render pixels to and then be sent to the display.</p>
<h2>Thanks</h2>
<p>This post has been a part of work undertaken by my employer <a href="http://www.collabora.com">Collabora</a>.</p>Virtualizing GPU Access2018-02-09T11:17:00+01:002018-02-09T11:17:00+01:00Robert Fosstag:memcpy.io,2018-02-09:/virtualizing-gpu-access.html<p>For the past few years a clear trend of containerization of applications
and services has emerged. Having processes containerized is beneficial
in a number of ways. It both improves portability and strengthens security,
and if done properly the performance penalty can be low.</p>
<p>In order to further improve security containers are commonly run in
virtualized environments. This provides some new challenges in terms
of supporting the accelerated graphics usecase.</p>
<h3>OpenGL ES implementation</h3>
<p>Currently Collabora and Google are implementing OpenGL ES 2.0
support. OpenGL ES 2.0 is the lowest common denominator for many mobile
platforms and as such is a requirement for Virgil3D to be viable on
the those platforms.</p>
<p>That is is the motivation for making Virgil3D work on OpenGL ES hosts.</p>
<h2>How …</h2><p>For the past few years a clear trend of containerization of applications
and services has emerged. Having processes containerized is beneficial
in a number of ways. It both improves portability and strengthens security,
and if done properly the performance penalty can be low.</p>
<p>In order to further improve security containers are commonly run in
virtualized environments. This provides some new challenges in terms
of supporting the accelerated graphics usecase.</p>
<h3>OpenGL ES implementation</h3>
<p>Currently Collabora and Google are implementing OpenGL ES 2.0
support. OpenGL ES 2.0 is the lowest common denominator for many mobile
platforms and as such is a requirement for Virgil3D to be viable on
the those platforms.</p>
<p>That is is the motivation for making Virgil3D work on OpenGL ES hosts.</p>
<h2>How does this work?</h2>
<p>This stack is commonly referred to as <a href="https://virgil3d.github.io/">Virgil3D</a>, since all of the parts originated from a project with that name.</p>
<p><a href="/images/2018-02-09_virgl.svg"><img alt="Alt text" src="/images/2018-02-09_virgl.svg" title="Virtualized OpenGL Stack">
</a></p>
<p>There are a few parts to this implementation.
QEMU, virglrenderer and virtio-gpu. They way it works is by letting the guest
applications speak unmodified OpenGL to the Mesa. But instead of Mesa handing
commands over to the hardware it is channeled through virtio-gpu on the guest
to QEMU on the host.</p>
<p>QEMU then receives the raw graphics stack state (Gallium state) and interprets
it using virglrenderer from the raw state into an OpenGL form, which can be
executed as entirely normal OpenGL on the host machine.</p>
<p>The host OpenGL stack does not even have to be Mesa, and could for example
be the proprietary nvidia stack.</p>
<h2>Trying it out</h2>
<h3>Environment</h3>
<p>First of all, let's have a look at the development environment.
When doing graphical development I find it quite helpful to set
up a parallel graphics stack in order to not pollute or depend on
the stack of the host machine more than we have to.</p>
<div class="highlight"><pre><span></span><code><span class="n">function</span><span class="w"> </span><span class="n">concatenate_colon</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">local</span><span class="w"> </span><span class="n">IFS</span><span class="o">=</span><span class="sc">':'</span>
<span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="s">"$*"</span>
<span class="p">}</span>
<span class="n">function</span><span class="w"> </span><span class="n">add_export_env</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">local</span><span class="w"> </span><span class="n">VAR</span><span class="o">=</span><span class="s">"$1"</span>
<span class="w"> </span><span class="n">shift</span>
<span class="w"> </span><span class="n">local</span><span class="w"> </span><span class="n">VAL</span><span class="o">=</span><span class="n">$</span><span class="p">(</span><span class="n">eval</span><span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="s">"\$$VAR"</span><span class="p">)</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="s">"$VAL"</span><span class="w"> </span><span class="p">];</span><span class="w"> </span><span class="n">then</span>
<span class="w"> </span><span class="n">VAL</span><span class="o">=</span><span class="n">$</span><span class="p">(</span><span class="n">concatenate_colon</span><span class="w"> </span><span class="s">"$@"</span><span class="w"> </span><span class="s">"$VAL"</span><span class="p">);</span>
<span class="w"> </span><span class="k">else</span>
<span class="w"> </span><span class="n">VAL</span><span class="o">=</span><span class="n">$</span><span class="p">(</span><span class="n">concatenate_colon</span><span class="w"> </span><span class="s">"$@"</span><span class="p">);</span>
<span class="w"> </span><span class="n">fi</span>
<span class="w"> </span><span class="n">eval</span><span class="w"> </span><span class="s">"export $VAR=</span><span class="se">\"</span><span class="s">$VAL</span><span class="se">\"</span><span class="s">"</span>
<span class="p">}</span>
<span class="n">function</span><span class="w"> </span><span class="n">prefix_setup</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">local</span><span class="w"> </span><span class="n">PREFIX</span><span class="o">=</span><span class="s">"$1"</span>
<span class="w"> </span><span class="n">add_export_env</span><span class="w"> </span><span class="n">PATH</span><span class="w"> </span><span class="s">"$PREFIX/bin"</span>
<span class="w"> </span><span class="n">add_export_env</span><span class="w"> </span><span class="n">LD_LIBRARY_PATH</span><span class="w"> </span><span class="s">"$PREFIX/lib"</span>
<span class="w"> </span><span class="n">add_export_env</span><span class="w"> </span><span class="n">PKG_CONFIG_PATH</span><span class="w"> </span><span class="s">"$PREFIX/lib/pkgconfig/"</span><span class="w"> </span><span class="s">"$PREFIX/share/pkgconfig/"</span>
<span class="w"> </span><span class="n">add_export_env</span><span class="w"> </span><span class="n">MANPATH</span><span class="w"> </span><span class="s">"$PREFIX/share/man"</span>
<span class="w"> </span><span class="n">export</span><span class="w"> </span><span class="n">ACLOCAL_PATH</span><span class="o">=</span><span class="s">"$PREFIX/share/aclocal"</span>
<span class="w"> </span><span class="n">mkdir</span><span class="w"> </span><span class="o">-</span><span class="n">p</span><span class="w"> </span><span class="s">"$ACLOCAL_PATH"</span>
<span class="w"> </span><span class="n">export</span><span class="w"> </span><span class="n">ACLOCAL</span><span class="o">=</span><span class="s">"aclocal -I $ACLOCAL_PATH"</span>
<span class="p">}</span>
<span class="n">function</span><span class="w"> </span><span class="n">projectshell</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="s">"$1"</span><span class="w"> </span><span class="no">in</span>
<span class="w"> </span><span class="no">virgl</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="no">virglrenderer</span><span class="p">)</span>
<span class="w"> </span><span class="no">export</span><span class="w"> </span><span class="no">ALT_LOCAL</span><span class="o">=</span><span class="s">"/opt/local/virgl"</span>
<span class="w"> </span><span class="no">mkdir</span><span class="w"> </span><span class="o">-</span><span class="no">p</span><span class="w"> </span><span class="s">"$ALT_LOCAL"</span>
<span class="w"> </span><span class="no">prefix_setup</span><span class="w"> </span><span class="s">"$ALT_LOCAL"</span>
<span class="w"> </span><span class="err">;;</span>
<span class="w"> </span><span class="no">esac</span>
<span class="err">}</span>
</code></pre></div>
<p>The above snippet is something that I would put in my <code>.bashrc</code> or <code>.zshrc</code>.
Don't forget so run <code>source ~/.bashrc</code> or the equivalent after making changes.</p>
<p>To enter the environment I simply type <code>projectshell virgl</code>.</p>
<h3>Build libepoxy</h3>
<p>libepoxy is a library for managing OpenGL function pointers for you.
And it is a dependency of virglrenderer, which we'll get to below.</p>
<div class="highlight"><pre><span></span><code>git clone https://github.com/anholt/libepoxy.git
cd libepoxy
./autogen.sh --prefix=$ALT_LOCAL
make -j$(nproc --ignore=1)
make install
</code></pre></div>
<h3>Build virglrenderer</h3>
<p>Virgilrenderer is the component that QEMU uses to provide
accelerated rendering.
It receives Gallium states from the guest kernel
via its virtio-gpu interface, which are then translated
into OpenGL on the host. It also translates shaders from the
TGSI format used by Gallium into the GLSL format used by OpenGL.</p>
<div class="highlight"><pre><span></span><code>git clone git://anongit.freedesktop.org/virglrenderer
cd virglrenderer
./autogen.sh --prefix=$ALT_LOCAL
make -j$(nproc --ignore=1)
make install
</code></pre></div>
<h3>Build Mesa</h3>
<div class="highlight"><pre><span></span><code># Fetch dependencies
sudo sed -i 's/\#[ ]*deb-src/deb-src/' /etc/apt/sources.list
sudo apt update
sudo apt-get build-dep mesa
# Actually build Mesa
git clone https://anongit.freedesktop.org/git/mesa/mesa.git
cd mesa
./autogen.sh \
--prefix=$ALT_LOCAL \
--enable-driglx-direct \
--enable-gles1 \
--enable-gles2 \
--enable-glx-tls \
--enable-texture-float \
--with-platforms=drm,x11,wayland \
--with-dri-drivers=i915,i965,nouveau \
--with-gallium-drivers=nouveau,swrast,radeonsi,virgl \
--without-vulkan-drivers
make -j$(nproc --ignore=1)
make install
</code></pre></div>
<h3>Build QEMU</h3>
<div class="highlight"><pre><span></span><code>git clone git://git.qemu.org/qemu.git
cd qemu
./configure \
--prefix=$ALT_LOCAL \
--target-list=x86_64-softmmu \
--enable-gtk \
--with-gtkabi=3.0 \
--enable-kvm \
--enable-spice \
--enable-usb-redir \
--enable-libusb \
--enable-opengl \
--enable-virglrenderer
make -j$(nproc --ignore=1)
make install
</code></pre></div>
<h2>Set up a VM</h2>
<p>As a guest we're going to use Ubuntu 17.10, but just use the latest
release of whatever distro you like. The kernel <em>has</em> to have been
built with the appropriate virtio-gpu Kconfig options though.</p>
<div class="highlight"><pre><span></span><code>wget http://releases.ubuntu.com/17.10/ubuntu-17.10.1-server-amd64.iso
qemu-img create -f qcow2 ubuntu.qcow2 35G
qemu-system-x86_64 \
-enable-kvm -M q35 -smp 2 -m 4G \
-hda ubuntu.qcow2 \
-net nic,model=virtio \
-net user,hostfwd=tcp::2222-:22 \
-vga virtio \
-display sdl,gl=on \
-boot d -cdrom ubuntu-17.10.1-server-amd64.iso
</code></pre></div>
<h3>Run VM</h3>
<div class="highlight"><pre><span></span><code>qemu-system-x86_64 \
-enable-kvm -M q35 -smp 2 -m 4G \
-hda ubuntu.qcow2 \
-net nic,model=virtio \
-net user,hostfwd=tcp::2222-:22 \
-vga virtio \
-display sdl,gl=on
</code></pre></div>
<p>Et Voila! Your guest should now have GPU acceleration!</p>
<h2>Conclusion</h2>
<p>Hopefully this guide will have helped you to build all of the software needed to
set up your very own virglrenderer enabled graphics stack.</p>
<p>This post has been a part of work undertaken by my employer <a href="http://www.collabora.com">Collabora</a>.</p>Building ChromiumOS for Qemu2017-11-28T11:32:00+01:002017-11-28T11:32:00+01:00Robert Fosstag:memcpy.io,2017-11-28:/building-chromiumos-for-qemu.html<p><img alt="Alt text" src="/images/2017-11-28_chromeos_qemu.png" title="ChromiumOS running on Qemu"></p>
<p>So let's start off by covering how ChromiumOS relates to ChromeOS. The
ChromiumOS project is essentially ChromeOS minus branding and some
packages for things like the media digital restrictions management.</p>
<p>But on the whole, almost everything is there, and the pieces that aren't,
you don't <em>need</em>.</p>
<h2>ChromiumOS</h2>
<h3>Depot tools</h3>
<p>In order to check out ChromiumOS and other large Google projects,
you'll need depot tools.</p>
<div class="highlight"><pre><span></span><code><span class="n">git</span><span class="w"> </span><span class="n">clone</span><span class="w"> </span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">chromium</span><span class="o">.</span><span class="n">googlesource</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">chromium</span><span class="o">/</span><span class="n">tools</span><span class="o">/</span><span class="n">depot_tools</span><span class="o">.</span><span class="n">git</span>
<span class="k">export</span><span class="w"> </span><span class="n">PATH</span><span class="o">=$</span><span class="n">PATH</span><span class="p">:</span><span class="o">$</span><span class="p">(</span><span class="n">PWD</span><span class="p">)</span><span class="o">/</span><span class="n">depot_tools</span>
</code></pre></div>
<p>Maybe you'd want to add the PATH export to your .bashrc.</p>
<h3>Building ChromiumOS</h3>
<div class="highlight"><pre><span></span><code><span class="n">mkdir</span><span class="w"> </span><span class="n">chromiumos</span>
<span class="n">cd</span><span class="w"> </span><span class="n">chromiumos</span>
<span class="n">repo</span><span class="w"> </span><span class="n">init</span><span class="w"> </span><span class="o">-</span><span class="n">u</span><span class="w"> </span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">chromium</span><span class="o">.</span><span class="n">googlesource</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">chromiumos</span><span class="o">/</span><span class="n">manifest</span><span class="o">.</span><span class="n">git</span><span class="w"> </span><span class="o">--</span><span class="n">repo</span><span class="o">-</span><span class="n">url</span><span class="w"> </span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">chromium</span><span class="o">.</span><span class="n">googlesource</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">external</span><span class="o">/</span><span class="n">repo</span><span class="o">.</span><span class="n">git</span><span class="w"> </span><span class="p">[</span><span class="o">-</span><span class="n">g</span><span class="w"> </span><span class="n">minilayout</span><span class="p">]</span>
<span class="n">repo</span><span class="w"> </span><span class="n">sync</span><span class="w"> </span><span class="o">-</span><span class="n">j75</span>
<span class="n">cros_sdk</span>
<span class="k">export</span><span class="w"> </span><span class="n">BOARD</span><span class="o">=</span><span class="n">amd64</span><span class="o">-</span><span class="n">generic …</span></code></pre></div><p><img alt="Alt text" src="/images/2017-11-28_chromeos_qemu.png" title="ChromiumOS running on Qemu"></p>
<p>So let's start off by covering how ChromiumOS relates to ChromeOS. The
ChromiumOS project is essentially ChromeOS minus branding and some
packages for things like the media digital restrictions management.</p>
<p>But on the whole, almost everything is there, and the pieces that aren't,
you don't <em>need</em>.</p>
<h2>ChromiumOS</h2>
<h3>Depot tools</h3>
<p>In order to check out ChromiumOS and other large Google projects,
you'll need depot tools.</p>
<div class="highlight"><pre><span></span><code><span class="n">git</span><span class="w"> </span><span class="n">clone</span><span class="w"> </span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">chromium</span><span class="o">.</span><span class="n">googlesource</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">chromium</span><span class="o">/</span><span class="n">tools</span><span class="o">/</span><span class="n">depot_tools</span><span class="o">.</span><span class="n">git</span>
<span class="k">export</span><span class="w"> </span><span class="n">PATH</span><span class="o">=$</span><span class="n">PATH</span><span class="p">:</span><span class="o">$</span><span class="p">(</span><span class="n">PWD</span><span class="p">)</span><span class="o">/</span><span class="n">depot_tools</span>
</code></pre></div>
<p>Maybe you'd want to add the PATH export to your .bashrc.</p>
<h3>Building ChromiumOS</h3>
<div class="highlight"><pre><span></span><code><span class="n">mkdir</span><span class="w"> </span><span class="n">chromiumos</span>
<span class="n">cd</span><span class="w"> </span><span class="n">chromiumos</span>
<span class="n">repo</span><span class="w"> </span><span class="n">init</span><span class="w"> </span><span class="o">-</span><span class="n">u</span><span class="w"> </span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">chromium</span><span class="o">.</span><span class="n">googlesource</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">chromiumos</span><span class="o">/</span><span class="n">manifest</span><span class="o">.</span><span class="n">git</span><span class="w"> </span><span class="o">--</span><span class="n">repo</span><span class="o">-</span><span class="n">url</span><span class="w"> </span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">chromium</span><span class="o">.</span><span class="n">googlesource</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">external</span><span class="o">/</span><span class="n">repo</span><span class="o">.</span><span class="n">git</span><span class="w"> </span><span class="p">[</span><span class="o">-</span><span class="n">g</span><span class="w"> </span><span class="n">minilayout</span><span class="p">]</span>
<span class="n">repo</span><span class="w"> </span><span class="n">sync</span><span class="w"> </span><span class="o">-</span><span class="n">j75</span>
<span class="n">cros_sdk</span>
<span class="k">export</span><span class="w"> </span><span class="n">BOARD</span><span class="o">=</span><span class="n">amd64</span><span class="o">-</span><span class="n">generic</span>
<span class="o">./</span><span class="n">setup_board</span><span class="w"> </span><span class="o">--</span><span class="n">board</span><span class="o">=$</span><span class="p">{</span><span class="n">BOARD</span><span class="p">}</span>
<span class="o">./</span><span class="n">build_packages</span><span class="w"> </span><span class="o">--</span><span class="n">board</span><span class="o">=$</span><span class="p">{</span><span class="n">BOARD</span><span class="p">}</span>
<span class="o">./</span><span class="n">build_image</span><span class="w"> </span><span class="o">--</span><span class="n">board</span><span class="o">=$</span><span class="p">{</span><span class="n">BOARD</span><span class="p">}</span><span class="w"> </span><span class="o">--</span><span class="n">boot_args</span><span class="w"> </span><span class="s2">"earlyprintk=serial,keep console=tty0"</span><span class="w"> </span><span class="o">--</span><span class="n">noenable_rootfs_verification</span><span class="w"> </span><span class="n">test</span>
<span class="o">./</span><span class="n">image_to_vm</span><span class="o">.</span><span class="n">sh</span><span class="w"> </span><span class="o">--</span><span class="n">board</span><span class="o">=$</span><span class="p">{</span><span class="n">BOARD</span><span class="p">}</span><span class="w"> </span><span class="o">--</span><span class="n">test_image</span>
</code></pre></div>
<h3>How to (not) boot ChromiumOS</h3>
<p>So, this is a command baked into ChromiumOS using the <code>cros_start_vm</code> command,
but at least on my machine it does not seem to boot properly.
I have as of yet not been able to get any graphical output (over VNC).</p>
<div class="highlight"><pre><span></span><code>cros_sdk
./bin/cros_start_vm<span class="w"> </span>--image_path=../build/images/<span class="cp">${</span><span class="n">BOARD</span><span class="cp">}</span>/latest/chromiumos_qemu_image.bin<span class="w"> </span>--board=<span class="cp">${</span><span class="n">BOARD</span><span class="cp">}</span>
</code></pre></div>
<h2>Running Qemu ourselves</h2>
<p>So if the intended tools don't work, we'll just have to roll up our sleeves
and do it ourselves. This is how I got ChromiumOS booting.</p>
<h3>Install build dependencies</h3>
<p>These dependencies were available on Ubuntu 17.10, some alternative packages
might be needed for <em>your</em> distributions.</p>
<div class="highlight"><pre><span></span><code><span class="n">sudo</span><span class="w"> </span><span class="n">apt</span><span class="w"> </span><span class="n">install</span><span class="w"> </span><span class="n">autoconf</span><span class="w"> </span><span class="n">libaio</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libbluetooth</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libbrlapi</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libbz2</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libcap</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libcap</span><span class="o">-</span><span class="n">ng</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libcurl4</span><span class="o">-</span><span class="n">gnutls</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libepoxy</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libfdt</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libgbm</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libgles2</span><span class="o">-</span><span class="n">mesa</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libglib2</span><span class="o">.</span><span class="mi">0</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libgtk</span><span class="o">-</span><span class="mi">3</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libibverbs</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libjpeg8</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">liblzo2</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libncurses5</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libnuma</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">librbd</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">librdmacm</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libsasl2</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libsdl1</span><span class="o">.</span><span class="mi">2</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libsdl2</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libseccomp</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libsnappy</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libssh2</span><span class="o">-</span><span class="mi">1</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libspice</span><span class="o">-</span><span class="n">server</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libspice</span><span class="o">-</span><span class="n">server1</span><span class="w"> </span><span class="n">libtool</span><span class="w"> </span><span class="n">libusb</span><span class="o">-</span><span class="mf">1.0</span><span class="o">-</span><span class="mi">0</span><span class="w"> </span><span class="n">libusb</span><span class="o">-</span><span class="mf">1.0</span><span class="o">-</span><span class="mi">0</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libvde</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libvdeplug</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libvte</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libxen</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">valgrind</span><span class="w"> </span><span class="n">xfslibs</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">xutils</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">zlib1g</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libusbredirhost</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">usbredirserver</span>
</code></pre></div>
<h3>Virglrenderer</h3>
<p>Virglrenderer creates a virtual 3D GPU, that allows the Qemu guest to use the
graphics capabilities of the host machine.</p>
<p>This step is optional, but allows for hardware accelerated OpenGL support on
the guest system.
If you don't want to use Virgl, remove it from the Qemu configure step and
the Qemu runtime flags.</p>
<div class="highlight"><pre><span></span><code>git clone git://git.freedesktop.org/git/virglrenderer
cd virglrenderer
./autogen.sh
make -j7
sudo make install
</code></pre></div>
<h3>Qemu</h3>
<p>Qemu is a full system emulator, and supports a multitude of machine architectures.
We're going to to use <em>x86_64</em>.</p>
<div class="highlight"><pre><span></span><code>git clone git://git.qemu-project.org/qemu.git
mkdir -p qemu/build
cd qemu/build
../configure --target-list=x86_64-softmmu --enable-gtk --with-gtkabi=3.0 --enable-kvm --enable-spice --enable-usb-redir --enable-libusb --enable-virglrenderer --enable-opengl
make -j7
sudo make install
</code></pre></div>
<h3>Run image</h3>
<p>Now you can boot the image using Qemu.</p>
<p>Note that running Qemu with the virtio options requires that your host machine
is running a Linux kernel which was built with the kconfig options <code>CONFIG_DRM_VIRTIO</code>,
<code>CONFIG_VIRT_DRIVERS</code> and <code>CONFIG_VIRTIO_XXXX</code>.</p>
<div class="highlight"><pre><span></span><code>cd chromiumos
/usr/local/bin/qemu-system-x86_64 \
-enable-kvm \
-m 2G \
-smp 4 \
-hda src/build/images/amd64-generic/latest/chromiumos_qemu_image.bin \
-vga virtio \
-net nic,model=virtio \
-net user,hostfwd=tcp:127.0.0.1:9222-:22 \
-usb -usbdevice keyboard \
-usbdevice mouse \
-device virtio-gpu-pci,virgl \
-display gtk,gl=on
</code></pre></div>
<h2>Conclusion</h2>
<p>Hopefully this guide will have helped you to build all of the software needed to
boot your very own ChromiumOS.</p>
<p>This post has been a part of work undertaken by my employer <a href="http://www.collabora.com">Collabora</a>.</p>Android: NXP i.MX6 on Etnaviv Update2017-07-21T00:00:00+02:002017-07-21T00:00:00+02:00Robert Fosstag:memcpy.io,2017-07-21:/android-nxp-imx6-on-etnaviv-update.html<p>Since the last post a lot work has gone into upstreaming and stabilizing the
etnaviv on Android ecosystem. This has involved Android, kernel and Mesa
changes. Many of which are available upstream now. A How-To for getting you
up and running on an iMX6 dev board is available <a href="../android-getting-up-and-running-on-the-imx6.html">here</a>.</p>
<h2>Improvements</h2>
<h4>Modifiers support</h4>
<p>Modifiers support has been accepted into Mesa, GBM and gbm_gralloc.
Modifiers were mentioned in a <a href="../android-nxp-imx6-buffer-modifier-support.html">previous post</a>.</p>
<h4>Etnaviv driver support for Android</h4>
<p>Patches enabling the etnaviv Mesa driver being built for Android have now
landed upstream.</p>
<h4>Stability on Android</h4>
<p>A number for small stability issues present while running Android on i.MX6
hardware have now been fixed, and the platform is now relatively stable.</p>
<h4>Performance diagnostics</h4>
<p>We have a decent understanding that the …</p><p>Since the last post a lot work has gone into upstreaming and stabilizing the
etnaviv on Android ecosystem. This has involved Android, kernel and Mesa
changes. Many of which are available upstream now. A How-To for getting you
up and running on an iMX6 dev board is available <a href="../android-getting-up-and-running-on-the-imx6.html">here</a>.</p>
<h2>Improvements</h2>
<h4>Modifiers support</h4>
<p>Modifiers support has been accepted into Mesa, GBM and gbm_gralloc.
Modifiers were mentioned in a <a href="../android-nxp-imx6-buffer-modifier-support.html">previous post</a>.</p>
<h4>Etnaviv driver support for Android</h4>
<p>Patches enabling the etnaviv Mesa driver being built for Android have now
landed upstream.</p>
<h4>Stability on Android</h4>
<p>A number for small stability issues present while running Android on i.MX6
hardware have now been fixed, and the platform is now relatively stable.</p>
<h4>Performance diagnostics</h4>
<p>We have a decent understanding that the platform is slow when running the desktop and other apps that have multiple surfaces due to rendering using CPU instead of GPU.</p>
<h4>Etnaviv improvements</h4>
<p>Etnaviv performance and feature set have both been increased since Mesa v17.1.</p>
<h4>EGL support</h4>
<p>A number of games using EGL have been successfully run on Android, some
minor graphical issues still remain, but overall games run well and fast.</p>
<h2>Thanks</h2>
<p>This work is built on efforts by a lot people:</p>
<ul>
<li><a href="https://aleksander.es/">Aleksander Morgado</a> - Independent</li>
<li><a href="https://fooishbar.org/">Daniel Stone</a> - Collabora</li>
<li><a href="http://christian-gmeiner.info/">Christian Gmeiner</a> - Independent</li>
<li>Emil Velikov - Collabora</li>
<li>Lucas Stach - Pengutronix</li>
<li>Rob Herring - Linaro</li>
<li><a href="https://varadgautam.wordpress.com/">Varad Gautam</a> - Collabora</li>
<li><a href="https://laanwj.github.io/">Wladimir Van Der Laan</a> - Independent</li>
</ul>
<p>This post has been a part of work undertaken by my employer <a href="http://www.collabora.com">Collabora</a>,
and has been funded by <a href="http://zii.aero">Zodiac Inflight Innovations</a>.</p>GALLIUM_HUD: Debug Mesa Graphics Performance2017-06-28T00:00:00+02:002017-06-28T00:00:00+02:00Robert Fosstag:memcpy.io,2017-06-28:/gallium_hud-debug-mesa-graphics-performance.html<h2>GALLIUM_HUD</h2>
<p>GALLIUM_HUD is a feature that adds performance graphs to applications that describe
various aspects like FPS, CPU usage, etc in realtime.</p>
<p>It is enabled using an environment variable, GALLIUM_HUD, that can be set for GL/EGL/etc
applications. It only works for Mesa drivers that are Gallium based, which means that
the most drivers (with the notable exception of some Intel drivers) support GALLIUM_HUD.</p>
<p>See GALLIUM_HUD options:</p>
<div class="highlight"><pre><span></span><code><span class="k">export</span><span class="w"> </span><span class="n">GALLIUM_HUD</span><span class="o">=</span><span class="n">help</span>
<span class="n">glxgears</span>
</code></pre></div>
<h3>Android</h3>
<p>If you're building Android, you can supply system-wide environment values by doing an
export in the init.rc file of the device you are using, like
<a href="https://customer-git.collabora.com/cgit/android-etnaviv/android-device-linaro-generic.git/commit/?h=android-etnaviv&id=48755378c388707260a8bb50e0fb62a309ded986">this</a>.</p>
<div class="highlight"><pre><span></span><code><span class="c1"># Go to android source code checkout</span>
<span class="n">cd</span><span class="w"> </span><span class="n">android</span>
<span class="c1"># Add export to init.rc (linaro/generic is the device I use)</span>
<span class="n">nano</span><span class="w"> </span><span class="n">device</span><span class="o">/</span><span class="n">linaro</span><span class="o">/</span><span class="n">generic</span><span class="o">/</span><span class="n">init …</span></code></pre></div><h2>GALLIUM_HUD</h2>
<p>GALLIUM_HUD is a feature that adds performance graphs to applications that describe
various aspects like FPS, CPU usage, etc in realtime.</p>
<p>It is enabled using an environment variable, GALLIUM_HUD, that can be set for GL/EGL/etc
applications. It only works for Mesa drivers that are Gallium based, which means that
the most drivers (with the notable exception of some Intel drivers) support GALLIUM_HUD.</p>
<p>See GALLIUM_HUD options:</p>
<div class="highlight"><pre><span></span><code><span class="k">export</span><span class="w"> </span><span class="n">GALLIUM_HUD</span><span class="o">=</span><span class="n">help</span>
<span class="n">glxgears</span>
</code></pre></div>
<h3>Android</h3>
<p>If you're building Android, you can supply system-wide environment values by doing an
export in the init.rc file of the device you are using, like
<a href="https://customer-git.collabora.com/cgit/android-etnaviv/android-device-linaro-generic.git/commit/?h=android-etnaviv&id=48755378c388707260a8bb50e0fb62a309ded986">this</a>.</p>
<div class="highlight"><pre><span></span><code><span class="c1"># Go to android source code checkout</span>
<span class="n">cd</span><span class="w"> </span><span class="n">android</span>
<span class="c1"># Add export to init.rc (linaro/generic is the device I use)</span>
<span class="n">nano</span><span class="w"> </span><span class="n">device</span><span class="o">/</span><span class="n">linaro</span><span class="o">/</span><span class="n">generic</span><span class="o">/</span><span class="n">init</span><span class="o">.</span><span class="n">rc</span>
<span class="k">export</span><span class="w"> </span><span class="n">GALLIUM_HUD</span><span class="w"> </span><span class="n">cpu</span><span class="p">,</span><span class="n">cpu0</span><span class="o">+</span><span class="n">cpu1</span><span class="o">+</span><span class="n">cpu2</span><span class="o">+</span><span class="n">cpu3</span><span class="p">;</span><span class="n">pixels</span><span class="o">-</span><span class="n">rendered</span><span class="p">,</span><span class="n">fps</span><span class="p">,</span><span class="n">primitives</span><span class="o">-</span><span class="n">generated</span>
</code></pre></div>
<h3>Linux</h3>
<p>If you're using one of the usual Linux distros, GALLIUM_HUD can be enabled by setting
the environtment variable in a place that it loaded early.</p>
<div class="highlight"><pre><span></span><code><span class="c1"># Add export to /etc/environment</span>
<span class="n">nano</span><span class="w"> </span><span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">environment</span><span class="w"> </span>
<span class="k">export</span><span class="w"> </span><span class="n">GALLIUM_HUD</span><span class="w"> </span><span class="n">cpu</span><span class="p">,</span><span class="n">cpu0</span><span class="o">+</span><span class="n">cpu1</span><span class="o">+</span><span class="n">cpu2</span><span class="o">+</span><span class="n">cpu3</span><span class="p">;</span><span class="n">pixels</span><span class="o">-</span><span class="n">rendered</span><span class="p">,</span><span class="n">fps</span><span class="p">,</span><span class="n">primitives</span><span class="o">-</span><span class="n">generated</span>
</code></pre></div>
<h2>Thanks</h2>
<p>This post has been a part of work undertaken by my employer <a href="http://www.collabora.com">Collabora</a>.</p>Android: NXP i.MX6 Buffer Modifier Support2017-06-02T00:00:00+02:002017-06-02T00:00:00+02:00Robert Fosstag:memcpy.io,2017-06-02:/android-nxp-imx6-buffer-modifier-support.html<iframe width="100%" height="380" src="https://www.youtube.com/embed/Dn7hOa9WiYk" frameborder="0" allowfullscreen></iframe>
<p>With modifier support added to Mesa and gbm_gralloc, it is now possible to boot Android on iMX6
platforms using no proprietary blobs at all.
This makes iMX6 one of the very few embedded SOCs that needs no blobs at all to run a full graphics stack.</p>
<p>Not only is that a great win for Open Source in general, but it also makes the iMX6 more attractive as a platform.
A further positive point is that this lays the groundwork for the iMX8 platform, and supporting it will come much easier.</p>
<h2>What are modifiers used for?</h2>
<p>Modifiers are used to represent different properties of buffers. These properties can cover a range of
different information about a buffer, for example compression and <a href="https://github.com/laanwj/etna_viv/blob/master/doc/hardware.md#texture-tiling">tiling</a>.</p>
<p>For the case of …</p><iframe width="100%" height="380" src="https://www.youtube.com/embed/Dn7hOa9WiYk" frameborder="0" allowfullscreen></iframe>
<p>With modifier support added to Mesa and gbm_gralloc, it is now possible to boot Android on iMX6
platforms using no proprietary blobs at all.
This makes iMX6 one of the very few embedded SOCs that needs no blobs at all to run a full graphics stack.</p>
<p>Not only is that a great win for Open Source in general, but it also makes the iMX6 more attractive as a platform.
A further positive point is that this lays the groundwork for the iMX8 platform, and supporting it will come much easier.</p>
<h2>What are modifiers used for?</h2>
<p>Modifiers are used to represent different properties of buffers. These properties can cover a range of
different information about a buffer, for example compression and <a href="https://github.com/laanwj/etna_viv/blob/master/doc/hardware.md#texture-tiling">tiling</a>.</p>
<p>For the case of the iMX6 and the Vivante GPU which it is equipped with, the modifiers are related to tiling.
The reason being that buffers can be tiled in different ways (Tiled, Super Tiled, etc.) or not at all (Linear).
Before sending buffers out to a display, they need to have the associated tiling information made available,
so that the actual image that is being sent out is not tiled.</p>
<h2>How was support added?</h2>
<p>Support was added in two places; Mesa and gbm_gralloc. Mesa has had support added to many of the buffer allocation
functions and to GBM (which is the API provided by Mesa, that gbm_gralloc uses).</p>
<p>gbm_gralloc in turn had support added for using a new GBM API call, GBM_BO_IMPORT_FD_MODIFIER, which imports
a buffer object as well as accompanying information like modifier used by the buffer object in question.</p>
<h2>Getting up and running</h2>
<p>Currently the modifiers work is in the process of being upstreamed, but in the meantime it can be
found <a href="https://customer-git.collabora.com/cgit/android-etnaviv/">here</a>. If you'd like to test
this out yourself a How-To can be found <a href="../android-getting-up-and-running-on-the-imx6.html">here</a>.</p>
<h2>Thanks</h2>
<p>This work is built on the efforts of a lot people:</p>
<ul>
<li><a href="https://varadgautam.wordpress.com/">Varad Gautam</a> - Collabora</li>
<li>Lucas Stach - Pengutronix</li>
<li><a href="http://blog.tomeuvizoso.net/">Tomeu Vizoso</a> - Collabora</li>
<li>Rob Herring - Linaro</li>
<li>Emil Velikov - Collabora</li>
<li><a href="https://www.christian-gmeiner.info/">Christian Gmeiner</a> - Independent</li>
<li><a href="https://laanwj.github.io/">Wladimir Van Der Laan</a> - Independent</li>
</ul>
<p>This post has been a part of work undertaken by my employer <a href="http://www.collabora.com">Collabora</a>,
and has been funded by <a href="http://zii.aero">Zodiac Inflight Innovations</a>.</p>Android: Getting up and running on the iMX62017-04-27T00:00:00+02:002017-04-27T00:00:00+02:00Robert Fosstag:memcpy.io,2017-04-27:/android-getting-up-and-running-on-the-imx6.html<p>Since the hardware very much matters this is going to be divided into a few parts, the common steps and the hardware specific ones.</p>
<p>This post is a bit of a living document and will be changed over time, and if you have any questions about it, please reach out through email (robert.foss at collabora.com) or irc (tomeu or robertfoss on #dri-devel on freenode).</p>
<div class="highlight"><pre><span></span><code><span class="nl">Changelog</span><span class="p">:</span>
<span class="mi">2017</span><span class="o">-</span><span class="mi">04</span><span class="o">-</span><span class="mi">27</span><span class="err">:</span><span class="w"> </span><span class="n">build_android</span><span class="p">.</span><span class="n">sh</span><span class="p">,</span><span class="w"> </span><span class="n">setup_sdcard</span><span class="p">.</span><span class="nl">sh</span><span class="p">:</span><span class="w"> </span><span class="n">Added</span><span class="w"> </span><span class="o">-</span><span class="n">b</span><span class="w"> </span><span class="o">[</span><span class="n">device</span><span class="o">]</span><span class="w"> </span><span class="n">support</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="n">build_android</span><span class="p">.</span><span class="n">sh</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">setup_sdcard</span><span class="p">.</span><span class="n">sh</span>
<span class="mi">2017</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">02</span><span class="err">:</span><span class="w"> </span><span class="n">build_android</span><span class="p">.</span><span class="nl">sh</span><span class="p">:</span><span class="w"> </span><span class="n">Don</span><span class="err">'</span><span class="n">t</span><span class="w"> </span><span class="k">write</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="n">SD</span><span class="o">-</span><span class="n">card</span><span class="w"> </span><span class="k">without</span><span class="w"> </span><span class="o">-</span><span class="n">b</span><span class="w"> </span><span class="k">option</span>
<span class="mi">2017</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">04</span><span class="err">:</span><span class="w"> </span><span class="n">Switch</span><span class="w"> </span><span class="n">git</span><span class="w"> </span><span class="n">repo</span><span class="w"> </span><span class="n">urls</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="n">shared</span><span class="w"> </span><span class="n">repository</span>
<span class="mi">2017</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">09</span><span class="err">:</span><span class="w"> </span><span class="k">Add</span><span class="w"> </span><span class="n">compiler</span><span class="w"> </span><span class="n">installation</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="n">apt</span><span class="o">-</span><span class="k">get</span>
<span class="mi">2017</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">09</span><span class="err">:</span><span class="w"> </span><span class="n">Re</span><span class="o">-</span><span class="n">ordered</span><span class="w"> </span><span class="ow">some</span><span class="w"> </span><span class="n">instructions</span>
<span class="mi">2017 …</span></code></pre></div><p>Since the hardware very much matters this is going to be divided into a few parts, the common steps and the hardware specific ones.</p>
<p>This post is a bit of a living document and will be changed over time, and if you have any questions about it, please reach out through email (robert.foss at collabora.com) or irc (tomeu or robertfoss on #dri-devel on freenode).</p>
<div class="highlight"><pre><span></span><code><span class="nl">Changelog</span><span class="p">:</span>
<span class="mi">2017</span><span class="o">-</span><span class="mi">04</span><span class="o">-</span><span class="mi">27</span><span class="err">:</span><span class="w"> </span><span class="n">build_android</span><span class="p">.</span><span class="n">sh</span><span class="p">,</span><span class="w"> </span><span class="n">setup_sdcard</span><span class="p">.</span><span class="nl">sh</span><span class="p">:</span><span class="w"> </span><span class="n">Added</span><span class="w"> </span><span class="o">-</span><span class="n">b</span><span class="w"> </span><span class="o">[</span><span class="n">device</span><span class="o">]</span><span class="w"> </span><span class="n">support</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="n">build_android</span><span class="p">.</span><span class="n">sh</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">setup_sdcard</span><span class="p">.</span><span class="n">sh</span>
<span class="mi">2017</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">02</span><span class="err">:</span><span class="w"> </span><span class="n">build_android</span><span class="p">.</span><span class="nl">sh</span><span class="p">:</span><span class="w"> </span><span class="n">Don</span><span class="err">'</span><span class="n">t</span><span class="w"> </span><span class="k">write</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="n">SD</span><span class="o">-</span><span class="n">card</span><span class="w"> </span><span class="k">without</span><span class="w"> </span><span class="o">-</span><span class="n">b</span><span class="w"> </span><span class="k">option</span>
<span class="mi">2017</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">04</span><span class="err">:</span><span class="w"> </span><span class="n">Switch</span><span class="w"> </span><span class="n">git</span><span class="w"> </span><span class="n">repo</span><span class="w"> </span><span class="n">urls</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="n">shared</span><span class="w"> </span><span class="n">repository</span>
<span class="mi">2017</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">09</span><span class="err">:</span><span class="w"> </span><span class="k">Add</span><span class="w"> </span><span class="n">compiler</span><span class="w"> </span><span class="n">installation</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="n">apt</span><span class="o">-</span><span class="k">get</span>
<span class="mi">2017</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">09</span><span class="err">:</span><span class="w"> </span><span class="n">Re</span><span class="o">-</span><span class="n">ordered</span><span class="w"> </span><span class="ow">some</span><span class="w"> </span><span class="n">instructions</span>
<span class="mi">2017</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">10</span><span class="err">:</span><span class="w"> </span><span class="k">Add</span><span class="w"> </span><span class="n">java</span><span class="w"> </span><span class="n">installation</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="n">apt</span><span class="o">-</span><span class="k">get</span>
<span class="mi">2017</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">19</span><span class="err">:</span><span class="w"> </span><span class="n">Change</span><span class="w"> </span><span class="n">paths</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="n">android</span><span class="o">-</span><span class="n">etnaviv</span><span class="w"> </span><span class="n">instead</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">client</span>
<span class="mi">2017</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">19</span><span class="err">:</span><span class="w"> </span><span class="n">Change</span><span class="w"> </span><span class="n">kernel</span><span class="w"> </span><span class="n">branch</span>
<span class="mi">2017</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">19</span><span class="err">:</span><span class="w"> </span><span class="k">Add</span><span class="w"> </span><span class="o">-</span><span class="n">d</span><span class="p">,</span><span class="w"> </span><span class="n">device</span><span class="w"> </span><span class="n">flag</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">info</span><span class="w"> </span><span class="n">about</span><span class="w"> </span><span class="n">it</span>
<span class="mi">2017</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">19</span><span class="err">:</span><span class="w"> </span><span class="k">Add</span><span class="w"> </span><span class="n">sabrelite</span><span class="w"> </span><span class="n">board</span><span class="w"> </span><span class="n">info</span>
<span class="mi">2017</span><span class="o">-</span><span class="mi">06</span><span class="o">-</span><span class="mi">03</span><span class="err">:</span><span class="w"> </span><span class="k">Add</span><span class="w"> </span><span class="n">more</span><span class="w"> </span><span class="n">apt</span><span class="o">-</span><span class="k">get</span><span class="w"> </span><span class="n">packages</span>
<span class="mi">2017</span><span class="o">-</span><span class="mi">06</span><span class="o">-</span><span class="mi">10</span><span class="err">:</span><span class="w"> </span><span class="k">Add</span><span class="w"> </span><span class="n">lzop</span><span class="w"> </span><span class="n">apt</span><span class="o">-</span><span class="k">get</span><span class="w"> </span><span class="n">packages</span>
</code></pre></div>
<h2>Common steps</h2>
<div class="highlight"><pre><span></span><code><span class="c1"># Install dependencies</span>
<span class="n">sudo</span><span class="w"> </span><span class="n">apt</span><span class="w"> </span><span class="n">install</span><span class="w"> </span><span class="n">u</span><span class="o">-</span><span class="n">boot</span><span class="o">-</span><span class="n">tools</span><span class="w"> </span><span class="n">gcc</span><span class="o">-</span><span class="n">arm</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">gnueabihf</span><span class="w"> </span><span class="n">openjdk</span><span class="o">-</span><span class="mi">8</span><span class="o">-</span><span class="n">jdk</span><span class="w"> </span><span class="n">android</span><span class="o">-</span><span class="n">tools</span><span class="o">-</span><span class="n">fsutils</span><span class="w"> </span><span class="n">python</span><span class="o">-</span><span class="n">mako</span><span class="w"> </span><span class="n">git</span><span class="o">-</span><span class="n">core</span><span class="w"> </span><span class="n">gnupg</span><span class="w"> </span><span class="n">flex</span><span class="w"> </span><span class="n">bison</span><span class="w"> </span><span class="n">gperf</span><span class="w"> </span><span class="n">build</span><span class="o">-</span><span class="n">essential</span><span class="w"> </span><span class="n">zip</span><span class="w"> </span><span class="n">curl</span><span class="w"> </span><span class="n">zlib1g</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">gcc</span><span class="o">-</span><span class="n">multilib</span><span class="w"> </span><span class="n">g</span><span class="o">++-</span><span class="n">multilib</span><span class="w"> </span><span class="n">libc6</span><span class="o">-</span><span class="n">dev</span><span class="o">-</span><span class="n">i386</span><span class="w"> </span><span class="n">lib32ncurses5</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">x11proto</span><span class="o">-</span><span class="n">core</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libx11</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">lib32z</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">ccache</span><span class="w"> </span><span class="n">libgl1</span><span class="o">-</span><span class="n">mesa</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libxml2</span><span class="o">-</span><span class="n">utils</span><span class="w"> </span><span class="n">xsltproc</span><span class="w"> </span><span class="n">unzip</span><span class="w"> </span><span class="n">lzop</span>
<span class="n">mkdir</span><span class="w"> </span><span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">android</span>
<span class="n">cd</span><span class="w"> </span><span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">android</span>
<span class="n">repo</span><span class="w"> </span><span class="n">init</span><span class="w"> </span><span class="o">-</span><span class="n">u</span><span class="w"> </span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">android</span><span class="o">.</span><span class="n">googlesource</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">platform</span><span class="o">/</span><span class="n">manifest</span><span class="w"> </span><span class="o">-</span><span class="n">b</span><span class="w"> </span><span class="n">android</span><span class="o">-</span><span class="mf">7.1</span><span class="o">.</span><span class="mi">1</span><span class="n">_r28</span>
<span class="n">cd</span><span class="w"> </span><span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">android</span><span class="o">/.</span><span class="n">repo</span>
<span class="n">git</span><span class="w"> </span><span class="n">clone</span><span class="w"> </span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">customer</span><span class="o">-</span><span class="n">git</span><span class="o">.</span><span class="n">collabora</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">git</span><span class="o">/</span><span class="n">android</span><span class="o">-</span><span class="n">etnaviv</span><span class="o">/</span><span class="n">android_manifest</span><span class="o">.</span><span class="n">git</span><span class="w"> </span><span class="n">local_manifests</span><span class="w"> </span><span class="o">-</span><span class="n">b</span><span class="w"> </span><span class="n">android</span><span class="o">-</span><span class="n">etnaviv</span>
<span class="n">repo</span><span class="w"> </span><span class="n">sync</span><span class="w"> </span><span class="o">-</span><span class="n">j10</span>
<span class="n">mkdir</span><span class="w"> </span><span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">imx6_android</span>
<span class="n">cd</span><span class="w"> </span><span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">imx6_android</span>
<span class="c1"># Fetch Kconfig, bootloaders and some scripts</span>
<span class="n">git</span><span class="w"> </span><span class="n">clone</span><span class="w"> </span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">customer</span><span class="o">-</span><span class="n">git</span><span class="o">.</span><span class="n">collabora</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">git</span><span class="o">/</span><span class="n">android</span><span class="o">-</span><span class="n">etnaviv</span><span class="o">/</span><span class="n">android</span><span class="o">-</span><span class="n">etnaviv</span><span class="o">.</span><span class="n">git</span><span class="w"> </span><span class="o">.</span>
<span class="c1"># Fetch the Linux Kernel</span>
<span class="n">git</span><span class="w"> </span><span class="n">clone</span><span class="w"> </span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">customer</span><span class="o">-</span><span class="n">git</span><span class="o">.</span><span class="n">collabora</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">git</span><span class="o">/</span><span class="n">android</span><span class="o">-</span><span class="n">etnaviv</span><span class="o">/</span><span class="n">linux</span><span class="o">.</span><span class="n">git</span><span class="w"> </span><span class="o">-</span><span class="n">b</span><span class="w"> </span><span class="n">android</span><span class="o">-</span><span class="n">etnaviv</span>
<span class="c1"># This will destroy all data on /dev/mmcblk0 and</span>
<span class="c1"># create boot/system/cache/data partitions</span>
<span class="o">./</span><span class="n">setup_sdcard</span><span class="o">.</span><span class="n">sh</span><span class="w"> </span><span class="o">-</span><span class="n">b</span><span class="w"> </span><span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">mmcblk0</span>
</code></pre></div>
<h2>Hardware: iMX6 Sabre</h2>
<h3>Build Android and Linux</h3>
<div class="highlight"><pre><span></span><code># Build android, the kernel, and flash it onto an SD-card
# Run build_android with the correct -d flag
./build_android.sh -b /dev/mmcblk0 -d imx6q-sabre
./build_android.sh -b /dev/mmcblk0 -d imx6qp-sabre
</code></pre></div>
<h3>Start Android</h3>
<p>The SD-card can now be put into the SD3 slot and
the device can be restarted.</p>
<h2>Hardware: iMX6 Sabrelite</h2>
<h3>Build Android and Linux</h3>
<div class="highlight"><pre><span></span><code># Build android, the kernel, and flash it onto an SD-card
# Run build_android with the correct -d flag
./build_android.sh -b /dev/mmcblk0 -d imx6q-sabrelite
</code></pre></div>
<h3>Start Android</h3>
<p>The micro-sd card can now be put into the micro-sd slot and
the device can be restarted.</p>
<h2>Hardware: RDU2</h2>
<h3>Build Android and Linux</h3>
<div class="highlight"><pre><span></span><code># Build android, the kernel, and flash it onto an SD-card
# Run build_android with the correct -d flag
./build_android.sh -b /dev/mmcblk0 -d imx6q-zii-rdu2
./build_android.sh -b /dev/mmcblk0 -d imx6qp-zii-rdu2
</code></pre></div>
<h3>Install the bootloader</h3>
<div class="highlight"><pre><span></span><code><span class="c1"># Depending if you have a >=13" version of the RDU2</span>
<span class="c1"># use the imx6qp, if <13" then use the imx6q</span>
<span class="n">IMX6_TYPE</span><span class="o">=</span><span class="n">imx6q</span>
<span class="n">IMX6_TYPE</span><span class="o">=</span><span class="n">imx6qp</span>
<span class="n">BAREBOX</span><span class="o">=</span><span class="s2">"zodiac/barebox-zii-${IMX6_TYPE}-rdu2.img"</span>
<span class="c1"># Flash bootloader to SD-card</span>
<span class="n">dd</span><span class="w"> </span><span class="k">if</span><span class="o">=$</span><span class="p">{</span><span class="n">BAREBOX</span><span class="p">}</span><span class="w"> </span><span class="n">of</span><span class="o">=/</span><span class="n">dev</span><span class="o">/</span><span class="n">mmcblk0</span><span class="w"> </span><span class="n">bs</span><span class="o">=</span><span class="mi">1</span><span class="n">k</span>
<span class="n">sync</span>
<span class="c1"># Put SD-card in the middle-most slot on the RDU2</span>
<span class="c1"># Install lrzsz, since it is used for a ymodem upload</span>
<span class="n">sudo</span><span class="w"> </span><span class="n">apt</span><span class="w"> </span><span class="n">install</span><span class="w"> </span><span class="n">lrzsz</span>
<span class="c1"># Connect to serial device /dev/ttyUSB2 and</span>
<span class="c1"># /dev/ttyUSB3 with minicom</span>
<span class="c1"># The numbering assumes the RDU2 is the only serial</span>
<span class="c1"># serial device connected</span>
<span class="n">sudo</span><span class="w"> </span><span class="n">minicom</span><span class="w"> </span><span class="o">-</span><span class="n">s</span>
<span class="w"> </span><span class="o">+------------------------------------------+</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">Serial</span><span class="w"> </span><span class="n">Device</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">ttyUSB3</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">Lockfile</span><span class="w"> </span><span class="n">Location</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="o">/</span><span class="k">var</span><span class="o">/</span><span class="n">lock</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">Callin</span><span class="w"> </span><span class="n">Program</span><span class="w"> </span><span class="p">:</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">D</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">Callout</span><span class="w"> </span><span class="n">Program</span><span class="w"> </span><span class="p">:</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">Bps</span><span class="o">/</span><span class="n">Par</span><span class="o">/</span><span class="n">Bits</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="mi">115200</span><span class="w"> </span><span class="mi">8</span><span class="n">N1</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">Hardware</span><span class="w"> </span><span class="n">Flow</span><span class="w"> </span><span class="n">Control</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">No</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">Software</span><span class="w"> </span><span class="n">Flow</span><span class="w"> </span><span class="n">Control</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">No</span>
<span class="w"> </span><span class="o">|</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">Change</span><span class="w"> </span><span class="n">which</span><span class="w"> </span><span class="n">setting</span><span class="err">?</span>
<span class="w"> </span><span class="o">+------------------------------------------+</span>
<span class="c1"># Connect to Quark console on /dev/ttyUSB3</span>
<span class="c1"># Set boot SD-card as boot source </span>
<span class="c1">#HostBoot s 0</span>
<span class="n">reset</span>
<span class="c1"># Restart device, connect to barebox loaded just loaded</span>
<span class="c1"># from the SD-card on /dev/ttyUSB2</span>
<span class="n">pic_setwdt</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">60</span>
<span class="n">loady</span>
<span class="c1"># Using the minicom quickly initiate a ymodem file</span>
<span class="c1"># of the same barebox image you wrote to the SD-card</span>
<span class="c1"># Be quick, the upload will timeout after a few seconds</span>
<span class="c1"># Write the bootloader to SPI NOR</span>
<span class="n">erase</span><span class="w"> </span><span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">m25p0</span><span class="o">.</span><span class="n">barebox</span>
<span class="c1"># Depending on your RDU2 type flash one of the following</span>
<span class="n">cp</span><span class="w"> </span><span class="n">barebox</span><span class="o">-</span><span class="n">zii</span><span class="o">-</span><span class="n">imx6q</span><span class="o">-</span><span class="n">rdu2</span><span class="o">.</span><span class="n">img</span><span class="w"> </span><span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">m25p0</span><span class="o">.</span><span class="n">barebox</span>
<span class="c1"># Or</span>
<span class="n">cp</span><span class="w"> </span><span class="n">barebox</span><span class="o">-</span><span class="n">zii</span><span class="o">-</span><span class="n">imx6qp</span><span class="o">-</span><span class="n">rdu2</span><span class="o">.</span><span class="n">img</span><span class="w"> </span><span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">m25p0</span><span class="o">.</span><span class="n">barebox</span>
<span class="c1"># Connect to the Quark console on /dev/ttyUSB3 again</span>
<span class="c1"># Set SPI NOR as the boot source</span>
<span class="c1">#HostBoot s 2</span>
<span class="n">reset</span>
<span class="c1"># Connect to the barebox console on /dev/ttyUSB2 again</span>
<span class="c1"># Edit configuration to automatically boot from mmc:</span>
<span class="n">sedit</span><span class="w"> </span><span class="o">/</span><span class="n">env</span><span class="o">/</span><span class="n">config</span>
<span class="k">export</span><span class="w"> </span><span class="n">global</span><span class="o">.</span><span class="n">boot</span><span class="o">.</span><span class="n">default</span><span class="o">=/</span><span class="n">env</span><span class="o">/</span><span class="n">boot</span><span class="o">/</span><span class="n">mmc</span>
<span class="k">export</span><span class="w"> </span><span class="n">global</span><span class="o">.</span><span class="n">bootm</span><span class="o">.</span><span class="n">image</span><span class="o">=/</span><span class="n">mnt</span><span class="o">/</span><span class="n">mmc1</span><span class="o">.</span><span class="mi">0</span><span class="o">/</span><span class="n">android_zImage</span>
<span class="k">export</span><span class="w"> </span><span class="n">global</span><span class="o">.</span><span class="n">bootm</span><span class="o">.</span><span class="n">initrd</span><span class="o">=/</span><span class="n">mnt</span><span class="o">/</span><span class="n">mmc1</span><span class="o">.</span><span class="mi">0</span><span class="o">/</span><span class="n">android_ramdisk</span><span class="o">.</span><span class="n">img</span><span class="o">.</span><span class="n">gz</span>
<span class="k">export</span><span class="w"> </span><span class="n">global</span><span class="o">.</span><span class="n">bootm</span><span class="o">.</span><span class="n">oftree</span><span class="o">=/</span><span class="n">mnt</span><span class="o">/</span><span class="n">mmc1</span><span class="o">.</span><span class="mi">0</span><span class="o">/</span><span class="n">imx6qp</span><span class="o">-</span><span class="n">zii</span><span class="o">-</span><span class="n">rdu2</span><span class="o">.</span><span class="n">dtb</span>
<span class="k">export</span><span class="w"> </span><span class="n">global</span><span class="o">.</span><span class="n">linux</span><span class="o">.</span><span class="n">bootargs</span><span class="o">.</span><span class="n">base</span><span class="o">=</span><span class="s2">"console=ttymxc0,115200 console=tty0 rw rootwait ip=dhcp buildvariant=userdebug debug ignore_loglevel root=/dev/mmcblk0p2 rootfstype=ext4 rootwait init=/init printk.devkmsg=on verbose enforcing=0 androidboot.selinux=permissive drm.debug=0x00"</span>
<span class="n">sedit</span><span class="w"> </span><span class="o">/</span><span class="n">env</span><span class="o">/</span><span class="n">boot</span><span class="o">/</span><span class="n">mmc</span>
<span class="c1">#!/bin/sh</span>
<span class="n">detect</span><span class="w"> </span><span class="n">mmc1</span>
<span class="n">mkdir</span><span class="w"> </span><span class="o">-</span><span class="n">p</span><span class="w"> </span><span class="o">/</span><span class="n">mnt</span><span class="o">/</span><span class="n">mmc1</span><span class="o">.</span><span class="mi">0</span>
<span class="n">automount</span><span class="w"> </span><span class="o">-</span><span class="n">d</span><span class="w"> </span><span class="o">/</span><span class="n">mnt</span><span class="o">/</span><span class="n">mmc1</span><span class="o">.</span><span class="mi">0</span><span class="w"> </span><span class="s1">'mount /dev/mmc1.0 /mnt/mmc1.0'</span>
<span class="n">bootm</span>
<span class="n">pic_setwdt</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">60</span><span class="w"> </span><span class="c1"># Disable watchdog</span>
<span class="n">exit</span>
</code></pre></div>
<h3>Start Android</h3>
<p>The SD-card created in the common steps can now be put into
the middlemost slot and the device can be restarted.</p>
<h2>Thanks</h2>
<p>This work is built on efforts by a lot people:</p>
<ul>
<li>Pengutronix who's been doing i.MX6 platform work.</li>
<li>Christian Gmeiner, Wladimir Van Der Laan, and the other etanviv developers.</li>
<li>Rob Herring at Linaro for getting the ball rolling with AOSP for Zii.</li>
<li>Andrey Smirnov for driver support for the RDU2 such as i.MX6 PCI, ARM PL310 L2 Cache controller, RTC, and other i.MX6qp driver fixups.</li>
</ul>
<p>This post has been a part of work undertaken by my employer <a href="http://www.collabora.com">Collabora</a>.</p>Android: Changing the bootanimation2017-04-20T00:00:00+02:002017-04-20T00:00:00+02:00Robert Fosstag:memcpy.io,2017-04-20:/android-changing-the-bootanimation.html<p>There exists <a href="https://android.googlesource.com/platform/frameworks/base/+/master/cmds/bootanimation/FORMAT.md">official documentation</a>
for how to create a custom boot animation, but unfortunately it is lacking
in actual examples.</p>
<p>So this guide is a bit more hands on.</p>
<h2>Structure of bootanimation.zip</h2>
<p>Without covering too much of the same gound as the documentation,
let's have a quick look at what is in a simple bootanimation.zip.</p>
<div class="highlight"><pre><span></span><code><span class="err">$</span><span class="w"> </span><span class="n">ls</span><span class="w"> </span><span class="o">-</span><span class="n">la</span><span class="w"> </span><span class="n">bootanimation</span>
<span class="n">total</span><span class="w"> </span><span class="mi">28</span>
<span class="n">drwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="mi">4096</span><span class="w"> </span><span class="n">Apr</span><span class="w"> </span><span class="mi">19</span><span class="w"> </span><span class="mi">22</span><span class="err">:</span><span class="mi">39</span><span class="w"> </span><span class="p">.</span>
<span class="n">drwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span><span class="w"> </span><span class="mi">8</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="mi">4096</span><span class="w"> </span><span class="n">Apr</span><span class="w"> </span><span class="mi">19</span><span class="w"> </span><span class="mi">22</span><span class="err">:</span><span class="mi">39</span><span class="w"> </span><span class="p">..</span>
<span class="o">-</span><span class="n">rw</span><span class="o">-</span><span class="n">r</span><span class="o">--</span><span class="n">r</span><span class="o">--</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="mi">92</span><span class="w"> </span><span class="n">Apr</span><span class="w"> </span><span class="mi">19</span><span class="w"> </span><span class="mi">15</span><span class="err">:</span><span class="mi">21</span><span class="w"> </span><span class="k">desc</span><span class="p">.</span><span class="n">txt</span>
<span class="n">drwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="mi">4096</span><span class="w"> </span><span class="n">Apr</span><span class="w"> </span><span class="mi">19</span><span class="w"> </span><span class="mi">12</span><span class="err">:</span><span class="mi">44</span><span class="w"> </span><span class="n">part0</span>
<span class="n">drwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="mi">4096</span><span class="w"> </span><span class="n">Apr</span><span class="w"> </span><span class="mi">19</span><span class="w"> </span><span class="mi">12</span><span class="err">:</span><span class="mi">45</span><span class="w"> </span><span class="n">part1</span>
<span class="err">$</span><span class="w"> </span><span class="n">cat</span><span class="w"> </span><span class="n">bootanimation</span><span class="o">/</span><span class="k">desc</span><span class="p">.</span><span class="n">txt …</span></code></pre></div><p>There exists <a href="https://android.googlesource.com/platform/frameworks/base/+/master/cmds/bootanimation/FORMAT.md">official documentation</a>
for how to create a custom boot animation, but unfortunately it is lacking
in actual examples.</p>
<p>So this guide is a bit more hands on.</p>
<h2>Structure of bootanimation.zip</h2>
<p>Without covering too much of the same gound as the documentation,
let's have a quick look at what is in a simple bootanimation.zip.</p>
<div class="highlight"><pre><span></span><code><span class="err">$</span><span class="w"> </span><span class="n">ls</span><span class="w"> </span><span class="o">-</span><span class="n">la</span><span class="w"> </span><span class="n">bootanimation</span>
<span class="n">total</span><span class="w"> </span><span class="mi">28</span>
<span class="n">drwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="mi">4096</span><span class="w"> </span><span class="n">Apr</span><span class="w"> </span><span class="mi">19</span><span class="w"> </span><span class="mi">22</span><span class="err">:</span><span class="mi">39</span><span class="w"> </span><span class="p">.</span>
<span class="n">drwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span><span class="w"> </span><span class="mi">8</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="mi">4096</span><span class="w"> </span><span class="n">Apr</span><span class="w"> </span><span class="mi">19</span><span class="w"> </span><span class="mi">22</span><span class="err">:</span><span class="mi">39</span><span class="w"> </span><span class="p">..</span>
<span class="o">-</span><span class="n">rw</span><span class="o">-</span><span class="n">r</span><span class="o">--</span><span class="n">r</span><span class="o">--</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="mi">92</span><span class="w"> </span><span class="n">Apr</span><span class="w"> </span><span class="mi">19</span><span class="w"> </span><span class="mi">15</span><span class="err">:</span><span class="mi">21</span><span class="w"> </span><span class="k">desc</span><span class="p">.</span><span class="n">txt</span>
<span class="n">drwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="mi">4096</span><span class="w"> </span><span class="n">Apr</span><span class="w"> </span><span class="mi">19</span><span class="w"> </span><span class="mi">12</span><span class="err">:</span><span class="mi">44</span><span class="w"> </span><span class="n">part0</span>
<span class="n">drwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="mi">4096</span><span class="w"> </span><span class="n">Apr</span><span class="w"> </span><span class="mi">19</span><span class="w"> </span><span class="mi">12</span><span class="err">:</span><span class="mi">45</span><span class="w"> </span><span class="n">part1</span>
<span class="err">$</span><span class="w"> </span><span class="n">cat</span><span class="w"> </span><span class="n">bootanimation</span><span class="o">/</span><span class="k">desc</span><span class="p">.</span><span class="n">txt</span><span class="w"> </span>
<span class="mi">1920</span><span class="w"> </span><span class="mi">1080</span><span class="w"> </span><span class="mi">30</span><span class="w"> </span><span class="err">#</span><span class="w"> </span><span class="n">WIDTH</span><span class="w"> </span><span class="n">HEIGHT</span><span class="w"> </span><span class="n">FPS</span>
<span class="n">c</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="mi">15</span><span class="w"> </span><span class="n">part0</span><span class="w"> </span><span class="n">FFFFFF</span><span class="w"> </span><span class="err">#</span><span class="w"> </span><span class="n">TYPE</span><span class="w"> </span><span class="nf">COUNT</span><span class="w"> </span><span class="n">PAUSE</span><span class="w"> </span><span class="k">PATH</span><span class="w"> </span><span class="o">[</span><span class="n">#RGBHEX</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">CLOCK</span><span class="o">]</span>
<span class="n">c</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="mi">15</span><span class="w"> </span><span class="n">part1</span><span class="w"> </span><span class="n">FFFFFF</span><span class="w"> </span><span class="err">#</span><span class="w"> </span><span class="n">TYPE</span><span class="w"> </span><span class="nf">COUNT</span><span class="w"> </span><span class="n">PAUSE</span><span class="w"> </span><span class="k">PATH</span><span class="w"> </span><span class="o">[</span><span class="n">#RGBHEX</span><span class="o">]</span><span class="w"> </span><span class="o">[</span><span class="n">CLOCK</span><span class="o">]</span>
<span class="n">ls</span><span class="w"> </span><span class="o">-</span><span class="n">la</span><span class="w"> </span><span class="n">bootanimation</span><span class="o">/</span><span class="n">part0</span><span class="w"> </span>
<span class="n">total</span><span class="w"> </span><span class="mi">28</span>
<span class="n">drwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="mi">4096</span><span class="w"> </span><span class="n">Apr</span><span class="w"> </span><span class="mi">19</span><span class="w"> </span><span class="mi">12</span><span class="err">:</span><span class="mi">44</span><span class="w"> </span><span class="p">.</span>
<span class="n">drwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span><span class="w"> </span><span class="mi">6</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="mi">4096</span><span class="w"> </span><span class="n">Apr</span><span class="w"> </span><span class="mi">19</span><span class="w"> </span><span class="mi">15</span><span class="err">:</span><span class="mi">40</span><span class="w"> </span><span class="p">..</span>
<span class="o">-</span><span class="n">rw</span><span class="o">-</span><span class="n">r</span><span class="o">--</span><span class="n">r</span><span class="o">--</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="mi">10688</span><span class="w"> </span><span class="n">Apr</span><span class="w"> </span><span class="mi">19</span><span class="w"> </span><span class="mi">12</span><span class="err">:</span><span class="mi">31</span><span class="w"> </span><span class="mf">0000.</span><span class="n">png</span>
<span class="o">-</span><span class="n">rw</span><span class="o">-</span><span class="n">r</span><span class="o">--</span><span class="n">r</span><span class="o">--</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="mi">10688</span><span class="w"> </span><span class="n">Apr</span><span class="w"> </span><span class="mi">19</span><span class="w"> </span><span class="mi">12</span><span class="err">:</span><span class="mi">31</span><span class="w"> </span><span class="mf">0001.</span><span class="n">png</span>
<span class="o">-</span><span class="n">rw</span><span class="o">-</span><span class="n">r</span><span class="o">--</span><span class="n">r</span><span class="o">--</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="mi">10688</span><span class="w"> </span><span class="n">Apr</span><span class="w"> </span><span class="mi">19</span><span class="w"> </span><span class="mi">12</span><span class="err">:</span><span class="mi">31</span><span class="w"> </span><span class="mf">0002.</span><span class="n">png</span>
<span class="o">-</span><span class="n">rw</span><span class="o">-</span><span class="n">r</span><span class="o">--</span><span class="n">r</span><span class="o">--</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="n">hottuna</span><span class="w"> </span><span class="mi">10688</span><span class="w"> </span><span class="n">Apr</span><span class="w"> </span><span class="mi">19</span><span class="w"> </span><span class="mi">12</span><span class="err">:</span><span class="mi">31</span><span class="w"> </span><span class="mf">0003.</span><span class="n">png</span>
<span class="o">-</span><span class="n">rw</span><span class="o">-</span><span class="n">r</span><span class="c1">--r-- 1 hottuna hottuna 10688 Apr 19 12:31 XXXX.png</span>
</code></pre></div>
<p>Note that the "#" comments are mine and not actually present in the files.</p>
<p>An important thing to note with the zip file is needs to have compression
turned off.</p>
<h2>Switch bootanimation</h2>
<p>Download <a href="/files/2017-04-20/bootanimation.zip">bootanimation.zip</a>.</p>
<div class="highlight"><pre><span></span><code>unzip bootanimation.zip
cd bootanimation
<span class="gh">#</span> Edit desc.txt and partN folders to your needs
zip -0qry -i \*.txt \*.png \*.wav @ ../bootanimation.zip <span class="gs">*.txt part*</span>
<span class="gh">#</span> Option 1, use adb to send bootanimation.zip
adb root
adb remount
adb push bootanimation.zip /system/media/bootanimation.zip
<span class="gh">#</span> Option 2, bake bootanimation.zip into your AOSP build
cp bootanimation.zip /opt/aosp/out/target/product/linaro_arm/system/bootanimation.zip
./your_favorite_buildscript_here.sh
</code></pre></div>
<h2>References</h2>
<p><a href="https://android.googlesource.com/platform/frameworks/base/+/master/cmds/bootanimation/FORMAT.md">bootanimation documentation</a></p>
<h2>Thanks</h2>
<p>This post has been a part of work undertaken by my employer <a href="http://www.collabora.com">Collabora</a>.</p>Android: Enabling mainline graphics2017-03-28T15:18:00+02:002017-03-28T15:18:00+02:00Robert Fosstag:memcpy.io,2017-03-28:/android-enabling-mainline-graphics.html<p>The <a href="https://source.android.com/devices/graphics/implement-hwc.html">HWC</a>
(Hardware Composer) API is used by SurfaceFlinger for compositing layers to the screen.
The HWC abstracts objects such as overlays and 2D blitters and helps offload some work
that would normally be done with OpenGL.
SurfaceFlinger on the other hand accepts buffers from multiple sources, composites them,
and sends them to the display.</p>
<p><a href="/images/2017-03-28_android_graphics_stack.png"><img alt="Alt text" src="/images/2017-03-28_android_graphics_stack.png" title="Android Graphics Stack"></a></p>
<p>The above graphic depicts the traditional Android graphics stack.</p>
<p>This is where drm_hwcomposer comes into play. Since the mainline kernel graphics stack
doesn't offer the HWC API, drm_hwcomposer is introduced to interface with the mainline
graphics stack through mesa and libdrm. Before this work drm_hwcomposer only offered the
HWC1 API.
Since Android 7.0 version 2 of the HWC API is used by SurfaceFlinger. HWC2 differs in a few
ways …</p><p>The <a href="https://source.android.com/devices/graphics/implement-hwc.html">HWC</a>
(Hardware Composer) API is used by SurfaceFlinger for compositing layers to the screen.
The HWC abstracts objects such as overlays and 2D blitters and helps offload some work
that would normally be done with OpenGL.
SurfaceFlinger on the other hand accepts buffers from multiple sources, composites them,
and sends them to the display.</p>
<p><a href="/images/2017-03-28_android_graphics_stack.png"><img alt="Alt text" src="/images/2017-03-28_android_graphics_stack.png" title="Android Graphics Stack"></a></p>
<p>The above graphic depicts the traditional Android graphics stack.</p>
<p>This is where drm_hwcomposer comes into play. Since the mainline kernel graphics stack
doesn't offer the HWC API, drm_hwcomposer is introduced to interface with the mainline
graphics stack through mesa and libdrm. Before this work drm_hwcomposer only offered the
HWC1 API.
Since Android 7.0 version 2 of the HWC API is used by SurfaceFlinger. HWC2 differs in a few
ways from the previous version, for example the semantics of fence support were changed and
the GPU can now be used as a fallback when compositing layers.</p>
<p>Up until recently the mainline kernel lacked the fence primitive offered by Android
used in HWC1 and HWC2. But after my fellow Collaboran Gustavo Padovan's work on
<a href="http://padovan.org/blog/2016/09/mainline-explicit-fencing-part-1/">adding fence support</a>
to the mainline kernel was upstreamed in
<a href="http://padovan.org/blog/2017/02/collabora-contributions-to-linux-kernel-4-10/">v4.10</a>,
the mainline kernel now has fence support equivalent to that of Android.</p>
<p>The new fence support enabled work on drm_hwcomposer to add HWC2 support.
And with it we are now able to boot Android on the db410c running the freedreno driver.
But in theory it should work on any mainline kernel graphics stack enabled GPU.</p>
<p>Currently the work is being upstreamed to the
<a href="https://chromium.googlesource.com/chromiumos/drm_hwcomposer/">ChromiumOS repo</a>
which is the official upstream for drm_hwcomposer.</p>
<p>A number of projects have seen contributions 8in order to enable this work:</p>
<ul>
<li>kernel - sync_file, in-fence and out-fence support added.</li>
<li>libdrm - fence support added.</li>
<li>mesa - support for passing fences added.</li>
<li>intel-gpu-tools - sync and fence tests added.</li>
<li>drm_hwcomposer - HWC2 and fence support added.</li>
</ul>
<h2>Thanks</h2>
<p>This drm_hwcomposer work is part of a long-standing collaboration between
Google's ChromeOS team and Collabora.</p>
<p>A number of people have played an important role in this work:
Gustavo Padovan, Rob Clark, Sean Paul, Zach Reizner and Rob Herring.</p>
<p>This post has been a part of work undertaken by my employer <a href="http://www.collabora.com">Collabora</a>.</p>Removing the Chromebook Write-Protect screw2017-02-27T16:55:00+01:002017-02-27T16:55:00+01:00Robert Fosstag:memcpy.io,2017-02-27:/removing-the-chromebook-write-protect-screw.html<p>This post will look specifically at removing the WP screw from a Chell
(HP Chromebook 13 G1) device, and verifying that it has been successfully
removed.</p>
<p>To actually flash firmware to Chromebook machines, a device called a <a href="http://dev.chromium.org/developers/how-tos/install-depot-tools">Servo</a>
is needed. While these devices aren't available publicly, they can
be produced freely or possibly requested from Google if you are contributing
code to the ChromiumOS project.</p>
<h2>Removing the Write-Protect screw</h2>
<p><a href="/images/2017-02-27_wp_screw.jpg"><img alt="Alt text" src="/images/2017-02-27_wp_screw.jpg" title="WP screw on Chell Chromebook"></a></p>
<p>So this is what the WP screw looks like on a Chell Chromebook. This may or may
not be what you will find in other devices. But if you take a close look,
you will notice that the copper pad that the the screw attaches against is
split into parts that are bridged by a screw …</p><p>This post will look specifically at removing the WP screw from a Chell
(HP Chromebook 13 G1) device, and verifying that it has been successfully
removed.</p>
<p>To actually flash firmware to Chromebook machines, a device called a <a href="http://dev.chromium.org/developers/how-tos/install-depot-tools">Servo</a>
is needed. While these devices aren't available publicly, they can
be produced freely or possibly requested from Google if you are contributing
code to the ChromiumOS project.</p>
<h2>Removing the Write-Protect screw</h2>
<p><a href="/images/2017-02-27_wp_screw.jpg"><img alt="Alt text" src="/images/2017-02-27_wp_screw.jpg" title="WP screw on Chell Chromebook"></a></p>
<p>So this is what the WP screw looks like on a Chell Chromebook. This may or may
not be what you will find in other devices. But if you take a close look,
you will notice that the copper pad that the the screw attaches against is
split into parts that are bridged by a screw being inserted.</p>
<h2>Disable Write-Protect</h2>
<p>So this is the part that requires a <a href="http://dev.chromium.org/developers/how-tos/install-depot-tools">Servo</a> device.
And a ChromiumOS checkout, for some help setting one up, have a look at <a href="http://memcpy.io/setting-up-a-chromiumos-dev-environment.html">my previous post</a>.</p>
<div class="highlight"><pre><span></span><code><span class="c1"># Go to your ChromiumOS checkout</span>
<span class="n">cd</span><span class="w"> </span><span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">chromiumos</span>
<span class="c1"># Enter dev environment</span>
<span class="n">cros_sdk</span>
<span class="c1"># Set device variable</span>
<span class="k">export</span><span class="w"> </span><span class="n">BOARD</span><span class="o">=</span><span class="n">chell</span>
<span class="c1"># Connect to Chromebook using a Servo device</span>
<span class="n">sudo</span><span class="w"> </span><span class="n">servod</span><span class="w"> </span><span class="o">-</span><span class="n">b</span><span class="w"> </span><span class="o">$</span><span class="n">BOARD</span><span class="w"> </span><span class="o">&</span>
<span class="c1"># Disable WP</span>
<span class="c1"># This step may vary depending on the hardware of your actual Chromebook</span>
<span class="n">dut</span><span class="o">-</span><span class="n">control</span><span class="w"> </span><span class="n">fw_wp</span><span class="p">:</span><span class="n">off</span>
<span class="n">sudo</span><span class="w"> </span><span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">sbin</span><span class="o">/</span><span class="n">flashrom</span><span class="w"> </span><span class="o">-</span><span class="n">p</span><span class="w"> </span><span class="n">ft2232_spi</span><span class="p">:</span><span class="n">type</span><span class="o">=</span><span class="n">servo</span><span class="o">-</span><span class="n">v2</span><span class="w"> </span><span class="o">--</span><span class="n">wp</span><span class="o">-</span><span class="n">disable</span>
<span class="n">sudo</span><span class="w"> </span><span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">sbin</span><span class="o">/</span><span class="n">flashrom</span><span class="w"> </span><span class="o">-</span><span class="n">p</span><span class="w"> </span><span class="n">ec</span><span class="w"> </span><span class="o">--</span><span class="n">wp</span><span class="o">-</span><span class="n">disable</span>
</code></pre></div>
<h2>References</h2>
<p><a href="http://dev.chromium.org/developers/how-tos/install-depot-tools">ChromiumOS Servo</a><br>
<a href="http://memcpy.io/setting-up-a-chromiumos-dev-environment.html">Setting up a ChromiumOS dev environment</a></p>
<h2>Thanks</h2>
<p>This post has been a part of work undertaken by my employer <a href="http://www.collabora.com">Collabora</a>.</p>Precompiling APK files during Android AOSP build2017-02-22T16:55:00+01:002017-02-22T16:55:00+01:00Robert Fosstag:memcpy.io,2017-02-22:/precompiling-apk-files-during-android-aosp-build.html<h2>Enable precompilation</h2>
<div class="highlight"><pre><span></span><code><span class="nv">cd</span><span class="w"> </span><span class="o">/</span><span class="nv">opt</span><span class="o">/</span><span class="nv">aosp_checkout</span><span class="o">/</span>
<span class="nv">find</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="o">-</span><span class="nv">name</span><span class="w"> </span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">huawei</span><span class="o">/</span><span class="nv">angler</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">mini</span><span class="o">-</span><span class="nv">emulator</span><span class="o">-</span><span class="nv">x86</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">arm64</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">mini</span><span class="o">-</span><span class="nv">emulator</span><span class="o">-</span><span class="nv">x86_64</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">mini</span><span class="o">-</span><span class="nv">emulator</span><span class="o">-</span><span class="nv">armv7</span><span class="o">-</span><span class="nv">a</span><span class="o">-</span><span class="nv">neon</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">mips</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">mips64</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">x86_64</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">mini</span><span class="o">-</span><span class="nv">emulator</span><span class="o">-</span><span class="nv">arm64</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">mini</span><span class="o">-</span><span class="nv">emulator</span><span class="o">-</span><span class="nv">mips</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">x86</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">armv7</span><span class="o">-</span><span class="nv">a</span><span class="o">-</span><span class="nv">neon</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">mini</span><span class="o">-</span><span class="nv">emulator</span><span class="o">-</span><span class="nv">mips64</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">lge</span><span class="o">/</span><span class="nv">bullhead</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">linaro</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">linaro_x86_64_only</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">linaro</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">linaro_arm64</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">linaro</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">linaro_arm64_only</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">linaro</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">linaro_x86_64</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">linaro</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device …</span></code></pre></div><h2>Enable precompilation</h2>
<div class="highlight"><pre><span></span><code><span class="nv">cd</span><span class="w"> </span><span class="o">/</span><span class="nv">opt</span><span class="o">/</span><span class="nv">aosp_checkout</span><span class="o">/</span>
<span class="nv">find</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="o">-</span><span class="nv">name</span><span class="w"> </span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">huawei</span><span class="o">/</span><span class="nv">angler</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">mini</span><span class="o">-</span><span class="nv">emulator</span><span class="o">-</span><span class="nv">x86</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">arm64</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">mini</span><span class="o">-</span><span class="nv">emulator</span><span class="o">-</span><span class="nv">x86_64</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">mini</span><span class="o">-</span><span class="nv">emulator</span><span class="o">-</span><span class="nv">armv7</span><span class="o">-</span><span class="nv">a</span><span class="o">-</span><span class="nv">neon</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">mips</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">mips64</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">x86_64</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">mini</span><span class="o">-</span><span class="nv">emulator</span><span class="o">-</span><span class="nv">arm64</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">mini</span><span class="o">-</span><span class="nv">emulator</span><span class="o">-</span><span class="nv">mips</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">x86</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">armv7</span><span class="o">-</span><span class="nv">a</span><span class="o">-</span><span class="nv">neon</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">mini</span><span class="o">-</span><span class="nv">emulator</span><span class="o">-</span><span class="nv">mips64</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">lge</span><span class="o">/</span><span class="nv">bullhead</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">linaro</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">linaro_x86_64_only</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">linaro</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">linaro_arm64</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">linaro</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">linaro_arm64_only</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">linaro</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">linaro_x86_64</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">linaro</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">linaro</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span><span class="nv">linaro_arm</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">./</span><span class="nv">device</span><span class="o">/</span><span class="nv">linaro</span><span class="o">/</span><span class="nv">hikey</span><span class="o">/</span><span class="nv">hikey</span><span class="o">/</span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">#</span><span class="w"> </span><span class="nv">Edit</span><span class="w"> </span><span class="nv">the</span><span class="w"> </span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span><span class="w"> </span><span class="nv">that</span><span class="w"> </span><span class="nv">you</span><span class="w"> </span><span class="nv">are</span><span class="w"> </span><span class="nv">using</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nv">your</span><span class="w"> </span><span class="nv">build</span>
<span class="nv">cd</span><span class="w"> </span><span class="nv">device</span><span class="o">/</span><span class="nv">linaro</span><span class="o">/</span><span class="nv">generic</span><span class="o">/</span>
<span class="nv">nano</span><span class="w"> </span><span class="nv">BoardConfig</span><span class="o">.</span><span class="nv">mk</span>
<span class="o">#</span><span class="w"> </span><span class="nv">Add</span><span class="w"> </span><span class="nv">the</span><span class="w"> </span><span class="nv">config</span><span class="w"> </span><span class="nv">option</span>
<span class="nv">WITH_DEXPREOPT</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="no">true</span>
<span class="o">#</span><span class="w"> </span><span class="nv">Propagate</span><span class="w"> </span><span class="nv">the</span><span class="w"> </span><span class="nv">new</span><span class="w"> </span><span class="nv">settings</span>
<span class="nv">make</span><span class="w"> </span><span class="nv">defconfig</span>
<span class="nv">make</span><span class="w"> </span><span class="nv">all</span>
</code></pre></div>
<h2>Increase system partition size</h2>
<p>Depending on the previous system partition size and how many APKs that are built, you may need to increase the system partition size.</p>
<div class="highlight"><pre><span></span><code><span class="n">nano</span><span class="w"> </span><span class="n">configs</span><span class="o">/</span><span class="n">defconfig</span>
<span class="c1"># Change the below variable to something big enough to house all of you binaries</span>
<span class="n">CONFIG_BOARD_SYSTEMIMAGE_PARTITION_SIZE</span><span class="o">=</span><span class="mi">1100000000</span>
<span class="c1"># Propagate the new settings</span>
<span class="n">make</span><span class="w"> </span><span class="n">defconfig</span>
<span class="n">make</span><span class="w"> </span><span class="n">all</span>
</code></pre></div>
<h2>Thanks</h2>
<p>This post has been a part of work undertaken by my employer <a href="http://www.collabora.com">Collabora</a>.</p>Setting up a ChromiumOS dev environment2017-02-16T10:31:00+01:002017-02-16T10:31:00+01:00Robert Fosstag:memcpy.io,2017-02-16:/setting-up-a-chromiumos-dev-environment.html<h2>Set up environment</h2>
<div class="highlight"><pre><span></span><code><span class="k">export</span><span class="w"> </span><span class="n">DEV_DIR</span><span class="o">=</span><span class="s2">"/opt"</span>
<span class="n">mkdir</span><span class="w"> </span><span class="o">-</span><span class="n">p</span><span class="w"> </span><span class="o">$</span><span class="n">DEV_DIR</span>
<span class="k">export</span><span class="w"> </span><span class="n">CHROMIUM_DIR</span><span class="o">=</span><span class="s2">"$DEV_DIR/chromiumos"</span>
<span class="n">mkdir</span><span class="w"> </span><span class="o">-</span><span class="n">p</span><span class="w"> </span><span class="o">$</span><span class="n">CHROMIUM_DIR</span>
<span class="k">export</span><span class="w"> </span><span class="n">PATH</span><span class="o">=</span><span class="s2">"$DEV_DIR/depot_tools:$PATH"</span>
<span class="c1"># The BOARD variable used here is specific for the Chromebook that is</span>
<span class="c1"># being targeted, a more generic target like "amd64-generic" could</span>
<span class="c1"># be more useful for you needs.</span>
<span class="k">export</span><span class="w"> </span><span class="n">BOARD</span><span class="o">=</span><span class="n">chell</span>
<span class="c1"># The USB_DEVICE variable refers to the USB device that will be used</span>
<span class="c1"># for flashing ChromiumOS onto a Chromebook.</span>
<span class="c1"># Make sure that this device does not contain anything important!</span>
<span class="k">export</span><span class="w"> </span><span class="n">USB_DEVICE</span><span class="o">=</span><span class="s2">"/dev/sda"</span>
</code></pre></div>
<h2>Install dependencies</h2>
<div class="highlight"><pre><span></span><code><span class="n">sudo</span><span class="w"> </span><span class="n">apt</span><span class="w"> </span><span class="n">install</span><span class="w"> </span><span class="n">git</span><span class="o">-</span><span class="n">core</span><span class="w"> </span><span class="n">gitk</span><span class="w"> </span><span class="n">git</span><span class="o">-</span><span class="n">gui</span><span class="w"> </span><span class="n">subversion</span><span class="w"> </span><span class="n">curl</span>
<span class="n">cd</span><span class="w"> </span><span class="o">$</span><span class="n">DEV_DIR</span>
<span class="n">git</span><span class="w"> </span><span class="n">clone</span><span class="w"> </span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">chromium</span><span class="o">.</span><span class="n">googlesource</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">chromium</span><span class="o">/</span><span class="n">tools</span><span class="o">/</span><span class="n">depot_tools</span><span class="o">.</span><span class="n">git</span>
</code></pre></div>
<h2>Get ChromiumOS source</h2>
<div class="highlight"><pre><span></span><code>cd<span class="w"> </span><span class="cp">${</span><span class="n">CHROMIUM_DIR</span><span class="cp">}</span>
repo<span class="w"> </span>init<span class="w"> </span>-u<span class="w"> </span>https://chromium.googlesource.com/chromiumos/manifest.git
repo<span class="w"> </span>sync<span class="w"> </span>-j25 …</code></pre></div><h2>Set up environment</h2>
<div class="highlight"><pre><span></span><code><span class="k">export</span><span class="w"> </span><span class="n">DEV_DIR</span><span class="o">=</span><span class="s2">"/opt"</span>
<span class="n">mkdir</span><span class="w"> </span><span class="o">-</span><span class="n">p</span><span class="w"> </span><span class="o">$</span><span class="n">DEV_DIR</span>
<span class="k">export</span><span class="w"> </span><span class="n">CHROMIUM_DIR</span><span class="o">=</span><span class="s2">"$DEV_DIR/chromiumos"</span>
<span class="n">mkdir</span><span class="w"> </span><span class="o">-</span><span class="n">p</span><span class="w"> </span><span class="o">$</span><span class="n">CHROMIUM_DIR</span>
<span class="k">export</span><span class="w"> </span><span class="n">PATH</span><span class="o">=</span><span class="s2">"$DEV_DIR/depot_tools:$PATH"</span>
<span class="c1"># The BOARD variable used here is specific for the Chromebook that is</span>
<span class="c1"># being targeted, a more generic target like "amd64-generic" could</span>
<span class="c1"># be more useful for you needs.</span>
<span class="k">export</span><span class="w"> </span><span class="n">BOARD</span><span class="o">=</span><span class="n">chell</span>
<span class="c1"># The USB_DEVICE variable refers to the USB device that will be used</span>
<span class="c1"># for flashing ChromiumOS onto a Chromebook.</span>
<span class="c1"># Make sure that this device does not contain anything important!</span>
<span class="k">export</span><span class="w"> </span><span class="n">USB_DEVICE</span><span class="o">=</span><span class="s2">"/dev/sda"</span>
</code></pre></div>
<h2>Install dependencies</h2>
<div class="highlight"><pre><span></span><code><span class="n">sudo</span><span class="w"> </span><span class="n">apt</span><span class="w"> </span><span class="n">install</span><span class="w"> </span><span class="n">git</span><span class="o">-</span><span class="n">core</span><span class="w"> </span><span class="n">gitk</span><span class="w"> </span><span class="n">git</span><span class="o">-</span><span class="n">gui</span><span class="w"> </span><span class="n">subversion</span><span class="w"> </span><span class="n">curl</span>
<span class="n">cd</span><span class="w"> </span><span class="o">$</span><span class="n">DEV_DIR</span>
<span class="n">git</span><span class="w"> </span><span class="n">clone</span><span class="w"> </span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">chromium</span><span class="o">.</span><span class="n">googlesource</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">chromium</span><span class="o">/</span><span class="n">tools</span><span class="o">/</span><span class="n">depot_tools</span><span class="o">.</span><span class="n">git</span>
</code></pre></div>
<h2>Get ChromiumOS source</h2>
<div class="highlight"><pre><span></span><code>cd<span class="w"> </span><span class="cp">${</span><span class="n">CHROMIUM_DIR</span><span class="cp">}</span>
repo<span class="w"> </span>init<span class="w"> </span>-u<span class="w"> </span>https://chromium.googlesource.com/chromiumos/manifest.git
repo<span class="w"> </span>sync<span class="w"> </span>-j25
</code></pre></div>
<h2>Build ChromiumOS</h2>
<div class="highlight"><pre><span></span><code>cros_sdk<span class="w"> </span>--<span class="w"> </span>./build_packages<span class="w"> </span>--board=<span class="cp">${</span><span class="n">BOARD</span><span class="cp">}</span>
cros_sdk<span class="w"> </span>--<span class="w"> </span>./build_image<span class="w"> </span>--board=<span class="cp">${</span><span class="n">BOARD</span><span class="cp">}</span>
</code></pre></div>
<h2>Flash ChromiumOS to storage medium</h2>
<div class="highlight"><pre><span></span><code>cros_sdk<span class="w"> </span>--<span class="w"> </span>cros<span class="w"> </span>flash<span class="w"> </span>--board=<span class="cp">${</span><span class="n">BOARD</span><span class="cp">}</span><span class="w"> </span>usb:/<span class="nv">$USB_DEVICE</span>
</code></pre></div>
<h2>Install ChromiumOS on Chromebook</h2>
<h3>Enter Chromebook into dev-mode</h3>
<p>This part is highly device specific, and depends on how the manufacturer of your device has chosen
to implement the dev-mode switch.</p>
<p>A partial list of devices and how to enter them into dev-mode can be found <a href="https://www.chromium.org/chromium-os/developer-information-for-chrome-os-devices">here</a>.</p>
<h3>Flash ChromiumOS to Chromebook</h3>
<p>Fire up your Chrombook device and hit Ctrl+Alt+Back, followed by 'chronos' and hit enter.
Followed by the below command to install the ChromiumOS build that was just flashed.</p>
<div class="highlight"><pre><span></span><code>/usr/sbin/chromeos-install
</code></pre></div>
<h2>Debug an application</h2>
<h3>On Chromebook</h3>
<p>Again fire up your Chrombook device and hit Ctrl+Alt+Back, followed by 'chronos' and hit enter.</p>
<div class="highlight"><pre><span></span><code># Remount the root drive read / write
sudo mount -o remount,rw /
# Open port so that gdbserver can be reached
sudo /sbin/iptables -A INPUT -p tcp --dport 1234 -j ACCEPT
# Run gdb server, listening on port 1234 (opened in iptables command above)
sudo gdbserver :1234 chrome
</code></pre></div>
<h3>On dev machine</h3>
<div class="highlight"><pre><span></span><code>#<span class="w"> </span><span class="nv">On</span><span class="w"> </span><span class="nv">x86</span>
<span class="nv">cros_sdk</span><span class="w"> </span><span class="o">--</span><span class="w"> </span><span class="nv">sudo</span><span class="w"> </span><span class="nv">USE</span><span class="o">=</span><span class="nv">expat</span><span class="w"> </span><span class="nv">emerge</span><span class="w"> </span><span class="nv">cross</span><span class="o">-</span><span class="nv">i686</span><span class="o">-</span><span class="nv">pc</span><span class="o">-</span><span class="nv">linux</span><span class="o">-</span><span class="nv">gnu</span><span class="o">/</span><span class="nv">gdb</span>
#<span class="w"> </span><span class="nv">On</span><span class="w"> </span><span class="nv">ARMv7</span>
<span class="nv">cros_sdk</span><span class="w"> </span><span class="o">--</span><span class="w"> </span><span class="nv">sudo</span><span class="w"> </span><span class="nv">USE</span><span class="o">=</span><span class="nv">expat</span><span class="w"> </span><span class="nv">emerge</span><span class="w"> </span><span class="nv">cross</span><span class="o">-</span><span class="nv">armv7a</span><span class="o">-</span><span class="nv">cros</span><span class="o">-</span><span class="nv">linux</span><span class="o">-</span><span class="nv">gnueabi</span><span class="o">/</span><span class="nv">gdb</span>
<span class="nv">cros_sdk</span><span class="w"> </span><span class="o">--</span><span class="w"> </span><span class="nv">i686</span><span class="o">-</span><span class="nv">pc</span><span class="o">-</span><span class="nv">linux</span><span class="o">-</span><span class="nv">gnu</span><span class="o">-</span><span class="nv">gdb</span><span class="w"> </span><span class="s2">"/build/$BOARD/opt/google/chrome/chrome"</span>
<span class="ss">(</span><span class="nv">gdb</span><span class="ss">)</span><span class="w"> </span><span class="nv">set</span><span class="w"> </span><span class="nv">sysroot</span><span class="w"> </span><span class="o">/</span><span class="nv">build</span><span class="o">/</span><span class="mh">$B</span><span class="nv">OARD</span><span class="o">/</span>
<span class="ss">(</span><span class="nv">gdb</span><span class="ss">)</span><span class="w"> </span><span class="nv">target</span><span class="w"> </span><span class="nv">remote</span><span class="w"> </span><span class="nv">IP_ADDR_CHROMEBOOK</span>:<span class="mi">1234</span>
<span class="ss">(</span><span class="nv">gdb</span><span class="ss">)</span><span class="w"> </span><span class="k">continue</span>
</code></pre></div>
<h2>Conclusion</h2>
<p>This is a bit of a rough outline, and is only suitable for Chromebook devices that already are in dev-mode.</p>
<h2>Thanks</h2>
<p>This post has been a part of work undertaken by my employer <a href="http://www.collabora.com">Collabora</a>.</p>
<h2>References</h2>
<p><a href="http://dev.chromium.org/developers/how-tos/install-depot-tools">ChromiumOS Depo Tools</a><br>
<a href="https://www.chromium.org/chromium-os/quick-start-guide">ChromiumOS Quick Start</a><br>
<a href="https://www.chromium.org/chromium-os/developer-information-for-chrome-os-devices">ChromiumOS Dev Mode</a><br>
<a href="https://www.chromium.org/chromium-os/how-tos-and-troubleshooting/debugging-tips">ChromiumOS Debug</a></p>XDC 20162016-09-23T20:20:00+02:002016-09-23T20:20:00+02:00Robert Fosstag:memcpy.io,2016-09-23:/xdc-2016.html<p><img alt="Alt text" src="/images/2016-09-23_xdc_2016.jpg" title="XDC 2016"></p>
<p>XDC 2016 was hosted in Helsinki at Haaga-Helia.
The full <a href="https://www.x.org/wiki/Events/XDC2016/Program/">program</a> was filmed and is archived <a href="https://www.youtube.com/channel/UCXlH5v1PkEhjzLFTUTm_U7g/videos">here</a>.</p>
<h2>[<a href="files/2016-09-23/xdc-2016-fast_ui_draw.pdf">Slides</a>] FastUIDraw - High Performance 2D renderer for GPUs</h2>
<p>Kevin Rogovin gave an excellent talk about FastUIDraw, which is a highly optimiser 2d renderer for GPUs.</p>
<p>By agressively targetting GPUs only and limiting the feature set to what is required by a browser FastUIDraw performs >9.3x faster than Cairo-CPU and >4.8x times the previous GPU state of the art SKIA-GL.</p>
<p>Hopefully FastUIDraw can be incorporated into upstream of ChromiumOS and Android.</p>
<h2>[<a href="files/2016-09-23/xdc-2016_2d_perf.pdf">Slides</a>] 2D Performance</h2>
<p><a href="http://phd.mupuf.org/">Martin Perez</a> gave a talk about 2D performance and power consumption of the Xserver.</p>
<p>The xf86-video-intel driver showed quite mixed performance numbers of 1.51-32.6x times the CPU performance.
The FPS/Watt …</p><p><img alt="Alt text" src="/images/2016-09-23_xdc_2016.jpg" title="XDC 2016"></p>
<p>XDC 2016 was hosted in Helsinki at Haaga-Helia.
The full <a href="https://www.x.org/wiki/Events/XDC2016/Program/">program</a> was filmed and is archived <a href="https://www.youtube.com/channel/UCXlH5v1PkEhjzLFTUTm_U7g/videos">here</a>.</p>
<h2>[<a href="files/2016-09-23/xdc-2016-fast_ui_draw.pdf">Slides</a>] FastUIDraw - High Performance 2D renderer for GPUs</h2>
<p>Kevin Rogovin gave an excellent talk about FastUIDraw, which is a highly optimiser 2d renderer for GPUs.</p>
<p>By agressively targetting GPUs only and limiting the feature set to what is required by a browser FastUIDraw performs >9.3x faster than Cairo-CPU and >4.8x times the previous GPU state of the art SKIA-GL.</p>
<p>Hopefully FastUIDraw can be incorporated into upstream of ChromiumOS and Android.</p>
<h2>[<a href="files/2016-09-23/xdc-2016_2d_perf.pdf">Slides</a>] 2D Performance</h2>
<p><a href="http://phd.mupuf.org/">Martin Perez</a> gave a talk about 2D performance and power consumption of the Xserver.</p>
<p>The xf86-video-intel driver showed quite mixed performance numbers of 1.51-32.6x times the CPU performance.
The FPS/Watt measurements showed 0.73-15.1x times the CPU efficiency.</p>
<p>When looking at Cairo traces the power efficiency is actually lower using GPU accelaration than with CPU acceleration.
This is somewhat expected in that the Cairo workload is not very high throughput, so the overhead of doing 2D operations is relatively high compared to the actual work.</p>
<p>Overall toolkits are moving away from letting the Xserver do 2D rendering, for reasons of portability and performance.</p>
<h2>[<a href="files/2016-09-23/xdc-2016-glvnd-status.pdf">Slides</a>] libglvnd Status Update</h2>
<p>Andy Ritger gave a talk about the current libglvnd status.
The goal of libglvnd is to allow different graphics libraries from potentially different vendors to coexist on a filesystem and in a process.
GLX/EGl/OpenGL/OpenGLES/GL are all supported by libglvnd.</p>
<p>Currently mesa supports libglvnd for OpenGL and GLX, with EGL support being in the pipeline.</p>
<h2>[<a href="files/2016-09-23/xdc-2016-drm_hwcomposer.pdf">Slides</a>] drm_hwcomposer</h2>
<p>Sean Paul and Zach Reizner gave an exceptionally well timed talk about the Android && Chromium drm_hwcomposer project.
drm_hwcomposer is an implementation of the hwcomposer (HWC) API ontop of the Linux DRM/KMS.</p>
<p>The talk detailed the implications of HWC2 and explicit fencing.
A large part of the HWC1 implementation can be removed from drm_hwcomposer since it's made redundant by the fencing support in HWC2.
So, for example the worker threads (DrmCompositorWorker and FrameWorker) are no longer necessary and can be removed.</p>
<h2>[<a href="files/2016-09-23/xdc-2016-nouveau_update.pdf">Slides</a>] Status update of Nouveau</h2>
<p><a href="https://hakzsam.wordpress.com/">Samuel Pitoiset</a>, Karol Herbst, <a href="https://twitter.com/kurtelborgpm">Pierre Moreau</a> and <a href="http://phd.mupuf.org/">Martin Perez</a> gave a talk about what has happened in Nouveau land the last year.</p>
<p>Hardware support is as always taking steps forward, with Fermi support is scheduled for Linux v4.9+.</p>
<p>A call to arms for Nouveau compiler optimizations was issued by <a href="mailto:martin.peres AT free DOT fr">Martin Perez</a>.
There is a lot of low hanging fruit for optimizations is available, and the compiler is overall in a good shape.
So feel free to contact Martin or the Nouveau project if you are interested or curious.</p>
<p>As of the Maxwell generation of GPUs the firmware needed now has to be signed, GM20x/GP100 firmware has been released, but support for loading firmware on Tegra has not been provided by NVidia.</p>
<p>Martin made a rather clear point of needing to see some cooperation from NVidia in order for the Nouveau project to be able to make progress with new and upcoming NVidia hardware.</p>
<h2>Conclusion</h2>
<p>Thanks to the X.Org Foundation and the board of directors for arranging XDC 2016.
This post has been a part of work undertaken by my employer <a href="http://www.collabora.com">Collabora</a>.</p>Building Android for Qemu with Mesa and Virgil3D2016-08-30T15:22:00+02:002016-08-30T15:22:00+02:00Robert Fosstag:memcpy.io,2016-08-30:/building-android-for-qemu-with-mesa-and-virgil3d.html<p><img alt="Alt text" src="/images/2016-08-30_android_qemu.png" title="Android running on Qemu"></p>
<p>Developing Linux for Android on Qemu allows you to do some things that are
not necessarily possible using the stock emulator.
For my purposes I need access to a GPU and be able to modify the driver, which
is where Virgilrenderer and Qemu comes in handy.</p>
<p>The guide below helps you compile Android and run it on top of Qemu with
Mesa/Virgilrenderer supplying a virtual GPU.
Because of this, the following guide is aimed at Linux hosts.</p>
<p>This guide is based on Rob Herrings <a href="https://github.com/robherring/generic_device/wiki/KConfig-based-Multi-platform-Android-Device-(and-Mesa-graphics)">fantastic guide</a>, but has
been slightly streamlined and had physical hardware support stripped out.</p>
<h2>Install dependencies</h2>
<p>These dependencies were available on Ubuntu 16.04, some alternative packages
might be needed for other distributions.</p>
<div class="highlight"><pre><span></span><code><span class="n">sudo</span><span class="w"> </span><span class="n">apt</span><span class="w"> </span><span class="n">install</span><span class="w"> </span><span class="n">autoconf</span><span class="w"> </span><span class="n">gcc</span><span class="o">-</span><span class="n">aarch64</span><span class="o">-</span><span class="n">linux …</span></code></pre></div><p><img alt="Alt text" src="/images/2016-08-30_android_qemu.png" title="Android running on Qemu"></p>
<p>Developing Linux for Android on Qemu allows you to do some things that are
not necessarily possible using the stock emulator.
For my purposes I need access to a GPU and be able to modify the driver, which
is where Virgilrenderer and Qemu comes in handy.</p>
<p>The guide below helps you compile Android and run it on top of Qemu with
Mesa/Virgilrenderer supplying a virtual GPU.
Because of this, the following guide is aimed at Linux hosts.</p>
<p>This guide is based on Rob Herrings <a href="https://github.com/robherring/generic_device/wiki/KConfig-based-Multi-platform-Android-Device-(and-Mesa-graphics)">fantastic guide</a>, but has
been slightly streamlined and had physical hardware support stripped out.</p>
<h2>Install dependencies</h2>
<p>These dependencies were available on Ubuntu 16.04, some alternative packages
might be needed for other distributions.</p>
<div class="highlight"><pre><span></span><code><span class="n">sudo</span><span class="w"> </span><span class="n">apt</span><span class="w"> </span><span class="n">install</span><span class="w"> </span><span class="n">autoconf</span><span class="w"> </span><span class="n">gcc</span><span class="o">-</span><span class="n">aarch64</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">gnu</span><span class="w"> </span><span class="n">libaio</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libbluetooth</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libbrlapi</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libbz2</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libcap</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libcap</span><span class="o">-</span><span class="n">ng</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libcurl4</span><span class="o">-</span><span class="n">gnutls</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libepoxy</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libfdt</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libgbm</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libgles2</span><span class="o">-</span><span class="n">mesa</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libglib2</span><span class="o">.</span><span class="mi">0</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libgtk</span><span class="o">-</span><span class="mi">3</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libibverbs</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libjpeg8</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">liblzo2</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libncurses5</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libnuma</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">librbd</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">librdmacm</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libsasl2</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libsdl1</span><span class="o">.</span><span class="mi">2</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libsdl2</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libseccomp</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libsnappy</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libssh2</span><span class="o">-</span><span class="mi">1</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libspice</span><span class="o">-</span><span class="n">server</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libspice</span><span class="o">-</span><span class="n">server1</span><span class="w"> </span><span class="n">libtool</span><span class="w"> </span><span class="n">libusb</span><span class="o">-</span><span class="mf">1.0</span><span class="o">-</span><span class="mi">0</span><span class="w"> </span><span class="n">libusb</span><span class="o">-</span><span class="mf">1.0</span><span class="o">-</span><span class="mi">0</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libvde</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libvdeplug</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libvte</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libxen</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">valgrind</span><span class="w"> </span><span class="n">xfslibs</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">xutils</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">zlib1g</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">libusbredirhost</span><span class="o">-</span><span class="n">dev</span><span class="w"> </span><span class="n">usbredirserver</span>
</code></pre></div>
<h2>Set up paths</h2>
<p>Naturally all of the paths below are configurable, this is just what I used.</p>
<div class="highlight"><pre><span></span><code><span class="k">export</span><span class="w"> </span><span class="n">PROJECT_PATH</span><span class="o">=</span><span class="s2">"/opt/qemu_android"</span>
<span class="k">export</span><span class="w"> </span><span class="n">VIRGLRENDERER_PATH</span><span class="o">=</span><span class="s2">"${PROJECT_PATH}/virglrenderer"</span>
<span class="k">export</span><span class="w"> </span><span class="n">QEMU_PATH</span><span class="o">=</span><span class="s2">"${PROJECT_PATH}/qemu"</span>
<span class="k">export</span><span class="w"> </span><span class="n">LINUX_PATH</span><span class="o">=</span><span class="s2">"${PROJECT_PATH}/linux"</span>
<span class="k">export</span><span class="w"> </span><span class="n">ANDROID_PATH</span><span class="o">=</span><span class="s2">"${PROJECT_PATH}/android"</span>
<span class="k">export</span><span class="w"> </span><span class="n">ANDROID_TOOLS_PATH</span><span class="o">=</span><span class="s2">"${PROJECT_PATH}/android-tools"</span>
</code></pre></div>
<h2>Virglrenderer</h2>
<p>Virglrenderer creates a virtual 3D GPU, that allows the Qemu guest to use the
graphics capabilities of the host machine.</p>
<div class="highlight"><pre><span></span><code>git<span class="w"> </span>clone<span class="w"> </span>git://git.freedesktop.org/git/virglrenderer<span class="w"> </span><span class="cp">${</span><span class="n">VIRGLRENDERER_PATH</span><span class="cp">}</span>
cd<span class="w"> </span><span class="cp">${</span><span class="n">VIRGLRENDERER_PATH</span><span class="cp">}</span>
./autogen.sh
make<span class="w"> </span>-j7
sudo<span class="w"> </span>make<span class="w"> </span>install
</code></pre></div>
<h2>Qemu</h2>
<p>Qemu is a full system emulator, and supports a multitude of machine architectures.
We're going to to use x86_64 but also build support for arm64/aarch64.</p>
<div class="highlight"><pre><span></span><code>git<span class="w"> </span>clone<span class="w"> </span>git://git.qemu-project.org/qemu.git<span class="w"> </span><span class="cp">${</span><span class="n">QEMU_PATH</span><span class="cp">}</span>
mkdir<span class="w"> </span><span class="cp">${</span><span class="n">QEMU_PATH</span><span class="cp">}</span>/build
cd<span class="w"> </span><span class="cp">${</span><span class="n">QEMU_PATH</span><span class="cp">}</span>/build
../configure<span class="w"> </span>--target-list=aarch64-softmmu,x86_64-softmmu<span class="w"> </span>--enable-gtk<span class="w"> </span>--with-gtkabi=3.0<span class="w"> </span>--enable-kvm<span class="w"> </span>--enable-spice<span class="w"> </span>--enable-usb-redir<span class="w"> </span>--enable-libusb
make<span class="w"> </span>-j7
</code></pre></div>
<h2>Linux kernel</h2>
<p>Build trunk of mainline linux kernel.</p>
<p><strong>Important:</strong> The below instructions use upstream/master but during testing of
this guide, <em>https://git.kernel.org/pub/scm/linux/kernel/git/padovan/linux.git</em>
and the <em>fences</em> branch was used due to SW_SYNC not yet being included in upstream.
Inclusion is targeted for <em>v4.9</em>.</p>
<div class="highlight"><pre><span></span><code>git<span class="w"> </span>clone<span class="w"> </span>git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git<span class="w"> </span><span class="cp">${</span><span class="n">LINUX_PATH</span><span class="cp">}</span>
cd<span class="w"> </span><span class="cp">${</span><span class="n">LINUX_PATH</span><span class="cp">}</span>
wget<span class="w"> </span>http://memcpy.io/files/2016-08-30/Kconfig<span class="w"> </span>-O<span class="w"> </span><span class="cp">${</span><span class="n">LINUX_PATH</span><span class="cp">}</span>/.config
make<span class="w"> </span>oldconfig
make<span class="w"> </span>-j7
</code></pre></div>
<p><strong>Important:</strong> If you decide not to use the <em>.config</em> linked in this step, a few
Kconfig options need to be set:</p>
<div class="highlight"><pre><span></span><code>CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_AUDIT=y
CONFIG_HAVE_ARCH_AUDITSYSCALL=y
CONFIG_AUDITSYSCALL=y
CONFIG_AUDIT_WATCH=y
CONFIG_AUDIT_TREE=y
CONFIG_DRM=y
CONFIG_SECURITY_SELINUX=y
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1
CONFIG_SECURITY_SELINUX_DISABLE=y
CONFIG_SECURITY_SELINUX_DEVELOP=y
CONFIG_SECURITY_SELINUX_AVC_STATS=y
CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=0
CONFIG_DEFAULT_SECURITY_SELINUX=y
CONFIG_DEFAULT_SECURITY="selinux"
CONFIG_VIRTIO_BLK=y
CONFIG_SCSI_VIRTIO=y
CONFIG_VIRTIO_NET=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_HW_RANDOM_VIRTIO=y
CONFIG_DRM_VIRTIO_GPU=y
CONFIG_VIRT_DRIVERS=y
CONFIG_VIRTIO=y
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_PCI_LEGACY=y
CONFIG_VIRTIO_BALLOON=y
CONFIG_VIRTIO_INPUT=y
CONFIG_VIRTIO_MMIO=y
CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
CONFIG_NET_9P=y
CONFIG_NET_9P_VIRTIO=y
CONFIG_SYNC=y
CONFIG_SW_SYNC=y
CONFIG_SYNC_FILE=y
</code></pre></div>
<h2>Android</h2>
<p>Build the Android Open Source Project.</p>
<p><strong>Important:</strong> When running <em>source build/envsetup.sh</em> make sure that you are
using bash. I had issues running <em>lunch</em> using zsh.</p>
<div class="highlight"><pre><span></span><code>mkdir<span class="w"> </span><span class="cp">${</span><span class="n">ANDROID_PATH</span><span class="cp">}</span>
cd<span class="w"> </span><span class="cp">${</span><span class="n">ANDROID_PATH</span><span class="cp">}</span>
repo<span class="w"> </span>init<span class="w"> </span>-u<span class="w"> </span>https://android.googlesource.com/platform/manifest<span class="w"> </span>-b<span class="w"> </span>master
cd<span class="w"> </span>.repo
git<span class="w"> </span>clone<span class="w"> </span>https://github.com/robherring/android_manifest.git<span class="w"> </span>-b<span class="w"> </span>android-6.0<span class="w"> </span>local_manifests
cd<span class="w"> </span>..
repo<span class="w"> </span>sync<span class="w"> </span>-j20
cd<span class="w"> </span>device/linaro/generic
make<span class="w"> </span>defconfig
make<span class="w"> </span>all
cd<span class="w"> </span>../../..
#<span class="w"> </span>The<span class="w"> </span>following<span class="w"> </span>snippet<span class="w"> </span>must<span class="w"> </span>be<span class="w"> </span>run<span class="w"> </span>in<span class="w"> </span>bash
bash
source<span class="w"> </span>build/envsetup.sh
#<span class="w"> </span>Select<span class="w"> </span>linaro_x86_64-userdebug
lunch
make<span class="w"> </span>-j7
#<span class="w"> </span>We<span class="w"> </span>don't<span class="w"> </span>need<span class="w"> </span>to<span class="w"> </span>use<span class="w"> </span>bash<span class="w"> </span>any<span class="w"> </span>longer
exit
</code></pre></div>
<p>As of this writing DRM fences related patches by Gustavo Padovan have yet to be included
into AOSP, and therefore have to be included manually until it is upstreamed.
After switching to this branch, the AOSP project has to be rebuilt again.</p>
<div class="highlight"><pre><span></span><code>cd $ANDROID_PATH/system/core/
git remote add padovan git://git.collabora.com/git/user/padovan/android-system-core.git
git fetch padovan
git checkout padovan/master
</code></pre></div>
<h2>mkbootimg</h2>
<p>Fetch the make boot image script. This script later assembles the boot image, <em>boot.img</em>.</p>
<div class="highlight"><pre><span></span><code>git clone https://android.googlesource.com/platform/system/core.git $ANDROID_TOOLS_PATH
</code></pre></div>
<h2>Run Qemu machine</h2>
<p>When running the below script, make sure that the all of the paths from step two
have been exported.</p>
<div class="highlight"><pre><span></span><code>wget<span class="w"> </span>http://memcpy.io/files/2016-08-30/boot_android_qemu.sh<span class="w"> </span>-O<span class="w"> </span><span class="cp">${</span><span class="n">PROJECT_PATH</span><span class="cp">}</span>/boot_android_qemu.sh
chmod<span class="w"> </span>+x<span class="w"> </span><span class="cp">${</span><span class="n">PROJECT_PATH</span><span class="cp">}</span>/boot_android_qemu.sh
<span class="cp">${</span><span class="n">PROJECT_PATH</span><span class="cp">}</span>/boot_android_qemu.sh<span class="w"> </span>x86_64
</code></pre></div>
<h2>Conclusion</h2>
<p>Hopefully this guide will have enabled you build the required software and run Android on
Qemu with a virtual GPU.
This post has been a part of work undertaken by my employer <a href="http://www.collabora.com">Collabora</a>.</p>Ethernet device stress testing2016-08-25T13:05:00+02:002016-08-25T13:05:00+02:00Robert Fosstag:memcpy.io,2016-08-25:/ethernet-device-stress-testing.html<p><img alt="Alt text" src="/images/2016-08-25_ethernet_device_testing.png" title="Screenshot of python script"></p>
<p>During testing of power management patches for usb ethernet dongles, a script
was needed to stress test connecting/disconnecting/reconnecting these devices.</p>
<p>Luckily a script like that already exists as a part of the chromiumos project,
and can be found <a href="https://chromium.googlesource.com/chromiumos/third_party/autotest/+/HEAD/client/site_tests/network_EthernetStressPlug/network_EthernetStressPlug.py">here</a>.</p>
<p>That script does however not run standalone and requires a remote device
(chromebook) to execute on. So I took the liberty of changing it to support
local testing. The modified version can be found <a href="files/2016-08-25/network_EthernetStressPlug.py">here</a>.</p>
<p>This might come in handy for someone, if not, the script will at least be
archived on this site.</p>
<h2>Example</h2>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>pip2.7<span class="w"> </span>install<span class="w"> </span>autotest
$<span class="w"> </span>ip<span class="w"> </span>link
<span class="m">1</span>:<span class="w"> </span>lo:<span class="w"> </span><LOOPBACK,UP,LOWER_UP><span class="w"> </span>mtu<span class="w"> </span><span class="m">65536</span><span class="w"> </span>qdisc<span class="w"> </span>noqueue<span class="w"> </span>state<span class="w"> </span>UNKNOWN<span class="w"> </span>mode<span class="w"> </span>DEFAULT<span class="w"> </span>group<span class="w"> </span>default<span class="w"> </span>qlen<span class="w"> </span><span class="m">1</span>
<span class="w"> </span>link/loopback<span class="w"> </span><span class="m">00</span>:00:00 …</code></pre></div><p><img alt="Alt text" src="/images/2016-08-25_ethernet_device_testing.png" title="Screenshot of python script"></p>
<p>During testing of power management patches for usb ethernet dongles, a script
was needed to stress test connecting/disconnecting/reconnecting these devices.</p>
<p>Luckily a script like that already exists as a part of the chromiumos project,
and can be found <a href="https://chromium.googlesource.com/chromiumos/third_party/autotest/+/HEAD/client/site_tests/network_EthernetStressPlug/network_EthernetStressPlug.py">here</a>.</p>
<p>That script does however not run standalone and requires a remote device
(chromebook) to execute on. So I took the liberty of changing it to support
local testing. The modified version can be found <a href="files/2016-08-25/network_EthernetStressPlug.py">here</a>.</p>
<p>This might come in handy for someone, if not, the script will at least be
archived on this site.</p>
<h2>Example</h2>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>pip2.7<span class="w"> </span>install<span class="w"> </span>autotest
$<span class="w"> </span>ip<span class="w"> </span>link
<span class="m">1</span>:<span class="w"> </span>lo:<span class="w"> </span><LOOPBACK,UP,LOWER_UP><span class="w"> </span>mtu<span class="w"> </span><span class="m">65536</span><span class="w"> </span>qdisc<span class="w"> </span>noqueue<span class="w"> </span>state<span class="w"> </span>UNKNOWN<span class="w"> </span>mode<span class="w"> </span>DEFAULT<span class="w"> </span>group<span class="w"> </span>default<span class="w"> </span>qlen<span class="w"> </span><span class="m">1</span>
<span class="w"> </span>link/loopback<span class="w"> </span><span class="m">00</span>:00:00:00:00:00<span class="w"> </span>brd<span class="w"> </span><span class="m">00</span>:00:00:00:00:00
<span class="m">2</span>:<span class="w"> </span>wlp2s0:<span class="w"> </span><BROADCAST,MULTICAST,UP,LOWER_UP><span class="w"> </span>mtu<span class="w"> </span><span class="m">1500</span><span class="w"> </span>qdisc<span class="w"> </span>pfifo_fast<span class="w"> </span>state<span class="w"> </span>UP<span class="w"> </span>mode<span class="w"> </span>DORMANT<span class="w"> </span>group<span class="w"> </span>default<span class="w"> </span>qlen<span class="w"> </span><span class="m">1000</span>
<span class="w"> </span>link/ether<span class="w"> </span><span class="m">48</span>:e2:44:f6:e8:5b<span class="w"> </span>brd<span class="w"> </span>ff:ff:ff:ff:ff:ff
<span class="m">27</span>:<span class="w"> </span>enx000ec689ab9e:<span class="w"> </span><NO-CARRIER,BROADCAST,MULTICAST,UP><span class="w"> </span>mtu<span class="w"> </span><span class="m">1500</span><span class="w"> </span>qdisc<span class="w"> </span>pfifo_fast<span class="w"> </span>state<span class="w"> </span>DOWN<span class="w"> </span>mode<span class="w"> </span>DEFAULT<span class="w"> </span>group<span class="w"> </span>default<span class="w"> </span>qlen<span class="w"> </span><span class="m">1000</span>
<span class="w"> </span>link/ether<span class="w"> </span><span class="m">00</span>:0e:c6:89:ab:9e<span class="w"> </span>brd<span class="w"> </span>ff:ff:ff:ff:ff:ff
$<span class="w"> </span><span class="nb">export</span><span class="w"> </span><span class="nv">INTERFACE</span><span class="o">=</span>enx000ec689ab9e
$<span class="w"> </span><span class="nb">export</span><span class="w"> </span><span class="nv">NUM_ITERATIONS</span><span class="o">=</span><span class="m">10</span>
$<span class="w"> </span>sudo<span class="w"> </span>python<span class="w"> </span>network_EthernetStressPlug.py<span class="w"> </span><span class="nv">$INTERFACE</span><span class="w"> </span><span class="nv">$NUM_ITERATIONS</span>
</code></pre></div>Linux kernel development shell scripts2016-07-26T10:32:00+02:002016-07-26T10:32:00+02:00Robert Fosstag:memcpy.io,2016-07-26:/linux-kernel-development-shell-scripts.html<p><img alt="Alt text" src="/images/2016-07-26_linux_development_helper_script.png" title="Terminal screenshot of scripts in use"></p>
<p>While upstreaming kernel patches scripts/checkpatch.pl and scripts/get_maintainer.pl
often come in handy.
But to me the interface they provide is slightly bulky and rely
on using patch files instead of git commits, which to me is a bit inconvenient.</p>
<p>These scripts are all meant to be included in <strong>.bashrc</strong> or <strong>.zshrc</strong></p>
<h2>scripts/checkpatch.pl helper</h2>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="ch">#!/bin/bash</span>
<span class="k">function</span><span class="w"> </span>checkpatch<span class="w"> </span><span class="o">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="o">[</span><span class="w"> </span>-z<span class="w"> </span><span class="si">${</span><span class="nv">1</span><span class="p">+x</span><span class="si">}</span><span class="w"> </span><span class="o">]</span><span class="p">;</span><span class="w"> </span><span class="k">then</span>
<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>git<span class="w"> </span>diff<span class="w"> </span><span class="p">|</span><span class="w"> </span>scripts/checkpatch.pl<span class="w"> </span>--no-signoff<span class="w"> </span>-q<span class="w"> </span>-
<span class="w"> </span><span class="k">elif</span><span class="w"> </span><span class="o">[[</span><span class="w"> </span><span class="nv">$1</span><span class="w"> </span><span class="o">==</span><span class="w"> </span>*<span class="s2">"cache"</span>*<span class="w"> </span><span class="o">]]</span><span class="p">;</span><span class="w"> </span><span class="k">then</span>
<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>git<span class="w"> </span>diff<span class="w"> </span>--cached<span class="w"> </span><span class="p">|</span><span class="w"> </span>scripts/checkpatch.pl<span class="w"> </span>--no-signoff<span class="w"> </span>-q<span class="w"> </span>-
<span class="w"> </span><span class="k">else</span>
<span class="w"> </span><span class="nv">NUM_COMMITS</span><span class="o">=</span><span class="nv">$1</span>
<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>git<span class="w"> </span>diff<span class="w"> </span>HEAD~<span class="nv">$NUM_COMMITS</span>..HEAD<span class="w"> </span><span class="p">|</span><span class="w"> </span>scripts/checkpatch.pl<span class="w"> </span>--no-signoff<span class="w"> </span>-q<span class="w"> </span>-
<span class="w"> </span><span class="k">fi</span>
<span class="o">}</span>
</code></pre></div></td></tr></table></div>
<p>The checkpatch script simply wraps the patch creation process and allows …</p><p><img alt="Alt text" src="/images/2016-07-26_linux_development_helper_script.png" title="Terminal screenshot of scripts in use"></p>
<p>While upstreaming kernel patches scripts/checkpatch.pl and scripts/get_maintainer.pl
often come in handy.
But to me the interface they provide is slightly bulky and rely
on using patch files instead of git commits, which to me is a bit inconvenient.</p>
<p>These scripts are all meant to be included in <strong>.bashrc</strong> or <strong>.zshrc</strong></p>
<h2>scripts/checkpatch.pl helper</h2>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="ch">#!/bin/bash</span>
<span class="k">function</span><span class="w"> </span>checkpatch<span class="w"> </span><span class="o">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="o">[</span><span class="w"> </span>-z<span class="w"> </span><span class="si">${</span><span class="nv">1</span><span class="p">+x</span><span class="si">}</span><span class="w"> </span><span class="o">]</span><span class="p">;</span><span class="w"> </span><span class="k">then</span>
<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>git<span class="w"> </span>diff<span class="w"> </span><span class="p">|</span><span class="w"> </span>scripts/checkpatch.pl<span class="w"> </span>--no-signoff<span class="w"> </span>-q<span class="w"> </span>-
<span class="w"> </span><span class="k">elif</span><span class="w"> </span><span class="o">[[</span><span class="w"> </span><span class="nv">$1</span><span class="w"> </span><span class="o">==</span><span class="w"> </span>*<span class="s2">"cache"</span>*<span class="w"> </span><span class="o">]]</span><span class="p">;</span><span class="w"> </span><span class="k">then</span>
<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>git<span class="w"> </span>diff<span class="w"> </span>--cached<span class="w"> </span><span class="p">|</span><span class="w"> </span>scripts/checkpatch.pl<span class="w"> </span>--no-signoff<span class="w"> </span>-q<span class="w"> </span>-
<span class="w"> </span><span class="k">else</span>
<span class="w"> </span><span class="nv">NUM_COMMITS</span><span class="o">=</span><span class="nv">$1</span>
<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>git<span class="w"> </span>diff<span class="w"> </span>HEAD~<span class="nv">$NUM_COMMITS</span>..HEAD<span class="w"> </span><span class="p">|</span><span class="w"> </span>scripts/checkpatch.pl<span class="w"> </span>--no-signoff<span class="w"> </span>-q<span class="w"> </span>-
<span class="w"> </span><span class="k">fi</span>
<span class="o">}</span>
</code></pre></div></td></tr></table></div>
<p>The checkpatch script simply wraps the patch creation process and allows you to
right away specify which </p>
<h4>Example</h4>
<div class="highlight"><pre><span></span><code><span class="o">~/</span><span class="n">work</span><span class="o">/</span><span class="n">linux</span><span class="w"> </span><span class="err">$</span><span class="w"> </span><span class="n">checkpatch</span><span class="w"> </span><span class="mi">15</span>
<span class="n">WARNING</span><span class="o">:</span><span class="w"> </span><span class="n">ENOSYS</span><span class="w"> </span><span class="n">means</span><span class="w"> </span><span class="s">'invalid syscall nr'</span><span class="w"> </span><span class="kr">and</span><span class="w"> </span><span class="n">nothing</span><span class="w"> </span><span class="n">else</span>
<span class="cp">#349: FILE: drivers/tty/serial/sh-sci.c:3026:</span>
<span class="o">+</span><span class="w"> </span><span class="nf">if</span><span class="w"> </span><span class="p">(</span><span class="n">IS_ERR</span><span class="p">(</span><span class="n">sciport</span><span class="o">-></span><span class="n">gpios</span><span class="p">)</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">PTR_ERR</span><span class="p">(</span><span class="n">sciport</span><span class="o">-></span><span class="n">gpios</span><span class="p">)</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="o">-</span><span class="n">ENOSYS</span><span class="p">)</span>
<span class="n">total</span><span class="o">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">errors</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">warnings</span><span class="p">,</span><span class="w"> </span><span class="mi">385</span><span class="w"> </span><span class="n">lines</span><span class="w"> </span><span class="n">checked</span>
</code></pre></div>
<p>In this example the 15 last commits are checked against scripts/checkpatch.pl
for correctness.</p>
<h2>scripts/get_maintainer.pl helper</h2>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="ch">#!/bin/bash</span>
<span class="k">function</span><span class="w"> </span>get_maintainer<span class="w"> </span><span class="o">{</span>
<span class="w"> </span><span class="nv">NUM_COMMITS</span><span class="o">=</span><span class="nv">$1</span>
<span class="w"> </span><span class="nv">MAINTAINERS</span><span class="o">=</span><span class="k">$(</span>git<span class="w"> </span>format-patch<span class="w"> </span>HEAD~<span class="nv">$NUM_COMMITS</span>..HEAD<span class="w"> </span>--stdout<span class="w"> </span><span class="p">|</span><span class="w"> </span>scripts/get_maintainer.pl<span class="k">)</span>
<span class="w"> </span><span class="c1"># Remove extraneous stats</span>
<span class="w"> </span><span class="nv">MAINTAINERS</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span><span class="w"> </span><span class="s2">"</span><span class="nv">$MAINTAINERS</span><span class="s2">"</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>sed<span class="w"> </span><span class="s1">'s/(.*//g'</span><span class="k">)</span>
<span class="w"> </span><span class="c1"># Remove names from email addresses</span>
<span class="w"> </span><span class="nv">MAINTAINERS</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span><span class="w"> </span><span class="s2">"</span><span class="nv">$MAINTAINERS</span><span class="s2">"</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>sed<span class="w"> </span><span class="s1">'s/.*<!--/g'</span><span class="k">)</span>
<span class="w"> </span><span class="c1"># Remove left over character</span>
<span class="w"> </span><span class="nv">MAINTAINERS</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span><span class="w"> </span><span class="s2">"</span><span class="nv">$MAINTAINERS</span><span class="s2">"</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>sed<span class="w"> </span><span class="s1">'s/-->//g'</span><span class="k">)</span>
<span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"</span><span class="nv">$MAINTAINERS</span><span class="s2">"</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="nb">read</span><span class="w"> </span>email<span class="p">;</span><span class="w"> </span><span class="k">do</span>
<span class="w"> </span><span class="nb">echo</span><span class="w"> </span>-n<span class="w"> </span><span class="s2">"--to=</span><span class="si">${</span><span class="nv">email</span><span class="si">}</span><span class="s2"> "</span><span class="p">;</span>
<span class="w"> </span><span class="k">done</span>
<span class="o">}</span>
</code></pre></div></td></tr></table></div>
<h4>Example</h4>
<div class="highlight"><pre><span></span><code><span class="o">~/</span><span class="k">work</span><span class="o">/</span><span class="n">linux</span><span class="w"> </span><span class="err">$</span><span class="w"> </span><span class="n">get_maintainer</span><span class="w"> </span><span class="mi">1</span>
<span class="o">--</span><span class="k">to</span><span class="o">=</span><span class="n">gregkh</span><span class="nv">@linuxfoundation</span><span class="p">.</span><span class="n">org</span><span class="w"> </span><span class="o">--</span><span class="k">to</span><span class="o">=</span><span class="n">jslaby</span><span class="nv">@suse</span><span class="p">.</span><span class="n">com</span><span class="w"> </span><span class="o">--</span><span class="k">to</span><span class="o">=</span><span class="n">linux</span><span class="o">-</span><span class="n">serial</span><span class="nv">@vger</span><span class="p">.</span><span class="n">kernel</span><span class="p">.</span><span class="n">org</span><span class="w"> </span><span class="o">--</span><span class="k">to</span><span class="o">=</span><span class="n">linux</span><span class="o">-</span><span class="n">kernel</span><span class="nv">@vger</span><span class="p">.</span><span class="n">kernel</span><span class="p">.</span><span class="n">org</span>
<span class="o">~/</span><span class="k">work</span><span class="o">/</span><span class="n">linux</span><span class="w"> </span><span class="err">$</span><span class="w"> </span><span class="n">git</span><span class="w"> </span><span class="n">send</span><span class="o">-</span><span class="n">email</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="err">$</span><span class="p">(</span><span class="n">get_maintainer</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span>
</code></pre></div>