Forums

Skip to content

Advanced search
  • Quick links
    • Unanswered topics
    • Active topics
    • Search
  • FAQ
  • Login
  • Register
  • Board index Assistance Kernel & Hardware
  • Search

user undervolting

Kernel not recognizing your hardware? Problems with power management or PCMCIA? What hardware is compatible with Gentoo? See here. (Only for kernels supported by Gentoo.)
Post Reply
Advanced search
340 posts
  • Page 4 of 14
    • Jump to page:
  • Previous
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • …
  • 14
  • Next
Author
Message
dkulp
n00b
n00b
Posts: 3
Joined: Thu Sep 29, 2005 4:25 pm

  • Quote

Post by dkulp » Thu Sep 29, 2005 10:06 pm

If you have one of the newer Dothans that run at 133Mhz front side bus instead of 100Mhz, more work needs to be done. A coupld of the calculations in the speedstep-centrino file asume it's a 100Mhz bus and thus various tools will show a wrong frequency or frequencies would be set wrong, etc...


For my 2.13Ghz Dothan, I've done:

Code: Select all

/* Define a new OP that figures out the appropriate multiplier for a 133Mhz bus */
#define OP133(mhz, mva, mvb, mvc, mvd)					\
	{								\
		.frequency = (mhz) * 1000,				\
		.index = (((mhz)/133) << 8) | ((mvc - 700) / 16)       	\
	}
static struct cpufreq_frequency_table dothan_2128[] =
{
    OP133(2128, 1132, 1132, 1132, 1132),
    OP133(1867, 1132, 1132, 1132, 1132),
    OP133(1600, 1116, 1116, 1116, 1116),
    OP133(1333, 1116, 1116, 1116, 1116),
    OP133(1067, 1084, 1084, 1084, 1084),
    OP133( 800, 750, 750, 750, 750),
    { .frequency = CPUFREQ_TABLE_END }
};

......
    DOTHAN(&cpu_ids[CPU_DOTHAN_C0], 2128, "2.13"),
......

Then in extract_clock, you need to do:

Code: Select all

    if ((centrino_cpu[cpu] == &cpu_ids[CPU_BANIAS]) ||
	    (centrino_cpu[cpu] == &cpu_ids[CPU_DOTHAN_A1]) ||
	    (centrino_cpu[cpu] == &cpu_ids[CPU_DOTHAN_B0])) {
        msr = (msr >> 8) & 0xff;
        return msr * 100000;
    } else if (centrino_cpu[cpu] == &cpu_ids[CPU_DOTHAN_C0]) {
        /* this is wrong.  CPU_DOTHAN_C0 can be on a 100Mhz bus or a 133Mhz bus.
            Is there a way to find out what the bus speed is?   If so, use it.  For me,
            I know my computer is 133, so hardcode it for now */
        msr = (msr >> 8) & 0xff;
        return msr * 133000;
    }
If you don't do that, then the frequencies get all messed up in the cpuinfo stuff.

Note: the above voltages are undervolted. The defaults from the ACPI table for the 2.13 Dothan are:

Code: Select all

static struct cpufreq_frequency_table dothan_2128[] =
{
	OP(2128, 1356, 1356, 1356, 1356),
	OP(1867, 1292, 1292, 1292, 1292),
	OP(1600, 1212, 1212, 1212, 1212),
	OP(1333, 1148, 1148, 1148, 1148),
	OP(1067, 1068, 1068, 1068, 1068),
	OP( 800, 988, 988, 988, 988),
	{ .frequency = CPUFREQ_TABLE_END }
};
Enjoy!
Dan
Top
schorsche
Apprentice
Apprentice
Posts: 230
Joined: Thu Jan 27, 2005 12:55 am

  • Quote

Post by schorsche » Fri Sep 30, 2005 4:33 am

I recompiled using your .c - file with the adapted (i.e. set to 700 mV) - values for my Dothan 1500 MHz CPU. The recompiling process shows that the .c - file is being compiled.
Nothing changes though since the cpu-fan switches itself on after I reboot into the new kernel, although I applyl a "powersave" to the scaling governor.
I know from Windows- Centrino Hardware Control that 700mV@600MHz don't get the fan to start, not even under
full load! In Linux it starts turning though, that's why I reckon it's not working.
BDW, cpufreq is an unknown command on my system, whith tools do I need to emerge?

Thanks
Top
knefas
l33t
l33t
User avatar
Posts: 828
Joined: Sun Dec 21, 2003 1:20 am

  • Quote

Post by knefas » Fri Sep 30, 2005 5:13 am

schorsche wrote:BDW, cpufreq is an unknown command on my system, whith tools do I need to emerge?

sys-power/cpufrequtils :)
Top
schorsche
Apprentice
Apprentice
Posts: 230
Joined: Thu Jan 27, 2005 12:55 am

  • Quote

Post by schorsche » Fri Sep 30, 2005 6:18 am

Ah I see what's the matter. "Powersave" steps it down to 8 but the multiplier should be 6.
How can I achive this?

Could this be a potential problem:

Code: Select all

#
# shared options
#
# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set
# CONFIG_X86_SPEEDSTEP_LIB is not set
Thanks
Top
schorsche
Apprentice
Apprentice
Posts: 230
Joined: Thu Jan 27, 2005 12:55 am

  • Quote

Post by schorsche » Fri Sep 30, 2005 10:17 am

rschwarze,

cpufreq-info shows:

Code: Select all

cpufrequtils 0.3: cpufreq-info (C) Dominik Brodowski 2004
Report errors and bugs to linux@brodo.de, please.
analyzing CPU 0:
  driver: acpi-cpufreq
  CPUs which need to switch frequency at the same time: 0
  hardware limits: 600 MHz - 1.50 GHz
  available frequency steps: 1.50 GHz, 600 MHz
  available cpufreq governors: conservative, powersave, userspace, performance
  current policy: frequency should be within 600 MHz and 1.50 GHz.
                  The governor "powersave" may decide which speed to use
                  within this range.
  current CPU frequency is 600 MHz.
It seems that I can only change between 600Hz and 1.5 GHZ.
Furthermore, cat /proc/cpuinfo shows my a stepping 8, does that correspond to a Sonoma CPU? On my Notebook there's a sticker which says Pentium M 715 processor,1.5 GHZ, 400MHz FSB - that's a Dothan isn't it?
Top
rschwarze
n00b
n00b
Posts: 63
Joined: Fri Jul 01, 2005 12:26 pm
Location: Germany

  • Quote

Post by rschwarze » Fri Sep 30, 2005 1:36 pm

yes, i think that's a dothan.

but the problem is:

your cpufreq-info shows that he is using "driver: acpi-cpufreq". that is wrong. it must be "driver: centrino".


so, i don't know what you are doing wrong, but the kernel uses acpi instead of the speedstep-centrino.c to get your frequency/voltage pairs.

do you config yout kernel with "make menuconfig"? do you follow the directions i had given before?

btw: which kernel are u using?
Top
schorsche
Apprentice
Apprentice
Posts: 230
Joined: Thu Jan 27, 2005 12:55 am

  • Quote

Post by schorsche » Sun Oct 02, 2005 10:04 am

Well that's weird. I'm using Kernel 2.6-12r4, so the latest ones.
Yes, I'm configuring my kernel manually, I copy System.map and bzImage to
/boot and start into the new kernel.
Why does cpu-info only show 2 possible steppings, that is 600 and 1500 MHz
but nothing in between?
That's my kernel-config:

Code: Select all

# APM (Advanced Power Management) BIOS Support
#
CONFIG_APM=y
# CONFIG_APM_IGNORE_USER_SUSPEND is not set
CONFIG_APM_DO_ENABLE=y
CONFIG_APM_CPU_IDLE=y
CONFIG_APM_DISPLAY_BLANK=y
CONFIG_APM_RTC_IS_GMT=y
# CONFIG_APM_ALLOW_INTS is not set
# CONFIG_APM_REAL_MODE_POWER_OFF is not set

#
# CPU Frequency scaling
#
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_TABLE=y
# CONFIG_CPU_FREQ_DEBUG is not set
CONFIG_CPU_FREQ_STAT=y
# CONFIG_CPU_FREQ_STAT_DETAILS is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
CONFIG_CPU_FREQ_GOV_USERSPACE=y
# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y

#
# CPUFreq processor drivers
#
CONFIG_X86_ACPI_CPUFREQ=y
# CONFIG_X86_POWERNOW_K6 is not set
# CONFIG_X86_POWERNOW_K7 is not set
# CONFIG_X86_POWERNOW_K8 is not set
# CONFIG_X86_GX_SUSPMOD is not set
CONFIG_X86_SPEEDSTEP_CENTRINO=y
# CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI is not set
CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE=y
# CONFIG_X86_SPEEDSTEP_ICH is not set
# CONFIG_X86_SPEEDSTEP_SMI is not set
# CONFIG_X86_P4_CLOCKMOD is not set
# CONFIG_X86_CPUFREQ_NFORCE2 is not set
# CONFIG_X86_LONGRUN is not set
# CONFIG_X86_LONGHAUL is not set

#
Hang on, I just realised the "CONFIG_X86_ACPI_CPUFREQ=y" option is set. That might be wrong. You mentioned all I have to unset is the "# CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI is not set " option.
I'll just recompile my kernel with ACPI_CPUFREQ unset
Top
rschwarze
n00b
n00b
Posts: 63
Joined: Fri Jul 01, 2005 12:26 pm
Location: Germany

  • Quote

Post by rschwarze » Sun Oct 02, 2005 6:02 pm

sorry, but i think its correct. here's mine. at the moment i'm using the "linux-2.6.12-suspend2-r6" kernel but it also works with "linux-2.6.12-gentoo-r10".

are you sure you have the speedstep-centrino at the right place in the kernel-source?

Code: Select all

#
# CPUFreq processor drivers
#
CONFIG_X86_ACPI_CPUFREQ=y
# CONFIG_X86_POWERNOW_K6 is not set
# CONFIG_X86_POWERNOW_K7 is not set
# CONFIG_X86_POWERNOW_K8 is not set
# CONFIG_X86_GX_SUSPMOD is not set
CONFIG_X86_SPEEDSTEP_CENTRINO=y
# CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI is not set
CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE=y
# CONFIG_X86_SPEEDSTEP_ICH is not set
# CONFIG_X86_SPEEDSTEP_SMI is not set
# CONFIG_X86_P4_CLOCKMOD is not set
# CONFIG_X86_CPUFREQ_NFORCE2 is not set
# CONFIG_X86_LONGRUN is not set
# CONFIG_X86_LONGHAUL is not set

#
# shared options
#
CONFIG_X86_ACPI_CPUFREQ_PROC_INTF=y
# CONFIG_X86_SPEEDSTEP_LIB is not set
Top
schorsche
Apprentice
Apprentice
Posts: 230
Joined: Thu Jan 27, 2005 12:55 am

  • Quote

Post by schorsche » Sun Oct 02, 2005 6:17 pm

Hmmm,
I recompiled the kernel with this opion unset:
# CONFIG_X86_ACPI_CPUFREQ is not set
Upon compilation, the msgs I get now don't mention speedstep-centrino.c now,
so I'll go with the old options.
One possible thing could be that I don't copy the image sources into the right place,
or they somehow don't get recognised by grub.
I try to explain what I did:
- swap the old c. - file with yours
- change the processor's voltage (M 715) to 700 mV (only the 600 MHz- values).

Recompile- kernel takes the speedstep - file into account!
Copy bzImage and System.map to boot - Sector

Restart the new kernel (well hopefully, I'm gonna check right now).

Any ideas?
BDW, in Windos (Centrino Hardware Control) I set the Multiplier to 6 and the Voltage to 700 mV @ 600 Mhz. the fan never turns on. In Linux it does, so apparently something dodgy here. So can it be anything with wrong setting in the c- File, e.g. wrong FSB- speed etc?

thanks
Top
rschwarze
n00b
n00b
Posts: 63
Joined: Fri Jul 01, 2005 12:26 pm
Location: Germany

  • Quote

Post by rschwarze » Sun Oct 02, 2005 6:20 pm

yeah, if cpufreq-info doesn't show te right steps and so on, the kernel is not using the speedstep-centrino file at all. i don't know why. maybe you really boot with the wrong kernel?
Top
beatryder
Veteran
Veteran
User avatar
Posts: 1138
Joined: Fri Apr 08, 2005 12:27 am
Contact:
Contact beatryder
Website

  • Quote

Post by beatryder » Sun Oct 02, 2005 6:22 pm

I have been playing with some of this stuff,

And getting well, very strange results...
I can get my speeds down to 533Mhz, thats a 1x multiplier, but for some strange reason the fastest the performace governor will choose is 1.2Ghz

I have the 1.6Ghz Sonoma(Dothan I guess) cpu, 133Mhz FSB
Dont make it idiot proof, make it work.
Neucode.org
<suppressed key>
Top
rschwarze
n00b
n00b
Posts: 63
Joined: Fri Jul 01, 2005 12:26 pm
Location: Germany

  • Quote

Post by rschwarze » Sun Oct 02, 2005 6:35 pm

if you have a sonoma cpu, you don't have a dothan cpu ;)

i think you should lookat the posting above which tells how to change the frontsidebus.
Top
beatryder
Veteran
Veteran
User avatar
Posts: 1138
Joined: Fri Apr 08, 2005 12:27 am
Contact:
Contact beatryder
Website

  • Quote

Post by beatryder » Sun Oct 02, 2005 7:02 pm

Hmm, well, you are 1/2 right

Sonoma is the codename for the new PCI Express chipset, which I have, which runs the dothan CPU's.

Correct me if I am wrong?
Dont make it idiot proof, make it work.
Neucode.org
<suppressed key>
Top
rschwarze
n00b
n00b
Posts: 63
Joined: Fri Jul 01, 2005 12:26 pm
Location: Germany

  • Quote

Post by rschwarze » Sun Oct 02, 2005 8:35 pm

ok, maybe.

but with a 133 frontsidebus you habe a sonoma or a sonoma-dothan or whatever ;)

but you have to make the frontsidebuschange in the speedstep centrino.

i thnk it would be nice, if someone can change the speedstep-centrino in that way that it works with every sonoma and dothan processor.

than you can post a link to it here. that would help several people i think.
Top
beatryder
Veteran
Veteran
User avatar
Posts: 1138
Joined: Fri Apr 08, 2005 12:27 am
Contact:
Contact beatryder
Website

  • Quote

Post by beatryder » Sun Oct 02, 2005 10:48 pm

that is precisely what I am hoping for
Dont make it idiot proof, make it work.
Neucode.org
<suppressed key>
Top
schorsche
Apprentice
Apprentice
Posts: 230
Joined: Thu Jan 27, 2005 12:55 am

  • Quote

Post by schorsche » Mon Oct 03, 2005 11:42 am

EUREKA!

Got it as well, no more annoying fan-noise!
BetterUnborn sent me his file and I adapted the values to my CPU.

Have a nice one!
Top
beatryder
Veteran
Veteran
User avatar
Posts: 1138
Joined: Fri Apr 08, 2005 12:27 am
Contact:
Contact beatryder
Website

  • Quote

Post by beatryder » Mon Oct 03, 2005 2:03 pm

could you post your working .c file?
Dont make it idiot proof, make it work.
Neucode.org
<suppressed key>
Top
schorsche
Apprentice
Apprentice
Posts: 230
Joined: Thu Jan 27, 2005 12:55 am

  • Quote

Post by schorsche » Tue Oct 04, 2005 3:26 am

Here we go:

Code: Select all

/*
 * cpufreq driver for Enhanced SpeedStep, as found in Intel's Pentium
 * M (part of the Centrino chipset).
 *
 * Despite the "SpeedStep" in the name, this is almost entirely unlike
 * traditional SpeedStep.
 *
 * Modelled on speedstep.c
 *
 * Copyright (C) 2003 Jeremy Fitzhardinge <jeremy@goop.org>
 *
 * WARNING WARNING WARNING
 *
 * This driver manipulates the PERF_CTL MSR, which is only somewhat
 * documented.  While it seems to work on my laptop, it has not been
 * tested anywhere else, and it may not work for you, do strange
 * things or simply crash.
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/cpufreq.h>
#include <linux/config.h>
#include <linux/delay.h>
#include <linux/compiler.h>

#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
#include <linux/acpi.h>
#include <acpi/processor.h>
#endif

#include <asm/msr.h>
#include <asm/processor.h>
#include <asm/cpufeature.h>

#include "speedstep-est-common.h"

#define PFX		"speedstep-centrino: "
#define MAINTAINER	"Jeremy Fitzhardinge <jeremy@goop.org>"

#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "speedstep-centrino", msg)


struct cpu_id
{
	__u8	x86;            /* CPU family */
	__u8	x86_model;	/* model */
	__u8	x86_mask;	/* stepping */
};

enum {
	CPU_BANIAS,
	CPU_DOTHAN_A1,
	CPU_DOTHAN_A2,
	CPU_DOTHAN_B0,
	CPU_DOTHAN_C0,
	CPU_MP4HT_D0,
};

static const struct cpu_id cpu_ids[] = {
	[CPU_BANIAS]	= { 6,  9, 5 },
	[CPU_DOTHAN_A1]	= { 6, 13, 1 },
	[CPU_DOTHAN_A2]	= { 6, 13, 2 },
	[CPU_DOTHAN_B0]	= { 6, 13, 6 },
	[CPU_DOTHAN_C0] = { 6, 13, 8 },
	[CPU_MP4HT_D0]	= {15,  3, 4 },
};
#define N_IDS	(sizeof(cpu_ids)/sizeof(cpu_ids[0]))

struct cpu_model
{
	const struct cpu_id *cpu_id;
	const char	*model_name;
	unsigned	max_freq; /* max clock in kHz */

	struct cpufreq_frequency_table *op_points; /* clock/voltage pairs */
};
static int centrino_verify_cpu_id(const struct cpuinfo_x86 *c, const struct cpu_id *x);

/* Operating points for current CPU */
static struct cpu_model *centrino_model[NR_CPUS];
static const struct cpu_id *centrino_cpu[NR_CPUS];

static struct cpufreq_driver centrino_driver;

#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE

/* Computes the correct form for IA32_PERF_CTL MSR for a particular
   frequency/voltage operating point; frequency in MHz, volts in mV.
   This is stored as "index" in the structure. */
#define OP(mhz, mv)							\
	{								\
		.frequency = (mhz) * 1000,				\
		.index = (((mhz)/100) << 8) | ((mv - 700) / 16)		\
	}

/*
 * These voltage tables were derived from the Intel Pentium M
 * datasheet, document 25261202.pdf, Table 5.  I have verified they
 * are consistent with my IBM ThinkPad X31, which has a 1.3GHz Pentium
 * M.
 */

/* Ultra Low Voltage Intel Pentium M processor 900MHz (Banias) */
static struct cpufreq_frequency_table banias_900[] =
{
	OP(600,  844),
	OP(800,  988),
	OP(900, 1004),
	{ .frequency = CPUFREQ_TABLE_END }
};

/* Ultra Low Voltage Intel Pentium M processor 1000MHz (Banias) */
static struct cpufreq_frequency_table banias_1000[] =
{
	OP(600,   844),
	OP(800,   972),
	OP(900,   988),
	OP(1000, 1004),
	{ .frequency = CPUFREQ_TABLE_END }
};

/* Low Voltage Intel Pentium M processor 1.10GHz (Banias) */
static struct cpufreq_frequency_table banias_1100[] =
{
	OP( 600,  956),
	OP( 800, 1020),
	OP( 900, 1100),
	OP(1000, 1164),
	OP(1100, 1180),
	{ .frequency = CPUFREQ_TABLE_END }
};


/* Low Voltage Intel Pentium M processor 1.20GHz (Banias) */
static struct cpufreq_frequency_table banias_1200[] =
{
	OP( 600,  956),
	OP( 800, 1004),
	OP( 900, 1020),
	OP(1000, 1100),
	OP(1100, 1164),
	OP(1200, 1180),
	{ .frequency = CPUFREQ_TABLE_END }
};

/* Intel Pentium M processor 1.30GHz (Banias) */
static struct cpufreq_frequency_table banias_1300[] =
{
	OP( 600,  956),
	OP( 800, 1260),
	OP(1000, 1292),
	OP(1200, 1356),
	OP(1300, 1388),
	{ .frequency = CPUFREQ_TABLE_END }
};

/* Intel Pentium M processor 1.40GHz (Banias) */
static struct cpufreq_frequency_table banias_1400[] =
{
	OP( 600,  956),
	OP( 800, 1180),
	OP(1000, 1308),
	OP(1200, 1436),
	OP(1400, 1484),
	{ .frequency = CPUFREQ_TABLE_END }
};

/* Intel Pentium M processor 1.50GHz (Banias) */
static struct cpufreq_frequency_table banias_1500[] =
{
	OP( 600,  956),
	OP( 800, 1116),
	OP(1000, 1228),
	OP(1200, 1356),
	OP(1400, 1452),
	OP(1500, 1484),
	{ .frequency = CPUFREQ_TABLE_END }
};

/* Intel Pentium M processor 1.60GHz (Banias) */
static struct cpufreq_frequency_table banias_1600[] =
{
	OP( 600,  956),
	OP( 800, 1036),
	OP(1000, 1164),
	OP(1200, 1276),
	OP(1400, 1420),
	OP(1600, 1484),
	{ .frequency = CPUFREQ_TABLE_END }
};

/* Intel Pentium M processor 1.70GHz (Banias) */
static struct cpufreq_frequency_table banias_1700[] =
{
	OP( 600,  956),
	OP( 800, 1004),
	OP(1000, 1116),
	OP(1200, 1228),
	OP(1400, 1308),
	OP(1700, 1484),
	{ .frequency = CPUFREQ_TABLE_END }
};
#undef OP


/* Dothan processor datasheet 30218903.pdf defines 4 voltages for each
frequency (VID#A through VID#D) - this macro allows us to define all
of these but we only use the VID#C voltages at compile time - this may
need some work if we want to select the voltage profile at runtime. */

#define OP(mhz, mva, mvb, mvc, mvd) \
{ \
.frequency = (mhz) * 1000, \
.index = (((mhz)/100) << 8) | ((mvc - 700) / 16) \
}

/* Intel Pentium M processor 730 / 1.60GHz (Dothan) */
static struct cpufreq_frequency_table dothan_1500[] =
{
 OP( 600,  700,  700,  700,  700), 
 OP( 800, 1068, 1068, 1068, 1052),
 OP(1000, 1148, 1148, 1132, 1116),
 OP(1200, 1228, 1212, 1212, 1180),
 OP(1500, 1340, 1324, 1308, 1276),
 { .frequency = CPUFREQ_TABLE_END } 
};
#undef OP

#define _BANIAS(cpuid, max, name)	\
{	.cpu_id		= cpuid,	\
	.model_name	= "Intel(R) Pentium(R) M processor " name "MHz", \
	.max_freq	= (max)*1000,	\
	.op_points	= banias_##max,	\
}
#define BANIAS(max)	_BANIAS(&cpu_ids[CPU_BANIAS], max, #max)

#define DOTHAN(cpuid, max, name) \
{ .cpu_id = cpuid, \
.model_name = "Intel(R) Pentium(R) M processor " name "GHz", \
.max_freq = (max)*1000, \
.op_points = dothan_1500, \
}

/* CPU models, their operating frequency range, and freq/voltage
   operating points */
static struct cpu_model models[] =
{
	_BANIAS(&cpu_ids[CPU_BANIAS], 900, " 900"),
	BANIAS(1000),
	BANIAS(1100),
	BANIAS(1200),
	BANIAS(1300),
	BANIAS(1400),
	BANIAS(1500),
	BANIAS(1600),
	BANIAS(1700),
	DOTHAN(&cpu_ids[CPU_DOTHAN_C0],1500,"1.50"),
	DOTHAN(&cpu_ids[CPU_DOTHAN_C0],1499,"1.50"),
	DOTHAN(&cpu_ids[CPU_DOTHAN_C0],1498,"1.50"),
	DOTHAN(&cpu_ids[CPU_DOTHAN_C0],1497,"1.50"),
	DOTHAN(&cpu_ids[CPU_DOTHAN_C0],1496,"1.50"),

	/* NULL model_name is a wildcard */
	{ &cpu_ids[CPU_DOTHAN_A1], NULL, 0, NULL },
	{ &cpu_ids[CPU_DOTHAN_A2], NULL, 0, NULL },
	{ &cpu_ids[CPU_DOTHAN_B0], NULL, 0, NULL },
	{ &cpu_ids[CPU_DOTHAN_C0], NULL, 0, NULL },
	{ &cpu_ids[CPU_MP4HT_D0], NULL, 0, NULL },

	{ NULL, }
};
#undef _BANIAS
#undef BANIAS
#undef DOTHAN

static int centrino_cpu_init_table(struct cpufreq_policy *policy)
{
	struct cpuinfo_x86 *cpu = &cpu_data[policy->cpu];
	struct cpu_model *model;

	for(model = models; model->cpu_id != NULL; model++)
		if (centrino_verify_cpu_id(cpu, model->cpu_id) &&
		    (model->model_name == NULL ||
		     strcmp(cpu->x86_model_id, model->model_name) == 0))
			break;

	if (model->cpu_id == NULL) {
		/* No match at all */
		dprintk(KERN_INFO PFX "no support for CPU model \"%s\": "
		       "send /proc/cpuinfo to " MAINTAINER "\n",
		       cpu->x86_model_id);
		return -ENOENT;
	}

	if (model->op_points == NULL) {
		/* Matched a non-match */
		dprintk(KERN_INFO PFX "no table support for CPU model \"%s\": \n",
		       cpu->x86_model_id);
#ifndef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
		dprintk(KERN_INFO PFX "try compiling with CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI enabled\n");
#endif
		return -ENOENT;
	}

	centrino_model[policy->cpu] = model;

	dprintk("found \"%s\": max frequency: %dkHz\n",
	       model->model_name, model->max_freq);

	return 0;
}

#else
static inline int centrino_cpu_init_table(struct cpufreq_policy *policy) { return -ENODEV; }
#endif /* CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE */

static int centrino_verify_cpu_id(const struct cpuinfo_x86 *c, const struct cpu_id *x)
{
	if ((c->x86 == x->x86) &&
	    (c->x86_model == x->x86_model) &&
	    (c->x86_mask == x->x86_mask))
		return 1;
	return 0;
}

/* To be called only after centrino_model is initialized */
static unsigned extract_clock(unsigned msr, unsigned int cpu, int failsafe)
{
	int i;

	/*
	 * Extract clock in kHz from PERF_CTL value
	 * for centrino, as some DSDTs are buggy.
	 * Ideally, this can be done using the acpi_data structure.
	 */
	if ((centrino_cpu[cpu] == &cpu_ids[CPU_BANIAS]) ||
	    (centrino_cpu[cpu] == &cpu_ids[CPU_DOTHAN_A1]) ||
	    (centrino_cpu[cpu] == &cpu_ids[CPU_DOTHAN_A2]) ||
	    (centrino_cpu[cpu] == &cpu_ids[CPU_DOTHAN_B0])) {
		msr = (msr >> 8) & 0xff;
		return msr * 100000;
	}

	if ((!centrino_model[cpu]) || (!centrino_model[cpu]->op_points))
		return 0;

	msr &= 0xffff;
	for (i=0;centrino_model[cpu]->op_points[i].frequency != CPUFREQ_TABLE_END; i++) {
		if (msr == centrino_model[cpu]->op_points[i].index)
			return centrino_model[cpu]->op_points[i].frequency;
	}
	if (failsafe)
		return centrino_model[cpu]->op_points[i-1].frequency;
	else
		return 0;
}

/* Return the current CPU frequency in kHz */
static unsigned int get_cur_freq(unsigned int cpu)
{
	unsigned l, h;
	unsigned clock_freq;
	cpumask_t saved_mask;

	saved_mask = current->cpus_allowed;
	set_cpus_allowed(current, cpumask_of_cpu(cpu));
	if (smp_processor_id() != cpu)
		return 0;

	rdmsr(MSR_IA32_PERF_STATUS, l, h);
	clock_freq = extract_clock(l, cpu, 0);

	if (unlikely(clock_freq == 0)) {
		/*
		 * On some CPUs, we can see transient MSR values (which are
		 * not present in _PSS), while CPU is doing some automatic
		 * P-state transition (like TM2). Get the last freq set 
		 * in PERF_CTL.
		 */
		rdmsr(MSR_IA32_PERF_CTL, l, h);
		clock_freq = extract_clock(l, cpu, 1);
	}

	set_cpus_allowed(current, saved_mask);
	return clock_freq;
}


#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI

static struct acpi_processor_performance p;

/*
 * centrino_cpu_init_acpi - register with ACPI P-States library
 *
 * Register with the ACPI P-States library (part of drivers/acpi/processor.c)
 * in order to determine correct frequency and voltage pairings by reading
 * the _PSS of the ACPI DSDT or SSDT tables.
 */
static int centrino_cpu_init_acpi(struct cpufreq_policy *policy)
{
	union acpi_object		arg0 = {ACPI_TYPE_BUFFER};
	u32				arg0_buf[3];
	struct acpi_object_list		arg_list = {1, &arg0};
	unsigned long			cur_freq;
	int				result = 0, i;
	unsigned int			cpu = policy->cpu;

	/* _PDC settings */
	arg0.buffer.length = 12;
	arg0.buffer.pointer = (u8 *) arg0_buf;
	arg0_buf[0] = ACPI_PDC_REVISION_ID;
	arg0_buf[1] = 1;
	arg0_buf[2] = ACPI_PDC_EST_CAPABILITY_SMP | ACPI_PDC_EST_CAPABILITY_MSR;

	p.pdc = &arg_list;

	/* register with ACPI core */
	if (acpi_processor_register_performance(&p, cpu)) {
		dprintk(KERN_INFO PFX "obtaining ACPI data failed\n");
		return -EIO;
	}

	/* verify the acpi_data */
	if (p.state_count <= 1) {
		dprintk("No P-States\n");
		result = -ENODEV;
		goto err_unreg;
	}

	if ((p.control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) ||
	    (p.status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) {
		dprintk("Invalid control/status registers (%x - %x)\n",
			p.control_register.space_id, p.status_register.space_id);
		result = -EIO;
		goto err_unreg;
	}

	for (i=0; i<p.state_count; i++) {
		if (p.states[i].control != p.states[i].status) {
			dprintk("Different control (%x) and status values (%x)\n",
				p.states[i].control, p.states[i].status);
			result = -EINVAL;
			goto err_unreg;
		}

		if (!p.states[i].core_frequency) {
			dprintk("Zero core frequency for state %u\n", i);
			result = -EINVAL;
			goto err_unreg;
		}

		if (p.states[i].core_frequency > p.states[0].core_frequency) {
			dprintk("P%u has larger frequency (%u) than P0 (%u), skipping\n", i,
				p.states[i].core_frequency, p.states[0].core_frequency);
			p.states[i].core_frequency = 0;
			continue;
		}
	}

	centrino_model[cpu] = kmalloc(sizeof(struct cpu_model), GFP_KERNEL);
	if (!centrino_model[cpu]) {
		result = -ENOMEM;
		goto err_unreg;
	}
	memset(centrino_model[cpu], 0, sizeof(struct cpu_model));

	centrino_model[cpu]->model_name=NULL;
	centrino_model[cpu]->max_freq = p.states[0].core_frequency * 1000;
	centrino_model[cpu]->op_points =  kmalloc(sizeof(struct cpufreq_frequency_table) *
					     (p.state_count + 1), GFP_KERNEL);
        if (!centrino_model[cpu]->op_points) {
                result = -ENOMEM;
                goto err_kfree;
        }

        for (i=0; i<p.state_count; i++) {
		centrino_model[cpu]->op_points[i].index = p.states[i].control;
		centrino_model[cpu]->op_points[i].frequency = p.states[i].core_frequency * 1000;
		dprintk("adding state %i with frequency %u and control value %04x\n", 
			i, centrino_model[cpu]->op_points[i].frequency, centrino_model[cpu]->op_points[i].index);
	}
	centrino_model[cpu]->op_points[p.state_count].frequency = CPUFREQ_TABLE_END;

	cur_freq = get_cur_freq(cpu);

	for (i=0; i<p.state_count; i++) {
		if (!p.states[i].core_frequency) {
			dprintk("skipping state %u\n", i);
			centrino_model[cpu]->op_points[i].frequency = CPUFREQ_ENTRY_INVALID;
			continue;
		}
		
		if (extract_clock(centrino_model[cpu]->op_points[i].index, cpu, 0) !=
		    (centrino_model[cpu]->op_points[i].frequency)) {
			dprintk("Invalid encoded frequency (%u vs. %u)\n",
				extract_clock(centrino_model[cpu]->op_points[i].index, cpu, 0),
				centrino_model[cpu]->op_points[i].frequency);
			result = -EINVAL;
			goto err_kfree_all;
		}

		if (cur_freq == centrino_model[cpu]->op_points[i].frequency)
			p.state = i;
	}

	/* notify BIOS that we exist */
	acpi_processor_notify_smm(THIS_MODULE);

	return 0;

 err_kfree_all:
	kfree(centrino_model[cpu]->op_points);
 err_kfree:
	kfree(centrino_model[cpu]);
 err_unreg:
	acpi_processor_unregister_performance(&p, cpu);
	dprintk(KERN_INFO PFX "invalid ACPI data\n");
	return (result);
}
#else
static inline int centrino_cpu_init_acpi(struct cpufreq_policy *policy) { return -ENODEV; }
#endif

static int centrino_cpu_init(struct cpufreq_policy *policy)
{
	struct cpuinfo_x86 *cpu = &cpu_data[policy->cpu];
	unsigned freq;
	unsigned l, h;
	int ret;
	int i;

	/* Only Intel makes Enhanced Speedstep-capable CPUs */
	if (cpu->x86_vendor != X86_VENDOR_INTEL || !cpu_has(cpu, X86_FEATURE_EST))
		return -ENODEV;

	for (i = 0; i < N_IDS; i++)
		if (centrino_verify_cpu_id(cpu, &cpu_ids[i]))
			break;

	if (i != N_IDS)
		centrino_cpu[policy->cpu] = &cpu_ids[i];

	if (is_const_loops_cpu(policy->cpu)) {
		centrino_driver.flags |= CPUFREQ_CONST_LOOPS;
	}

	if (centrino_cpu_init_acpi(policy)) {
		if (policy->cpu != 0)
			return -ENODEV;

		if (!centrino_cpu[policy->cpu]) {
			dprintk(KERN_INFO PFX "found unsupported CPU with "
			"Enhanced SpeedStep: send /proc/cpuinfo to "
			MAINTAINER "\n");
			return -ENODEV;
		}

		if (centrino_cpu_init_table(policy)) {
			return -ENODEV;
		}
	}

	/* Check to see if Enhanced SpeedStep is enabled, and try to
	   enable it if not. */
	rdmsr(MSR_IA32_MISC_ENABLE, l, h);

	if (!(l & (1<<16))) {
		l |= (1<<16);
		dprintk("trying to enable Enhanced SpeedStep (%x)\n", l);
		wrmsr(MSR_IA32_MISC_ENABLE, l, h);

		/* check to see if it stuck */
		rdmsr(MSR_IA32_MISC_ENABLE, l, h);
		if (!(l & (1<<16))) {
			printk(KERN_INFO PFX "couldn't enable Enhanced SpeedStep\n");
			return -ENODEV;
		}
	}

	freq = get_cur_freq(policy->cpu);

	policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
	policy->cpuinfo.transition_latency = 10000; /* 10uS transition latency */
	policy->cur = freq;

	dprintk("centrino_cpu_init: cur=%dkHz\n", policy->cur);

	ret = cpufreq_frequency_table_cpuinfo(policy, centrino_model[policy->cpu]->op_points);
	if (ret)
		return (ret);

	cpufreq_frequency_table_get_attr(centrino_model[policy->cpu]->op_points, policy->cpu);

	return 0;
}

static int centrino_cpu_exit(struct cpufreq_policy *policy)
{
	unsigned int cpu = policy->cpu;

	if (!centrino_model[cpu])
		return -ENODEV;

	cpufreq_frequency_table_put_attr(cpu);

#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
	if (!centrino_model[cpu]->model_name) {
		dprintk("unregistering and freeing ACPI data\n");
		acpi_processor_unregister_performance(&p, cpu);
		kfree(centrino_model[cpu]->op_points);
		kfree(centrino_model[cpu]);
	}
#endif

	centrino_model[cpu] = NULL;

	return 0;
}

/**
 * centrino_verify - verifies a new CPUFreq policy
 * @policy: new policy
 *
 * Limit must be within this model's frequency range at least one
 * border included.
 */
static int centrino_verify (struct cpufreq_policy *policy)
{
	return cpufreq_frequency_table_verify(policy, centrino_model[policy->cpu]->op_points);
}

/**
 * centrino_setpolicy - set a new CPUFreq policy
 * @policy: new policy
 * @target_freq: the target frequency
 * @relation: how that frequency relates to achieved frequency (CPUFREQ_RELATION_L or CPUFREQ_RELATION_H)
 *
 * Sets a new CPUFreq policy.
 */
static int centrino_target (struct cpufreq_policy *policy,
			    unsigned int target_freq,
			    unsigned int relation)
{
	unsigned int    newstate = 0;
	unsigned int	msr, oldmsr, h, cpu = policy->cpu;
	struct cpufreq_freqs	freqs;
	cpumask_t		saved_mask;
	int			retval;

	if (centrino_model[cpu] == NULL)
		return -ENODEV;

	/*
	 * Support for SMP systems.
	 * Make sure we are running on the CPU that wants to change frequency
	 */
	saved_mask = current->cpus_allowed;
	set_cpus_allowed(current, policy->cpus);
	if (!cpu_isset(smp_processor_id(), policy->cpus)) {
		dprintk("couldn't limit to CPUs in this domain\n");
		return(-EAGAIN);
	}

	if (cpufreq_frequency_table_target(policy, centrino_model[cpu]->op_points, target_freq,
					   relation, &newstate)) {
		retval = -EINVAL;
		goto migrate_end;
	}

	msr = centrino_model[cpu]->op_points[newstate].index;
	rdmsr(MSR_IA32_PERF_CTL, oldmsr, h);

	if (msr == (oldmsr & 0xffff)) {
		retval = 0;
		dprintk("no change needed - msr was and needs to be %x\n", oldmsr);
		goto migrate_end;
	}

	freqs.cpu = cpu;
	freqs.old = extract_clock(oldmsr, cpu, 0);
	freqs.new = extract_clock(msr, cpu, 0);

	dprintk("target=%dkHz old=%d new=%d msr=%04x\n",
		target_freq, freqs.old, freqs.new, msr);

	cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);

	/* all but 16 LSB are "reserved", so treat them with
	   care */
	oldmsr &= ~0xffff;
	msr &= 0xffff;
	oldmsr |= msr;

	wrmsr(MSR_IA32_PERF_CTL, oldmsr, h);

	cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);

	retval = 0;
migrate_end:
	set_cpus_allowed(current, saved_mask);
	return (retval);
}

static struct freq_attr* centrino_attr[] = {
	&cpufreq_freq_attr_scaling_available_freqs,
	NULL,
};

static struct cpufreq_driver centrino_driver = {
	.name		= "centrino", /* should be speedstep-centrino,
					 but there's a 16 char limit */
	.init		= centrino_cpu_init,
	.exit		= centrino_cpu_exit,
	.verify		= centrino_verify,
	.target		= centrino_target,
	.get		= get_cur_freq,
	.attr           = centrino_attr,
	.owner		= THIS_MODULE,
};


/**
 * centrino_init - initializes the Enhanced SpeedStep CPUFreq driver
 *
 * Initializes the Enhanced SpeedStep support. Returns -ENODEV on
 * unsupported devices, -ENOENT if there's no voltage table for this
 * particular CPU model, -EINVAL on problems during initiatization,
 * and zero on success.
 *
 * This is quite picky.  Not only does the CPU have to advertise the
 * "est" flag in the cpuid capability flags, we look for a specific
 * CPU model and stepping, and we need to have the exact model name in
 * our voltage tables.  That is, be paranoid about not releasing
 * someone's valuable magic smoke.
 */
static int __init centrino_init(void)
{
	struct cpuinfo_x86 *cpu = cpu_data;

	if (!cpu_has(cpu, X86_FEATURE_EST))
		return -ENODEV;

	return cpufreq_register_driver(&centrino_driver);
}

static void __exit centrino_exit(void)
{
	cpufreq_unregister_driver(&centrino_driver);
}

MODULE_AUTHOR ("Jeremy Fitzhardinge <jeremy@goop.org>");
MODULE_DESCRIPTION ("Enhanced SpeedStep driver for Intel Pentium M processors.");
MODULE_LICENSE ("GPL");

late_initcall(centrino_init);
module_exit(centrino_exit);
Top
jlinkels
n00b
n00b
Posts: 8
Joined: Fri Oct 07, 2005 12:09 pm

  • Quote

Post by jlinkels » Fri Oct 07, 2005 1:15 pm

dkulp,

It makes a lot of sense what you say. However, I am surprised about the lack of replies to your post, acknowledging or denying what you say. I have a 133 MHz Sonoma myself, and I am worried about the power consumption as well.

I am trying to find out whether or not it is applicable what you say.

The value for "index" calculated in the OP macro is written to the IA32_PERF_CTL register. If you divide by 100 instead of 133, this value is too high. I am wondering whether the processor itself knows it runs at 133 and compensates for this value automatically.

Where did you find the values which have to be written to IA32_PERF_CTL? I have checked the Intel System Programmers manual (253668), but I could not find an explanation. Just the description of the register.

Also, a more general question. Intel stated frequency/voltage pairs in their datasheets for 100 MHz processors. The numbers of datasheets are 252665, 252612, 302029, 302189. The only datasheet I found about the 533 FSB processor was 305262. Unlike the datasheet for the Pentium M, freq/voltage pairs are lacking. Did anyone find those freq/volt pairs for the 533 FSB processors?

jlinkels
Top
dkulp
n00b
n00b
Posts: 3
Joined: Thu Sep 29, 2005 4:25 pm

  • Quote

Post by dkulp » Fri Oct 07, 2005 3:38 pm

jlinkels,

For my 2.13Ghz Dothan, I kind of cheated. I modified the speedstep-centrino.c file to printout the table queried from ACPI. Basically, stuck a bunch of printk(KERN_WARN "...."); type things in centrino_cpu_init_acpi. I then compiled the kernel with the "use acpi tables" thing enabled, and rebooted. That got me the base table to start from. Once you have the Hex values from the table, it was easy to figure out that the multipliers need to be from a 133Mhz base instead of the 100Mhz.

The Dothan chips, when presented with a multiplier that is too high pretty much just set themselves to their highest setting. Thus, that wasn't much of an issue. The problem was, I couldn't get it to go to 800Mhz as the 800Mhz entry had a much higher multiplier. Also, cpufreqinfo (and cat /proc/cpuinfo) ended up returning wacky results (at one point, it said it was running at 2.7Ghz, there was now way). It all came down to the hard coded 100Mhz values.

In anycase, I didn't look at any of the Intel docs. I just queried the ACPI table to give me the basic starting point numbers, then went from there. (Basically, grep 100 * and adjusted the 100's to 133's when it made sense).


Enjoy!
Dan
Top
beatryder
Veteran
Veteran
User avatar
Posts: 1138
Joined: Fri Apr 08, 2005 12:27 am
Contact:
Contact beatryder
Website

  • Quote

Post by beatryder » Fri Oct 07, 2005 4:39 pm

has anyone attempted to contact Linus or Andrew about this? Theses new cpus should be supported.
Dont make it idiot proof, make it work.
Neucode.org
<suppressed key>
Top
dgaffuri
Advocate
Advocate
Posts: 2078
Joined: Sun Jun 05, 2005 12:44 am
Location: Italy

  • Quote

Post by dgaffuri » Sat Oct 08, 2005 12:00 am

Guys,

why don't you post changes to speedstep_centrino.c as patches instead of posting the whole source?
Adopt an unanswered post
If you feel that your problem has been solved please edit the top post and add [solved] to the subject
Top
lsm
n00b
n00b
Posts: 30
Joined: Tue Aug 31, 2004 11:10 pm

Intel Pentium M 760 2.0GHz 533MHz FSB, 2MB Cache

  • Quote

Post by lsm » Sat Oct 08, 2005 5:43 pm

Is there any extra mileage from an undervolting hack on the latest mobile cpu processors?

Like the Intel Pentium M 760 2.0GHz 533MHz FSB, 2MB Cache?

That latest VAIO FS's sport the M 760/780, with a 533MHz front-side bus.

Out of the box with the ACPI derived tables turned "on" in the kernel, you get:

>cpufreq-info
cpufrequtils 0.3: cpufreq-info (C) Dominik Brodowski 2004
Report errors and bugs to linux@brodo.de, please.
analyzing CPU 0:
driver: centrino
CPUs which need to switch frequency at the same time: 0
hardware limits: 800 MHz - 2.00 GHz
available frequency steps: 2.00 GHz, 1.60 GHz, 1.33 GHz, 1.07 GHz, 800 MHz
available cpufreq governors: conservative, ondemand, powersave, userspace, performance
current policy: frequency should be within 800 MHz and 2.00 GHz.
The governor "ondemand" may decide which speed to use
within this range.
current CPU frequency is 800 MHz (asserted by call to hardware).

Is an undervolting hack feasible (or dare I say, advisable) here? How would you construct the table entries if you go this route in the kernel:

# CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI is not set
CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE=y

Thanks.
Top
beatryder
Veteran
Veteran
User avatar
Posts: 1138
Joined: Fri Apr 08, 2005 12:27 am
Contact:
Contact beatryder
Website

  • Quote

Post by beatryder » Sat Oct 08, 2005 6:05 pm

This is what I have been wondering lately, as I have a 730 (1.6Ghz 533 FSB), and i have gotten, very strange results.
Dont make it idiot proof, make it work.
Neucode.org
<suppressed key>
Top
jlinkels
n00b
n00b
Posts: 8
Joined: Fri Oct 07, 2005 12:09 pm

  • Quote

Post by jlinkels » Sun Oct 09, 2005 10:21 pm

I added the tables for my processor (Dothan_C0, a.k.a. Sonoma) to the speedstep-centrino.c file, and re-compiled the kernel. Still have some side problems, but the most important is that the speedstep-centrino file IS used. I do see the correct info with cpufreq-info.

However, once I know that my speedstep-centrino.c file is good and actually used, I would like to experiment with different undervolting values. I know how to create those tables in speedstep-centrino.c, but is there a way to call a certain frequency/voltage pair from the outside? (user space).

e.g. can I have in my speedstep-centrino.c something like this:

Code: Select all

static struct cpufreq_frequency_table dothan_1867[] =
{
        OP( 800, 760, 760, 760, 760),
        OP( 800, 800, 800, 800, 800),
        OP( 800, 880, 880, 880, 880),
        OP(1333, 1010, 1010, 1010, 1010),
        OP(1867, 1120, 1120, 1120, 1120),
        { .frequency = CPUFREQ_TABLE_END }
};
and somehow tweak the voltage?

Or should I enter the values in the table and recompile the kernel every time and try to see what is happening? That would be a tedious approach.

As I understand, minimum voltages may vary from one processor to the other, so using someone else's value might not be of much use.

If someone believes differently, do you have a freq/volt table for a Sonoma 1.86 with 533 FSB?

jlinkels
Top
Post Reply

340 posts
  • Page 4 of 14
    • Jump to page:
  • Previous
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • …
  • 14
  • Next

Return to “Kernel & Hardware”

Jump to
  • Assistance
  • ↳   News & Announcements
  • ↳   Frequently Asked Questions
  • ↳   Installing Gentoo
  • ↳   Multimedia
  • ↳   Desktop Environments
  • ↳   Networking & Security
  • ↳   Kernel & Hardware
  • ↳   Portage & Programming
  • ↳   Gamers & Players
  • ↳   Other Things Gentoo
  • ↳   Unsupported Software
  • Discussion & Documentation
  • ↳   Documentation, Tips & Tricks
  • ↳   Gentoo Chat
  • ↳   Gentoo Forums Feedback
  • ↳   Duplicate Threads
  • International Gentoo Users
  • ↳   中文 (Chinese)
  • ↳   Dutch
  • ↳   Finnish
  • ↳   French
  • ↳   Deutsches Forum (German)
  • ↳   Diskussionsforum
  • ↳   Deutsche Dokumentation
  • ↳   Greek
  • ↳   Forum italiano (Italian)
  • ↳   Forum di discussione italiano
  • ↳   Risorse italiane (documentazione e tools)
  • ↳   Polskie forum (Polish)
  • ↳   Instalacja i sprzęt
  • ↳   Polish OTW
  • ↳   Portuguese
  • ↳   Documentação, Ferramentas e Dicas
  • ↳   Russian
  • ↳   Scandinavian
  • ↳   Spanish
  • ↳   Other Languages
  • Architectures & Platforms
  • ↳   Gentoo on ARM
  • ↳   Gentoo on PPC
  • ↳   Gentoo on Sparc
  • ↳   Gentoo on Alternative Architectures
  • ↳   Gentoo on AMD64
  • ↳   Gentoo for Mac OS X (Portage for Mac OS X)
  • Board index
  • All times are UTC
  • Delete cookies

© 2001–2026 Gentoo Foundation, Inc.

Powered by phpBB® Forum Software © phpBB Limited

Privacy Policy

 

 

magic