[POWERPC] powerpc: Initialise ppc_md htab pointers earlier
Initialise the ppc_md htab callbacks earlier, in the probe routines. This allows us to call htab_finish_init() from htab_initialize(), and makes it private to hash_utils_64.c. Move htab_finish_init() and make_bl() above htab_initialize() to avoid forward declarations. Signed-off-by: Michael Ellerman <michael@ellerman.id.au> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
committed by
Paul Mackerras
parent
7a4571ae55
commit
7d0daae4ae
@@ -413,6 +413,41 @@ void create_section_mapping(unsigned long start, unsigned long end)
|
||||
}
|
||||
#endif /* CONFIG_MEMORY_HOTPLUG */
|
||||
|
||||
static inline void make_bl(unsigned int *insn_addr, void *func)
|
||||
{
|
||||
unsigned long funcp = *((unsigned long *)func);
|
||||
int offset = funcp - (unsigned long)insn_addr;
|
||||
|
||||
*insn_addr = (unsigned int)(0x48000001 | (offset & 0x03fffffc));
|
||||
flush_icache_range((unsigned long)insn_addr, 4+
|
||||
(unsigned long)insn_addr);
|
||||
}
|
||||
|
||||
static void __init htab_finish_init(void)
|
||||
{
|
||||
extern unsigned int *htab_call_hpte_insert1;
|
||||
extern unsigned int *htab_call_hpte_insert2;
|
||||
extern unsigned int *htab_call_hpte_remove;
|
||||
extern unsigned int *htab_call_hpte_updatepp;
|
||||
|
||||
#ifdef CONFIG_PPC_64K_PAGES
|
||||
extern unsigned int *ht64_call_hpte_insert1;
|
||||
extern unsigned int *ht64_call_hpte_insert2;
|
||||
extern unsigned int *ht64_call_hpte_remove;
|
||||
extern unsigned int *ht64_call_hpte_updatepp;
|
||||
|
||||
make_bl(ht64_call_hpte_insert1, ppc_md.hpte_insert);
|
||||
make_bl(ht64_call_hpte_insert2, ppc_md.hpte_insert);
|
||||
make_bl(ht64_call_hpte_remove, ppc_md.hpte_remove);
|
||||
make_bl(ht64_call_hpte_updatepp, ppc_md.hpte_updatepp);
|
||||
#endif /* CONFIG_PPC_64K_PAGES */
|
||||
|
||||
make_bl(htab_call_hpte_insert1, ppc_md.hpte_insert);
|
||||
make_bl(htab_call_hpte_insert2, ppc_md.hpte_insert);
|
||||
make_bl(htab_call_hpte_remove, ppc_md.hpte_remove);
|
||||
make_bl(htab_call_hpte_updatepp, ppc_md.hpte_updatepp);
|
||||
}
|
||||
|
||||
void __init htab_initialize(void)
|
||||
{
|
||||
unsigned long table;
|
||||
@@ -525,6 +560,8 @@ void __init htab_initialize(void)
|
||||
mmu_linear_psize));
|
||||
}
|
||||
|
||||
htab_finish_init();
|
||||
|
||||
DBG(" <- htab_initialize()\n");
|
||||
}
|
||||
#undef KB
|
||||
@@ -787,16 +824,6 @@ void flush_hash_range(unsigned long number, int local)
|
||||
}
|
||||
}
|
||||
|
||||
static inline void make_bl(unsigned int *insn_addr, void *func)
|
||||
{
|
||||
unsigned long funcp = *((unsigned long *)func);
|
||||
int offset = funcp - (unsigned long)insn_addr;
|
||||
|
||||
*insn_addr = (unsigned int)(0x48000001 | (offset & 0x03fffffc));
|
||||
flush_icache_range((unsigned long)insn_addr, 4+
|
||||
(unsigned long)insn_addr);
|
||||
}
|
||||
|
||||
/*
|
||||
* low_hash_fault is called when we the low level hash code failed
|
||||
* to instert a PTE due to an hypervisor error
|
||||
@@ -815,28 +842,3 @@ void low_hash_fault(struct pt_regs *regs, unsigned long address)
|
||||
}
|
||||
bad_page_fault(regs, address, SIGBUS);
|
||||
}
|
||||
|
||||
void __init htab_finish_init(void)
|
||||
{
|
||||
extern unsigned int *htab_call_hpte_insert1;
|
||||
extern unsigned int *htab_call_hpte_insert2;
|
||||
extern unsigned int *htab_call_hpte_remove;
|
||||
extern unsigned int *htab_call_hpte_updatepp;
|
||||
|
||||
#ifdef CONFIG_PPC_64K_PAGES
|
||||
extern unsigned int *ht64_call_hpte_insert1;
|
||||
extern unsigned int *ht64_call_hpte_insert2;
|
||||
extern unsigned int *ht64_call_hpte_remove;
|
||||
extern unsigned int *ht64_call_hpte_updatepp;
|
||||
|
||||
make_bl(ht64_call_hpte_insert1, ppc_md.hpte_insert);
|
||||
make_bl(ht64_call_hpte_insert2, ppc_md.hpte_insert);
|
||||
make_bl(ht64_call_hpte_remove, ppc_md.hpte_remove);
|
||||
make_bl(ht64_call_hpte_updatepp, ppc_md.hpte_updatepp);
|
||||
#endif /* CONFIG_PPC_64K_PAGES */
|
||||
|
||||
make_bl(htab_call_hpte_insert1, ppc_md.hpte_insert);
|
||||
make_bl(htab_call_hpte_insert2, ppc_md.hpte_insert);
|
||||
make_bl(htab_call_hpte_remove, ppc_md.hpte_remove);
|
||||
make_bl(htab_call_hpte_updatepp, ppc_md.hpte_updatepp);
|
||||
}
|
||||
|
Reference in New Issue
Block a user