diff options
author | Helge Deller <deller@gmx.de> | 2019-02-08 12:28:13 -0500 |
---|---|---|
committer | Helge Deller <deller@gmx.de> | 2019-02-21 14:37:13 -0500 |
commit | 8207d4ee44d3f525bf9aa57807ac9db5d0d90c1a (patch) | |
tree | 13c14cc3d981f137402301355c92cf4f58abb351 | |
parent | 661faf31021dda4df1ea46594ec03de68f5ac47d (diff) |
parisc: Show machine product number during boot
Ask PDC firmware during boot for the original and current product
number as well as the serial number and show it (if available).
Signed-off-by: Helge Deller <deller@gmx.de>
-rw-r--r-- | arch/parisc/include/asm/pdc.h | 1 | ||||
-rw-r--r-- | arch/parisc/kernel/firmware.c | 24 | ||||
-rw-r--r-- | arch/parisc/kernel/processor.c | 9 |
3 files changed, 34 insertions, 0 deletions
diff --git a/arch/parisc/include/asm/pdc.h b/arch/parisc/include/asm/pdc.h index 5b187d40d604..19bb2e46cd36 100644 --- a/arch/parisc/include/asm/pdc.h +++ b/arch/parisc/include/asm/pdc.h | |||
@@ -44,6 +44,7 @@ int pdc_model_sysmodel(char *name); | |||
44 | int pdc_model_cpuid(unsigned long *cpu_id); | 44 | int pdc_model_cpuid(unsigned long *cpu_id); |
45 | int pdc_model_versions(unsigned long *versions, int id); | 45 | int pdc_model_versions(unsigned long *versions, int id); |
46 | int pdc_model_capabilities(unsigned long *capabilities); | 46 | int pdc_model_capabilities(unsigned long *capabilities); |
47 | int pdc_model_platform_info(char *orig_prod_num, char *current_prod_num, char *serial_no); | ||
47 | int pdc_cache_info(struct pdc_cache_info *cache); | 48 | int pdc_cache_info(struct pdc_cache_info *cache); |
48 | int pdc_spaceid_bits(unsigned long *space_bits); | 49 | int pdc_spaceid_bits(unsigned long *space_bits); |
49 | #ifndef CONFIG_PA20 | 50 | #ifndef CONFIG_PA20 |
diff --git a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c index e6f3b49f2fd7..7a17551ea31e 100644 --- a/arch/parisc/kernel/firmware.c +++ b/arch/parisc/kernel/firmware.c | |||
@@ -569,6 +569,30 @@ int pdc_model_capabilities(unsigned long *capabilities) | |||
569 | } | 569 | } |
570 | 570 | ||
571 | /** | 571 | /** |
572 | * pdc_model_platform_info - Returns machine product and serial number. | ||
573 | * @orig_prod_num: Return buffer for original product number. | ||
574 | * @current_prod_num: Return buffer for current product number. | ||
575 | * @serial_no: Return buffer for serial number. | ||
576 | * | ||
577 | * Returns strings containing the original and current product numbers and the | ||
578 | * serial number of the system. | ||
579 | */ | ||
580 | int pdc_model_platform_info(char *orig_prod_num, char *current_prod_num, | ||
581 | char *serial_no) | ||
582 | { | ||
583 | int retval; | ||
584 | unsigned long flags; | ||
585 | |||
586 | spin_lock_irqsave(&pdc_lock, flags); | ||
587 | retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_GET_PLATFORM_INFO, | ||
588 | __pa(orig_prod_num), __pa(current_prod_num), __pa(serial_no)); | ||
589 | convert_to_wide(pdc_result); | ||
590 | spin_unlock_irqrestore(&pdc_lock, flags); | ||
591 | |||
592 | return retval; | ||
593 | } | ||
594 | |||
595 | /** | ||
572 | * pdc_cache_info - Return cache and TLB information. | 596 | * pdc_cache_info - Return cache and TLB information. |
573 | * @cache_info: The return buffer. | 597 | * @cache_info: The return buffer. |
574 | * | 598 | * |
diff --git a/arch/parisc/kernel/processor.c b/arch/parisc/kernel/processor.c index 82bd0d0927ce..7f4d042856b5 100644 --- a/arch/parisc/kernel/processor.c +++ b/arch/parisc/kernel/processor.c | |||
@@ -242,6 +242,7 @@ static int __init processor_probe(struct parisc_device *dev) | |||
242 | void __init collect_boot_cpu_data(void) | 242 | void __init collect_boot_cpu_data(void) |
243 | { | 243 | { |
244 | unsigned long cr16_seed; | 244 | unsigned long cr16_seed; |
245 | char orig_prod_num[64], current_prod_num[64], serial_no[64]; | ||
245 | 246 | ||
246 | memset(&boot_cpu_data, 0, sizeof(boot_cpu_data)); | 247 | memset(&boot_cpu_data, 0, sizeof(boot_cpu_data)); |
247 | 248 | ||
@@ -301,6 +302,14 @@ void __init collect_boot_cpu_data(void) | |||
301 | _parisc_requires_coherency = (boot_cpu_data.cpu_type == mako) || | 302 | _parisc_requires_coherency = (boot_cpu_data.cpu_type == mako) || |
302 | (boot_cpu_data.cpu_type == mako2); | 303 | (boot_cpu_data.cpu_type == mako2); |
303 | #endif | 304 | #endif |
305 | |||
306 | if (pdc_model_platform_info(orig_prod_num, current_prod_num, serial_no) == PDC_OK) { | ||
307 | printk(KERN_INFO "product %s, original product %s, S/N: %s\n", | ||
308 | current_prod_num, orig_prod_num, serial_no); | ||
309 | add_device_randomness(orig_prod_num, strlen(orig_prod_num)); | ||
310 | add_device_randomness(current_prod_num, strlen(current_prod_num)); | ||
311 | add_device_randomness(serial_no, strlen(serial_no)); | ||
312 | } | ||
304 | } | 313 | } |
305 | 314 | ||
306 | 315 | ||