diff options
Diffstat (limited to 'arch/parisc/kernel/firmware.c')
| -rw-r--r-- | arch/parisc/kernel/firmware.c | 69 | 
1 files changed, 46 insertions, 23 deletions
diff --git a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c index 7177a6cd1b7..03f26bd75bd 100644 --- a/arch/parisc/kernel/firmware.c +++ b/arch/parisc/kernel/firmware.c @@ -71,8 +71,8 @@  #include <asm/processor.h>	/* for boot_cpu_data */  static DEFINE_SPINLOCK(pdc_lock); -static unsigned long pdc_result[32] __attribute__ ((aligned (8))); -static unsigned long pdc_result2[32] __attribute__ ((aligned (8))); +extern unsigned long pdc_result[NUM_PDC_RESULT]; +extern unsigned long pdc_result2[NUM_PDC_RESULT];  #ifdef CONFIG_64BIT  #define WIDE_FIRMWARE 0x1 @@ -150,26 +150,40 @@ static void convert_to_wide(unsigned long *addr)  #endif  } +#ifdef CONFIG_64BIT +void __init set_firmware_width_unlocked(void) +{ +	int ret; + +	ret = mem_pdc_call(PDC_MODEL, PDC_MODEL_CAPABILITIES, +		__pa(pdc_result), 0); +	convert_to_wide(pdc_result); +	if (pdc_result[0] != NARROW_FIRMWARE) +		parisc_narrow_firmware = 0; +} +	  /**   * set_firmware_width - Determine if the firmware is wide or narrow.   *  - * This function must be called before any pdc_* function that uses the convert_to_wide - * function. + * This function must be called before any pdc_* function that uses the + * convert_to_wide function.   */  void __init set_firmware_width(void)  { -#ifdef CONFIG_64BIT -	int retval;  	unsigned long flags; +	spin_lock_irqsave(&pdc_lock, flags); +	set_firmware_width_unlocked(); +	spin_unlock_irqrestore(&pdc_lock, flags); +} +#else +void __init set_firmware_width_unlocked(void) { +	return; +} -        spin_lock_irqsave(&pdc_lock, flags); -	retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_CAPABILITIES, __pa(pdc_result), 0); -	convert_to_wide(pdc_result); -	if(pdc_result[0] != NARROW_FIRMWARE) -		parisc_narrow_firmware = 0; -        spin_unlock_irqrestore(&pdc_lock, flags); -#endif +void __init set_firmware_width(void) { +	return;  } +#endif /*CONFIG_64BIT*/  /**   * pdc_emergency_unlock - Unlock the linux pdc lock @@ -288,6 +302,20 @@ int pdc_chassis_warn(unsigned long *warn)  	return retval;  } +int __init pdc_coproc_cfg_unlocked(struct pdc_coproc_cfg *pdc_coproc_info) +{ +	int ret; + +	ret = mem_pdc_call(PDC_COPROC, PDC_COPROC_CFG, __pa(pdc_result)); +	convert_to_wide(pdc_result); +	pdc_coproc_info->ccr_functional = pdc_result[0]; +	pdc_coproc_info->ccr_present = pdc_result[1]; +	pdc_coproc_info->revision = pdc_result[17]; +	pdc_coproc_info->model = pdc_result[18]; + +	return ret; +} +  /**   * pdc_coproc_cfg - To identify coprocessors attached to the processor.   * @pdc_coproc_info: Return buffer address. @@ -297,19 +325,14 @@ int pdc_chassis_warn(unsigned long *warn)   */  int __init pdc_coproc_cfg(struct pdc_coproc_cfg *pdc_coproc_info)  { -        int retval; +	int ret;  	unsigned long flags; -        spin_lock_irqsave(&pdc_lock, flags); -        retval = mem_pdc_call(PDC_COPROC, PDC_COPROC_CFG, __pa(pdc_result)); -        convert_to_wide(pdc_result); -        pdc_coproc_info->ccr_functional = pdc_result[0]; -        pdc_coproc_info->ccr_present = pdc_result[1]; -        pdc_coproc_info->revision = pdc_result[17]; -        pdc_coproc_info->model = pdc_result[18]; -        spin_unlock_irqrestore(&pdc_lock, flags); +	spin_lock_irqsave(&pdc_lock, flags); +	ret = pdc_coproc_cfg_unlocked(pdc_coproc_info); +	spin_unlock_irqrestore(&pdc_lock, flags); -        return retval; +	return ret;  }  /**  |