162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * (C) 2003 Bruno Ducrot 462306a36Sopenharmony_ci * (C) 2004 Dominik Brodowski <linux@dominikbrodowski.de> 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Based on code found in 762306a36Sopenharmony_ci * linux/include/asm-i386/ist.h and linux/arch/i386/kernel/setup.c 862306a36Sopenharmony_ci * and originally developed by Andy Grover <andrew.grover@intel.com> 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <stdio.h> 1262306a36Sopenharmony_ci#include <string.h> 1362306a36Sopenharmony_ci#include <lrmi.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ciint main (void) 1662306a36Sopenharmony_ci{ 1762306a36Sopenharmony_ci struct LRMI_regs r; 1862306a36Sopenharmony_ci int retval; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci if (!LRMI_init()) 2162306a36Sopenharmony_ci return 0; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci memset(&r, 0, sizeof(r)); 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci r.eax = 0x0000E980; 2662306a36Sopenharmony_ci r.edx = 0x47534943; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci retval = LRMI_int(0x15, &r); 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci if (!retval) { 3162306a36Sopenharmony_ci printf("Failed!\n"); 3262306a36Sopenharmony_ci return 0; 3362306a36Sopenharmony_ci } 3462306a36Sopenharmony_ci if (r.eax == 0x47534943) { 3562306a36Sopenharmony_ci printf("BIOS supports GSIC call:\n"); 3662306a36Sopenharmony_ci printf("\tsignature: %c%c%c%c\n", 3762306a36Sopenharmony_ci (r.eax >> 24) & 0xff, 3862306a36Sopenharmony_ci (r.eax >> 16) & 0xff, 3962306a36Sopenharmony_ci (r.eax >> 8) & 0xff, 4062306a36Sopenharmony_ci (r.eax) & 0xff); 4162306a36Sopenharmony_ci printf("\tcommand port = 0x%.4x\n", 4262306a36Sopenharmony_ci r.ebx & 0xffff); 4362306a36Sopenharmony_ci printf("\tcommand = 0x%.4x\n", 4462306a36Sopenharmony_ci (r.ebx >> 16) & 0xffff); 4562306a36Sopenharmony_ci printf("\tevent port = 0x%.8x\n", r.ecx); 4662306a36Sopenharmony_ci printf("\tflags = 0x%.8x\n", r.edx); 4762306a36Sopenharmony_ci if (((r.ebx >> 16) & 0xffff) != 0x82) { 4862306a36Sopenharmony_ci printf("non-default command value. If speedstep-smi " 4962306a36Sopenharmony_ci "doesn't work out of the box,\nyou may want to " 5062306a36Sopenharmony_ci "try out the default value by passing " 5162306a36Sopenharmony_ci "smi_cmd=0x82 to the module\n ON YOUR OWN " 5262306a36Sopenharmony_ci "RISK.\n"); 5362306a36Sopenharmony_ci } 5462306a36Sopenharmony_ci if ((r.ebx & 0xffff) != 0xb2) { 5562306a36Sopenharmony_ci printf("non-default command port. If speedstep-smi " 5662306a36Sopenharmony_ci "doesn't work out of the box,\nyou may want to " 5762306a36Sopenharmony_ci "try out the default value by passing " 5862306a36Sopenharmony_ci "smi_port=0x82 to the module\n ON YOUR OWN " 5962306a36Sopenharmony_ci "RISK.\n"); 6062306a36Sopenharmony_ci } 6162306a36Sopenharmony_ci } else { 6262306a36Sopenharmony_ci printf("BIOS DOES NOT support GSIC call. Dumping registers anyway:\n"); 6362306a36Sopenharmony_ci printf("eax = 0x%.8x\n", r.eax); 6462306a36Sopenharmony_ci printf("ebx = 0x%.8x\n", r.ebx); 6562306a36Sopenharmony_ci printf("ecx = 0x%.8x\n", r.ecx); 6662306a36Sopenharmony_ci printf("edx = 0x%.8x\n", r.edx); 6762306a36Sopenharmony_ci printf("Note also that some BIOS do not support the initial " 6862306a36Sopenharmony_ci "GSIC call, but the newer\nspeedstep-smi driver may " 6962306a36Sopenharmony_ci "work.\nFor this, you need to pass some arguments to " 7062306a36Sopenharmony_ci "the speedstep-smi driver:\n"); 7162306a36Sopenharmony_ci printf("\tsmi_cmd=0x?? smi_port=0x?? smi_sig=1\n"); 7262306a36Sopenharmony_ci printf("\nUnfortunately, you have to know what exactly are " 7362306a36Sopenharmony_ci "smi_cmd and smi_port, and this\nis system " 7462306a36Sopenharmony_ci "dependent.\n"); 7562306a36Sopenharmony_ci } 7662306a36Sopenharmony_ci return 1; 7762306a36Sopenharmony_ci} 78