2014-02-04 02:17:09 +04:00
/*
* High memory support for Xtensa architecture
*
* This file is subject to the terms and conditions of the GNU General
* Public License . See the file " COPYING " in the main directory of
* this archive for more details .
*
* Copyright ( C ) 2014 Cadence Design Systems Inc .
*/
# include <linux/export.h>
# include <linux/highmem.h>
# include <asm/tlbflush.h>
2014-07-17 05:04:49 +04:00
# if DCACHE_WAY_SIZE > PAGE_SIZE
unsigned int last_pkmap_nr_arr [ DCACHE_N_COLORS ] ;
wait_queue_head_t pkmap_map_wait_arr [ DCACHE_N_COLORS ] ;
static void __init kmap_waitqueues_init ( void )
{
unsigned int i ;
for ( i = 0 ; i < ARRAY_SIZE ( pkmap_map_wait_arr ) ; + + i )
init_waitqueue_head ( pkmap_map_wait_arr + i ) ;
}
2014-07-15 02:51:49 +04:00
static inline enum fixed_addresses kmap_idx ( int type , unsigned long color )
{
2020-11-16 22:32:53 +03:00
int idx = ( type + KM_MAX_IDX * smp_processor_id ( ) ) * DCACHE_N_COLORS ;
/*
* The fixmap operates top down , so the color offset needs to be
* reverse as well .
*/
return idx + DCACHE_N_COLORS - 1 - color ;
2014-07-15 02:51:49 +04:00
}
2020-11-03 12:27:29 +03:00
enum fixed_addresses kmap_local_map_idx ( int type , unsigned long pfn )
2014-02-04 02:17:09 +04:00
{
2020-11-03 12:27:29 +03:00
return kmap_idx ( type , DCACHE_ALIAS ( pfn < < PAGE_SHIFT ) ) ;
2014-02-04 02:17:09 +04:00
}
2020-11-03 12:27:29 +03:00
enum fixed_addresses kmap_local_unmap_idx ( int type , unsigned long addr )
2014-02-04 02:17:09 +04:00
{
2020-11-03 12:27:29 +03:00
return kmap_idx ( type , DCACHE_ALIAS ( addr ) ) ;
2014-02-04 02:17:09 +04:00
}
2020-11-16 22:32:53 +03:00
# else
static inline void kmap_waitqueues_init ( void ) { }
# endif
2014-02-04 02:17:09 +04:00
void __init kmap_init ( void )
{
2020-06-05 02:47:26 +03:00
/* Check if this memory layout is broken because PKMAP overlaps
* page table .
*/
BUILD_BUG_ON ( PKMAP_BASE < TLBTEMP_BASE_1 + TLBTEMP_SIZE ) ;
2014-07-17 05:04:49 +04:00
kmap_waitqueues_init ( ) ;
2014-02-04 02:17:09 +04:00
}