{"id":833149,"url":"http://patchwork.ozlabs.org/api/1.2/patches/833149/?format=json","web_url":"http://patchwork.ozlabs.org/project/netdev/patch/20171102003606.19913-4-david.daney@cavium.com/","project":{"id":7,"url":"http://patchwork.ozlabs.org/api/1.2/projects/7/?format=json","name":"Linux network development","link_name":"netdev","list_id":"netdev.vger.kernel.org","list_email":"netdev@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20171102003606.19913-4-david.daney@cavium.com>","list_archive_url":null,"date":"2017-11-02T00:36:02","name":"[3/7] MIPS: Octeon: Add a global resource manager.","commit_ref":null,"pull_url":null,"state":"changes-requested","archived":true,"hash":"015b9c738b06d723c69977ba447fac3ffbd385d6","submitter":{"id":8400,"url":"http://patchwork.ozlabs.org/api/1.2/people/8400/?format=json","name":"David Daney","email":"david.daney@cavium.com"},"delegate":{"id":34,"url":"http://patchwork.ozlabs.org/api/1.2/users/34/?format=json","username":"davem","first_name":"David","last_name":"Miller","email":"davem@davemloft.net"},"mbox":"http://patchwork.ozlabs.org/project/netdev/patch/20171102003606.19913-4-david.daney@cavium.com/mbox/","series":[{"id":11414,"url":"http://patchwork.ozlabs.org/api/1.2/series/11414/?format=json","web_url":"http://patchwork.ozlabs.org/project/netdev/list/?series=11414","date":"2017-11-02T00:35:59","name":"Cavium OCTEON-III network driver.","version":1,"mbox":"http://patchwork.ozlabs.org/series/11414/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/833149/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/833149/checks/","tags":{},"related":[],"headers":{"Return-Path":"<netdev-owner@vger.kernel.org>","X-Original-To":"patchwork-incoming@ozlabs.org","Delivered-To":"patchwork-incoming@ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)","ozlabs.org; dkim=pass (1024-bit key;\n\tunprotected) header.d=CAVIUMNETWORKS.onmicrosoft.com\n\theader.i=@CAVIUMNETWORKS.onmicrosoft.com header.b=\"GgnzyrA0\"; \n\tdkim-atps=neutral","spf=none (sender IP is )\n\tsmtp.mailfrom=David.Daney@cavium.com; "],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3yS5lq71Tvz9t2l\n\tfor <patchwork-incoming@ozlabs.org>;\n\tThu,  2 Nov 2017 11:37:59 +1100 (AEDT)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S934034AbdKBAgp (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tWed, 1 Nov 2017 20:36:45 -0400","from mail-sn1nam02on0081.outbound.protection.outlook.com\n\t([104.47.36.81]:4882\n\t\"EHLO NAM02-SN1-obe.outbound.protection.outlook.com\"\n\trhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP\n\tid S933976AbdKBAgi (ORCPT <rfc822;netdev@vger.kernel.org>);\n\tWed, 1 Nov 2017 20:36:38 -0400","from ddl.caveonetworks.com (50.233.148.156) by\n\tCY4PR07MB3496.namprd07.prod.outlook.com (10.171.252.153) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id\n\t15.20.178.6; Thu, 2 Nov 2017 00:36:30 +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=2XFbtnSmlKSpf3h6VZ3hBX2HnzD1O7G90/PpCzMuewI=;\n\tb=GgnzyrA0QPCukTf+S0MuiwIwznjoAtZ71JIgqOHpOUsaCQiP6VwJ+mbet8Cq7FXd0q7PMPmmypXaKsivdgFREBj6IQNNqu63TwWM9tAs79oXhhrfXZFAHuBpIp/4VpiGk+o49w1taZei5iHi7OzxL0hRN7TAvA3UJp53ooBfAL4=","From":"David Daney <david.daney@cavium.com>","To":"linux-mips@linux-mips.org, ralf@linux-mips.org,\n\tJames Hogan <james.hogan@mips.com>, netdev@vger.kernel.org,\n\t\"David S. Miller\" <davem@davemloft.net>,\n\tRob Herring <robh+dt@kernel.org>, Mark Rutland <mark.rutland@arm.com>","Cc":"linux-kernel@vger.kernel.org, \"Steven J. Hill\" <steven.hill@cavium.com>,\n\tdevicetree@vger.kernel.org, Carlos Munoz <cmunoz@cavium.com>,\n\t\"Steven J . Hill\" <Steven.Hill@cavium.com>,\n\tDavid Daney <david.daney@cavium.com>","Subject":"[PATCH 3/7] MIPS: Octeon: Add a global resource manager.","Date":"Wed,  1 Nov 2017 17:36:02 -0700","Message-Id":"<20171102003606.19913-4-david.daney@cavium.com>","X-Mailer":"git-send-email 2.13.6","In-Reply-To":"<20171102003606.19913-1-david.daney@cavium.com>","References":"<20171102003606.19913-1-david.daney@cavium.com>","MIME-Version":"1.0","Content-Type":"text/plain","X-Originating-IP":"[50.233.148.156]","X-ClientProxiedBy":"CO2PR07CA0072.namprd07.prod.outlook.com (10.174.192.40) To\n\tCY4PR07MB3496.namprd07.prod.outlook.com (10.171.252.153)","X-MS-PublicTrafficType":"Email","X-MS-Office365-Filtering-Correlation-Id":"5f51fc90-c44a-426d-ceb6-08d52189c637","X-Microsoft-Antispam":"UriScan:; BCL:0; PCL:0;\n\tRULEID:(22001)(4534020)(4602075)(2017052603199);\n\tSRVR:CY4PR07MB3496; ","X-Microsoft-Exchange-Diagnostics":["1; CY4PR07MB3496;\n\t3:hdD5JfFp2hbD+u+h/RmOUs8KO5IvbqAqoYMxM+/0z/lsPg4bXjkNCTU+HZgOZSbEl/K8X2DzU9pZF7zeBBo95NH5azpz0UVFJRcnTJaf8tgiGD0S+5Xzr8ARZWfGwarBwxiyBDKCYwUV1zXlV+PxLB+b7H1ilaSTxW4zEstvS3UCItgostjOxmVElZ1cYfoAh0ckHDOVvyGsF3VEZWbWq9RYuVMuw+/UvqdgWtHO7fFVkqIpCOpcUCCpIVu3VVoM;\n\t25:IZTITbrsa6MEhgTLbL/UlxEa0X565KMkbrATyo5dFY5jL4JKQdM54sMEEeyGtKHJ+87zjzfxPq4DjC/bgEzGuI153K8zoTtxUI/lAu9Fx7Jnmcq9d0OtHGMk3q8WlQzgoTpXoLZoKSVOu93TzRFLdm2NfbJgp/ttiwNIOkizno2Y9kwf0tGrfZLMQOZs1A0fz5LaQguPBTUG+X29bPX9i205viHUzqDf6zUlUZU1+6FrjSkT4zSvRFX11Z/frKWXMjwPhAY373Yj93j38605Czq8Dqj1a0rUjtNfEhTk0rGJ49pFC28nwqo2ZLwYcCGNJpnT4r35or7BbBBXkL3Qwg==;\n\t31:wpPSL4QD2ph2fvwBz0od7MqC2xipHh09OiGjKncT4xeMrdWzp2od1cIX06msqcxvjgNyJ/4Prb8+WIAUZchhn1EamqRk1NR7RpmW8cEn28e7ggnzwcdGdlvt3MAGl+oluv/c0g0H2F+ZX4pNucUeqRW8nT3OHTip0SVTQUwgRLtPVkgdz5xcdwLvmlesfKTrKBF7tKA92IslFp/UUiyaAQKhUDoIBiXn9Nt4KvbIAFw=","1; CY4PR07MB3496;\n\t20:p/3onoxTkbIjACf8EhuJ+yc6/3vvFHi3eckaL4z+mR4BSxKPiJpJHbpja67xPiXfV4t7ImCSbSypGQivsAZNgrGWqZq9XIlSmscS0qvn4Vmiyzy7gnFBIRzWBxFPn4PkYw4MGgq9oErMVVEEzYmYGsIaepa6SOEm3UHxv+SjFmyNkpiVeMAKjoMr0L7R+bBXdFMZvYb1dSsYxoybEGTKWMjQLOM9JgEIB7nM/7F3ma6jIwcT4kcupzQ28GJpgb0eY+0zTsuC3ep5WJfRNW+x52hjDKc9RvCdUZDnQq6umQlOWd+m9apYZvgusUxBa4IrCIloq3q5vHenE5jk8Z9RgEg3LVSnR1L1RQvSazaZ3/rhoVFGwMt93aVqq3h+KziW1TnR+9GGwu2El8XrPKADcr88Yl4TTnmRYBFmvCvN6Y6lXgfSesftjZl5mn8ebw/A1ZFzCRzv+cgCWaRPF4nbJ9fycO1Yqhwp7PALeahDuSm65SsqqgXf5n/lCQ0cL/nL;\n\t4:5SXvS5Zh408RJCWLXmHeBY1uK2omfyWRq4PiTSsxVl2ukw2xN66nSswTWwiYS7qf5J8oZX2h9M92dIFd7DQvieboURyOIxa5eAvKOSVcUkMIixRE4cfh53Q47SvkwK69oasHlBMmvcEEQ1X1gVu3Fc8qQGlGeY1A8bUa3g9GepQl/e0cN07KZy9aMsuaFDHcMwv+9ny9/YG1YM+h4mFvXoZpgU4w86KCvoCD5Fr/w9SQqwsLoKvXOyNHfmPFQoMQcpRrJ2ZHKPTw++4gR49tDg==","1; CY4PR07MB3496;\n\t23:O8GAxr7mVLOwp2UOZU688MWxCJwq482wDKlkiiDwpo/gQdpw51XZKljrnD490uP/FokxGrZpnEw3rvnIDw3I9zW82E6BfdSG4xLvci/ZpkY8ok4CctVaRGI5KpcgGldoxgCnSXbPpFeR/kNuz61ojTzU217gUwbXACWuajsBQ6wRVt/E7x/4MdgTVznZ1CERThss18Q2Ldug/d3diWcZFUgPOAJ7UQdYN1ukaJvdA3s8V2syDeJESPy0rFbaasG0RsfDyrXUckbsbr8vcejCLQ+t8UeX4atpAK4msx4lzM5/o6pudK7Q0UD0tS6IpbTmP1GT1BX0E+XoztIqQF+eLWAOxh0sATkbpRwflcVxnryeZYggF7O+F/BvkMKKc22+dHqg7jYiYzmy0YX5Xhuktn+vX12a228Oa+rT5piyXDa5hYSrdsh6DlQk0v5QOFV8HtFEdeOp/G/OPkY8oSGYbNYyeKZ/13FPTcMvEQK14hCZTp6jn2+jzjA9V+bWy/fSM/FpMg6aWQY7OO6KBr2U/jm4Co0dMEwkYRdDPC3ZeCYVc8GEUW5ilfRoL4WETLURmXG2oiZuSZ1knGgKVSIu6uJ8haHtggjoxJXDUnSKD4jKFeT4fwbi7OrrnLkv88L4VjzH3bMFSpk0MWd4GiboD4wgW3ceC2z9DvEImrVVabPL2jY40lCAlslBQR8ZuKwmceXZF60+qz1KNzMoY/qaTjn1HjvOWf+7PPhRVKISnLNxcAue8DwTIeg2arFGUkAcGiLHZLWG9wIKrZNfMhbkzSIB++5PW0c5P9oNeDsHerRotKSbg/so89RyG4lmi0ch70MMz4X8BD1MkWKwxBU/80nTR4bhZKVxvXRDDSW6QFaK3tOQu4ryl9ll+WmXkGVfRkU+aZbfhfLlMC3uNVZwj+Xk2Xz01U3ERBeLanAgHec667xoXpXh6VZcsaV2/9H+y0hX7Ht60G+5RzNuetfTiBUcGB0ZX2CzQPLIkT7pjrCkTh/NljxP4LrM1pWvli8AThnXa6uzmIv/EtZS9e28VSeYj3N864K7YtxH+wrpIGt0rWLTao8jMSHguj6Xrt075uyobO8syrBmbZW2t25EpbQkyDpULlz316Lsp1ZOV4fQa8sOLwGBjFPnvNfUkFsHxVvmPbmHsqBfIKm9f1h7ISd9pr9VuX7jcXPDVUdqoXVi0iArue2BV6TeOdeujrFe","1; CY4PR07MB3496;\n\t6:wzGHo+nwy1gvqzNkCTe+ZLLF0jVXftd3QyQHaI0W/CHShRhttNJFvCGaIzkszo+3NqWVd8pmwXp0IDkOKKVmux4Mbh/Z60ycffOFoUbGQWPMEFDW+BMz8mUtuxACKfUmh8406BxRC/W2i7Lepb5vMqgFx0mZC10SXkZe/di33pUTukYzHCUxq0dMT6BzOEjVy9/bgZ0AFNUlC3j4wgnKHIxLticrE8NXcMXLwppppeCCytZpy64rkFEJgqte8D+OXbcyIFRvvIczV4qNdAtyJUi+Q0GdEn5x9moyeMzythGwTNY9TBWXP82W/+3f8HWpqEnybdMeT3twINm2+J4epsGVWrNfkqtoXVWD53/ZliQ=;\n\t5:uRZw76Y6EYtjmjsCpXgww+O7F7fW5n9EmwEqHP7hvdqX3AVprO4G2b/BZ03w1UUZiyzNhrUGENCLDl6sAofgcDd96+dJDnHSn9H5JiNhVJRErhly2QtyAPSGXax7S7DHEYaXGuxHodoy3Or+CKKSfYI+G8hf0rTzKg3Q8VpKNmY=;\n\t24:kHSAwWUTkLLWP/vUnZDPJjNAiE00PZ9CatMGCLbzsv6ZY4JIgFxP6RbSZrp4ONe1iA24zRaGcbs3e7YI8wqADXaHLML3VjbgeQhqV7AyGVk=;\n\t7:D5db1nvV7nckbtmTxiqD+1CQoAH0l4ba3lSZxDnq8/6dkwWUIrMHS43TUJhiloVliLFd+xpJd7+5PUe2jp3ZptRwMMo5QCOSVx2bgQ/7sNm76YGa0aeJ3Kvox2JTEUWA6YmB0SXHk23Y0lm6FRcqSZFSBI2+uhYFom3H21sx4/BjjjSBfh7kqjEGlZKxOrfI+t6XZ6I2b8B3JdIS3+l9a/cmrgvVS9AW6CGIjgPovcwtRSYr6tc0xfy07Ga2W3Tr"],"X-MS-TrafficTypeDiagnostic":"CY4PR07MB3496:","X-Exchange-Antispam-Report-Test":"UriScan:;","X-Microsoft-Antispam-PRVS":"<CY4PR07MB34964F5B2FCAD2F6113C3934975C0@CY4PR07MB3496.namprd07.prod.outlook.com>","X-Exchange-Antispam-Report-CFA-Test":"BCL:0; PCL:0;\n\tRULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(10201501046)(93006095)(93001095)(3002001)(100000703101)(100105400095)(3231020)(6041248)(20161123555025)(20161123560025)(20161123562025)(20161123564025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);\n\tSRVR:CY4PR07MB3496; BCL:0; PCL:0;\n\tRULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);\n\tSRVR:CY4PR07MB3496; ","X-Forefront-PRVS":"047999FF16","X-Forefront-Antispam-Report":"SFV:NSPM;\n\tSFS:(10009020)(6009001)(346002)(376002)(189002)(199003)(25786009)(72206003)(16526018)(50226002)(53416004)(7736002)(105586002)(305945005)(101416001)(48376002)(478600001)(50986999)(6506006)(76176999)(50466002)(33646002)(47776003)(5003940100001)(106356001)(107886003)(68736007)(2906002)(4326008)(6666003)(6486002)(2950100002)(6512007)(316002)(110136005)(97736004)(16586007)(54906003)(5660300001)(53936002)(189998001)(3846002)(36756003)(6116002)(8936002)(66066001)(1076002)(8676002)(575784001)(81166006)(81156014)(86362001)(69596002);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR07MB3496;\n\tH:ddl.caveonetworks.com; FPR:; SPF:None; PTR:InfoNoRecords;\n\tMX: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":"cavium.com","X-MS-Exchange-CrossTenant-OriginalArrivalTime":"02 Nov 2017 00:36:30.3196\n\t(UTC)","X-MS-Exchange-CrossTenant-Network-Message-Id":"5f51fc90-c44a-426d-ceb6-08d52189c637","X-MS-Exchange-CrossTenant-FromEntityHeader":"Hosted","X-MS-Exchange-CrossTenant-Id":"711e4ccf-2e9b-4bcf-a551-4094005b6194","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"CY4PR07MB3496","Sender":"netdev-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<netdev.vger.kernel.org>","X-Mailing-List":"netdev@vger.kernel.org"},"content":"From: Carlos Munoz <cmunoz@cavium.com>\n\nAdd a global resource manager to manage tagged pointers within\nbootmem allocated memory. This is used by various functional\nblocks in the Octeon core like the FPA, Ethernet nexus, etc.\n\nSigned-off-by: Carlos Munoz <cmunoz@cavium.com>\nSigned-off-by: Steven J. Hill <Steven.Hill@cavium.com>\nSigned-off-by: David Daney <david.daney@cavium.com>\n---\n arch/mips/cavium-octeon/Makefile       |   3 +-\n arch/mips/cavium-octeon/resource-mgr.c | 362 +++++++++++++++++++++++++++++++++\n arch/mips/include/asm/octeon/octeon.h  |  18 ++\n 3 files changed, 382 insertions(+), 1 deletion(-)\n create mode 100644 arch/mips/cavium-octeon/resource-mgr.c","diff":"diff --git a/arch/mips/cavium-octeon/Makefile b/arch/mips/cavium-octeon/Makefile\nindex 7c02e542959a..0a299ab8719f 100644\n--- a/arch/mips/cavium-octeon/Makefile\n+++ b/arch/mips/cavium-octeon/Makefile\n@@ -9,7 +9,8 @@\n # Copyright (C) 2005-2009 Cavium Networks\n #\n \n-obj-y := cpu.o setup.o octeon-platform.o octeon-irq.o csrc-octeon.o\n+obj-y := cpu.o setup.o octeon-platform.o octeon-irq.o csrc-octeon.o \\\n+\t resource-mgr.o\n obj-y += dma-octeon.o\n obj-y += octeon-memcpy.o\n obj-y += executive/\ndiff --git a/arch/mips/cavium-octeon/resource-mgr.c b/arch/mips/cavium-octeon/resource-mgr.c\nnew file mode 100644\nindex 000000000000..d31b72d56c31\n--- /dev/null\n+++ b/arch/mips/cavium-octeon/resource-mgr.c\n@@ -0,0 +1,362 @@\n+/*\n+ * Resource manager for Octeon.\n+ *\n+ * This file is subject to the terms and conditions of the GNU General Public\n+ * License.  See the file \"COPYING\" in the main directory of this archive\n+ * for more details.\n+ *\n+ * Copyright (C) 2017 Cavium, Inc.\n+ */\n+#include <linux/module.h>\n+\n+#include <asm/octeon/octeon.h>\n+#include <asm/octeon/cvmx-bootmem.h>\n+\n+#define RESOURCE_MGR_BLOCK_NAME\t\t\"cvmx-global-resources\"\n+#define MAX_RESOURCES\t\t\t128\n+#define INST_AVAILABLE\t\t\t-88\n+#define OWNER\t\t\t\t0xbadc0de\n+\n+struct global_resource_entry {\n+\tstruct global_resource_tag tag;\n+\tu64 phys_addr;\n+\tu64 size;\n+};\n+\n+struct global_resources {\n+#ifdef __LITTLE_ENDIAN_BITFIELD\n+\tu32 rlock;\n+\tu32 pad;\n+#else\n+\tu32 pad;\n+\tu32 rlock;\n+#endif\n+\tu64 entry_cnt;\n+\tstruct global_resource_entry resource_entry[];\n+};\n+\n+static struct global_resources *res_mgr_info;\n+\n+\n+static void res_mgr_lock(void)\n+{\n+\tunsigned int tmp;\n+\tu64 lock = (u64)&res_mgr_info->rlock;\n+\n+\t__asm__ __volatile__(\n+\t\t\".set noreorder\\n\"\n+\t\t\"1: ll   %[tmp], 0(%[addr])\\n\"\n+\t\t\"   bnez %[tmp], 1b\\n\"\n+\t\t\"   li   %[tmp], 1\\n\"\n+\t\t\"   sc   %[tmp], 0(%[addr])\\n\"\n+\t\t\"   beqz %[tmp], 1b\\n\"\n+\t\t\"   nop\\n\"\n+\t\t\".set reorder\\n\" :\n+\t\t[tmp] \"=&r\"(tmp) :\n+\t\t[addr] \"r\"(lock) :\n+\t\t\"memory\");\n+}\n+\n+static void res_mgr_unlock(void)\n+{\n+\tu64 lock = (u64)&res_mgr_info->rlock;\n+\n+\t/* Wait until all resource operations finish before unlocking. */\n+\tmb();\n+\t__asm__ __volatile__(\n+\t\t\"sw $0, 0(%[addr])\\n\" : :\n+\t\t[addr] \"r\"(lock) :\n+\t\t\"memory\");\n+\n+\t/* Force a write buffer flush. */\n+\tmb();\n+}\n+\n+static int res_mgr_find_resource(struct global_resource_tag tag)\n+{\n+\tstruct global_resource_entry *res_entry;\n+\tint i;\n+\n+\tfor (i = 0; i < res_mgr_info->entry_cnt; i++) {\n+\t\tres_entry = &res_mgr_info->resource_entry[i];\n+\t\tif (res_entry->tag.lo == tag.lo && res_entry->tag.hi == tag.hi)\n+\t\t\treturn i;\n+\t}\n+\treturn -1;\n+}\n+\n+/**\n+ * res_mgr_create_resource - Create a resource.\n+ * @tag: Identifies the resource.\n+ * @inst_cnt: Number of resource instances to create.\n+ *\n+ * Returns 0 if the source was created successfully.\n+ * Returns <0 for error codes.\n+ */\n+int res_mgr_create_resource(struct global_resource_tag tag, int inst_cnt)\n+{\n+\tstruct global_resource_entry *res_entry;\n+\tu64 size;\n+\tu64 *res_addr;\n+\tint res_index, i, rc = 0;\n+\n+\tres_mgr_lock();\n+\n+\t/* Make sure resource doesn't already exist. */\n+\tres_index = res_mgr_find_resource(tag);\n+\tif (res_index >= 0) {\n+\t\trc = -1;\n+\t\tgoto err;\n+\t}\n+\n+\tif (res_mgr_info->entry_cnt >= MAX_RESOURCES) {\n+\t\tpr_err(\"Resource max limit reached, not created\\n\");\n+\t\trc = -1;\n+\t\tgoto err;\n+\t}\n+\n+\t/*\n+\t * Each instance is kept in an array of u64s. The first array element\n+\t * holds the number of allocated instances.\n+\t */\n+\tsize = sizeof(u64) * (inst_cnt + 1);\n+\tres_addr = cvmx_bootmem_alloc_range(size, CVMX_CACHE_LINE_SIZE, 0, 0);\n+\tif (!res_addr) {\n+\t\tpr_err(\"Failed to allocate resource. not created\\n\");\n+\t\trc = -1;\n+\t\tgoto err;\n+\t}\n+\n+\t/* Initialize the newly created resource. */\n+\t*res_addr = inst_cnt;\n+\tfor (i = 1; i < inst_cnt + 1; i++)\n+\t\t*(res_addr + i) = INST_AVAILABLE;\n+\n+\tres_index = res_mgr_info->entry_cnt;\n+\tres_entry = &res_mgr_info->resource_entry[res_index];\n+\tres_entry->tag.lo = tag.lo;\n+\tres_entry->tag.hi = tag.hi;\n+\tres_entry->phys_addr = virt_to_phys(res_addr);\n+\tres_entry->size = size;\n+\tres_mgr_info->entry_cnt++;\n+\n+err:\n+\tres_mgr_unlock();\n+\n+\treturn rc;\n+}\n+EXPORT_SYMBOL(res_mgr_create_resource);\n+\n+/**\n+ * res_mgr_alloc_range - Allocate a range of resource instances.\n+ * @tag: Identifies the resource.\n+ * @req_inst: Requested start of instance range to allocate.\n+ *\t      Range instances are guaranteed to be sequential\n+ *\t      (-1 for don't care).\n+ * @req_cnt: Number of instances to allocate.\n+ * @use_last_avail: Set to request the last available instance.\n+ * @inst: Updated with the allocated instances.\n+ *\n+ * Returns 0 if the source was created successfully.\n+ * Returns <0 for error codes.\n+ */\n+int res_mgr_alloc_range(struct global_resource_tag tag, int req_inst,\n+\t\t\tint req_cnt, bool use_last_avail, int *inst)\n+{\n+\tstruct global_resource_entry *res_entry;\n+\tint res_index;\n+\tu64 *res_addr;\n+\tu64 inst_cnt;\n+\tint alloc_cnt, i, rc = -1;\n+\n+\t/* Start with no instances allocated. */\n+\tfor (i = 0; i < req_cnt; i++)\n+\t\tinst[i] = INST_AVAILABLE;\n+\n+\tres_mgr_lock();\n+\n+\t/* Find the resource. */\n+\tres_index = res_mgr_find_resource(tag);\n+\tif (res_index < 0) {\n+\t\tpr_err(\"Resource not found, can't allocate instance\\n\");\n+\t\tgoto err;\n+\t}\n+\n+\t/* Get resource data. */\n+\tres_entry = &res_mgr_info->resource_entry[res_index];\n+\tres_addr = phys_to_virt(res_entry->phys_addr);\n+\tinst_cnt = *res_addr;\n+\n+\t/* Allocate the requested instances. */\n+\tif (req_inst >= 0) {\n+\t\t/* Specific instance range requested. */\n+\t\tif (req_inst + req_cnt >= inst_cnt) {\n+\t\t\tpr_err(\"Requested instance out of range\\n\");\n+\t\t\tgoto err;\n+\t\t}\n+\n+\t\tfor (i = 0; i < req_cnt; i++) {\n+\t\t\tif (*(res_addr + req_inst + 1 + i) == INST_AVAILABLE)\n+\t\t\t\tinst[i] = req_inst + i;\n+\t\t\telse {\n+\t\t\t\tinst[0] = INST_AVAILABLE;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\t} else if (use_last_avail) {\n+\t\t/* Last available instance requested. */\n+\t\talloc_cnt = 0;\n+\t\tfor (i = inst_cnt; i > 0; i--) {\n+\t\t\tif (*(res_addr + i) == INST_AVAILABLE) {\n+\t\t\t\t/*\n+\t\t\t\t * Instance off by 1 (first element holds the\n+\t\t\t\t * count).\n+\t\t\t\t */\n+\t\t\t\tinst[alloc_cnt] = i - 1;\n+\n+\t\t\t\talloc_cnt++;\n+\t\t\t\tif (alloc_cnt == req_cnt)\n+\t\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\n+\t\tif (i == 0)\n+\t\t\tinst[0] = INST_AVAILABLE;\n+\t} else {\n+\t\t/* Next available instance requested. */\n+\t\talloc_cnt = 0;\n+\t\tfor (i = 1; i <= inst_cnt; i++) {\n+\t\t\tif (*(res_addr + i) == INST_AVAILABLE) {\n+\t\t\t\t/*\n+\t\t\t\t * Instance off by 1 (first element holds the\n+\t\t\t\t * count).\n+\t\t\t\t */\n+\t\t\t\tinst[alloc_cnt] = i - 1;\n+\n+\t\t\t\talloc_cnt++;\n+\t\t\t\tif (alloc_cnt == req_cnt)\n+\t\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\n+\t\tif (i > inst_cnt)\n+\t\t\tinst[0] = INST_AVAILABLE;\n+\t}\n+\n+\tif (inst[0] != INST_AVAILABLE) {\n+\t\tfor (i = 0; i < req_cnt; i++)\n+\t\t\t*(res_addr + inst[i] + 1) = OWNER;\n+\t\trc = 0;\n+\t}\n+\n+err:\n+\tres_mgr_unlock();\n+\n+\treturn rc;\n+}\n+EXPORT_SYMBOL(res_mgr_alloc_range);\n+\n+/**\n+ * res_mgr_alloc - Allocate a resource instance.\n+ * @tag: Identifies the resource.\n+ * @req_inst: Requested instance to allocate (-1 for don't care).\n+ * @use_last_avail: Set to request the last available instance.\n+ *\n+ * Returns: Allocated resource instance if successful.\n+ * Returns <0 for error codes.\n+ */\n+int res_mgr_alloc(struct global_resource_tag tag, int req_inst, bool use_last_avail)\n+{\n+\tint inst, rc;\n+\n+\trc = res_mgr_alloc_range(tag, req_inst, 1, use_last_avail, &inst);\n+\tif (!rc)\n+\t\treturn inst;\n+\treturn rc;\n+}\n+EXPORT_SYMBOL(res_mgr_alloc);\n+\n+/**\n+ * res_mgr_free_range - Free a resource instance range.\n+ * @tag: Identifies the resource.\n+ * @req_inst: Requested instance to free.\n+ * @req_cnt: Number of instances to free.\n+ */\n+void res_mgr_free_range(struct global_resource_tag tag, const int *inst, int req_cnt)\n+{\n+\tstruct global_resource_entry *res_entry;\n+\tint res_index, i;\n+\tu64 *res_addr;\n+\n+\tres_mgr_lock();\n+\n+\t/* Find the resource. */\n+\tres_index = res_mgr_find_resource(tag);\n+\tif (res_index < 0) {\n+\t\tpr_err(\"Resource not found, can't free instance\\n\");\n+\t\tgoto err;\n+\t}\n+\n+\t/* Get the resource data. */\n+\tres_entry = &res_mgr_info->resource_entry[res_index];\n+\tres_addr = phys_to_virt(res_entry->phys_addr);\n+\n+\t/* Free the resource instances. */\n+\tfor (i = 0; i < req_cnt; i++) {\n+\t\t/* Instance off by 1 (first element holds the count). */\n+\t\t*(res_addr + inst[i] + 1) = INST_AVAILABLE;\n+\t}\n+\n+err:\n+\tres_mgr_unlock();\n+}\n+EXPORT_SYMBOL(res_mgr_free_range);\n+\n+/**\n+ * res_mgr_free - Free a resource instance.\n+ * @tag: Identifies the resource.\n+ * @req_inst: Requested instance to free.\n+ */\n+void res_mgr_free(struct global_resource_tag tag, int inst)\n+{\n+\tres_mgr_free_range(tag, &inst, 1);\n+}\n+EXPORT_SYMBOL(res_mgr_free);\n+\n+static int __init res_mgr_init(void)\n+{\n+\tstruct cvmx_bootmem_named_block_desc *block;\n+\tint block_size;\n+\tu64 addr;\n+\n+\tcvmx_bootmem_lock();\n+\n+\t/* Search for the resource manager data in boot memory. */\n+\tblock = cvmx_bootmem_phy_named_block_find(RESOURCE_MGR_BLOCK_NAME, CVMX_BOOTMEM_FLAG_NO_LOCKING);\n+\tif (block) {\n+\t\t/* Found. */\n+\t\tres_mgr_info = phys_to_virt(block->base_addr);\n+\t} else {\n+\t\t/* Create it. */\n+\t\tblock_size = sizeof(struct global_resources) +\n+\t\t\tsizeof(struct global_resource_entry) * MAX_RESOURCES;\n+\t\taddr = cvmx_bootmem_phy_named_block_alloc(block_size, 0, 0,\n+\t\t\t\tCVMX_CACHE_LINE_SIZE, RESOURCE_MGR_BLOCK_NAME,\n+\t\t\t\tCVMX_BOOTMEM_FLAG_NO_LOCKING);\n+\t\tif (!addr) {\n+\t\t\tpr_err(\"Failed to allocate name block %s\\n\",\n+\t\t\t       RESOURCE_MGR_BLOCK_NAME);\n+\t\t} else {\n+\t\t\tres_mgr_info = phys_to_virt(addr);\n+\t\t\tmemset(res_mgr_info, 0, block_size);\n+\t\t}\n+\t}\n+\n+\tcvmx_bootmem_unlock();\n+\n+\treturn 0;\n+}\n+device_initcall(res_mgr_init);\n+\n+MODULE_LICENSE(\"GPL\");\n+MODULE_DESCRIPTION(\"Cavium, Inc. Octeon resource manager\");\ndiff --git a/arch/mips/include/asm/octeon/octeon.h b/arch/mips/include/asm/octeon/octeon.h\nindex 92a17d67c1fa..0411efdb465c 100644\n--- a/arch/mips/include/asm/octeon/octeon.h\n+++ b/arch/mips/include/asm/octeon/octeon.h\n@@ -346,6 +346,24 @@ void octeon_mult_restore3_end(void);\n void octeon_mult_restore2(void);\n void octeon_mult_restore2_end(void);\n \n+/*\n+ * This definition must be kept in sync with the one in\n+ * cvmx-global-resources.c\n+ */\n+struct global_resource_tag {\n+\tuint64_t lo;\n+\tuint64_t hi;\n+};\n+\n+void res_mgr_free(struct global_resource_tag tag, int inst);\n+void res_mgr_free_range(struct global_resource_tag tag, const int *inst,\n+\t\t\tint req_cnt);\n+int res_mgr_alloc(struct global_resource_tag tag, int req_inst,\n+\t\t  bool use_last_avail);\n+int res_mgr_alloc_range(struct global_resource_tag tag, int req_inst,\n+\t\t\tint req_cnt, bool use_last_avail, int *inst);\n+int res_mgr_create_resource(struct global_resource_tag tag, int inst_cnt);\n+\n /**\n  * Read a 32bit value from the Octeon NPI register space\n  *\n","prefixes":["3/7"]}