net/ice: add DCF hardware initialization
authorHaiyue Wang <haiyue.wang@intel.com>
Fri, 27 Mar 2020 02:56:36 +0000 (10:56 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 21 Apr 2020 11:57:05 +0000 (13:57 +0200)
Introduce the DCF (Device Config Function) feature in the ice PMD, it
works as a standalone PMD which doesn't handle the packet Rx/Tx related
things. Its hardware entity is the VF.

Add the basic DCF hardware initialization, this is specified by devarg
'cap=dcf'.

Signed-off-by: Haiyue Wang <haiyue.wang@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
doc/guides/nics/ice.rst
doc/guides/nics/img/ice_dcf.svg [new file with mode: 0644]
doc/guides/rel_notes/release_20_05.rst
drivers/common/Makefile
drivers/net/ice/Makefile
drivers/net/ice/ice_dcf.c [new file with mode: 0644]
drivers/net/ice/ice_dcf.h [new file with mode: 0644]
drivers/net/ice/ice_dcf_ethdev.c [new file with mode: 0644]
drivers/net/ice/ice_dcf_ethdev.h [new file with mode: 0644]
drivers/net/ice/meson.build
mk/rte.app.mk

index 8af32da..2639ae2 100644 (file)
@@ -240,6 +240,53 @@ report a MDD event and drop the packets.
 
 The APPs based on DPDK should avoid providing such packets.
 
+Device Config Function (DCF)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This section demonstrates ICE DCF PMD, which shares the core module with ICE
+PMD and iAVF PMD.
+
+A DCF (Device Config Function) PMD bounds to the device's trusted VF with ID 0,
+it can act as a sole controlling entity to exercise advance functionality (such
+as switch, ACL) for the rest VFs.
+
+The DCF PMD needs to advertise and acquire DCF capability which allows DCF to
+send AdminQ commands that it would like to execute over to the PF and receive
+responses for the same from PF.
+
+.. _figure_ice_dcf:
+
+.. figure:: img/ice_dcf.*
+
+   DCF Communication flow.
+
+#. Create the VFs::
+
+      echo 4 > /sys/bus/pci/devices/0000\:18\:00.0/sriov_numvfs
+
+#. Enable the VF0 trust on::
+
+      ip link set dev enp24s0f0 vf 0 trust on
+
+#. Bind the VF0,  and run testpmd with 'cap=dcf' devarg::
+
+      testpmd -l 22-25 -n 4 -w 18:01.0,cap=dcf -- -i
+
+#. Monitor the VF2 interface network traffic::
+
+      tcpdump -e -nn -i enp24s1f2
+
+#. Create one flow to redirect the traffic to VF2 by DCF::
+
+      flow create 0 priority 0 ingress pattern eth / ipv4 src is 192.168.0.2 \
+      dst is 192.168.0.3 / end actions vf id 2 / end
+
+#. Send the packet, and it should be displayed on tcpdump::
+
+      sendp(Ether(src='3c:fd:fe:aa:bb:78', dst='00:00:00:01:02:03')/IP(src=' \
+      192.168.0.2', dst="192.168.0.3")/TCP(flags='S')/Raw(load='XXXXXXXXXX'), \
+      iface="enp24s0f0", count=10)
+
 Sample Application Notes
 ------------------------
 
diff --git a/doc/guides/nics/img/ice_dcf.svg b/doc/guides/nics/img/ice_dcf.svg
new file mode 100644 (file)
index 0000000..c6de820
--- /dev/null
@@ -0,0 +1,516 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="226.02977mm"
+   height="174.625mm"
+   viewBox="0 0 226.02977 174.625"
+   version="1.1"
+   id="svg8"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
+   sodipodi:docname="ice_dcf.svg">
+  <defs
+     id="defs2" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.35"
+     inkscape:cx="415.71428"
+     inkscape:cy="-62.441805"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1001"
+     inkscape:window-x="-9"
+     inkscape:window-y="-9"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(4.1577365,-1.8005958)">
+    <g
+       id="layer1-9"
+       inkscape:label="Layer 1"
+       transform="translate(3.0238119,1.5119048)">
+      <g
+         transform="translate(-2.6458356,-49.514882)"
+         inkscape:label="Layer 1"
+         id="layer1-7">
+        <g
+           style="fill:none;stroke:none;stroke-linecap:square;stroke-miterlimit:10"
+           id="g4657"
+           transform="matrix(0.23544767,0,0,0.24253472,-4.5357128,49.803573)">
+          <g
+             id="g4558"
+             clip-path="url(#p.0)">
+            <path
+               id="path4382"
+               d="M 0,0 H 960 V 720 H 0 Z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+            <path
+               id="path4384"
+               d="M 72.002625,606.8819 H 876.63256 v 77.03937 H 72.002625 Z"
+               inkscape:connector-curvature="0"
+               style="fill:#b7b7b7;fill-rule:evenodd" />
+            <path
+               id="path4386"
+               d="M 72.002625,606.8819 H 876.63256 v 77.03937 H 72.002625 Z"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#b7b7b7;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="path4388"
+               d="m 164.20998,627.07874 h 104.85039 v 37.88977 H 164.20998 Z"
+               inkscape:connector-curvature="0"
+               style="fill:#434343;fill-rule:evenodd" />
+            <path
+               id="path4390"
+               d="m 164.20998,627.07874 h 104.85039 v 37.88977 H 164.20998 Z"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="path4392"
+               d="m 206.1529,653.9987 v -13.35938 h 5.04687 q 1.32813,0 2.03125,0.125 0.96875,0.17188 1.64063,0.64063 0.67187,0.45312 1.07812,1.28125 0.40625,0.82812 0.40625,1.82812 0,1.70313 -1.09375,2.89063 -1.07812,1.17187 -3.92187,1.17187 h -3.42188 v 5.42188 z m 1.76562,-7 h 3.45313 q 1.71875,0 2.4375,-0.64063 0.71875,-0.64062 0.71875,-1.79687 0,-0.84375 -0.42188,-1.4375 -0.42187,-0.59375 -1.125,-0.78125 -0.4375,-0.125 -1.64062,-0.125 h -3.42188 z m 10.7717,7 v -13.35938 h 9.01563 v 1.57813 h -7.25 v 4.14062 h 6.26562 v 1.57813 h -6.26562 v 6.0625 z"
+               inkscape:connector-curvature="0"
+               style="fill:#ffffff;fill-rule:nonzero" />
+            <path
+               id="path4394"
+               d="m 363.36746,627.07874 h 104.85037 v 37.88977 H 363.36746 Z"
+               inkscape:connector-curvature="0"
+               style="fill:#434343;fill-rule:evenodd" />
+            <path
+               id="path4396"
+               d="m 363.36746,627.07874 h 104.85037 v 37.88977 H 363.36746 Z"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="path4398"
+               d="m 409.12286,653.9987 -5.17188,-13.35938 h 1.92188 l 3.46875,9.70313 q 0.42187,1.17187 0.70312,2.1875 0.3125,-1.09375 0.71875,-2.1875 l 3.60938,-9.70313 h 1.79687 l -5.23437,13.35938 z m 8.72482,0 v -13.35938 h 9.01563 v 1.57813 h -7.25 v 4.14062 h 6.26562 v 1.57813 h -6.26562 v 6.0625 z"
+               inkscape:connector-curvature="0"
+               style="fill:#ffffff;fill-rule:nonzero" />
+            <path
+               id="path4400"
+               d="m 527.15485,627.07874 h 104.8504 v 37.88977 h -104.8504 z"
+               inkscape:connector-curvature="0"
+               style="fill:#434343;fill-rule:evenodd" />
+            <path
+               id="path4402"
+               d="m 527.15485,627.07874 h 104.8504 v 37.88977 h -104.8504 z"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="path4404"
+               d="m 572.9103,653.9987 -5.17188,-13.35938 h 1.92188 l 3.46875,9.70313 q 0.42187,1.17187 0.70312,2.1875 0.3125,-1.09375 0.71875,-2.1875 l 3.60938,-9.70313 h 1.79687 l -5.23437,13.35938 z m 8.72479,0 v -13.35938 h 9.01563 v 1.57813 h -7.25 v 4.14062 h 6.26562 v 1.57813 h -6.26562 v 6.0625 z"
+               inkscape:connector-curvature="0"
+               style="fill:#ffffff;fill-rule:nonzero" />
+            <path
+               id="path4406"
+               d="m 683.36743,627.07874 h 104.8504 v 37.88977 h -104.8504 z"
+               inkscape:connector-curvature="0"
+               style="fill:#434343;fill-rule:evenodd" />
+            <path
+               id="path4408"
+               d="m 683.36743,627.07874 h 104.8504 v 37.88977 h -104.8504 z"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="path4410"
+               d="m 729.12286,653.9987 -5.17188,-13.35938 h 1.92188 l 3.46875,9.70313 q 0.42187,1.17187 0.70312,2.1875 0.3125,-1.09375 0.71875,-2.1875 l 3.60938,-9.70313 h 1.79687 l -5.23437,13.35938 z m 8.72485,0 v -13.35938 h 9.01563 v 1.57813 h -7.25 v 4.14062 h 6.26562 v 1.57813 h -6.26562 v 6.0625 z"
+               inkscape:connector-curvature="0"
+               style="fill:#ffffff;fill-rule:nonzero" />
+            <path
+               id="path4412"
+               d="M 72,440.96588 H 876.62994 V 581.18634 H 72 Z"
+               inkscape:connector-curvature="0"
+               style="fill:#cfe2f3;fill-rule:evenodd" />
+            <path
+               id="path4414"
+               d="M 72,440.96588 H 876.62994 V 581.18634 H 72 Z"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#c9daf8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="path4416"
+               d="m 840.4199,529.82153 h 36.62994 V 567.7113 H 840.4199 Z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+            <path
+               id="path4418"
+               d="m 850.81055,556.7415 v -13.35938 h 2.70313 v 5.9375 l 5.4375,-5.9375 h 3.625 l -5.01563,5.20313 5.29688,8.15625 h -3.48438 l -3.67187,-6.26563 -2.1875,2.23438 v 4.03125 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-rule:nonzero" />
+            <path
+               id="path4420"
+               d="m 242.51706,463.70865 h 168.8504 v 82.11026 h -168.8504 z"
+               inkscape:connector-curvature="0"
+               style="fill:#9900ff;fill-rule:evenodd" />
+            <path
+               id="path4422"
+               d="M 308.82507,503.42865 V 480.5224 h 7.42187 q 4.21875,0 5.5,0.34375 1.96875,0.51562 3.29688,2.25 1.32812,1.71875 1.32812,4.45312 0,2.10938 -0.76562,3.54688 -0.76563,1.4375 -1.95313,2.26562 -1.17187,0.8125 -2.39062,1.07813 -1.65625,0.32812 -4.79688,0.32812 h -3.01562 v 8.64063 z m 4.625,-19.03125 v 6.5 h 2.53125 q 2.73437,0 3.65625,-0.35938 0.92187,-0.35937 1.4375,-1.125 0.53125,-0.76562 0.53125,-1.78125 0,-1.25 -0.73438,-2.0625 -0.73437,-0.8125 -1.85937,-1.01562 -0.82813,-0.15625 -3.32813,-0.15625 z m 16.75,19.03125 V 480.5224 h 15.70312 v 3.875 h -11.07812 v 5.42187 h 9.5625 v 3.875 h -9.5625 v 9.73438 z"
+               inkscape:connector-curvature="0"
+               style="fill:#ffffff;fill-rule:nonzero" />
+            <path
+               id="path4424"
+               d="m 302.04187,533.74866 v -17.1875 h 2.26563 v 8.53125 l 8.53125,-8.53125 h 3.07812 l -7.20312,6.96875 7.53125,10.21875 h -3 l -6.125,-8.70313 -2.8125,2.75 v 5.95313 z m 16.02344,0 v -17.1875 h 3.42187 l 4.0625,12.17187 q 0.5625,1.70313 0.82813,2.54688 0.29687,-0.9375 0.90625,-2.76563 l 4.125,-11.95312 h 3.04687 v 17.1875 h -2.1875 v -14.375 l -4.98437,14.375 h -2.0625 l -4.96875,-14.625 v 14.625 z m 20.07031,0 v -17.1875 h 5.90625 q 2.01563,0 3.0625,0.25 1.48438,0.34375 2.51563,1.23437 1.35937,1.14063 2.03125,2.9375 0.6875,1.78125 0.6875,4.07813 0,1.95312 -0.46875,3.46875 -0.45313,1.51562 -1.17188,2.51562 -0.70312,0.98438 -1.5625,1.54688 -0.84375,0.5625 -2.04687,0.85937 -1.20313,0.29688 -2.76563,0.29688 z m 2.26563,-2.03125 h 3.67187 q 1.70313,0 2.65625,-0.3125 0.96875,-0.3125 1.54688,-0.89063 0.8125,-0.8125 1.26562,-2.17187 0.45313,-1.375 0.45313,-3.3125 0,-2.70313 -0.89063,-4.14063 -0.89062,-1.45312 -2.15625,-1.9375 -0.90625,-0.35937 -2.9375,-0.35937 h -3.60937 z"
+               inkscape:connector-curvature="0"
+               style="fill:#ffffff;fill-rule:nonzero" />
+            <path
+               id="path4426"
+               d="M 72,240.5538 H 876.62994 V 400.96325 H 72 Z"
+               inkscape:connector-curvature="0"
+               style="fill:#c9daf8;fill-rule:evenodd" />
+            <path
+               id="path4428"
+               d="M 72,240.5538 H 876.62994 V 400.96325 H 72 Z"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#c9daf8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="path4430"
+               d="M 103.58006,269.6063 H 527.17061 V 370.64567 H 103.58006 Z"
+               inkscape:connector-curvature="0"
+               style="fill:#ffd966;fill-rule:evenodd" />
+            <path
+               id="path4432"
+               d="M 103.58006,269.6063 H 527.17061 V 370.64567 H 103.58006 Z"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#ffd966;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="path4434"
+               d="m 109.89764,300.6404 h 68.22047 v 51.77954 h -68.22047 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+            <path
+               id="path4436"
+               d="m 120.28826,327.56042 v -13.35937 h 2.625 l 5.45313,8.92187 v -8.92187 h 2.51563 v 13.35937 h -2.70313 l -5.39063,-8.70312 v 8.70312 z m 13.45733,0 v -13.35937 h 9.15625 v 2.26562 h -6.45313 v 3.15625 h 5.5625 v 2.26563 h -5.5625 v 5.67187 z m 14.7866,0 -4.78125,-13.35937 h 2.9375 l 3.375,9.89062 3.26563,-9.89062 h 2.85937 l -4.78125,13.35937 z m 8.68447,-10.98437 v -2.375 h 2.5625 v 2.375 z m 0,10.98437 v -9.67187 h 2.5625 v 9.67187 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-rule:nonzero" />
+            <path
+               id="path4438"
+               d="m 194.51706,290.53018 h 104.8504 v 68.56692 h -104.8504 z"
+               inkscape:connector-curvature="0"
+               style="fill:#00ffff;fill-rule:evenodd" />
+            <path
+               id="path4440"
+               d="m 227.57297,317.4502 v -13.35938 h 2.70312 v 5.26563 h 5.28125 v -5.26563 h 2.70313 v 13.35938 h -2.70313 v -5.84375 h -5.28125 v 5.84375 z m 12.86357,-4.96875 q 0,-1.28125 0.625,-2.46875 0.625,-1.20313 1.78125,-1.82813 1.15625,-0.625 2.57813,-0.625 2.1875,0 3.59375,1.42188 1.40625,1.42187 1.40625,3.60937 0,2.1875 -1.42188,3.64063 -1.42187,1.4375 -3.5625,1.4375 -1.32812,0 -2.54687,-0.59375 -1.20313,-0.60938 -1.82813,-1.76563 -0.625,-1.17187 -0.625,-2.82812 z m 2.625,0.125 q 0,1.45312 0.67188,2.21875 0.6875,0.75 1.6875,0.75 1,0 1.67187,-0.75 0.6875,-0.76563 0.6875,-2.23438 0,-1.42187 -0.6875,-2.1875 -0.67187,-0.76562 -1.67187,-0.76562 -1,0 -1.6875,0.76562 -0.67188,0.76563 -0.67188,2.20313 z m 8.45848,2.07812 2.5625,-0.39062 q 0.17188,0.75 0.67188,1.14062 0.5,0.39063 1.40625,0.39063 0.98437,0 1.48437,-0.375 0.34375,-0.25 0.34375,-0.67188 0,-0.29687 -0.1875,-0.48437 -0.1875,-0.1875 -0.85937,-0.34375 -3.09375,-0.6875 -3.92188,-1.25 -1.14062,-0.78125 -1.14062,-2.17188 0,-1.26562 0.98437,-2.10937 1,-0.85938 3.07813,-0.85938 1.98437,0 2.95312,0.65625 0.96875,0.64063 1.32813,1.90625 l -2.40625,0.4375 q -0.15625,-0.5625 -0.59375,-0.85937 -0.42188,-0.29688 -1.23438,-0.29688 -1,0 -1.4375,0.28125 -0.29687,0.20313 -0.29687,0.51563 0,0.26562 0.25,0.46875 0.34375,0.25 2.39062,0.71875 2.04688,0.45312 2.85938,1.14062 0.79687,0.67188 0.79687,1.89063 0,1.34375 -1.10937,2.29687 -1.10938,0.95313 -3.28125,0.95313 -1.98438,0 -3.14063,-0.79688 -1.14062,-0.8125 -1.5,-2.1875 z m 15.71948,-6.90625 v 2.03125 h -1.75 v 3.90625 q 0,1.1875 0.0469,1.39063 0.0469,0.1875 0.21875,0.3125 0.1875,0.125 0.4375,0.125 0.35937,0 1.03125,-0.25 l 0.21875,2 q -0.89063,0.375 -2.01563,0.375 -0.70312,0 -1.26562,-0.23438 -0.54688,-0.23437 -0.8125,-0.59375 -0.25,-0.375 -0.34375,-1 -0.0937,-0.45312 -0.0937,-1.8125 v -4.21875 h -1.17188 v -2.03125 h 1.17188 v -1.92187 l 2.57812,-1.5 v 3.42187 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-rule:nonzero" />
+            <path
+               id="path4442"
+               d="m 220.8043,332.85645 q 0,-2.04688 0.60937,-3.42188 0.45313,-1.03125 1.23438,-1.82812 0.79687,-0.8125 1.73437,-1.20313 1.25,-0.53125 2.875,-0.53125 2.95313,0 4.71875,1.82813 1.78125,1.82812 1.78125,5.09375 0,3.23437 -1.76562,5.0625 -1.75,1.82812 -4.6875,1.82812 -2.98438,0 -4.75,-1.8125 -1.75,-1.82812 -1.75,-5.01562 z m 2.78125,-0.0937 q 0,2.26562 1.04687,3.4375 1.04688,1.17187 2.65625,1.17187 1.60938,0 2.64063,-1.15625 1.04687,-1.17187 1.04687,-3.48437 0,-2.29688 -1.01562,-3.42188 -1,-1.14062 -2.67188,-1.14062 -1.67187,0 -2.6875,1.15625 -1.01562,1.14062 -1.01562,3.4375 z m 11.58955,2.34375 2.625,-0.25 q 0.23438,1.3125 0.95313,1.9375 0.73437,0.60937 1.96875,0.60937 1.29687,0 1.95312,-0.54687 0.67188,-0.54688 0.67188,-1.28125 0,-0.48438 -0.28125,-0.8125 -0.28125,-0.32813 -0.96875,-0.57813 -0.48438,-0.15625 -2.17188,-0.57812 -2.15625,-0.54688 -3.03125,-1.32813 -1.23437,-1.09375 -1.23437,-2.6875 0,-1.01562 0.57812,-1.90625 0.57813,-0.89062 1.65625,-1.34375 1.09375,-0.46875 2.64063,-0.46875 2.51562,0 3.78125,1.10938 1.28125,1.09375 1.34375,2.9375 l -2.70313,0.10937 q -0.17187,-1.03125 -0.75,-1.46875 -0.5625,-0.45312 -1.70312,-0.45312 -1.17188,0 -1.84375,0.46875 -0.42188,0.3125 -0.42188,0.84375 0,0.46875 0.40625,0.79687 0.5,0.4375 2.46875,0.90625 1.96875,0.45313 2.90625,0.95313 0.95313,0.5 1.48438,1.35937 0.53125,0.85938 0.53125,2.125 0,1.15625 -0.64063,2.15625 -0.64062,1 -1.8125,1.48438 -1.15625,0.48437 -2.89062,0.48437 -2.53125,0 -3.89063,-1.17187 -1.35937,-1.17188 -1.625,-3.40625 z m 18.23626,4.34375 v -13.35938 h 2.68751 v 13.35938 z m 3.8708,0.23437 3.3125,-13.8125 h 1.92187 l -3.34375,13.8125 z m 6.58957,-0.23437 v -13.35938 h 9.15625 v 2.26563 h -6.45313 v 3.15625 h 5.5625 v 2.26562 h -5.5625 v 5.67188 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-rule:nonzero" />
+            <path
+               id="path4444"
+               d="m 389.88715,290.53806 h 104.85037 v 68.56692 H 389.88715 Z"
+               inkscape:connector-curvature="0"
+               style="fill:#1c4587;fill-rule:evenodd" />
+            <path
+               id="path4446"
+               d="M 424.5789,317.45807 V 304.0987 h 4.60937 q 1.54688,0 2.375,0.20312 1.14063,0.25 1.95313,0.95313 1.0625,0.89062 1.57812,2.28125 0.53125,1.39062 0.53125,3.17187 0,1.51563 -0.35937,2.70313 -0.35938,1.17187 -0.92188,1.9375 -0.54687,0.76562 -1.20312,1.21875 -0.65625,0.4375 -1.59375,0.67187 -0.9375,0.21875 -2.14063,0.21875 z m 1.76562,-1.57812 h 2.85938 q 1.3125,0 2.0625,-0.23438 0.75,-0.25 1.20312,-0.70312 0.625,-0.625 0.96875,-1.6875 0.35938,-1.0625 0.35938,-2.57813 0,-2.09375 -0.6875,-3.21875 -0.6875,-1.125 -1.67188,-1.5 -0.70312,-0.28125 -2.28125,-0.28125 h -2.8125 z m 21.23859,-3.10938 1.76563,0.45313 q -0.5625,2.17187 -2,3.32812 -1.4375,1.14063 -3.53125,1.14063 -2.15625,0 -3.51563,-0.875 -1.34375,-0.89063 -2.0625,-2.54688 -0.70312,-1.67187 -0.70312,-3.59375 0,-2.07812 0.79687,-3.625 0.79688,-1.5625 2.26563,-2.35937 1.48437,-0.8125 3.25,-0.8125 2,0 3.35937,1.01562 1.375,1.01563 1.90625,2.875 l -1.73437,0.40625 q -0.46875,-1.45312 -1.35938,-2.10937 -0.875,-0.67188 -2.20312,-0.67188 -1.54688,0 -2.57813,0.73438 -1.03125,0.73437 -1.45312,1.98437 -0.42188,1.23438 -0.42188,2.5625 0,1.70313 0.5,2.96875 0.5,1.26563 1.54688,1.90625 1.04687,0.625 2.26562,0.625 1.48438,0 2.51563,-0.85937 1.03125,-0.85938 1.39062,-2.54688 z m 4.03543,4.6875 V 304.0987 h 9.01563 v 1.57812 h -7.25 v 4.14063 h 6.26562 v 1.57812 h -6.26562 v 6.0625 z"
+               inkscape:connector-curvature="0"
+               style="fill:#ffffff;fill-rule:nonzero" />
+            <path
+               id="path4448"
+               d="m 434.4172,324.79117 h 1.26562 v 5.51563 q 0,1.4375 -0.32812,2.29687 -0.3125,0.84375 -1.17188,1.375 -0.84375,0.51563 -2.21875,0.51563 -1.34375,0 -2.20312,-0.45313 -0.84375,-0.46875 -1.21875,-1.34375 -0.35938,-0.875 -0.35938,-2.39062 v -5.51563 h 1.26563 v 5.51563 q 0,1.23437 0.21875,1.82812 0.23437,0.59375 0.79687,0.92188 0.5625,0.3125 1.39063,0.3125 1.39062,0 1.96875,-0.625 0.59375,-0.64063 0.59375,-2.4375 z m 3.32828,9.54688 v -9.54688 h 1.90625 l 2.25,6.76563 q 0.3125,0.9375 0.46875,1.40625 0.15625,-0.51563 0.5,-1.53125 l 2.28125,-6.64063 h 1.70312 v 9.54688 h -1.21875 v -7.98438 l -2.76562,7.98438 h -1.14063 l -2.76562,-8.125 v 8.125 z m 11.14932,0 v -9.54688 h 3.28125 q 1.10938,0 1.70313,0.14063 0.8125,0.1875 1.39062,0.6875 0.76563,0.64062 1.14063,1.64062 0.375,0.98438 0.375,2.25 0,1.09375 -0.26563,1.9375 -0.25,0.82813 -0.65625,1.39063 -0.39062,0.54687 -0.85937,0.85937 -0.46875,0.3125 -1.14063,0.48438 -0.65625,0.15625 -1.53125,0.15625 z m 1.26563,-1.125 h 2.03125 q 0.9375,0 1.46875,-0.17188 0.54687,-0.1875 0.875,-0.5 0.4375,-0.45312 0.6875,-1.20312 0.25,-0.76563 0.25,-1.84375 0,-1.5 -0.5,-2.29688 -0.48438,-0.8125 -1.1875,-1.07812 -0.5,-0.20313 -1.625,-0.20313 h -2 z"
+               inkscape:connector-curvature="0"
+               style="fill:#ffffff;fill-rule:nonzero" />
+            <path
+               id="path4450"
+               d="m 840.41205,357.18372 h 36.62994 v 37.88977 h -36.62994 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+            <path
+               id="path4452"
+               d="m 850.7558,370.74435 h 2.6875 v 7.23437 q 0,1.71875 0.10938,2.23438 0.17187,0.82812 0.8125,1.32812 0.65625,0.48438 1.78125,0.48438 1.15625,0 1.73437,-0.46875 0.59375,-0.46875 0.70313,-1.14063 0.125,-0.6875 0.125,-2.28125 v -7.39062 h 2.6875 v 7.01562 q 0,2.40625 -0.21875,3.40625 -0.21875,0.98438 -0.8125,1.67188 -0.57813,0.6875 -1.5625,1.09375 -0.98438,0.40625 -2.5625,0.40625 -1.92188,0 -2.90625,-0.4375 -0.98438,-0.45313 -1.5625,-1.15625 -0.57813,-0.70313 -0.75,-1.48438 -0.26563,-1.14062 -0.26563,-3.39062 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-rule:nonzero" />
+            <path
+               id="path4454"
+               d="m 612.63257,1.816273 h 264 V 222.4462 h -264 z"
+               inkscape:connector-curvature="0"
+               style="fill:#ffffff;fill-rule:evenodd" />
+            <path
+               id="path4456"
+               d="m 612.63257,1.816273 h 264 V 222.4462 h -264 z"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="path4458"
+               d="m 622.73755,11.92126 h 240 v 90.96063 h -240 z"
+               inkscape:connector-curvature="0"
+               style="fill:#c9daf8;fill-rule:evenodd" />
+            <path
+               id="path4460"
+               d="m 622.73755,11.92126 h 240 v 90.96063 h -240 z"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#d0e0e3;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="path4462"
+               d="m 627.79004,119.28871 h 234.96063 v 90.96063 H 627.79004 Z"
+               inkscape:connector-curvature="0"
+               style="fill:#cfe2f3;fill-rule:evenodd" />
+            <path
+               id="path4464"
+               d="m 627.79004,119.28871 h 234.96063 v 90.96063 H 627.79004 Z"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#c9daf8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="path4466"
+               d="m 636.63257,27.078741 h 84.62988 v 60.44094 h -84.62988 z"
+               inkscape:connector-curvature="0"
+               style="fill:#1c4587;fill-rule:evenodd" />
+            <path
+               id="path4468"
+               d="m 660.66064,42.529987 v -1.890625 h 1.64062 v 1.890625 z m 0,11.46875 v -9.671875 h 1.64062 v 9.671875 z m 2.87915,0 5.125,-13.359375 h 1.90625 l 5.46875,13.359375 h -2.01562 l -1.54688,-4.046875 h -5.59375 l -1.46875,4.046875 z m 3.85938,-5.484375 h 4.53125 l -1.40625,-3.703125 q -0.625,-1.6875 -0.9375,-2.765625 -0.26563,1.28125 -0.71875,2.546875 z m 12.48004,5.484375 -5.17188,-13.359375 h 1.92188 l 3.46875,9.703125 q 0.42187,1.171875 0.70312,2.1875 0.3125,-1.09375 0.71875,-2.1875 l 3.60938,-9.703125 h 1.79687 l -5.23437,13.359375 z m 8.72485,0 V 40.639362 h 9.01563 v 1.578125 h -7.25 v 4.140625 h 6.26562 v 1.578125 h -6.26562 v 6.0625 z"
+               inkscape:connector-curvature="0"
+               style="fill:#ffffff;fill-rule:nonzero" />
+            <path
+               id="path4470"
+               d="m 671.05237,61.331863 h 1.26562 v 5.515625 q 0,1.4375 -0.32812,2.296875 -0.3125,0.84375 -1.17188,1.375 -0.84375,0.515625 -2.21875,0.515625 -1.34375,0 -2.20312,-0.453125 -0.84375,-0.46875 -1.21875,-1.34375 -0.35938,-0.875 -0.35938,-2.390625 v -5.515625 h 1.26563 v 5.515625 q 0,1.234375 0.21875,1.828125 0.23437,0.59375 0.79687,0.921875 0.5625,0.3125 1.39063,0.3125 1.39062,0 1.96875,-0.625 0.59375,-0.640625 0.59375,-2.4375 z m 3.32831,9.546875 v -9.546875 h 1.90625 l 2.25,6.765625 q 0.3125,0.9375 0.46875,1.40625 0.15625,-0.515625 0.5,-1.53125 l 2.28125,-6.640625 h 1.70312 v 9.546875 h -1.21875 v -7.984375 l -2.76562,7.984375 h -1.14063 l -2.76562,-8.125 v 8.125 z m 11.14929,0 v -9.546875 h 3.28125 q 1.10937,0 1.70312,0.140625 0.8125,0.1875 1.39063,0.6875 0.76562,0.640625 1.14062,1.640625 0.375,0.984375 0.375,2.25 0,1.09375 -0.26562,1.9375 -0.25,0.828125 -0.65625,1.390625 -0.39063,0.546875 -0.85938,0.859375 -0.46875,0.3125 -1.14062,0.484375 -0.65625,0.15625 -1.53125,0.15625 z m 1.26562,-1.125 h 2.03125 q 0.9375,0 1.46875,-0.171875 0.54688,-0.1875 0.875,-0.5 0.4375,-0.453125 0.6875,-1.203125 0.25,-0.765625 0.25,-1.84375 0,-1.5 -0.5,-2.296875 -0.48437,-0.8125 -1.1875,-1.078125 -0.5,-0.203125 -1.625,-0.203125 h -2 z"
+               inkscape:connector-curvature="0"
+               style="fill:#ffffff;fill-rule:nonzero" />
+            <path
+               id="path4472"
+               d="M 736.853,3.0787401 H 882.11283 V 27.07874 H 736.853 Z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+            <path
+               id="path4474"
+               d="m 749.603,26.158741 -3.75,-10.484376 h 2.29687 l 2.64063,7.750001 2.57812,-7.750001 h 2.25 L 751.853,26.158741 Z m 7.05682,0 V 15.674365 h 3.17188 l 1.90625,7.156251 1.89062,-7.156251 h 3.17188 v 10.484376 h -1.96875 v -8.265625 l -2.07813,8.265625 h -2.04687 l -2.07813,-8.265625 v 8.265625 z m 15.84327,-3.90625 q 0,-1 0.48437,-1.9375 0.5,-0.9375 1.40625,-1.421875 0.90625,-0.5 2.01563,-0.5 1.71875,0 2.82812,1.125 1.10938,1.109375 1.10938,2.8125 0,1.734375 -1.125,2.875 -1.10938,1.125 -2.79688,1.125 -1.04687,0 -2,-0.46875 -0.9375,-0.46875 -1.4375,-1.375 -0.48437,-0.921875 -0.48437,-2.234375 z m 2.04687,0.109375 q 0,1.125 0.53125,1.734375 0.54688,0.59375 1.34375,0.59375 0.78125,0 1.3125,-0.59375 0.53125,-0.609375 0.53125,-1.75 0,-1.125 -0.53125,-1.71875 -0.53125,-0.609375 -1.3125,-0.609375 -0.79687,0 -1.34375,0.609375 -0.53125,0.59375 -0.53125,1.734375 z m 9.29639,3.796875 h -2.01563 v -7.59375 h 1.85938 v 1.078125 q 0.48437,-0.765625 0.85937,-1 0.39063,-0.25 0.875,-0.25 0.6875,0 1.32813,0.375 l -0.625,1.75 q -0.5,-0.328125 -0.9375,-0.328125 -0.42188,0 -0.71875,0.234375 -0.29688,0.234375 -0.46875,0.84375 -0.15625,0.609375 -0.15625,2.546875 z m 14.57245,-3.859375 2.04687,0.65625 q -0.46875,1.71875 -1.57812,2.546875 -1.09375,0.828125 -2.78125,0.828125 -2.07813,0 -3.4375,-1.421875 -1.34375,-1.421875 -1.34375,-3.90625 0,-2.609375 1.35937,-4.0625 1.35938,-1.453126 3.5625,-1.453126 1.92188,0 3.125,1.140626 0.71875,0.671875 1.0625,1.9375 l -2.09375,0.5 q -0.1875,-0.828125 -0.78125,-1.296875 -0.57812,-0.46875 -1.42187,-0.46875 -1.17188,0 -1.90625,0.84375 -0.71875,0.828125 -0.71875,2.703125 0,1.984375 0.71875,2.84375 0.71875,0.84375 1.85937,0.84375 0.84375,0 1.45313,-0.53125 0.60937,-0.546875 0.875,-1.703125 z m 3.39679,-0.04687 q 0,-1 0.48437,-1.9375 0.5,-0.9375 1.40625,-1.421875 0.90625,-0.5 2.01563,-0.5 1.71875,0 2.82812,1.125 1.10938,1.109375 1.10938,2.8125 0,1.734375 -1.125,2.875 -1.10938,1.125 -2.79688,1.125 -1.04687,0 -2,-0.46875 -0.9375,-0.46875 -1.4375,-1.375 -0.48437,-0.921875 -0.48437,-2.234375 z m 2.04687,0.109375 q 0,1.125 0.53125,1.734375 0.54688,0.59375 1.34375,0.59375 0.78125,0 1.3125,-0.59375 0.53125,-0.609375 0.53125,-1.75 0,-1.125 -0.53125,-1.71875 -0.53125,-0.609375 -1.3125,-0.609375 -0.79687,0 -1.34375,0.609375 -0.53125,0.59375 -0.53125,1.734375 z m 14.28076,3.796875 h -2.01562 v -3.875 q 0,-1.234375 -0.125,-1.59375 -0.125,-0.359375 -0.42188,-0.5625 -0.29687,-0.203125 -0.70312,-0.203125 -0.51563,0 -0.9375,0.296875 -0.40625,0.28125 -0.5625,0.75 -0.15625,0.46875 -0.15625,1.75 v 3.4375 h -2.01563 v -7.59375 h 1.875 v 1.109375 q 1,-1.28125 2.5,-1.28125 0.67188,0 1.21875,0.234375 0.54688,0.234375 0.82813,0.609375 0.29687,0.375 0.40625,0.84375 0.10937,0.46875 0.10937,1.359375 z m 5.51514,-7.59375 v 1.59375 h -1.375 v 3.0625 q 0,0.9375 0.0312,1.09375 0.0469,0.140625 0.1875,0.25 0.14062,0.09375 0.34375,0.09375 0.28125,0 0.8125,-0.1875 l 0.17187,1.5625 q -0.70312,0.296875 -1.59375,0.296875 -0.54687,0 -0.98437,-0.171875 -0.42188,-0.1875 -0.64063,-0.46875 -0.20312,-0.296875 -0.28125,-0.796875 -0.0625,-0.359375 -0.0625,-1.421875 v -3.3125 h -0.92187 v -1.59375 h 0.92187 v -1.515625 l 2.01563,-1.171876 v 2.687501 z m 2.91187,2.3125 -1.82813,-0.328125 q 0.29688,-1.109375 1.04688,-1.625 0.76562,-0.53125 2.23437,-0.53125 1.35938,0 2.01563,0.3125 0.65625,0.3125 0.92187,0.8125 0.26563,0.484375 0.26563,1.796875 l -0.0156,2.34375 q 0,1 0.0937,1.484375 0.0937,0.46875 0.35938,1.015625 h -1.98438 q -0.0781,-0.203125 -0.20312,-0.59375 -0.0469,-0.171875 -0.0625,-0.234375 -0.51563,0.5 -1.10938,0.75 -0.57812,0.25 -1.25,0.25 -1.17187,0 -1.85937,-0.640625 -0.67188,-0.640625 -0.67188,-1.609375 0,-0.640625 0.3125,-1.140625 0.3125,-0.515625 0.85938,-0.78125 0.5625,-0.265625 1.60937,-0.46875 1.40625,-0.265625 1.95313,-0.484375 v -0.203125 q 0,-0.578125 -0.29688,-0.828125 -0.28125,-0.25 -1.07812,-0.25 -0.53125,0 -0.84375,0.21875 -0.29688,0.203125 -0.46875,0.734375 z m 2.6875,1.625 q -0.39063,0.140625 -1.23438,0.328125 -0.82812,0.171875 -1.09375,0.34375 -0.39062,0.265625 -0.39062,0.703125 0,0.421875 0.3125,0.734375 0.3125,0.296875 0.8125,0.296875 0.53125,0 1.03125,-0.359375 0.35937,-0.265625 0.48437,-0.65625 0.0781,-0.265625 0.0781,-0.984375 z m 3.94799,-4.96875 V 15.67437 h 2.01563 v 1.859376 z m 0,8.625 v -7.59375 h 2.01563 v 7.59375 z m 10.99384,0 h -2.01563 v -3.875 q 0,-1.234375 -0.125,-1.59375 -0.125,-0.359375 -0.42187,-0.5625 -0.29688,-0.203125 -0.70313,-0.203125 -0.51562,0 -0.9375,0.296875 -0.40625,0.28125 -0.5625,0.75 -0.15625,0.46875 -0.15625,1.75 v 3.4375 h -2.01562 v -7.59375 h 1.875 v 1.109375 q 1,-1.28125 2.5,-1.28125 0.67187,0 1.21875,0.234375 0.54687,0.234375 0.82812,0.609375 0.29688,0.375 0.40625,0.84375 0.10938,0.46875 0.10938,1.359375 z m 6.43701,-2.421875 2,0.34375 q -0.375,1.09375 -1.21875,1.671875 -0.82813,0.578125 -2.07813,0.578125 -1.98437,0 -2.9375,-1.296875 -0.75,-1.03125 -0.75,-2.625 0,-1.875 0.98438,-2.9375 0.98437,-1.078125 2.5,-1.078125 1.6875,0 2.67187,1.125 0.98438,1.109375 0.9375,3.421875 h -5.03125 q 0.0156,0.890625 0.48438,1.390625 0.46875,0.5 1.15625,0.5 0.46875,0 0.78125,-0.25 0.32812,-0.265625 0.5,-0.84375 z m 0.10937,-2.03125 q -0.0156,-0.875 -0.45312,-1.328125 -0.42188,-0.453125 -1.03125,-0.453125 -0.67188,0 -1.09375,0.484375 -0.42188,0.46875 -0.42188,1.296875 z m 5.573,4.453125 h -2.01562 v -7.59375 h 1.85937 v 1.078125 q 0.48438,-0.765625 0.85938,-1 0.39062,-0.25 0.875,-0.25 0.6875,0 1.32812,0.375 l -0.625,1.75 q -0.5,-0.328125 -0.9375,-0.328125 -0.42187,0 -0.71875,0.234375 -0.29687,0.234375 -0.46875,0.84375 -0.15625,0.609375 -0.15625,2.546875 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-rule:nonzero" />
+            <path
+               id="path4476"
+               d="m 826.52496,59.92651 h 36.62988 v 37.889767 h -36.62988 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+            <path
+               id="path4478"
+               d="m 836.8687,73.48713 h 2.6875 v 7.234375 q 0,1.71875 0.10937,2.234375 0.17188,0.828125 0.8125,1.328125 0.65625,0.484375 1.78125,0.484375 1.15625,0 1.73438,-0.46875 0.59375,-0.46875 0.70312,-1.140625 0.125,-0.6875 0.125,-2.28125 V 73.48713 h 2.6875 v 7.015625 q 0,2.40625 -0.21875,3.40625 -0.21875,0.984375 -0.8125,1.671875 -0.57812,0.6875 -1.5625,1.09375 -0.98437,0.40625 -2.5625,0.40625 -1.92187,0 -2.90625,-0.4375 -0.98437,-0.453125 -1.5625,-1.15625 -0.57812,-0.703125 -0.75,-1.484375 -0.26562,-1.140625 -0.26562,-3.390625 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-rule:nonzero" />
+            <path
+               id="path4480"
+               d="m 826.5276,169.82152 h 36.62988 v 37.88977 H 826.5276 Z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+            <path
+               id="path4482"
+               d="m 836.9182,196.74152 v -13.35938 h 2.70312 v 5.9375 l 5.4375,-5.9375 h 3.625 l -5.01562,5.20313 5.29687,8.15625 h -3.48437 l -3.67188,-6.26563 -2.1875,2.23438 v 4.03125 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-rule:nonzero" />
+            <path
+               id="path4484"
+               d="m 737.26245,130.83989 h 84.62994 v 60.44095 h -84.62994 z"
+               inkscape:connector-curvature="0"
+               style="fill:#999999;fill-rule:evenodd" />
+            <path
+               id="path4486"
+               d="m 761.2905,146.29114 v -1.89062 h 1.64062 v 1.89062 z m 0,11.46875 v -9.67187 h 1.64062 v 9.67187 z m 2.87921,0 5.125,-13.35937 h 1.90625 l 5.46875,13.35937 h -2.01562 l -1.54688,-4.04687 h -5.59375 l -1.46875,4.04687 z m 3.85938,-5.48437 h 4.53125 l -1.40625,-3.70313 q -0.625,-1.6875 -0.9375,-2.76562 -0.26563,1.28125 -0.71875,2.54687 z m 12.48004,5.48437 -5.17188,-13.35937 h 1.92188 l 3.46875,9.70312 q 0.42187,1.17188 0.70312,2.1875 0.3125,-1.09375 0.71875,-2.1875 l 3.60938,-9.70312 h 1.79687 l -5.23437,13.35937 z m 8.72479,0 v -13.35937 h 9.01563 v 1.57812 h -7.25 v 4.14063 h 6.26562 v 1.57812 h -6.26562 v 6.0625 z"
+               inkscape:connector-curvature="0"
+               style="fill:#ffffff;fill-rule:nonzero" />
+            <path
+               id="path4488"
+               d="m 765.7375,174.6399 v -9.54688 h 1.26562 v 4.73438 l 4.73438,-4.73438 h 1.71875 l -4,3.875 4.17187,5.67188 h -1.65625 l -3.40625,-4.82813 -1.5625,1.51563 v 3.3125 z m 8.9054,0 v -9.54688 h 1.90625 l 2.25,6.76563 q 0.3125,0.9375 0.46875,1.40625 0.15625,-0.51563 0.5,-1.53125 l 2.28125,-6.64063 h 1.70312 v 9.54688 h -1.21875 v -7.98438 l -2.76562,7.98438 h -1.14063 l -2.76562,-8.125 v 8.125 z m 11.14929,0 v -9.54688 h 3.28125 q 1.10937,0 1.70312,0.14063 0.8125,0.1875 1.39063,0.6875 0.76562,0.64062 1.14062,1.64062 0.375,0.98438 0.375,2.25 0,1.09375 -0.26562,1.9375 -0.25,0.82813 -0.65625,1.39063 -0.39063,0.54687 -0.85938,0.85937 -0.46875,0.3125 -1.14062,0.48438 -0.65625,0.15625 -1.53125,0.15625 z m 1.26562,-1.125 h 2.03125 q 0.9375,0 1.46875,-0.17188 0.54688,-0.1875 0.875,-0.5 0.4375,-0.45312 0.6875,-1.20312 0.25,-0.76563 0.25,-1.84375 0,-1.5 -0.5,-2.29688 -0.48437,-0.8125 -1.1875,-1.07812 -0.5,-0.20313 -1.625,-0.20313 h -2 z"
+               inkscape:connector-curvature="0"
+               style="fill:#ffffff;fill-rule:nonzero" />
+            <path
+               id="path4490"
+               d="m 104.41995,29.606298 h 195.7795 v 90.960632 h -195.7795 z"
+               inkscape:connector-curvature="0"
+               style="fill:#ffd966;fill-rule:evenodd" />
+            <path
+               id="path4492"
+               d="m 104.41995,29.606298 h 195.7795 v 90.960632 h -195.7795 z"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#ffd966;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="path4494"
+               d="M 134.73753,27.921259 H 264.84777 V 118.88189 H 134.73753 Z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+            <path
+               id="path4496"
+               d="M 166.94131,54.84126 V 41.481885 h 5.6875 q 2.14062,0 3.10937,0.359375 0.96875,0.359375 1.54688,1.28125 0.57812,0.921875 0.57812,2.109375 0,1.5 -0.89062,2.484375 -0.875,0.96875 -2.625,1.234375 0.875,0.5 1.4375,1.125 0.57812,0.609375 1.53125,2.15625 l 1.64062,2.609375 h -3.23437 l -1.9375,-2.90625 q -1.04688,-1.5625 -1.4375,-1.96875 -0.375,-0.40625 -0.8125,-0.546875 -0.42188,-0.15625 -1.34375,-0.15625 h -0.54688 v 5.578125 z m 2.70312,-7.703125 h 2 q 1.9375,0 2.42188,-0.15625 0.48437,-0.171875 0.75,-0.578125 0.28125,-0.40625 0.28125,-1 0,-0.671875 -0.35938,-1.078125 -0.35937,-0.421875 -1.01562,-0.53125 -0.32813,-0.04687 -1.96875,-0.04687 h -2.10938 z m 16.34795,4.625 2.54688,0.421875 q -0.48438,1.40625 -1.54688,2.140625 -1.0625,0.734375 -2.65625,0.734375 -2.51562,0 -3.73437,-1.65625 -0.95313,-1.3125 -0.95313,-3.328125 0,-2.40625 1.25,-3.765625 1.26563,-1.359375 3.1875,-1.359375 2.15625,0 3.40625,1.421875 1.25,1.421875 1.1875,4.375 h -6.40625 q 0.0312,1.140625 0.60938,1.78125 0.59375,0.625 1.48437,0.625 0.59375,0 1,-0.328125 0.42188,-0.328125 0.625,-1.0625 z m 0.15625,-2.59375 q -0.0312,-1.109375 -0.57812,-1.6875 -0.54688,-0.578125 -1.32813,-0.578125 -0.84375,0 -1.39062,0.609375 -0.54688,0.609375 -0.53125,1.65625 z m 4.42259,-4 h 2.35938 v 1.3125 q 1.26562,-1.53125 3.01562,-1.53125 0.9375,0 1.60938,0.390625 0.6875,0.375 1.125,1.140625 0.64062,-0.765625 1.375,-1.140625 0.75,-0.390625 1.57812,-0.390625 1.0625,0 1.79688,0.4375 0.75,0.421875 1.10937,1.265625 0.26563,0.625 0.26563,2 v 6.1875 h -2.5625 v -5.53125 q 0,-1.4375 -0.26563,-1.859375 -0.34375,-0.546875 -1.09375,-0.546875 -0.53125,0 -1.01562,0.328125 -0.46875,0.328125 -0.67188,0.96875 -0.20312,0.625 -0.20312,2 v 4.640625 h -2.5625 v -5.296875 q 0,-1.421875 -0.14063,-1.828125 -0.14062,-0.40625 -0.42187,-0.609375 -0.28125,-0.203125 -0.78125,-0.203125 -0.59375,0 -1.0625,0.328125 -0.46875,0.3125 -0.6875,0.921875 -0.20313,0.59375 -0.20313,1.984375 v 4.703125 h -2.5625 z m 16.19777,4.703125 q 0,-1.28125 0.625,-2.46875 0.625,-1.203125 1.78125,-1.828125 1.15625,-0.625 2.57813,-0.625 2.1875,0 3.59375,1.421875 1.40625,1.421875 1.40625,3.609375 0,2.1875 -1.42188,3.640625 -1.42187,1.4375 -3.5625,1.4375 -1.32812,0 -2.54687,-0.59375 -1.20313,-0.609375 -1.82813,-1.765625 -0.625,-1.171875 -0.625,-2.828125 z m 2.625,0.125 q 0,1.453125 0.67188,2.21875 0.6875,0.75 1.6875,0.75 1,0 1.67187,-0.75 0.6875,-0.765625 0.6875,-2.234375 0,-1.421875 -0.6875,-2.1875 -0.67187,-0.765625 -1.67187,-0.765625 -1,0 -1.6875,0.765625 -0.67188,0.765625 -0.67188,2.203125 z m 13.80223,-4.828125 v 2.03125 h -1.75 v 3.90625 q 0,1.1875 0.0469,1.390625 0.0469,0.1875 0.21875,0.3125 0.1875,0.125 0.4375,0.125 0.35937,0 1.03125,-0.25 l 0.21875,2 q -0.89063,0.375 -2.01563,0.375 -0.70312,0 -1.26562,-0.234375 -0.54688,-0.234375 -0.8125,-0.59375 -0.25,-0.375 -0.34375,-1 -0.0937,-0.453125 -0.0937,-1.8125 v -4.21875 h -1.17188 v -2.03125 h 1.17188 V 43.24751 l 2.57812,-1.5 v 3.421875 z m 7.36893,6.59375 2.54688,0.421875 q -0.48438,1.40625 -1.54688,2.140625 -1.0625,0.734375 -2.65625,0.734375 -2.51562,0 -3.73437,-1.65625 -0.95313,-1.3125 -0.95313,-3.328125 0,-2.40625 1.25,-3.765625 1.26563,-1.359375 3.1875,-1.359375 2.15625,0 3.40625,1.421875 1.25,1.421875 1.1875,4.375 h -6.40625 q 0.0312,1.140625 0.60938,1.78125 0.59375,0.625 1.48437,0.625 0.59375,0 1,-0.328125 0.42188,-0.328125 0.625,-1.0625 z m 0.15625,-2.59375 q -0.0312,-1.109375 -0.57812,-1.6875 -0.54688,-0.578125 -1.32813,-0.578125 -0.84375,0 -1.39062,0.609375 -0.54688,0.609375 -0.53125,1.65625 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-rule:nonzero" />
+            <path
+               id="path4498"
+               d="m 187.97444,76.841255 -4.78125,-13.359371 h 2.9375 l 3.375,9.890621 3.26562,-9.890621 h 2.85938 l -4.78125,13.359371 z m 8.9592,0 V 63.481884 h 2.6875 v 13.359371 z m 5.23018,0 V 63.481884 h 4.03125 l 2.42187,9.109371 2.39063,-9.109371 h 4.04687 v 13.359371 h -2.5 V 66.32563 l -2.65625,10.515625 h -2.59375 L 204.66382,66.32563 v 10.515625 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-rule:nonzero" />
+            <path
+               id="path4500"
+               d="m 165.13069,93.935005 2.60937,0.828125 q -0.59375,2.1875 -2,3.25 -1.39062,1.0625 -3.54687,1.0625 -2.65625,0 -4.375,-1.8125 -1.70313,-1.828125 -1.70313,-4.984375 0,-3.328125 1.71875,-5.171875 1.71875,-1.84375 4.51563,-1.84375 2.45312,0 3.98437,1.4375 0.92188,0.859375 1.375,2.46875 l -2.67187,0.640625 q -0.23438,-1.046875 -0.98438,-1.640625 -0.75,-0.609375 -1.82812,-0.609375 -1.48438,0 -2.42188,1.078125 -0.92187,1.0625 -0.92187,3.4375 0,2.53125 0.90625,3.609375 0.92187,1.078125 2.375,1.078125 1.07812,0 1.84375,-0.671875 0.78125,-0.6875 1.125,-2.15625 z m 4.3167,-0.0625 q 0,-1.28125 0.625,-2.46875 0.625,-1.203125 1.78125,-1.828125 1.15625,-0.625 2.57812,-0.625 2.1875,0 3.59375,1.421875 1.40625,1.421875 1.40625,3.609375 0,2.1875 -1.42187,3.640625 -1.42188,1.4375 -3.5625,1.4375 -1.32813,0 -2.54688,-0.59375 -1.20312,-0.609375 -1.82812,-1.765625 -0.625,-1.171875 -0.625,-2.828125 z m 2.625,0.125 q 0,1.453125 0.67187,2.21875 0.6875,0.75 1.6875,0.75 1,0 1.67188,-0.75 0.6875,-0.765625 0.6875,-2.234375 0,-1.421875 -0.6875,-2.1875 -0.67188,-0.765625 -1.67188,-0.765625 -1,0 -1.6875,0.765625 -0.67187,0.765625 -0.67187,2.203125 z m 18.1616,4.84375 h -2.5625 v -4.9375 q 0,-1.5625 -0.17187,-2.015625 -0.15625,-0.46875 -0.53125,-0.71875 -0.35938,-0.265625 -0.875,-0.265625 -0.67188,0 -1.20313,0.375 -0.53125,0.359375 -0.73437,0.96875 -0.1875,0.59375 -0.1875,2.21875 v 4.375 h -2.54688 V 89.16938 h 2.375 v 1.421875 q 1.26563,-1.640625 3.1875,-1.640625 0.84375,0 1.54688,0.3125 0.70312,0.296875 1.0625,0.78125 0.35937,0.46875 0.5,1.078125 0.14062,0.59375 0.14062,1.703125 z m 7.03661,-9.671875 v 2.03125 h -1.75 v 3.90625 q 0,1.1875 0.0469,1.390625 0.0469,0.1875 0.21875,0.3125 0.1875,0.125 0.4375,0.125 0.35938,0 1.03125,-0.25 l 0.21875,2 q -0.89062,0.375 -2.01562,0.375 -0.70313,0 -1.26563,-0.234375 -0.54687,-0.234375 -0.8125,-0.59375 -0.25,-0.375 -0.34375,-1 -0.0937,-0.453125 -0.0937,-1.8125 v -4.21875 h -1.17187 v -2.03125 h 1.17187 v -1.921875 l 2.57813,-1.5 v 3.421875 z m 4.2283,9.671875 h -2.5625 V 89.16938 h 2.375 v 1.375 q 0.60938,-0.984375 1.09375,-1.28125 0.48438,-0.3125 1.10938,-0.3125 0.875,0 1.6875,0.484375 l -0.79688,2.234375 q -0.64062,-0.421875 -1.20312,-0.421875 -0.53125,0 -0.90625,0.296875 -0.375,0.296875 -0.59375,1.078125 -0.20313,0.765625 -0.20313,3.234375 z m 4.21339,-4.96875 q 0,-1.28125 0.625,-2.46875 0.625,-1.203125 1.78125,-1.828125 1.15625,-0.625 2.57813,-0.625 2.1875,0 3.59375,1.421875 1.40625,1.421875 1.40625,3.609375 0,2.1875 -1.42188,3.640625 -1.42187,1.4375 -3.5625,1.4375 -1.32812,0 -2.54687,-0.59375 -1.20313,-0.609375 -1.82813,-1.765625 -0.625,-1.171875 -0.625,-2.828125 z m 2.625,0.125 q 0,1.453125 0.67188,2.21875 0.6875,0.75 1.6875,0.75 1,0 1.67187,-0.75 0.6875,-0.765625 0.6875,-2.234375 0,-1.421875 -0.6875,-2.1875 -0.67187,-0.765625 -1.67187,-0.765625 -1,0 -1.6875,0.765625 -0.67188,0.765625 -0.67188,2.203125 z m 9.36474,4.84375 V 85.48188 h 2.5625 v 13.359375 z m 5.1833,0 V 85.48188 h 2.5625 v 13.359375 z m 10.77705,-3.078125 2.54688,0.421875 q -0.48438,1.40625 -1.54688,2.140625 -1.0625,0.734375 -2.65625,0.734375 -2.51562,0 -3.73437,-1.65625 -0.95313,-1.3125 -0.95313,-3.328125 0,-2.40625 1.25,-3.765625 1.26563,-1.359375 3.1875,-1.359375 2.15625,0 3.40625,1.421875 1.25,1.421875 1.1875,4.375 h -6.40625 q 0.0312,1.140625 0.60938,1.78125 0.59375,0.625 1.48437,0.625 0.59375,0 1,-0.328125 0.42188,-0.328125 0.625,-1.0625 z m 0.15625,-2.59375 q -0.0312,-1.109375 -0.57812,-1.6875 -0.54688,-0.578125 -1.32813,-0.578125 -0.84375,0 -1.39062,0.609375 -0.54688,0.609375 -0.53125,1.65625 z m 7.07885,5.671875 h -2.5625 V 89.16938 h 2.375 v 1.375 q 0.60937,-0.984375 1.09375,-1.28125 0.48437,-0.3125 1.10937,-0.3125 0.875,0 1.6875,0.484375 l -0.79687,2.234375 q -0.64063,-0.421875 -1.20313,-0.421875 -0.53125,0 -0.90625,0.296875 -0.375,0.296875 -0.59375,1.078125 -0.20312,0.765625 -0.20312,3.234375 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-rule:nonzero" />
+            <path
+               id="path4502"
+               d="m 189.47244,133.82152 9.48032,-9.48031 9.48031,9.48031 h -4.74016 v 117.25984 h 4.74016 l -9.48031,9.48032 -9.48032,-9.48032 h 4.74016 V 133.82152 Z"
+               inkscape:connector-curvature="0"
+               style="fill:#b7b7b7;fill-rule:evenodd" />
+            <path
+               id="path4504"
+               d="m 189.47244,133.82152 9.48032,-9.48031 9.48031,9.48031 h -4.74016 v 117.25984 h 4.74016 l -9.48031,9.48032 -9.48032,-9.48032 h 4.74016 V 133.82152 Z"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#b7b7b7;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="path4506"
+               d="m 137.68504,150.86876 h 131.37007 v 40.40945 H 137.68504 Z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+            <path
+               id="path4508"
+               d="m 147.9663,177.78876 v -13.35938 h 2.6875 v 13.35938 z m 5.26143,0 v -13.35938 h 4.32812 q 2.45313,0 3.20313,0.20313 1.14062,0.29687 1.92187,1.3125 0.78125,1 0.78125,2.59375 0,1.23437 -0.45312,2.07812 -0.45313,0.82813 -1.14063,1.3125 -0.6875,0.46875 -1.39062,0.625 -0.96875,0.20313 -2.79688,0.20313 h -1.76562 v 5.03125 z m 2.6875,-11.09375 v 3.78125 h 1.48437 q 1.59375,0 2.125,-0.20313 0.54688,-0.20312 0.84375,-0.65625 0.3125,-0.45312 0.3125,-1.03125 0,-0.73437 -0.4375,-1.20312 -0.42187,-0.48438 -1.07812,-0.59375 -0.48438,-0.0937 -1.9375,-0.0937 z m 14.63339,11.09375 v -13.35938 h 2.625 l 5.45313,8.92188 v -8.92188 h 2.51562 v 13.35938 h -2.70312 l -5.39063,-8.70313 v 8.70313 z m 19.01982,-3.07813 2.54688,0.42188 q -0.48438,1.40625 -1.54688,2.14062 -1.0625,0.73438 -2.65625,0.73438 -2.51562,0 -3.73437,-1.65625 -0.95313,-1.3125 -0.95313,-3.32813 0,-2.40625 1.25,-3.76562 1.26563,-1.35938 3.1875,-1.35938 2.15625,0 3.40625,1.42188 1.25,1.42187 1.1875,4.375 h -6.40625 q 0.0312,1.14062 0.60938,1.78125 0.59375,0.625 1.48437,0.625 0.59375,0 1,-0.32813 0.42188,-0.32812 0.625,-1.0625 z m 0.15625,-2.59375 q -0.0312,-1.10937 -0.57812,-1.6875 -0.54688,-0.57812 -1.32813,-0.57812 -0.84375,0 -1.39062,0.60937 -0.54688,0.60938 -0.53125,1.65625 z m 9.06322,-4 v 2.03125 h -1.75 v 3.90625 q 0,1.1875 0.0469,1.39063 0.0469,0.1875 0.21875,0.3125 0.1875,0.125 0.4375,0.125 0.35938,0 1.03125,-0.25 l 0.21875,2 q -0.89062,0.375 -2.01562,0.375 -0.70313,0 -1.26563,-0.23438 -0.54687,-0.23437 -0.8125,-0.59375 -0.25,-0.375 -0.34375,-1 -0.0937,-0.45312 -0.0937,-1.8125 v -4.21875 h -1.17187 v -2.03125 h 1.17187 v -1.92187 l 2.57813,-1.5 v 3.42187 z m 3.57205,9.67188 -3.0625,-9.67188 h 2.48438 l 1.8125,6.34375 1.67187,-6.34375 h 2.46875 l 1.60938,6.34375 1.85937,-6.34375 h 2.51563 l -3.10938,9.67188 h -2.45312 l -1.67188,-6.21875 -1.64062,6.21875 z m 12.1208,-4.96875 q 0,-1.28125 0.625,-2.46875 0.625,-1.20313 1.78125,-1.82813 1.15625,-0.625 2.57813,-0.625 2.1875,0 3.59375,1.42188 1.40625,1.42187 1.40625,3.60937 0,2.1875 -1.42188,3.64063 -1.42187,1.4375 -3.5625,1.4375 -1.32812,0 -2.54687,-0.59375 -1.20313,-0.60938 -1.82813,-1.76563 -0.625,-1.17187 -0.625,-2.82812 z m 2.625,0.125 q 0,1.45312 0.67188,2.21875 0.6875,0.75 1.6875,0.75 1,0 1.67187,-0.75 0.6875,-0.76563 0.6875,-2.23438 0,-1.42187 -0.6875,-2.1875 -0.67187,-0.76562 -1.67187,-0.76562 -1,0 -1.6875,0.76562 -0.67188,0.76563 -0.67188,2.20313 z m 11.81786,4.84375 h -2.5625 v -9.67188 h 2.375 v 1.375 q 0.60938,-0.98437 1.09375,-1.28125 0.48438,-0.3125 1.10938,-0.3125 0.875,0 1.6875,0.48438 l -0.79688,2.23437 q -0.64062,-0.42187 -1.20312,-0.42187 -0.53125,0 -0.90625,0.29687 -0.375,0.29688 -0.59375,1.07813 -0.20313,0.76562 -0.20313,3.23437 z m 4.71339,0 v -13.35938 h 2.5625 v 7.09375 l 3,-3.40625 h 3.14063 l -3.29688,3.53125 3.53125,6.14063 h -2.75 l -2.4375,-4.34375 -1.1875,1.25 v 3.09375 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-rule:nonzero" />
+            <path
+               id="path4510"
+               d="m 229.9029,361.8189 c 0,25.47244 24.25984,38.20865 48.51968,50.94488 24.25983,12.73621 48.51969,25.47242 48.51969,50.94486"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+            <path
+               id="path4512"
+               d="m 229.9029,361.8189 c 0,25.47244 24.25984,38.20865 48.51968,50.94488 24.25983,12.73621 48.51969,25.47242 48.51969,50.94486"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="path4514"
+               d="m 313.46194,390.02625 h 42.96063 v 51.77951 h -42.96063 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+            <path
+               id="path4516"
+               d="m 338.64944,425.66812 v 4.07812 h -15.39062 q 0.25,-2.3125 1.5,-4.375 1.25,-2.07812 4.9375,-5.5 2.96875,-2.76562 3.64062,-3.75 0.90625,-1.35937 0.90625,-2.6875 0,-1.46875 -0.79687,-2.25 -0.78125,-0.79687 -2.17188,-0.79687 -1.375,0 -2.1875,0.82812 -0.8125,0.82813 -0.9375,2.75 l -4.375,-0.4375 q 0.39063,-3.625 2.45313,-5.20312 2.0625,-1.57813 5.15625,-1.57813 3.39062,0 5.32812,1.82813 1.9375,1.82812 1.9375,4.54687 0,1.54688 -0.5625,2.95313 -0.54687,1.39062 -1.75,2.92187 -0.79687,1.01563 -2.875,2.92188 -2.07812,1.90625 -2.64062,2.53125 -0.54688,0.625 -0.89063,1.21875 z"
+               inkscape:connector-curvature="0"
+               style="fill:#1155cc;fill-rule:nonzero" />
+            <path
+               id="path4518"
+               d="m 537.4619,422.02625 h 42.96063 v 51.77951 H 537.4619 Z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+            <path
+               id="path4520"
+               d="m 559.05566,461.74625 h -4.39063 v -16.54688 q -2.40625,2.25 -5.67187,3.32813 v -3.98438 q 1.71875,-0.5625 3.73437,-2.125 2.01563,-1.57812 2.76563,-3.67187 h 3.5625 z"
+               inkscape:connector-curvature="0"
+               style="fill:#1155cc;fill-rule:nonzero" />
+            <path
+               id="path4522"
+               d="m 442.3281,359.09448 c 0,72.83466 -15.48032,145.66931 -30.96063,145.66931"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+            <path
+               id="path4524"
+               d="m 442.3281,359.09448 c 0,72.83466 -15.48032,145.66931 -30.96063,145.66931"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:8, 6" />
+            <path
+               id="path4526"
+               d="m 678.9475,87.519684 c 0,208.629906 -133.79529,417.259856 -267.59055,417.259856"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+            <path
+               id="path4528"
+               d="m 678.9475,87.519684 c 0,208.629906 -133.79529,417.259856 -267.59055,417.259856"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:8, 6" />
+            <path
+               id="path4530"
+               d="m 779.57745,191.28084 c 0,156.7559 -184.09454,313.51184 -368.189,313.51184"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-opacity:0;fill-rule:evenodd" />
+            <path
+               id="path4532"
+               d="m 779.57745,191.28084 c 0,156.7559 -184.09454,313.51184 -368.189,313.51184"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:8, 6" />
+            <path
+               id="path4534"
+               d="m 221.88715,372.1496 9.4803,-16.85037 9.48032,16.85037 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-rule:evenodd" />
+            <path
+               id="path4536"
+               d="m 221.88715,372.1496 9.4803,-16.85037 9.48032,16.85037 z"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="path4538"
+               d="m 335.87573,450.3371 -7.59055,17.74802 -11.24411,-15.70078 z"
+               inkscape:connector-curvature="0"
+               style="fill:#000000;fill-rule:evenodd" />
+            <path
+               id="path4540"
+               d="m 335.87573,450.3371 -7.59055,17.74802 -11.24411,-15.70078 z"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="path4542"
+               d="m 432.83203,372.1496 9.48032,-16.85037 9.48031,16.85037 z"
+               inkscape:connector-curvature="0"
+               style="fill:#4a86e8;fill-rule:evenodd" />
+            <path
+               id="path4544"
+               d="m 432.83203,372.1496 9.48032,-16.85037 9.48031,16.85037 z"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="path4546"
+               d="m 669.46716,97.81628 9.48035,-16.850395 9.48028,16.850395 z"
+               inkscape:connector-curvature="0"
+               style="fill:#4a86e8;fill-rule:evenodd" />
+            <path
+               id="path4548"
+               d="m 669.46716,97.81628 9.48035,-16.850395 9.48028,16.850395 z"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="path4550"
+               d="m 768.83203,204.14961 9.48029,-16.8504 9.48034,16.8504 z"
+               inkscape:connector-curvature="0"
+               style="fill:#4a86e8;fill-rule:evenodd" />
+            <path
+               id="path4552"
+               d="m 768.83203,204.14961 9.48029,-16.8504 9.48034,16.8504 z"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+            <path
+               id="path4554"
+               d="m 421.14697,514.3213 -18.88187,-4.11023 13.30707,-14 z"
+               inkscape:connector-curvature="0"
+               style="fill:#4a86e8;fill-rule:evenodd" />
+            <path
+               id="path4556"
+               d="m 421.14697,514.3213 -18.88187,-4.11023 13.30707,-14 z"
+               inkscape:connector-curvature="0"
+               style="fill-rule:evenodd;stroke:#4a86e8;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round" />
+          </g>
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>
index 89a94a7..cd7d15c 100644 (file)
@@ -82,6 +82,12 @@ New Features
   (enqueue/dequeue start; enqueue/dequeue finish). That allows user to inspect
   objects in the ring without removing them from it (aka MT safe peek).
 
+* **Updated the Intel ice driver.**
+
+  Updated the Intel ice driver with new features and improvements, including:
+
+  * Added support for DCF (Device Config Function) feature.
+
 * **Updated Mellanox mlx5 driver.**
 
   Updated Mellanox mlx5 driver with new features and improvements, including:
index 96bd7ac..df2e840 100644 (file)
@@ -31,6 +31,7 @@ DIRS-y += dpaax
 endif
 
 IAVF-y := $(CONFIG_RTE_LIBRTE_IAVF_PMD)
+IAVF-y += $(CONFIG_RTE_LIBRTE_ICE_PMD)
 ifneq (,$(findstring y,$(IAVF-y)))
 DIRS-y += iavf
 endif
index dc3b557..905c624 100644 (file)
@@ -10,9 +10,11 @@ LIB = librte_pmd_ice.a
 
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
+CFLAGS += -I$(RTE_SDK)/drivers/common/iavf
 
 LDLIBS += -lrte_eal -lrte_mbuf -lrte_ethdev -lrte_kvargs
 LDLIBS += -lrte_bus_pci -lrte_mempool -lrte_hash
+LDLIBS += -lrte_net -lrte_common_iavf
 
 EXPORT_MAP := rte_pmd_ice_version.map
 
@@ -83,6 +85,9 @@ ifeq ($(CC_AVX2_SUPPORT), 1)
 endif
 SRCS-$(CONFIG_RTE_LIBRTE_ICE_PMD) += ice_generic_flow.c
 
+SRCS-$(CONFIG_RTE_LIBRTE_ICE_PMD) += ice_dcf.c
+SRCS-$(CONFIG_RTE_LIBRTE_ICE_PMD) += ice_dcf_ethdev.c
+
 # install this header file
 SYMLINK-$(CONFIG_RTE_LIBRTE_ICE_PMD)-include := rte_pmd_ice.h
 
diff --git a/drivers/net/ice/ice_dcf.c b/drivers/net/ice/ice_dcf.c
new file mode 100644 (file)
index 0000000..0a99cce
--- /dev/null
@@ -0,0 +1,474 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2020 Intel Corporation
+ */
+
+#include <sys/queue.h>
+#include <stdio.h>
+#include <errno.h>
+#include <stdint.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include <inttypes.h>
+#include <rte_byteorder.h>
+#include <rte_common.h>
+
+#include <rte_pci.h>
+#include <rte_atomic.h>
+#include <rte_eal.h>
+#include <rte_ether.h>
+#include <rte_ethdev_driver.h>
+#include <rte_ethdev_pci.h>
+#include <rte_malloc.h>
+#include <rte_memzone.h>
+#include <rte_dev.h>
+
+#include "ice_dcf.h"
+
+#define ICE_DCF_AQ_LEN     32
+#define ICE_DCF_AQ_BUF_SZ  4096
+
+#define ICE_DCF_ARQ_MAX_RETRIES 200
+#define ICE_DCF_ARQ_CHECK_TIME  2   /* msecs */
+
+#define ICE_DCF_VF_RES_BUF_SZ  \
+       (sizeof(struct virtchnl_vf_resource) +  \
+               IAVF_MAX_VF_VSI * sizeof(struct virtchnl_vsi_resource))
+
+static __rte_always_inline int
+ice_dcf_send_cmd_req_no_irq(struct ice_dcf_hw *hw, enum virtchnl_ops op,
+                           uint8_t *req_msg, uint16_t req_msglen)
+{
+       return iavf_aq_send_msg_to_pf(&hw->avf, op, IAVF_SUCCESS,
+                                     req_msg, req_msglen, NULL);
+}
+
+static int
+ice_dcf_recv_cmd_rsp_no_irq(struct ice_dcf_hw *hw, enum virtchnl_ops op,
+                           uint8_t *rsp_msgbuf, uint16_t rsp_buflen,
+                           uint16_t *rsp_msglen)
+{
+       struct iavf_arq_event_info event;
+       enum virtchnl_ops v_op;
+       int i = 0;
+       int err;
+
+       event.buf_len = rsp_buflen;
+       event.msg_buf = rsp_msgbuf;
+
+       do {
+               err = iavf_clean_arq_element(&hw->avf, &event, NULL);
+               if (err != IAVF_SUCCESS)
+                       goto again;
+
+               v_op = rte_le_to_cpu_32(event.desc.cookie_high);
+               if (v_op != op)
+                       goto again;
+
+               if (rsp_msglen != NULL)
+                       *rsp_msglen = event.msg_len;
+               return rte_le_to_cpu_32(event.desc.cookie_low);
+
+again:
+               rte_delay_ms(ICE_DCF_ARQ_CHECK_TIME);
+       } while (i++ < ICE_DCF_ARQ_MAX_RETRIES);
+
+       return -EIO;
+}
+
+static __rte_always_inline void
+ice_dcf_aq_cmd_clear(struct ice_dcf_hw *hw, struct dcf_virtchnl_cmd *cmd)
+{
+       rte_spinlock_lock(&hw->vc_cmd_queue_lock);
+
+       TAILQ_REMOVE(&hw->vc_cmd_queue, cmd, next);
+
+       rte_spinlock_unlock(&hw->vc_cmd_queue_lock);
+}
+
+static __rte_always_inline void
+ice_dcf_vc_cmd_set(struct ice_dcf_hw *hw, struct dcf_virtchnl_cmd *cmd)
+{
+       cmd->v_ret = IAVF_ERR_NOT_READY;
+       cmd->rsp_msglen = 0;
+       cmd->pending = 1;
+
+       rte_spinlock_lock(&hw->vc_cmd_queue_lock);
+
+       TAILQ_INSERT_TAIL(&hw->vc_cmd_queue, cmd, next);
+
+       rte_spinlock_unlock(&hw->vc_cmd_queue_lock);
+}
+
+static __rte_always_inline int
+ice_dcf_vc_cmd_send(struct ice_dcf_hw *hw, struct dcf_virtchnl_cmd *cmd)
+{
+       return iavf_aq_send_msg_to_pf(&hw->avf,
+                                     cmd->v_op, IAVF_SUCCESS,
+                                     cmd->req_msg, cmd->req_msglen, NULL);
+}
+
+static __rte_always_inline void
+ice_dcf_aq_cmd_handle(struct ice_dcf_hw *hw, struct iavf_arq_event_info *info)
+{
+       struct dcf_virtchnl_cmd *cmd;
+       enum virtchnl_ops v_op;
+       enum iavf_status v_ret;
+       uint16_t aq_op;
+
+       aq_op = rte_le_to_cpu_16(info->desc.opcode);
+       if (unlikely(aq_op != iavf_aqc_opc_send_msg_to_vf)) {
+               PMD_DRV_LOG(ERR,
+                           "Request %u is not supported yet", aq_op);
+               return;
+       }
+
+       v_op = rte_le_to_cpu_32(info->desc.cookie_high);
+       if (unlikely(v_op == VIRTCHNL_OP_EVENT))
+               return;
+
+       v_ret = rte_le_to_cpu_32(info->desc.cookie_low);
+
+       rte_spinlock_lock(&hw->vc_cmd_queue_lock);
+
+       TAILQ_FOREACH(cmd, &hw->vc_cmd_queue, next) {
+               if (cmd->v_op == v_op && cmd->pending) {
+                       cmd->v_ret = v_ret;
+                       cmd->rsp_msglen = RTE_MIN(info->msg_len,
+                                                 cmd->rsp_buflen);
+                       if (likely(cmd->rsp_msglen != 0))
+                               rte_memcpy(cmd->rsp_msgbuf, info->msg_buf,
+                                          cmd->rsp_msglen);
+
+                       /* prevent compiler reordering */
+                       rte_compiler_barrier();
+                       cmd->pending = 0;
+                       break;
+               }
+       }
+
+       rte_spinlock_unlock(&hw->vc_cmd_queue_lock);
+}
+
+static void
+ice_dcf_handle_virtchnl_msg(struct ice_dcf_hw *hw)
+{
+       struct iavf_arq_event_info info;
+       uint16_t pending = 1;
+       int ret;
+
+       info.buf_len = ICE_DCF_AQ_BUF_SZ;
+       info.msg_buf = hw->arq_buf;
+
+       while (pending) {
+               ret = iavf_clean_arq_element(&hw->avf, &info, &pending);
+               if (ret != IAVF_SUCCESS)
+                       break;
+
+               ice_dcf_aq_cmd_handle(hw, &info);
+       }
+}
+
+static int
+ice_dcf_init_check_api_version(struct ice_dcf_hw *hw)
+{
+#define ICE_CPF_VIRTCHNL_VERSION_MAJOR_START   1
+#define ICE_CPF_VIRTCHNL_VERSION_MINOR_START   1
+       struct virtchnl_version_info version, *pver;
+       int err;
+
+       version.major = VIRTCHNL_VERSION_MAJOR;
+       version.minor = VIRTCHNL_VERSION_MINOR;
+       err = ice_dcf_send_cmd_req_no_irq(hw, VIRTCHNL_OP_VERSION,
+                                         (uint8_t *)&version, sizeof(version));
+       if (err) {
+               PMD_INIT_LOG(ERR, "Failed to send OP_VERSION");
+               return err;
+       }
+
+       pver = &hw->virtchnl_version;
+       err = ice_dcf_recv_cmd_rsp_no_irq(hw, VIRTCHNL_OP_VERSION,
+                                         (uint8_t *)pver, sizeof(*pver), NULL);
+       if (err) {
+               PMD_INIT_LOG(ERR, "Failed to get response of OP_VERSION");
+               return -1;
+       }
+
+       PMD_INIT_LOG(DEBUG,
+                    "Peer PF API version: %u.%u", pver->major, pver->minor);
+
+       if (pver->major < ICE_CPF_VIRTCHNL_VERSION_MAJOR_START ||
+           (pver->major == ICE_CPF_VIRTCHNL_VERSION_MAJOR_START &&
+            pver->minor < ICE_CPF_VIRTCHNL_VERSION_MINOR_START)) {
+               PMD_INIT_LOG(ERR,
+                            "VIRTCHNL API version should not be lower than (%u.%u)",
+                            ICE_CPF_VIRTCHNL_VERSION_MAJOR_START,
+                            ICE_CPF_VIRTCHNL_VERSION_MAJOR_START);
+               return -1;
+       } else if (pver->major > VIRTCHNL_VERSION_MAJOR ||
+                  (pver->major == VIRTCHNL_VERSION_MAJOR &&
+                   pver->minor > VIRTCHNL_VERSION_MINOR)) {
+               PMD_INIT_LOG(ERR,
+                            "PF/VF API version mismatch:(%u.%u)-(%u.%u)",
+                            pver->major, pver->minor,
+                            VIRTCHNL_VERSION_MAJOR, VIRTCHNL_VERSION_MINOR);
+               return -1;
+       }
+
+       PMD_INIT_LOG(DEBUG, "Peer is supported PF host");
+
+       return 0;
+}
+
+static int
+ice_dcf_get_vf_resource(struct ice_dcf_hw *hw)
+{
+       uint32_t caps;
+       int err, i;
+
+       caps = VIRTCHNL_VF_OFFLOAD_WB_ON_ITR | VIRTCHNL_VF_OFFLOAD_RX_POLLING |
+              VIRTCHNL_VF_CAP_ADV_LINK_SPEED |
+              VF_BASE_MODE_OFFLOADS;
+
+       err = ice_dcf_send_cmd_req_no_irq(hw, VIRTCHNL_OP_GET_VF_RESOURCES,
+                                         (uint8_t *)&caps, sizeof(caps));
+       if (err) {
+               PMD_DRV_LOG(ERR, "Failed to send msg OP_GET_VF_RESOURCE");
+               return err;
+       }
+
+       err = ice_dcf_recv_cmd_rsp_no_irq(hw, VIRTCHNL_OP_GET_VF_RESOURCES,
+                                         (uint8_t *)hw->vf_res,
+                                         ICE_DCF_VF_RES_BUF_SZ, NULL);
+       if (err) {
+               PMD_DRV_LOG(ERR, "Failed to get response of OP_GET_VF_RESOURCE");
+               return -1;
+       }
+
+       iavf_vf_parse_hw_config(&hw->avf, hw->vf_res);
+
+       hw->vsi_res = NULL;
+       for (i = 0; i < hw->vf_res->num_vsis; i++) {
+               if (hw->vf_res->vsi_res[i].vsi_type == VIRTCHNL_VSI_SRIOV)
+                       hw->vsi_res = &hw->vf_res->vsi_res[i];
+       }
+
+       if (!hw->vsi_res) {
+               PMD_DRV_LOG(ERR, "no LAN VSI found");
+               return -1;
+       }
+
+       hw->vsi_id = hw->vsi_res->vsi_id;
+       PMD_DRV_LOG(DEBUG, "VSI ID is %u", hw->vsi_id);
+
+       return 0;
+}
+
+static int
+ice_dcf_check_reset_done(struct ice_dcf_hw *hw)
+{
+#define ICE_DCF_RESET_WAIT_CNT       50
+       struct iavf_hw *avf = &hw->avf;
+       int i, reset;
+
+       for (i = 0; i < ICE_DCF_RESET_WAIT_CNT; i++) {
+               reset = IAVF_READ_REG(avf, IAVF_VFGEN_RSTAT) &
+                                       IAVF_VFGEN_RSTAT_VFR_STATE_MASK;
+               reset = reset >> IAVF_VFGEN_RSTAT_VFR_STATE_SHIFT;
+
+               if (reset == VIRTCHNL_VFR_VFACTIVE ||
+                   reset == VIRTCHNL_VFR_COMPLETED)
+                       break;
+
+               rte_delay_ms(20);
+       }
+
+       if (i >= ICE_DCF_RESET_WAIT_CNT)
+               return -1;
+
+       return 0;
+}
+
+static inline void
+ice_dcf_enable_irq0(struct ice_dcf_hw *hw)
+{
+       struct iavf_hw *avf = &hw->avf;
+
+       /* Enable admin queue interrupt trigger */
+       IAVF_WRITE_REG(avf, IAVF_VFINT_ICR0_ENA1,
+                      IAVF_VFINT_ICR0_ENA1_ADMINQ_MASK);
+       IAVF_WRITE_REG(avf, IAVF_VFINT_DYN_CTL01,
+                      IAVF_VFINT_DYN_CTL01_INTENA_MASK |
+                      IAVF_VFINT_DYN_CTL01_CLEARPBA_MASK |
+                      IAVF_VFINT_DYN_CTL01_ITR_INDX_MASK);
+
+       IAVF_WRITE_FLUSH(avf);
+}
+
+static inline void
+ice_dcf_disable_irq0(struct ice_dcf_hw *hw)
+{
+       struct iavf_hw *avf = &hw->avf;
+
+       /* Disable all interrupt types */
+       IAVF_WRITE_REG(avf, IAVF_VFINT_ICR0_ENA1, 0);
+       IAVF_WRITE_REG(avf, IAVF_VFINT_DYN_CTL01,
+                      IAVF_VFINT_DYN_CTL01_ITR_INDX_MASK);
+
+       IAVF_WRITE_FLUSH(avf);
+}
+
+static void
+ice_dcf_dev_interrupt_handler(void *param)
+{
+       struct ice_dcf_hw *hw = param;
+
+       ice_dcf_disable_irq0(hw);
+
+       ice_dcf_handle_virtchnl_msg(hw);
+
+       ice_dcf_enable_irq0(hw);
+}
+
+int
+ice_dcf_execute_virtchnl_cmd(struct ice_dcf_hw *hw,
+                            struct dcf_virtchnl_cmd *cmd)
+{
+       int i = 0;
+       int err;
+
+       if ((cmd->req_msg && !cmd->req_msglen) ||
+           (!cmd->req_msg && cmd->req_msglen) ||
+           (cmd->rsp_msgbuf && !cmd->rsp_buflen) ||
+           (!cmd->rsp_msgbuf && cmd->rsp_buflen))
+               return -EINVAL;
+
+       rte_spinlock_lock(&hw->vc_cmd_send_lock);
+       ice_dcf_vc_cmd_set(hw, cmd);
+
+       err = ice_dcf_vc_cmd_send(hw, cmd);
+       if (err) {
+               PMD_DRV_LOG(ERR, "fail to send cmd %d", cmd->v_op);
+               goto ret;
+       }
+
+       do {
+               if (!cmd->pending)
+                       break;
+
+               rte_delay_ms(ICE_DCF_ARQ_CHECK_TIME);
+       } while (i++ < ICE_DCF_ARQ_MAX_RETRIES);
+
+       if (cmd->v_ret != IAVF_SUCCESS) {
+               err = -1;
+               PMD_DRV_LOG(ERR,
+                           "No response (%d times) or return failure (%d) for cmd %d",
+                           i, cmd->v_ret, cmd->v_op);
+       }
+
+ret:
+       ice_dcf_aq_cmd_clear(hw, cmd);
+       rte_spinlock_unlock(&hw->vc_cmd_send_lock);
+       return err;
+}
+
+int
+ice_dcf_init_hw(struct rte_eth_dev *eth_dev, struct ice_dcf_hw *hw)
+{
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
+       int ret;
+
+       hw->avf.hw_addr = pci_dev->mem_resource[0].addr;
+       hw->avf.back = hw;
+
+       hw->avf.bus.bus_id = pci_dev->addr.bus;
+       hw->avf.bus.device = pci_dev->addr.devid;
+       hw->avf.bus.func = pci_dev->addr.function;
+
+       hw->avf.device_id = pci_dev->id.device_id;
+       hw->avf.vendor_id = pci_dev->id.vendor_id;
+       hw->avf.subsystem_device_id = pci_dev->id.subsystem_device_id;
+       hw->avf.subsystem_vendor_id = pci_dev->id.subsystem_vendor_id;
+
+       hw->avf.aq.num_arq_entries = ICE_DCF_AQ_LEN;
+       hw->avf.aq.num_asq_entries = ICE_DCF_AQ_LEN;
+       hw->avf.aq.arq_buf_size = ICE_DCF_AQ_BUF_SZ;
+       hw->avf.aq.asq_buf_size = ICE_DCF_AQ_BUF_SZ;
+
+       rte_spinlock_init(&hw->vc_cmd_send_lock);
+       rte_spinlock_init(&hw->vc_cmd_queue_lock);
+       TAILQ_INIT(&hw->vc_cmd_queue);
+
+       hw->arq_buf = rte_zmalloc("arq_buf", ICE_DCF_AQ_BUF_SZ, 0);
+       if (hw->arq_buf == NULL) {
+               PMD_INIT_LOG(ERR, "unable to allocate AdminQ buffer memory");
+               goto err;
+       }
+
+       ret = iavf_set_mac_type(&hw->avf);
+       if (ret) {
+               PMD_INIT_LOG(ERR, "set_mac_type failed: %d", ret);
+               goto err;
+       }
+
+       ret = ice_dcf_check_reset_done(hw);
+       if (ret) {
+               PMD_INIT_LOG(ERR, "VF is still resetting");
+               goto err;
+       }
+
+       ret = iavf_init_adminq(&hw->avf);
+       if (ret) {
+               PMD_INIT_LOG(ERR, "init_adminq failed: %d", ret);
+               goto err;
+       }
+
+       if (ice_dcf_init_check_api_version(hw)) {
+               PMD_INIT_LOG(ERR, "check_api version failed");
+               goto err_api;
+       }
+
+       hw->vf_res = rte_zmalloc("vf_res", ICE_DCF_VF_RES_BUF_SZ, 0);
+       if (hw->vf_res == NULL) {
+               PMD_INIT_LOG(ERR, "unable to allocate vf_res memory");
+               goto err_api;
+       }
+
+       if (ice_dcf_get_vf_resource(hw)) {
+               PMD_INIT_LOG(ERR, "Failed to get VF resource");
+               goto err_alloc;
+       }
+
+       rte_intr_callback_register(&pci_dev->intr_handle,
+                                  ice_dcf_dev_interrupt_handler, hw);
+       rte_intr_enable(&pci_dev->intr_handle);
+       ice_dcf_enable_irq0(hw);
+
+       return 0;
+
+err_alloc:
+       rte_free(hw->vf_res);
+err_api:
+       iavf_shutdown_adminq(&hw->avf);
+err:
+       rte_free(hw->arq_buf);
+
+       return -1;
+}
+
+void
+ice_dcf_uninit_hw(struct rte_eth_dev *eth_dev, struct ice_dcf_hw *hw)
+{
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
+       struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
+
+       ice_dcf_disable_irq0(hw);
+       rte_intr_disable(intr_handle);
+       rte_intr_callback_unregister(intr_handle,
+                                    ice_dcf_dev_interrupt_handler, hw);
+
+       iavf_shutdown_adminq(&hw->avf);
+
+       rte_free(hw->arq_buf);
+       rte_free(hw->vf_res);
+}
diff --git a/drivers/net/ice/ice_dcf.h b/drivers/net/ice/ice_dcf.h
new file mode 100644 (file)
index 0000000..f44c09d
--- /dev/null
@@ -0,0 +1,52 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2020 Intel Corporation
+ */
+
+#ifndef _ICE_DCF_H_
+#define _ICE_DCF_H_
+
+#include <rte_ethdev_driver.h>
+
+#include <iavf_prototype.h>
+#include <iavf_adminq_cmd.h>
+#include <iavf_type.h>
+
+#include "ice_logs.h"
+
+struct dcf_virtchnl_cmd {
+       TAILQ_ENTRY(dcf_virtchnl_cmd) next;
+
+       enum virtchnl_ops v_op;
+       enum iavf_status v_ret;
+
+       uint16_t req_msglen;
+       uint8_t *req_msg;
+
+       uint16_t rsp_msglen;
+       uint16_t rsp_buflen;
+       uint8_t *rsp_msgbuf;
+
+       volatile int pending;
+};
+
+struct ice_dcf_hw {
+       struct iavf_hw avf;
+
+       rte_spinlock_t vc_cmd_send_lock;
+       rte_spinlock_t vc_cmd_queue_lock;
+       TAILQ_HEAD(, dcf_virtchnl_cmd) vc_cmd_queue;
+       uint8_t *arq_buf;
+
+       struct virtchnl_version_info virtchnl_version;
+       struct virtchnl_vf_resource *vf_res; /* VF resource */
+       struct virtchnl_vsi_resource *vsi_res; /* LAN VSI */
+       uint16_t vsi_id;
+};
+
+int ice_dcf_execute_virtchnl_cmd(struct ice_dcf_hw *hw,
+                                struct dcf_virtchnl_cmd *cmd);
+
+int ice_dcf_init_hw(struct rte_eth_dev *eth_dev, struct ice_dcf_hw *hw);
+void ice_dcf_uninit_hw(struct rte_eth_dev *eth_dev, struct ice_dcf_hw *hw);
+
+#endif /* _ICE_DCF_H_ */
diff --git a/drivers/net/ice/ice_dcf_ethdev.c b/drivers/net/ice/ice_dcf_ethdev.c
new file mode 100644 (file)
index 0000000..23f82a4
--- /dev/null
@@ -0,0 +1,317 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2020 Intel Corporation
+ */
+
+#include <errno.h>
+#include <stdbool.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+
+#include <rte_interrupts.h>
+#include <rte_debug.h>
+#include <rte_pci.h>
+#include <rte_atomic.h>
+#include <rte_eal.h>
+#include <rte_ether.h>
+#include <rte_ethdev_pci.h>
+#include <rte_kvargs.h>
+#include <rte_malloc.h>
+#include <rte_memzone.h>
+#include <rte_dev.h>
+
+#include <iavf_devids.h>
+
+#include "ice_generic_flow.h"
+#include "ice_dcf_ethdev.h"
+
+static uint16_t
+ice_dcf_recv_pkts(__rte_unused void *rx_queue,
+                 __rte_unused struct rte_mbuf **bufs,
+                 __rte_unused uint16_t nb_pkts)
+{
+       return 0;
+}
+
+static uint16_t
+ice_dcf_xmit_pkts(__rte_unused void *tx_queue,
+                 __rte_unused struct rte_mbuf **bufs,
+                 __rte_unused uint16_t nb_pkts)
+{
+       return 0;
+}
+
+static int
+ice_dcf_dev_start(struct rte_eth_dev *dev)
+{
+       dev->data->dev_link.link_status = ETH_LINK_UP;
+
+       return 0;
+}
+
+static void
+ice_dcf_dev_stop(struct rte_eth_dev *dev)
+{
+       dev->data->dev_link.link_status = ETH_LINK_DOWN;
+}
+
+static int
+ice_dcf_dev_configure(__rte_unused struct rte_eth_dev *dev)
+{
+       return 0;
+}
+
+static int
+ice_dcf_dev_info_get(struct rte_eth_dev *dev,
+                    struct rte_eth_dev_info *dev_info)
+{
+       struct ice_dcf_adapter *adapter = dev->data->dev_private;
+
+       dev_info->max_mac_addrs = 1;
+       dev_info->max_rx_pktlen = (uint32_t)-1;
+       dev_info->max_rx_queues = RTE_DIM(adapter->rxqs);
+       dev_info->max_tx_queues = RTE_DIM(adapter->txqs);
+
+       return 0;
+}
+
+static int
+ice_dcf_stats_get(__rte_unused struct rte_eth_dev *dev,
+                 __rte_unused struct rte_eth_stats *igb_stats)
+{
+       return 0;
+}
+
+static int
+ice_dcf_stats_reset(__rte_unused struct rte_eth_dev *dev)
+{
+       return 0;
+}
+
+static int
+ice_dcf_dev_promiscuous_enable(__rte_unused struct rte_eth_dev *dev)
+{
+       return 0;
+}
+
+static int
+ice_dcf_dev_promiscuous_disable(__rte_unused struct rte_eth_dev *dev)
+{
+       return 0;
+}
+
+static int
+ice_dcf_dev_allmulticast_enable(__rte_unused struct rte_eth_dev *dev)
+{
+       return 0;
+}
+
+static int
+ice_dcf_dev_allmulticast_disable(__rte_unused struct rte_eth_dev *dev)
+{
+       return 0;
+}
+
+static int
+ice_dcf_dev_filter_ctrl(struct rte_eth_dev *dev,
+                       enum rte_filter_type filter_type,
+                       __rte_unused enum rte_filter_op filter_op,
+                       __rte_unused void *arg)
+{
+       int ret = 0;
+
+       if (!dev)
+               return -EINVAL;
+
+       switch (filter_type) {
+       default:
+               PMD_DRV_LOG(WARNING, "Filter type (%d) not supported",
+                           filter_type);
+               ret = -EINVAL;
+               break;
+       }
+
+       return ret;
+}
+
+static void
+ice_dcf_dev_close(struct rte_eth_dev *dev)
+{
+       struct ice_dcf_adapter *adapter = dev->data->dev_private;
+
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+               return;
+
+       dev->dev_ops = NULL;
+       dev->rx_pkt_burst = NULL;
+       dev->tx_pkt_burst = NULL;
+       dev->data->mac_addrs = NULL;
+
+       ice_dcf_uninit_hw(dev, &adapter->real_hw);
+}
+
+static void
+ice_dcf_queue_release(__rte_unused void *q)
+{
+}
+
+static int
+ice_dcf_link_update(__rte_unused struct rte_eth_dev *dev,
+                   __rte_unused int wait_to_complete)
+{
+       return 0;
+}
+
+static int
+ice_dcf_rx_queue_setup(struct rte_eth_dev *dev,
+                      uint16_t rx_queue_id,
+                      __rte_unused uint16_t nb_rx_desc,
+                      __rte_unused unsigned int socket_id,
+                      __rte_unused const struct rte_eth_rxconf *rx_conf,
+                      __rte_unused struct rte_mempool *mb_pool)
+{
+       struct ice_dcf_adapter *adapter = dev->data->dev_private;
+
+       dev->data->rx_queues[rx_queue_id] = &adapter->rxqs[rx_queue_id];
+
+       return 0;
+}
+
+static int
+ice_dcf_tx_queue_setup(struct rte_eth_dev *dev,
+                      uint16_t tx_queue_id,
+                      __rte_unused uint16_t nb_tx_desc,
+                      __rte_unused unsigned int socket_id,
+                      __rte_unused const struct rte_eth_txconf *tx_conf)
+{
+       struct ice_dcf_adapter *adapter = dev->data->dev_private;
+
+       dev->data->tx_queues[tx_queue_id] = &adapter->txqs[tx_queue_id];
+
+       return 0;
+}
+
+static const struct eth_dev_ops ice_dcf_eth_dev_ops = {
+       .dev_start               = ice_dcf_dev_start,
+       .dev_stop                = ice_dcf_dev_stop,
+       .dev_close               = ice_dcf_dev_close,
+       .dev_configure           = ice_dcf_dev_configure,
+       .dev_infos_get           = ice_dcf_dev_info_get,
+       .rx_queue_setup          = ice_dcf_rx_queue_setup,
+       .tx_queue_setup          = ice_dcf_tx_queue_setup,
+       .rx_queue_release        = ice_dcf_queue_release,
+       .tx_queue_release        = ice_dcf_queue_release,
+       .link_update             = ice_dcf_link_update,
+       .stats_get               = ice_dcf_stats_get,
+       .stats_reset             = ice_dcf_stats_reset,
+       .promiscuous_enable      = ice_dcf_dev_promiscuous_enable,
+       .promiscuous_disable     = ice_dcf_dev_promiscuous_disable,
+       .allmulticast_enable     = ice_dcf_dev_allmulticast_enable,
+       .allmulticast_disable    = ice_dcf_dev_allmulticast_disable,
+       .filter_ctrl             = ice_dcf_dev_filter_ctrl,
+};
+
+static int
+ice_dcf_dev_init(struct rte_eth_dev *eth_dev)
+{
+       struct ice_dcf_adapter *adapter = eth_dev->data->dev_private;
+
+       eth_dev->dev_ops = &ice_dcf_eth_dev_ops;
+       eth_dev->rx_pkt_burst = ice_dcf_recv_pkts;
+       eth_dev->tx_pkt_burst = ice_dcf_xmit_pkts;
+
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+               return 0;
+
+       eth_dev->data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE;
+
+       if (ice_dcf_init_hw(eth_dev, &adapter->real_hw) != 0) {
+               PMD_INIT_LOG(ERR, "Failed to init DCF hardware");
+               return -1;
+       }
+
+       rte_eth_random_addr(adapter->mac_addr.addr_bytes);
+       eth_dev->data->mac_addrs = &adapter->mac_addr;
+
+       return 0;
+}
+
+static int
+ice_dcf_dev_uninit(struct rte_eth_dev *eth_dev)
+{
+       ice_dcf_dev_close(eth_dev);
+
+       return 0;
+}
+
+static int
+ice_dcf_cap_check_handler(__rte_unused const char *key,
+                         const char *value, __rte_unused void *opaque)
+{
+       if (strcmp(value, "dcf"))
+               return -1;
+
+       return 0;
+}
+
+static int
+ice_dcf_cap_selected(struct rte_devargs *devargs)
+{
+       struct rte_kvargs *kvlist;
+       const char *key = "cap";
+       int ret = 0;
+
+       if (devargs == NULL)
+               return 0;
+
+       kvlist = rte_kvargs_parse(devargs->args, NULL);
+       if (kvlist == NULL)
+               return 0;
+
+       if (!rte_kvargs_count(kvlist, key))
+               goto exit;
+
+       /* dcf capability selected when there's a key-value pair: cap=dcf */
+       if (rte_kvargs_process(kvlist, key,
+                              ice_dcf_cap_check_handler, NULL) < 0)
+               goto exit;
+
+       ret = 1;
+
+exit:
+       rte_kvargs_free(kvlist);
+       return ret;
+}
+
+static int eth_ice_dcf_pci_probe(__rte_unused struct rte_pci_driver *pci_drv,
+                            struct rte_pci_device *pci_dev)
+{
+       if (!ice_dcf_cap_selected(pci_dev->device.devargs))
+               return 1;
+
+       return rte_eth_dev_pci_generic_probe(pci_dev,
+                                            sizeof(struct ice_dcf_adapter),
+                                            ice_dcf_dev_init);
+}
+
+static int eth_ice_dcf_pci_remove(struct rte_pci_device *pci_dev)
+{
+       return rte_eth_dev_pci_generic_remove(pci_dev, ice_dcf_dev_uninit);
+}
+
+static const struct rte_pci_id pci_id_ice_dcf_map[] = {
+       { RTE_PCI_DEVICE(IAVF_INTEL_VENDOR_ID, IAVF_DEV_ID_ADAPTIVE_VF) },
+       { .vendor_id = 0, /* sentinel */ },
+};
+
+static struct rte_pci_driver rte_ice_dcf_pmd = {
+       .id_table = pci_id_ice_dcf_map,
+       .drv_flags = RTE_PCI_DRV_NEED_MAPPING,
+       .probe = eth_ice_dcf_pci_probe,
+       .remove = eth_ice_dcf_pci_remove,
+};
+
+RTE_PMD_REGISTER_PCI(net_ice_dcf, rte_ice_dcf_pmd);
+RTE_PMD_REGISTER_PCI_TABLE(net_ice_dcf, pci_id_ice_dcf_map);
+RTE_PMD_REGISTER_KMOD_DEP(net_ice_dcf, "* igb_uio | vfio-pci");
+RTE_PMD_REGISTER_PARAM_STRING(net_ice_dcf, "cap=dcf");
diff --git a/drivers/net/ice/ice_dcf_ethdev.h b/drivers/net/ice/ice_dcf_ethdev.h
new file mode 100644 (file)
index 0000000..0c34a00
--- /dev/null
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2020 Intel Corporation
+ */
+
+#ifndef _ICE_DCF_ETHDEV_H_
+#define _ICE_DCF_ETHDEV_H_
+
+#include "ice_ethdev.h"
+#include "ice_dcf.h"
+
+#define ICE_DCF_MAX_RINGS  1
+
+struct ice_dcf_queue {
+       uint64_t dummy;
+};
+
+struct ice_dcf_adapter {
+       struct ice_dcf_hw real_hw;
+       struct rte_ether_addr mac_addr;
+       struct ice_dcf_queue rxqs[ICE_DCF_MAX_RINGS];
+       struct ice_dcf_queue txqs[ICE_DCF_MAX_RINGS];
+};
+
+#endif /* _ICE_DCF_ETHDEV_H_ */
index 617b2c8..20ed7d4 100644 (file)
@@ -13,8 +13,8 @@ sources = files(
        'ice_hash.c'
        )
 
-deps += ['hash']
-includes += include_directories('base')
+deps += ['hash', 'net', 'common_iavf']
+includes += include_directories('base', '../../common/iavf')
 
 if arch_subdir == 'x86'
        sources += files('ice_rxtx_vec_sse.c')
@@ -35,4 +35,7 @@ if arch_subdir == 'x86'
        endif
 endif
 
+sources += files('ice_dcf.c',
+                'ice_dcf_ethdev.c')
+
 install_headers('rte_pmd_ice.h')
index da12b9e..96f354c 100644 (file)
@@ -185,6 +185,7 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_I40E_PMD)       += -lrte_pmd_i40e
 _LDLIBS-$(CONFIG_RTE_LIBRTE_IAVF_PMD)       += -lrte_pmd_iavf
 _LDLIBS-$(CONFIG_RTE_LIBRTE_ICE_PMD)        += -lrte_pmd_ice
 IAVF-y := $(CONFIG_RTE_LIBRTE_IAVF_PMD)
+IAVF-y += $(CONFIG_RTE_LIBRTE_ICE_PMD)
 ifeq ($(findstring y,$(IAVF-y)),y)
 _LDLIBS-y += -lrte_common_iavf
 endif