9
0
Fork 0

Add support for new TQM5200 revisions

- Support for TQM5200S (short version without graphic controller)
- Support for modules with 'N' type S29GL128N Spansion flashes
  (requires changes to flash layout)
- Support for MPC5200B cpu (mostly support for second SDRAM bank)
This commit is contained in:
Wolfgang Denk 2006-07-19 17:52:30 +02:00
parent bd3143f040
commit 45a212c4d7
8 changed files with 150 additions and 19 deletions

View File

@ -2,6 +2,12 @@
Changes since U-Boot 1.1.4: Changes since U-Boot 1.1.4:
====================================================================== ======================================================================
* Add support for new TQM5200 revisions
- Support for TQM5200S (short version without graphic controller)
- Support for modules with 'N' type S29GL128N Spansion flashes
(requires changes to flash layout)
- Support for MPC5200B cpu (mostly support for second SDRAM bank)
* Fix support for PS/2 keyboard on TQM85xx boards * Fix support for PS/2 keyboard on TQM85xx boards
The PS/2 keyobard driver for the TQM85xx modules only supports the The PS/2 keyobard driver for the TQM85xx modules only supports the
internal DUART of the MPC85xx CPU. Since the MPC8560 doesn't internal DUART of the MPC85xx CPU. Since the MPC8560 doesn't

View File

@ -27,8 +27,8 @@ LIST_5xx=" \
LIST_5xxx=" \ LIST_5xxx=" \
BC3450 cpci5200 EVAL5200 icecube_5100 \ BC3450 cpci5200 EVAL5200 icecube_5100 \
icecube_5200 lite5200b mcc200 o2dnt \ icecube_5200 lite5200b mcc200 o2dnt \
pf5200 PM520 Total5100 Total5200 \ pf5200 PM520 TB5200 Total5100 \
Total5200_Rev2 TQM5200 \ Total5200 Total5200_Rev2 TQM5200 TQM5200_B \
" "
######################################################################### #########################################################################

View File

@ -7,7 +7,7 @@
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as # modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of # published by the Free Software Foundatio; either version 2 of
# the License, or (at your option) any later version. # the License, or (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
@ -360,7 +360,12 @@ spieval_config: unconfig
@echo "... with automatic CS configuration" @echo "... with automatic CS configuration"
@./mkconfig -a spieval ppc mpc5xxx tqm5200 @./mkconfig -a spieval ppc mpc5xxx tqm5200
TB5200_B_config \
TB5200_config: unconfig TB5200_config: unconfig
@[ -z "$(findstring _B,$@)" ] || \
{ echo "#define CONFIG_TQM5200_B" >>include/config.h ; \
echo "... with MPC5200B processor" ; \
}
@echo "#define CONFIG_CS_AUTOCONF">>include/config.h @echo "#define CONFIG_CS_AUTOCONF">>include/config.h
@echo "... with automatic CS configuration" @echo "... with automatic CS configuration"
@./mkconfig -a TB5200 ppc mpc5xxx tqm5200 @./mkconfig -a TB5200 ppc mpc5xxx tqm5200
@ -401,6 +406,7 @@ Total5200_Rev2_lowboot_config: unconfig
TQM5200_config \ TQM5200_config \
TQM5200_STK100_config \ TQM5200_STK100_config \
TQM5200_B_config \
MiniFAP_config: unconfig MiniFAP_config: unconfig
@ >include/config.h @ >include/config.h
@[ -z "$(findstring MiniFAP,$@)" ] || \ @[ -z "$(findstring MiniFAP,$@)" ] || \
@ -411,6 +417,10 @@ MiniFAP_config: unconfig
{ echo "#define CONFIG_STK52XX_REV100" >>include/config.h ; \ { echo "#define CONFIG_STK52XX_REV100" >>include/config.h ; \
echo "... on a STK52XX.100 base board" ; \ echo "... on a STK52XX.100 base board" ; \
} }
@[ -z "$(findstring B,$@)" ] || \
{ echo "#define CONFIG_TQM5200_B" >>include/config.h ; \
echo "... with MPC5200B processor" ; \
}
@echo "#define CONFIG_CS_AUTOCONF">>include/config.h ; @echo "#define CONFIG_CS_AUTOCONF">>include/config.h ;
@echo "... with automatic CS configuration" ; @echo "... with automatic CS configuration" ;
@./mkconfig -a TQM5200 ppc mpc5xxx tqm5200 @./mkconfig -a TQM5200 ppc mpc5xxx tqm5200

View File

@ -22,7 +22,7 @@
*/ */
/* /*
* SKT52XX specific functions * STK52XX specific functions
*/ */
/*#define DEBUG*/ /*#define DEBUG*/
@ -1209,7 +1209,7 @@ U_BOOT_CMD(
fkt , 4, 1, cmd_fkt, fkt , 4, 1, cmd_fkt,
"fkt - Function test routines\n", "fkt - Function test routines\n",
"led number on/off\n" "led number on/off\n"
" - 'number's like printed on SKT52XX board\n" " - 'number's like printed on STK52XX board\n"
"fkt can\n" "fkt can\n"
" - loopback plug for X83 required\n" " - loopback plug for X83 required\n"
"fkt rs232 number\n" "fkt rs232 number\n"

View File

@ -1,11 +1,11 @@
/* /*
* (C) Copyright 2003-2004 * (C) Copyright 2003-2006
* Wolfgang Denk, DENX Software Engineering, wd@denx.de. * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
* *
* (C) Copyright 2004 * (C) Copyright 2004
* Mark Jonas, Freescale Semiconductor, mark.jonas@motorola.com. * Mark Jonas, Freescale Semiconductor, mark.jonas@motorola.com.
* *
* (C) Copyright 2004-2005 * (C) Copyright 2004-2006
* Martin Krause, TQ-Systems GmbH, martin.krause@tqs.de * Martin Krause, TQ-Systems GmbH, martin.krause@tqs.de
* *
* See file CREDITS for list of people who contributed to this * See file CREDITS for list of people who contributed to this
@ -30,6 +30,7 @@
#include <common.h> #include <common.h>
#include <mpc5xxx.h> #include <mpc5xxx.h>
#include <pci.h> #include <pci.h>
#include <asm/processor.h>
#ifdef CONFIG_VIDEO_SM501 #ifdef CONFIG_VIDEO_SM501
#include <sm501.h> #include <sm501.h>
@ -101,6 +102,8 @@ long int initdram (int board_type)
{ {
ulong dramsize = 0; ulong dramsize = 0;
ulong dramsize2 = 0; ulong dramsize2 = 0;
uint svr, pvr;
#ifndef CFG_RAMBOOT #ifndef CFG_RAMBOOT
ulong test1, test2; ulong test1, test2;
@ -190,11 +193,31 @@ long int initdram (int board_type)
} else { } else {
dramsize2 = 0; dramsize2 = 0;
} }
#endif /* CFG_RAMBOOT */ #endif /* CFG_RAMBOOT */
/* return dramsize + dramsize2; */ /*
* On MPC5200B we need to set the special configuration delay in the
* DDR controller. Please refer to Freescale's AN3221 "MPC5200B SDRAM
* Initialization and Configuration", 3.3.1 SDelay--MBAR + 0x0190:
*
* "The SDelay should be written to a value of 0x00000004. It is
* required to account for changes caused by normal wafer processing
* parameters."
*/
svr = get_svr();
pvr = get_pvr();
if ((SVR_MJREV(svr) >= 2) &&
(PVR_MAJ(pvr) == 1) && (PVR_MIN(pvr) == 4)) {
*(vu_long *)MPC5XXX_SDRAM_SDELAY = 0x04;
__asm__ volatile ("sync");
}
#if defined(CONFIG_TQM5200_B)
return dramsize + dramsize2;
#else
return dramsize; return dramsize;
#endif /* CONFIG_TQM5200_B */
} }
#elif defined(CONFIG_MGT5100) #elif defined(CONFIG_MGT5100)
@ -255,7 +278,11 @@ int checkboard (void)
return 0; return 0;
#endif #endif
#if defined (CONFIG_TQM5200) #if defined (CONFIG_TQM5200)
#if defined(CONFIG_TQM5200_B)
puts ("Board: TQM5200 or TQM5200S (TQ-Components GmbH)\n");
#else
puts ("Board: TQM5200 (TQ-Components GmbH)\n"); puts ("Board: TQM5200 (TQ-Components GmbH)\n");
#endif /* CONFIG_TQM5200_B */
#endif #endif
#if defined (CONFIG_STK52XX) #if defined (CONFIG_STK52XX)
puts (" on a STK52XX baseboard\n"); puts (" on a STK52XX baseboard\n");

View File

@ -328,7 +328,7 @@ int do_reginfo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
(*(volatile ulong*)MPC5XXX_ADDECR & 0x02000000) ? 1 : 0); (*(volatile ulong*)MPC5XXX_ADDECR & 0x02000000) ? 1 : 0);
printf ("\tSDRAMCS0: %08X\n", printf ("\tSDRAMCS0: %08X\n",
*(volatile ulong*)MPC5XXX_SDRAM_CS0CFG); *(volatile ulong*)MPC5XXX_SDRAM_CS0CFG);
printf ("\tSDRAMCS0: %08X\n", printf ("\tSDRAMCS1: %08X\n",
*(volatile ulong*)MPC5XXX_SDRAM_CS1CFG); *(volatile ulong*)MPC5XXX_SDRAM_CS1CFG);
#endif /* CONFIG_MPC5200 */ #endif /* CONFIG_MPC5200 */
return 0; return 0;

View File

@ -147,6 +147,30 @@
#undef CONFIG_BOOTARGS #undef CONFIG_BOOTARGS
#if defined(CONFIG_TQM5200_B)
#define CONFIG_EXTRA_ENV_SETTINGS \
"netdev=eth0\0" \
"rootpath=/opt/eldk/ppc_6xx\0" \
"ramargs=setenv bootargs root=/dev/ram rw\0" \
"nfsargs=setenv bootargs root=/dev/nfs rw " \
"nfsroot=${serverip}:${rootpath}\0" \
"addip=setenv bootargs ${bootargs} " \
"ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}" \
":${hostname}:${netdev}:off panic=1\0" \
"flash_self=run ramargs addip;" \
"bootm ${kernel_addr} ${ramdisk_addr}\0" \
"flash_nfs=run nfsargs addip;" \
"bootm ${kernel_addr}\0" \
"net_nfs=tftp 200000 ${bootfile};run nfsargs addip;bootm\0" \
"bootfile=/tftpboot/tqm5200/uImage\0" \
"load=tftp 200000 ${u-boot}\0" \
"u-boot=/tftpboot/tqm5200/u-boot.bin\0" \
"update=protect off FC000000 FC07FFFF;" \
"erase FC000000 FC07FFFF;" \
"cp.b 200000 FC000000 ${filesize};" \
"protect on FC000000 FC07FFFF\0" \
""
#else
#define CONFIG_EXTRA_ENV_SETTINGS \ #define CONFIG_EXTRA_ENV_SETTINGS \
"netdev=eth0\0" \ "netdev=eth0\0" \
"rootpath=/opt/eldk/ppc_6xx\0" \ "rootpath=/opt/eldk/ppc_6xx\0" \
@ -169,6 +193,7 @@
"cp.b 200000 FC000000 ${filesize};" \ "cp.b 200000 FC000000 ${filesize};" \
"protect on FC000000 FC05FFFF\0" \ "protect on FC000000 FC05FFFF\0" \
"" ""
#endif /* CONFIG_TQM5200_B */
#define CONFIG_BOOTCOMMAND "run net_nfs" #define CONFIG_BOOTCOMMAND "run net_nfs"
@ -228,7 +253,7 @@
*/ */
#define CFG_FLASH_BASE TEXT_BASE /* 0xFC000000 */ #define CFG_FLASH_BASE TEXT_BASE /* 0xFC000000 */
/* use CFI flash driver if no module variant is spezified */ /* use CFI flash driver */
#define CFG_FLASH_CFI 1 /* Flash is CFI conformant */ #define CFG_FLASH_CFI 1 /* Flash is CFI conformant */
#define CFG_FLASH_CFI_DRIVER 1 /* Use the common driver */ #define CFG_FLASH_CFI_DRIVER 1 /* Use the common driver */
#define CFG_FLASH_BANKS_LIST { CFG_BOOTCS_START } #define CFG_FLASH_BANKS_LIST { CFG_BOOTCS_START }
@ -240,31 +265,46 @@
#if !defined(CFG_LOWBOOT) #if !defined(CFG_LOWBOOT)
#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x00760000 + 0x00800000) #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x00760000 + 0x00800000)
#else /* CFG_LOWBOOT */ #else /* CFG_LOWBOOT */
#if defined(CONFIG_TQM5200_B)
#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x00080000)
#else
#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x00060000) #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x00060000)
#endif /* CONFIG_TQM5200_B */
#endif /* CFG_LOWBOOT */ #endif /* CFG_LOWBOOT */
#define CFG_MAX_FLASH_BANKS 1 /* max num of flash banks #define CFG_MAX_FLASH_BANKS 1 /* max num of flash banks
(= chip selects) */ (= chip selects) */
#define CFG_FLASH_ERASE_TOUT 240000 /* Flash Erase Timeout (in ms) */
#define CFG_FLASH_WRITE_TOUT 500 /* Flash Write Timeout (in ms) */
/* Dynamic MTD partition support */ /* Dynamic MTD partition support */
#define CONFIG_JFFS2_CMDLINE #define CONFIG_JFFS2_CMDLINE
#define MTDIDS_DEFAULT "nor0=TQM5200-0" #define MTDIDS_DEFAULT "nor0=TQM5200-0"
#if defined(CONFIG_TQM5200_B)
#define MTDPARTS_DEFAULT "mtdparts=TQM5200-0:768k(firmware)," \
"1280k(kernel)," \
"2m(initrd)," \
"4m(small-fs)," \
"16m(big-fs)," \
"8m(misc)"
#else
#define MTDPARTS_DEFAULT "mtdparts=TQM5200-0:640k(firmware)," \ #define MTDPARTS_DEFAULT "mtdparts=TQM5200-0:640k(firmware)," \
"1408k(kernel)," \ "1408k(kernel)," \
"2m(initrd)," \ "2m(initrd)," \
"4m(small-fs)," \ "4m(small-fs)," \
"16m(big-fs)," \ "16m(big-fs)," \
"8m(misc)" "8m(misc)"
#endif /* CONFIG_TQM5200_B */
/* /*
* Environment settings * Environment settings
*/ */
#define CFG_ENV_IS_IN_FLASH 1 #define CFG_ENV_IS_IN_FLASH 1
#define CFG_ENV_SIZE 0x10000 #define CFG_ENV_SIZE 0x10000
#if defined(CONFIG_TQM5200_B)
#define CFG_ENV_SECT_SIZE 0x40000
#else
#define CFG_ENV_SECT_SIZE 0x20000 #define CFG_ENV_SECT_SIZE 0x20000
#define CFG_ENV_ADDR_REDUND (CFG_ENV_ADDR + CFG_ENV_SECT_SIZE) #define CFG_ENV_ADDR_REDUND (CFG_ENV_ADDR + CFG_ENV_SECT_SIZE)
#define CFG_ENV_SIZE_REDUND (CFG_ENV_SIZE) #define CFG_ENV_SIZE_REDUND (CFG_ENV_SIZE)
#endif /* CONFIG_TQM5200_B */
/* /*
* Memory map * Memory map
@ -292,7 +332,11 @@
# define CFG_RAMBOOT 1 # define CFG_RAMBOOT 1
#endif #endif
#if defined(CONFIG_TQM5200_B)
#define CFG_MONITOR_LEN (512 << 10) /* Reserve 512 kB for Monitor */
#else
#define CFG_MONITOR_LEN (384 << 10) /* Reserve 384 kB for Monitor */ #define CFG_MONITOR_LEN (384 << 10) /* Reserve 384 kB for Monitor */
#endif /* CONFIG_TQM5200_B */
#define CFG_MALLOC_LEN (256 << 10) /* Reserve 256 kB for malloc() */ #define CFG_MALLOC_LEN (256 << 10) /* Reserve 256 kB for malloc() */
#define CFG_BOOTMAPSZ (8 << 20) /* Initial Memory map for Linux */ #define CFG_BOOTMAPSZ (8 << 20) /* Initial Memory map for Linux */

View File

@ -2,7 +2,7 @@
* (C) Copyright 2003-2005 * (C) Copyright 2003-2005
* Wolfgang Denk, DENX Software Engineering, wd@denx.de. * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
* *
* (C) Copyright 2004-2005 * (C) Copyright 2004-2006
* Martin Krause, TQ-Systems GmbH, martin.krause@tqs.de * Martin Krause, TQ-Systems GmbH, martin.krause@tqs.de
* *
* See file CREDITS for list of people who contributed to this * See file CREDITS for list of people who contributed to this
@ -191,6 +191,30 @@
#undef CONFIG_BOOTARGS #undef CONFIG_BOOTARGS
#if defined(CONFIG_TQM5200_B)
#define CONFIG_EXTRA_ENV_SETTINGS \
"netdev=eth0\0" \
"rootpath=/opt/eldk/ppc_6xx\0" \
"ramargs=setenv bootargs root=/dev/ram rw\0" \
"nfsargs=setenv bootargs root=/dev/nfs rw " \
"nfsroot=${serverip}:${rootpath}\0" \
"addip=setenv bootargs ${bootargs} " \
"ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}" \
":${hostname}:${netdev}:off panic=1\0" \
"flash_self=run ramargs addip;" \
"bootm ${kernel_addr} ${ramdisk_addr}\0" \
"flash_nfs=run nfsargs addip;" \
"bootm ${kernel_addr}\0" \
"net_nfs=tftp 200000 ${bootfile};run nfsargs addip;bootm\0" \
"bootfile=/tftpboot/tqm5200/uImage\0" \
"load=tftp 200000 ${u-boot}\0" \
"u-boot=/tftpboot/tqm5200/u-boot.bin\0" \
"update=protect off FC000000 FC07FFFF;" \
"erase FC000000 FC07FFFF;" \
"cp.b 200000 FC000000 ${filesize};" \
"protect on FC000000 FC07FFFF\0" \
""
#else
#define CONFIG_EXTRA_ENV_SETTINGS \ #define CONFIG_EXTRA_ENV_SETTINGS \
"netdev=eth0\0" \ "netdev=eth0\0" \
"rootpath=/opt/eldk/ppc_6xx\0" \ "rootpath=/opt/eldk/ppc_6xx\0" \
@ -213,6 +237,7 @@
"cp.b 200000 FC000000 ${filesize};" \ "cp.b 200000 FC000000 ${filesize};" \
"protect on FC000000 FC05FFFF\0" \ "protect on FC000000 FC05FFFF\0" \
"" ""
#endif /* CONFIG_TQM5200_B */
#define CONFIG_BOOTCOMMAND "run net_nfs" #define CONFIG_BOOTCOMMAND "run net_nfs"
@ -285,7 +310,7 @@
*/ */
#define CFG_FLASH_BASE TEXT_BASE /* 0xFC000000 */ #define CFG_FLASH_BASE TEXT_BASE /* 0xFC000000 */
/* use CFI flash driver if no module variant is spezified */ /* use CFI flash driver */
#define CFG_FLASH_CFI 1 /* Flash is CFI conformant */ #define CFG_FLASH_CFI 1 /* Flash is CFI conformant */
#define CFG_FLASH_CFI_DRIVER 1 /* Use the common driver */ #define CFG_FLASH_CFI_DRIVER 1 /* Use the common driver */
#define CFG_FLASH_BANKS_LIST { CFG_BOOTCS_START } #define CFG_FLASH_BANKS_LIST { CFG_BOOTCS_START }
@ -297,31 +322,46 @@
#if !defined(CFG_LOWBOOT) #if !defined(CFG_LOWBOOT)
#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x00760000 + 0x00800000) #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x00760000 + 0x00800000)
#else /* CFG_LOWBOOT */ #else /* CFG_LOWBOOT */
#if defined(CONFIG_TQM5200_B)
#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x00080000)
#else
#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x00060000) #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x00060000)
#endif /* CONFIG_TQM5200_B */
#endif /* CFG_LOWBOOT */ #endif /* CFG_LOWBOOT */
#define CFG_MAX_FLASH_BANKS 1 /* max num of flash banks #define CFG_MAX_FLASH_BANKS 1 /* max num of flash banks
(= chip selects) */ (= chip selects) */
#define CFG_FLASH_ERASE_TOUT 240000 /* Flash Erase Timeout (in ms) */
#define CFG_FLASH_WRITE_TOUT 500 /* Flash Write Timeout (in ms) */
/* Dynamic MTD partition support */ /* Dynamic MTD partition support */
#define CONFIG_JFFS2_CMDLINE #define CONFIG_JFFS2_CMDLINE
#define MTDIDS_DEFAULT "nor0=TQM5200-0" #define MTDIDS_DEFAULT "nor0=TQM5200-0"
#if defined(CONFIG_TQM5200_B)
#define MTDPARTS_DEFAULT "mtdparts=TQM5200-0:768k(firmware)," \
"1280k(kernel)," \
"2m(initrd)," \
"4m(small-fs)," \
"16m(big-fs)," \
"8m(misc)"
#else
#define MTDPARTS_DEFAULT "mtdparts=TQM5200-0:640k(firmware)," \ #define MTDPARTS_DEFAULT "mtdparts=TQM5200-0:640k(firmware)," \
"1408k(kernel)," \ "1408k(kernel)," \
"2m(initrd)," \ "2m(initrd)," \
"4m(small-fs)," \ "4m(small-fs)," \
"16m(big-fs)," \ "16m(big-fs)," \
"8m(misc)" "8m(misc)"
#endif /* CONFIG_TQM5200_B */
/* /*
* Environment settings * Environment settings
*/ */
#define CFG_ENV_IS_IN_FLASH 1 #define CFG_ENV_IS_IN_FLASH 1
#define CFG_ENV_SIZE 0x10000 #define CFG_ENV_SIZE 0x10000
#if defined(CONFIG_TQM5200_B)
#define CFG_ENV_SECT_SIZE 0x40000
#else
#define CFG_ENV_SECT_SIZE 0x20000 #define CFG_ENV_SECT_SIZE 0x20000
#define CFG_ENV_ADDR_REDUND (CFG_ENV_ADDR + CFG_ENV_SECT_SIZE) #define CFG_ENV_ADDR_REDUND (CFG_ENV_ADDR + CFG_ENV_SECT_SIZE)
#define CFG_ENV_SIZE_REDUND (CFG_ENV_SIZE) #define CFG_ENV_SIZE_REDUND (CFG_ENV_SIZE)
#endif /* CONFIG_TQM5200_B */
/* /*
* Memory map * Memory map
@ -349,7 +389,11 @@
# define CFG_RAMBOOT 1 # define CFG_RAMBOOT 1
#endif #endif
#if defined(CONFIG_TQM5200_B)
#define CFG_MONITOR_LEN (512 << 10) /* Reserve 512 kB for Monitor */
#else
#define CFG_MONITOR_LEN (384 << 10) /* Reserve 384 kB for Monitor */ #define CFG_MONITOR_LEN (384 << 10) /* Reserve 384 kB for Monitor */
#endif /* CONFIG_TQM5200_B */
#define CFG_MALLOC_LEN (256 << 10) /* Reserve 256 kB for malloc() */ #define CFG_MALLOC_LEN (256 << 10) /* Reserve 256 kB for malloc() */
#define CFG_BOOTMAPSZ (8 << 20) /* Initial Memory map for Linux */ #define CFG_BOOTMAPSZ (8 << 20) /* Initial Memory map for Linux */