From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757151AbcHWWfY (ORCPT ); Tue, 23 Aug 2016 18:35:24 -0400 Received: from mail-dm3nam03on0059.outbound.protection.outlook.com ([104.47.41.59]:51952 "EHLO NAM03-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755705AbcHWWdb (ORCPT ); Tue, 23 Aug 2016 18:33:31 -0400 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com;nxp.com; dkim=none (message not signed) header.d=none; From: Stuart Yoder To: CC: , , , , , , Stuart Yoder Subject: [PATCH 12/14] staging: fsl-mc: split mc-io definitions into a separate file Date: Tue, 23 Aug 2016 17:14:14 -0500 Message-ID: <1471990454-28834-1-git-send-email-stuart.yoder@nxp.com> X-Mailer: git-send-email 1.9.0 X-EOPAttributedMessage: 0 X-Matching-Connectors: 131164642776473023;(91ab9b29-cfa4-454e-5278-08d120cd25b8);() X-Forefront-Antispam-Report: CIP:192.88.168.50;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(626004)(85426001)(11100500001)(92566002)(229853001)(105606002)(110136002)(2351001)(189998001)(5003940100001)(106466001)(19580405001)(19580395003)(50986999)(586003)(87936001)(77096005)(104016004)(36756003)(48376002)(33646002)(97736004)(8936002)(81156014)(2906002)(81166006)(4326007)(8676002)(86362001)(50466002)(5660300001)(7846002)(305945005)(356003)(47776003)(68736007)(8666005)(50226002)(7059030)(2004002);DIR:OUT;SFP:1101;SCL:1;SRVR:CO2PR03MB2230;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11FD049;1:1bRUJ8pZj2/lqB7It/s/cPFlRbBYxtfm9/yJKA39mptQ4eezvqtVNPYw7fiN54x2VsIpXPZ5EFJ5DDYuUf4qQVloNl8d7o0Gk7LGxwj+OASKm/OW0B/6BByQeUiUkdOjHDeVBIakim1oRFEA/74advgAJAoSGFLSe2LzsspId9XtrugCsEOyErhLC/fY7NLcGWOVnDVhxWCZVyCPb1WqyGsr8m8Q7AuuI5kAKLk6W8ZJ0r8Ki2Jj6QO0Uwsyjq8pqvKGJMCUpQzrRdVEwjyVEH4C1TTDDQVX0pW2q0K+ingcE8TIu9Qg/Q99Fg9ukTzFAC58f3X0rh1K6wZtSr0vlXAFeG/uXQTRFhJu7UGvVmHrFscQ6r+a0CiFmVrWh7qE1PYzukg83bRD7ssMmjW21g1p1CENchq+ro/ztOkNEWJD6IqMKjI4JA29H18yBBMzCWeqvP1DGxTomQKRqDLHXxmzActMNh55DXd1rsvZA+k2faFAG+y7J3NPlk7oqOOK5oGnB0ig9czbYV70uOg4oyeJtaFW+M1QkbO93xBa66y9rPeBXPPUkSLnpljk+cW0mFysdjDaOr3gJkU7SZwrFTIGicLvo0AcZ/C6pkn7M1RZJ93+X7Kt50bXphdTRDHvka5GTml/Nb3UhGemm78+4aTEsH8Ah3UPrVx5jyBvL4TdJQFppPqNWPrbF8C1XeJ29Oh1fhebqXFWCx+nNYs5FfaQ3wOSIHpHHlzUl6t5XMg= MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: 9bb865a1-450f-4cf4-5dbf-08d3cba3563f X-Microsoft-Exchange-Diagnostics: 1;CO2PR03MB2230;2:SMcM4TjJqU262E0tO7deBnC3uLmgrdGaP6tjRMuhI00Hv7rKrQsdJlzjpJmuIGbvFczSluU2iK+1fLMfqYvrS1Aco67pHg/IDGMw9JHkekudOQuzVrA5ovwI07Uz7EGDNJUjUhvy6XjFNcUNYuBLjfoanPGV7GcBjc9kW0NgnAeQ5n01NN1TMsovNW4yeyM+;3:EaWFsq99VAhnuyTdXt2pzpYIh7HMA1QNG9FzY53VxSbZiMYRS2yqRmA0LvbTT5ka7DmrOCx/7lCqs2FpQkXpRQH3Xv1HV8D7OPyBr3CKMo0+XIbpZtEtmPyqTY9xCzEzzUT3dcQYsFPAgXp7PUou2p0Z56J3+nfOA7cE2DQz09ntyQxgt5Of4bXpSN0wQXEw2XAt3b6lIyxk4jC1mi3ezXjJ/Q61yGw16jCaFquYsrc=;25:zjxRTTN6nNwzUHDL9yvH9BfsJG2YDHoNqCfzqpu59zqmTP4ErhR34CeBqC+SunBo7+/+KLIUvaaHiQqL6bJ5VzBuRf783N953DyXd0hVTxlX984kvIKqNOJjaWd45oynNxqddJmu6x8MTszh2LWmyjo3wUbb909Csoy80TxEj/7Au9JjT4PHJsENPJsTtTq5AGVWjlptTZM2FxW4pP2KqquTLPJgA48Rc0tJtmqP/Li4hOO7Tn/4i/gKTUplE/ePK69qrX/EoLEHm1KhmgbeoBt6QARdXPKZWAsSjexM6YEX8//7bzeeSggrUB2ARTnK7oLZx4uC+8huZQAjGyw+rtWmdRwa0rOsLyaK34TbLVp1MHhu93F1+KcD96cg5RozPQAsl2ssGp7+Gplf2+qO/jCKGPOMmmg88/Mof1BfRmQ= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CO2PR03MB2230; X-Microsoft-Exchange-Diagnostics: 1;CO2PR03MB2230;31:OQL+FJGBU7wG3X4xPlhixyWK/cfrqdrjSY3fhZZlkp8dc5VCtzxsI7/iV2ZyDtYUVQ2xd6LshDple1CwZj/1A7vq7gLXM18Ng9uVNUiNEaoxLoXwnNABeoc9PKtmuK3ddZgVP69amJbrXOcOzMbsbUw3KdZL1eJ8r7DwV6gZ3ByRUhhlosnoFpRA4tT52xVqlWt9x3OK3IKO3tZkzpXcaa2BOAFkJTUmAMh5nDvZcUw=;4:EHI+2KJkQ5A98B82qhW/bL8Lkyx9o/DT7KJqCIbzQGe9mqNO/a29q+wKkda37S6WhZSq4GBQ8ZdsZ/mhQ3bXKig2/Nc6XZmvWK/kroZ4r5qAC+eaONwcGFAmOF22egSNrdBehQ5KyIR8BRpHhcib8tRiGQNjxUKuDu1xnVo07w2r1ER6HRNrQpYeTzggIOykq6LtYLDLo03GPnuYGg4ocfAwKCWN+NdoSbL4aByqgpPJgDqa3W0YXPukgBIhQ/AjSeH36VTTVDiGe/mbZVut/TrY/mc9uzmaWK1jsTqka+E8UCVmTlpHzqIa+RpriPGBeGj8eY6/qPKM3iu0gXmX/4FmYTV+Zuvs8abu0zrCzJFjFrl1MkvXiKlVfvQ0ApgsjWmYv+jqt2F8ujoZEQ3Vr7KbraNG6C+uPaUhxBMKExqvvKNB+r8jDIJmyjkgTeKY2Bwq4ruGbKfXnF3ZoXblFD+BeeuiO+CaSccOLBzzttshznfmt4Eruv6Lfhwe2HLCjh6ofFfvKe1Jm+7WOqV3loJrcQZ2CXZ5vJa899cMg20qU7I/JKc6H1DNRgURWPU7KrWQj4LC+4R6QorSjMTDLfop4xE5b5V4h75QTw0Gi6E= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(227817650892897)(275809806118684); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(13015025)(13017025)(13023025)(13024025)(13018025)(5005006)(8121501046)(3002001)(10201501046)(6055026);SRVR:CO2PR03MB2230;BCL:0;PCL:0;RULEID:(400006);SRVR:CO2PR03MB2230; X-Forefront-PRVS: 004395A01C X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CO2PR03MB2230;23:mC7P9pFs7diwq9xemD7S5IqCTuo+GHcvgAsT4a0ES?= =?us-ascii?Q?Wl1LxBMl1t2gpS1FkgINVGhsjI7C2QpZWty0mZe9ME3ZI6f4EwzLZkUbeIbg?= =?us-ascii?Q?oOo6CF/8MQv66Lb9Xfw/amiYwHENsSfpmh4IIA/rXIGknJnDRpHdJ8EHD/yO?= =?us-ascii?Q?yM1aNPz8CcJGIw+mvLjg5kJc1m2RCmv4qz/vVEtRhA85t8hWIaTgo5Ad2qAx?= =?us-ascii?Q?hDZ1MXpkKzqE5zfHYkw5jlNAWBYho35bl8KCutIEE+JUl9cDKXc8JFupoQ8c?= =?us-ascii?Q?BVM0bmosQBBs1b9OpH+8FV7sdNl5vmIYK8OkmnIwOrku7aeMzwNCGvn3c1cF?= =?us-ascii?Q?qk78vqHqnxmVsQ+/ok9j2oHNWl0FHoIFOz3eEmj9iydhWsXTFRacYOCRrJ+V?= =?us-ascii?Q?5zBzhCD/0ixE8Xp05L02ZvZEi264aWmYOfIso7/1b5XOlA6LBxnvSPjqScSh?= =?us-ascii?Q?mv15XORy0pEtHm1tchOkA++kz6IjeH+CTJ0YsKnjHqiLzTycnslJXwLZJSN/?= =?us-ascii?Q?HswzVllHREzLwrvYGZAKrvdOoZqMDFTlaY1nCJd2Cp8C6Rkr8ZBMXhsoBeN9?= =?us-ascii?Q?1AiaOSSFP7oy1G4cy1eNo4S/rKMWhJfkSrdtYdFBtD2S8JQ+Gt2Y840xckOS?= =?us-ascii?Q?ubim6m7wdkq8W9LY0onIalPXvK8+ROA8tHK9T7277CxtMNELSOv6fDjVC8fN?= =?us-ascii?Q?U7g6pa/gi7NHpqStl5HXkxPQGqpgmuSO6YnU+gH7BBkcyVU/WeIyeTAsiSp1?= =?us-ascii?Q?s6OYJ64jIWtmV09LN6usqbqf+WLVc3R8ko6Om7/At2CLfYojDkttfRAMa/PD?= =?us-ascii?Q?R9407PIDWxhK1D8Y973jTICWIbO5MQ9heX+XoZrvMMRIGKXYH8wXoYrZVJ8Y?= =?us-ascii?Q?/jOZOJIjxOLZU2eQwtAKqLxDKtTrPBlZB/wWa9BK4yJiOl+dwDlttp+6ZN+x?= =?us-ascii?Q?+qUCMiQ7Tes62EY0Mtynd38Sp7R877eULDVvd+cHQt7FU0hENb0EPayjc1k3?= =?us-ascii?Q?b/yniOUZ8fZbcBfVV8jjEPzqyVRiuy11MbBBrQmmxZRS4epJa/68GmumP4Gu?= =?us-ascii?Q?9gEUaj8TuJzztau+4Lmn60WEjINs3/0AbysuCkFncTJO+2N4vu7uDoO8Qm8g?= =?us-ascii?Q?oJ5QM14E6rj97GEr+rbUypTuOyFi6fL?= X-Microsoft-Exchange-Diagnostics: 1;CO2PR03MB2230;6:2Kz8m4ILVmZhWnofsNu+InXGvjvG1/+wHTuVp44ctXqhPJVs8ueWXDnvEQhamEhfbt/mG+PB4F8HbXL4oHEy3B6MwFb61ULnwe9NDlB0O36LXZ/b8Z0L8THWyqDiHYz0E3s+UnTP6zF9wTxL1bkA92qBrL3wESWkte1LTmA3sCDtJgd9mfFhrq+PYikN0fbxdh0kqjO/NIRTUsHMEg7+ulvgNvdc6ItI8WmdIE70scVCQaT3fdNJJCDOxNx+xQmtLWqU3a3ZjfB7qd1/3D/GWiXw3fDPxx+jBbzQ7rpeQps=;5:S5Z1e/L+DhGG2RjvcNxptetlXfnYUHB7+Mn7BflqR3EWBE78I/Yy4Aq/APiOweGZZipoI9e+vLuhTKxpV5gpgdGkdRILKkjA3jallWXcO3XEROdMwohn62hA2Hdh3ZbLNp4U6lOVAr/FsxKNZYfRdAH9prjQPCNT/jDczOrdhrc=;24:X1XnwyJzmcGcP0oEwdL2LX4UedGruY14xM3aOUDQFY5501R1zIxQ3PIz3EugG17O9L+3wYceE6rG4+k+joYK0ZvOk7hSfY88USlKJsxXO0c=;7:xxrMnVbD9YsrK6XPKdipfOldyX6sjQgw3vFH4NWccR4W/f7uRP6u9MKUhgCWQZF5rYKT8tVIUMF6ZLIz36h7fSIcTASBGAma3+5R5K/YIuKyeZFMVgUIkl2YMWEjlg/aCei+ORWgwAfc2vlF7PDbWuv4YQkEsLEoFcTqkXzp+ehHbGbEJZsDJMwZTvKK0h3LiS2Cww4Ump0LiA0NSqyeaIve8o71nIBKnWFuR05RiJObtSB5cWolSb1b7lfagPC2 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Aug 2016 22:17:57.4601 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;Ip=[192.88.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO2PR03MB2230 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org An mc-io is a software abstraction of a dpmcp object (an MC portal). Routines to create/initialize/reset this portal abstraction were split between the allocator and mc-sys.c (MC command interface). Move mc-io/portal related definitions into one source file. Signed-off-by: Stuart Yoder --- drivers/staging/fsl-mc/bus/Makefile | 1 + drivers/staging/fsl-mc/bus/fsl-mc-allocator.c | 140 ------------ drivers/staging/fsl-mc/bus/fsl-mc-private.h | 8 + drivers/staging/fsl-mc/bus/mc-io.c | 318 ++++++++++++++++++++++++++ drivers/staging/fsl-mc/bus/mc-sys.c | 147 ------------ drivers/staging/fsl-mc/include/mc-sys.h | 13 -- 6 files changed, 327 insertions(+), 300 deletions(-) create mode 100644 drivers/staging/fsl-mc/bus/mc-io.c diff --git a/drivers/staging/fsl-mc/bus/Makefile b/drivers/staging/fsl-mc/bus/Makefile index 5fb4c14..38716fd 100644 --- a/drivers/staging/fsl-mc/bus/Makefile +++ b/drivers/staging/fsl-mc/bus/Makefile @@ -9,6 +9,7 @@ obj-$(CONFIG_FSL_MC_BUS) += mc-bus-driver.o mc-bus-driver-objs := fsl-mc-bus.o \ mc-sys.o \ + mc-io.o \ dprc.o \ dpmng.o \ dprc-driver.o \ diff --git a/drivers/staging/fsl-mc/bus/fsl-mc-allocator.c b/drivers/staging/fsl-mc/bus/fsl-mc-allocator.c index e865375..edcb5cc 100644 --- a/drivers/staging/fsl-mc/bus/fsl-mc-allocator.c +++ b/drivers/staging/fsl-mc/bus/fsl-mc-allocator.c @@ -13,8 +13,6 @@ #include #include "../include/dpbp-cmd.h" #include "../include/dpcon-cmd.h" -#include "dpmcp-cmd.h" -#include "dpmcp.h" #include "fsl-mc-private.h" #include @@ -258,144 +256,6 @@ out_unlock: EXPORT_SYMBOL_GPL(fsl_mc_resource_free); /** - * fsl_mc_portal_allocate - Allocates an MC portal - * - * @mc_dev: MC device for which the MC portal is to be allocated - * @mc_io_flags: Flags for the fsl_mc_io object that wraps the allocated - * MC portal. - * @new_mc_io: Pointer to area where the pointer to the fsl_mc_io object - * that wraps the allocated MC portal is to be returned - * - * This function allocates an MC portal from the device's parent DPRC, - * from the corresponding MC bus' pool of MC portals and wraps - * it in a new fsl_mc_io object. If 'mc_dev' is a DPRC itself, the - * portal is allocated from its own MC bus. - */ -int __must_check fsl_mc_portal_allocate(struct fsl_mc_device *mc_dev, - u16 mc_io_flags, - struct fsl_mc_io **new_mc_io) -{ - struct fsl_mc_device *mc_bus_dev; - struct fsl_mc_bus *mc_bus; - phys_addr_t mc_portal_phys_addr; - size_t mc_portal_size; - struct fsl_mc_device *dpmcp_dev; - int error = -EINVAL; - struct fsl_mc_resource *resource = NULL; - struct fsl_mc_io *mc_io = NULL; - - if (mc_dev->flags & FSL_MC_IS_DPRC) { - mc_bus_dev = mc_dev; - } else { - if (WARN_ON(!dev_is_fsl_mc(mc_dev->dev.parent))) - return error; - - mc_bus_dev = to_fsl_mc_device(mc_dev->dev.parent); - } - - mc_bus = to_fsl_mc_bus(mc_bus_dev); - *new_mc_io = NULL; - error = fsl_mc_resource_allocate(mc_bus, FSL_MC_POOL_DPMCP, &resource); - if (error < 0) - return error; - - error = -EINVAL; - dpmcp_dev = resource->data; - if (WARN_ON(!dpmcp_dev)) - goto error_cleanup_resource; - - if (dpmcp_dev->obj_desc.ver_major < DPMCP_MIN_VER_MAJOR || - (dpmcp_dev->obj_desc.ver_major == DPMCP_MIN_VER_MAJOR && - dpmcp_dev->obj_desc.ver_minor < DPMCP_MIN_VER_MINOR)) { - dev_err(&dpmcp_dev->dev, - "ERROR: Version %d.%d of DPMCP not supported.\n", - dpmcp_dev->obj_desc.ver_major, - dpmcp_dev->obj_desc.ver_minor); - error = -ENOTSUPP; - goto error_cleanup_resource; - } - - if (WARN_ON(dpmcp_dev->obj_desc.region_count == 0)) - goto error_cleanup_resource; - - mc_portal_phys_addr = dpmcp_dev->regions[0].start; - mc_portal_size = dpmcp_dev->regions[0].end - - dpmcp_dev->regions[0].start + 1; - - if (WARN_ON(mc_portal_size != mc_bus_dev->mc_io->portal_size)) - goto error_cleanup_resource; - - error = fsl_create_mc_io(&mc_bus_dev->dev, - mc_portal_phys_addr, - mc_portal_size, dpmcp_dev, - mc_io_flags, &mc_io); - if (error < 0) - goto error_cleanup_resource; - - *new_mc_io = mc_io; - return 0; - -error_cleanup_resource: - fsl_mc_resource_free(resource); - return error; -} -EXPORT_SYMBOL_GPL(fsl_mc_portal_allocate); - -/** - * fsl_mc_portal_free - Returns an MC portal to the pool of free MC portals - * of a given MC bus - * - * @mc_io: Pointer to the fsl_mc_io object that wraps the MC portal to free - */ -void fsl_mc_portal_free(struct fsl_mc_io *mc_io) -{ - struct fsl_mc_device *dpmcp_dev; - struct fsl_mc_resource *resource; - - /* - * Every mc_io obtained by calling fsl_mc_portal_allocate() is supposed - * to have a DPMCP object associated with. - */ - dpmcp_dev = mc_io->dpmcp_dev; - if (WARN_ON(!dpmcp_dev)) - return; - - resource = dpmcp_dev->resource; - if (WARN_ON(!resource || resource->type != FSL_MC_POOL_DPMCP)) - return; - - if (WARN_ON(resource->data != dpmcp_dev)) - return; - - fsl_destroy_mc_io(mc_io); - fsl_mc_resource_free(resource); -} -EXPORT_SYMBOL_GPL(fsl_mc_portal_free); - -/** - * fsl_mc_portal_reset - Resets the dpmcp object for a given fsl_mc_io object - * - * @mc_io: Pointer to the fsl_mc_io object that wraps the MC portal to free - */ -int fsl_mc_portal_reset(struct fsl_mc_io *mc_io) -{ - int error; - struct fsl_mc_device *dpmcp_dev = mc_io->dpmcp_dev; - - if (WARN_ON(!dpmcp_dev)) - return -EINVAL; - - error = dpmcp_reset(mc_io, 0, dpmcp_dev->mc_handle); - if (error < 0) { - dev_err(&dpmcp_dev->dev, "dpmcp_reset() failed: %d\n", error); - return error; - } - - return 0; -} -EXPORT_SYMBOL_GPL(fsl_mc_portal_reset); - -/** * fsl_mc_object_allocate - Allocates a MC object device of the given * pool type from a given MC bus * diff --git a/drivers/staging/fsl-mc/bus/fsl-mc-private.h b/drivers/staging/fsl-mc/bus/fsl-mc-private.h index 1479934..d459c26 100644 --- a/drivers/staging/fsl-mc/bus/fsl-mc-private.h +++ b/drivers/staging/fsl-mc/bus/fsl-mc-private.h @@ -41,4 +41,12 @@ int __init its_fsl_mc_msi_init(void); void its_fsl_mc_msi_cleanup(void); +int __must_check fsl_create_mc_io(struct device *dev, + phys_addr_t mc_portal_phys_addr, + u32 mc_portal_size, + struct fsl_mc_device *dpmcp_dev, + u32 flags, struct fsl_mc_io **new_mc_io); + +void fsl_destroy_mc_io(struct fsl_mc_io *mc_io); + #endif /* _FSL_MC_PRIVATE_H_ */ diff --git a/drivers/staging/fsl-mc/bus/mc-io.c b/drivers/staging/fsl-mc/bus/mc-io.c new file mode 100644 index 0000000..c5edfc8 --- /dev/null +++ b/drivers/staging/fsl-mc/bus/mc-io.c @@ -0,0 +1,318 @@ +/* Copyright 2013-2016 Freescale Semiconductor Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the above-listed copyright holders nor the + * names of any contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * + * ALTERNATIVELY, this software may be distributed under the terms of the + * GNU General Public License ("GPL") as published by the Free Software + * Foundation, either version 2 of that License or (at your option) any + * later version. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "../include/mc-bus.h" +#include "../include/mc-sys.h" +#include "fsl-mc-private.h" +#include "dpmcp.h" +#include "dpmcp-cmd.h" + +static int fsl_mc_io_set_dpmcp(struct fsl_mc_io *mc_io, + struct fsl_mc_device *dpmcp_dev) +{ + int error; + + if (WARN_ON(!dpmcp_dev)) + return -EINVAL; + + if (WARN_ON(mc_io->dpmcp_dev)) + return -EINVAL; + + if (WARN_ON(dpmcp_dev->mc_io)) + return -EINVAL; + + error = dpmcp_open(mc_io, + 0, + dpmcp_dev->obj_desc.id, + &dpmcp_dev->mc_handle); + if (error < 0) + return error; + + mc_io->dpmcp_dev = dpmcp_dev; + dpmcp_dev->mc_io = mc_io; + return 0; +} + +static void fsl_mc_io_unset_dpmcp(struct fsl_mc_io *mc_io) +{ + int error; + struct fsl_mc_device *dpmcp_dev = mc_io->dpmcp_dev; + + if (WARN_ON(!dpmcp_dev)) + return; + + if (WARN_ON(dpmcp_dev->mc_io != mc_io)) + return; + + error = dpmcp_close(mc_io, + 0, + dpmcp_dev->mc_handle); + if (error < 0) { + dev_err(&dpmcp_dev->dev, "dpmcp_close() failed: %d\n", + error); + } + + mc_io->dpmcp_dev = NULL; + dpmcp_dev->mc_io = NULL; +} + +/** + * Creates an MC I/O object + * + * @dev: device to be associated with the MC I/O object + * @mc_portal_phys_addr: physical address of the MC portal to use + * @mc_portal_size: size in bytes of the MC portal + * @dpmcp-dev: Pointer to the DPMCP object associated with this MC I/O + * object or NULL if none. + * @flags: flags for the new MC I/O object + * @new_mc_io: Area to return pointer to newly created MC I/O object + * + * Returns '0' on Success; Error code otherwise. + */ +int __must_check fsl_create_mc_io(struct device *dev, + phys_addr_t mc_portal_phys_addr, + u32 mc_portal_size, + struct fsl_mc_device *dpmcp_dev, + u32 flags, struct fsl_mc_io **new_mc_io) +{ + int error; + struct fsl_mc_io *mc_io; + void __iomem *mc_portal_virt_addr; + struct resource *res; + + mc_io = devm_kzalloc(dev, sizeof(*mc_io), GFP_KERNEL); + if (!mc_io) + return -ENOMEM; + + mc_io->dev = dev; + mc_io->flags = flags; + mc_io->portal_phys_addr = mc_portal_phys_addr; + mc_io->portal_size = mc_portal_size; + if (flags & FSL_MC_IO_ATOMIC_CONTEXT_PORTAL) + spin_lock_init(&mc_io->spinlock); + else + mutex_init(&mc_io->mutex); + + res = devm_request_mem_region(dev, + mc_portal_phys_addr, + mc_portal_size, + "mc_portal"); + if (!res) { + dev_err(dev, + "devm_request_mem_region failed for MC portal %#llx\n", + mc_portal_phys_addr); + return -EBUSY; + } + + mc_portal_virt_addr = devm_ioremap_nocache(dev, + mc_portal_phys_addr, + mc_portal_size); + if (!mc_portal_virt_addr) { + dev_err(dev, + "devm_ioremap_nocache failed for MC portal %#llx\n", + mc_portal_phys_addr); + return -ENXIO; + } + + mc_io->portal_virt_addr = mc_portal_virt_addr; + if (dpmcp_dev) { + error = fsl_mc_io_set_dpmcp(mc_io, dpmcp_dev); + if (error < 0) + goto error_destroy_mc_io; + } + + *new_mc_io = mc_io; + return 0; + +error_destroy_mc_io: + fsl_destroy_mc_io(mc_io); + return error; +} + +/** + * Destroys an MC I/O object + * + * @mc_io: MC I/O object to destroy + */ +void fsl_destroy_mc_io(struct fsl_mc_io *mc_io) +{ + struct fsl_mc_device *dpmcp_dev = mc_io->dpmcp_dev; + + if (dpmcp_dev) + fsl_mc_io_unset_dpmcp(mc_io); + + devm_iounmap(mc_io->dev, mc_io->portal_virt_addr); + devm_release_mem_region(mc_io->dev, + mc_io->portal_phys_addr, + mc_io->portal_size); + + mc_io->portal_virt_addr = NULL; + devm_kfree(mc_io->dev, mc_io); +} + +/** + * fsl_mc_portal_allocate - Allocates an MC portal + * + * @mc_dev: MC device for which the MC portal is to be allocated + * @mc_io_flags: Flags for the fsl_mc_io object that wraps the allocated + * MC portal. + * @new_mc_io: Pointer to area where the pointer to the fsl_mc_io object + * that wraps the allocated MC portal is to be returned + * + * This function allocates an MC portal from the device's parent DPRC, + * from the corresponding MC bus' pool of MC portals and wraps + * it in a new fsl_mc_io object. If 'mc_dev' is a DPRC itself, the + * portal is allocated from its own MC bus. + */ +int __must_check fsl_mc_portal_allocate(struct fsl_mc_device *mc_dev, + u16 mc_io_flags, + struct fsl_mc_io **new_mc_io) +{ + struct fsl_mc_device *mc_bus_dev; + struct fsl_mc_bus *mc_bus; + phys_addr_t mc_portal_phys_addr; + size_t mc_portal_size; + struct fsl_mc_device *dpmcp_dev; + int error = -EINVAL; + struct fsl_mc_resource *resource = NULL; + struct fsl_mc_io *mc_io = NULL; + + if (mc_dev->flags & FSL_MC_IS_DPRC) { + mc_bus_dev = mc_dev; + } else { + if (WARN_ON(!dev_is_fsl_mc(mc_dev->dev.parent))) + return error; + + mc_bus_dev = to_fsl_mc_device(mc_dev->dev.parent); + } + + mc_bus = to_fsl_mc_bus(mc_bus_dev); + *new_mc_io = NULL; + error = fsl_mc_resource_allocate(mc_bus, FSL_MC_POOL_DPMCP, &resource); + if (error < 0) + return error; + + error = -EINVAL; + dpmcp_dev = resource->data; + if (WARN_ON(!dpmcp_dev)) + goto error_cleanup_resource; + + if (dpmcp_dev->obj_desc.ver_major < DPMCP_MIN_VER_MAJOR || + (dpmcp_dev->obj_desc.ver_major == DPMCP_MIN_VER_MAJOR && + dpmcp_dev->obj_desc.ver_minor < DPMCP_MIN_VER_MINOR)) { + dev_err(&dpmcp_dev->dev, + "ERROR: Version %d.%d of DPMCP not supported.\n", + dpmcp_dev->obj_desc.ver_major, + dpmcp_dev->obj_desc.ver_minor); + error = -ENOTSUPP; + goto error_cleanup_resource; + } + + if (WARN_ON(dpmcp_dev->obj_desc.region_count == 0)) + goto error_cleanup_resource; + + mc_portal_phys_addr = dpmcp_dev->regions[0].start; + mc_portal_size = dpmcp_dev->regions[0].end - + dpmcp_dev->regions[0].start + 1; + + if (WARN_ON(mc_portal_size != mc_bus_dev->mc_io->portal_size)) + goto error_cleanup_resource; + + error = fsl_create_mc_io(&mc_bus_dev->dev, + mc_portal_phys_addr, + mc_portal_size, dpmcp_dev, + mc_io_flags, &mc_io); + if (error < 0) + goto error_cleanup_resource; + + *new_mc_io = mc_io; + return 0; + +error_cleanup_resource: + fsl_mc_resource_free(resource); + return error; +} +EXPORT_SYMBOL_GPL(fsl_mc_portal_allocate); + +/** + * fsl_mc_portal_free - Returns an MC portal to the pool of free MC portals + * of a given MC bus + * + * @mc_io: Pointer to the fsl_mc_io object that wraps the MC portal to free + */ +void fsl_mc_portal_free(struct fsl_mc_io *mc_io) +{ + struct fsl_mc_device *dpmcp_dev; + struct fsl_mc_resource *resource; + + /* + * Every mc_io obtained by calling fsl_mc_portal_allocate() is supposed + * to have a DPMCP object associated with. + */ + dpmcp_dev = mc_io->dpmcp_dev; + if (WARN_ON(!dpmcp_dev)) + return; + + resource = dpmcp_dev->resource; + if (WARN_ON(!resource || resource->type != FSL_MC_POOL_DPMCP)) + return; + + if (WARN_ON(resource->data != dpmcp_dev)) + return; + + fsl_destroy_mc_io(mc_io); + fsl_mc_resource_free(resource); +} +EXPORT_SYMBOL_GPL(fsl_mc_portal_free); + +/** + * fsl_mc_portal_reset - Resets the dpmcp object for a given fsl_mc_io object + * + * @mc_io: Pointer to the fsl_mc_io object that wraps the MC portal to free + */ +int fsl_mc_portal_reset(struct fsl_mc_io *mc_io) +{ + int error; + struct fsl_mc_device *dpmcp_dev = mc_io->dpmcp_dev; + + if (WARN_ON(!dpmcp_dev)) + return -EINVAL; + + error = dpmcp_reset(mc_io, 0, dpmcp_dev->mc_handle); + if (error < 0) { + dev_err(&dpmcp_dev->dev, "dpmcp_reset() failed: %d\n", error); + return error; + } + + return 0; +} +EXPORT_SYMBOL_GPL(fsl_mc_portal_reset); diff --git a/drivers/staging/fsl-mc/bus/mc-sys.c b/drivers/staging/fsl-mc/bus/mc-sys.c index 0c185ab..23e82e4a 100644 --- a/drivers/staging/fsl-mc/bus/mc-sys.c +++ b/drivers/staging/fsl-mc/bus/mc-sys.c @@ -68,153 +68,6 @@ static u16 mc_cmd_hdr_read_cmdid(struct mc_command *cmd) return (cmd_id & MC_CMD_HDR_CMDID_MASK) >> MC_CMD_HDR_CMDID_SHIFT; } -/** - * Creates an MC I/O object - * - * @dev: device to be associated with the MC I/O object - * @mc_portal_phys_addr: physical address of the MC portal to use - * @mc_portal_size: size in bytes of the MC portal - * @dpmcp-dev: Pointer to the DPMCP object associated with this MC I/O - * object or NULL if none. - * @flags: flags for the new MC I/O object - * @new_mc_io: Area to return pointer to newly created MC I/O object - * - * Returns '0' on Success; Error code otherwise. - */ -int __must_check fsl_create_mc_io(struct device *dev, - phys_addr_t mc_portal_phys_addr, - u32 mc_portal_size, - struct fsl_mc_device *dpmcp_dev, - u32 flags, struct fsl_mc_io **new_mc_io) -{ - int error; - struct fsl_mc_io *mc_io; - void __iomem *mc_portal_virt_addr; - struct resource *res; - - mc_io = devm_kzalloc(dev, sizeof(*mc_io), GFP_KERNEL); - if (!mc_io) - return -ENOMEM; - - mc_io->dev = dev; - mc_io->flags = flags; - mc_io->portal_phys_addr = mc_portal_phys_addr; - mc_io->portal_size = mc_portal_size; - if (flags & FSL_MC_IO_ATOMIC_CONTEXT_PORTAL) - spin_lock_init(&mc_io->spinlock); - else - mutex_init(&mc_io->mutex); - - res = devm_request_mem_region(dev, - mc_portal_phys_addr, - mc_portal_size, - "mc_portal"); - if (!res) { - dev_err(dev, - "devm_request_mem_region failed for MC portal %#llx\n", - mc_portal_phys_addr); - return -EBUSY; - } - - mc_portal_virt_addr = devm_ioremap_nocache(dev, - mc_portal_phys_addr, - mc_portal_size); - if (!mc_portal_virt_addr) { - dev_err(dev, - "devm_ioremap_nocache failed for MC portal %#llx\n", - mc_portal_phys_addr); - return -ENXIO; - } - - mc_io->portal_virt_addr = mc_portal_virt_addr; - if (dpmcp_dev) { - error = fsl_mc_io_set_dpmcp(mc_io, dpmcp_dev); - if (error < 0) - goto error_destroy_mc_io; - } - - *new_mc_io = mc_io; - return 0; - -error_destroy_mc_io: - fsl_destroy_mc_io(mc_io); - return error; -} -EXPORT_SYMBOL_GPL(fsl_create_mc_io); - -/** - * Destroys an MC I/O object - * - * @mc_io: MC I/O object to destroy - */ -void fsl_destroy_mc_io(struct fsl_mc_io *mc_io) -{ - struct fsl_mc_device *dpmcp_dev = mc_io->dpmcp_dev; - - if (dpmcp_dev) - fsl_mc_io_unset_dpmcp(mc_io); - - devm_iounmap(mc_io->dev, mc_io->portal_virt_addr); - devm_release_mem_region(mc_io->dev, - mc_io->portal_phys_addr, - mc_io->portal_size); - - mc_io->portal_virt_addr = NULL; - devm_kfree(mc_io->dev, mc_io); -} -EXPORT_SYMBOL_GPL(fsl_destroy_mc_io); - -int fsl_mc_io_set_dpmcp(struct fsl_mc_io *mc_io, - struct fsl_mc_device *dpmcp_dev) -{ - int error; - - if (WARN_ON(!dpmcp_dev)) - return -EINVAL; - - if (WARN_ON(mc_io->dpmcp_dev)) - return -EINVAL; - - if (WARN_ON(dpmcp_dev->mc_io)) - return -EINVAL; - - error = dpmcp_open(mc_io, - 0, - dpmcp_dev->obj_desc.id, - &dpmcp_dev->mc_handle); - if (error < 0) - return error; - - mc_io->dpmcp_dev = dpmcp_dev; - dpmcp_dev->mc_io = mc_io; - return 0; -} -EXPORT_SYMBOL_GPL(fsl_mc_io_set_dpmcp); - -void fsl_mc_io_unset_dpmcp(struct fsl_mc_io *mc_io) -{ - int error; - struct fsl_mc_device *dpmcp_dev = mc_io->dpmcp_dev; - - if (WARN_ON(!dpmcp_dev)) - return; - - if (WARN_ON(dpmcp_dev->mc_io != mc_io)) - return; - - error = dpmcp_close(mc_io, - 0, - dpmcp_dev->mc_handle); - if (error < 0) { - dev_err(&dpmcp_dev->dev, "dpmcp_close() failed: %d\n", - error); - } - - mc_io->dpmcp_dev = NULL; - dpmcp_dev->mc_io = NULL; -} -EXPORT_SYMBOL_GPL(fsl_mc_io_unset_dpmcp); - static int mc_status_to_error(enum mc_cmd_status status) { static const int mc_status_to_error_map[] = { diff --git a/drivers/staging/fsl-mc/include/mc-sys.h b/drivers/staging/fsl-mc/include/mc-sys.h index c5038cc..7a73cf6 100644 --- a/drivers/staging/fsl-mc/include/mc-sys.h +++ b/drivers/staging/fsl-mc/include/mc-sys.h @@ -95,19 +95,6 @@ struct fsl_mc_io { }; }; -int __must_check fsl_create_mc_io(struct device *dev, - phys_addr_t mc_portal_phys_addr, - u32 mc_portal_size, - struct fsl_mc_device *dpmcp_dev, - u32 flags, struct fsl_mc_io **new_mc_io); - -void fsl_destroy_mc_io(struct fsl_mc_io *mc_io); - -int fsl_mc_io_set_dpmcp(struct fsl_mc_io *mc_io, - struct fsl_mc_device *dpmcp_dev); - -void fsl_mc_io_unset_dpmcp(struct fsl_mc_io *mc_io); - int mc_send_command(struct fsl_mc_io *mc_io, struct mc_command *cmd); #endif /* _FSL_MC_SYS_H */ -- 1.9.0