From patchwork Tue Jun 7 08:35:35 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Boyd X-Patchwork-Id: 69479 Delivered-To: patch@linaro.org Received: by 10.140.106.246 with SMTP id e109csp1862533qgf; Tue, 7 Jun 2016 01:35:55 -0700 (PDT) X-Received: by 10.107.130.207 with SMTP id m76mr30841007ioi.137.1465288555524; Tue, 07 Jun 2016 01:35:55 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id ap9si32033883pad.30.2016.06.07.01.35.49; Tue, 07 Jun 2016 01:35:55 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754363AbcFGIfr (ORCPT + 31 others); Tue, 7 Jun 2016 04:35:47 -0400 Received: from mail-pa0-f43.google.com ([209.85.220.43]:36557 "EHLO mail-pa0-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754195AbcFGIfo (ORCPT ); Tue, 7 Jun 2016 04:35:44 -0400 Received: by mail-pa0-f43.google.com with SMTP id b5so15440591pas.3 for ; Tue, 07 Jun 2016 01:35:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=6QpFn2uQoGHtzeMFinR6scJkIhnehU3fIXaXUjzAMWY=; b=S511QMMtERGiYblgAhs0FRki8hRQMdaA+hovQWVUvtBu3uEt7xBixpmCBawwVL6Ifn MVWq2ROXKY4HPdIkiGBiTUbjUg9/ns2XRLimTPVZpx+yK4nyrzLwcPT4w9JMPVCpArgy buZvC/lAsxjT3BRC1N1sx+x2QKstq4zT6TQSQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=6QpFn2uQoGHtzeMFinR6scJkIhnehU3fIXaXUjzAMWY=; b=Fo0i+3Z8wuotS0IMOdz+IWMF2L8k2SYK947/pk99PasjZFuDsuuyijN26atWRevTCN M86dJCNm3MlUzMNdwZtQ1aNqllQ6nvNXljx9OFtfSf+4ViMctEJBS2zY7GNu9FUyDieg On6qYX8CNLRFjPdGvKuTrdQUJG5q+17CFV0Kuf/s6xooCwBMlPIdpmrAFO1JzwjbW4Hj l5Jk3BwhzeHPhNi1QxOrTBWlV/6F0a9rCFUWppWCGYVfUTzwEnCL36vO3K0pzc/ly05q gA40Wo6dDcVBAYCNNtHaq/xnlXFMji88FWReoiwQ042zqcw/8xlig10oMCIqYFnlqBbI aBDg== X-Gm-Message-State: ALyK8tKgE1nb7T9lCpQSc1PEqx4EjfLQH/j6Uicd9yuW1V3u9m2+bYgdOVBpURsWCfhQMkVI X-Received: by 10.66.164.133 with SMTP id yq5mr29667407pab.107.1465288543222; Tue, 07 Jun 2016 01:35:43 -0700 (PDT) Received: from localhost.localdomain (ip68-101-172-78.sd.sd.cox.net. [68.101.172.78]) by smtp.gmail.com with ESMTPSA id u2sm30900586pan.45.2016.06.07.01.35.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 07 Jun 2016 01:35:42 -0700 (PDT) From: Stephen Boyd To: linux-kernel@vger.kernel.org Cc: linux-arm@lists.infradead.org, Mimi Zohar , Andrew Morton , Mark Brown , Ming Lei , Vikram Mulukutla Subject: [PATCH v4 1/3] firmware: Consolidate kmap/read/write logic Date: Tue, 7 Jun 2016 01:35:35 -0700 Message-Id: <20160607083537.28484-2-stephen.boyd@linaro.org> X-Mailer: git-send-email 2.9.0-rc1 In-Reply-To: <20160607083537.28484-1-stephen.boyd@linaro.org> References: <20160607083537.28484-1-stephen.boyd@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org We use similar structured code to read and write the kmapped firmware pages. The only difference is read copies from the kmap region and write copies to it. Consolidate this into one function to reduce duplication. Cc: Vikram Mulukutla Signed-off-by: Stephen Boyd --- drivers/base/firmware_class.c | 57 ++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 31 deletions(-) -- 2.9.0-rc1 diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index 773fc3099769..01d55723d82c 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c @@ -691,6 +691,29 @@ out: static DEVICE_ATTR(loading, 0644, firmware_loading_show, firmware_loading_store); +static void firmware_rw(struct firmware_buf *buf, char *buffer, + loff_t offset, size_t count, bool read) +{ + while (count) { + void *page_data; + int page_nr = offset >> PAGE_SHIFT; + int page_ofs = offset & (PAGE_SIZE-1); + int page_cnt = min_t(size_t, PAGE_SIZE - page_ofs, count); + + page_data = kmap(buf->pages[page_nr]); + + if (read) + memcpy(buffer, page_data + page_ofs, page_cnt); + else + memcpy(page_data + page_ofs, buffer, page_cnt); + + kunmap(buf->pages[page_nr]); + buffer += page_cnt; + offset += page_cnt; + count -= page_cnt; + } +} + static ssize_t firmware_data_read(struct file *filp, struct kobject *kobj, struct bin_attribute *bin_attr, char *buffer, loff_t offset, size_t count) @@ -715,21 +738,8 @@ static ssize_t firmware_data_read(struct file *filp, struct kobject *kobj, ret_count = count; - while (count) { - void *page_data; - int page_nr = offset >> PAGE_SHIFT; - int page_ofs = offset & (PAGE_SIZE-1); - int page_cnt = min_t(size_t, PAGE_SIZE - page_ofs, count); - - page_data = kmap(buf->pages[page_nr]); - - memcpy(buffer, page_data + page_ofs, page_cnt); + firmware_rw(buf, buffer, offset, count, true); - kunmap(buf->pages[page_nr]); - buffer += page_cnt; - offset += page_cnt; - count -= page_cnt; - } out: mutex_unlock(&fw_lock); return ret_count; @@ -809,24 +819,9 @@ static ssize_t firmware_data_write(struct file *filp, struct kobject *kobj, goto out; retval = count; + firmware_rw(buf, buffer, offset, count, false); - while (count) { - void *page_data; - int page_nr = offset >> PAGE_SHIFT; - int page_ofs = offset & (PAGE_SIZE - 1); - int page_cnt = min_t(size_t, PAGE_SIZE - page_ofs, count); - - page_data = kmap(buf->pages[page_nr]); - - memcpy(page_data + page_ofs, buffer, page_cnt); - - kunmap(buf->pages[page_nr]); - buffer += page_cnt; - offset += page_cnt; - count -= page_cnt; - } - - buf->size = max_t(size_t, offset, buf->size); + buf->size = max_t(size_t, offset + count, buf->size); out: mutex_unlock(&fw_lock); return retval;