From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754511AbbJNU0u (ORCPT ); Wed, 14 Oct 2015 16:26:50 -0400 Received: from mail-bn1bn0106.outbound.protection.outlook.com ([157.56.110.106]:37478 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753804AbbJNU0q (ORCPT ); Wed, 14 Oct 2015 16:26:46 -0400 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none;freescale.mail.onmicrosoft.com; dmarc=none action=none header.from=freescale.com; From: "J. German Rivera" To: , , , CC: , , , , , , , , , , , , "J. German Rivera" Subject: [PATCH 4/4] staging: fsl-mc: Added serialization to mc_send_command() Date: Wed, 14 Oct 2015 15:11:45 -0500 Message-ID: <1444853505-1369-5-git-send-email-German.Rivera@freescale.com> X-Mailer: git-send-email 2.3.3 In-Reply-To: <1444853505-1369-1-git-send-email-German.Rivera@freescale.com> References: <1444853505-1369-1-git-send-email-German.Rivera@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BN1BFFO11FD052;1:HHu7fK0oFWAE5no1e4seY1szPxouQI6QcZB2WhKAOyLcf0ZrmFZxlbMemWWO0Jmps/6+IEQVxQ8poTsvqLgZmlYKcwiOPkRAkfj4ufGOxTCFkum7A+tFrMnRpo6uMWu7NKzsmz/+wWhrA2ZgmbR7L6jwpce8AMEyrwaxIzCWD57LUx3zE80A1UqktJRj4X3YMNIAC5zBD/dJQtMyvllv14OFnOYk4VqaiPeosFQnSJr9FFDIk5kzdlrC6CV0YCcZog3bIEO3/CTtHQkJ/orUSBnW6bB4auQeXhkjZgRI0nFCxIg5fz/NVcFXbvYFpmGa6fvanWwSjmp78A3AGD/sTtOCI8HDBvCpubEarnOLSftYOJdmwUKbMRs91W52cHaM7VcamlTgDMjMho35iRiTxA== X-Forefront-Antispam-Report: CIP:192.88.158.2;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(5008740100001)(50226001)(50466002)(46102003)(48376002)(104016004)(50986999)(92566002)(36756003)(5007970100001)(77096005)(11100500001)(2950100001)(5003940100001)(6806005)(106466001)(5001960100002)(86362001)(189998001)(107886002)(76176999)(87936001)(5001770100001)(85426001)(81156007)(97736004)(105606002)(19580405001)(19580395003)(69596002)(64706001)(2201001)(229853001)(47776003)(4001430100001);DIR:OUT;SFP:1102;SCL:1;SRVR:CY1PR0301MB0730;H:az84smr01.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB0730;2:xm5aro9gVzPc13brBegZUCVm9v14OPsRyMSuE9TKFjZA+8T0UCPrrzCXzgXKt7ZuOL9zGoZU+EgGMk1CJ1dB+TzZN0S9erlDNDF1plDnxZYQoq/3wAeTgTVu/imSl/56V4Nm5aaa9bsvBZkLq/2btmQ/NrFrEmKA0V7S3mSeR5k=;3:80OOVw8BD1amS4XvsYHaCWzgDGiz7nq59/QtNfeUATfGntZ0uVssBx2CkaYbaAed83u0q1XN7dZBSGw8VDuIBZqsRRQR2C9Wb9Ch79ZsN09lPT5L4Oq6E/YqK9nouu7FOHKjwxV8WJUvBBMvKuktUpW6imEUp/3fDiRlcjYxuLQx77OWeyz1+1H6UkXuuaLT8Z8r5RyhoZhhIrIsb6Tw9P7tRi3/pmlbpuA5Oop4JxE=;25:/dpGjg5bGmO1X7t4XDfvOpmb24/u55ctW4bqfN4jG+QpxxZJW9lz9JXogfrsUVCz65msn5IIrLZ2xcsI32/l9rwz1szHiBDXFKGsVqu5W4hOol6GIPFK61M78/SGpYuDpCuMqeAKItqNjYbUdH1u9319IeDMrnuGeGlXBJ3D/H/60Rt7PbU0qIewR6vY4GoFJKHl/qxLBnge9jto2JblaI39ltMDDmhIFmPDHk8rZczLMbY+FkaL5m7SqRV6UkMGm7ighIXkBX769ZUw4z4iqw== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB0730; X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB0730;20:4SixqiLw8q3y2uONoW8FYbunHL80EFx0Jbzmq2jd9n7unGAs/tHBlaE29cVD4ycZa4nNlVuqD+IeqWa9YW47IUsBv4S2lkLVY/R92MIEBz8+huKv4xpqCz+yizDWYm1lLkYwE0sLLJGJjMdLZEZAAXOs7uvucct6UBG+A/A9VEafcoVa554LgJsHh6I8d524QDUrilfoxEYjaYnuTeI9TKBmgxSTzngHMZntdSlC03QAnEl+jZYzryBrhVEGM9gGvpYmJWWNI09HDi6Xo9l3GM0oKGfDHN0Z+XpH85ALnA6l0AglpSjMpgg40hBjs0BnfSMA9OXXURCAgPMCP9T3p71wXj92IwTmikt8SVx7Nsk=;4:MwL6u5riEDRGASMJFMgcmhTkKXSeZ5mxZQ4kI1B7zR653w4oLrPVeMx9/CdGd8tZizI51rDrsfzopKMXVXaNnaqLWyuV7CfG1f0xVaAyu7Jpye1u9gpGUUWaI5S97QYLj4SlRJ+eexI3dFkL/LRZrjyjXtiKjktIOk3t5LOQTjDwRlcCsAaDUkTtnKDpcIyilHx8zjzyBdbrRPiboYfhhFivlRUXCZCrwqaQsgVWu1eyWp6zapptB2H9Un5/M+3CtorFJuImwtuOzbcTWK0/9lEQ/2/cXg3FfmolTCWxZS4WQKSvNcn8bsvv0GxrHAG1BPFP0wH3gbHnXllN6p1V3xBNgURq1UrmcYtiYmINs/A= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(5005006)(520078)(3002001);SRVR:CY1PR0301MB0730;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB0730; X-Forefront-PRVS: 0729050452 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR0301MB0730;23:qtZggEIJDbJTIkBdvilQ/uZybVAZ0x253omI6rj?= =?us-ascii?Q?tmuQ3LpOL6DFJA1JT2VGsoE+gTBTheGWIRi7GbJJVEZCXXL/QPhFc681dGye?= =?us-ascii?Q?DKYNkdk/j3U/Cfggq1hzvW57Y898UX6XL8g1NI5oMHYZSQyYWd9g7n40Y4QV?= =?us-ascii?Q?+Gm50qjRMUVn+RGlWuojPq3jT4hyFE/8i9Jp3ttaxo7ewT2AODChhE8vikBp?= =?us-ascii?Q?humiwZyRZ7uTqfbEFWcsrXT3DcIULrLQVQtt64OVEDjfyo4R/Zxcyo7dtSCJ?= =?us-ascii?Q?42l/ISAfh5stHOglNrQAW4dywmtXweBkO4AvaSNIGc/IunWWQepsAYEmUeX7?= =?us-ascii?Q?6Ju8jm1Qk08GvMfAU0k4RsUBonyujnRMKQUYC/C3dRRMhxbcleP4+YuJIL1l?= =?us-ascii?Q?GQ3cw7YFW0obvbS+NEm8QZIV2wKr0GFfdNDqTiARyMiT8+jQ8J0kKvEN37XW?= =?us-ascii?Q?e15ciozFJe3FI/baRpSSQLY7gZ1lCqUnxoYHrpSZ0a8b8lHDhmlbWlFRxGzD?= =?us-ascii?Q?EtYj3b9Adn2qG3PsKP2p+ow6vuWwq1z96+jxbn3j3zVOLVon+1TX1eUW5O8S?= =?us-ascii?Q?GYnN22RzcxKFyjAPqv29nBw0PTE8CZiGKSjXvkvuk8+rpGR2l+bp3qP/KN6V?= =?us-ascii?Q?NmFQ5h8qmJjqpO6peLHv1CQ4TgPauVaW14A+NCGLv8H7QKdU4Bpjf6ZXNQIK?= =?us-ascii?Q?OhQ7swmWc+7xAJ1xwac5+cnAZse2EQw5iKytsqsj6pgqNctmT6p3jCWNRwjA?= =?us-ascii?Q?zXob0s0fDA0QbtfF9Yff0bIA0ff1NnmqE0eyr9qiX2Uy2TK7G3WbSqbrnXHF?= =?us-ascii?Q?N45BcyL4sqi2IIQezIToqt4/HNgP6o8WBCfA+MRBZ1R6OLi/5gqOkl6zmQE/?= =?us-ascii?Q?87LMl+dz5FGvZUoFV5gO49SmKUiwlowXgVHjAJAnpIEVNMRsLCGvHIpm2Rjt?= =?us-ascii?Q?tSpzE/P+s9UxmWpaxr9sKsGMsdcmZygLLhJxO4YuBEL2mbMJYe6VcFUcsKzl?= =?us-ascii?Q?3nTvZ29FmsXCKF3jJ0JN1++HbcDv2W00nSwLznzlhp+6aq0T82l0wpt4hYAr?= =?us-ascii?Q?AHvpgXQzDLhIrrWIh7DSWvutXj1wPrbpFP0oyJ1s5k0WqBxgyV4De+memkQA?= =?us-ascii?Q?yp5TJcOUQBHIIjFfQSaIv/H62jS/IjaD6?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB0730;5:PoEEKb/OOFjEi9zuix79NZBszxrt/p4el8fk6Gtp2CohsTjsrnynV2hqv5GV0iS10OeJZ2jRQpbmz1hemfDCKEIjUdS4gcI7gfNwyalIemdpnGMuDn7BTnLgyhYuuPwJ3KyiT5TDBSYz4sCq4giUOA==;24:kf80gDEgbPd9RM1CGmGAMiM8byK58ZqJJ1k/UI2FZeSybXczP914LKb1fBqt8oJTZd2pGKk6yWOJIpuJ589lxRC73hInkyDB72FJq73xNJ0=;20:ysbJdRRknOmvWfhrj1LhgEH3LaNe9NlVPT25c0vx0p3RVwPpdO8790R57/ZnV8IaL0cfCE49MaCCCS7UrORB0g== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Oct 2015 20:26:43.2932 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d;Ip=[192.88.158.2];Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0301MB0730 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When the same portal is used to call mc_send_command() from two different threads or a thread and an interrupt handler, serialization is required, as the MC only supports one outstanding command per MC portal. Thus, a new command should not be sent to the MC until the last command sent has been responded by the MC. Signed-off-by: J. German Rivera --- drivers/staging/fsl-mc/bus/mc-sys.c | 25 ++++++++++++++++++++++--- drivers/staging/fsl-mc/include/mc-sys.h | 29 +++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/drivers/staging/fsl-mc/bus/mc-sys.c b/drivers/staging/fsl-mc/bus/mc-sys.c index 6eeb9fa..6e14892 100644 --- a/drivers/staging/fsl-mc/bus/mc-sys.c +++ b/drivers/staging/fsl-mc/bus/mc-sys.c @@ -88,6 +88,11 @@ int __must_check fsl_create_mc_io(struct device *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, @@ -391,11 +396,17 @@ int mc_send_command(struct fsl_mc_io *mc_io, struct mc_command *cmd) { int error; enum mc_cmd_status status; + unsigned long irq_flags = 0; if (WARN_ON(in_irq() && !(mc_io->flags & FSL_MC_IO_ATOMIC_CONTEXT_PORTAL))) return -EINVAL; + if (mc_io->flags & FSL_MC_IO_ATOMIC_CONTEXT_PORTAL) + spin_lock_irqsave(&mc_io->spinlock, irq_flags); + else + mutex_lock(&mc_io->mutex); + /* * Send command to the MC hardware: */ @@ -410,7 +421,7 @@ int mc_send_command(struct fsl_mc_io *mc_io, struct mc_command *cmd) error = mc_polling_wait_atomic(mc_io, cmd, &status); if (error < 0) - return error; + goto common_exit; if (status != MC_CMD_STATUS_OK) { pr_debug("MC command failed: portal: %#llx, obj handle: %#x, command: %#x, status: %s (%#x)\n", @@ -420,9 +431,17 @@ int mc_send_command(struct fsl_mc_io *mc_io, struct mc_command *cmd) mc_status_to_string(status), (unsigned int)status); - return mc_status_to_error(status); + error = mc_status_to_error(status); + goto common_exit; } - return 0; + error = 0; +common_exit: + if (mc_io->flags & FSL_MC_IO_ATOMIC_CONTEXT_PORTAL) + spin_unlock_irqrestore(&mc_io->spinlock, irq_flags); + else + mutex_unlock(&mc_io->mutex); + + return error; } EXPORT_SYMBOL(mc_send_command); diff --git a/drivers/staging/fsl-mc/include/mc-sys.h b/drivers/staging/fsl-mc/include/mc-sys.h index 15e19af..c5038cc 100644 --- a/drivers/staging/fsl-mc/include/mc-sys.h +++ b/drivers/staging/fsl-mc/include/mc-sys.h @@ -39,6 +39,8 @@ #include #include #include +#include +#include /** * Bit masks for a MC I/O object (struct fsl_mc_io) flags @@ -56,6 +58,20 @@ struct mc_command; * @portal_phys_addr: MC command portal physical address * @portal_virt_addr: MC command portal virtual address * @dpmcp_dev: pointer to the DPMCP device associated with the MC portal. + * + * Fields are only meaningful if the FSL_MC_IO_ATOMIC_CONTEXT_PORTAL flag is not + * set: + * @mutex: Mutex to serialize mc_send_command() calls that use the same MC + * portal, if the fsl_mc_io object was created with the + * FSL_MC_IO_ATOMIC_CONTEXT_PORTAL flag off. mc_send_command() calls for this + * fsl_mc_io object must be made only from non-atomic context. + * + * Fields are only meaningful if the FSL_MC_IO_ATOMIC_CONTEXT_PORTAL flag is + * set: + * @spinlock: Spinlock to serialize mc_send_command() calls that use the same MC + * portal, if the fsl_mc_io object was created with the + * FSL_MC_IO_ATOMIC_CONTEXT_PORTAL flag on. mc_send_command() calls for this + * fsl_mc_io object can be made from atomic or non-atomic context. */ struct fsl_mc_io { struct device *dev; @@ -64,6 +80,19 @@ struct fsl_mc_io { phys_addr_t portal_phys_addr; void __iomem *portal_virt_addr; struct fsl_mc_device *dpmcp_dev; + union { + /* + * This field is only meaningful if the + * FSL_MC_IO_ATOMIC_CONTEXT_PORTAL flag is not set + */ + struct mutex mutex; /* serializes mc_send_command() */ + + /* + * This field is only meaningful if the + * FSL_MC_IO_ATOMIC_CONTEXT_PORTAL flag is set + */ + spinlock_t spinlock; /* serializes mc_send_command() */ + }; }; int __must_check fsl_create_mc_io(struct device *dev, -- 2.3.3