public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Miguel Ojeda Sandonis <maxextreme@gmail.com>
To: davem@davemloft.net
Cc: akpm@osdl.org, linux-kernel@vger.kernel.org
Subject: [PATCH 1/1 dcache] drivers: add LCD support
Date: Wed, 8 Nov 2006 20:49:08 +0100	[thread overview]
Message-ID: <20061108204908.8def2283.maxextreme@gmail.com> (raw)

David, as akpm suggested, may this patch will solve the dcache aliasing problem?

I will give you a introduction:

The user mmaped page (got by __get_free_page()) is cfag12864b_buffer.

The kernel only access it for reading at the same function 1 or 2 times:

  1º memcmp() it against the cache, so we can tell if we must update the screen
  2º if true, memcpy() the buffer to the cache buffer

So, if we want the kernel to know the last state of the data, we should call
flush_dcache_page() just once before we access it, right?

The relevant code:

	flush_dcache_page(virt_to_page(cfag12864b_buffer));
	if (memcmp(cfag12864b_cache, cfag12864b_buffer, CFAG12864B_SIZE)) {
		memcpy(cfag12864b_cache, cfag12864b_buffer, CFAG12864B_SIZE);

		/***... update using cfag12864b_cache ...***/
	}

You know, I can't test this stuff ;) so please review and check if it is right.

Thanks you.
---

 - remove the "depends on x86" as it is portable again

 - memcpy() buffer to cache, then update from cache, not buffer,
   This way we only read the mmapped buffer 2 times.

 - add a flush_dcache_page() to flush the user mmaped page so
   the kernel has the last written data before accessing it.

 drivers/auxdisplay/Kconfig      |    1 -
 drivers/auxdisplay/cfag12864b.c |    9 +++++----
 2 files changed, 5 insertions(+), 5 deletions(-)

drivers-add-lcd-support-dcache.patch
Signed-off-by: Miguel Ojeda Sandonis <maxextreme@gmail.com>
---
diff --git a/drivers/auxdisplay/Kconfig b/drivers/auxdisplay/Kconfig
index 8d41f72..ee30c48 100644
--- a/drivers/auxdisplay/Kconfig
+++ b/drivers/auxdisplay/Kconfig
@@ -64,7 +64,6 @@ config KS0108_DELAY
 
 config CFAG12864B
 	tristate "CFAG12864B LCD"
-	depends on X86
 	depends on KS0108
 	default n
 	---help---
diff --git a/drivers/auxdisplay/cfag12864b.c b/drivers/auxdisplay/cfag12864b.c
index 7b3c9ab..a654d54 100644
--- a/drivers/auxdisplay/cfag12864b.c
+++ b/drivers/auxdisplay/cfag12864b.c
@@ -37,7 +37,7 @@
 #include <linux/workqueue.h>
 #include <linux/ks0108.h>
 #include <linux/cfag12864b.h>
-
+#include <asm/cacheflush.h>
 
 #define CFAG12864B_NAME "cfag12864b"
 
@@ -272,7 +272,10 @@ static void cfag12864b_update(void *arg)
 	unsigned char c;
 	unsigned short i, j, k, b;
 
+	flush_dcache_page(virt_to_page(cfag12864b_buffer));
 	if (memcmp(cfag12864b_cache, cfag12864b_buffer, CFAG12864B_SIZE)) {
+		memcpy(cfag12864b_cache, cfag12864b_buffer, CFAG12864B_SIZE);
+
 		for (i = 0; i < CFAG12864B_CONTROLLERS; i++) {
 			cfag12864b_controller(i);
 			cfag12864b_nop();
@@ -283,7 +286,7 @@ static void cfag12864b_update(void *arg)
 				cfag12864b_nop();
 				for (k = 0; k < CFAG12864B_ADDRESSES; k++) {
 					for (c = 0, b = 0; b < 8; b++)
-						if (cfag12864b_buffer
+						if (cfag12864b_cache
 							[i * CFAG12864B_ADDRESSES / 8
 							+ k / 8 + (j * 8 + b) *
 							CFAG12864B_WIDTH / 8]
@@ -293,8 +296,6 @@ static void cfag12864b_update(void *arg)
 				}
 			}
 		}
-
-		memcpy(cfag12864b_cache, cfag12864b_buffer, CFAG12864B_SIZE);
 	}
 
 	if (cfag12864b_updating)

             reply	other threads:[~2006-11-08 19:49 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-11-08 19:49 Miguel Ojeda Sandonis [this message]
2006-11-11 10:03 ` [PATCH davem] drivers: add LCD support Miguel Ojeda
2006-12-18 17:38   ` Randy Dunlap
2006-12-18 20:24     ` Miguel Ojeda

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=20061108204908.8def2283.maxextreme@gmail.com \
    --to=maxextreme@gmail.com \
    --cc=akpm@osdl.org \
    --cc=davem@davemloft.net \
    --cc=linux-kernel@vger.kernel.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