Re: [PATCH 05/12] platform/x86: ISST: Add support for MSR 0x54
From: Hans de Goede
Date: Wed Mar 01 2023 - 09:47:21 EST
Hi,
On 3/1/23 15:41, srinivas pandruvada wrote:
> On Wed, 2023-03-01 at 15:30 +0100, Hans de Goede wrote:
>> Hi,
>>
>> On 2/11/23 07:32, Srinivas Pandruvada wrote:
>>> To map Linux CPU numbering scheme to hardware CPU numbering scheme
>>> MSR 0x53 is getting used. But for new generation of CPUs, this MSR
>>> is not valid. Since this is model specific MSR, this is possible.
>>>
>>> A new MSR 0x54 is defined. Use this MSR and convert the IOCTL
>>> format
>>> to match existing MSR 0x53, in this case user spaces don't need to
>>> be aware of this change.
>>>
>>> Signed-off-by: Srinivas Pandruvada
>>> <srinivas.pandruvada@xxxxxxxxxxxxxxx>
>>
>> I am not a fan of this. I expect that users of these new CPUs will
>> very likely also need a new intel-speed-select userspace tool
>> regardless
>> of doing this MSR munging/shuffling in the kernel. So why not fix
>> the tool to teach it about the MSR instead ?
>
> Sure.
>
> I can remove the format conversion in the kernel, so that user space
> tool will do that.
>
> I think that's what you mean.
Yes that is what I mean.
>> If you have good arguments for doing this in the kernel please
>> add them the commit message for the next version, but my initial
>> reaction to this is that it is wrong to do this in the kernel
>> and that the tool should be fixed instead. So my preference
>> would be for this patch to be dropped from the next version of
>> the patch-set.
>
> Since we can't read MSR from user space, this patch is still required
> to read only MSR 0x54. Just it will not do any format conversion. So
> format conversion will happen in user space tool.
Yes that would be great, having the kernel read the MSR is fine
(of course).
Regards,
Hans
>>> ---
>>> .../intel/speed_select_if/isst_if_common.c | 51
>>> +++++++++++++++++++
>>> 1 file changed, 51 insertions(+)
>>>
>>> diff --git
>>> a/drivers/platform/x86/intel/speed_select_if/isst_if_common.c
>>> b/drivers/platform/x86/intel/speed_select_if/isst_if_common.c
>>> index 60e58b0b3835..97d1b4566535 100644
>>> --- a/drivers/platform/x86/intel/speed_select_if/isst_if_common.c
>>> +++ b/drivers/platform/x86/intel/speed_select_if/isst_if_common.c
>>> @@ -19,9 +19,13 @@
>>> #include <linux/uaccess.h>
>>> #include <uapi/linux/isst_if.h>
>>>
>>> +#include <asm/cpu_device_id.h>
>>> +#include <asm/intel-family.h>
>>> +
>>> #include "isst_if_common.h"
>>>
>>> #define MSR_THREAD_ID_INFO 0x53
>>> +#define MSR_PM_LOGICAL_ID 0x54
>>> #define MSR_CPU_BUS_NUMBER 0x128
>>>
>>> static struct isst_if_cmd_cb punit_callbacks[ISST_IF_DEV_MAX];
>>> @@ -31,6 +35,7 @@ static int punit_msr_white_list[] = {
>>> MSR_CONFIG_TDP_CONTROL,
>>> MSR_TURBO_RATIO_LIMIT1,
>>> MSR_TURBO_RATIO_LIMIT2,
>>> + MSR_PM_LOGICAL_ID,
>>> };
>>>
>>> struct isst_valid_cmd_ranges {
>>> @@ -73,6 +78,8 @@ struct isst_cmd {
>>> u32 param;
>>> };
>>>
>>> +static bool isst_hpm_support;
>>> +
>>> static DECLARE_HASHTABLE(isst_hash, 8);
>>> static DEFINE_MUTEX(isst_hash_lock);
>>>
>>> @@ -411,11 +418,43 @@ static int isst_if_cpu_online(unsigned int
>>> cpu)
>>> isst_cpu_info[cpu].pci_dev[1] =
>>> _isst_if_get_pci_dev(cpu, 1, 30, 1);
>>> }
>>>
>>> + if (isst_hpm_support) {
>>> + u64 raw_data;
>>> +
>>> + ret = rdmsrl_safe(MSR_PM_LOGICAL_ID, &raw_data);
>>> + if (!ret) {
>>> + /*
>>> + * Use the same format as MSR 53, for user
>>> space harmony
>>> + * Format
>>> + * Bit 0 – thread ID
>>> + * Bit 8:1 – core ID
>>> + * Bit 13:9 – Compute domain ID (aka
>>> die ID)
>>> + * From the MSR 0x54 format
>>> + * [15:11] PM_DOMAIN_ID
>>> + * [10:3] MODULE_ID (aka IDI_AGENT_ID)
>>> + * [2:0] LP_ID (We don't care about
>>> these bits we only
>>> + * care die and core
>>> id
>>> + * For Atom:
>>> + * [2] Always 0
>>> + * [1:0] core ID within module
>>> + * For Core
>>> + * [2:1] Always 0
>>> + * [0] thread ID
>>> + */
>>> + data = (raw_data >> 11) & 0x1f;
>>> + data <<= 9;
>>> + data |= (((raw_data >> 3) & 0xff) << 1);
>>> + goto set_punit_id;
>>> + }
>>> + }
>>> +
>>> ret = rdmsrl_safe(MSR_THREAD_ID_INFO, &data);
>>> if (ret) {
>>> isst_cpu_info[cpu].punit_cpu_id = -1;
>>> return ret;
>>> }
>>> +
>>> +set_punit_id:
>>> isst_cpu_info[cpu].punit_cpu_id = data;
>>>
>>> isst_restore_msr_local(cpu);
>>> @@ -704,6 +743,12 @@ static struct miscdevice isst_if_char_driver =
>>> {
>>> .fops = &isst_if_char_driver_ops,
>>> };
>>>
>>> +static const struct x86_cpu_id hpm_cpu_ids[] = {
>>> + X86_MATCH_INTEL_FAM6_MODEL(GRANITERAPIDS_X, NULL),
>>> + X86_MATCH_INTEL_FAM6_MODEL(SIERRAFOREST_X, NULL),
>>> + {}
>>> +};
>>> +
>>> static int isst_misc_reg(void)
>>> {
>>> mutex_lock(&punit_misc_dev_reg_lock);
>>> @@ -711,6 +756,12 @@ static int isst_misc_reg(void)
>>> goto unlock_exit;
>>>
>>> if (!misc_usage_count) {
>>> + const struct x86_cpu_id *id;
>>> +
>>> + id = x86_match_cpu(hpm_cpu_ids);
>>> + if (id)
>>> + isst_hpm_support = true;
>>> +
>>> misc_device_ret = isst_if_cpu_info_init();
>>> if (misc_device_ret)
>>> goto unlock_exit;
>>
>