• Zhang Rui's avatar
    powercap: intel_rapl: Fix handling for large time window · cf835b00
    Zhang Rui authored
    When setting the power limit time window, software updates the 'y' bits
    and 'f' bits in the power limit register, and the value hardware takes
    follows the formula below
    
    	Time window = 2 ^ y * (1 + f / 4) * Time_Unit
    
    When handling large time window input from userspace, using left
    shifting breaks in two cases:
    
     1. when ilog2(value) is bigger than 31, in expression "1 << y", left
        shifting by more than 31 bits has undefined behavior. This breaks
        'y'. For example, on an Alderlake platform, "1 << 32" returns 1.
    
     2. when ilog2(value) equals 31, "1 << 31" returns negative value
        because '1' is recognized as signed int. And this breaks 'f'.
    
    Given that 'y' has 5 bits and hardware can never take a value larger
    than 31, fix the first problem by clamp the time window to the maximum
    possible value that the hardware can take.
    
    Fix the second problem by using unsigned bit left shift.
    
    Note that hardware has its own maximum time window limitation, which
    may be lower than the time window value retrieved from the power limit
    register. When this happens, hardware clamps the input to its maximum
    time window limitation. That is why a software clamp is preferred to
    handle the problem on hand.
    Signed-off-by: default avatarZhang Rui <rui.zhang@intel.com>
    [ rjw: Adjusted the comment added by this change ]
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    cf835b00
intel_rapl_common.c 42.1 KB