get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/17082/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 17082,
    "url": "https://patches.dpdk.org/api/patches/17082/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1479447902-3700-4-git-send-email-jerin.jacob@caviumnetworks.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1479447902-3700-4-git-send-email-jerin.jacob@caviumnetworks.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1479447902-3700-4-git-send-email-jerin.jacob@caviumnetworks.com",
    "date": "2016-11-18T05:45:01",
    "name": "[dpdk-dev,3/4] event/skeleton: add skeleton eventdev driver",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "4180d2950d24c13ac8cd1f51d7bb32f28b50b7a6",
    "submitter": {
        "id": 305,
        "url": "https://patches.dpdk.org/api/people/305/?format=api",
        "name": "Jerin Jacob",
        "email": "jerin.jacob@caviumnetworks.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1479447902-3700-4-git-send-email-jerin.jacob@caviumnetworks.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/17082/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/17082/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id 7E88358C8;\n\tFri, 18 Nov 2016 06:46:31 +0100 (CET)",
            "from NAM03-BY2-obe.outbound.protection.outlook.com\n\t(mail-by2nam03on0086.outbound.protection.outlook.com [104.47.42.86])\n\tby dpdk.org (Postfix) with ESMTP id 73B585682\n\tfor <dev@dpdk.org>; Fri, 18 Nov 2016 06:45:45 +0100 (CET)",
            "from localhost.net (50.254.132.37) by\n\tBY1PR0701MB1724.namprd07.prod.outlook.com (10.162.111.143) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.693.12;\n\tFri, 18 Nov 2016 05:45:39 +0000"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version;\n\tbh=MaOCBPbhHdw/z6WBMSEWKTvCwM1KIj6YifEgWqfQGwg=;\n\tb=U/UOD2hDuISylGNN8ydJGatmtEH1H0UlwvJnLsXkyuTUNlzDYtM0J87q7NwhDNGMHf2hW3NggMKTBi8wzfEFnWuy+tBqFI5Z5uMD5blCZyHLrKpmW0WStrqQu08mcxnJaeoxLtS2IFVNF97c9pexIJ2LRgnrmdkHqwY6DYtaPHM=",
        "Authentication-Results": "spf=none (sender IP is )\n\tsmtp.mailfrom=Jerin.Jacob@cavium.com; ",
        "From": "Jerin Jacob <jerin.jacob@caviumnetworks.com>",
        "To": "<dev@dpdk.org>",
        "CC": "<bruce.richardson@intel.com>, <harry.van.haaren@intel.com>,\n\t<hemant.agrawal@nxp.com>, <gage.eads@intel.com>, Jerin Jacob\n\t<jerin.jacob@caviumnetworks.com>",
        "Date": "Fri, 18 Nov 2016 11:15:01 +0530",
        "Message-ID": "<1479447902-3700-4-git-send-email-jerin.jacob@caviumnetworks.com>",
        "X-Mailer": "git-send-email 2.5.5",
        "In-Reply-To": "<1479447902-3700-1-git-send-email-jerin.jacob@caviumnetworks.com>",
        "References": "<1479447902-3700-1-git-send-email-jerin.jacob@caviumnetworks.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[50.254.132.37]",
        "X-ClientProxiedBy": "CY1PR1101CA0016.namprd11.prod.outlook.com (10.169.17.26)\n\tTo\n\tBY1PR0701MB1724.namprd07.prod.outlook.com (10.162.111.143)",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; BY1PR0701MB1724;\n\t2:NDvd6M+iyiQXBPEmlQwFE1xIkmLiC5J4ksKA6PYvvjSJlbZcNxaOhEL/i/qAEc93uzWAtl+mIRsFwIVWhCEKmpF3hHdWufC86tBUo/P2yfyGGq1CuY9xEs40+180n89HULSazuaNSM3WKbd8wg3EGCOK50g41Q8Yn/+Q0s6RGxI=;\n\t3:mVx84Tu14+xR5AqLRRGbI1geP/n7aQrpnt3r9trb3UH7rRAl+gQ0vjcNpNRLBUAAf7MPCBJIRUpybPitvF7+XWja2Qa+jp1yK4YcMDlPrXpeTMNaXJfStpxJ2Z+WILB6HgE8WBAKg3Jfj8Wdi1vigY2XmnK4qIsum5oiO+0mqjU=;\n\t25:KblfV4ip+qRwy3CXcZ2+YGVdGhz3sAc+HeuWcufEqBCcbn5okPC1x1jN7jxkRC4hzTI7BRRp6M76euFlgC14tSXzHD/hFn5S/XOvWSR5zzySCKn3BzKIw7s+FQ36cOn/QAHqpWqMA7iuXebwDpLffuMFNQ0XLEWyuiG5CMeDx9Si8vYoPuGkdSWivQRYT6KCPh08C1YzUE0iaKEhJX1qvZbIewZg3dSxZDHV2jdVBTKjIochUhEm9XdxfEKHaeBojMbcL3EGGDXYB6SO13fpWJjn2br5RdogxpKjwKTmLbPQbPq5GhbeXnWWVm4Cm8EcDOHD3+Beo7i04lV2Rt2yqtrYSs65DHYfyeAyR6Vh5EeYav9CKTtSKlQGogrr4ASOOLV7x1twhtPysy+NWOnRHnXsIWb0ZDIeXy2kGrbtjvX56t34BUXse+G+L0HET5YKmDivyfxk7SYxGL18Uw6bSw==",
            "1; BY1PR0701MB1724;\n\t31:2atPQtVLit4bViqNVTYGa0ido35XH8zOKbwhUr8OUUsIo1YijehmsptsQ5+/AfuzlsydDssXanGDZV5BzWcKeLj0tEVApNaWXV1+LEaLrFQprae9AMwhWGsyfNkv4vP1H3GI8h+Dup6VOFqcFz1K3NKGYSC8LeU+cBDqTyCwncyYprS8oJODk/1ek60isgWNhMVq/A2yMDV0a6Qmzg3M3UoaVM43ojBlQVVznDBXVlNTv4iwFheLGHHC+42i6l5FBJW4YU6CBduiaxQRGnbDtm6wQWdh91E8GZinOGT9CdA=;\n\t20:JYH8P1nOjMNsYUTEfNb66P1oDGk2DoBuDTN88NUON0Vg5rC7yel2xEPyfKYmitl9Y3lXA6b0ZaKarJ3c26/Pj9+EZThOaRtAim/5LP0UCGKuV+zrmx7hoFp9i3O2ClazxDshCSen7uPJ8QE78IbyiCmQXHePOAaVTh2UI6+rsTlbT9SreBcjmRGaPEvsKvBdgU2VOnLM36zGgdAp2izFkSS+vz/bJ9W/rchVyKGmbp4KToHOdYSp0/MpcSrFmf3KdkYrwTWLjn58YbQpM3I3fib14wMsyo66YOhud6A/lPBMCc5nmy+ebZPKNJ1q3tEZAn1dAhPk/dqulDiiUwqX252XOErmxRHbvu8nxb921qWW4/X/1JRhRqWqzNeq8zAe5ARLw7XI9QSDKOGwF3wtEustDV0vaXlbUXnhJf/A5j6P9IZ7x9KorQ3dxwx6xSusj9/DWUdcl1wAg7nKtBiQxSFvHq9Q+QzLctAfGjTzvNIftWD8cviul5IdGCK7jnlU3wVd6hwug9wcyI0IrOb2kJWzOvHy5O044P2s6c1KyAcx4J6ENS0mILO9xZh4rnKSSxpatL0u52UM2EUJVJwFFUeur46Byd+cQjvRQUJTlUc=",
            "1; BY1PR0701MB1724;\n\t4:Y8e+FNwIfX85Uw4Ey0wMUXWKD/FqOk1zGMlOG2Y3CUWyL0dbmqKNsk3kNYuShc82ppk2/ibruQmzxKOLZny9XIMF+7sNL0fS6QVR2nOL2bNzyl0xGtE2xSDw+PCLYi4fB8DqRlkTAlk8+Y4I7Tjy5VehksgxH3oOBC0z7UpFhES+7ZrGwDIOML+7d0EkFC77QpLlSyKrpx5I3DXmcjO6jHBGO98AP73H5LwtHuebbJiQ/wUbH1Ns/vl5Ykph2pBykgmfqKy11XJOs1tNxxz2ICJw4E55/R5TusFN9Z5UMRbMDo5ra8R5Ukoe05bnzD3hV4Qhqle1dPFpN4G0l9a4GSwb8EEZZQGp1r1So8CABA61rn0MhKwL1JDPN9gDbLJb9ecZFqbt0Ym+4wTwgLLhfylRRl5Ca+iiBj5nQPIKacLtPfYCvxQA0KdZYvwykk4sO/dwlbtJf/Ja6qXiytgvbQ==",
            "=?us-ascii?Q?1; BY1PR0701MB1724;\n\t23:6/UEaBnRDS5BYchhI9hEcEuo8eJg4HrpTvxPUyd?=\n\t=?us-ascii?Q?3aDf4wGxzy/uOVpvQPvqwk+y3UHM4fvrOkEUBTRErhcAP2GkzXY/M76Pn/PR?=\n\t=?us-ascii?Q?Zy99D9MWxUmzsLMMwEdh1mDVhFtZppjR4LY55Hfav44/SfpJfv6TDqV41XTL?=\n\t=?us-ascii?Q?8RkYiVWITzezjV+j3mndjEhYPxLK0qhOp3XGKG4qI+KzmwOnS2Is0t1e4I6p?=\n\t=?us-ascii?Q?VrPbXPYzY4eua1i8eXs4nmBbNbbs7PgV00S2yd0obNoziVfNWIrwvq/uGFOk?=\n\t=?us-ascii?Q?gz4o13M+R3AOJ6SZqDtyxZ2O0B9Kdkk+zsNbuQ1C6ObtTsE+7j1xuNrcj5HV?=\n\t=?us-ascii?Q?aoe39l/mi1zCdtyVnngk1s/wbbZKxcUP5EVzNfxQyAQ5hyscR9XmMjjJjP3v?=\n\t=?us-ascii?Q?hyqXYCt82QIv/haiCtUh+TOzDKSMaOLo4HI7H6sRhheG3F3L8ziHaDin9EO9?=\n\t=?us-ascii?Q?XD3mt9/O+5hrPf6P2+TmKXkZhGq/Z5029tbDVTVOT8SJhh4WDrngXahQUDrw?=\n\t=?us-ascii?Q?eP12MZKqtMOPEVUPdzxY0aJTvcpfePHxFhDbXUk2ywTue5Jb0qKdg78c3asv?=\n\t=?us-ascii?Q?dvSQo18zXK9W9ztpN4a6kfeYH+UvlAuR5rRB0KwoA1RVNf9/nF7g+VVfykxK?=\n\t=?us-ascii?Q?Ki9YAhcucBpZI6G+5znjcxLEyMgcxHPosoVGsqeiWEi8zARiBnBfMf5nck/w?=\n\t=?us-ascii?Q?way0JO3Fpy+BqCZ37mzClGYu0K2hF57hHB8Ri/LWswdSPVld5UwyPp9QAqvI?=\n\t=?us-ascii?Q?jB4hx7xlbSoVuS1TAIlFQ21ROsoTHckzHahnkHWMMcw4DagzIvz492BK/ctO?=\n\t=?us-ascii?Q?2khHpOHQmbLdMERV/8nEPhoBTzowVKjVB6+nAbDtBBXUPdA0kofnNDhsL4Hz?=\n\t=?us-ascii?Q?uWMsN/yFCRa1VXk1aldC2wv/uGbTh53o3f5/F8whufmwildYwMJiVzXII+QK?=\n\t=?us-ascii?Q?d32Z+zrECZAvBu5AuDMhwitWRRise7Q7jEZSlIBPC2qZ8tgTtXaeu6WloFxs?=\n\t=?us-ascii?Q?fZ2XRZ5xR1luPkVtly6KzS52cOQe7JXV5E4d7j8EPiPAMeFD6vSpQbtLuVvg?=\n\t=?us-ascii?Q?986MH35yZRGdVSkoebZHKZXp+37g8/eZy4TOFz2mUxjJoVnXxvpzsjoPzEXV?=\n\t=?us-ascii?Q?/n2RY7oUXtc+fn+P8ue+74QZRTfzSXv7pdNJLanIlXb5hAXLxLeHHhWxv+bR?=\n\t=?us-ascii?Q?JMYFHoQeU6gDCIHmz/3oYWCkQpxO0q/cY4vMmiphVwqnsxOhz2uIWzPrGSUW?=\n\t=?us-ascii?Q?7eYavkGg/AF7qbGOqgB/KXw9Q3CKhXtJNSx9iGMQdWsy5T1LGQN/T4N6Yfev?=\n\t=?us-ascii?Q?Zpo192Avqip40ICI+LS61EG/DHUTnHbdniI0nM3wu5PllXLefGWkRjIwDtYE?=\n\t=?us-ascii?Q?1YVZpNQ=3D=3D?=",
            "1; BY1PR0701MB1724;\n\t6:C+8z27VXZvpQc95D4A+PAJtFuPhppmo7L0254NRk5m/3KJRxv4YOdyzZTIpsq5iK0gIA/kueV48BHeaj2Bix3eBynvNejayu63AN3TpML+k934bnLNY0tcCpSirW7kSQf1rC/5o9ABM59Ke+lmYGDdgjYlqbsOaj3i2UXTN7ULrmA6rUcG3Nmek+T6X7QeHJZ/YY6dmqZbt7fomDXlQQEss39v8bsiiGtPVW+0u9BgGeHktfVHE6M9Wopjtxprk/NatVIp7O4Pdr/YXeHN0gQjhr9KTJlLN7hu5MtKT6/Kdcbycfa7ubTgBsAZOucQOhRUb8xzbqZehmm7tFG4IhPGpUpbbTQZo1pXU34vW1hx4=;\n\t5:ogGwcJQuv0mEifdsZJlMkWQ2dYC1ujK4kFrPp2FRpeuTNA6BamA87Nwa5+wnFXWE5gA+JYvtSdhCtcdYztp+WpKLIK8InwB1m0WwJaCALPP9w5NlZ3r9dCYI7vzdgCgN2jr/63d+GVhiEGbPkT2dAA==;\n\t24:Mo4qTuBLtbV9jPHbwjOqCqa+8mQRAs8QjmO+w0Bl55fj0jNpags1ak0KreJIHpoMm6UPv1GmWYGKGf8tPDYToXfMwEfyLOfM+xzEDwuWS5w=",
            "1; BY1PR0701MB1724;\n\t7:0etTOZxg/T1MjWxBFAp4qb9XboZ1z8fhETsfV9rDZXRQBbCIDagrpaCxetLorGweEGO5fIpGbAN7PB/NavrcM25valeo6n0XxiGDnLiH5DkasM+rvNZyX6enPdQk3X2BWhpqOyn5mcBVJvTp1cV/844gmtOFwg14jO/rDxow+tPCkbtDChXe8MJwrdDdE0aeryPz0VenrPiXjfDN62tyW64OaPWEYWclZedXAHDo5OG5ZDF0jhfdxu2ETOwg46pbW2JIpcF4c+ICWjGvDq+tNjSnaJ2O62AfcWhgTdzov1+Ml5E7YvPeuKgn4LM3/aAl8Pn2j2fbDpp/g/5F2H6oCI1I1NUrtOOE0nk3uS/gfyQ="
        ],
        "X-MS-Office365-Filtering-Correlation-Id": "d2caa2a5-d27a-45c0-c5f4-08d40f76211d",
        "X-Microsoft-Antispam": "UriScan:; BCL:0; PCL:0; RULEID:(22001);\n\tSRVR:BY1PR0701MB1724; ",
        "X-Microsoft-Antispam-PRVS": "<BY1PR0701MB1724B31D83144C1AD43A8EA381B00@BY1PR0701MB1724.namprd07.prod.outlook.com>",
        "X-Exchange-Antispam-Report-Test": "UriScan:;",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(6060326)(6040281)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6061324)(6041223);\n\tSRVR:BY1PR0701MB1724; BCL:0; PCL:0; RULEID:; SRVR:BY1PR0701MB1724; ",
        "X-Forefront-PRVS": "01304918F3",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n\tSFS:(10009020)(4630300001)(979002)(6069001)(6009001)(7916002)(189002)(199003)(68736007)(66066001)(3846002)(7736002)(50226002)(69596002)(81166006)(47776003)(4326007)(4001430100002)(48376002)(6116002)(8676002)(81156014)(8666005)(42186005)(33026002)(105586002)(2351001)(92566002)(2906002)(7846002)(50466002)(50986999)(110136003)(5660300001)(76176999)(42882006)(33646002)(6916009)(189998001)(21086003)(107886002)(36756003)(305945005)(2950100002)(6666003)(101416001)(575784001)(97736004)(77096005)(5003940100001)(106356001)(76506005)(7059030)(969003)(989001)(999001)(1009001)(1019001);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:BY1PR0701MB1724; H:localhost.net; FPR:;\n\tSPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; ",
        "Received-SPF": "None (protection.outlook.com: cavium.com does not designate\n\tpermitted sender hosts)",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-OriginatorOrg": "caviumnetworks.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "18 Nov 2016 05:45:39.6444\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "BY1PR0701MB1724",
        "Subject": "[dpdk-dev] [PATCH 3/4] event/skeleton: add skeleton eventdev driver",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "The skeleton driver facilitates, bootstrapping the new\neventdev driver and creates a platform to verify\nthe northbound eventdev common code.\n\nThe driver supports both VDEV and PCI based eventdev\ndevices.\n\nSigned-off-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>\n---\n MAINTAINERS                                        |   1 +\n config/common_base                                 |   8 +\n drivers/Makefile                                   |   1 +\n drivers/event/Makefile                             |  36 ++\n drivers/event/skeleton/Makefile                    |  55 +++\n .../skeleton/rte_pmd_skeleton_event_version.map    |   4 +\n drivers/event/skeleton/skeleton_eventdev.c         | 535 +++++++++++++++++++++\n drivers/event/skeleton/skeleton_eventdev.h         |  72 +++\n mk/rte.app.mk                                      |   4 +\n 9 files changed, 716 insertions(+)\n create mode 100644 drivers/event/Makefile\n create mode 100644 drivers/event/skeleton/Makefile\n create mode 100644 drivers/event/skeleton/rte_pmd_skeleton_event_version.map\n create mode 100644 drivers/event/skeleton/skeleton_eventdev.c\n create mode 100644 drivers/event/skeleton/skeleton_eventdev.h",
    "diff": "diff --git a/MAINTAINERS b/MAINTAINERS\nindex e430ca7..c594a23 100644\n--- a/MAINTAINERS\n+++ b/MAINTAINERS\n@@ -252,6 +252,7 @@ F: examples/l2fwd-crypto/\n Eventdev API - EXPERIMENTAL\n M: Jerin Jacob <jerin.jacob@caviumnetworks.com>\n F: lib/librte_eventdev/\n+F: drivers/event/skeleton/\n \n Networking Drivers\n ------------------\ndiff --git a/config/common_base b/config/common_base\nindex 7a8814e..35aef0a 100644\n--- a/config/common_base\n+++ b/config/common_base\n@@ -417,6 +417,14 @@ CONFIG_RTE_LIBRTE_EVENTDEV=y\n CONFIG_RTE_LIBRTE_EVENTDEV_DEBUG=n\n CONFIG_RTE_EVENT_MAX_DEVS=16\n CONFIG_RTE_EVENT_MAX_QUEUES_PER_DEV=64\n+\n+#\n+# Compile PMD for skeleton event device\n+#\n+CONFIG_RTE_LIBRTE_PMD_SKELETON_EVENTDEV=y\n+CONFIG_RTE_LIBRTE_PMD_SKELETON_EVENTDEV_DEBUG=n\n+\n+#\n # Compile librte_ring\n #\n CONFIG_RTE_LIBRTE_RING=y\ndiff --git a/drivers/Makefile b/drivers/Makefile\nindex 81c03a8..40b8347 100644\n--- a/drivers/Makefile\n+++ b/drivers/Makefile\n@@ -33,5 +33,6 @@ include $(RTE_SDK)/mk/rte.vars.mk\n \n DIRS-y += net\n DIRS-$(CONFIG_RTE_LIBRTE_CRYPTODEV) += crypto\n+DIRS-$(CONFIG_RTE_LIBRTE_EVENTDEV) += event\n \n include $(RTE_SDK)/mk/rte.subdir.mk\ndiff --git a/drivers/event/Makefile b/drivers/event/Makefile\nnew file mode 100644\nindex 0000000..678279f\n--- /dev/null\n+++ b/drivers/event/Makefile\n@@ -0,0 +1,36 @@\n+#   BSD LICENSE\n+#\n+#   Copyright(c) 2016 Cavium networks. All rights reserved.\n+#   All rights reserved.\n+#\n+#   Redistribution and use in source and binary forms, with or without\n+#   modification, are permitted provided that the following conditions\n+#   are met:\n+#\n+#     * Redistributions of source code must retain the above copyright\n+#       notice, this list of conditions and the following disclaimer.\n+#     * Redistributions in binary form must reproduce the above copyright\n+#       notice, this list of conditions and the following disclaimer in\n+#       the documentation and/or other materials provided with the\n+#       distribution.\n+#     * Neither the name of Cavium networks nor the names of its\n+#       contributors may be used to endorse or promote products derived\n+#       from this software without specific prior written permission.\n+#\n+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+#   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+\n+include $(RTE_SDK)/mk/rte.vars.mk\n+\n+DIRS-$(CONFIG_RTE_LIBRTE_PMD_SKELETON_EVENTDEV) += skeleton\n+\n+include $(RTE_SDK)/mk/rte.subdir.mk\ndiff --git a/drivers/event/skeleton/Makefile b/drivers/event/skeleton/Makefile\nnew file mode 100644\nindex 0000000..e557f6d\n--- /dev/null\n+++ b/drivers/event/skeleton/Makefile\n@@ -0,0 +1,55 @@\n+#   BSD LICENSE\n+#\n+#   Copyright(c) 2016 Cavium Networks. All rights reserved.\n+#   All rights reserved.\n+#\n+#   Redistribution and use in source and binary forms, with or without\n+#   modification, are permitted provided that the following conditions\n+#   are met:\n+#\n+#     * Redistributions of source code must retain the above copyright\n+#       notice, this list of conditions and the following disclaimer.\n+#     * Redistributions in binary form must reproduce the above copyright\n+#       notice, this list of conditions and the following disclaimer in\n+#       the documentation and/or other materials provided with the\n+#       distribution.\n+#     * Neither the name of Cavium Networks nor the names of its\n+#       contributors may be used to endorse or promote products derived\n+#       from this software without specific prior written permission.\n+#\n+#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+#   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+#\n+\n+include $(RTE_SDK)/mk/rte.vars.mk\n+\n+#\n+# library name\n+#\n+LIB = librte_pmd_skeleton_event.a\n+\n+CFLAGS += $(WERROR_FLAGS)\n+\n+EXPORT_MAP := rte_pmd_skeleton_event_version.map\n+\n+LIBABIVER := 1\n+\n+#\n+# all source are stored in SRCS-y\n+#\n+SRCS-$(CONFIG_RTE_LIBRTE_PMD_SKELETON_EVENTDEV) += skeleton_eventdev.c\n+\n+# this lib depends upon:\n+DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_SKELETON_EVENTDEV) += lib/librte_eal\n+DEPDIRS-$(CONFIG_RTE_LIBRTE_PMD_SKELETON_EVENTDEV) += lib/librte_event\n+\n+include $(RTE_SDK)/mk/rte.lib.mk\ndiff --git a/drivers/event/skeleton/rte_pmd_skeleton_event_version.map b/drivers/event/skeleton/rte_pmd_skeleton_event_version.map\nnew file mode 100644\nindex 0000000..31eca32\n--- /dev/null\n+++ b/drivers/event/skeleton/rte_pmd_skeleton_event_version.map\n@@ -0,0 +1,4 @@\n+DPDK_17.02 {\n+\n+\tlocal: *;\n+};\ndiff --git a/drivers/event/skeleton/skeleton_eventdev.c b/drivers/event/skeleton/skeleton_eventdev.c\nnew file mode 100644\nindex 0000000..da9f444\n--- /dev/null\n+++ b/drivers/event/skeleton/skeleton_eventdev.c\n@@ -0,0 +1,535 @@\n+/*\n+ *   BSD LICENSE\n+ *\n+ *   Copyright (C) Cavium networks Ltd. 2016.\n+ *\n+ *   Redistribution and use in source and binary forms, with or without\n+ *   modification, are permitted provided that the following conditions\n+ *   are met:\n+ *\n+ *     * Redistributions of source code must retain the above copyright\n+ *       notice, this list of conditions and the following disclaimer.\n+ *     * Redistributions in binary form must reproduce the above copyright\n+ *       notice, this list of conditions and the following disclaimer in\n+ *       the documentation and/or other materials provided with the\n+ *       distribution.\n+ *     * Neither the name of Cavium networks nor the names of its\n+ *       contributors may be used to endorse or promote products derived\n+ *       from this software without specific prior written permission.\n+ *\n+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+ *   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+#include <assert.h>\n+#include <stdio.h>\n+#include <stdbool.h>\n+#include <errno.h>\n+#include <stdint.h>\n+#include <string.h>\n+\n+#include <rte_byteorder.h>\n+#include <rte_common.h>\n+#include <rte_debug.h>\n+#include <rte_dev.h>\n+#include <rte_eal.h>\n+#include <rte_log.h>\n+#include <rte_memory.h>\n+#include <rte_memzone.h>\n+#include <rte_malloc.h>\n+#include <rte_pci.h>\n+#include <rte_lcore.h>\n+#include <rte_vdev.h>\n+\n+#include \"skeleton_eventdev.h\"\n+\n+static int\n+skeleton_eventdev_enqueue(void *port, struct rte_event *ev)\n+{\n+\tstruct skeleton_port *sp = port;\n+\n+\tRTE_SET_USED(sp);\n+\tRTE_SET_USED(ev);\n+\tRTE_SET_USED(port);\n+\n+\treturn -ENOTSUP;\n+}\n+\n+static uint16_t\n+skeleton_eventdev_enqueue_burst(void *port, struct rte_event ev[],\n+\t\t\tuint16_t nb_events)\n+{\n+\tstruct skeleton_port *sp = port;\n+\n+\tRTE_SET_USED(sp);\n+\tRTE_SET_USED(ev);\n+\tRTE_SET_USED(port);\n+\tRTE_SET_USED(nb_events);\n+\n+\treturn 0;\n+}\n+\n+static bool\n+skeleton_eventdev_dequeue(void *port, struct rte_event *ev, uint64_t wait)\n+{\n+\tstruct skeleton_port *sp = port;\n+\n+\tRTE_SET_USED(sp);\n+\tRTE_SET_USED(ev);\n+\tRTE_SET_USED(wait);\n+\n+\treturn 0;\n+}\n+\n+static uint16_t\n+skeleton_eventdev_dequeue_burst(void *port, struct rte_event ev[],\n+\t\tuint16_t nb_events, uint64_t wait)\n+{\n+\tstruct skeleton_port *sp = port;\n+\n+\tRTE_SET_USED(sp);\n+\tRTE_SET_USED(ev);\n+\tRTE_SET_USED(nb_events);\n+\tRTE_SET_USED(wait);\n+\n+\treturn 0;\n+}\n+\n+static void\n+skeleton_eventdev_info_get(struct rte_eventdev *dev,\n+\t\tstruct rte_event_dev_info *dev_info)\n+{\n+\tstruct skeleton_eventdev *skel = skeleton_pmd_priv(dev);\n+\n+\tPMD_DRV_FUNC_TRACE();\n+\n+\tRTE_SET_USED(skel);\n+\n+\tdev_info->min_dequeue_wait_ns = 1;\n+\tdev_info->max_dequeue_wait_ns = 10000;\n+\tdev_info->dequeue_wait_ns = 25;\n+\tdev_info->max_event_queues = 64;\n+\tdev_info->max_event_queue_flows = (1ULL << 20);\n+\tdev_info->max_event_queue_priority_levels = 8;\n+\tdev_info->max_event_priority_levels = 8;\n+\tdev_info->max_event_ports = 32;\n+\tdev_info->max_event_port_dequeue_depth = 16;\n+\tdev_info->max_event_port_enqueue_depth = 16;\n+\tdev_info->max_num_events = (1ULL << 20);\n+\tdev_info->event_dev_cap = RTE_EVENT_DEV_CAP_QUEUE_QOS |\n+\t\t\t\t\tRTE_EVENT_DEV_CAP_EVENT_QOS;\n+}\n+\n+static int\n+skeleton_eventdev_configure(struct rte_eventdev *dev)\n+{\n+\tstruct rte_eventdev_data *data = dev->data;\n+\tstruct rte_event_dev_config *conf = &data->dev_conf;\n+\tstruct skeleton_eventdev *skel = skeleton_pmd_priv(dev);\n+\n+\tPMD_DRV_FUNC_TRACE();\n+\n+\tRTE_SET_USED(conf);\n+\tRTE_SET_USED(skel);\n+\n+\tPMD_DRV_LOG(DEBUG, \"Configured eventdev devid=%d\", dev->data->dev_id);\n+\treturn 0;\n+}\n+\n+static int\n+skeleton_eventdev_start(struct rte_eventdev *dev)\n+{\n+\tstruct skeleton_eventdev *skel = skeleton_pmd_priv(dev);\n+\n+\tPMD_DRV_FUNC_TRACE();\n+\n+\tRTE_SET_USED(skel);\n+\n+\treturn 0;\n+}\n+\n+static void\n+skeleton_eventdev_stop(struct rte_eventdev *dev)\n+{\n+\tstruct skeleton_eventdev *skel = skeleton_pmd_priv(dev);\n+\n+\tPMD_DRV_FUNC_TRACE();\n+\n+\tRTE_SET_USED(skel);\n+}\n+\n+static int\n+skeleton_eventdev_close(struct rte_eventdev *dev)\n+{\n+\tstruct skeleton_eventdev *skel = skeleton_pmd_priv(dev);\n+\n+\tPMD_DRV_FUNC_TRACE();\n+\n+\tRTE_SET_USED(skel);\n+\n+\treturn 0;\n+}\n+\n+static void\n+skeleton_eventdev_queue_def_conf(struct rte_eventdev *dev, uint8_t queue_id,\n+\t\t\t\t struct rte_event_queue_conf *queue_conf)\n+{\n+\tstruct skeleton_eventdev *skel = skeleton_pmd_priv(dev);\n+\n+\tPMD_DRV_FUNC_TRACE();\n+\n+\tRTE_SET_USED(skel);\n+\tRTE_SET_USED(queue_id);\n+\n+\tqueue_conf->nb_atomic_flows = (1ULL << 20);\n+\tqueue_conf->nb_atomic_order_sequences = (1ULL << 20);\n+\tqueue_conf->event_queue_cfg = RTE_EVENT_QUEUE_CFG_DEFAULT;\n+\tqueue_conf->priority = RTE_EVENT_QUEUE_PRIORITY_NORMAL;\n+}\n+\n+static void\n+skeleton_eventdev_queue_release(void *queue)\n+{\n+\tstruct skeleton_queue *sq = queue;\n+\tPMD_DRV_FUNC_TRACE();\n+\n+\trte_free(sq);\n+}\n+\n+static int\n+skeleton_eventdev_queue_setup(struct rte_eventdev *dev, uint8_t queue_id,\n+\t\t\t      struct rte_event_queue_conf *queue_conf)\n+{\n+\tstruct skeleton_queue *sq;\n+\tstruct skeleton_eventdev *skel = skeleton_pmd_priv(dev);\n+\n+\tPMD_DRV_FUNC_TRACE();\n+\n+\tRTE_SET_USED(skel);\n+\tRTE_SET_USED(queue_conf);\n+\n+\t/* Free memory prior to re-allocation if needed */\n+\tif (dev->data->queues[queue_id] != NULL) {\n+\t\tPMD_DRV_LOG(DEBUG, \"Freeing memory prior to re-allocation %d\",\n+\t\t\t\tqueue_id);\n+\t\tskeleton_eventdev_queue_release(dev->data->queues[queue_id]);\n+\t\tdev->data->queues[queue_id] = NULL;\n+\t}\n+\n+\t/* Allocate event queue memory */\n+\tsq = rte_zmalloc_socket(\"eventdev queue\",\n+\t\t\tsizeof(struct skeleton_queue), RTE_CACHE_LINE_SIZE,\n+\t\t\tdev->data->socket_id);\n+\tif (sq == NULL) {\n+\t\tPMD_DRV_ERR(\"Failed to allocate sq queue_id=%d\", queue_id);\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tsq->queue_id = queue_id;\n+\n+\tPMD_DRV_LOG(DEBUG, \"[%d] sq=%p\", queue_id, sq);\n+\n+\tdev->data->queues[queue_id] = sq;\n+\treturn 0;\n+}\n+\n+static void\n+skeleton_eventdev_port_def_conf(struct rte_eventdev *dev, uint8_t port_id,\n+\t\t\t\t struct rte_event_port_conf *port_conf)\n+{\n+\tstruct skeleton_eventdev *skel = skeleton_pmd_priv(dev);\n+\n+\tPMD_DRV_FUNC_TRACE();\n+\n+\tRTE_SET_USED(skel);\n+\tRTE_SET_USED(port_id);\n+\n+\tport_conf->new_event_threshold = 32 * 1024;\n+\tport_conf->dequeue_depth = 16;\n+\tport_conf->enqueue_depth = 16;\n+}\n+\n+static void\n+skeleton_eventdev_port_release(void *port)\n+{\n+\tstruct skeleton_port *sp = port;\n+\tPMD_DRV_FUNC_TRACE();\n+\n+\trte_free(sp);\n+}\n+\n+static int\n+skeleton_eventdev_port_setup(struct rte_eventdev *dev, uint8_t port_id,\n+\t\t\t      struct rte_event_port_conf *port_conf)\n+{\n+\tstruct skeleton_port *sp;\n+\tstruct skeleton_eventdev *skel = skeleton_pmd_priv(dev);\n+\n+\tPMD_DRV_FUNC_TRACE();\n+\n+\tRTE_SET_USED(skel);\n+\tRTE_SET_USED(port_conf);\n+\n+\t/* Free memory prior to re-allocation if needed */\n+\tif (dev->data->ports[port_id] != NULL) {\n+\t\tPMD_DRV_LOG(DEBUG, \"Freeing memory prior to re-allocation %d\",\n+\t\t\t\tport_id);\n+\t\tskeleton_eventdev_port_release(dev->data->ports[port_id]);\n+\t\tdev->data->ports[port_id] = NULL;\n+\t}\n+\n+\t/* Allocate event port memory */\n+\tsp = rte_zmalloc_socket(\"eventdev port\",\n+\t\t\tsizeof(struct skeleton_port), RTE_CACHE_LINE_SIZE,\n+\t\t\tdev->data->socket_id);\n+\tif (sp == NULL) {\n+\t\tPMD_DRV_ERR(\"Failed to allocate sp port_id=%d\", port_id);\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tsp->port_id = port_id;\n+\n+\tPMD_DRV_LOG(DEBUG, \"[%d] sp=%p\", port_id, sp);\n+\n+\tdev->data->ports[port_id] = sp;\n+\treturn 0;\n+}\n+\n+static int\n+skeleton_eventdev_port_link(void *port, struct rte_event_queue_link link[],\n+\t\t\t    uint16_t nb_links)\n+{\n+\tstruct skeleton_port *sp = port;\n+\tPMD_DRV_FUNC_TRACE();\n+\n+\tRTE_SET_USED(sp);\n+\tRTE_SET_USED(link);\n+\n+\t/* Linked all the queues */\n+\treturn (int)nb_links;\n+}\n+\n+static int\n+skeleton_eventdev_port_unlink(void *port, uint8_t queues[],\n+\t\t\t\t uint16_t nb_unlinks)\n+{\n+\tstruct skeleton_port *sp = port;\n+\tPMD_DRV_FUNC_TRACE();\n+\n+\tRTE_SET_USED(sp);\n+\tRTE_SET_USED(queues);\n+\n+\t/* Unlinked all the queues */\n+\treturn (int)nb_unlinks;\n+\n+}\n+\n+static void\n+skeleton_eventdev_wait_time(struct rte_eventdev *dev, uint64_t ns,\n+\t\t\t\t uint64_t *wait_ticks)\n+{\n+\tstruct skeleton_eventdev *skel = skeleton_pmd_priv(dev);\n+\tuint32_t scale = 1;\n+\n+\tPMD_DRV_FUNC_TRACE();\n+\n+\tRTE_SET_USED(skel);\n+\t*wait_ticks = ns * scale;\n+}\n+\n+static void\n+skeleton_eventdev_dump(struct rte_eventdev *dev, FILE *f)\n+{\n+\tstruct skeleton_eventdev *skel = skeleton_pmd_priv(dev);\n+\n+\tPMD_DRV_FUNC_TRACE();\n+\n+\tRTE_SET_USED(skel);\n+\tRTE_SET_USED(f);\n+}\n+\n+\n+/* Initialize and register event driver with DPDK Application */\n+static const struct rte_eventdev_ops skeleton_eventdev_ops = {\n+\t.dev_infos_get    = skeleton_eventdev_info_get,\n+\t.dev_configure    = skeleton_eventdev_configure,\n+\t.dev_start        = skeleton_eventdev_start,\n+\t.dev_stop         = skeleton_eventdev_stop,\n+\t.dev_close        = skeleton_eventdev_close,\n+\t.queue_def_conf   = skeleton_eventdev_queue_def_conf,\n+\t.queue_setup      = skeleton_eventdev_queue_setup,\n+\t.queue_release    = skeleton_eventdev_queue_release,\n+\t.port_def_conf    = skeleton_eventdev_port_def_conf,\n+\t.port_setup       = skeleton_eventdev_port_setup,\n+\t.port_release     = skeleton_eventdev_port_release,\n+\t.port_link        = skeleton_eventdev_port_link,\n+\t.port_unlink      = skeleton_eventdev_port_unlink,\n+\t.wait_time        = skeleton_eventdev_wait_time,\n+\t.dump             = skeleton_eventdev_dump\n+};\n+\n+static int\n+skeleton_eventdev_init(struct rte_eventdev *eventdev)\n+{\n+\tstruct rte_pci_device *pci_dev;\n+\tstruct skeleton_eventdev *skel = skeleton_pmd_priv(eventdev);\n+\tint ret = 0;\n+\n+\tPMD_DRV_FUNC_TRACE();\n+\n+\teventdev->dev_ops       = &skeleton_eventdev_ops;\n+\teventdev->schedule      = NULL;\n+\teventdev->enqueue       = skeleton_eventdev_enqueue;\n+\teventdev->enqueue_burst = skeleton_eventdev_enqueue_burst;\n+\teventdev->dequeue       = skeleton_eventdev_dequeue;\n+\teventdev->dequeue_burst = skeleton_eventdev_dequeue_burst;\n+\n+\t/* For secondary processes, the primary has done all the work */\n+\tif (rte_eal_process_type() != RTE_PROC_PRIMARY)\n+\t\treturn 0;\n+\n+\tpci_dev = eventdev->pci_dev;\n+\n+\tskel->reg_base = (uintptr_t)pci_dev->mem_resource[0].addr;\n+\tif (!skel->reg_base) {\n+\t\tPMD_DRV_ERR(\"Failed to map BAR0\");\n+\t\tret = -ENODEV;\n+\t\tgoto fail;\n+\t}\n+\n+\tskel->device_id = pci_dev->id.device_id;\n+\tskel->vendor_id = pci_dev->id.vendor_id;\n+\tskel->subsystem_device_id = pci_dev->id.subsystem_device_id;\n+\tskel->subsystem_vendor_id = pci_dev->id.subsystem_vendor_id;\n+\n+\tPMD_DRV_LOG(DEBUG, \"pci device (%x:%x) %u:%u:%u:%u\",\n+\t\t\tpci_dev->id.vendor_id, pci_dev->id.device_id,\n+\t\t\tpci_dev->addr.domain, pci_dev->addr.bus,\n+\t\t\tpci_dev->addr.devid, pci_dev->addr.function);\n+\n+\tPMD_DRV_LOG(INFO, \"dev_id=%d socket_id=%d (%x:%x)\",\n+\t\teventdev->data->dev_id, eventdev->data->socket_id,\n+\t\tskel->vendor_id, skel->device_id);\n+\n+fail:\n+\treturn ret;\n+}\n+\n+/* PCI based event device */\n+\n+#define EVENTDEV_SKEL_VENDOR_ID         0x177d\n+#define EVENTDEV_SKEL_PRODUCT_ID        0x0001\n+\n+static const struct rte_pci_id pci_id_skeleton_map[] = {\n+\t{\n+\t\tRTE_PCI_DEVICE(EVENTDEV_SKEL_VENDOR_ID,\n+\t\t\t       EVENTDEV_SKEL_PRODUCT_ID)\n+\t},\n+\t{\n+\t\t.vendor_id = 0,\n+\t},\n+};\n+\n+static struct rte_eventdev_driver pci_eventdev_skeleton_pmd = {\n+\t.pci_drv = {\n+\t\t.id_table = pci_id_skeleton_map,\n+\t\t.drv_flags = RTE_PCI_DRV_NEED_MAPPING,\n+\t\t.probe = rte_eventdev_pmd_pci_probe,\n+\t\t.remove = rte_eventdev_pmd_pci_remove,\n+\t},\n+\t.eventdev_init = skeleton_eventdev_init,\n+\t.dev_private_size = sizeof(struct skeleton_eventdev),\n+};\n+\n+RTE_PMD_REGISTER_PCI(event_skeleton_pci, pci_eventdev_skeleton_pmd.pci_drv);\n+RTE_PMD_REGISTER_PCI_TABLE(event_skeleton_pci, pci_id_skeleton_map);\n+\n+/* VDEV based event device */\n+\n+/**\n+ * Global static parameter used to create a unique name for each skeleton\n+ * event device.\n+ */\n+static unsigned int skeleton_unique_id;\n+\n+static inline int\n+skeleton_create_unique_device_name(char *name, size_t size)\n+{\n+\tint ret;\n+\n+\tif (name == NULL)\n+\t\treturn -EINVAL;\n+\n+\tret = snprintf(name, size, \"%s_%u\", RTE_STR(EVENTDEV_NAME_SKELETON_PMD),\n+\t\t\tskeleton_unique_id++);\n+\tif (ret < 0)\n+\t\treturn ret;\n+\treturn 0;\n+}\n+\n+static int\n+skeleton_eventdev_create(int socket_id)\n+{\n+\tstruct rte_eventdev *eventdev;\n+\tchar eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN];\n+\n+\t/* Create a unique device name */\n+\tif (skeleton_create_unique_device_name(eventdev_name,\n+\t\t\tRTE_EVENTDEV_NAME_MAX_LEN) != 0) {\n+\t\tPMD_DRV_ERR(\"Failed to create unique eventdev name\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\teventdev = rte_eventdev_pmd_vdev_init(eventdev_name,\n+\t\t\tsizeof(struct skeleton_eventdev), socket_id);\n+\tif (eventdev == NULL) {\n+\t\tPMD_DRV_ERR(\"Failed to create eventdev vdev\");\n+\t\tgoto fail;\n+\t}\n+\n+\teventdev->dev_ops       = &skeleton_eventdev_ops;\n+\teventdev->schedule      = NULL;\n+\teventdev->enqueue       = skeleton_eventdev_enqueue;\n+\teventdev->enqueue_burst = skeleton_eventdev_enqueue_burst;\n+\teventdev->dequeue       = skeleton_eventdev_dequeue;\n+\teventdev->dequeue_burst = skeleton_eventdev_dequeue_burst;\n+\n+\treturn 0;\n+fail:\n+\treturn -EFAULT;\n+}\n+\n+static int\n+skeleton_eventdev_probe(const char *name, __rte_unused const char *input_args)\n+{\n+\tRTE_LOG(INFO, PMD, \"Initializing %s on NUMA node %d\", name,\n+\t\t\trte_socket_id());\n+\treturn skeleton_eventdev_create(rte_socket_id());\n+}\n+\n+static int\n+skeleton_eventdev_remove(const char *name)\n+{\n+\tif (name == NULL)\n+\t\treturn -EINVAL;\n+\n+\tPMD_DRV_LOG(INFO, \"Closing %s on NUMA node %d\", name, rte_socket_id());\n+\n+\treturn 0;\n+}\n+\n+static struct rte_vdev_driver vdev_eventdev_skeleton_pmd = {\n+\t.probe = skeleton_eventdev_probe,\n+\t.remove = skeleton_eventdev_remove\n+};\n+\n+RTE_PMD_REGISTER_VDEV(EVENTDEV_NAME_SKELETON_PMD, vdev_eventdev_skeleton_pmd);\ndiff --git a/drivers/event/skeleton/skeleton_eventdev.h b/drivers/event/skeleton/skeleton_eventdev.h\nnew file mode 100644\nindex 0000000..872ba01\n--- /dev/null\n+++ b/drivers/event/skeleton/skeleton_eventdev.h\n@@ -0,0 +1,72 @@\n+/*\n+ *   BSD LICENSE\n+ *\n+ *   Copyright (C) Cavium networks Ltd. 2016.\n+ *\n+ *   Redistribution and use in source and binary forms, with or without\n+ *   modification, are permitted provided that the following conditions\n+ *   are met:\n+ *\n+ *     * Redistributions of source code must retain the above copyright\n+ *       notice, this list of conditions and the following disclaimer.\n+ *     * Redistributions in binary form must reproduce the above copyright\n+ *       notice, this list of conditions and the following disclaimer in\n+ *       the documentation and/or other materials provided with the\n+ *       distribution.\n+ *     * Neither the name of Cavium networks nor the names of its\n+ *       contributors may be used to endorse or promote products derived\n+ *       from this software without specific prior written permission.\n+ *\n+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+ *   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+#ifndef __SKELETON_EVENTDEV_H__\n+#define __SKELETON_EVENTDEV_H__\n+\n+#include <rte_eventdev_pmd.h>\n+\n+#ifdef RTE_LIBRTE_PMD_SKELETON_EVENTDEV_DEBUG\n+#define PMD_DRV_LOG(level, fmt, args...) \\\n+\tRTE_LOG(level, PMD, \"%s(): \" fmt \"\\n\", __func__, ## args)\n+#define PMD_DRV_FUNC_TRACE() PMD_DRV_LOG(DEBUG, \">>\")\n+#else\n+#define PMD_DRV_LOG(level, fmt, args...) do { } while (0)\n+#define PMD_DRV_FUNC_TRACE() do { } while (0)\n+#endif\n+\n+#define PMD_DRV_ERR(fmt, args...) \\\n+\tRTE_LOG(ERR, PMD, \"%s(): \" fmt \"\\n\", __func__, ## args)\n+\n+struct skeleton_eventdev {\n+\tuintptr_t reg_base;\n+\tuint16_t device_id;\n+\tuint16_t vendor_id;\n+\tuint16_t subsystem_device_id;\n+\tuint16_t subsystem_vendor_id;\n+} __rte_cache_aligned;\n+\n+struct skeleton_queue {\n+\tuint8_t queue_id;\n+} __rte_cache_aligned;\n+\n+struct skeleton_port {\n+\tuint8_t port_id;\n+} __rte_cache_aligned;\n+\n+static inline struct skeleton_eventdev *\n+skeleton_pmd_priv(struct rte_eventdev *eventdev)\n+{\n+\treturn eventdev->data->dev_private;\n+}\n+\n+#endif /* __SKELETON_EVENTDEV_H__ */\ndiff --git a/mk/rte.app.mk b/mk/rte.app.mk\nindex 716725a..8341c13 100644\n--- a/mk/rte.app.mk\n+++ b/mk/rte.app.mk\n@@ -148,6 +148,10 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_ZUC)         += -lrte_pmd_zuc\n _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_ZUC)         += -L$(LIBSSO_ZUC_PATH)/build -lsso_zuc\n endif # CONFIG_RTE_LIBRTE_CRYPTODEV\n \n+ifeq ($(CONFIG_RTE_LIBRTE_EVENTDEV),y)\n+_LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_SKELETON_EVENTDEV) += -lrte_pmd_skeleton_event\n+endif # CONFIG_RTE_LIBRTE_EVENTDEV\n+\n endif # !CONFIG_RTE_BUILD_SHARED_LIBS\n \n _LDLIBS-y += --no-whole-archive\n",
    "prefixes": [
        "dpdk-dev",
        "3/4"
    ]
}