diff options
Diffstat (limited to 'arch/x86/kernel/cpu/microcode/intel.c')
| -rw-r--r-- | arch/x86/kernel/cpu/microcode/intel.c | 44 | 
1 files changed, 18 insertions, 26 deletions
diff --git a/arch/x86/kernel/cpu/microcode/intel.c b/arch/x86/kernel/cpu/microcode/intel.c index cac2bdb57f0b..467cf37ea90a 100644 --- a/arch/x86/kernel/cpu/microcode/intel.c +++ b/arch/x86/kernel/cpu/microcode/intel.c @@ -305,14 +305,11 @@ static bool load_builtin_intel_microcode(struct cpio_data *cp)  	return false;  } -/* - * Print ucode update info. - */ -static void -print_ucode_info(struct ucode_cpu_info *uci, unsigned int date) +static void print_ucode_info(int old_rev, int new_rev, unsigned int date)  { -	pr_info_once("microcode updated early to revision 0x%x, date = %04x-%02x-%02x\n", -		     uci->cpu_sig.rev, +	pr_info_once("updated early: 0x%x -> 0x%x, date = %04x-%02x-%02x\n", +		     old_rev, +		     new_rev,  		     date & 0xffff,  		     date >> 24,  		     (date >> 16) & 0xff); @@ -322,6 +319,7 @@ print_ucode_info(struct ucode_cpu_info *uci, unsigned int date)  static int delay_ucode_info;  static int current_mc_date; +static int early_old_rev;  /*   * Print early updated ucode info after printk works. This is delayed info dump. @@ -332,7 +330,7 @@ void show_ucode_info_early(void)  	if (delay_ucode_info) {  		intel_cpu_collect_info(&uci); -		print_ucode_info(&uci, current_mc_date); +		print_ucode_info(early_old_rev, uci.cpu_sig.rev, current_mc_date);  		delay_ucode_info = 0;  	}  } @@ -341,40 +339,32 @@ void show_ucode_info_early(void)   * At this point, we can not call printk() yet. Delay printing microcode info in   * show_ucode_info_early() until printk() works.   */ -static void print_ucode(struct ucode_cpu_info *uci) +static void print_ucode(int old_rev, int new_rev, int date)  { -	struct microcode_intel *mc;  	int *delay_ucode_info_p;  	int *current_mc_date_p; - -	mc = uci->mc; -	if (!mc) -		return; +	int *early_old_rev_p;  	delay_ucode_info_p = (int *)__pa_nodebug(&delay_ucode_info);  	current_mc_date_p = (int *)__pa_nodebug(¤t_mc_date); +	early_old_rev_p = (int *)__pa_nodebug(&early_old_rev);  	*delay_ucode_info_p = 1; -	*current_mc_date_p = mc->hdr.date; +	*current_mc_date_p = date; +	*early_old_rev_p = old_rev;  }  #else -static inline void print_ucode(struct ucode_cpu_info *uci) +static inline void print_ucode(int old_rev, int new_rev, int date)  { -	struct microcode_intel *mc; - -	mc = uci->mc; -	if (!mc) -		return; - -	print_ucode_info(uci, mc->hdr.date); +	print_ucode_info(old_rev, new_rev, date);  }  #endif  static int apply_microcode_early(struct ucode_cpu_info *uci, bool early)  {  	struct microcode_intel *mc; -	u32 rev; +	u32 rev, old_rev;  	mc = uci->mc;  	if (!mc) @@ -391,6 +381,8 @@ static int apply_microcode_early(struct ucode_cpu_info *uci, bool early)  		return UCODE_OK;  	} +	old_rev = rev; +  	/*  	 * Writeback and invalidate caches before updating microcode to avoid  	 * internal issues depending on what the microcode is updating. @@ -407,9 +399,9 @@ static int apply_microcode_early(struct ucode_cpu_info *uci, bool early)  	uci->cpu_sig.rev = rev;  	if (early) -		print_ucode(uci); +		print_ucode(old_rev, uci->cpu_sig.rev, mc->hdr.date);  	else -		print_ucode_info(uci, mc->hdr.date); +		print_ucode_info(old_rev, uci->cpu_sig.rev, mc->hdr.date);  	return 0;  }  |