1. 02 Dec, 2022 1 commit
  2. 23 Nov, 2022 3 commits
    • Srinivas Pandruvada's avatar
      thermal: intel: hfi: ACK HFI for the same timestamp · c0e3acdc
      Srinivas Pandruvada authored
      Some processors issue more than one HFI interrupt with the same
      timestamp. Each interrupt must be acknowledged to let the hardware issue
      new HFI interrupts. But this can't be done without some additional flow
      modification in the existing interrupt handling.
      
      For background, the HFI interrupt is a package level thermal interrupt
      delivered via a LVT. This LVT is common for both the CPU and package
      level interrupts. Hence, all CPUs receive the HFI interrupts. But only
      one CPU should process interrupt and others simply exit by issuing EOI
      to LAPIC.
      
      The current HFI interrupt processing flow:
      
        1. Receive Thermal interrupt
        2. Check if there is an active HFI status in MSR_IA32_THERM_STATUS
        3. Try and get spinlock, one CPU will enter spinlock and others
           will simply return from here to issue EOI.
          (Let's assume CPU 4 is processing interrupt)
        4. Check the stored time-stamp from the HFI memory time-stamp
        5. if same
        6.      ignore interrupt, unlock and return
        7. Copy the HFI message to local buffer
        8. unlock spinlock
        9. ACK HFI interrupt
       10. Queue the message for processing in a work-queue
      
      It is tempting to simply acknowledge all the interrupts even if they
      have the same timestamp. This may cause some interrupts to not be
      processed.
      
      Let's say CPU5 is slightly late and reaches step 4 while CPU4 is
      between steps 8 and 9.
      
      Currently we simply ignore interrupts with the same timestamp. No
      issue here for CPU5. When CPU4 acknowledges the interrupt, the next
      HFI interrupt can be delivered.
      
      If we acknowledge interrupts with the same timestamp (at step 6), there
      is a race condition. Under the same scenario, CPU 5 will acknowledge
      the HFI interrupt. This lets hardware generate another HFI interrupt,
      before CPU 4 start executing step 9. Once CPU 4 complete step 9, it
      will acknowledge the newly arrived HFI interrupt, without actually
      processing it.
      
      Acknowledge the interrupt when holding the spinlock. This avoids
      contention of the interrupt acknowledgment.
      
      Updated flow:
      
        1. Receive HFI Thermal interrupt
        2. Check if there is an active HFI status in MSR_IA32_THERM_STATUS
        3. Try and get spin-lock
           Let's assume CPU 4 is processing interrupt
        4.1 Read MSR_IA32_PACKAGE_THERM_STATUS and check HFI status bit
        4.2	If hfi status is 0
        4.3		unlock spinlock
        4.4		return
        4.5 Check the stored time-stamp from the HFI memory time-stamp
        5. if same
        6.1      ACK HFI Interrupt,
        6.2	unlock spinlock
        6.3	return
        7. Copy the HFI message to local buffer
        8. ACK HFI interrupt
        9. unlock spinlock
       10. Queue the message for processing in a work-queue
      
      To avoid taking the lock unnecessarily, intel_hfi_process_event() checks
      the status of the HFI interrupt before taking the lock. If CPU5 is late,
      when it starts processing the interrupt there are two scenarios:
      
       a) CPU4 acknowledged the HFI interrupt before CPU5 read
          MSR_IA32_THERM_STATUS. CPU5 exits.
      
       b) CPU5 reads MSR_IA32_THERM_STATUS before CPU4 has acknowledged the
          interrupt. CPU5 will take the lock if CPU4 has released it. It then
          re-reads MSR_IA32_THERM_STATUS. If there is not a new interrupt,
          the HFI status bit is clear and CPU5 exits. If a new HFI interrupt
          was generated it will find that the status bit is set and it will
          continue to process the interrupt. In this case even if timestamp
          is not changed, the ACK can be issued as this is a new interrupt.
      Signed-off-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
      Reviewed-by: default avatarRicardo Neri <ricardo.neri-calderon@linux.intel.com>
      Tested-by: Arshad, Adeel<adeel.arshad@intel.com>
      Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
      c0e3acdc
    • Srinivas Pandruvada's avatar
      thermal: intel: Protect clearing of thermal status bits · 930d06bf
      Srinivas Pandruvada authored
      The clearing of the package thermal status is done by Read-Modify-Write
      operation. This may result in clearing of some new status bits which are
      being or about to be processed.
      
      For example, while clearing of HFI status, after read of thermal status
      register, a new thermal status bit is set by the hardware. But during
      write back, the newly generated status bit will be set to 0 or cleared.
      So, it is not safe to do read-modify-write.
      
      Since thermal status Read-Write bits can be set to only 0 not 1, it is
      safe to set all other bits to 1 which are not getting cleared.
      
      Create a common interface for clearing package thermal status bits. Use
      this interface to replace existing code to clear thermal package status
      bits.
      
      It is safe to call from different CPUs without protection as there is no
      read-modify-write. Also wrmsrl results in just single instruction. For
      example while CPU 0 and CPU 3 are clearing bit 1 and 3 respectively. If
      CPU 3 wins the race, it will write 0x4000aa2, then CPU 1 will write
      0x4000aa8. The bits which are not part of clear are set to 1. The default
      mask for bits, which can be written here is 0x4000aaa.
      Signed-off-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
      Reviewed-by: default avatarRicardo Neri <ricardo.neri-calderon@linux.intel.com>
      Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
      930d06bf
    • Srinivas Pandruvada's avatar
      thermal: intel: Prevent accidental clearing of HFI status · 6fe1e64b
      Srinivas Pandruvada authored
      When there is a package thermal interrupt with PROCHOT log, it will be
      processed and cleared. It is possible that there is an active HFI event
      status, which is about to get processed or getting processed. While
      clearing PROCHOT log bit, it will also clear HFI status bit. This means
      that hardware is free to update HFI memory.
      
      When clearing a package thermal interrupt, some processors will generate
      a "general protection fault" when any of the read only bit is set to 1.
      
      The driver maintains a mask of all read-write bits which can be set.
      
      This mask doesn't include HFI status bit. This bit will also be cleared,
      as it will be assumed read-only bit. So, add HFI status bit 26 to the
      mask.
      Signed-off-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
      Reviewed-by: default avatarRicardo Neri <ricardo.neri-calderon@linux.intel.com>
      Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
      6fe1e64b
  3. 09 Nov, 2022 2 commits
  4. 28 Oct, 2022 1 commit
  5. 23 Oct, 2022 9 commits
  6. 22 Oct, 2022 21 commits
  7. 21 Oct, 2022 3 commits