public inbox for ecos-patches@sourceware.org
 help / color / mirror / Atom feed
From: bugzilla-daemon@bugs.ecos.sourceware.org
To: ecos-patches@ecos.sourceware.org
Subject: [Bug 1001561] Internal flash driver for Freescale TWR-K60N512 board
Date: Wed, 26 Sep 2012 14:42:00 -0000	[thread overview]
Message-ID: <20120926144200.179E62F78001@mail.ecoscentric.com> (raw)
In-Reply-To: <bug-1001561-104@http.bugs.ecos.sourceware.org/>

Please do not reply to this email. Use the web interface provided at:
http://bugs.ecos.sourceware.org/show_bug.cgi?id=1001561

--- Comment #48 from Jonathan Larmour <jifl@ecoscentric.com> 2012-09-26 15:41:56 BST ---
Hi Ilija,

Thanks for that. Unfortunately I've just noticed another issue (sorry!), but
it's an important one to be resolved. There are calls to HAL_DCACHE_DISABLE().
But if the dcache is in writeback mode, you need to flush any dirty cache lines
to memory, so a call to HAL_DCACHE_SYNC() is needed.

And, as you'll probably have seen elsewhere in eCos, because of the risk of an
interrupt coming in and creating more dirty cache lines after the sync but
before the disable, you also need to disable interrupts around it. And you also
need to allow for the cache already having been disabled (otherwise you may
flush lines to memory which aren't actually valid for what's running).

So in other words, you should have something like this:

static void __attribute__((__long_call__))
cache_off( cyg_uint32 *cachestate ) {
    cyg_uint32 intstate, dcachestate, icachestate;

    HAL_DISABLE_INTERRUPTS(intstate); 
    HAL_DCACHE_IS_ENABLED(dcachestate);
    HAL_ICACHE_IS_ENABLED(icachestate);
    *cachestate = (dcachestate?1:0) | (icachestate?2:0);
    if (dcachestate) {
        HAL_DCACHE_SYNC();
        HAL_DCACHE_DISABLE();
    }
    if (icachestate) {
        HAL_ICACHE_DISABLE();
    }
    HAL_RESTORE_INTERRUPTS(intstate);
#ifdef CYGNUM_DEVS_KINETIS_FLASH_LOGIC_ERROR_BUG
    disable_flash_optimisation();
#endif
}

You might also need a HAL_DCACHE_INVALIDATE_ALL() after the sync, before the
disable, depending on whether the kinetis cache will still look at cache lines
marked as valid in the cache, even when disabled (it may seem like it shouldn't
but some cache architectures do do that!). Ditto for the icache.

Given the separate cache_on/cache_off functions, you need the extra argument to
pass around the cache state instead.

To restore, for the Kinetis you probably don't need to disable interrupts I
think because IIRC it doesn't do anything which would be a problem on
interruption, so:

static void __attribute__((__long_call__))
cache_on( cyg_uint32 *cachestate ) {
#ifdef CYGNUM_DEVS_KINETIS_FLASH_LOGIC_ERROR_BUG
    enable_flash_optimisation();
#endif
    if (*cachestate & 1)
        HAL_DCACHE_ENABLE();
    if (*cachestate & 2)
        HAL_ICACHE_ENABLE();
}

Hopefully at least I've given enough code that this is an easy change for you
to try out (since I don't have hardware :-)).

Jifl

-- 
Configure bugmail: http://bugs.ecos.sourceware.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.

  parent reply	other threads:[~2012-09-26 14:42 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-04-12 14:39 [Bug 1001561] New: " bugzilla-daemon
2012-04-12 17:43 ` [Bug 1001561] " bugzilla-daemon
2012-04-19 13:12 ` bugzilla-daemon
2012-04-19 13:13 ` bugzilla-daemon
2012-04-19 13:14 ` bugzilla-daemon
2012-04-19 13:35 ` bugzilla-daemon
2012-04-19 15:37 ` bugzilla-daemon
2012-04-22 16:34 ` bugzilla-daemon
2012-04-22 16:34 ` bugzilla-daemon
2012-05-02  7:39 ` bugzilla-daemon
2012-05-02  7:39 ` bugzilla-daemon
2012-05-02  8:27 ` bugzilla-daemon
2012-05-02 15:13 ` bugzilla-daemon
2012-05-02 15:18 ` bugzilla-daemon
2012-05-02 15:20 ` bugzilla-daemon
2012-05-02 16:02 ` bugzilla-daemon
2012-05-10 13:52 ` bugzilla-daemon
2012-05-10 14:26 ` bugzilla-daemon
2012-05-10 17:08 ` bugzilla-daemon
2012-05-15  6:22 ` bugzilla-daemon
2012-05-15  8:42 ` bugzilla-daemon
2012-05-15 12:09 ` bugzilla-daemon
2012-05-21 15:01 ` bugzilla-daemon
2012-05-29  6:53 ` bugzilla-daemon
2012-06-20  7:49 ` bugzilla-daemon
2012-06-20 14:11 ` bugzilla-daemon
2012-06-20 14:34 ` bugzilla-daemon
2012-06-21  7:01 ` bugzilla-daemon
2012-06-23 16:39 ` bugzilla-daemon
2012-06-26  9:31 ` bugzilla-daemon
2012-06-28  7:56 ` bugzilla-daemon
2012-06-28  7:57 ` bugzilla-daemon
2012-07-10  9:02 ` bugzilla-daemon
2012-07-10 13:21 ` bugzilla-daemon
2012-07-10 13:21 ` bugzilla-daemon
2012-07-10 13:25 ` bugzilla-daemon
2012-07-10 15:47 ` bugzilla-daemon
2012-07-11  5:14 ` bugzilla-daemon
2012-07-11  7:12 ` bugzilla-daemon
2012-07-11 11:42 ` bugzilla-daemon
2012-07-11 14:41 ` bugzilla-daemon
2012-07-14 16:26 ` bugzilla-daemon
2012-07-18 14:11 ` bugzilla-daemon
2012-07-18 14:11 ` bugzilla-daemon
2012-07-18 14:28 ` bugzilla-daemon
2012-07-20 11:26 ` bugzilla-daemon
2012-08-07 13:16 ` bugzilla-daemon
2012-08-07 13:19 ` bugzilla-daemon
2012-08-07 13:23 ` bugzilla-daemon
2012-09-24 14:34 ` bugzilla-daemon
2012-09-25 16:23 ` bugzilla-daemon
2012-09-25 20:17 ` bugzilla-daemon
2012-09-26 12:30 ` bugzilla-daemon
2012-09-26 12:30 ` bugzilla-daemon
2012-09-26 14:42 ` bugzilla-daemon [this message]
2012-09-26 15:49 ` bugzilla-daemon
2012-09-27  8:06 ` bugzilla-daemon
2012-09-27 18:26 ` bugzilla-daemon
2012-09-27 18:29 ` bugzilla-daemon
2012-09-27 18:39 ` bugzilla-daemon
2012-09-28 16:15 ` bugzilla-daemon
2012-09-28 19:06 ` bugzilla-daemon
2012-11-04 14:33 ` bugzilla-daemon
2012-11-04 14:34 ` bugzilla-daemon
2012-11-04 14:35 ` bugzilla-daemon
2012-11-04 14:36 ` bugzilla-daemon
2012-11-04 14:39 ` bugzilla-daemon
2013-02-11 15:01 ` bugzilla-daemon
2017-02-15  7:24 ` bugzilla-daemon

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=20120926144200.179E62F78001@mail.ecoscentric.com \
    --to=bugzilla-daemon@bugs.ecos.sourceware.org \
    --cc=ecos-patches@ecos.sourceware.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 read-only IMAP folder(s) and NNTP newsgroup(s).