From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754563AbbJNU0w (ORCPT ); Wed, 14 Oct 2015 16:26:52 -0400 Received: from mail-bn1bon0136.outbound.protection.outlook.com ([157.56.111.136]:27936 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753734AbbJNU0q (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 3/4] staging: fsl-mc:Added support for atomic portals Date: Wed, 14 Oct 2015 15:11:44 -0500 Message-ID: <1444853505-1369-4-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;BL2FFO11FD011;1:DFnYtCy65LpTIECun5Q0If1xWu2oH6siH7o+qOe9gbOX7yUhoY1BS9GLBZ7Nsjp6tMUr5YeUixVc8+KW8NrXnVmBm4eyAln6n7kyYFmUw8yjI8prs1BfajrIn2vXRqyUY22po/XJ2OkwY7niDIlubE7BYCQ1sRfnV/sWrzrP5vdXxwALSCZ1HKMj1F5oO6fmbVDlBPOzsgvbvSJ28x6INh1yTuIAbNOYHmwVvQxIyvxF4bC5D59HoCr+kLP2pFkKXvcDOPWN4AjFjAaJoQio6AGH7NxbljBCJZOEKv12eoZ4oEmn04gedPJQuW7wqdYfP0chIdd+XTUZORaldoszqF1yshER8grKFheur3MKWs8VYcA77Yug22cOI4c8lRBpnDv77hJLLsRuSSBSHIP53g== X-Forefront-Antispam-Report: CIP:192.88.158.2;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(106466001)(50986999)(46102003)(189998001)(11100500001)(76176999)(50226001)(64706001)(105606002)(47776003)(77096005)(5008740100001)(107886002)(229853001)(6806005)(5003940100001)(104016004)(5001960100002)(5007970100001)(36756003)(19580395003)(2950100001)(5001770100001)(87936001)(69596002)(85426001)(92566002)(97736004)(86362001)(19580405001)(50466002)(81156007)(48376002)(2201001)(4001430100001);DIR:OUT;SFP:1102;SCL:1;SRVR:BY2PR03MB506;H:az84smr01.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;BY2PR03MB506;2:Ay2JIOkaW6P59HmtDCG9U41UzbwZdVX0kCoebT6/5GcioOzZzkN3u4CdM53XQixiasDjlYyyNXGt7pR6OMbAnA40UhMitRS45c7OvhVSNFARhylFk9E13iSB8y/eFJawKyxlZjuBMXtiCGYTWKb+TG9grlG9IbnbaPVR2OGJ2ic=;3:tW0dAv/uHuyl/yskF+/uk/lDuNxygyGkdmJpto3nCX+Iderdj0HhazheeU3JmNX/FqGUfxGQJhWTgFiNfyxvOKyTjIQTxRWJRdpy91tgZOJ+T/YuazUpsdVf5W0iC1MSFndp+PwOZrso5WoMKKzJ5PMcDsfKUGUTQWrh8xD906MHZML+n+5AoQSOBMplE6fmyAZr66Cq/DahpCKGYpSOEof2XLFlTIFafdCX0IHZIJQ=;25:PGvcKRzFoUsKKY3uways4ifLPilJ0pLeac49KRUUTiSUSRFhZJrUKXJIXGrm75vqat6Tv/LWOMggsnKWroCqArGXClZcB4HPwJm+TBwtz/wR/ANZPjoURfSVEgbhuweBURweo8VbMkPxxDs+eZFoOQ2wPjROG3Q7BDdL+Ofh5RQzG93zhXZ82gJSZcSBXtcgE6mNVQ1Q1xmSIcTM5bJUK/EifynfWRDEQo8+IacSHbLsiaF+VOaWnB3lJpKfqiw/yShVB1PYrxgaGhTCa3Llaw== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY2PR03MB506; X-Microsoft-Exchange-Diagnostics: 1;BY2PR03MB506;20:Ue5RDdbaCPy0d4aYbtpHUgCz05TLOOUf3kNeH+Njl9N5lhZnhZADlME4bHMcKwzThLCnRh2Z7SIZ02q+QOaq94Kkqj/7PP+WBWqOHoyvB6VEiLpWEMG8pf+td6vAK0FBFdZdGzgYe1rWiZhinEdH7xLNTnrekmkeHcKc0fp9PKglJ/YfU6dGVa5L4fAcCmKyQOPq0BJQbfvIJiVT4nTsF+2Y0TFB25OfNxwqEyiHIvfdncwz7AIsrwcGkpa/OyPMTIr0IPXKJR3EnaoyR/SIifyLfAZpiSCuDukAfMP6xTKhlHYJ+rvjZtD40BOlDA6ynf9pwaUVDKcQdIrQRoQOW0RP/V4N2WaA2TX01Cspzhg=;4:lfRrztKixAHc4+7XJKqSEOoDvHpRKwz7sUUvzpW6eVBIYKkjpdI0TKZoPLrtiJtItkLa9FK4Stz21llBFQ+4WOKpKRNezLOX189MlTAeOkEQGvZrFPMQqeoc/jHTt+mmXDlDEePA2JNf+iOeCO2letuW94X8FsMW+CtUbkiZDNYgN0bCImmKQzNUa4aWutBzDPWTRY8NGmA3UfDEYUNv8Zo9l7Lwf8dE8fx5SsAu8zcHqjrK4m6G8NMGk0i1K88+pQ6C+1YDmFoyW4S3hzRc9jMOEtournWGdA7jR3Far8ui8BsmGw1SgnE82P9gr5PeGHIiVsl7yQuiebTk0aWbEtJ8qOoRc55/ICHy3IeuINE= 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:BY2PR03MB506;BCL:0;PCL:0;RULEID:;SRVR:BY2PR03MB506; X-Forefront-PRVS: 0729050452 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BY2PR03MB506;23:sUV7iPlh/xIw6Zf70swep0qkTDut75lsvRXfUjtTZa?= =?us-ascii?Q?URUEmYSKVNt12448xDPGC/gUZufbX29zA5RjnuYVrFQ7utg+kyonaDd3pQK/?= =?us-ascii?Q?6I4tiWwm6elOK99ZllkI4fS4Bevyr3hzCvG2D86gknyl4/P+WbEum8Z0NG9p?= =?us-ascii?Q?0SrrbYeSKC4U5oqpg7Li0ym44gjo4ZQ3M4RrUZqtB8UixYebVv2Nw7109YtR?= =?us-ascii?Q?lWW+nIbM4HFvho/5gT5uNn3MOta6OyCtJEF9bCT5j/YtuhnmhUOEPzNZYhhu?= =?us-ascii?Q?LT2L1sLXU630ng3Z5i2L8DCOKERVA1y6C/WLzexUQA3m3O/vS/oH2SpTChL3?= =?us-ascii?Q?FAitZxQmTo7gUq/t2Kmvw5qapZ+oq77o7J6szaN5ZO2g/3p3ulNaIgqJIzXb?= =?us-ascii?Q?d9BGS4poMD7ZQnMHpgSR8/ItrAQrfrQH8bd1AAAGpunS+FjjdYRSYjf25XAQ?= =?us-ascii?Q?L/90ok3/gHPDUQcTFiXpwVt87PI21y5ltk4BuHoYEdFd6BxG8tar0q3tLanB?= =?us-ascii?Q?e6u5gXpagBU8qrnP4trEmR4NYTylOUhFwOK5fUjiyooWA5g/rmpoWoebvC1r?= =?us-ascii?Q?AwX9ejcWT1DGDTtjL7wxx0EGkjumyE72yUlt8RL8cMGKsjqX9r18yiuNrw++?= =?us-ascii?Q?imbBBbBc77NqS5gy8jXigDVSITaE2zw1x2rWYf+MzAEnqgv5xaeiWDci+nZ7?= =?us-ascii?Q?19qQ5lfamaixBG6B/JpyNNc2hzOOJHYZanexu9wFC0elHpn5DMypoI9oI+Nk?= =?us-ascii?Q?UW0mjV8L5jpez9/RRPUoYDxFC7Ya/PIeItfAmarnyBCUJfV+TpcxXTnhyRjs?= =?us-ascii?Q?9pP/6aFLEm5WpPZ83Agf9W+vbcCgDl3MQKHTlBttL6q4AachU2V8GsF3Jsty?= =?us-ascii?Q?o2dhKet5SQV9MmDyOua5ArAjpDplXMe+Asn9NBcHxYi1td/+kAEKaSvH1DqS?= =?us-ascii?Q?v4tkbOezRKXGVVjdRURpQmMBV1LuJyToPUI8UtQJX4HNAQ4lmNEoOjDCSy/j?= =?us-ascii?Q?quaKSa2lI+d1N6FHPdeXtjqAgSMSlfieBsqMsiM0GIPCv86zCcL/VB0EVszI?= =?us-ascii?Q?SjDXxFuNcFB3ljSPA6nxoQu8bej/eIjXCgDG/HSfEXmpOLeEjTDtDZregHri?= =?us-ascii?Q?aO0daus3QH+bfYGDKoRNSk1zXgadqg?= X-Microsoft-Exchange-Diagnostics: 1;BY2PR03MB506;5:fwAQgKaRyLRhdizv7j6Bv0LaMTPj4RAHkSuDUcEVyTuYKtptJrdBz5dW3MxPp8weJcejqNMKB36NuBBcKanN+hlhRqKtKMEI0428ZHP7LhXMsKypaXV37zIXCdYhWShjXbBld4UoliXk7ZGTVxGzuw==;24:sRtW6CtJEAWOhDC54S0/O6+KKczzAKwuJBQZ1eDu/SQEN5gmcaHM8tHNbL6Qm/F6Tn17mXOcFrPdm/0LgTqOMaSLoHbBpVkzJ3ifWF7C18g=;20:fP+3sz9NZ8HjAfRZzDeeJVsqIOc5w7xUEas6yPfseBd+xMHhsqsLV8oXM2ahfZUjmN+I1Wm2nqyAilBtjJUJAQ== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Oct 2015 20:26:42.4165 (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: BY2PR03MB506 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Refactored mc_send_command() to support two flavors of polling: - preemptible (for non-atomic portals), which was already supported. It calls usleep_range() between polling iterations. - non-preemptible (for atomic portals), which is needed when mc_send_command() is called with interrupts disabled. It calls udelay() between polling iterations. Signed-off-by: J. German Rivera --- drivers/staging/fsl-mc/bus/mc-sys.c | 53 +++++++++++++++++++++++++++++++-- drivers/staging/fsl-mc/include/mc-sys.h | 5 ++++ 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/drivers/staging/fsl-mc/bus/mc-sys.c b/drivers/staging/fsl-mc/bus/mc-sys.c index c4f5bdd..6eeb9fa 100644 --- a/drivers/staging/fsl-mc/bus/mc-sys.c +++ b/drivers/staging/fsl-mc/bus/mc-sys.c @@ -339,20 +339,63 @@ static int mc_polling_wait_preemptible(struct fsl_mc_io *mc_io, } /** + * Waits for the completion of an MC command doing atomic polling. + * udelay() is called between polling iterations. + * + * @mc_io: MC I/O object to be used + * @cmd: command buffer to receive MC response + * @mc_status: MC command completion status + */ +static int mc_polling_wait_atomic(struct fsl_mc_io *mc_io, + struct mc_command *cmd, + enum mc_cmd_status *mc_status) +{ + enum mc_cmd_status status; + unsigned long timeout_usecs = MC_CMD_COMPLETION_TIMEOUT_MS * 1000; + + BUILD_BUG_ON((MC_CMD_COMPLETION_TIMEOUT_MS * 1000) % + MC_CMD_COMPLETION_POLLING_MAX_SLEEP_USECS != 0); + + for (;;) { + status = mc_read_response(mc_io->portal_virt_addr, cmd); + if (status != MC_CMD_STATUS_READY) + break; + + udelay(MC_CMD_COMPLETION_POLLING_MAX_SLEEP_USECS); + timeout_usecs -= MC_CMD_COMPLETION_POLLING_MAX_SLEEP_USECS; + if (timeout_usecs == 0) { + pr_debug("MC command timed out (portal: %#llx, obj handle: %#x, command: %#x)\n", + mc_io->portal_phys_addr, + (unsigned int) + MC_CMD_HDR_READ_TOKEN(cmd->header), + (unsigned int) + MC_CMD_HDR_READ_CMDID(cmd->header)); + + return -ETIMEDOUT; + } + } + + *mc_status = status; + return 0; +} + +/** * Sends a command to the MC device using the given MC I/O object * * @mc_io: MC I/O object to be used * @cmd: command to be sent * * Returns '0' on Success; Error code otherwise. - * - * NOTE: This function cannot be invoked from from atomic contexts. */ int mc_send_command(struct fsl_mc_io *mc_io, struct mc_command *cmd) { int error; enum mc_cmd_status status; + if (WARN_ON(in_irq() && + !(mc_io->flags & FSL_MC_IO_ATOMIC_CONTEXT_PORTAL))) + return -EINVAL; + /* * Send command to the MC hardware: */ @@ -361,7 +404,11 @@ int mc_send_command(struct fsl_mc_io *mc_io, struct mc_command *cmd) /* * Wait for response from the MC hardware: */ - error = mc_polling_wait_preemptible(mc_io, cmd, &status); + if (!(mc_io->flags & FSL_MC_IO_ATOMIC_CONTEXT_PORTAL)) + error = mc_polling_wait_preemptible(mc_io, cmd, &status); + else + error = mc_polling_wait_atomic(mc_io, cmd, &status); + if (error < 0) return error; diff --git a/drivers/staging/fsl-mc/include/mc-sys.h b/drivers/staging/fsl-mc/include/mc-sys.h index 7d44d8c..15e19af 100644 --- a/drivers/staging/fsl-mc/include/mc-sys.h +++ b/drivers/staging/fsl-mc/include/mc-sys.h @@ -40,6 +40,11 @@ #include #include +/** + * Bit masks for a MC I/O object (struct fsl_mc_io) flags + */ +#define FSL_MC_IO_ATOMIC_CONTEXT_PORTAL 0x0001 + struct fsl_mc_resource; struct mc_command; -- 2.3.3