linux-mtd.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: Nicolas Pitre <nicolas.pitre@linaro.org>
To: Boris Brezillon <boris.brezillon@free-electrons.com>
Cc: linux-mtd@lists.infradead.org
Subject: [PATCH 1/5] MTD: mtdram: properly handle the phys argument in the point method
Date: Tue, 10 Oct 2017 23:26:17 -0400	[thread overview]
Message-ID: <20171011032621.26979-2-nicolas.pitre@linaro.org> (raw)
In-Reply-To: <20171011032621.26979-1-nicolas.pitre@linaro.org>

When the phys pointer is non null, the point method is expected to return
the physical address for the pointed area. In the case of the mtdram
driver we have to retrieve the physical address for the corresponding
vmalloc area. However, there is no guarantee that the vmalloc area is
made of physically contiguous pages. In that case we simply limit retlen
to the actually contiguous pages.

Signed-off-by: Nicolas Pitre <nico@linaro.org>
---
 drivers/mtd/devices/mtdram.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/drivers/mtd/devices/mtdram.c b/drivers/mtd/devices/mtdram.c
index cbd8547d7a..7dbee8e62f 100644
--- a/drivers/mtd/devices/mtdram.c
+++ b/drivers/mtd/devices/mtdram.c
@@ -13,6 +13,7 @@
 #include <linux/slab.h>
 #include <linux/ioport.h>
 #include <linux/vmalloc.h>
+#include <linux/mm.h>
 #include <linux/init.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/mtdram.h>
@@ -69,6 +70,27 @@ static int ram_point(struct mtd_info *mtd, loff_t from, size_t len,
 {
 	*virt = mtd->priv + from;
 	*retlen = len;
+
+	if (phys) {
+		/* limit retlen to the number of contiguous physical pages */
+		unsigned long page_ofs = offset_in_page(*virt);
+		void *addr = *virt - page_ofs;
+		unsigned long pfn1, pfn0 = vmalloc_to_pfn(addr);
+
+		*phys = __pfn_to_phys(pfn0) + page_ofs;
+		len += page_ofs;
+		while (len > PAGE_SIZE) {
+			len -= PAGE_SIZE;
+			addr += PAGE_SIZE;
+			pfn0++;
+			pfn1 = vmalloc_to_pfn(addr);
+			if (pfn1 != pfn0) {
+				*retlen = *virt - addr;
+				break;
+			}
+		}
+	}
+
 	return 0;
 }
 
-- 
2.9.5

  reply	other threads:[~2017-10-11  3:26 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-11  3:26 [PATCH 0/5] unconfuse get_unmapped_area and point/unpoint driver methods Nicolas Pitre
2017-10-11  3:26 ` Nicolas Pitre [this message]
2017-10-11 20:47   ` [PATCH 1/5] MTD: mtdram: properly handle the phys argument in the point method Richard Weinberger
2017-10-11 21:32     ` Nicolas Pitre
2017-10-11 21:40       ` Richard Weinberger
2017-10-11 21:53         ` Nicolas Pitre
2017-10-11  3:26 ` [PATCH 2/5] MTD: chips/map_ram.c: implement point and unpoint methods Nicolas Pitre
2017-10-11 20:48   ` Richard Weinberger
2017-10-11  3:26 ` [PATCH 3/5] MTD: chips/map_rom.c: " Nicolas Pitre
2017-10-11 20:49   ` Richard Weinberger
2017-10-11 20:56     ` Nicolas Pitre
2017-10-11  3:26 ` [PATCH 4/5] MTD: implement mtd_get_unmapped_area() using the point method Nicolas Pitre
2017-10-11 20:51   ` Richard Weinberger
2017-10-11  3:26 ` [PATCH 5/5] MTD: remove the get_unmapped_area method Nicolas Pitre
2017-10-11 21:02   ` Richard Weinberger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20171011032621.26979-2-nicolas.pitre@linaro.org \
    --to=nicolas.pitre@linaro.org \
    --cc=boris.brezillon@free-electrons.com \
    --cc=linux-mtd@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).