Commit a9d2d386 authored by Kyle McMartin's avatar Kyle McMartin Committed by Kyle McMartin

[PARISC] Ensure Space ID hashing is turned off

Check PDC_CACHE to see if spaceid hashing is turned on, and fail to
boot if that is the case.

However, some old machines do not implement the PDC_CACHE_RET_SPID
firmware call, so continue to boot if the call fails because of
PDC_BAD_OPTION (but fail in all other error returns).
Signed-off-by: default avatarKyle McMartin <kyle@parisc-linux.org>
parent e5a2e7fd
...@@ -236,7 +236,8 @@ parisc_cache_init(void) ...@@ -236,7 +236,8 @@ parisc_cache_init(void)
void disable_sr_hashing(void) void disable_sr_hashing(void)
{ {
int srhash_type; int srhash_type, retval;
unsigned long space_bits;
switch (boot_cpu_data.cpu_type) { switch (boot_cpu_data.cpu_type) {
case pcx: /* We shouldn't get this far. setup.c should prevent it. */ case pcx: /* We shouldn't get this far. setup.c should prevent it. */
...@@ -262,6 +263,13 @@ void disable_sr_hashing(void) ...@@ -262,6 +263,13 @@ void disable_sr_hashing(void)
} }
disable_sr_hashing_asm(srhash_type); disable_sr_hashing_asm(srhash_type);
retval = pdc_spaceid_bits(&space_bits);
/* If this procedure isn't implemented, don't panic. */
if (retval < 0 && retval != PDC_BAD_OPTION)
panic("pdc_spaceid_bits call failed.\n");
if (space_bits != 0)
panic("SpaceID hashing is still on!\n");
} }
void flush_dcache_page(struct page *page) void flush_dcache_page(struct page *page)
......
...@@ -512,6 +512,26 @@ int pdc_cache_info(struct pdc_cache_info *cache_info) ...@@ -512,6 +512,26 @@ int pdc_cache_info(struct pdc_cache_info *cache_info)
return retval; return retval;
} }
/**
* pdc_spaceid_bits - Return whether Space ID hashing is turned on.
* @space_bits: Should be 0, if not, bad mojo!
*
* Returns information about Space ID hashing.
*/
int pdc_spaceid_bits(unsigned long *space_bits)
{
int retval;
spin_lock_irq(&pdc_lock);
pdc_result[0] = 0;
retval = mem_pdc_call(PDC_CACHE, PDC_CACHE_RET_SPID, __pa(pdc_result), 0);
convert_to_wide(pdc_result);
*space_bits = pdc_result[0];
spin_unlock_irq(&pdc_lock);
return retval;
}
#ifndef CONFIG_PA20 #ifndef CONFIG_PA20
/** /**
* pdc_btlb_info - Return block TLB information. * pdc_btlb_info - Return block TLB information.
......
...@@ -733,6 +733,7 @@ int pdc_model_cpuid(unsigned long *cpu_id); ...@@ -733,6 +733,7 @@ int pdc_model_cpuid(unsigned long *cpu_id);
int pdc_model_versions(unsigned long *versions, int id); int pdc_model_versions(unsigned long *versions, int id);
int pdc_model_capabilities(unsigned long *capabilities); int pdc_model_capabilities(unsigned long *capabilities);
int pdc_cache_info(struct pdc_cache_info *cache); int pdc_cache_info(struct pdc_cache_info *cache);
int pdc_spaceid_bits(unsigned long *space_bits);
#ifndef CONFIG_PA20 #ifndef CONFIG_PA20
int pdc_btlb_info(struct pdc_btlb_info *btlb); int pdc_btlb_info(struct pdc_btlb_info *btlb);
int pdc_mem_map_hpa(struct pdc_memory_map *r_addr, struct pdc_module_path *mod_path); int pdc_mem_map_hpa(struct pdc_memory_map *r_addr, struct pdc_module_path *mod_path);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment