tools/power/x86/intel-speed-select: Kernel interface error handling
authorSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Thu, 5 Mar 2020 22:45:30 +0000 (14:45 -0800)
committerAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Fri, 20 Mar 2020 12:46:22 +0000 (14:46 +0200)
Treat a case when mailbox/mmio command can't be handled by the kernel
drivers when the module is removed or send a command which no driver can
handle. In this case ENOTTY result is returned, so print error.

Also when the isst_if_mmio module is removed, we can't send CLOS message
messages via Mailbox on non SKX based platforms. When this module is
removed,  isst_platform_info.mmio_supported is set to 0. So it can't be
used as a condition to send via mailbox. Here replace check for Skylake
based platform to send via mailbox, other platforms can't use mailbox in
lieu of MMIO.

Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
tools/power/x86/intel-speed-select/isst-config.c

index 4891547..2ab902c 100644 (file)
@@ -95,6 +95,14 @@ int is_clx_n_platform(void)
        return 0;
 }
 
+int is_skx_based_platform(void)
+{
+       if (cpu_model == 0x55)
+               return 1;
+
+       return 0;
+}
+
 static int update_cpu_model(void)
 {
        unsigned int ebx, ecx, edx;
@@ -695,7 +703,11 @@ static int isst_send_mmio_command(unsigned int cpu, unsigned int reg, int write,
        }
 
        if (ioctl(fd, cmd, &io_regs) == -1) {
-               perror("ISST_IF_IO_CMD");
+               if (errno == ENOTTY) {
+                       perror("ISST_IF_IO_COMMAND\n");
+                       fprintf(stderr, "Check presence of kernel modules: isst_if_mmio\n");
+                       exit(0);
+               }
                fprintf(outf, "Error: mmio_cmd cpu:%d reg:%x read_write:%x\n",
                        cpu, reg, write);
        } else {
@@ -724,7 +736,7 @@ int isst_send_mbox_command(unsigned int cpu, unsigned char command,
                "mbox_send: cpu:%d command:%x sub_command:%x parameter:%x req_data:%x\n",
                cpu, command, sub_command, parameter, req_data);
 
-       if (isst_platform_info.mmio_supported && command == CONFIG_CLOS &&
+       if (!is_skx_based_platform() && command == CONFIG_CLOS &&
            sub_command != CLOS_PM_QOS_CONFIG) {
                unsigned int value;
                int write = 0;
@@ -774,10 +786,14 @@ int isst_send_mbox_command(unsigned int cpu, unsigned char command,
                err(-1, "%s open failed", pathname);
 
        if (ioctl(fd, ISST_IF_MBOX_COMMAND, &mbox_cmds) == -1) {
-               perror("ISST_IF_MBOX_COMMAND");
-               fprintf(outf,
-                       "Error: mbox_cmd cpu:%d command:%x sub_command:%x parameter:%x req_data:%x\n",
-                       cpu, command, sub_command, parameter, req_data);
+               if (errno == ENOTTY) {
+                       perror("ISST_IF_MBOX_COMMAND\n");
+                       fprintf(stderr, "Check presence of kernel modules: isst_if_mbox_pci or isst_if_mbox_msr\n");
+                       exit(0);
+               }
+               debug_printf(
+                       "Error: mbox_cmd cpu:%d command:%x sub_command:%x parameter:%x req_data:%x errorno:%d\n",
+                       cpu, command, sub_command, parameter, req_data, errno);
                return -1;
        } else {
                *resp = mbox_cmds.mbox_cmd[0].resp_data;