mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-30 18:53:45 +01:00 
			
		
		
		
	UefiCpuPkg: Refactor the logic for placing APs in Mwait/Runloop.
Refactor the logic for placing APs in Mwait/Runloop into a separate function. Tested-by: Gerd Hoffmann <kraxel@redhat.com> Acked-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Ray Ni <ray.ni@intel.com> Cc: Eric Dong <eric.dong@intel.com> Cc: Rahul Kumar <rahul1.kumar@intel.com> Cc: Tom Lendacky <thomas.lendacky@amd.com> Signed-off-by: Yuanhao Xie <yuanhao.xie@intel.com>
This commit is contained in:
		
							parent
							
								
									88f436883b
								
							
						
					
					
						commit
						243212b0d0
					
				| @ -658,6 +658,54 @@ PlaceAPInHltLoop ( | |||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |   This function place APs in Mwait or Run loop. | ||||||
|  | 
 | ||||||
|  |   @param[in] ApLoopMode                   Ap Loop Mode | ||||||
|  |   @param[in] ApStartupSignalBuffer        Pointer to Ap Startup Signal Buffer | ||||||
|  |   @param[in] ApTargetCState               Ap Target CState | ||||||
|  | **/ | ||||||
|  | VOID | ||||||
|  | PlaceAPInMwaitLoopOrRunLoop ( | ||||||
|  |   IN UINT8            ApLoopMode, | ||||||
|  |   IN volatile UINT32  *ApStartupSignalBuffer, | ||||||
|  |   IN UINT8            ApTargetCState | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   while (TRUE) { | ||||||
|  |     DisableInterrupts (); | ||||||
|  |     if (ApLoopMode == ApInMwaitLoop) { | ||||||
|  |       //
 | ||||||
|  |       // Place AP in MWAIT-loop
 | ||||||
|  |       //
 | ||||||
|  |       AsmMonitor ((UINTN)ApStartupSignalBuffer, 0, 0); | ||||||
|  |       if (*ApStartupSignalBuffer != WAKEUP_AP_SIGNAL) { | ||||||
|  |         //
 | ||||||
|  |         // Check AP start-up signal again.
 | ||||||
|  |         // If AP start-up signal is not set, place AP into
 | ||||||
|  |         // the specified C-state
 | ||||||
|  |         //
 | ||||||
|  |         AsmMwait (ApTargetCState << 4, 0); | ||||||
|  |       } | ||||||
|  |     } else if (ApLoopMode == ApInRunLoop) { | ||||||
|  |       //
 | ||||||
|  |       // Place AP in Run-loop
 | ||||||
|  |       //
 | ||||||
|  |       CpuPause (); | ||||||
|  |     } else { | ||||||
|  |       ASSERT (FALSE); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     //
 | ||||||
|  |     // If AP start-up signal is written, AP is waken up
 | ||||||
|  |     // otherwise place AP in loop again
 | ||||||
|  |     //
 | ||||||
|  |     if (*ApStartupSignalBuffer == WAKEUP_AP_SIGNAL) { | ||||||
|  |       break; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|   This function will be called from AP reset code if BSP uses WakeUpAP. |   This function will be called from AP reset code if BSP uses WakeUpAP. | ||||||
| 
 | 
 | ||||||
| @ -838,39 +886,8 @@ ApWakeupFunction ( | |||||||
|       //
 |       //
 | ||||||
|       // Never run here
 |       // Never run here
 | ||||||
|       //
 |       //
 | ||||||
|     } |     } else { | ||||||
| 
 |       PlaceAPInMwaitLoopOrRunLoop (CpuMpData->ApLoopMode, ApStartupSignalBuffer, CpuMpData->ApTargetCState); | ||||||
|     while (TRUE) { |  | ||||||
|       DisableInterrupts (); |  | ||||||
|       if (CpuMpData->ApLoopMode == ApInMwaitLoop) { |  | ||||||
|         //
 |  | ||||||
|         // Place AP in MWAIT-loop
 |  | ||||||
|         //
 |  | ||||||
|         AsmMonitor ((UINTN)ApStartupSignalBuffer, 0, 0); |  | ||||||
|         if (*ApStartupSignalBuffer != WAKEUP_AP_SIGNAL) { |  | ||||||
|           //
 |  | ||||||
|           // Check AP start-up signal again.
 |  | ||||||
|           // If AP start-up signal is not set, place AP into
 |  | ||||||
|           // the specified C-state
 |  | ||||||
|           //
 |  | ||||||
|           AsmMwait (CpuMpData->ApTargetCState << 4, 0); |  | ||||||
|         } |  | ||||||
|       } else if (CpuMpData->ApLoopMode == ApInRunLoop) { |  | ||||||
|         //
 |  | ||||||
|         // Place AP in Run-loop
 |  | ||||||
|         //
 |  | ||||||
|         CpuPause (); |  | ||||||
|       } else { |  | ||||||
|         ASSERT (FALSE); |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       //
 |  | ||||||
|       // If AP start-up signal is written, AP is waken up
 |  | ||||||
|       // otherwise place AP in loop again
 |  | ||||||
|       //
 |  | ||||||
|       if (*ApStartupSignalBuffer == WAKEUP_AP_SIGNAL) { |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user