summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/powerpc/mpc6xx/mmu/bat.c
blob: 9b5805cfdcc8195924d44a5a1502690a5d70aa1d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
 * bat.c
 *
 *	    This file contains the implementation of C function to
 *          Instanciate 60x/7xx ppc Block Address Translation (BAT) registers.
 *	    More detailled information can be found on motorola
 *	    site and more precisely in the following book :
 *
 *		MPC750 
 *		Risc Microporcessor User's Manual
 *		Mtorola REF : MPC750UM/AD 8/97
 *
 * Copyright (C) 1999  Eric Valette (valette@crf.canon.fr)
 *                     Canon Centre Recherche France.
 *
 *  The license and distribution terms for this file may be
 *  found in found in the file LICENSE in this distribution or at
 *  http://www.OARcorp.com/rtems/license.html.
 *
 * $Id$
 */

#include <libcpu/bat.h>

typedef union {			/* BAT register values to be loaded */
	BAT		bat;
	unsigned int	word[2];
}ubat;

typedef struct batrange {		/* stores address ranges mapped by BATs */
	unsigned long start;
	unsigned long limit;
	unsigned long phys;
}batrange;

batrange bat_addrs[4];

void setdbat(int bat_index, unsigned long virt, unsigned long phys,
       unsigned int size, int flags)
{
  unsigned int bl;
  int wimgxpp;
  ubat bat;

  bl = (size >> 17) - 1;
  /* 603, 604, etc. */
  wimgxpp = flags & (_PAGE_WRITETHRU | _PAGE_NO_CACHE
		     | _PAGE_COHERENT | _PAGE_GUARDED);
  wimgxpp |= (flags & _PAGE_RW)? BPP_RW: BPP_RX;
  bat.word[0] = virt | (bl << 2) | 2; /* Vs=1, Vp=0 */
  bat.word[1] = phys | wimgxpp;
  if (flags & _PAGE_USER)
    bat.bat.batu.vp = 1;
  bat_addrs[bat_index].start = virt;
  bat_addrs[bat_index].limit = virt + ((bl + 1) << 17) - 1;
  bat_addrs[bat_index].phys = phys;
  switch (bat_index) {
  case 0 : asm_setdbat0(bat.word[0], bat.word[1]); break;
  case 1 : asm_setdbat1(bat.word[0], bat.word[1]); break;
  case 2 : asm_setdbat2(bat.word[0], bat.word[1]); break;
  case 3 : asm_setdbat3(bat.word[0], bat.word[1]); break;
  default: printk("bat.c : invalid BAT bat_index\n");
  }
}