/*
* ( C ) Copyright 2002
* Rich Ireland , Enterasys Networks , rireland @ enterasys . com .
*
* See file CREDITS for list of people who contributed to this
* project .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation ; either version 2 of
* the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston ,
* MA 02111 - 1307 USA
*
*/
# include <common.h>
# include <asm/processor.h>
# include <asm/mmu.h>
# include <asm/io.h>
# ifdef CONFIG_ADDR_MAP
# include <addr_map.h>
# endif
DECLARE_GLOBAL_DATA_PTR ;
int write_bat ( ppc_bat_t bat , unsigned long upper , unsigned long lower )
{
int batn = - 1 ;
sync ( ) ;
switch ( bat ) {
case DBAT0 :
mtspr ( DBAT0L , lower ) ;
mtspr ( DBAT0U , upper ) ;
batn = 0 ;
break ;
case IBAT0 :
mtspr ( IBAT0L , lower ) ;
mtspr ( IBAT0U , upper ) ;
break ;
case DBAT1 :
mtspr ( DBAT1L , lower ) ;
mtspr ( DBAT1U , upper ) ;
batn = 1 ;
break ;
case IBAT1 :
mtspr ( IBAT1L , lower ) ;
mtspr ( IBAT1U , upper ) ;
break ;
case DBAT2 :
mtspr ( DBAT2L , lower ) ;
mtspr ( DBAT2U , upper ) ;
batn = 2 ;
break ;
case IBAT2 :
mtspr ( IBAT2L , lower ) ;
mtspr ( IBAT2U , upper ) ;
break ;
case DBAT3 :
mtspr ( DBAT3L , lower ) ;
mtspr ( DBAT3U , upper ) ;
batn = 3 ;
break ;
case IBAT3 :
mtspr ( IBAT3L , lower ) ;
mtspr ( IBAT3U , upper ) ;
break ;
# ifdef CONFIG_HIGH_BATS
case DBAT4 :
mtspr ( DBAT4L , lower ) ;
mtspr ( DBAT4U , upper ) ;
batn = 4 ;
break ;
case IBAT4 :
mtspr ( IBAT4L , lower ) ;
mtspr ( IBAT4U , upper ) ;
break ;
case DBAT5 :
mtspr ( DBAT5L , lower ) ;
mtspr ( DBAT5U , upper ) ;
batn = 5 ;
break ;
case IBAT5 :
mtspr ( IBAT5L , lower ) ;
mtspr ( IBAT5U , upper ) ;
break ;
case DBAT6 :
mtspr ( DBAT6L , lower ) ;
mtspr ( DBAT6U , upper ) ;
batn = 6 ;
break ;
case IBAT6 :
mtspr ( IBAT6L , lower ) ;
mtspr ( IBAT6U , upper ) ;
break ;
case DBAT7 :
mtspr ( DBAT7L , lower ) ;
mtspr ( DBAT7U , upper ) ;
batn = 7 ;
break ;
case IBAT7 :
mtspr ( IBAT7L , lower ) ;
mtspr ( IBAT7U , upper ) ;
break ;
# endif
default :
return ( - 1 ) ;
}
# ifdef CONFIG_ADDR_MAP
if ( ( gd - > flags & GD_FLG_RELOC ) & & ( batn > = 0 ) ) {
phys_size_t size ;
if ( ! BATU_VALID ( upper ) )
size = 0 ;
else
size = BATU_SIZE ( upper ) ;
addrmap_set_entry ( BATU_VADDR ( upper ) , BATL_PADDR ( lower ) ,
size , batn ) ;
}
# endif
sync ( ) ;
isync ( ) ;
return ( 0 ) ;
}
int read_bat ( ppc_bat_t bat , unsigned long * upper , unsigned long * lower )
{
unsigned long register u ;
unsigned long register l ;
switch ( bat ) {
case DBAT0 :
l = mfspr ( DBAT0L ) ;
u = mfspr ( DBAT0U ) ;
break ;
case IBAT0 :
l = mfspr ( IBAT0L ) ;
u = mfspr ( IBAT0U ) ;
break ;
case DBAT1 :
l = mfspr ( DBAT1L ) ;
u = mfspr ( DBAT1U ) ;
break ;
case IBAT1 :
l = mfspr ( IBAT1L ) ;
u = mfspr ( IBAT1U ) ;
break ;
case DBAT2 :
l = mfspr ( DBAT2L ) ;
u = mfspr ( DBAT2U ) ;
break ;
case IBAT2 :
l = mfspr ( IBAT2L ) ;
u = mfspr ( IBAT2U ) ;
break ;
case DBAT3 :
l = mfspr ( DBAT3L ) ;
u = mfspr ( DBAT3U ) ;
break ;
case IBAT3 :
l = mfspr ( IBAT3L ) ;
u = mfspr ( IBAT3U ) ;
break ;
# ifdef CONFIG_HIGH_BATS
case DBAT4 :
l = mfspr ( DBAT4L ) ;
u = mfspr ( DBAT4U ) ;
break ;
case IBAT4 :
l = mfspr ( IBAT4L ) ;
u = mfspr ( IBAT4U ) ;
break ;
case DBAT5 :
l = mfspr ( DBAT5L ) ;
u = mfspr ( DBAT5U ) ;
break ;
case IBAT5 :
l = mfspr ( IBAT5L ) ;
u = mfspr ( IBAT5U ) ;
break ;
case DBAT6 :
l = mfspr ( DBAT6L ) ;
u = mfspr ( DBAT6U ) ;
break ;
case IBAT6 :
l = mfspr ( IBAT6L ) ;
u = mfspr ( IBAT6U ) ;
break ;
case DBAT7 :
l = mfspr ( DBAT7L ) ;
u = mfspr ( DBAT7U ) ;
break ;
case IBAT7 :
l = mfspr ( IBAT7L ) ;
u = mfspr ( IBAT7U ) ;
break ;
# endif
default :
return ( - 1 ) ;
}
* upper = u ;
* lower = l ;
return ( 0 ) ;
}
void print_bats ( void )
{
printf ( " BAT registers: \n " ) ;
printf ( " \t IBAT0L = 0x%08X " , mfspr ( IBAT0L ) ) ;
printf ( " \t IBAT0U = 0x%08X \n " , mfspr ( IBAT0U ) ) ;
printf ( " \t DBAT0L = 0x%08X " , mfspr ( DBAT0L ) ) ;
printf ( " \t DBAT0U = 0x%08X \n " , mfspr ( DBAT0U ) ) ;
printf ( " \t IBAT1L = 0x%08X " , mfspr ( IBAT1L ) ) ;
printf ( " \t IBAT1U = 0x%08X \n " , mfspr ( IBAT1U ) ) ;
printf ( " \t DBAT1L = 0x%08X " , mfspr ( DBAT1L ) ) ;
printf ( " \t DBAT1U = 0x%08X \n " , mfspr ( DBAT1U ) ) ;
printf ( " \t IBAT2L = 0x%08X " , mfspr ( IBAT2L ) ) ;
printf ( " \t IBAT2U = 0x%08X \n " , mfspr ( IBAT2U ) ) ;
printf ( " \t DBAT2L = 0x%08X " , mfspr ( DBAT2L ) ) ;
printf ( " \t DBAT2U = 0x%08X \n " , mfspr ( DBAT2U ) ) ;
printf ( " \t IBAT3L = 0x%08X " , mfspr ( IBAT3L ) ) ;
printf ( " \t IBAT3U = 0x%08X \n " , mfspr ( IBAT3U ) ) ;
printf ( " \t DBAT3L = 0x%08X " , mfspr ( DBAT3L ) ) ;
printf ( " \t DBAT3U = 0x%08X \n " , mfspr ( DBAT3U ) ) ;
# ifdef CONFIG_HIGH_BATS
printf ( " \t IBAT4L = 0x%08X " , mfspr ( IBAT4L ) ) ;
printf ( " \t IBAT4U = 0x%08X \n " , mfspr ( IBAT4U ) ) ;
printf ( " \t DBAT4L = 0x%08X " , mfspr ( DBAT4L ) ) ;
printf ( " \t DBAT4U = 0x%08X \n " , mfspr ( DBAT4U ) ) ;
printf ( " \t IBAT5L = 0x%08X " , mfspr ( IBAT5L ) ) ;
printf ( " \t IBAT5U = 0x%08X \n " , mfspr ( IBAT5U ) ) ;
printf ( " \t DBAT5L = 0x%08X " , mfspr ( DBAT5L ) ) ;
printf ( " \t DBAT5U = 0x%08X \n " , mfspr ( DBAT5U ) ) ;
printf ( " \t IBAT6L = 0x%08X " , mfspr ( IBAT6L ) ) ;
printf ( " \t IBAT6U = 0x%08X \n " , mfspr ( IBAT6U ) ) ;
printf ( " \t DBAT6L = 0x%08X " , mfspr ( DBAT6L ) ) ;
printf ( " \t DBAT6U = 0x%08X \n " , mfspr ( DBAT6U ) ) ;
printf ( " \t IBAT7L = 0x%08X " , mfspr ( IBAT7L ) ) ;
printf ( " \t IBAT7U = 0x%08X \n " , mfspr ( IBAT7U ) ) ;
printf ( " \t DBAT7L = 0x%08X " , mfspr ( DBAT7L ) ) ;
printf ( " \t DBAT7U = 0x%08X \n " , mfspr ( DBAT7U ) ) ;
# endif
}