From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752088AbbJQUse (ORCPT ); Sat, 17 Oct 2015 16:48:34 -0400 Received: from mail-bn1bon0141.outbound.protection.outlook.com ([157.56.111.141]:10336 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751923AbbJQUsa (ORCPT ); Sat, 17 Oct 2015 16:48:30 -0400 Authentication-Results: spf=fail (sender IP is 192.88.168.50) 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 v2 4/4] staging: fsl-mc: Added serialization to mc_send_command() Date: Sat, 17 Oct 2015 15:33:15 -0500 Message-ID: <1445113995-12021-5-git-send-email-German.Rivera@freescale.com> X-Mailer: git-send-email 2.3.3 In-Reply-To: <1445113995-12021-1-git-send-email-German.Rivera@freescale.com> References: <1445113995-12021-1-git-send-email-German.Rivera@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11OLC003;1:+rj1OJ2q7QEbp6WJkbblSdAOrMtka5ShR4HVo1ui6LPvvYq26dORDdPT7eFThCab1laYuHt3RS7umrPV2eJd8g6zz43IvBfuZIJDKQba2nsx2/EIJDK7IN6nfsJN3efjP3TTGQV8BEWxFF7MPf9DD0vzKz+8nDxZ/b9egi2C2ozCYhLxHMLUzO0txNoxx/dKeTJdK4guIPJo+HHe3MbsWsGAJ1wIR+NSmaSwAzeDKN2a/HFutPWyA1NL6QybnHhB78xd32sLgig0mXLjMAQLpjlwhVtBnVuVyOJveFJSa0Biekj600gJiSr2G4IkuXlKhSs/uRdAcQsZxZZGjBpXLrluX3JIc9pLvRqWfRFsLuwqJN8vMpkzb33K0x7LEbbp7/73LewAr+FA01j4/Tyh7g== X-Forefront-Antispam-Report: CIP:192.88.168.50;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(107886002)(50226001)(48376002)(19580395003)(64706001)(11100500001)(97736004)(77096005)(76176999)(5001770100001)(36756003)(5001960100002)(47776003)(189998001)(105606002)(5007970100001)(5003940100001)(5008740100001)(104016004)(50986999)(85426001)(106466001)(19580405001)(6806005)(87936001)(50466002)(81156007)(229853001)(2201001)(46102003)(92566002)(2950100001)(86362001)(4001430100001);DIR:OUT;SFP:1102;SCL:1;SRVR:CY1PR0301MB1306;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1306;2:QcA7Nqlj2LEi7Hvf+yN/E2yb7qHDdlA9ZN3H04WKDcZah4nCekFqtROTIx0JUyhB37DPex6eXY70Mj+4GAu0xlSvj2UI23bAoyP//KG++QYPjDC/l/85jcOe4JUxtgoHLlHu/ljV1JFaKbxdH7HzQHM5rO1lDmMZsyTTeD26euQ=;3:lMhapk77E79Jdg+8dlu2dVqZ011Fz2W9qijpqk8tjCVw/1BiMOvFvWOJCIq7PQsFA0guf3taPPL/deuXe0KkD8pZ7MnFll09SI6c0hJ0cN5bcVrkRA8t2iiw3FTyjk5ZHQ0XFIC+004Tfkqkwnb2ImiBzJmcQTKn4/8ubuvf5GlPWqig6uNEdJwNmT1pP7sdML52dAvKzSKuFh8nqMn3n6+0uoaVsV3aXEOPmO9W+wY=;25:0bC/3ZtjHDiSpFK73Q5Cl4W9s1/TryRfK+MOZcWBhjdwsp8M/Zx/7AA89CbZY0Fy4j84dKjez1xWFgIohP6rGTUEMd5GpQGhPTZ19EEGhOYQAiJWuJuSFXZO7i9kUUL0yHNn2sC33DEPL8RmBVSGGeiX5QNa4MCu90g3ARtvpZZfjdb1wpgfRLXGKOzbI+3bk/UbNMbrzw/g5cfNQGIKBDnIJfkgRWnArNY7czgvlX4MvCpA+iv9kqjkN6OwwBiN/EhDB/eezo6RHHU3+uFxAQ== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1306; X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1306;20:mx31mZw5Vk5KnjjuyQDFldRe3f6qxXqqTTjxuM9UysxzaUkQ5DrDAJQxyd6437sK8CLtAGUCVB/bDYWzzikofRps8yLN3lmKrrm9oUOaSCgz2vbY7V7/8OjWOEJX3OGjiGIlRhQlwJeupMdD1pWSY+XiFJu0G3q2JESw7/RUCInBucuWjvLSMt27aRBGrKPXnReG6muoHQHVXqIwvOcbjMEGSx/p8bVX7JZoYU4vHcCaVOKDmLuajfCaFc/V0cc1fkXhJKkrSTj6NUphmIlBugYPz0pgRWnrSBxh1jwN9Q8VyHdTrTAiF80B2EYSjVuLSWo/jDwjUWCluIbKsj+RUf5EXI061BwF5KQm8guDe7o=;4:CiRY67CDGHFZsV4pGmsGQUE9FYT78tDHbfiKHkST9JYA5lUWH5BbfHNJTzJpH2Yl6dvmnSc2WGHIK3Ogae7lQTC8rkAgry9hnwB8JXCAEdcwH6w7wxqYtlsjafi2KuEAe/AMw0ycpKLfvehSKm9TOTqD6DdIGCIo12llDfwnBJ2e4zcxIKVhX94CLpZyWlfEIkH/NFSK1bLkXBz4ze3gUUDeS6pcTmdZp+fQDJrY12/w0YAV7xxw0OsQ5EyWySLXC9iUjjIr3hhLRbh/mZvehazs2jT6tDDvGSkaK4lhbMvS3jFj3HZRpxKAWRrOJTZRLrhNqVZlBt2qHw1KIWqsVuZuQPLbMTNNcwX4pLrlebo= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(520078)(5005006)(8121501046)(3002001);SRVR:CY1PR0301MB1306;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1306; X-Forefront-PRVS: 07326CFBC4 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR0301MB1306;23:W830/rhqcASM20KJRsO0bMKLG8Znnrn+yY5eEVg?= =?us-ascii?Q?c9h9HDsH9eSSB6gr8hmw0HlypNQgzFwU+vbvf+uZqRMyo+FyypON1OmYtOFZ?= =?us-ascii?Q?0IgIv3tW/zQiposZpJDQJkrVPNUHV7aqVNXG2kOejO6+E8nOB6tdZ77ZIt9k?= =?us-ascii?Q?i9Dt24BgYjp9uz326F3Lt2qhHiUr92GPC/8mYNEELX+9YdONSIz+s/hKzqjG?= =?us-ascii?Q?SSUJjcKHuM+gY3cKNcGUWKaio3SRyHHosICgx7w9N3XIeITIOJTBkpoypBYj?= =?us-ascii?Q?u8O3VZdkz5HUjWU0vMMxBq+0MCEFNsBFlk0k3pnf36cHfAfNMUClaAkJsyUj?= =?us-ascii?Q?C435bTBXvkcy0aMAm9652KddkomFHotZTyxu7mdLWdW5rn46/uMTJxtrFQnC?= =?us-ascii?Q?lH1vrVcd9nfmFYgdkBTkRoINa+Ath8r6TOaHiEX0QPRjh0Gr9sbWbOV72/4g?= =?us-ascii?Q?hjOS02VcWwojQ4DgZ67BKAcFkGloHD/J/PqQE9U7zjzFmqAommqZ3y8D5tDb?= =?us-ascii?Q?LVq98pg+3g9xmJcjRCCOZubbfpVWa7h9P9sOqKH03JfhvFrTNkyc0Dp8v8LC?= =?us-ascii?Q?3iRc6j2dVpYck8JR5iSScGYPuEgPcfGxjJfyNDZtDdLJ3jbG5bGQRIUHzsqh?= =?us-ascii?Q?sfcd2Y5MTXDLGNkgoaJAbRj9pEN0E+sopLtRyXGRpSSqnfpMfuM/dblVUq3f?= =?us-ascii?Q?eJMrIY5GWRCa0w4k17GVUXrZE3ejfNhS3/hxFUcVVahxRX9nIvOihefxr1CW?= =?us-ascii?Q?5+hmcS4zBFXjteUs5Fsip6GcYn3eUI7en3FfECeKQbMU7j3r2Z22N7PcEzcr?= =?us-ascii?Q?uxFRIE+phubTd/cw+mPzOfeIj+elJqMs4wO6LAUu+GruP+lhHPiGGzhFpR7r?= =?us-ascii?Q?oQSGup7yGGkbZf2xTg+xK/++ddrNSBlbRvvXbAxRsJO2Ke+uCZri1GRyJBHR?= =?us-ascii?Q?Nz20mOyIuzlbfknSCGGXB+u/RZKxV6nbZ9nFEhzaBRSluTHn/rM9Y4dlX81y?= =?us-ascii?Q?rWUqNw62B/E5NyOvSIQYBIUyUoG4RwNymnZ71Hrhg//KcqkMb8TM3QichVn1?= =?us-ascii?Q?zsIO/OeLQ056yxl6+HxTCHmNOUuWSLXUt57+pu3QvCskzr5OAL3FmF/ownoN?= =?us-ascii?Q?NaDdVjIXvW+E=3D?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB1306;5:ElShzXzE29m74YcCGKpRRHJ1tYeh3AE6STPh95+bi5rwvUgrD7kmRYGIEFasLUsYslo5j/4HZbhhpmlLiqfa5MeULWOyHpzj7H+kFjgolzPNDVCubRTIsEr59bns2nFHB2z0shACXPyaLciQ/iCwlg==;24:9uACOyvMVOqmtF879bmNC7CzNyGSBSp8VgTKC54BPsoAYLtLrLKFgH04WFi7t8BPgUeXXTTF/vBSyOsTU80zJumZhnk8fK+Qakm/kJqiuAw=;20:a1ewU3rHLsxvKb9GQ6mudVbMQWzhpVwrDNVc8aVI1HcNUt80sWj9ASVOyghcSNEJTthX4WWxOBoOApRengAQgw== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Oct 2015 20:48:21.1288 (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.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0301MB1306 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 --- Changes in v2: - Added missing Signed-off-by entry 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