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