/*
 *	<ofmem_sparc64.h>
 *
 *	OF Memory manager
 *
 *   Copyright (C) 1999, 2002 Samuel Rydh (samuel@ibrium.se)
 *
 *   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
 *
 */

#ifndef _H_OFMEM_SPARC64
#define _H_OFMEM_SPARC64

#include "libopenbios/ofmem.h"

#define OFMEM_VIRT_TOP 0xff000000

#define PAGE_SIZE_4M   (4 * 1024 * 1024)
#define PAGE_SIZE_512K (512 * 1024)
#define PAGE_SIZE_64K  (64 * 1024)
#define PAGE_SIZE_8K   (8 * 1024)
#define PAGE_MASK_4M   (4 * 1024 * 1024 - 1)
#define PAGE_MASK_512K (512 * 1024 - 1)
#define PAGE_MASK_64K  (64 * 1024 - 1)
#define PAGE_MASK_8K   (8 * 1024 - 1)

extern ucell *va2ttedata;
extern unsigned long find_tte(unsigned long va);

void itlb_load2(unsigned long vaddr, unsigned long tte_data);
void itlb_load3(unsigned long vaddr, unsigned long tte_data, unsigned long tte_index);
unsigned long itlb_faultva(void);
void itlb_demap(unsigned long vaddr);
void dtlb_load2(unsigned long vaddr, unsigned long tte_data);
void dtlb_load3(unsigned long vaddr, unsigned long tte_data, unsigned long tte_index);
unsigned long dtlb_faultva(void);
void dtlb_demap(unsigned long vaddr);

typedef int (*translation_entry_cb)(ucell phys,	ucell virt, ucell size, ucell mode);

extern void ofmem_walk_boot_map(translation_entry_cb cb);

extern translation_t **g_ofmem_translations;

extern void dtlb_miss_handler(void);
extern void itlb_miss_handler(void);
extern void bug(void);

#endif   /* _H_OFMEM_SPARC64 */
