<feed xmlns='http://www.w3.org/2005/Atom'>
<title>linux-stable.git/drivers/gpu/drm/i915/intel_ringbuffer.h, branch linux-3.16.y</title>
<subtitle>Linux kernel stable tree</subtitle>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/'/>
<entry>
<title>drm/i915: Reorder semaphore deadlock check</title>
<updated>2014-06-11T08:06:43+00:00</updated>
<author>
<name>Chris Wilson</name>
<email>chris@chris-wilson.co.uk</email>
</author>
<published>2014-06-06T09:22:29+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=4be173813e57c7298103a83155c2391b5b167b4c'/>
<id>4be173813e57c7298103a83155c2391b5b167b4c</id>
<content type='text'>
If a semaphore is waiting on another ring, which in turn happens to be
waiting on the first ring, but that second semaphore has been signalled,
we will be able to kick the second ring and so can treat the first ring
as a valid WAIT and not as HUNG.

v2: Be paranoid and cap the potential recursion depth whilst visiting
the semaphore signallers. (Mika)

References: https://bugs.freedesktop.org/show_bug.cgi?id=54226
References: https://bugs.freedesktop.org/show_bug.cgi?id=75502
Signed-off-by: Chris Wilson &lt;chris@chris-wilson.co.uk&gt;
Cc: Mika Kuoppala &lt;mika.kuoppala@linux.intel.com&gt;
Cc: stable@vger.kernel.org
Reviewed-by: Mika Kuoppala &lt;mika.kuoppala@intel.com&gt;
Signed-off-by: Jani Nikula &lt;jani.nikula@intel.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
If a semaphore is waiting on another ring, which in turn happens to be
waiting on the first ring, but that second semaphore has been signalled,
we will be able to kick the second ring and so can treat the first ring
as a valid WAIT and not as HUNG.

v2: Be paranoid and cap the potential recursion depth whilst visiting
the semaphore signallers. (Mika)

References: https://bugs.freedesktop.org/show_bug.cgi?id=54226
References: https://bugs.freedesktop.org/show_bug.cgi?id=75502
Signed-off-by: Chris Wilson &lt;chris@chris-wilson.co.uk&gt;
Cc: Mika Kuoppala &lt;mika.kuoppala@linux.intel.com&gt;
Cc: stable@vger.kernel.org
Reviewed-by: Mika Kuoppala &lt;mika.kuoppala@intel.com&gt;
Signed-off-by: Jani Nikula &lt;jani.nikula@intel.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>drm/i915: s/i915_hw_context/intel_context</title>
<updated>2014-05-22T21:41:17+00:00</updated>
<author>
<name>Oscar Mateo</name>
<email>oscar.mateo@intel.com</email>
</author>
<published>2014-05-22T13:13:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=273497e5cdacf50da8884d28cba662c332e0a09e'/>
<id>273497e5cdacf50da8884d28cba662c332e0a09e</id>
<content type='text'>
Up until now, contexts had one (and only one) backing object that was
used by the hardware to save/restore render ring contexts (via the
MI_SET_CONTEXT command). Other rings did not have or need this, so
our i915_hw_context struct had a 1:1 relationship with a a real HW
context.

With Logical Ring Contexts and Execlists, this is not possible anymore:
all rings need a backing object, and it cannot be reused. To prepare
for that, rename our contexts to the more generic term intel_context.

No functional changes.

Signed-off-by: Oscar Mateo &lt;oscar.mateo@intel.com&gt;
Signed-off-by: Daniel Vetter &lt;daniel.vetter@ffwll.ch&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Up until now, contexts had one (and only one) backing object that was
used by the hardware to save/restore render ring contexts (via the
MI_SET_CONTEXT command). Other rings did not have or need this, so
our i915_hw_context struct had a 1:1 relationship with a a real HW
context.

With Logical Ring Contexts and Execlists, this is not possible anymore:
all rings need a backing object, and it cannot be reused. To prepare
for that, rename our contexts to the more generic term intel_context.

No functional changes.

Signed-off-by: Oscar Mateo &lt;oscar.mateo@intel.com&gt;
Signed-off-by: Daniel Vetter &lt;daniel.vetter@ffwll.ch&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>drm/i915: Split the ringbuffers from the rings (3/3)</title>
<updated>2014-05-22T21:30:18+00:00</updated>
<author>
<name>Oscar Mateo</name>
<email>oscar.mateo@intel.com</email>
</author>
<published>2014-05-22T13:13:36+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=93b0a4e0b26e80d8ddf476024e834e675850df81'/>
<id>93b0a4e0b26e80d8ddf476024e834e675850df81</id>
<content type='text'>
Manual cleanup after the previous Coccinelle script.

Yes, I could write another Coccinelle script to do this but I
don't want labor-replacing robots making an honest programmer's
work obsolete (also, I'm lazy).

Signed-off-by: Oscar Mateo &lt;oscar.mateo@intel.com&gt;
Signed-off-by: Daniel Vetter &lt;daniel.vetter@ffwll.ch&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Manual cleanup after the previous Coccinelle script.

Yes, I could write another Coccinelle script to do this but I
don't want labor-replacing robots making an honest programmer's
work obsolete (also, I'm lazy).

Signed-off-by: Oscar Mateo &lt;oscar.mateo@intel.com&gt;
Signed-off-by: Daniel Vetter &lt;daniel.vetter@ffwll.ch&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>drm/i915: Split the ringbuffers from the rings (2/3)</title>
<updated>2014-05-22T21:27:25+00:00</updated>
<author>
<name>Oscar Mateo</name>
<email>oscar.mateo@intel.com</email>
</author>
<published>2014-05-22T13:13:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=ee1b1e5ef38d22e2447b48b8456a2b2bcf438e65'/>
<id>ee1b1e5ef38d22e2447b48b8456a2b2bcf438e65</id>
<content type='text'>
This refactoring has been performed using the following Coccinelle
semantic script:

    @@
    struct intel_engine_cs r;
    @@
    (
    - (r).obj
    + r.buffer-&gt;obj
    |
    - (r).virtual_start
    + r.buffer-&gt;virtual_start
    |
    - (r).head
    + r.buffer-&gt;head
    |
    - (r).tail
    + r.buffer-&gt;tail
    |
    - (r).space
    + r.buffer-&gt;space
    |
    - (r).size
    + r.buffer-&gt;size
    |
    - (r).effective_size
    + r.buffer-&gt;effective_size
    |
    - (r).last_retired_head
    + r.buffer-&gt;last_retired_head
    )

    @@
    struct intel_engine_cs *r;
    @@
    (
    - (r)-&gt;obj
    + r-&gt;buffer-&gt;obj
    |
    - (r)-&gt;virtual_start
    + r-&gt;buffer-&gt;virtual_start
    |
    - (r)-&gt;head
    + r-&gt;buffer-&gt;head
    |
    - (r)-&gt;tail
    + r-&gt;buffer-&gt;tail
    |
    - (r)-&gt;space
    + r-&gt;buffer-&gt;space
    |
    - (r)-&gt;size
    + r-&gt;buffer-&gt;size
    |
    - (r)-&gt;effective_size
    + r-&gt;buffer-&gt;effective_size
    |
    - (r)-&gt;last_retired_head
    + r-&gt;buffer-&gt;last_retired_head
    )

    @@
    expression E;
    @@
    (
    - LP_RING(E)-&gt;obj
    + LP_RING(E)-&gt;buffer-&gt;obj
    |
    - LP_RING(E)-&gt;virtual_start
    + LP_RING(E)-&gt;buffer-&gt;virtual_start
    |
    - LP_RING(E)-&gt;head
    + LP_RING(E)-&gt;buffer-&gt;head
    |
    - LP_RING(E)-&gt;tail
    + LP_RING(E)-&gt;buffer-&gt;tail
    |
    - LP_RING(E)-&gt;space
    + LP_RING(E)-&gt;buffer-&gt;space
    |
    - LP_RING(E)-&gt;size
    + LP_RING(E)-&gt;buffer-&gt;size
    |
    - LP_RING(E)-&gt;effective_size
    + LP_RING(E)-&gt;buffer-&gt;effective_size
    |
    - LP_RING(E)-&gt;last_retired_head
    + LP_RING(E)-&gt;buffer-&gt;last_retired_head
    )

Note: On top of this this patch also removes the now unused ringbuffer
fields in intel_engine_cs.

Signed-off-by: Oscar Mateo &lt;oscar.mateo@intel.com&gt;
[danvet: Add note about fixup patch included here.]
Signed-off-by: Daniel Vetter &lt;daniel.vetter@ffwll.ch&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This refactoring has been performed using the following Coccinelle
semantic script:

    @@
    struct intel_engine_cs r;
    @@
    (
    - (r).obj
    + r.buffer-&gt;obj
    |
    - (r).virtual_start
    + r.buffer-&gt;virtual_start
    |
    - (r).head
    + r.buffer-&gt;head
    |
    - (r).tail
    + r.buffer-&gt;tail
    |
    - (r).space
    + r.buffer-&gt;space
    |
    - (r).size
    + r.buffer-&gt;size
    |
    - (r).effective_size
    + r.buffer-&gt;effective_size
    |
    - (r).last_retired_head
    + r.buffer-&gt;last_retired_head
    )

    @@
    struct intel_engine_cs *r;
    @@
    (
    - (r)-&gt;obj
    + r-&gt;buffer-&gt;obj
    |
    - (r)-&gt;virtual_start
    + r-&gt;buffer-&gt;virtual_start
    |
    - (r)-&gt;head
    + r-&gt;buffer-&gt;head
    |
    - (r)-&gt;tail
    + r-&gt;buffer-&gt;tail
    |
    - (r)-&gt;space
    + r-&gt;buffer-&gt;space
    |
    - (r)-&gt;size
    + r-&gt;buffer-&gt;size
    |
    - (r)-&gt;effective_size
    + r-&gt;buffer-&gt;effective_size
    |
    - (r)-&gt;last_retired_head
    + r-&gt;buffer-&gt;last_retired_head
    )

    @@
    expression E;
    @@
    (
    - LP_RING(E)-&gt;obj
    + LP_RING(E)-&gt;buffer-&gt;obj
    |
    - LP_RING(E)-&gt;virtual_start
    + LP_RING(E)-&gt;buffer-&gt;virtual_start
    |
    - LP_RING(E)-&gt;head
    + LP_RING(E)-&gt;buffer-&gt;head
    |
    - LP_RING(E)-&gt;tail
    + LP_RING(E)-&gt;buffer-&gt;tail
    |
    - LP_RING(E)-&gt;space
    + LP_RING(E)-&gt;buffer-&gt;space
    |
    - LP_RING(E)-&gt;size
    + LP_RING(E)-&gt;buffer-&gt;size
    |
    - LP_RING(E)-&gt;effective_size
    + LP_RING(E)-&gt;buffer-&gt;effective_size
    |
    - LP_RING(E)-&gt;last_retired_head
    + LP_RING(E)-&gt;buffer-&gt;last_retired_head
    )

Note: On top of this this patch also removes the now unused ringbuffer
fields in intel_engine_cs.

Signed-off-by: Oscar Mateo &lt;oscar.mateo@intel.com&gt;
[danvet: Add note about fixup patch included here.]
Signed-off-by: Daniel Vetter &lt;daniel.vetter@ffwll.ch&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>drm/i915: Split the ringbuffers from the rings (1/3)</title>
<updated>2014-05-22T21:02:16+00:00</updated>
<author>
<name>Oscar Mateo</name>
<email>oscar.mateo@intel.com</email>
</author>
<published>2014-05-22T13:13:34+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=8ee149756e4fbaf4462cf3f7377456ec5fff8b63'/>
<id>8ee149756e4fbaf4462cf3f7377456ec5fff8b63</id>
<content type='text'>
As advanced by the previous patch, the ringbuffers and the engine
command streamers belong in different structs. This is so because,
while they used to be tightly coupled together, the new Logical
Ring Contexts (LRC for short) have a ringbuffer each.

In legacy code, we will use the buffer* pointer inside each ring
to get to the pertaining ringbuffer (the actual switch will be
done in the next patch). In the new Execlists code, this pointer
will be NULL and we will use instead the one inside the context
instead.

Signed-off-by: Oscar Mateo &lt;oscar.mateo@intel.com&gt;
Signed-off-by: Daniel Vetter &lt;daniel.vetter@ffwll.ch&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
As advanced by the previous patch, the ringbuffers and the engine
command streamers belong in different structs. This is so because,
while they used to be tightly coupled together, the new Logical
Ring Contexts (LRC for short) have a ringbuffer each.

In legacy code, we will use the buffer* pointer inside each ring
to get to the pertaining ringbuffer (the actual switch will be
done in the next patch). In the new Execlists code, this pointer
will be NULL and we will use instead the one inside the context
instead.

Signed-off-by: Oscar Mateo &lt;oscar.mateo@intel.com&gt;
Signed-off-by: Daniel Vetter &lt;daniel.vetter@ffwll.ch&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>drm/i915: s/intel_ring_buffer/intel_engine_cs</title>
<updated>2014-05-22T21:01:05+00:00</updated>
<author>
<name>Oscar Mateo</name>
<email>oscar.mateo@intel.com</email>
</author>
<published>2014-05-22T13:13:33+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=a4872ba6d01454dfeb251d96f623ab5d1b0666a4'/>
<id>a4872ba6d01454dfeb251d96f623ab5d1b0666a4</id>
<content type='text'>
In the upcoming patches we plan to break the correlation between
engine command streamers (a.k.a. rings) and ringbuffers, so it
makes sense to refactor the code and make the change obvious.

No functional changes.

Signed-off-by: Oscar Mateo &lt;oscar.mateo@intel.com&gt;
Signed-off-by: Daniel Vetter &lt;daniel.vetter@ffwll.ch&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
In the upcoming patches we plan to break the correlation between
engine command streamers (a.k.a. rings) and ringbuffers, so it
makes sense to refactor the code and make the change obvious.

No functional changes.

Signed-off-by: Oscar Mateo &lt;oscar.mateo@intel.com&gt;
Signed-off-by: Daniel Vetter &lt;daniel.vetter@ffwll.ch&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>drm/i915: Use hash tables for the command parser</title>
<updated>2014-05-12T17:15:51+00:00</updated>
<author>
<name>Brad Volkin</name>
<email>bradley.d.volkin@intel.com</email>
</author>
<published>2014-05-10T21:10:43+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=44e895a8a2e2c0512730d756f003a53835c8f7bf'/>
<id>44e895a8a2e2c0512730d756f003a53835c8f7bf</id>
<content type='text'>
For clients that submit large batch buffers the command parser has
a substantial impact on performance. On my HSW ULT system performance
drops as much as ~20% on some tests. Most of the time is spent in the
command lookup code. Converting that from the current naive search to
a hash table lookup reduces the performance drop to ~10%.

The choice of value for I915_CMD_HASH_ORDER allows all commands
currently used in the parser tables to hash to their own bucket (except
for one collision on the render ring). The tradeoff is that it wastes
memory. Because the opcodes for the commands in the tables are not
particularly well distributed, reducing the order still leaves many
buckets empty. The increased collisions don't seem to have a huge
impact on the performance gain, but for now anyhow, the parser trades
memory for performance.

NB: Ville noticed that the error paths through the ring init code
will leak memory. I've not addressed that here. We can do a follow
up pass to handle all of the leaks.

v2: improved comment describing selection of hash key mask (Damien)
replace a BUG_ON() with an error return (Tvrtko, Ville)
commit message improvements

Signed-off-by: Brad Volkin &lt;bradley.d.volkin@intel.com&gt;
Reviewed-by: Damien Lespiau &lt;damien.lespiau@intel.com&gt;
Reviewed-by: Tvrtko Ursulin &lt;tvrtko.ursulin@intel.com&gt;
Signed-off-by: Daniel Vetter &lt;daniel.vetter@ffwll.ch&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
For clients that submit large batch buffers the command parser has
a substantial impact on performance. On my HSW ULT system performance
drops as much as ~20% on some tests. Most of the time is spent in the
command lookup code. Converting that from the current naive search to
a hash table lookup reduces the performance drop to ~10%.

The choice of value for I915_CMD_HASH_ORDER allows all commands
currently used in the parser tables to hash to their own bucket (except
for one collision on the render ring). The tradeoff is that it wastes
memory. Because the opcodes for the commands in the tables are not
particularly well distributed, reducing the order still leaves many
buckets empty. The increased collisions don't seem to have a huge
impact on the performance gain, but for now anyhow, the parser trades
memory for performance.

NB: Ville noticed that the error paths through the ring init code
will leak memory. I've not addressed that here. We can do a follow
up pass to handle all of the leaks.

v2: improved comment describing selection of hash key mask (Damien)
replace a BUG_ON() with an error return (Tvrtko, Ville)
commit message improvements

Signed-off-by: Brad Volkin &lt;bradley.d.volkin@intel.com&gt;
Reviewed-by: Damien Lespiau &lt;damien.lespiau@intel.com&gt;
Reviewed-by: Tvrtko Ursulin &lt;tvrtko.ursulin@intel.com&gt;
Signed-off-by: Daniel Vetter &lt;daniel.vetter@ffwll.ch&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>drm/i915: Support 64b execbuf</title>
<updated>2014-05-05T14:01:58+00:00</updated>
<author>
<name>Ben Widawsky</name>
<email>benjamin.widawsky@intel.com</email>
</author>
<published>2014-04-29T02:29:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=9bcb144c83d4df12c8150352fa876aeff289e39c'/>
<id>9bcb144c83d4df12c8150352fa876aeff289e39c</id>
<content type='text'>
Previously, our code only had a 32b offset value for where the
batchbuffer starts. With full PPGTT, and 64b canonical GPU address
space, that is an insufficient value. The code to expand is pretty
straight forward, and only one platform needs to do anything with the
extra bits.

Signed-off-by: Ben Widawsky &lt;ben@bwidawsk.net&gt;
Reviewed-by: Chris Wilson &lt;chris@chris-wilson.co.uk&gt;
Reviewed-by: Rafael Barbalho &lt;rafael.barbalho@intel.com&gt;
Signed-off-by: Daniel Vetter &lt;daniel.vetter@ffwll.ch&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Previously, our code only had a 32b offset value for where the
batchbuffer starts. With full PPGTT, and 64b canonical GPU address
space, that is an insufficient value. The code to expand is pretty
straight forward, and only one platform needs to do anything with the
extra bits.

Signed-off-by: Ben Widawsky &lt;ben@bwidawsk.net&gt;
Reviewed-by: Chris Wilson &lt;chris@chris-wilson.co.uk&gt;
Reviewed-by: Rafael Barbalho &lt;rafael.barbalho@intel.com&gt;
Signed-off-by: Daniel Vetter &lt;daniel.vetter@ffwll.ch&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>drm/i915: Move ring_begin to signal()</title>
<updated>2014-05-05T08:56:53+00:00</updated>
<author>
<name>Ben Widawsky</name>
<email>benjamin.widawsky@intel.com</email>
</author>
<published>2014-04-29T21:52:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=024a43e12cccd13b7336fc71ab2067a19ade1857'/>
<id>024a43e12cccd13b7336fc71ab2067a19ade1857</id>
<content type='text'>
Add_request has always contained both the semaphore mailbox updates as
well as the breadcrumb writes. Since the semaphore signal is the one
which actually knows about the number of dwords it needs to emit to the
ring, we move the ring_begin to that function. This allows us to remove
the hideously shared #define

On a related not, gen8 will use a different number of dwords for
semaphores, but not for add request.

v2: Make number of dwords an explicit part of signalling (via function
argument). (Chris)

v3: very slight comment change

Reviewed-by: Ville Syrjälä &lt;ville.syrjala@linux.intel.com&gt;
Signed-off-by: Ben Widawsky &lt;ben@bwidawsk.net&gt;
Signed-off-by: Daniel Vetter &lt;daniel.vetter@ffwll.ch&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Add_request has always contained both the semaphore mailbox updates as
well as the breadcrumb writes. Since the semaphore signal is the one
which actually knows about the number of dwords it needs to emit to the
ring, we move the ring_begin to that function. This allows us to remove
the hideously shared #define

On a related not, gen8 will use a different number of dwords for
semaphores, but not for add request.

v2: Make number of dwords an explicit part of signalling (via function
argument). (Chris)

v3: very slight comment change

Reviewed-by: Ville Syrjälä &lt;ville.syrjala@linux.intel.com&gt;
Signed-off-by: Ben Widawsky &lt;ben@bwidawsk.net&gt;
Signed-off-by: Daniel Vetter &lt;daniel.vetter@ffwll.ch&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>drm/i915: Virtualize the ringbuffer signal func</title>
<updated>2014-05-05T08:56:53+00:00</updated>
<author>
<name>Ben Widawsky</name>
<email>benjamin.widawsky@intel.com</email>
</author>
<published>2014-04-29T21:52:29+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=78325f2d270897c9ee0887125b7abb963eb8efea'/>
<id>78325f2d270897c9ee0887125b7abb963eb8efea</id>
<content type='text'>
This abstraction again is in preparation for gen8. Gen8 will bring new
semantics for doing this operation.

While here, make the writes of MI_NOOPs explicit for non-existent rings.
This should have been implicit before.

NOTE: This is going to be removed in a few patches.

Reviewed-by: Ville Syrjälä &lt;ville.syrjala@linux.intel.com&gt;
Signed-off-by: Ben Widawsky &lt;ben@bwidawsk.net&gt;
Signed-off-by: Daniel Vetter &lt;daniel.vetter@ffwll.ch&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This abstraction again is in preparation for gen8. Gen8 will bring new
semantics for doing this operation.

While here, make the writes of MI_NOOPs explicit for non-existent rings.
This should have been implicit before.

NOTE: This is going to be removed in a few patches.

Reviewed-by: Ville Syrjälä &lt;ville.syrjala@linux.intel.com&gt;
Signed-off-by: Ben Widawsky &lt;ben@bwidawsk.net&gt;
Signed-off-by: Daniel Vetter &lt;daniel.vetter@ffwll.ch&gt;
</pre>
</div>
</content>
</entry>
</feed>
