/*
 * File:         Documentation/blackfin/cache-lock.txt
 * Based on:
 * Author:
 *
 * Created:
 * Description:  This file contains the simple DMA Implementation for Blackfin
 *
 * Rev:          $Id: cache-lock.txt 2384 2006-11-01 04:12:43Z magicyang $
 *
 * Modified:
 *               Copyright 2004-2006 Analog Devices Inc.
 *
 * Bugs:         Enter bugs at http://blackfin.uclinux.org/
 *
 */

How to lock your code in cache in uClinux/blackfin
--------------------------------------------------

There are only a few steps required to lock your code into the cache.
Currently you can lock the code by Way.

Below are the interface provided for locking the cache.


1. cache_grab_lock(int Ways);

This function grab the lock for locking your code into the cache specified
by Ways.


2. cache_lock(int Ways);

This function should be called after your critical code has been executed.
Once the critical code exits, the code is now loaded into the cache. This
function locks the code into the cache.


So, the example sequence will be:

	cache_grab_lock(WAY0_L);	/* Grab the lock */

	critical_code();		/* Execute the code of interest */

	cache_lock(WAY0_L);		/* Lock the cache */

Where WAY0_L signifies WAY0 locking.
