* some more doubts regarding memory access from user/kernel space
From: Vijay Padiyar @ 2005-02-11 15:15 UTC (permalink / raw)
To: Embedded TUX, LinuxPPC Support
Hi
Some more doubts about the same thing.
As I am aware, the MPC8260 does not have a separate I/O address space. So,
with reference to my earlier mail, when do we need to use ioremap() and when
do we need to use request_mem_region()? Or do we need to use both in a
particular sequence?
Also, if I just do an ioremap(), can I directly access those remapped
addresses with inb()/outb() or writeb()/readb()? Or is something more to be
done prior to accessing it?
Regards
Vijay Padiyar
http://www.vijaypadiyar.eu.tf
^ permalink raw reply
* [PATCH][PPC32] Fix typos in cpm_uart_cpm2.c
From: Andrei Konovalov @ 2005-02-11 15:01 UTC (permalink / raw)
To: akpm; +Cc: linux-kernel, linuxppc-embedded
[-- Attachment #1: Type: text/plain, Size: 151 bytes --]
This patch applies to the kernel 2.6.11-rc3 and removes
excess '~' before the bit masks.
Signed-off-by: Andrei Konovalov <akonovalov@ru.mvista.com>
[-- Attachment #2: cpm2uart.diff --]
[-- Type: text/plain, Size: 1472 bytes --]
diff -uprN a/drivers/serial/cpm_uart/cpm_uart_cpm2.c b/drivers/serial/cpm_uart/cpm_uart_cpm2.c
--- a/drivers/serial/cpm_uart/cpm_uart_cpm2.c 2005-02-11 17:20:45.000000000 +0300
+++ b/drivers/serial/cpm_uart/cpm_uart_cpm2.c 2005-02-11 17:26:45.000000000 +0300
@@ -127,7 +127,7 @@ void scc1_lineif(struct uart_cpm_port *p
io->iop_pdird |= 0x00000002; /* Tx */
/* Wire BRG1 to SCC1 */
- cpm2_immr->im_cpmux.cmx_scr &= ~0x00ffffff;
+ cpm2_immr->im_cpmux.cmx_scr &= 0x00ffffff;
cpm2_immr->im_cpmux.cmx_scr |= 0x00000000;
pinfo->brg = 1;
}
@@ -140,7 +140,7 @@ void scc2_lineif(struct uart_cpm_port *p
io->iop_psorb |= 0x00880000;
io->iop_pdirb &= ~0x00030000;
io->iop_psorb &= ~0x00030000;
- cpm2_immr->im_cpmux.cmx_scr &= ~0xff00ffff;
+ cpm2_immr->im_cpmux.cmx_scr &= 0xff00ffff;
cpm2_immr->im_cpmux.cmx_scr |= 0x00090000;
pinfo->brg = 2;
}
@@ -153,7 +153,7 @@ void scc3_lineif(struct uart_cpm_port *p
io->iop_psorb |= 0x00880000;
io->iop_pdirb &= ~0x00030000;
io->iop_psorb &= ~0x00030000;
- cpm2_immr->im_cpmux.cmx_scr &= ~0xffff00ff;
+ cpm2_immr->im_cpmux.cmx_scr &= 0xffff00ff;
cpm2_immr->im_cpmux.cmx_scr |= 0x00001200;
pinfo->brg = 3;
}
@@ -167,7 +167,7 @@ void scc4_lineif(struct uart_cpm_port *p
io->iop_pdird &= ~0x00000200; /* Rx */
io->iop_pdird |= 0x00000400; /* Tx */
- cpm2_immr->im_cpmux.cmx_scr &= ~0xffffff00;
+ cpm2_immr->im_cpmux.cmx_scr &= 0xffffff00;
cpm2_immr->im_cpmux.cmx_scr |= 0x0000001b;
pinfo->brg = 4;
}
^ permalink raw reply
* query regarding access of physical memory from user space
From: Vijay Padiyar @ 2005-02-11 14:16 UTC (permalink / raw)
To: Embedded TUX, LinuxPPC Support
Hi
I am a bit new to Linux and therefore am unable to appreciate exactly the
use of various techniques used to map physical memory to user or kernel
space. I have come across functions like ioremap(), remap_page_range(), etc.
I am still a _bit_ confused as to exactly what to use for our purpose.
I have an MPC8260 target with 128 MB SDRAM (0x00000000 - 0x07FFFFFF), 32 MB
FLASH (0xFE000000 - 0xFFFFFFFF). In between, I have some CPLDs and FPGAs
mapped at various physical addresses. I wish to access these devices from a
user program or from a device driver inserted into the kernel.
Please tell me how do I go about it?
What I have done right now is to use ioremap() to remap a section of
physical memory to kernel virtual memory and try to use it.
For example, we have a CPLD whose registers we wish to manipulate. These
registers lie in the address range 0x30000000 - 0x300000FF. I map this range
as follows:
unsigned char *cpld_mem;
cpld_mem = (unsigned char *)ioremap(0x30000000, 0x100);
Is this correct? After I do this, can I write to and read from the physical
memory locations 0x30000000-0x300000FF using writeb() and readb()? Or do I
have to use outb() and inb()?
Please do clarify my doubts. Also, what is the *highest memory address* as
well as *maximum memory size* that I can map to kernel or user space using
ioremap()?
In other words, can I map any address in the 32-bit address space to kernel
virtual space using ioremap()? Also, what chunk size of memory can I map in
one go?
Please give me some ideas regarding my doubts. I need to get finished with
the driver soon.
Regards
Vijay Padiyar
http://www.vijaypadiyar.eu.tf
^ permalink raw reply
* 1000MB (GMII) ports on IBM 440GX (ocotea)
From: emre kara @ 2005-02-11 13:55 UTC (permalink / raw)
To: linuxppc-embedded
Dear All;
I have problems on ppc440gx ( IBM 440gx evaluatation
board) gigabit ethernet ports.
I have configurated and compiled linux kernel version
2.4.29 (latest) for ocotea board and it worked fine
with two MII /Fast Ethernet ports,but i can't find any
way to configure GMII (gigabit) ethernet driver for
other on chip two gigabit ports, in the platform
specific file (arch/ppc/platforms/ocotea.c) the source
configures only two fast ethernet ports.
I have also loaded Montavista's preview kernel on my
board and in this kernel, four ethernet ports worked
fine, but there are huge differences between two
kernels so I can't find a way to overcome this
problem.
Is anyone have an idea for the solution?
Thank you.
Emre
___________________________________________________________
ALL-NEW Yahoo! Messenger - all new features - even more fun! http://uk.messenger.yahoo.com
^ permalink raw reply
* Re: problem with accessing memory mapped area
From: Mark Chambers @ 2005-02-11 13:27 UTC (permalink / raw)
To: Vijay Padiyar, LinuxPPC Support
In-Reply-To: <BAY1-DAV32181D4E594557F8931608B770@phx.gbl>
> In addition, in the address range 0x30000000-0x300000FF, I have a CPLD
> mapped.
>
> Now, I wish to access the registers of this CPLD. For this, I create a
> module and insert it into the kernel. Now, in my 'init_module' function, I
> map the address range 0x30000000-0x300000FF to cpld_mem:
>
> But when I execute this program on the target, it crashes after displaying
> "Writing to CPLD". Sometimes it says 'Bus error' and some other times I
get
> a 'Kernel panic' message and the system reboots.
>
If you are getting 'bus error' it sounds like the memory controller is not
set
up [correctly] for this address. Do you know if the bootloader is
configuring
the CPLD chip select correctly?
^ permalink raw reply
* Re: Memory leak problem
From: Wolfgang Denk @ 2005-02-11 10:53 UTC (permalink / raw)
To: robin; +Cc: etux, linuxppc-embedded
In-Reply-To: <200502111159.04265.robin@india.tejasnetworks.com>
In message <200502111159.04265.robin@india.tejasnetworks.com> you wrote:
>
> 1. Did somebody encounter any problems(leaks) with the
> syncppp module in denx 2.4.20 kernel??
2.4.20 is pretty old. Is there any specific reason for not using a
more recent kernel version?
Best regards,
Wolfgang Denk
--
Software Engineering: Embedded and Realtime Systems, Embedded Linux
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de
"To IBM, 'open' means there is a modicum of interoperability among
some of their equipment." - Harv Masterson
^ permalink raw reply
* Re: [PATCH][PPC32] mktree fix
From: Andre' Draszik @ 2005-02-11 8:37 UTC (permalink / raw)
To: Tom Rini; +Cc: linuxppc-embedded
In-Reply-To: <20050208223348.GA31592@smtp.west.cox.net>
Tom Rini wrote:
> On Mon, Feb 07, 2005 at 05:34:36AM +0100, Andre' Draszik wrote:
>
>
>>This one fixes mktree. The image size stored in the header is pretty off
>>without
>>this patch. (yes, it can make a difference of upto almost 64k)
>>
>>Signed-off-by: Andre' Draszik <andid@gmx.net>
>
>
> With this wrong, what breaks? Thanks.
I don't think anything breaks but if somebody relies on the image size
stored in the header, up to almost 64k bytes of flash could be wasted.
a.
^ permalink raw reply
* Patch for 8xx watchdog handler for >=2.6.10
From: Carsten Juttner @ 2005-02-11 6:16 UTC (permalink / raw)
To: linuxppc-embedded
[-- Attachment #1: Type: text/plain, Size: 474 bytes --]
Hi,
our mpc 823 based embedded board (STB, dbox2) would hang with every
kernel starting from 2.6.10-rc1_linuxppc. I tracked the problem down to
the watchdog interrupt handler setup and the new generic interrupt
handling routines (which caused an uninitialized pointer because kmalloc
was used before the kmem_cache was initialized).
As said, this was only an issue if CONFIG_8xx_WDT was set.
I have attached a simple patch for the handler.
Regards,
Carsten Juttner
[-- Attachment #2: m8xx_wdt.diff --]
[-- Type: text/x-patch, Size: 1183 bytes --]
diff -Nru a/arch/ppc/syslib/m8xx_wdt.c b/arch/ppc/syslib/m8xx_wdt.c
--- a/arch/ppc/syslib/m8xx_wdt.c 2005-02-11 07:08:20 +01:00
+++ b/arch/ppc/syslib/m8xx_wdt.c 2005-02-11 07:08:20 +01:00
@@ -11,6 +11,7 @@
#include <linux/init.h>
#include <linux/interrupt.h>
+#include <linux/irq.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <asm/8xx_immap.h>
@@ -18,6 +19,14 @@
static int wdt_timeout;
+static irqreturn_t m8xx_wdt_interrupt(int, void *, struct pt_regs *);
+static struct irqaction m8xx_wdt_irqaction = {
+ .handler = m8xx_wdt_interrupt,
+ .flags = 0,
+ .name = "watchdog",
+ .dev_id = NULL
+};
+
void m8xx_wdt_reset(void)
{
volatile immap_t *imap = (volatile immap_t *)IMAP_ADDR;
@@ -84,8 +93,8 @@
imap->im_sit.sit_piscr =
(mk_int_int_mask(PIT_INTERRUPT) << 8) | PISCR_PIE | PISCR_PTE;
- if (request_irq(PIT_INTERRUPT, m8xx_wdt_interrupt, 0, "watchdog", NULL))
- panic("m8xx_wdt: could not allocate watchdog irq!");
+ if (setup_irq(PIT_INTERRUPT, &m8xx_wdt_irqaction))
+ panic("m8xx_wdt: error setting up the watchdog irq!");
printk(KERN_NOTICE
"m8xx_wdt: keep-alive trigger installed (PITC: 0x%04X)\n", pitc);
^ permalink raw reply
* Memory leak problem
From: robin @ 2005-02-11 6:29 UTC (permalink / raw)
To: Gerhard Jaeger, linuxppc-embedded, etux
In-Reply-To: <200502100840.38232.g.jaeger@sysgo.com>
Hi=20
Thanks for your help.=20
We found the memory leak in the syncppp module in linux.
1. Did somebody encounter any problems(leaks) with the=20
syncppp module in denx 2.4.20 kernel??=20
2. Are there any known issues with this module??
The scenario is we are ftp-ing continuosly between=20
two nodes using syncppp module. The leak is ocuring at=20
both the nodes.
Regards,
Robin
On Thursday 10 Feb 2005 1:10 pm, Gerhard Jaeger wrote:
> On Thursday 10 February 2005 07:07, robin wrote:
> > Hi
> > We have an application running on denx linux kernel 2.4.20.
> >
> > Apparently there is a memory leak that we are not able to find.
> > The application is giving out of memory error. Even if we restart
> > the application without rebooting the kernel, (killing all applicatio=
n
> > processes and restarting), it gives the same out of memory error.
> > Rebooting the kernel solves the problem.
> >
> > It seems that the memory leak is not at the application level
> > 'cos restarting the application doesnt solve the problem..
> >
> > 1. Any ideas where I should look for the leak??
>
> Check /proc/slabinfo and see if there are some "supicious" buffer,
> that only increase and never decrease. From the kind of buffer
> showing this behaviour you might find out where to dig...
> Check it before running the application and afterwards.
>
> > 2. Is there any known memory leak problems with the kernel??
>
> There are enough places, where a kernel could leak, but in general
> such leaks in the main part are detected really fast. Undiscovered
> leaks are often found in the drivers itself.
>
> What's your kernel config?
> Which HW are you using?
> What does this application?
>
> Ciao,
> Gerhard
--=20
And I hate redundancy, and having different functions for the same thing.
=09- Linus Torvalds on linux-kernel
^ permalink raw reply
* linux porting on EP852T
From: atit @ 2005-02-11 6:08 UTC (permalink / raw)
To: linuxppc-embedded
I am trying to port linux v2.4 on an embedded planet board. When I load
the zImzge.elf in ram I get following :
-----------------------------------------------------
loaded at: 00210000 00282208
relocated to: 00380000 003F2208
board data at: 003EF13C 003EF158
relocated to: 00385304 00385320
zImage at: 0038581D 003EE563
avail ram: 003F3000 01000000
Linux/PPC load: console=ttyS0, 9600 console=tty0 root=/dev/sda2
Uncomressing Linux...done.
Now booting the kernel
a
----------------------------------------------------------------
and then it stops. What can be the problem. Is there a port available
for EP852T.
^ permalink raw reply
* problem with accessing memory mapped area
From: Vijay Padiyar @ 2005-02-11 4:37 UTC (permalink / raw)
To: Embedded TUX, LinuxPPC Support
Hi there
I'm running a Linux 2.6.10 kernel with BusyBox 1.0 on an MPC8260 platform.
My board's memory map is as follows:
SDRAM: 0x00000000 - 0x07FFFFFF (128 MB)
FLASH: 0xFE000000 - 0xFFFFFFFF (32 MB)
In addition, in the address range 0x30000000-0x300000FF, I have a CPLD
mapped.
Now, I wish to access the registers of this CPLD. For this, I create a
module and insert it into the kernel. Now, in my 'init_module' function, I
map the address range 0x30000000-0x300000FF to cpld_mem:
unsigned char *cpld_mem;
int init_module(void)
{
...
...
cpld_mem = (unsigned char *) ioremap (0x30000000, 0x100);
}
Let's say my file operation functions are device_open, device_release,
device_read, device_write and device_ioctl.
Now, I wish to write to the address 0x30000014. In device_write, I do the
following:
ssize_t device_write(...)
{
...
printk(KERN_DEBUG "Writing to CPLD");
outb(0x00, cpldMem + 0x14);
}
But when I execute this program on the target, it crashes after displaying
"Writing to CPLD". Sometimes it says 'Bus error' and some other times I get
a 'Kernel panic' message and the system reboots.
Where could I be going wrong? I tried with 'writeb()' as well. It gave the
same results. :-( Am I making some obvious silly mistakes?
Regards
Vijay Padiyar
http://www.vijaypadiyar.eu.tf
^ permalink raw reply
* Re: Linux 2.6.x on 8xx status
From: Dan Malek @ 2005-02-11 3:42 UTC (permalink / raw)
To: Marcelo Tosatti; +Cc: Smith, Craig, linux-ppc-embedded
In-Reply-To: <20050210170658.GA20153@logos.cnet>
On Feb 10, 2005, at 12:06 PM, Marcelo Tosatti wrote:
> How do you do track down the current TLB state? With a BDI?
Yes. The BDI2000 is invaluable for this kind of debugging.
> Shouldnt it be loading the TLB entry which "seem to be OK" accordingly
> to your
> analysis ??
Yes.
> BTW, we are seeing very bad slowdown on v2.4 compared to v2.6 on m8xx.
What are you using for performance measurements? Standard
benchmarks I could run, too?
> Its likely to be cache related - I'm preparing a detailed email about
> it.
OK. Thanks.
-- Dan
^ permalink raw reply
* Re: therm_pm72 changes for xserve
From: Benjamin Herrenschmidt @ 2005-02-10 22:31 UTC (permalink / raw)
To: Richard Henderson; +Cc: linuxppc-dev list
In-Reply-To: <20050210191451.GA6804@twiddle.net>
On Thu, 2005-02-10 at 11:14 -0800, Richard Henderson wrote:
> The machine appears to be stable under load with this patch.
> Which isn't *terribly* surprising since fan speed under darwin
> seems to be universally lower. (If there's a way to probe the
> actual values under darwin, I don't know it. This just from
> standing next to the machine and listening. I suppose this
> could be from failing to lower the rpms of the third cpu fans.)
>
> I am kinda surprised about the data we pull out the eeprom.
> It seems to believe that 75C is a good target temperature.
> Idle temp appears to be 42C; load temp hovers around 60C.
> The high target temp means that we don't ever increase the
> fan speed from the adversised minimum.
>
> I got the actual fan ids from a patch that Harald Welte wrote
> once upon a time, someplace googleable. I'll admit that I have
> no idea how one gets from
>
> od /proc/device-tree/sep/fans/cpu-a-1/control-id
> 0000000 000000 040400
>
> or any other entry in any of that directory, to .id=3.
>
> Anyway, if this isn't clean enough, give me some direction.
Hi ! You should have asked me :) I did some work on the Xserve. Notably,
it uses a slightly different algorithm.... Here's my current patch.
Index: linux-work/drivers/macintosh/therm_pm72.c
===================================================================
--- linux-work.orig/drivers/macintosh/therm_pm72.c 2005-01-18 18:15:25.000000000 +1100
+++ linux-work/drivers/macintosh/therm_pm72.c 2005-01-18 18:15:33.000000000 +1100
@@ -47,8 +47,11 @@
* decisions, like slewing down CPUs
* - Deal with fan and i2c failures in a better way
* - Maybe do a generic PID based on params used for
- * U3 and Drives ?
- * - Add RackMac3,1 support (XServe g5)
+ * U3 and Drives ? Definitely need to factor code a bit
+ * bettter... also make sensor detection more robust using
+ * the device-tree to probe for them
+ * - Figure out how to get the slots consumption and set the
+ * slots fan accordingly
*
* History:
*
@@ -85,6 +88,12 @@
* - Add new CPU cooling algorithm for machines with liquid cooling
* - Workaround for some PowerMac7,3 with empty "fan" node in the devtree
* - Fix a signed/unsigned compare issue in some PID loops
+ *
+ * Nov. 16, 2004 : 1.2b2
+ * - Add basic support for Xserve G5
+ * - Retreive pumps min/max from EEPROM image in device-tree (broken)
+ * - Use min/max macros here or there
+ * - Latest darwin updated U3H min fan speed to 20% PWM
*/
#include <linux/config.h>
@@ -113,7 +122,7 @@
#include "therm_pm72.h"
-#define VERSION "1.1"
+#define VERSION "1.2b2"
#undef DEBUG
@@ -131,21 +140,26 @@
static struct of_device * of_dev;
static struct i2c_adapter * u3_0;
static struct i2c_adapter * u3_1;
+static struct i2c_adapter * k2;
static struct i2c_client * fcu;
static struct cpu_pid_state cpu_state[2];
static struct basckside_pid_params backside_params;
static struct backside_pid_state backside_state;
static struct drives_pid_state drives_state;
+static struct dimm_pid_state dimms_state;
static int state;
static int cpu_count;
static int cpu_pid_type;
static pid_t ctrl_task;
static struct completion ctrl_complete;
static int critical_state;
+static int rackmac;
+static s32 dimm_output_clamp;
+
static DECLARE_MUTEX(driver_lock);
/*
- * We have 2 types of CPU PID control. One is "split" old style control
+ * We have 3 types of CPU PID control. One is "split" old style control
* for intake & exhaust fans, the other is "combined" control for both
* CPUs that also deals with the pumps when present. To be "compatible"
* with OS X at this point, we only use "COMBINED" on the machines that
@@ -155,6 +169,7 @@
*/
#define CPU_PID_TYPE_SPLIT 0
#define CPU_PID_TYPE_COMBINED 1
+#define CPU_PID_TYPE_RACKMAC 2
/*
* This table describes all fans in the FCU. The "id" and "type" values
@@ -177,7 +192,7 @@
struct fcu_fan_table fcu_fans[] = {
[BACKSIDE_FAN_PWM_INDEX] = {
- .loc = "BACKSIDE",
+ .loc = "BACKSIDE,SYS CTRLR FAN",
.type = FCU_FAN_PWM,
.id = BACKSIDE_FAN_PWM_DEFAULT_ID,
},
@@ -187,7 +202,7 @@
.id = DRIVES_FAN_RPM_DEFAULT_ID,
},
[SLOTS_FAN_PWM_INDEX] = {
- .loc = "SLOT",
+ .loc = "SLOT,PCI FAN",
.type = FCU_FAN_PWM,
.id = SLOTS_FAN_PWM_DEFAULT_ID,
},
@@ -224,6 +239,37 @@
.type = FCU_FAN_RPM,
.id = FCU_FAN_ABSENT_ID,
},
+ /* Xserve fans */
+ [CPU_A1_FAN_RPM_INDEX] = {
+ .loc = "CPU A 1",
+ .type = FCU_FAN_RPM,
+ .id = FCU_FAN_ABSENT_ID,
+ },
+ [CPU_A2_FAN_RPM_INDEX] = {
+ .loc = "CPU A 2",
+ .type = FCU_FAN_RPM,
+ .id = FCU_FAN_ABSENT_ID,
+ },
+ [CPU_A3_FAN_RPM_INDEX] = {
+ .loc = "CPU A 3",
+ .type = FCU_FAN_RPM,
+ .id = FCU_FAN_ABSENT_ID,
+ },
+ [CPU_B1_FAN_RPM_INDEX] = {
+ .loc = "CPU B 1",
+ .type = FCU_FAN_RPM,
+ .id = FCU_FAN_ABSENT_ID,
+ },
+ [CPU_B2_FAN_RPM_INDEX] = {
+ .loc = "CPU B 2",
+ .type = FCU_FAN_RPM,
+ .id = FCU_FAN_ABSENT_ID,
+ },
+ [CPU_B3_FAN_RPM_INDEX] = {
+ .loc = "CPU B 3",
+ .type = FCU_FAN_RPM,
+ .id = FCU_FAN_ABSENT_ID,
+ },
};
/*
@@ -251,7 +297,9 @@
struct i2c_client *clt;
struct i2c_adapter *adap;
- if (id & 0x100)
+ if (id & 0x200)
+ adap = k2;
+ else if (id & 0x100)
adap = u3_1;
else
adap = u3_0;
@@ -361,6 +409,31 @@
}
}
+static int read_lm87_reg(struct i2c_client * chip, int reg)
+{
+ int rc, tries = 0;
+ u8 buf;
+
+ for (;;) {
+ /* Set address */
+ buf = (u8)reg;
+ rc = i2c_master_send(chip, &buf, 1);
+ if (rc <= 0)
+ goto error;
+ rc = i2c_master_recv(chip, &buf, 1);
+ if (rc <= 0)
+ goto error;
+ return (int)buf;
+ error:
+ DBG("Error reading LM87, retrying...\n");
+ if (++tries > 10) {
+ printk(KERN_ERR "therm_pm72: Error reading LM87 !\n");
+ return -1;
+ }
+ msleep(10);
+ }
+}
+
static int fan_read_reg(int reg, unsigned char *buf, int nb)
{
int tries, nr, nw;
@@ -570,6 +643,38 @@
return 0;
}
+static void fetch_cpu_pumps_minmax(void)
+{
+ struct cpu_pid_state *state0 = &cpu_state[0];
+ struct cpu_pid_state *state1 = &cpu_state[1];
+ u16 pump_min = 0, pump_max = 0xffff;
+ u16 tmp[4];
+
+ /* Try to fetch pumps min/max infos from eeprom */
+
+ memcpy(&tmp, &state0->mpu.processor_part_num, 8);
+ if (tmp[0] != 0xffff && tmp[1] != 0xffff) {
+ pump_min = max(pump_min, tmp[0]);
+ pump_max = min(pump_max, tmp[1]);
+ }
+ if (tmp[2] != 0xffff && tmp[3] != 0xffff) {
+ pump_min = max(pump_min, tmp[2]);
+ pump_max = min(pump_max, tmp[3]);
+ }
+
+ /* Double check the values, this _IS_ needed as the EEPROM on
+ * some dual 2.5Ghz G5s seem, at least, to have both min & max
+ * same to the same value ... (grrrr)
+ */
+ if (pump_min == pump_max || pump_min == 0 || pump_max == 0xffff) {
+ pump_min = CPU_PUMP_OUTPUT_MIN;
+ pump_max = CPU_PUMP_OUTPUT_MAX;
+ }
+
+ state0->pump_min = state1->pump_min = pump_min;
+ state0->pump_max = state1->pump_max = pump_max;
+}
+
/*
* Now, unfortunately, sysfs doesn't give us a nice void * we could
* pass around to the attribute functions, so we don't really have
@@ -611,6 +716,8 @@
BUILD_SHOW_FUNC_FIX(drives_temperature, drives_state.last_temp)
BUILD_SHOW_FUNC_INT(drives_fan_rpm, drives_state.rpm)
+BUILD_SHOW_FUNC_FIX(dimms_temperature, dimms_state.last_temp)
+
static DEVICE_ATTR(cpu0_temperature,S_IRUGO,show_cpu0_temperature,NULL);
static DEVICE_ATTR(cpu0_voltage,S_IRUGO,show_cpu0_voltage,NULL);
static DEVICE_ATTR(cpu0_current,S_IRUGO,show_cpu0_current,NULL);
@@ -629,6 +736,8 @@
static DEVICE_ATTR(drives_temperature,S_IRUGO,show_drives_temperature,NULL);
static DEVICE_ATTR(drives_fan_rpm,S_IRUGO,show_drives_fan_rpm,NULL);
+static DEVICE_ATTR(dimms_temperature,S_IRUGO,show_dimms_temperature,NULL);
+
/*
* CPUs fans control loop
*/
@@ -636,17 +745,21 @@
static int do_read_one_cpu_values(struct cpu_pid_state *state, s32 *temp, s32 *power)
{
s32 ltemp, volts, amps;
- int rc = 0;
+ int index, rc = 0;
/* Default (in case of error) */
*temp = state->cur_temp;
*power = state->cur_power;
- /* Read current fan status */
- if (state->index == 0)
- rc = get_rpm_fan(CPUA_EXHAUST_FAN_RPM_INDEX, !RPM_PID_USE_ACTUAL_SPEED);
+ if (cpu_pid_type == CPU_PID_TYPE_RACKMAC)
+ index = (state->index == 0) ?
+ CPU_A1_FAN_RPM_INDEX : CPU_B1_FAN_RPM_INDEX;
else
- rc = get_rpm_fan(CPUB_EXHAUST_FAN_RPM_INDEX, !RPM_PID_USE_ACTUAL_SPEED);
+ index = (state->index == 0) ?
+ CPUA_EXHAUST_FAN_RPM_INDEX : CPUB_EXHAUST_FAN_RPM_INDEX;
+
+ /* Read current fan status */
+ rc = get_rpm_fan(index, !RPM_PID_USE_ACTUAL_SPEED);
if (rc < 0) {
/* XXX What do we do now ? Nothing for now, keep old value, but
* return error upstream
@@ -777,11 +890,6 @@
DBG(" sum: %d\n", (int)sum);
state->rpm += (s32)sum;
-
- if (state->rpm < (int)state->mpu.rminn_exhaust_fan)
- state->rpm = state->mpu.rminn_exhaust_fan;
- if (state->rpm > (int)state->mpu.rmaxn_exhaust_fan)
- state->rpm = state->mpu.rmaxn_exhaust_fan;
}
static void do_monitor_cpu_combined(void)
@@ -823,28 +931,28 @@
if (state0->overtemp > 0) {
state0->rpm = state0->mpu.rmaxn_exhaust_fan;
state0->intake_rpm = intake = state0->mpu.rmaxn_intake_fan;
- pump = CPU_PUMP_OUTPUT_MAX;
+ pump = state0->pump_min;
goto do_set_fans;
}
/* Do the PID */
do_cpu_pid(state0, temp_combi, power_combi);
+ /* Range check */
+ state0->rpm = max(state0->rpm, (int)state0->mpu.rminn_exhaust_fan);
+ state0->rpm = min(state0->rpm, (int)state0->mpu.rmaxn_exhaust_fan);
+
/* Calculate intake fan speed */
intake = (state0->rpm * CPU_INTAKE_SCALE) >> 16;
- if (intake < (int)state0->mpu.rminn_intake_fan)
- intake = state0->mpu.rminn_intake_fan;
- if (intake > (int)state0->mpu.rmaxn_intake_fan)
- intake = state0->mpu.rmaxn_intake_fan;
+ intake = max(intake, (int)state0->mpu.rminn_intake_fan);
+ intake = min(intake, (int)state0->mpu.rmaxn_intake_fan);
state0->intake_rpm = intake;
/* Calculate pump speed */
- pump = (state0->rpm * CPU_PUMP_OUTPUT_MAX) /
+ pump = (state0->rpm * state0->pump_max) /
state0->mpu.rmaxn_exhaust_fan;
- if (pump > CPU_PUMP_OUTPUT_MAX)
- pump = CPU_PUMP_OUTPUT_MAX;
- if (pump < CPU_PUMP_OUTPUT_MIN)
- pump = CPU_PUMP_OUTPUT_MIN;
+ pump = min(pump, state0->pump_max);
+ pump = max(pump, state0->pump_min);
do_set_fans:
/* We copy values from state 0 to state 1 for /sysfs */
@@ -904,11 +1012,14 @@
/* Do the PID */
do_cpu_pid(state, temp, power);
+ /* Range check */
+ state->rpm = max(state->rpm, (int)state->mpu.rminn_exhaust_fan);
+ state->rpm = min(state->rpm, (int)state->mpu.rmaxn_exhaust_fan);
+
+ /* Calculate intake fan */
intake = (state->rpm * CPU_INTAKE_SCALE) >> 16;
- if (intake < (int)state->mpu.rminn_intake_fan)
- intake = state->mpu.rminn_intake_fan;
- if (intake > (int)state->mpu.rmaxn_intake_fan)
- intake = state->mpu.rmaxn_intake_fan;
+ intake = max(intake, (int)state->mpu.rminn_intake_fan);
+ intake = min(intake, (int)state->mpu.rmaxn_intake_fan);
state->intake_rpm = intake;
do_set_fans:
@@ -929,6 +1040,67 @@
}
}
+static void do_monitor_cpu_rack(struct cpu_pid_state *state)
+{
+ s32 temp, power, fan_min;
+ int rc;
+
+ /* Read current fan status */
+ rc = do_read_one_cpu_values(state, &temp, &power);
+ if (rc < 0) {
+ /* XXX What do we do now ? */
+ }
+
+ /* Check tmax, increment overtemp if we are there. At tmax+8, we go
+ * full blown immediately and try to trigger a shutdown
+ */
+ if (temp >= ((state->mpu.tmax + 8) << 16)) {
+ printk(KERN_WARNING "Warning ! CPU %d temperature way above maximum"
+ " (%d) !\n",
+ state->index, temp >> 16);
+ state->overtemp = CPU_MAX_OVERTEMP;
+ } else if (temp > (state->mpu.tmax << 16))
+ state->overtemp++;
+ else
+ state->overtemp = 0;
+ if (state->overtemp >= CPU_MAX_OVERTEMP)
+ critical_state = 1;
+ if (state->overtemp > 0) {
+ state->rpm = state->intake_rpm = state->mpu.rmaxn_intake_fan;
+ goto do_set_fans;
+ }
+
+ /* Do the PID */
+ do_cpu_pid(state, temp, power);
+
+ /* Check clamp from dimms */
+ fan_min = dimm_output_clamp;
+ fan_min = max(fan_min, (int)state->mpu.rminn_intake_fan);
+
+ state->rpm = max(state->rpm, (int)fan_min);
+ state->rpm = min(state->rpm, (int)state->mpu.rmaxn_intake_fan);
+ state->intake_rpm = state->rpm;
+
+ do_set_fans:
+ DBG("** CPU %d RPM: %d overtemp: %d\n",
+ state->index, (int)state->rpm, state->overtemp);
+
+ /* We should check for errors, shouldn't we ? But then, what
+ * do we do once the error occurs ? For FCU notified fan
+ * failures (-EFAULT) we probably want to notify userland
+ * some way...
+ */
+ if (state->index == 0) {
+ set_rpm_fan(CPU_A1_FAN_RPM_INDEX, state->rpm);
+ set_rpm_fan(CPU_A2_FAN_RPM_INDEX, state->rpm);
+ set_rpm_fan(CPU_A3_FAN_RPM_INDEX, state->rpm);
+ } else {
+ set_rpm_fan(CPU_B1_FAN_RPM_INDEX, state->rpm);
+ set_rpm_fan(CPU_B2_FAN_RPM_INDEX, state->rpm);
+ set_rpm_fan(CPU_B3_FAN_RPM_INDEX, state->rpm);
+ }
+}
+
/*
* Initialize the state structure for one CPU control loop
*/
@@ -936,7 +1108,7 @@
{
state->index = index;
state->first = 1;
- state->rpm = 1000;
+ state->rpm = (cpu_pid_type == CPU_PID_TYPE_RACKMAC) ? 4000 : 1000;
state->overtemp = 0;
state->adc_config = 0x00;
@@ -1012,13 +1184,13 @@
*/
static void do_monitor_backside(struct backside_pid_state *state)
{
- s32 temp, integral, derivative;
+ s32 temp, integral, derivative, fan_min;
s64 integ_p, deriv_p, prop_p, sum;
int i, rc;
if (--state->ticks != 0)
return;
- state->ticks = BACKSIDE_PID_INTERVAL;
+ state->ticks = backside_params.interval;
DBG("backside:\n");
@@ -1059,7 +1231,7 @@
integral = 0;
for (i = 0; i < BACKSIDE_PID_HISTORY_SIZE; i++)
integral += state->error_history[i];
- integral *= BACKSIDE_PID_INTERVAL;
+ integral *= backside_params.interval;
DBG(" integral: %08x\n", integral);
integ_p = ((s64)backside_params.G_r) * (s64)integral;
DBG(" integ_p: %d\n", (int)(integ_p >> 36));
@@ -1069,7 +1241,7 @@
derivative = state->error_history[state->cur_sample] -
state->error_history[(state->cur_sample + BACKSIDE_PID_HISTORY_SIZE - 1)
% BACKSIDE_PID_HISTORY_SIZE];
- derivative /= BACKSIDE_PID_INTERVAL;
+ derivative /= backside_params.interval;
deriv_p = ((s64)backside_params.G_d) * (s64)derivative;
DBG(" deriv_p: %d\n", (int)(deriv_p >> 36));
sum += deriv_p;
@@ -1083,11 +1255,17 @@
sum >>= 36;
DBG(" sum: %d\n", (int)sum);
- state->pwm += (s32)sum;
- if (state->pwm < backside_params.output_min)
- state->pwm = backside_params.output_min;
- if (state->pwm > backside_params.output_max)
- state->pwm = backside_params.output_max;
+ if (backside_params.additive)
+ state->pwm += (s32)sum;
+ else
+ state->pwm = sum;
+
+ /* Check for clamp */
+ fan_min = (dimm_output_clamp * 100) / 14000;
+ fan_min = max(fan_min, backside_params.output_min);
+
+ state->pwm = max(state->pwm, fan_min);
+ state->pwm = min(state->pwm, backside_params.output_max);
DBG("** BACKSIDE PWM: %d\n", (int)state->pwm);
set_pwm_fan(BACKSIDE_FAN_PWM_INDEX, state->pwm);
@@ -1114,17 +1292,33 @@
of_node_put(u3);
}
- backside_params.G_p = BACKSIDE_PID_G_p;
- backside_params.G_r = BACKSIDE_PID_G_r;
- backside_params.output_max = BACKSIDE_PID_OUTPUT_MAX;
- if (u3h) {
+ if (rackmac) {
+ backside_params.G_d = BACKSIDE_PID_RACK_G_d;
+ backside_params.input_target = BACKSIDE_PID_RACK_INPUT_TARGET;
+ backside_params.output_min = BACKSIDE_PID_U3H_OUTPUT_MIN;
+ backside_params.interval = BACKSIDE_PID_RACK_INTERVAL;
+ backside_params.G_p = BACKSIDE_PID_RACK_G_p;
+ backside_params.G_r = BACKSIDE_PID_G_r;
+ backside_params.output_max = BACKSIDE_PID_OUTPUT_MAX;
+ backside_params.additive = 0;
+ } else if (u3h) {
backside_params.G_d = BACKSIDE_PID_U3H_G_d;
backside_params.input_target = BACKSIDE_PID_U3H_INPUT_TARGET;
backside_params.output_min = BACKSIDE_PID_U3H_OUTPUT_MIN;
+ backside_params.interval = BACKSIDE_PID_INTERVAL;
+ backside_params.G_p = BACKSIDE_PID_G_p;
+ backside_params.G_r = BACKSIDE_PID_G_r;
+ backside_params.output_max = BACKSIDE_PID_OUTPUT_MAX;
+ backside_params.additive = 1;
} else {
backside_params.G_d = BACKSIDE_PID_U3_G_d;
backside_params.input_target = BACKSIDE_PID_U3_INPUT_TARGET;
backside_params.output_min = BACKSIDE_PID_U3_OUTPUT_MIN;
+ backside_params.interval = BACKSIDE_PID_INTERVAL;
+ backside_params.G_p = BACKSIDE_PID_G_p;
+ backside_params.G_r = BACKSIDE_PID_G_r;
+ backside_params.output_max = BACKSIDE_PID_OUTPUT_MAX;
+ backside_params.additive = 1;
}
state->ticks = 1;
@@ -1233,10 +1427,9 @@
DBG(" sum: %d\n", (int)sum);
state->rpm += (s32)sum;
- if (state->rpm < DRIVES_PID_OUTPUT_MIN)
- state->rpm = DRIVES_PID_OUTPUT_MIN;
- if (state->rpm > DRIVES_PID_OUTPUT_MAX)
- state->rpm = DRIVES_PID_OUTPUT_MAX;
+
+ state->rpm = max(state->rpm, DRIVES_PID_OUTPUT_MIN);
+ state->rpm = min(state->rpm, DRIVES_PID_OUTPUT_MAX);
DBG("** DRIVES RPM: %d\n", (int)state->rpm);
set_rpm_fan(DRIVES_FAN_RPM_INDEX, state->rpm);
@@ -1276,6 +1469,126 @@
state->monitor = NULL;
}
+/*
+ * DIMMs temp control loop
+ */
+static void do_monitor_dimms(struct dimm_pid_state *state)
+{
+ s32 temp, integral, derivative, fan_min;
+ s64 integ_p, deriv_p, prop_p, sum;
+ int i;
+
+ if (--state->ticks != 0)
+ return;
+ state->ticks = DIMM_PID_INTERVAL;
+
+ DBG("DIMM:\n");
+
+ DBG(" current value: %d\n", state->output);
+
+ temp = read_lm87_reg(state->monitor, LM87_INT_TEMP);
+ if (temp < 0)
+ return;
+ temp <<= 16;
+ state->last_temp = temp;
+ DBG(" temp: %d.%03d, target: %d.%03d\n", FIX32TOPRINT(temp),
+ FIX32TOPRINT(DIMM_PID_INPUT_TARGET));
+
+ /* Store temperature and error in history array */
+ state->cur_sample = (state->cur_sample + 1) % DIMM_PID_HISTORY_SIZE;
+ state->sample_history[state->cur_sample] = temp;
+ state->error_history[state->cur_sample] = temp - DIMM_PID_INPUT_TARGET;
+
+ /* If first loop, fill the history table */
+ if (state->first) {
+ for (i = 0; i < (DIMM_PID_HISTORY_SIZE - 1); i++) {
+ state->cur_sample = (state->cur_sample + 1) %
+ DIMM_PID_HISTORY_SIZE;
+ state->sample_history[state->cur_sample] = temp;
+ state->error_history[state->cur_sample] =
+ temp - DIMM_PID_INPUT_TARGET;
+ }
+ state->first = 0;
+ }
+
+ /* Calculate the integral term */
+ sum = 0;
+ integral = 0;
+ for (i = 0; i < DIMM_PID_HISTORY_SIZE; i++)
+ integral += state->error_history[i];
+ integral *= DIMM_PID_INTERVAL;
+ DBG(" integral: %08x\n", integral);
+ integ_p = ((s64)DIMM_PID_G_r) * (s64)integral;
+ DBG(" integ_p: %d\n", (int)(integ_p >> 36));
+ sum += integ_p;
+
+ /* Calculate the derivative term */
+ derivative = state->error_history[state->cur_sample] -
+ state->error_history[(state->cur_sample + DIMM_PID_HISTORY_SIZE - 1)
+ % DIMM_PID_HISTORY_SIZE];
+ derivative /= DIMM_PID_INTERVAL;
+ deriv_p = ((s64)DIMM_PID_G_d) * (s64)derivative;
+ DBG(" deriv_p: %d\n", (int)(deriv_p >> 36));
+ sum += deriv_p;
+
+ /* Calculate the proportional term */
+ prop_p = ((s64)DIMM_PID_G_p) * (s64)(state->error_history[state->cur_sample]);
+ DBG(" prop_p: %d\n", (int)(prop_p >> 36));
+ sum += prop_p;
+
+ /* Scale sum */
+ sum >>= 36;
+
+ DBG(" sum: %d\n", (int)sum);
+ state->output = (s32)sum;
+ state->output = max(state->output, DIMM_PID_OUTPUT_MIN);
+ state->output = min(state->output, DIMM_PID_OUTPUT_MAX);
+ dimm_output_clamp = state->output;
+
+ DBG("** DIMM clamp value: %d\n", (int)state->output);
+
+ /* Backside PID is only every 5 seconds, force backside fan clamping now */
+ fan_min = (dimm_output_clamp * 100) / 14000;
+ fan_min = max(fan_min, backside_params.output_min);
+ if (backside_state.pwm < fan_min) {
+ backside_state.pwm = fan_min;
+ DBG(" -> applying clamp to backside fan now: %d !\n", fan_min);
+ set_pwm_fan(BACKSIDE_FAN_PWM_INDEX, fan_min);
+ }
+}
+
+/*
+ * Initialize the state structure for the DIMM temp control loop
+ */
+static int init_dimms_state(struct dimm_pid_state *state)
+{
+ state->ticks = 1;
+ state->first = 1;
+ state->output = 4000;
+
+ state->monitor = attach_i2c_chip(XSERVE_DIMMS_LM87, "dimms_temp");
+ if (state->monitor == NULL)
+ return -ENODEV;
+
+ device_create_file(&of_dev->dev, &dev_attr_dimms_temperature);
+
+ return 0;
+}
+
+/*
+ * Dispose of the state data for the drives control loop
+ */
+static void dispose_dimms_state(struct dimm_pid_state *state)
+{
+ if (state->monitor == NULL)
+ return;
+
+ device_remove_file(&of_dev->dev, &dev_attr_dimms_temperature);
+
+ detach_i2c_chip(state->monitor);
+ state->monitor = NULL;
+}
+
static int call_critical_overtemp(void)
{
char *argv[] = { critical_overtemp_path, NULL };
@@ -1321,15 +1634,29 @@
start = jiffies;
down(&driver_lock);
+
+ /* First, we always calculate the new DIMMs state on an Xserve */
+ if (rackmac)
+ do_monitor_dimms(&dimms_state);
+
+ /* Then, the CPUs */
if (cpu_pid_type == CPU_PID_TYPE_COMBINED)
do_monitor_cpu_combined();
- else {
+ else if (cpu_pid_type == CPU_PID_TYPE_RACKMAC) {
+ do_monitor_cpu_rack(&cpu_state[0]);
+ if (cpu_state[1].monitor != NULL)
+ do_monitor_cpu_rack(&cpu_state[1]);
+ // better deal with UP
+ } else {
do_monitor_cpu_split(&cpu_state[0]);
if (cpu_state[1].monitor != NULL)
do_monitor_cpu_split(&cpu_state[1]);
+ // better deal with UP
}
+ /* Then, the rest */
do_monitor_backside(&backside_state);
- do_monitor_drives(&drives_state);
+ if (!rackmac)
+ do_monitor_drives(&drives_state);
up(&driver_lock);
if (critical_state == 1) {
@@ -1369,9 +1696,9 @@
{
dispose_cpu_state(&cpu_state[0]);
dispose_cpu_state(&cpu_state[1]);
-
dispose_backside_state(&backside_state);
dispose_drives_state(&drives_state);
+ dispose_dimms_state(&dimms_state);
}
/*
@@ -1395,7 +1722,9 @@
* the pumps, though that may not be the best way, that is good enough
* for now
*/
- if (machine_is_compatible("PowerMac7,3")
+ if (rackmac)
+ cpu_pid_type = CPU_PID_TYPE_RACKMAC;
+ else if (machine_is_compatible("PowerMac7,3")
&& (cpu_count > 1)
&& fcu_fans[CPUA_PUMP_RPM_INDEX].id != FCU_FAN_ABSENT_ID
&& fcu_fans[CPUB_PUMP_RPM_INDEX].id != FCU_FAN_ABSENT_ID) {
@@ -1409,11 +1738,16 @@
*/
if (init_cpu_state(&cpu_state[0], 0))
goto fail;
+ if (cpu_pid_type == CPU_PID_TYPE_COMBINED)
+ fetch_cpu_pumps_minmax();
+
if (cpu_count > 1 && init_cpu_state(&cpu_state[1], 1))
goto fail;
if (init_backside_state(&backside_state))
goto fail;
- if (init_drives_state(&drives_state))
+ if (rackmac && init_dimms_state(&dimms_state))
+ goto fail;
+ if (!rackmac && init_drives_state(&drives_state))
goto fail;
DBG("all control loops up !\n");
@@ -1492,17 +1826,24 @@
/* Check if we are looking for one of these */
if (u3_0 == NULL && !strcmp(adapter->name, "u3 0")) {
u3_0 = adapter;
- DBG("found U3-0, creating control loops\n");
- if (create_control_loops())
- u3_0 = NULL;
+ DBG("found U3-0\n");
+ if (k2 || !rackmac)
+ if (create_control_loops())
+ u3_0 = NULL;
} else if (u3_1 == NULL && !strcmp(adapter->name, "u3 1")) {
u3_1 = adapter;
DBG("found U3-1, attaching FCU\n");
if (attach_fcu())
u3_1 = NULL;
+ } else if (k2 == NULL && !strcmp(adapter->name, "mac-io 0")) {
+ k2 = adapter;
+ DBG("Found K2\n");
+ if (u3_0 && rackmac)
+ if (create_control_loops())
+ k2 = NULL;
}
/* We got all we need, start control loops */
- if (u3_0 != NULL && u3_1 != NULL) {
+ if (u3_0 != NULL && u3_1 != NULL && (k2 || !rackmac)) {
DBG("everything up, starting control loops\n");
state = state_attached;
start_control_loops();
@@ -1548,6 +1889,27 @@
return 0;
}
+static int fan_check_loc_match(const char *loc, int fan)
+{
+ char tmp[64];
+ char *c, *e;
+
+ strlcpy(tmp, fcu_fans[fan].loc, 64);
+
+ c = tmp;
+ for (;;) {
+ e = strchr(c, ',');
+ if (e)
+ *e = 0;
+ if (strcmp(loc, c) == 0)
+ return 1;
+ if (e == NULL)
+ break;
+ c = e + 1;
+ }
+ return 0;
+}
+
static void fcu_lookup_fans(struct device_node *fcu_node)
{
struct device_node *np = NULL;
@@ -1589,7 +1951,7 @@
for (i = 0; i < FCU_FAN_COUNT; i++) {
int fan_id;
- if (strcmp(loc, fcu_fans[i].loc))
+ if (!fan_check_loc_match(loc, i))
continue;
DBG(" location match, index: %d\n", i);
fcu_fans[i].id = FCU_FAN_ABSENT_ID;
@@ -1671,8 +2033,11 @@
{
struct device_node *np;
+ rackmac = machine_is_compatible("RackMac3,1");
+
if (!machine_is_compatible("PowerMac7,2") &&
- !machine_is_compatible("PowerMac7,3"))
+ !machine_is_compatible("PowerMac7,3") &&
+ !rackmac)
return -ENODEV;
printk(KERN_INFO "PowerMac G5 Thermal control driver %s\n", VERSION);
@@ -1709,6 +2074,6 @@
module_exit(therm_pm72_exit);
MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>");
-MODULE_DESCRIPTION("Driver for Apple's PowerMac7,2 G5 thermal control");
+MODULE_DESCRIPTION("Driver for Apple's PowerMac G5 thermal control");
MODULE_LICENSE("GPL");
Index: linux-work/drivers/macintosh/therm_pm72.h
===================================================================
--- linux-work.orig/drivers/macintosh/therm_pm72.h 2005-01-18 18:15:25.000000000 +1100
+++ linux-work/drivers/macintosh/therm_pm72.h 2005-01-18 18:15:33.000000000 +1100
@@ -52,7 +52,7 @@
u16 rmaxn_intake_fan; /* 0x4e - Intake fan max RPM */
u16 rminn_exhaust_fan; /* 0x50 - Exhaust fan min RPM */
u16 rmaxn_exhaust_fan; /* 0x52 - Exhaust fan max RPM */
- u8 processor_part_num[8]; /* 0x54 - Processor part number */
+ u8 processor_part_num[8]; /* 0x54 - Processor part number XX pumps min/max */
u32 processor_lot_num; /* 0x5c - Processor lot number */
u8 orig_card_sernum[0x10]; /* 0x60 - Card original serial number */
u8 curr_card_sernum[0x10]; /* 0x70 - Card current serial number */
@@ -94,19 +94,25 @@
* of the driver, though I would accept any clean patch
* doing a better use of the device-tree without turning the
* while i2c registration mecanism into a racy mess
+ *
+ * Note: Xserve changed this. We have some bits on the K2 bus,
+ * which I arbitrarily set to 0x200. Ultimately, we really want
+ * too lookup these in the device-tree though
*/
#define FAN_CTRLER_ID 0x15e
#define SUPPLY_MONITOR_ID 0x58
#define SUPPLY_MONITORB_ID 0x5a
#define DRIVES_DALLAS_ID 0x94
#define BACKSIDE_MAX_ID 0x98
+#define XSERVE_DIMMS_LM87 0x25a
/*
- * Some MAX6690 & DS1775 register definitions
+ * Some MAX6690, DS1775, LM87 register definitions
*/
#define MAX6690_INT_TEMP 0
#define MAX6690_EXT_TEMP 1
#define DS1775_TEMP 0
+#define LM87_INT_TEMP 0x27
/*
* Scaling factors for the AD7417 ADC converters (except
@@ -126,14 +132,18 @@
#define BACKSIDE_FAN_PWM_INDEX 0
#define BACKSIDE_PID_U3_G_d 0x02800000
#define BACKSIDE_PID_U3H_G_d 0x01400000
+#define BACKSIDE_PID_RACK_G_d 0x00500000
#define BACKSIDE_PID_G_p 0x00500000
+#define BACKSIDE_PID_RACK_G_p 0x0004cccc
#define BACKSIDE_PID_G_r 0x00000000
#define BACKSIDE_PID_U3_INPUT_TARGET 0x00410000
#define BACKSIDE_PID_U3H_INPUT_TARGET 0x004b0000
+#define BACKSIDE_PID_RACK_INPUT_TARGET 0x00460000
#define BACKSIDE_PID_INTERVAL 5
+#define BACKSIDE_PID_RACK_INTERVAL 1
#define BACKSIDE_PID_OUTPUT_MAX 100
#define BACKSIDE_PID_U3_OUTPUT_MIN 20
-#define BACKSIDE_PID_U3H_OUTPUT_MIN 30
+#define BACKSIDE_PID_U3H_OUTPUT_MIN 20
#define BACKSIDE_PID_HISTORY_SIZE 2
struct basckside_pid_params
@@ -144,6 +154,8 @@
s32 input_target;
s32 output_min;
s32 output_max;
+ s32 interval;
+ int additive;
};
struct backside_pid_state
@@ -188,25 +200,34 @@
#define SLOTS_FAN_PWM_INDEX 2
#define SLOTS_FAN_DEFAULT_PWM 50 /* Do better here ! */
+
/*
- * IDs in Darwin for the sensors & fans
- *
- * CPU A AD7417_TEMP 10 (CPU A ambient temperature)
- * CPU A AD7417_AD1 11 (CPU A diode temperature)
- * CPU A AD7417_AD2 12 (CPU A 12V current)
- * CPU A AD7417_AD3 13 (CPU A voltage)
- * CPU A AD7417_AD4 14 (CPU A current)
- *
- * CPU A FAKE POWER 48 (I_V_inputs: 13, 14)
- *
- * CPU B AD7417_TEMP 15 (CPU B ambient temperature)
- * CPU B AD7417_AD1 16 (CPU B diode temperature)
- * CPU B AD7417_AD2 17 (CPU B 12V current)
- * CPU B AD7417_AD3 18 (CPU B voltage)
- * CPU B AD7417_AD4 19 (CPU B current)
- *
- * CPU B FAKE POWER 49 (I_V_inputs: 18, 19)
+ * PID factors for the Xserve DIMM control loop
*/
+#define DIMM_PID_G_d 0
+#define DIMM_PID_G_p 0
+#define DIMM_PID_G_r 0x6553600
+#define DIMM_PID_INPUT_TARGET 3276800
+#define DIMM_PID_INTERVAL 1
+#define DIMM_PID_OUTPUT_MAX 14000
+#define DIMM_PID_OUTPUT_MIN 4000
+#define DIMM_PID_HISTORY_SIZE 20
+
+struct dimm_pid_state
+{
+ int ticks;
+ struct i2c_client * monitor;
+ s32 sample_history[DIMM_PID_HISTORY_SIZE];
+ s32 error_history[DIMM_PID_HISTORY_SIZE];
+ int cur_sample;
+ s32 last_temp;
+ int first;
+ int output;
+};
+
+
+
+/* Desktops */
#define CPUA_INTAKE_FAN_RPM_DEFAULT_ID 3
#define CPUA_EXHAUST_FAN_RPM_DEFAULT_ID 4
@@ -226,8 +247,17 @@
#define CPUA_PUMP_RPM_INDEX 7
#define CPUB_PUMP_RPM_INDEX 8
-#define CPU_PUMP_OUTPUT_MAX 3700
-#define CPU_PUMP_OUTPUT_MIN 1000
+#define CPU_PUMP_OUTPUT_MAX 3200
+#define CPU_PUMP_OUTPUT_MIN 1250
+
+/* Xserve */
+#define CPU_A1_FAN_RPM_INDEX 9
+#define CPU_A2_FAN_RPM_INDEX 10
+#define CPU_A3_FAN_RPM_INDEX 11
+#define CPU_B1_FAN_RPM_INDEX 12
+#define CPU_B2_FAN_RPM_INDEX 13
+#define CPU_B3_FAN_RPM_INDEX 14
+
struct cpu_pid_state
{
@@ -249,6 +279,8 @@
s32 last_power;
int first;
u8 adc_config;
+ s32 pump_min;
+ s32 pump_max;
};
/*
^ permalink raw reply
* Re: Linux 2.6.x on 8xx status
From: Marcelo Tosatti @ 2005-02-10 17:08 UTC (permalink / raw)
To: Dan Malek; +Cc: Smith, Craig, linux-ppc-embedded
In-Reply-To: <20050210170658.GA20153@logos.cnet>
On Thu, Feb 10, 2005 at 03:06:58PM -0200, Marcelo Tosatti wrote:
> On Thu, Feb 10, 2005 at 02:26:52PM -0500, Dan Malek wrote:
> >
> > On Feb 10, 2005, at 10:04 AM, Marcelo Tosatti wrote:
> >
> > >Does anyone have a clue of what is/can be wrong with the TLB entry for
> > >the
> > >address being flushed at __flush_dcache_icache()?
> >
> > Not sure. The problem is that the __flush_dcache_icache is passed a
> > user space virtual address that doesn't look like it is mapped for
> > writing
> > or something. I don't know, as an ooops isn't sufficient to debug the
> > problem.
> > You have to catch it here and track down the current state of the TLB
> > and
> > the page tables. Of course, when I do this everything looks OK,
>
> How do you do track down the current TLB state? With a BDI?
>
> > so what I've been trying to do is catch the TLBmiss reload that actually causes
> > this
> > to happen to see what it really tried to load into the tlb.
>
> Shouldnt it be loading the TLB entry which "seem to be OK" accordingly to your
> analysis ??
So this assumption which you have made sometime ago is wrong, given that now you
know TLB entry is not stale ?
"The symptom is we appear to have a stale TLB entry,
so at least one of the callouts from the generic VM
code isn't doing the right thing for us. I'm still
puzzled as to why it doesn't affect other PPC processor."
^ permalink raw reply
* Re: Linux 2.6.x on 8xx status
From: Marcelo Tosatti @ 2005-02-10 17:06 UTC (permalink / raw)
To: Dan Malek; +Cc: Smith, Craig, linux-ppc-embedded
In-Reply-To: <c5f8c158f9254cbb0a8e085cf0fda8de@embeddededge.com>
On Thu, Feb 10, 2005 at 02:26:52PM -0500, Dan Malek wrote:
>
> On Feb 10, 2005, at 10:04 AM, Marcelo Tosatti wrote:
>
> >Does anyone have a clue of what is/can be wrong with the TLB entry for
> >the
> >address being flushed at __flush_dcache_icache()?
>
> Not sure. The problem is that the __flush_dcache_icache is passed a
> user space virtual address that doesn't look like it is mapped for
> writing
> or something. I don't know, as an ooops isn't sufficient to debug the
> problem.
> You have to catch it here and track down the current state of the TLB
> and
> the page tables. Of course, when I do this everything looks OK,
How do you do track down the current TLB state? With a BDI?
> so what I've been trying to do is catch the TLBmiss reload that actually causes
> this
> to happen to see what it really tried to load into the tlb.
Shouldnt it be loading the TLB entry which "seem to be OK" accordingly to your
analysis ??
> A much more
> challenging project :-) I'll get it one of these days .....
I see... thanks for your help.
BTW, we are seeing very bad slowdown on v2.4 compared to v2.6 on m8xx.
Its likely to be cache related - I'm preparing a detailed email about it.
^ permalink raw reply
* therm_pm72 changes for xserve
From: Richard Henderson @ 2005-02-10 19:14 UTC (permalink / raw)
To: Benjamin Herrenschmidt; +Cc: linuxppc-dev
The machine appears to be stable under load with this patch.
Which isn't *terribly* surprising since fan speed under darwin
seems to be universally lower. (If there's a way to probe the
actual values under darwin, I don't know it. This just from
standing next to the machine and listening. I suppose this
could be from failing to lower the rpms of the third cpu fans.)
I am kinda surprised about the data we pull out the eeprom.
It seems to believe that 75C is a good target temperature.
Idle temp appears to be 42C; load temp hovers around 60C.
The high target temp means that we don't ever increase the
fan speed from the adversised minimum.
I got the actual fan ids from a patch that Harald Welte wrote
once upon a time, someplace googleable. I'll admit that I have
no idea how one gets from
od /proc/device-tree/sep/fans/cpu-a-1/control-id
0000000 000000 040400
or any other entry in any of that directory, to .id=3.
Anyway, if this isn't clean enough, give me some direction.
r~
===== therm_pm72.c 1.7 vs edited =====
--- 1.7/drivers/macintosh/therm_pm72.c 2004-11-28 04:43:25 -08:00
+++ edited/therm_pm72.c 2005-02-09 23:03:08 -08:00
@@ -48,7 +48,6 @@
* - Deal with fan and i2c failures in a better way
* - Maybe do a generic PID based on params used for
* U3 and Drives ?
- * - Add RackMac3,1 support (XServe g5)
*
* History:
*
@@ -175,7 +174,7 @@
#define FCU_FAN_COUNT ARRAY_SIZE(fcu_fans)
-struct fcu_fan_table fcu_fans[] = {
+static struct fcu_fan_table powermac_fcu_fans[] = {
[BACKSIDE_FAN_PWM_INDEX] = {
.loc = "BACKSIDE",
.type = FCU_FAN_PWM,
@@ -226,6 +225,59 @@
},
};
+/* ??? There are actually 3 fans per cpu. We lack controling fans 2 and 5.
+ for cpus a and b respectively. There are also fan-1@47 and fan-2@48,
+ and I don't know where they are. They're type "adc" though. */
+static struct fcu_fan_table rackmac_fcu_fans[] = {
+ [BACKSIDE_FAN_PWM_INDEX] = {
+ .loc = "BACKSIDE",
+ .type = FCU_FAN_PWM,
+ .id = BACKSIDE_FAN_PWM_DEFAULT_ID,
+ },
+ [DRIVES_FAN_RPM_INDEX] = {
+ .loc = "DRIVE BAY",
+ .type = FCU_FAN_RPM,
+ .id = FCU_FAN_ABSENT_ID,
+ },
+ [SLOTS_FAN_PWM_INDEX] = {
+ .loc = "SLOT",
+ .type = FCU_FAN_PWM,
+ .id = SLOTS_FAN_PWM_DEFAULT_ID,
+ },
+ [CPUA_INTAKE_FAN_RPM_INDEX] = {
+ .loc = "CPU A INTAKE",
+ .type = FCU_FAN_RPM,
+ .id = 3,
+ },
+ [CPUA_EXHAUST_FAN_RPM_INDEX] = {
+ .loc = "CPU A EXHAUST",
+ .type = FCU_FAN_RPM,
+ .id = 1,
+ },
+ [CPUB_INTAKE_FAN_RPM_INDEX] = {
+ .loc = "CPU B INTAKE",
+ .type = FCU_FAN_RPM,
+ .id = 4,
+ },
+ [CPUB_EXHAUST_FAN_RPM_INDEX] = {
+ .loc = "CPU B EXHAUST",
+ .type = FCU_FAN_RPM,
+ .id = 6,
+ },
+ [CPUA_PUMP_RPM_INDEX] = {
+ .loc = "CPU A PUMP",
+ .type = FCU_FAN_RPM,
+ .id = FCU_FAN_ABSENT_ID,
+ },
+ [CPUB_PUMP_RPM_INDEX] = {
+ .loc = "CPU B PUMP",
+ .type = FCU_FAN_RPM,
+ .id = FCU_FAN_ABSENT_ID,
+ },
+};
+
+struct fcu_fan_table *fcu_fans;
+
/*
* i2c_driver structure to attach to the host i2c controller
*/
@@ -1174,10 +1226,13 @@
/* Check fan status */
rc = get_rpm_fan(DRIVES_FAN_RPM_INDEX, !RPM_PID_USE_ACTUAL_SPEED);
if (rc < 0) {
- printk(KERN_WARNING "Error %d reading drives fan !\n", rc);
- /* XXX What do we do now ? */
- } else
- state->rpm = rc;
+ if (rc != -EINVAL)
+ printk(KERN_WARNING "Error %d reading drives fan !\n",
+ rc);
+ return;
+ }
+
+ state->rpm = rc;
DBG(" current rpm: %d\n", state->rpm);
/* Get some sensor readings */
@@ -1671,8 +1726,12 @@
{
struct device_node *np;
- if (!machine_is_compatible("PowerMac7,2") &&
- !machine_is_compatible("PowerMac7,3"))
+ if (machine_is_compatible("PowerMac7,2") ||
+ machine_is_compatible("PowerMac7,3"))
+ fcu_fans = powermac_fcu_fans;
+ else if (machine_is_compatible("RackMac3,1"))
+ fcu_fans = rackmac_fcu_fans;
+ else
return -ENODEV;
printk(KERN_INFO "PowerMac G5 Thermal control driver %s\n", VERSION);
@@ -1709,6 +1768,6 @@
module_exit(therm_pm72_exit);
MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>");
-MODULE_DESCRIPTION("Driver for Apple's PowerMac7,2 G5 thermal control");
+MODULE_DESCRIPTION("Driver for Apple's PowerMac and RackMac G5 thermal control");
MODULE_LICENSE("GPL");
===== Kconfig 1.9 vs edited =====
--- 1.9/drivers/macintosh/Kconfig 2004-08-02 01:00:44 -07:00
+++ edited/Kconfig 2005-02-09 23:02:41 -08:00
@@ -177,11 +177,11 @@
better fan behaviour by default, and some manual control.
config THERM_PM72
- tristate "Support for thermal management on PowerMac G5"
+ tristate "Support for thermal management on Apple G5"
depends on I2C && I2C_KEYWEST && PPC_PMAC64
help
- This driver provides thermostat and fan control for the desktop
- G5 machines.
+ This driver provides thermostat and fan control for desktop
+ and rack-mounted G5 machines.
config ANSLCD
tristate "Support for ANS LCD display"
^ permalink raw reply
* Re: Linux 2.6.x on 8xx status
From: Dan Malek @ 2005-02-10 19:26 UTC (permalink / raw)
To: Marcelo Tosatti; +Cc: Smith, Craig, linux-ppc-embedded
In-Reply-To: <20050210150437.GA19134@logos.cnet>
On Feb 10, 2005, at 10:04 AM, Marcelo Tosatti wrote:
> Does anyone have a clue of what is/can be wrong with the TLB entry for
> the
> address being flushed at __flush_dcache_icache()?
Not sure. The problem is that the __flush_dcache_icache is passed a
user space virtual address that doesn't look like it is mapped for
writing
or something. I don't know, as an ooops isn't sufficient to debug the
problem.
You have to catch it here and track down the current state of the TLB
and
the page tables. Of course, when I do this everything looks OK, so what
I've been trying to do is catch the TLBmiss reload that actually causes
this
to happen to see what it really tried to load into the tlb. A much more
challenging project :-) I'll get it one of these days .....
-- Dan
^ permalink raw reply
* Re: Linux 2.6.x on 8xx status
From: Marcelo Tosatti @ 2005-02-10 15:04 UTC (permalink / raw)
To: Dan Malek; +Cc: Smith, Craig, linux-ppc-embedded
In-Reply-To: <28F2CE72-0BF0-11D9-97DC-003065F9B7DC@embeddededge.com>
On Tue, Sep 21, 2004 at 01:03:29PM -0400, Dan Malek wrote:
>
> On Sep 21, 2004, at 7:59 AM, Smith, Craig wrote:
>
> >Genius. That patch appears to work for me as well.
>
> The fact this works indicates a subtle memory management
> problem elsewhere. I don't know what that is at this
> point. This hack is in a piece of generic code that works
> properly on all other PowerPC cores, so it isn't going to
> ever appear in the public sources.
>
> I suggested this change to a few people hoping the information
> would lead them to finding the real problem, not that it
> should be perpetuated as a "fix" to make 8xx work.
> I don't personally have time to work on this right now,
> so anyone using 8xx should be looking for the real
> cause and solution, not using this to create products.
Hi Dan,
Does anyone have a clue of what is/can be wrong with the TLB entry for the
address being flushed at __flush_dcache_icache()?
Can we assume such TLB entry is corrupted in some way?
This is v2.6.10 on m8xx - with the TLB invalidate everything works as
expected.
Oops: kernel access of bad area, sig: 11 [#1]
NIP: C00049F8 LR: C000A3E0 SP: C48D1E10 REGS: c48d1d60 TRAP: 0300 Not tainted
MSR: 00009032 EE: 1 PR: 0 FP: 0 ME: 1 IR/DR: 11
DAR: 100113A0, DSISR: C2000000
TASK = c4e1eba0[1230] 'netserver' THREAD: c48d0000
Last syscall: 20
GPR00: C4ED7D60 C48D1E10 C4E1EBA0 10011000 00000100 000954A0 10011000 C01C8090
GPR08: C02E64B8 C4ED7D60 00009032 00000000 00020591 100B46A8 00000000 100CA328
GPR16: 100CA1E8 2FEED1FF F657FFF4 00000000 00000000 00000000 C48D1E28 00000000
GPR24: C1148100 00000000 C1147EA4 C4ED7D60 100113A0 C1229418 04AA5889 C02E64A0
NIP [c00049f8] __flush_dcache_icache+0x14/0x40
LR [c000a3e0] update_mmu_cache+0x64/0x98
Call trace:
[c003f3a4] do_no_page+0x2ec/0x364
[c003f588] handle_mm_fault+0xa4/0x17c
[c0009968] do_page_fault+0x168/0x394
[c0002c68] handle_page_fault+0xc/0x80
^ permalink raw reply
* another datapoint on ide dma issue with via
From: John F Davis @ 2005-02-10 15:21 UTC (permalink / raw)
To: linuxppc-embedded
Hello
Another thing I have noticed is that if I copy the files to and from disk
prior to starting xine playback it will work.
ie. This works:
hdparm -d1 /dev/hda
mount /dev/hda2 /mnt/disk
Run in four windows simulataneously:
while true; do
/root/driver Super.mpg $1 " This program uses mmap io to copy
the src file to the dest file."
sync
md5sum Super.mpg
sync;
md5sum $1;
rm $1;
sync;
done
Kill all the scripts.
startx
start xine
run the super.mpg video from /mnt/disk. It works flawlessly.
and This doesn't:
reboot
hdparm -d1 /dev/hda
mount /dev/hda2 /mnt/disk
startx
start xine
run the super.mpg video from /mnt/disk. I will
get nfsroot errors about nfs server not responding.
then ksymoops with xine making the last system call.
JD
^ permalink raw reply
* Re: Memory leak problem
From: robin @ 2005-02-10 9:46 UTC (permalink / raw)
To: Gerhard Jaeger, linuxppc-embedded
In-Reply-To: <200502100840.38232.g.jaeger@sysgo.com>
[-- Attachment #1: Type: text/plain, Size: 1884 bytes --]
Hi thanks for your reply..
I am attaching the kernel config file. the kernel version is kernel 2.4.20.
The processor we are using is MPC852T.
Am i correct in my conclusion that the software restart(killing and
restarting) without kernel reboot does free all resources used by the
software including memory??
thanks in advance
On Thursday 10 Feb 2005 1:10 pm, you wrote:
> On Thursday 10 February 2005 07:07, robin wrote:
> > Hi
> > We have an application running on denx linux kernel 2.4.20.
> >
> > Apparently there is a memory leak that we are not able to find.
> > The application is giving out of memory error. Even if we restart
> > the application without rebooting the kernel, (killing all application
> > processes and restarting), it gives the same out of memory error.
> > Rebooting the kernel solves the problem.
> >
> > It seems that the memory leak is not at the application level
> > 'cos restarting the application doesnt solve the problem..
> >
> > 1. Any ideas where I should look for the leak??
>
> Check /proc/slabinfo and see if there are some "supicious" buffer,
> that only increase and never decrease. From the kind of buffer
> showing this behaviour you might find out where to dig...
> Check it before running the application and afterwards.
>
> > 2. Is there any known memory leak problems with the kernel??
>
> There are enough places, where a kernel could leak, but in general
> such leaks in the main part are detected really fast. Undiscovered
> leaks are often found in the drivers itself.
>
> What's your kernel config?
> Which HW are you using?
> What does this application?
>
> Ciao,
> Gerhard
--
Nvidia driver loaded - bugs to nvidia. vmware loaded bugs to vmware,
both loaded, god help you, nobody else will
- Alan Cox explaining where to send bug reports for binary-only drivers
[-- Attachment #2: config --]
[-- Type: text/plain, Size: 17273 bytes --]
#
# Automatically generated make config: don't edit
#
# CONFIG_UID16 is not set
# CONFIG_RWSEM_GENERIC_SPINLOCK is not set
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_HAVE_DEC_LOCK=y
#
# Code maturity level options
#
CONFIG_EXPERIMENTAL=y
CONFIG_ADVANCED_OPTIONS=y
CONFIG_TRIM_DOWN=y
#
# Loadable module support
#
CONFIG_MODULES=y
# CONFIG_MODVERSIONS is not set
CONFIG_KMOD=y
#
# Platform support
#
CONFIG_PPC=y
CONFIG_PPC32=y
# CONFIG_6xx is not set
# CONFIG_40x is not set
# CONFIG_440 is not set
# CONFIG_POWER3 is not set
CONFIG_8xx=y
# CONFIG_PPC_ISERIES is not set
# CONFIG_PPC_STD_MMU is not set
CONFIG_SERIAL_CONSOLE=y
CONFIG_NOT_COHERENT_CACHE=y
# CONFIG_RPXLITE is not set
# CONFIG_RPXCLASSIC is not set
# CONFIG_BSEIP is not set
# CONFIG_FADS is not set
# CONFIG_TQM823L is not set
# CONFIG_TQM850L is not set
# CONFIG_TQM855L is not set
# CONFIG_TQM860L is not set
# CONFIG_TQM823M is not set
# CONFIG_TQM850M is not set
# CONFIG_TQM855M is not set
# CONFIG_TQM860M is not set
# CONFIG_TQM862M is not set
# CONFIG_FPS850L is not set
# CONFIG_SPD823TS is not set
# CONFIG_IVMS8 is not set
# CONFIG_IVML24 is not set
# CONFIG_SM850 is not set
# CONFIG_HERMES_PRO is not set
# CONFIG_IP860 is not set
# CONFIG_LWMON is not set
# CONFIG_PCU_E is not set
# CONFIG_CCM is not set
# CONFIG_LANTEC is not set
# CONFIG_MBX is not set
CONFIG_TEJAS=y
# CONFIG_DAB4K is not set
# CONFIG_WINCEPT is not set
CONFIG_TN100=y
# CONFIG_TN200 is not set
CONFIG_IGN_MC_EXCEP=y
# CONFIG_TN100_ITC is not set
# CONFIG_TN100_LTC is not set
# CONFIG_TN100_MC4L is not set
CONFIG_TN100_TXC1=y
# CONFIG_TN100_LTC4 is not set
# CONFIG_TN100_LPSS2 is not set
# CONFIG_ALL_PPC is not set
# CONFIG_SMP is not set
# CONFIG_MATH_EMULATION is not set
CONFIG_EMBEDDEDBOOT=y
#
# General setup
#
# CONFIG_HIGHMEM is not set
# CONFIG_KERNEL_START_BOOL is not set
# CONFIG_TASK_SIZE_BOOL is not set
# CONFIG_PIN_TLB is not set
# CONFIG_ISA is not set
# CONFIG_EISA is not set
# CONFIG_SBUS is not set
# CONFIG_MCA is not set
# CONFIG_PCI_QSPAN is not set
# CONFIG_PCI is not set
CONFIG_NET=y
CONFIG_SYSCTL=y
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_KCORE_ELF=y
CONFIG_BINFMT_ELF=y
CONFIG_KERNEL_ELF=y
CONFIG_BINFMT_MISC=y
# CONFIG_HOTPLUG is not set
# CONFIG_PCMCIA is not set
#
# Parallel port support
#
# CONFIG_PARPORT is not set
# CONFIG_PPC_RTC is not set
# CONFIG_CMDLINE_BOOL is not set
#
# Memory Technology Devices (MTD)
#
CONFIG_MTD=y
# CONFIG_MTD_DEBUG is not set
CONFIG_MTD_PARTITIONS=y
# CONFIG_MTD_CONCAT is not set
# CONFIG_MTD_REDBOOT_PARTS is not set
# CONFIG_MTD_CMDLINE_PARTS is not set
#
# User Modules And Translation Layers
#
CONFIG_MTD_CHAR=y
CONFIG_MTD_BLOCK=y
# CONFIG_FTL is not set
# CONFIG_NFTL is not set
# CONFIG_INFTL is not set
#
# RAM/ROM/Flash chip drivers
#
CONFIG_MTD_CFI=y
# CONFIG_MTD_JEDECPROBE is not set
CONFIG_MTD_GEN_PROBE=y
CONFIG_MTD_CFI_ADV_OPTIONS=y
CONFIG_MTD_CFI_NOSWAP=y
# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
CONFIG_MTD_CFI_GEOMETRY=y
# CONFIG_MTD_CFI_B1 is not set
# CONFIG_MTD_CFI_B2 is not set
CONFIG_MTD_CFI_B4=y
# CONFIG_MTD_CFI_B8 is not set
# CONFIG_MTD_CFI_I1 is not set
CONFIG_MTD_CFI_I2=y
# CONFIG_MTD_CFI_I4 is not set
# CONFIG_MTD_CFI_I8 is not set
# CONFIG_MTD_CFI_INTELEXT is not set
CONFIG_MTD_CFI_AMDSTD=y
# CONFIG_MTD_CFI_STAA is not set
# CONFIG_MTD_RAM is not set
# CONFIG_MTD_ROM is not set
# CONFIG_MTD_ABSENT is not set
# CONFIG_MTD_OBSOLETE_CHIPS is not set
# CONFIG_MTD_AMDSTD is not set
# CONFIG_MTD_SHARP is not set
# CONFIG_MTD_JEDEC is not set
#
# Mapping drivers for chip access
#
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
# CONFIG_MTD_PHYSMAP is not set
CONFIG_MTD_TN100_MAP=y
# CONFIG_MTD_TN100_MAP_HARD_CODED is not set
CONFIG_MTD_PHYSMAP_BUSWIDTH=4
# CONFIG_MTD_DBOX2 is not set
# CONFIG_MTD_CFI_FLAGADM is not set
# CONFIG_MTD_PCI is not set
# CONFIG_MTD_PCMCIA is not set
#
# Self-contained MTD device drivers
#
# CONFIG_MTD_PMC551 is not set
CONFIG_MTD_SLRAM=y
# CONFIG_MTD_MTDRAM is not set
# CONFIG_MTD_BLKMTD is not set
#
# Disk-On-Chip Device Drivers
#
# CONFIG_MTD_DOC2000 is not set
# CONFIG_MTD_DOC2001 is not set
# CONFIG_MTD_DOC2001PLUS is not set
# CONFIG_MTD_DOCPROBE is not set
#
# NAND Flash Device Drivers
#
# CONFIG_MTD_NAND is not set
#
# Plug and Play configuration
#
# CONFIG_PNP is not set
# CONFIG_ISAPNP is not set
#
# Block devices
#
# CONFIG_BLK_DEV_FD is not set
# CONFIG_BLK_DEV_XD is not set
# CONFIG_PARIDE is not set
# CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_CISS_SCSI_TAPE is not set
# CONFIG_BLK_DEV_DAC960 is not set
# CONFIG_BLK_DEV_UMEM is not set
CONFIG_BLK_DEV_LOOP=y
# CONFIG_BLK_DEV_NBD is not set
# CONFIG_BLK_DEV_RAM is not set
# CONFIG_BLK_DEV_INITRD is not set
# CONFIG_BLK_STATS is not set
#
# Multi-device support (RAID and LVM)
#
# CONFIG_MD is not set
# CONFIG_BLK_DEV_MD is not set
# CONFIG_MD_LINEAR is not set
# CONFIG_MD_RAID0 is not set
# CONFIG_MD_RAID1 is not set
# CONFIG_MD_RAID5 is not set
# CONFIG_MD_MULTIPATH is not set
# CONFIG_BLK_DEV_LVM is not set
#
# Networking options
#
CONFIG_PACKET=y
# CONFIG_PACKET_MMAP is not set
# CONFIG_NETLINK_DEV is not set
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
# CONFIG_FILTER is not set
CONFIG_UNIX=y
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_ADVANCED_ROUTER=y
# CONFIG_IP_MULTIPLE_TABLES is not set
# CONFIG_IP_ROUTE_MULTIPATH is not set
# CONFIG_IP_ROUTE_TOS is not set
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_ROUTE_LARGE_TABLES=y
# CONFIG_IP_PNP is not set
CONFIG_NET_IPIP=y
# CONFIG_NET_IPGRE is not set
CONFIG_IP_MROUTE=y
CONFIG_IP_PIMSM_V1=y
# CONFIG_IP_PIMSM_V2 is not set
# CONFIG_ARPD is not set
CONFIG_INET_ECN=y
CONFIG_SYN_COOKIES=y
#
# IP: Netfilter Configuration
#
CONFIG_IP_NF_CONNTRACK=y
CONFIG_IP_NF_FTP=y
CONFIG_IP_NF_IRC=y
# CONFIG_IP_NF_QUEUE is not set
CONFIG_IP_NF_IPTABLES=y
CONFIG_IP_NF_MATCH_LIMIT=y
CONFIG_IP_NF_MATCH_MAC=y
CONFIG_IP_NF_MATCH_PKTTYPE=y
CONFIG_IP_NF_MATCH_MARK=y
CONFIG_IP_NF_MATCH_MULTIPORT=y
CONFIG_IP_NF_MATCH_TOS=y
CONFIG_IP_NF_MATCH_ECN=y
CONFIG_IP_NF_MATCH_DSCP=y
CONFIG_IP_NF_MATCH_AH_ESP=y
CONFIG_IP_NF_MATCH_LENGTH=y
CONFIG_IP_NF_MATCH_TTL=y
CONFIG_IP_NF_MATCH_TCPMSS=y
CONFIG_IP_NF_MATCH_HELPER=y
CONFIG_IP_NF_MATCH_STATE=y
CONFIG_IP_NF_MATCH_CONNTRACK=y
CONFIG_IP_NF_MATCH_UNCLEAN=y
CONFIG_IP_NF_MATCH_OWNER=y
CONFIG_IP_NF_FILTER=y
CONFIG_IP_NF_TARGET_REJECT=y
CONFIG_IP_NF_TARGET_MIRROR=y
CONFIG_IP_NF_NAT=y
CONFIG_IP_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=y
CONFIG_IP_NF_TARGET_REDIRECT=y
# CONFIG_IP_NF_NAT_LOCAL is not set
CONFIG_IP_NF_NAT_SNMP_BASIC=y
CONFIG_IP_NF_NAT_IRC=y
CONFIG_IP_NF_NAT_FTP=y
# CONFIG_IP_NF_MANGLE is not set
# CONFIG_IP_NF_TARGET_LOG is not set
CONFIG_IP_NF_TARGET_ULOG=y
CONFIG_IP_NF_TARGET_TCPMSS=y
CONFIG_IP_NF_ARPTABLES=y
CONFIG_IP_NF_ARPFILTER=y
# CONFIG_IPV6 is not set
# CONFIG_KHTTPD is not set
# CONFIG_ATM is not set
# CONFIG_VLAN_8021Q is not set
#
#
#
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
#
# Appletalk devices
#
# CONFIG_DEV_APPLETALK is not set
# CONFIG_DECNET is not set
# CONFIG_BRIDGE is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_LLC is not set
# CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_NET_FASTROUTE is not set
# CONFIG_NET_HW_FLOWCONTROL is not set
#
# QoS and/or fair queueing
#
# CONFIG_NET_SCHED is not set
#
# Network testing
#
# CONFIG_NET_PKTGEN is not set
#
# ATA/IDE/MFM/RLL support
#
CONFIG_IDE=y
#
# IDE, ATA and ATAPI Block devices
#
CONFIG_BLK_DEV_IDE=y
#
# Please see Documentation/ide.txt for help/info on IDE drives
#
# CONFIG_BLK_DEV_HD_IDE is not set
# CONFIG_BLK_DEV_HD is not set
CONFIG_BLK_DEV_IDEDISK=y
CONFIG_IDEDISK_MULTI_MODE=y
# CONFIG_IDEDISK_STROKE is not set
# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set
# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set
# CONFIG_BLK_DEV_IDEDISK_IBM is not set
# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set
# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set
# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set
# CONFIG_BLK_DEV_IDEDISK_WD is not set
# CONFIG_BLK_DEV_COMMERIAL is not set
# CONFIG_BLK_DEV_TIVO is not set
# CONFIG_BLK_DEV_IDECS is not set
# CONFIG_BLK_DEV_IDECD is not set
# CONFIG_BLK_DEV_IDETAPE is not set
# CONFIG_BLK_DEV_IDEFLOPPY is not set
# CONFIG_BLK_DEV_IDESCSI is not set
# CONFIG_IDE_TASK_IOCTL is not set
#
# IDE chipset support/bugfixes
#
# CONFIG_BLK_DEV_CMD640 is not set
# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
# CONFIG_BLK_DEV_ISAPNP is not set
CONFIG_BLK_DEV_MPC8xx_IDE=y
CONFIG_IDE_8xx_PCCARD=y
# CONFIG_IDE_8xx_DIRECT is not set
# CONFIG_IDE_EXT_DIRECT is not set
# CONFIG_IDE_CHIPSETS is not set
# CONFIG_IDEDMA_AUTO is not set
# CONFIG_DMA_NONPCI is not set
CONFIG_BLK_DEV_IDE_MODES=y
# CONFIG_BLK_DEV_ATARAID is not set
# CONFIG_BLK_DEV_ATARAID_PDC is not set
# CONFIG_BLK_DEV_ATARAID_HPT is not set
#
# SCSI support
#
# CONFIG_SCSI is not set
#
# Fusion MPT device support
#
# CONFIG_FUSION is not set
# CONFIG_FUSION_BOOT is not set
# CONFIG_FUSION_ISENSE is not set
# CONFIG_FUSION_CTL is not set
# CONFIG_FUSION_LAN is not set
#
# I2O device support
#
# CONFIG_I2O is not set
# CONFIG_I2O_BLOCK is not set
# CONFIG_I2O_LAN is not set
# CONFIG_I2O_SCSI is not set
# CONFIG_I2O_PROC is not set
#
# Network device support
#
CONFIG_NETDEVICES=y
#
# ARCnet devices
#
# CONFIG_ARCNET is not set
# CONFIG_DUMMY is not set
# CONFIG_BONDING is not set
# CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set
# CONFIG_ETHERTAP is not set
#
# Ethernet (10 or 100Mbit)
#
CONFIG_NET_ETHERNET=y
# CONFIG_MACE is not set
# CONFIG_BMAC is not set
# CONFIG_GMAC is not set
# CONFIG_SUNLANCE is not set
# CONFIG_SUNBMAC is not set
# CONFIG_SUNQE is not set
# CONFIG_SUNGEM is not set
# CONFIG_NET_VENDOR_3COM is not set
# CONFIG_LANCE is not set
# CONFIG_NET_VENDOR_SMC is not set
# CONFIG_NET_VENDOR_RACAL is not set
# CONFIG_NET_ISA is not set
# CONFIG_NET_PCI is not set
# CONFIG_NET_POCKET is not set
#
# Ethernet (1000 Mbit)
#
# CONFIG_ACENIC is not set
# CONFIG_DL2K is not set
# CONFIG_E1000 is not set
# CONFIG_MYRI_SBUS is not set
# CONFIG_NS83820 is not set
# CONFIG_HAMACHI is not set
# CONFIG_YELLOWFIN is not set
# CONFIG_SK98LIN is not set
# CONFIG_TIGON3 is not set
# CONFIG_FDDI is not set
# CONFIG_HIPPI is not set
# CONFIG_PLIP is not set
CONFIG_PPP=y
# CONFIG_PPP_MULTILINK is not set
# CONFIG_PPP_FILTER is not set
CONFIG_PPP_ASYNC=y
# CONFIG_PPP_SYNC_TTY is not set
CONFIG_PPP_DEFLATE=y
# CONFIG_PPP_BSDCOMP is not set
# CONFIG_PPPOE is not set
# CONFIG_SLIP is not set
#
# Wireless LAN (non-hamradio)
#
# CONFIG_NET_RADIO is not set
#
# Token Ring devices
#
# CONFIG_TR is not set
# CONFIG_NET_FC is not set
# CONFIG_RCPCI is not set
# CONFIG_SHAPER is not set
#
# Wan interfaces
#
CONFIG_WAN=y
# CONFIG_COMX is not set
# CONFIG_DSCC4 is not set
# CONFIG_FARSYNC is not set
# CONFIG_LANMEDIA is not set
# CONFIG_ATI_XX20 is not set
# CONFIG_SEALEVEL_4021 is not set
CONFIG_SYNCLINK_SYNCPPP=y
# CONFIG_HDLC is not set
# CONFIG_DLCI is not set
# CONFIG_LAPBETHER is not set
# CONFIG_X25_ASY is not set
#
# Amateur Radio support
#
# CONFIG_HAMRADIO is not set
#
# IrDA (infrared) support
#
# CONFIG_IRDA is not set
#
# ISDN subsystem
#
# CONFIG_ISDN is not set
#
# Old CD-ROM drivers (not SCSI, not IDE)
#
# CONFIG_CD_NO_IDESCSI is not set
#
# Console drivers
#
#
# Frame-buffer support
#
# CONFIG_FB is not set
#
# Input core support
#
# CONFIG_INPUT is not set
# CONFIG_INPUT_KEYBDEV is not set
# CONFIG_INPUT_MOUSEDEV is not set
# CONFIG_INPUT_JOYDEV is not set
# CONFIG_INPUT_EVDEV is not set
#
# Macintosh device drivers
#
#
# Character devices
#
# CONFIG_VT is not set
# CONFIG_SERIAL is not set
# CONFIG_SERIAL_EXTENDED is not set
CONFIG_SERIAL_NONSTANDARD=y
# CONFIG_COMPUTONE is not set
# CONFIG_ROCKETPORT is not set
# CONFIG_CYCLADES is not set
# CONFIG_DIGIEPCA is not set
# CONFIG_DIGI is not set
# CONFIG_ESPSERIAL is not set
# CONFIG_MOXA_INTELLIO is not set
# CONFIG_MOXA_SMARTIO is not set
# CONFIG_ISI is not set
# CONFIG_SYNCLINK is not set
# CONFIG_SYNCLINKMP is not set
# CONFIG_N_HDLC is not set
# CONFIG_RISCOM8 is not set
# CONFIG_SPECIALIX is not set
# CONFIG_SX is not set
# CONFIG_RIO is not set
# CONFIG_STALDRV is not set
CONFIG_UNIX98_PTYS=y
CONFIG_UNIX98_PTY_COUNT=128
#
# I2C support
#
# CONFIG_I2C is not set
#
# Mice
#
# CONFIG_BUSMOUSE is not set
# CONFIG_MOUSE is not set
#
# Joysticks
#
# CONFIG_INPUT_GAMEPORT is not set
#
# Input core support is needed for gameports
#
#
# Input core support is needed for joysticks
#
# CONFIG_QIC02_TAPE is not set
#
# Watchdog Cards
#
CONFIG_WATCHDOG=y
CONFIG_WATCHDOG_NOWAYOUT=y
# CONFIG_ACQUIRE_WDT is not set
# CONFIG_ADVANTECH_WDT is not set
# CONFIG_ALIM7101_WDT is not set
# CONFIG_SC520_WDT is not set
# CONFIG_PCWATCHDOG is not set
# CONFIG_EUROTECH_WDT is not set
# CONFIG_IB700_WDT is not set
# CONFIG_WAFER_WDT is not set
# CONFIG_I810_TCO is not set
# CONFIG_MIXCOMWD is not set
# CONFIG_60XX_WDT is not set
# CONFIG_SC1200_WDT is not set
# CONFIG_SOFT_WATCHDOG is not set
# CONFIG_W83877F_WDT is not set
# CONFIG_WDT is not set
# CONFIG_WDTPCI is not set
# CONFIG_MACHZ_WDT is not set
# CONFIG_AMD7XX_TCO is not set
CONFIG_WDT_MPC8XX=y
# CONFIG_AMD_PM768 is not set
# CONFIG_NVRAM is not set
# CONFIG_RTC is not set
# CONFIG_RTC_11_MINUTE_MODE is not set
# CONFIG_PCF8563_RTC is not set
# CONFIG_RTC_8XX is not set
# CONFIG_DTLK is not set
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set
# CONFIG_FLASH is not set
#
# Ftape, the floppy tape device driver
#
# CONFIG_FTAPE is not set
# CONFIG_AGP is not set
# CONFIG_DRM is not set
#
# Multimedia devices
#
# CONFIG_VIDEO_DEV is not set
#
# File systems
#
# CONFIG_QUOTA is not set
# CONFIG_AUTOFS_FS is not set
# CONFIG_AUTOFS4_FS is not set
# CONFIG_REISERFS_FS is not set
# CONFIG_REISERFS_CHECK is not set
# CONFIG_REISERFS_PROC_INFO is not set
# CONFIG_ADFS_FS is not set
# CONFIG_ADFS_FS_RW is not set
# CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_BEFS_FS is not set
# CONFIG_BEFS_DEBUG is not set
# CONFIG_BFS_FS is not set
CONFIG_EXT3_FS=y
CONFIG_JBD=y
# CONFIG_JBD_DEBUG is not set
# CONFIG_FAT_FS is not set
# CONFIG_MSDOS_FS is not set
# CONFIG_UMSDOS_FS is not set
# CONFIG_VFAT_FS is not set
# CONFIG_EFS_FS is not set
# CONFIG_JFFS_FS is not set
CONFIG_JFFS2_FS=y
CONFIG_JFFS2_FS_DEBUG=0
# CONFIG_JFFS2_FS_NAND is not set
CONFIG_CRAMFS=y
# CONFIG_TMPFS is not set
CONFIG_RAMFS=y
# CONFIG_ISO9660_FS is not set
# CONFIG_JOLIET is not set
# CONFIG_ZISOFS is not set
# CONFIG_JFS_FS is not set
# CONFIG_JFS_DEBUG is not set
# CONFIG_JFS_STATISTICS is not set
# CONFIG_MINIX_FS is not set
# CONFIG_VXFS_FS is not set
# CONFIG_NTFS_FS is not set
# CONFIG_NTFS_RW is not set
# CONFIG_HPFS_FS is not set
CONFIG_PROC_FS=y
# CONFIG_DEVFS_FS is not set
# CONFIG_DEVFS_MOUNT is not set
# CONFIG_DEVFS_DEBUG is not set
CONFIG_DEVPTS_FS=y
# CONFIG_QNX4FS_FS is not set
# CONFIG_QNX4FS_RW is not set
# CONFIG_ROMFS_FS is not set
CONFIG_EXT2_FS=y
# CONFIG_SYSV_FS is not set
# CONFIG_UDF_FS is not set
# CONFIG_UDF_RW is not set
# CONFIG_UFS_FS is not set
# CONFIG_UFS_FS_WRITE is not set
#
# Network File Systems
#
# CONFIG_CODA_FS is not set
# CONFIG_INTERMEZZO_FS is not set
CONFIG_NFS_FS=y
# CONFIG_NFS_V3 is not set
# CONFIG_ROOT_NFS is not set
# CONFIG_NFSD is not set
# CONFIG_NFSD_V3 is not set
# CONFIG_NFSD_TCP is not set
CONFIG_SUNRPC=y
CONFIG_LOCKD=y
# CONFIG_SMB_FS is not set
# CONFIG_NCP_FS is not set
# CONFIG_NCPFS_PACKET_SIGNING is not set
# CONFIG_NCPFS_IOCTL_LOCKING is not set
# CONFIG_NCPFS_STRONG is not set
# CONFIG_NCPFS_NFS_NS is not set
# CONFIG_NCPFS_OS2_NS is not set
# CONFIG_NCPFS_SMALLDOS is not set
# CONFIG_NCPFS_NLS is not set
# CONFIG_NCPFS_EXTRAS is not set
# CONFIG_ZISOFS_FS is not set
#
# Partition Types
#
# CONFIG_PARTITION_ADVANCED is not set
CONFIG_MSDOS_PARTITION=y
# CONFIG_SMB_NLS is not set
# CONFIG_NLS is not set
#
# Sound
#
# CONFIG_SOUND is not set
#
# MPC8xx CPM Options
#
# CONFIG_CPM_TRACK_LOAD is not set
# CONFIG_SCC_ENET is not set
# CONFIG_SCC1_ENET is not set
# CONFIG_SCC2_ENET is not set
# CONFIG_SCC3_ENET is not set
CONFIG_FEC_ENET=y
CONFIG_USE_MDIO=y
# CONFIG_FEC_AM79C874 is not set
# CONFIG_FEC_LXT970 is not set
CONFIG_FEC_LXT971=y
# CONFIG_FEC_QS6612 is not set
# CONFIG_FEC_DP83843 is not set
# CONFIG_FEC_DP83846A is not set
# CONFIG_FEC_PACKETHOOK is not set
# CONFIG_ENET_BIG_BUFFERS is not set
CONFIG_SMC1_UART_RX_BDNUM=4
CONFIG_SMC1_UART_RX_BDSIZE=32
CONFIG_SMC1_UART_TX_BDNUM=4
CONFIG_SMC1_UART_TX_BDSIZE=32
# CONFIG_SMC2_UART is not set
# CONFIG_USE_SCC_IO is not set
#
# Generic MPC8xx Options
#
CONFIG_8xx_COPYBACK=y
# CONFIG_8xx_CPU6 is not set
# CONFIG_UCODE_PATCH is not set
#
# USB support
#
# CONFIG_USB is not set
#
# Bluetooth support
#
# CONFIG_BLUEZ is not set
#
# Library routines
#
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=y
#
# Kernel hacking
#
CONFIG_DEBUG_KERNEL=y
# CONFIG_MAGIC_SYSRQ is not set
# CONFIG_DEBUG_HIGHMEM is not set
# CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_IOVIRT is not set
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_WAITQ is not set
# CONFIG_KGDB is not set
# CONFIG_XMON is not set
# CONFIG_BDI_SWITCH is not set
^ permalink raw reply
* Re: Memory leak problem
From: Gerhard Jaeger @ 2005-02-10 7:40 UTC (permalink / raw)
To: linuxppc-embedded
In-Reply-To: <200502101137.07711.robin@india.tejasnetworks.com>
On Thursday 10 February 2005 07:07, robin wrote:
> Hi
> We have an application running on denx linux kernel 2.4.20.
>
> Apparently there is a memory leak that we are not able to find.
> The application is giving out of memory error. Even if we restart
> the application without rebooting the kernel, (killing all application
> processes and restarting), it gives the same out of memory error.
> Rebooting the kernel solves the problem.
>
> It seems that the memory leak is not at the application level
> 'cos restarting the application doesnt solve the problem..
>
> 1. Any ideas where I should look for the leak??
Check /proc/slabinfo and see if there are some "supicious" buffer,
that only increase and never decrease. From the kind of buffer
showing this behaviour you might find out where to dig...
Check it before running the application and afterwards.
> 2. Is there any known memory leak problems with the kernel??
There are enough places, where a kernel could leak, but in general
such leaks in the main part are detected really fast. Undiscovered
leaks are often found in the drivers itself.
What's your kernel config?
Which HW are you using?
What does this application?
Ciao,
Gerhard
--
Gerhard Jaeger <gjaeger@sysgo.com>
SYSGO AG Embedded and Real-Time Software
www.sysgo.com | www.elinos.com | www.osek.de
^ permalink raw reply
* Memory leak problem
From: robin @ 2005-02-10 6:07 UTC (permalink / raw)
To: linuxppc-embedded
In-Reply-To: <20050204192117.4F29CC108D@atlas.denx.de>
Hi
We have an application running on denx linux kernel 2.4.20.
Apparently there is a memory leak that we are not able to find.
The application is giving out of memory error. Even if we restart=20
the application without rebooting the kernel, (killing all application=20
processes and restarting), it gives the same out of memory error.=20
Rebooting the kernel solves the problem.
It seems that the memory leak is not at the application level
'cos restarting the application doesnt solve the problem..
1. Any ideas where I should look for the leak??
2. Is there any known memory leak problems with the kernel??
Thanks in advance,
Robin
^ permalink raw reply
* lspci -xxx for VIA vt82c686a?
From: John F Davis @ 2005-02-10 1:11 UTC (permalink / raw)
To: linuxppc-embedded
Hello
Anybody have a lspci -s1.1 -xxx dump for a via ide controller? Do you
have dma enabled? I would like to see your settings please. If you have
it for a 405, I would be really happy.
JD
^ permalink raw reply
* RE: MPC5200 JTAG/BDM Flash Burning
From: Andrew Dennison @ 2005-02-09 22:16 UTC (permalink / raw)
To: 'Eric N. Johnson (ACD)'; +Cc: linuxppc-embedded
In-Reply-To: <20050209203314.78351C108D@atlas.denx.de>
On , linuxppc-embedded-bounces@ozlabs.org wrote:
> In message
> <6.2.1.2.1.20050209131409.02b2b718@mail.int.acdstar.com> you wrote:
>> I'm working on a custom MPC5200 board based heavily on the IceCube
>> design from Motorola/Freescale. We plan to use the u-boot
>> bootloader.=20
>>=20
>> I'm looking for a tool to allow us to burn u-boot into the flash
>> memory on new board (with all flash devices unprogrammed). Ideally,
>> I'd like=20
>=20
> If you consider the fact that besides fash burning you may also want
> to have a working hardware debugger, you should go for a BDI2000 -
> especially for Linux, when MMU support is needed.
Get the BDI2000. I'm very glad Wolfgang talked me into it!
Use the Slingshot and Wiretap as paperweights.
^ permalink raw reply
* RE: Question for all the folks who are ALSO building custom MPC5200boards
From: Andrew Dennison @ 2005-02-09 22:12 UTC (permalink / raw)
To: 'Caruso, Nick', linuxppc-embedded
In-Reply-To: <712A2DEC228C7448978CBD7A7AD5B090592CB5@fever.wardrobe.irobot.com>
On , linuxppc-embedded-bounces@ozlabs.org wrote:
> I spoze this is slightly off topic, but... since a number of
> people have recently mentioned they're building custom MPC5200 boards:
>=20
> Have any of you had trouble with the 32kHz oscillator, when
> trying to use the crystal-and-passive-network approach
> instead of the big-ugly-reliable-metal-can-oscillator
> technique? Anyone actually get the crystal to oscillate properly?
>=20
> Replies off list would be fine if this is too off-topic...
>=20
> best regards,
> Nick Caruso
No problems here. Thought I would have to tweak some of the values I =
chose
but it just worked.
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox