You can subscribe to this list here.
2001 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(165) |
Sep
(240) |
Oct
(424) |
Nov
(526) |
Dec
(293) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2002 |
Jan
(242) |
Feb
(149) |
Mar
(143) |
Apr
(143) |
May
(76) |
Jun
(59) |
Jul
(20) |
Aug
(2) |
Sep
(49) |
Oct
(1) |
Nov
(4) |
Dec
|
2003 |
Jan
(1) |
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2004 |
Jan
|
Feb
|
Mar
|
Apr
(2) |
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
|
2008 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(3) |
Nov
|
Dec
|
2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
(72) |
Jul
(36) |
Aug
(9) |
Sep
(16) |
Oct
(23) |
Nov
(9) |
Dec
(3) |
2010 |
Jan
|
Feb
(1) |
Mar
(35) |
Apr
(44) |
May
(56) |
Jun
(71) |
Jul
(41) |
Aug
(41) |
Sep
(22) |
Oct
(3) |
Nov
(1) |
Dec
(1) |
2011 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2012 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(1) |
2013 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
|
2014 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2015 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
(1) |
Nov
(1) |
Dec
|
2016 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
|
2017 |
Jan
|
Feb
|
Mar
(1) |
Apr
(1) |
May
(1) |
Jun
|
Jul
(1) |
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
|
2021 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
(1) |
Sep
(25) |
Oct
(105) |
Nov
(15) |
Dec
|
2025 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
(4) |
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: James S. <jsi...@us...> - 2001-11-21 22:11:03
|
Update of /cvsroot/linux-mips/linux/include/asm-mips64 In directory usw-pr-cvs1:/tmp/cvs-serv6450 Added Files: cache.h cpu.h Log Message: Synced to OSS tree |
From: James S. <jsi...@us...> - 2001-11-21 22:10:16
|
Update of /cvsroot/linux-mips/linux/include/asm-mips In directory usw-pr-cvs1:/tmp/cvs-serv6134/asm-mips Modified Files: cpu.h Log Message: Correct PrId definitions for TX49* CPUs. Index: cpu.h =================================================================== RCS file: /cvsroot/linux-mips/linux/include/asm-mips/cpu.h,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- cpu.h 2001/11/20 17:39:15 1.14 +++ cpu.h 2001/11/21 22:10:14 1.15 @@ -88,11 +88,8 @@ #define PRID_REV_TX3922 0x0030 #define PRID_REV_TX3927 0x0040 #define PRID_REV_TX3927B 0x0041 +#define PRID_REV_TX3927C 0x0042 #define PRID_REV_TX39H3TEG 0x0050 -#define PRID_REV_TX4955 0x0011 -#define PRID_REV_TX4955A 0x0020 -#define PRID_REV_TX4927 0x0021 -#define PRID_REV_TX4927R2 0x0022 #ifndef _LANGUAGE_ASSEMBLY /* |
From: James S. <jsi...@us...> - 2001-11-21 22:08:02
|
Update of /cvsroot/linux-mips/linux/arch/mips/sibyte/sb1250 In directory usw-pr-cvs1:/tmp/cvs-serv5277 Modified Files: Makefile pci.c Log Message: Remove #ifdef CONFIG_PCI ... #endif wrapper.Resurrect lib_hssubr.o. A bug elsewhere was resulting in it not be referenced ever. Compile pci.o only if CONFIG_PCI set. Index: Makefile =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips/sibyte/sb1250/Makefile,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- Makefile 2001/11/20 18:14:35 1.3 +++ Makefile 2001/11/21 22:07:56 1.4 @@ -5,8 +5,9 @@ O_TARGET := sb1250.o -obj-y := setup.o irq.o irq_handler.o time.o pci.o # lib_hssubr.o +obj-y := setup.o irq.o irq_handler.o time.o lib_hssubr.o +obj-$(CONFIG_PCI) += pci.o obj-$(CONFIG_SMP) += smp.o obj-$(CONFIG_BCM1250_TBPROF) += bcm1250_tbprof.o Index: pci.c =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips/sibyte/sb1250/pci.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- pci.c 2001/11/08 17:42:08 1.1 +++ pci.c 2001/11/21 22:07:56 1.2 @@ -36,10 +36,6 @@ * that is used so rarely (how much space in the page tables?) * */ -#include <linux/config.h> - -#ifdef CONFIG_PCI - #include <linux/types.h> #include <linux/pci.h> #include <linux/kernel.h> @@ -331,5 +327,3 @@ { return 1; } - -#endif /* CONFIG_PCI */ |
From: James S. <jsi...@us...> - 2001-11-20 18:19:31
|
Update of /cvsroot/linux-mips/linux/arch/mips64/configs In directory usw-pr-cvs1:/tmp/cvs-serv12861/mips64/configs Added Files: defconfig-sb1250-swarm Log Message: SB1250 on mips64 cupport --- NEW FILE: defconfig-sb1250-swarm --- # # Automatically generated make config: don't edit # # # Code maturity level options # # CONFIG_EXPERIMENTAL is not set # # Machine selection # # CONFIG_SGI_IP27 is not set CONFIG_SIBYTE_SWARM=y CONFIG_SMP=y CONFIG_RWSEM_GENERIC_SPINLOCK=y # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set CONFIG_BOOT_ELF64=y CONFIG_COHERENT_IO=y CONFIG_SWAP_IO_SPACE=y CONFIG_CFE=y CONFIG_SIBYTE_SB1250=y CONFIG_L1_CACHE_SHIFT=5 # CONFIG_ISA is not set # CONFIG_EISA is not set # CONFIG_PCI is not set # CONFIG_MCA is not set # CONFIG_SBUS is not set # # CPU selection # # CONFIG_CPU_R4300 is not set # CONFIG_CPU_R4X00 is not set # CONFIG_CPU_R5000 is not set # CONFIG_CPU_NEVADA is not set # CONFIG_CPU_R8000 is not set # CONFIG_CPU_R10000 is not set CONFIG_CPU_SB1=y # # General setup # # CONFIG_CPU_LITTLE_ENDIAN is not set CONFIG_NET=y # CONFIG_HOTPLUG is not set # CONFIG_PCMCIA is not set # CONFIG_SYSVIPC is not set # CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_SYSCTL is not set CONFIG_BINFMT_ELF=y CONFIG_MIPS32_COMPAT=y CONFIG_BINFMT_ELF32=y # CONFIG_BINFMT_MISC is not set # # Loadable module support # # CONFIG_MODULES is not set # # Memory Technology Devices (MTD) # # CONFIG_MTD is not set # # Parallel port support # # CONFIG_PARPORT 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_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_LOOP is not set # CONFIG_BLK_DEV_NBD is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=4096 CONFIG_BLK_DEV_INITRD=y # # 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 is not set # CONFIG_NETLINK is not set # CONFIG_NETFILTER is not set # CONFIG_FILTER is not set CONFIG_UNIX=y CONFIG_INET=y # CONFIG_IP_MULTICAST is not set # CONFIG_IP_ADVANCED_ROUTER is not set # CONFIG_IP_PNP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE is not set # CONFIG_INET_ECN is not set # CONFIG_SYN_COOKIES is not set # # # # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_DECNET is not set # CONFIG_BRIDGE is not set # # QoS and/or fair queueing # # CONFIG_NET_SCHED is not set # # Telephony Support # # CONFIG_PHONE is not set # CONFIG_PHONE_IXJ is not set # CONFIG_PHONE_IXJ_PCMCIA is not set # # ATA/IDE/MFM/RLL support # # CONFIG_IDE is not set # CONFIG_BLK_DEV_IDE_MODES is not set # CONFIG_BLK_DEV_HD is not set # # SCSI support # # CONFIG_SCSI 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 # # Ethernet (10 or 100Mbit) # CONFIG_NET_ETHERNET=y CONFIG_NET_SB1250_MAC=y # CONFIG_SUNLANCE is not set # CONFIG_SUNBMAC is not set # CONFIG_SUNQE is not set # CONFIG_SUNLANCE 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_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_FDDI is not set # CONFIG_PLIP is not set # CONFIG_PPP 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 # # Wan interfaces # # CONFIG_WAN 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 # # 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_SYNCLINK 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_SERIAL_TX3912 is not set # CONFIG_SERIAL_TX3912_CONSOLE is not set # CONFIG_AU1000_UART is not set CONFIG_SIBYTE_SB1250_DUART=y CONFIG_SIBYTE_SB1250_DUART_CONSOLE=y CONFIG_SB1250_DUART_OUTPUT_BUF_SIZE=1024 # CONFIG_SIBYTE_SB1250_DUART_NO_PORT_1 is not set # CONFIG_UNIX98_PTYS is not set # # 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 is not set # CONFIG_INTEL_RNG is not set # CONFIG_NVRAM is not set # CONFIG_RTC is not set # CONFIG_DTLK is not set # CONFIG_R3964 is not set # CONFIG_APPLICOM 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_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_BFS_FS 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 is not set # CONFIG_CRAMFS is not set # CONFIG_TMPFS is not set # CONFIG_RAMFS is not set # CONFIG_ISO9660_FS is not set # CONFIG_JOLIET is not set # CONFIG_ZISOFS 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 is not set # 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_NFS_FS=y CONFIG_NFS_V3=y # CONFIG_ROOT_NFS is not set # CONFIG_NFSD is not set # CONFIG_NFSD_V3 is not set CONFIG_SUNRPC=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=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 # CONFIG_ZLIB_FS_INFLATE is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set CONFIG_SGI_PARTITION=y # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_SMB_NLS is not set # CONFIG_NLS is not set CONFIG_KCORE_ELF=y # # Sound # # CONFIG_SOUND is not set # # USB support # # CONFIG_USB is not set # # USB Controllers # # CONFIG_USB_UHCI is not set # CONFIG_USB_UHCI_ALT is not set # CONFIG_USB_OHCI is not set # # USB Device Class drivers # # CONFIG_USB_AUDIO is not set # CONFIG_USB_BLUETOOTH is not set # CONFIG_USB_STORAGE is not set # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_DPCM is not set # CONFIG_USB_STORAGE_HP8200e is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_ACM is not set # CONFIG_USB_PRINTER is not set # # USB Human Interface Devices (HID) # # # Input core support is needed for USB HID # # # USB Imaging devices # # CONFIG_USB_DC2XX is not set # CONFIG_USB_MDC800 is not set # CONFIG_USB_SCANNER is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USB_HPUSBSCSI is not set # # USB Multimedia devices # # # Video4Linux support is needed for USB Multimedia device support # # # USB Network adaptors # # CONFIG_USB_PEGASUS is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_CATC is not set # CONFIG_USB_CDCETHER is not set # CONFIG_USB_USBNET is not set # # USB port drivers # # CONFIG_USB_USS720 is not set # # USB Serial Converter support # # CONFIG_USB_SERIAL is not set # CONFIG_USB_SERIAL_GENERIC is not set # CONFIG_USB_SERIAL_BELKIN is not set # CONFIG_USB_SERIAL_WHITEHEAT is not set # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set # CONFIG_USB_SERIAL_EMPEG is not set # CONFIG_USB_SERIAL_FTDI_SIO is not set # CONFIG_USB_SERIAL_VISOR is not set # CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_EDGEPORT is not set # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set # CONFIG_USB_SERIAL_KEYSPAN is not set # CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set # CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set # CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set # CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set # CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set # CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set # CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set # CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set # CONFIG_USB_SERIAL_MCT_U232 is not set # CONFIG_USB_SERIAL_PL2303 is not set # CONFIG_USB_SERIAL_CYBERJACK is not set # CONFIG_USB_SERIAL_XIRCOM is not set # CONFIG_USB_SERIAL_OMNINET is not set # # USB Miscellaneous drivers # # CONFIG_USB_RIO500 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 # # Kernel hacking # CONFIG_CROSSCOMPILE=y # CONFIG_REMOTE_DEBUG is not set # CONFIG_MAGIC_SYSRQ is not set |
From: James S. <jsi...@us...> - 2001-11-20 18:18:31
|
Update of /cvsroot/linux-mips/linux/arch/mips/kernel In directory usw-pr-cvs1:/tmp/cvs-serv12433/mips/kernel Modified Files: smp.c Log Message: Huge changes to SMP handling. Index: smp.c =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips/kernel/smp.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- smp.c 2001/11/08 17:11:07 1.6 +++ smp.c 2001/11/20 18:18:27 1.7 @@ -1,6 +1,4 @@ /* - * Copyright (C) 2000, 2001 Broadcom Corporation - * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 @@ -14,8 +12,12 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (C) 2000, 2001 Kanoj Sarcar + * Copyright (C) 2000, 2001 Ralf Baechle + * Copyright (C) 2000, 2001 Silicon Graphics, Inc. + * Copyright (C) 2000, 2001 Broadcom Corporation */ - #include <linux/config.h> #include <linux/init.h> #include <linux/spinlock.h> @@ -27,6 +29,7 @@ #include <linux/interrupt.h> #include <asm/atomic.h> +#include <asm/cpu.h> #include <asm/processor.h> #include <asm/system.h> #include <asm/hardirq.h> @@ -35,39 +38,27 @@ #include <asm/delay.h> #include <asm/smp.h> -/* - * This was written with the BRCM12500 MP SOC in mind, but tries to - * be generic. It's modelled on the mips64 smp.c code, which is - * derived from Sparc, I'm guessing, which is derived from... - * - * It's probably horribly designed for very large ccNUMA systems - * as it doesn't take any node clustering into account. -*/ - - /* Ze Big Kernel Lock! */ spinlock_t kernel_flag = SPIN_LOCK_UNLOCKED; -int smp_threads_ready; /* Not used */ +int smp_threads_ready; int smp_num_cpus; /* Number that came online. */ cpumask_t cpu_online_map; /* Bitmask of currently online CPUs */ int global_irq_holder = NO_PROC_ID; spinlock_t global_irq_lock = SPIN_LOCK_UNLOCKED; struct cpuinfo_mips cpu_data[NR_CPUS]; - -struct smp_fn_call_struct smp_fn_call = -{ SPIN_LOCK_UNLOCKED, ATOMIC_INIT(0), NULL, NULL}; +void (*volatile smp_cpu0_finalize)(void) = NULL; static atomic_t cpus_booted = ATOMIC_INIT(0); /* These are defined by the board-specific code. */ -/* Cause the function described by smp_fn_call - to be executed on the passed cpu. When the function - has finished, increment the finished field of - smp_fn_call. */ - -void core_call_function(int cpu); +/* + * Cause the function described by call_data to be executed on the passed + * cpu. When the function has finished, increment the finished field of + * call_data. + */ +void core_send_ipi(int cpu, unsigned int action); /* * Clear all undefined state in the cpu, set up sp and gp to the passed @@ -89,11 +80,27 @@ the number of cpus in the system, including this one */ int prom_setup_smp(void); +/* + * Hook for doing final board-specific setup after the generic smp setup + * is done + */ int start_secondary(void *unused) { prom_init_secondary(); + + /* Do stuff that trap_init() did for the first processor */ + clear_cp0_status(ST0_BEV); + if (mips_cpu.options & MIPS_CPU_DIVEC) { + set_cp0_cause(CAUSEF_IV); + } + /* XXX parity protection should be folded in here when it's converted to + an option instead of something based on .cputype */ + write_32bit_cp0_register(CP0_CONTEXT, smp_processor_id()<<23); pgd_current[smp_processor_id()] = init_mm.pgd; + cpu_data[smp_processor_id()].udelay_val = loops_per_jiffy; + cpu_data[smp_processor_id()].asid_cache = ASID_FIRST_VERSION; + prom_smp_finish(); printk("Slave cpu booted successfully\n"); atomic_inc(&cpus_booted); cpu_idle(); @@ -107,6 +114,8 @@ smp_num_cpus = prom_setup_smp(); init_new_context(current, &init_mm); current->processor = 0; + cpu_data[0].udelay_val = loops_per_jiffy; + cpu_data[0].asid_cache = ASID_FIRST_VERSION; atomic_set(&cpus_booted, 1); /* Master CPU is already booted... */ init_idle(); for (i = 1; i < smp_num_cpus; i++) { @@ -164,6 +173,7 @@ /* Wait for everyone to come up */ while (atomic_read(&cpus_booted) != smp_num_cpus); + smp_threads_ready = 1; } void __init smp_commence(void) @@ -176,12 +186,15 @@ current->need_resched = 1; } -void FASTCALL(smp_send_reschedule(int cpu)) +void smp_send_reschedule(int cpu) { smp_call_function(reschedule_this_cpu, NULL, 0, 0); } +static spinlock_t call_lock = SPIN_LOCK_UNLOCKED; +struct call_data_struct *call_data; + /* * The caller of this wants the passed function to run on every cpu. If wait * is set, wait until all cpus have finished the function before returning. @@ -190,43 +203,61 @@ int smp_call_function (void (*func) (void *info), void *info, int retry, int wait) { + struct call_data_struct data; int cpus = smp_num_cpus - 1; + int cpu = smp_processor_id(); int i; - if (smp_num_cpus < 2) { + if (!cpus) return 0; - } - spin_lock_bh(&smp_fn_call.lock); - - atomic_set(&smp_fn_call.finished, 0); - smp_fn_call.fn = func; - smp_fn_call.data = info; + data.func = func; + data.info = info; + atomic_set(&data.started, 0); + data.wait = wait; + if (wait) + atomic_set(&data.finished, 0); + spin_lock_bh(&call_lock); + call_data = &data; for (i = 0; i < smp_num_cpus; i++) { - if (i != smp_processor_id()) { + if (i != cpu) { /* Call the board specific routine */ - core_call_function(i); + core_send_ipi(i, SMP_CALL_FUNCTION); } } - if (wait) { - while(atomic_read(&smp_fn_call.finished) != cpus) {} - } + /* Wait for response */ + while (atomic_read(&data.started) != cpus) + barrier(); - spin_unlock_bh(&smp_fn_call.lock); + if (wait) + while(atomic_read(&data.finished) != cpus) + barrier(); + spin_unlock_bh(&call_lock); + return 0; } void synchronize_irq(void) { - panic("synchronize_irq"); + if (irqs_running()) { + /* Stupid approach */ + cli(); + sti(); + } } static void stop_this_cpu(void *dummy) { - printk("Cpu stopping\n"); - for (;;); + int cpu = smp_processor_id(); + if (cpu) + for (;;); /* XXX Use halt like i386 */ + else { + /* XXXKW this isn't quite there yet */ + while (!smp_cpu0_finalize) ; + smp_cpu0_finalize(); + } } void smp_send_stop(void) @@ -394,6 +425,104 @@ default: printk("global_restore_flags: %08lx\n", flags); } +} + +static void flush_tlb_all_ipi(void *info) +{ + local_flush_tlb_all(); +} + +void flush_tlb_all(void) +{ + smp_call_function(flush_tlb_all_ipi, 0, 1, 1); + local_flush_tlb_all(); +} + +static void flush_tlb_mm_ipi(void *mm) +{ + local_flush_tlb_mm((struct mm_struct *)mm); +} + +/* + * The following tlb flush calls are invoked when old translations are + * being torn down, or pte attributes are changing. For single threaded + * address spaces, a new context is obtained on the current cpu, and tlb + * context on other cpus are invalidated to force a new context allocation + * at switch_mm time, should the mm ever be used on other cpus. For + * multithreaded address spaces, intercpu interrupts have to be sent. + * Another case where intercpu interrupts are required is when the target + * mm might be active on another cpu (eg debuggers doing the flushes on + * behalf of debugees, kswapd stealing pages from another process etc). + * Kanoj 07/00. + */ + +void flush_tlb_mm(struct mm_struct *mm) +{ + if ((atomic_read(&mm->mm_users) != 1) || (current->mm != mm)) { + smp_call_function(flush_tlb_mm_ipi, (void *)mm, 1, 1); + } else { + int i; + for (i = 0; i < smp_num_cpus; i++) + if (smp_processor_id() != i) + CPU_CONTEXT(i, mm) = 0; + } + local_flush_tlb_mm(mm); +} + +struct flush_tlb_data { + struct mm_struct *mm; + struct vm_area_struct *vma; + unsigned long addr1; + unsigned long addr2; +}; + +static void flush_tlb_range_ipi(void *info) +{ + struct flush_tlb_data *fd = (struct flush_tlb_data *)info; + + local_flush_tlb_range(fd->mm, fd->addr1, fd->addr2); +} + +void flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end) +{ + if ((atomic_read(&mm->mm_users) != 1) || (current->mm != mm)) { + struct flush_tlb_data fd; + + fd.mm = mm; + fd.addr1 = start; + fd.addr2 = end; + smp_call_function(flush_tlb_range_ipi, (void *)&fd, 1, 1); + } else { + int i; + for (i = 0; i < smp_num_cpus; i++) + if (smp_processor_id() != i) + CPU_CONTEXT(i, mm) = 0; + } + local_flush_tlb_range(mm, start, end); +} + +static void flush_tlb_page_ipi(void *info) +{ + struct flush_tlb_data *fd = (struct flush_tlb_data *)info; + + local_flush_tlb_page(fd->vma, fd->addr1); +} + +void flush_tlb_page(struct vm_area_struct *vma, unsigned long page) +{ + if ((atomic_read(&vma->vm_mm->mm_users) != 1) || (current->mm != vma->vm_mm)) { + struct flush_tlb_data fd; + + fd.vma = vma; + fd.addr1 = page; + smp_call_function(flush_tlb_page_ipi, (void *)&fd, 1, 1); + } else { + int i; + for (i = 0; i < smp_num_cpus; i++) + if (smp_processor_id() != i) + CPU_CONTEXT(i, vma->vm_mm) = 0; + } + local_flush_tlb_page(vma, page); } EXPORT_SYMBOL(flush_tlb_page); |
From: James S. <jsi...@us...> - 2001-11-20 18:14:37
|
Update of /cvsroot/linux-mips/linux/arch/mips/sibyte/sb1250 In directory usw-pr-cvs1:/tmp/cvs-serv11462 Modified Files: Makefile bcm1250_tbprof.c irq.c irq_handler.S smp.c Log Message: Sb1250 updates. Index: Makefile =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips/sibyte/sb1250/Makefile,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- Makefile 2001/11/19 17:42:38 1.2 +++ Makefile 2001/11/20 18:14:35 1.3 @@ -5,7 +5,7 @@ O_TARGET := sb1250.o -obj-y := setup.o irq.o irq_handler.o time.o pci.o lib_hssubr.o +obj-y := setup.o irq.o irq_handler.o time.o pci.o # lib_hssubr.o obj-$(CONFIG_SMP) += smp.o obj-$(CONFIG_BCM1250_TBPROF) += bcm1250_tbprof.o Index: bcm1250_tbprof.c =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips/sibyte/sb1250/bcm1250_tbprof.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- bcm1250_tbprof.c 2001/11/08 17:42:08 1.1 +++ bcm1250_tbprof.c 2001/11/20 18:14:35 1.2 @@ -33,7 +33,6 @@ #include <asm/sibyte/sb1250_regs.h> #include <asm/sibyte/sb1250_scd.h> #include <asm/sibyte/sb1250_int.h> -#include <asm/sibyte/sbmips.h> #include <asm/sibyte/64bit.h> #include "bcm1250_tbprof.h" Index: irq.c =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips/sibyte/sb1250/irq.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- irq.c 2001/11/08 17:42:08 1.1 +++ irq.c 2001/11/20 18:14:35 1.2 @@ -73,8 +73,6 @@ NULL }; - -spinlock_t global_irq_lock = SPIN_LOCK_UNLOCKED; spinlock_t sb1250_imr_lock = SPIN_LOCK_UNLOCKED; void sb1250_mask_irq(int cpu, int irq) Index: irq_handler.S =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips/sibyte/sb1250/irq_handler.S,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- irq_handler.S 2001/11/08 17:42:08 1.1 +++ irq_handler.S 2001/11/20 18:14:35 1.2 @@ -38,7 +38,6 @@ #include <asm/sibyte/sb1250_defs.h> #include <asm/sibyte/sb1250_regs.h> #include <asm/sibyte/sb1250_int.h> -#include "asm/sibyte/sbmips.h" /* * What a pain. We have to be really careful saving @@ -68,11 +67,11 @@ #ifdef CONFIG_SIBYTE_SB1250_PROF /* Set compare to count to silence count/compare timer interrupts */ - mfc0 t1, C0_COUNT - mtc0 t1, C0_COMPARE /* pause to clear IP[7] bit of cause ? */ + mfc0 t1, CP0_COUNT + mtc0 t1, CP0_COMPARE /* pause to clear IP[7] bit of cause ? */ #endif /* Read cause */ - mfc0 s0, C0_CAUSE + mfc0 s0, CP0_CAUSE #ifdef CONFIG_SIBYTE_SB1250_PROF /* Cpu performance counter interrupt is routed to IP[7] */ @@ -80,7 +79,7 @@ beqz t1, 0f srl t1, s0, (CAUSEB_BD-2) /* Shift BD bit to bit 2 */ and t1, t1, 0x4 /* mask to get just BD bit */ - mfc0 a0, C0_EPC + mfc0 a0, CP0_EPC jal sbprof_cpu_intr addu a0, a0, t1 /* a0 = EPC + (BD ? 4 : 0) */ j ret_from_irq Index: smp.c =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips/sibyte/sb1250/smp.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- smp.c 2001/11/08 17:42:08 1.1 +++ smp.c 2001/11/20 18:14:35 1.2 @@ -63,16 +63,24 @@ static void sb1250_smp_call_function(void) { - void (*func) (void *info) = smp_fn_call.fn; - void *data = smp_fn_call.data; - int wait = smp_fn_call.wait; + void (*func) (void *info) = call_data->func; + void *info = call_data->info; + int wait = call_data->wait; - /* Notify initiating CPU that I've grabbed the data - * and am about to execute the function */ - atomic_inc(&smp_fn_call.started); - (*func)(data); - if (wait) - atomic_inc(&smp_fn_call.finished); + /* + * Notify initiating CPU that I've grabbed the data + * and am about to execute the function + */ + mb(); + atomic_inc(&call_data->started); + (*func)(info); + /* + * At this point the info structure may be out of scope unless wait==1 + */ + if (wait) { + mb(); + atomic_inc(&call_data->finished); + } } |
From: James S. <jsi...@us...> - 2001-11-20 18:12:29
|
Update of /cvsroot/linux-mips/linux/include/asm-mips In directory usw-pr-cvs1:/tmp/cvs-serv10741/asm-mips Modified Files: smp.h Log Message: Define call_data_struct. Index: smp.h =================================================================== RCS file: /cvsroot/linux-mips/linux/include/asm-mips/smp.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- smp.h 2001/11/19 17:28:32 1.3 +++ smp.h 2001/11/20 18:12:27 1.4 @@ -42,14 +42,19 @@ #define NO_PROC_ID (-1) -struct smp_fn_call_struct { - spinlock_t lock; - atomic_t finished; - void (*fn)(void *); - void *data; +struct call_data_struct { + void (*func)(void *); + void *info; + atomic_t started; + atomic_t finished; + int wait; }; -extern struct smp_fn_call_struct smp_fn_call; +extern struct call_data_struct *call_data; + +/* ipi types that boards must handle, one bit per type */ +#define SMP_RESCHEDULE_YOURSELF 0x1 /* XXX braindead */ +#define SMP_CALL_FUNCTION 0x2 #if (NR_CPUS <= _MIPS_SZLONG) |
From: James S. <jsi...@us...> - 2001-11-20 18:11:22
|
Update of /cvsroot/linux-mips/linux/include/asm-mips In directory usw-pr-cvs1:/tmp/cvs-serv10446 Modified Files: checksum.h Log Message: Some gcc versions don't seem to like the +r constraint. Index: checksum.h =================================================================== RCS file: /cvsroot/linux-mips/linux/include/asm-mips/checksum.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- checksum.h 2001/10/31 18:26:52 1.5 +++ checksum.h 2001/11/20 18:11:19 1.6 @@ -79,9 +79,10 @@ "addu\t%0,$1\n\t" "xori\t%0,0xffff\n\t" ".set\tat" - : "+r" (sum)); + : "=r" (sum) + : "r" (sum)); - return sum; + return sum; } /* |
From: James S. <jsi...@us...> - 2001-11-20 18:10:06
|
Update of /cvsroot/linux-mips/linux/arch/mips/mm In directory usw-pr-cvs1:/tmp/cvs-serv10093 Modified Files: Makefile Log Message: SB1 uses R4k exception handlers. Index: Makefile =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips/mm/Makefile,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- Makefile 2001/11/07 17:29:03 1.9 +++ Makefile 2001/11/20 18:10:04 1.10 @@ -24,14 +24,14 @@ obj-$(CONFIG_CPU_R4X00) += pg-r4k.o c-r4k.o tlb-r4k.o tlbex-r4k.o obj-$(CONFIG_CPU_VR41XX) += pg-r4k.o c-r4k.o tlb-r4k.o tlbex-r4k.o obj-$(CONFIG_CPU_R5000) += pg-r4k.o c-r4k.o tlb-r4k.o tlbex-r4k.o +obj-$(CONFIG_CPU_R5900) += pg-r5900.o c-r5900.o tlb-r4k.o tlbex-r4k.o obj-$(CONFIG_CPU_NEVADA) += pg-r4k.o c-r4k.o tlb-r4k.o tlbex-r4k.o obj-$(CONFIG_CPU_R5432) += pg-r5432.o c-r5432.o tlb-r4k.o tlbex-r4k.o -obj-$(CONFIG_CPU_R5900) += pg-r5900.o c-r5900.o tlb-r4k.o tlbex-r4k.o obj-$(CONFIG_CPU_RM7000) += pg-rm7k.o c-rm7k.o tlb-r4k.o tlbex-r4k.o obj-$(CONFIG_CPU_R10000) += pg-andes.o c-andes.o tlb-r4k.o tlbex-r4k.o obj-$(CONFIG_CPU_MIPS32) += pg-mips32.o c-mips32.o tlb-r4k.o tlbex-r4k.o obj-$(CONFIG_CPU_MIPS64) += pg-mips32.o c-mips32.o tlb-r4k.o tlbex-r4k.o -obj-$(CONFIG_CPU_SB1) += pg-sb1.o c-sb1.o tlb-sb1.o +obj-$(CONFIG_CPU_SB1) += pg-sb1.o c-sb1.o tlb-sb1.o tlbex-r4k.o obj-$(CONFIG_SGI_IP22) += umap.o obj-$(CONFIG_BAGET_MIPS) += umap.o |
From: James S. <jsi...@us...> - 2001-11-20 18:08:17
|
Update of /cvsroot/linux-mips/linux/arch/mips/lib In directory usw-pr-cvs1:/tmp/cvs-serv9667 Added Files: strlen_user.S Log Message: Fix symbol name. --- NEW FILE: strlen_user.S --- /* * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (c) 1996, 1998, 1999 by Ralf Baechle * Copyright (c) 1999 Silicon Graphics, Inc. */ #include <asm/asm.h> #include <asm/offset.h> #include <asm/regdef.h> #include <asm/sgidefs.h> #define EX(insn,reg,addr,handler) \ 9: insn reg, addr; \ .section __ex_table,"a"; \ PTR 9b, handler; \ .previous /* * Return the size of a string (including the ending 0) * * Return 0 for error */ LEAF(__strlen_user_asm) lw v0, THREAD_CURDS($28) # pointer ok? and v0, a0 bltz v0, fault EXPORT(__strlen_user_nocheck_asm) move v0, a0 1: EX(lb, t0, (v0), fault) addiu v0, 1 bnez t0, 1b subu v0, a0 jr ra END(__strlen_user_asm) .section __ex_table,"a" PTR 1b, fault .previous fault: move v0, zero jr ra |
From: James S. <jsi...@us...> - 2001-11-20 18:07:18
|
Update of /cvsroot/linux-mips/linux/include/asm-mips64 In directory usw-pr-cvs1:/tmp/cvs-serv9392 Added Files: keyboard.h Log Message: Sync with 32-bit version. --- NEW FILE: keyboard.h --- /* * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 1994 - 1999 Ralf Baechle */ #ifndef _ASM_KEYBOARD_H #define _ASM_KEYBOARD_H #ifdef __KERNEL__ #include <linux/config.h> #include <linux/delay.h> #include <linux/ioport.h> #include <linux/kd.h> #include <asm/bootinfo.h> #define DISABLE_KBD_DURING_INTERRUPTS 0 #ifdef CONFIG_PC_KEYB extern int pckbd_setkeycode(unsigned int scancode, unsigned int keycode); extern int pckbd_getkeycode(unsigned int scancode); extern int pckbd_translate(unsigned char scancode, unsigned char *keycode, char raw_mode); extern char pckbd_unexpected_up(unsigned char keycode); extern void pckbd_leds(unsigned char leds); extern void pckbd_init_hw(void); extern void pckbd_pm_resume(void); extern unsigned char pckbd_sysrq_xlate[128]; extern void kbd_forward_char (int ch); #define kbd_setkeycode pckbd_setkeycode #define kbd_getkeycode pckbd_getkeycode #define kbd_translate pckbd_translate #define kbd_unexpected_up pckbd_unexpected_up #define kbd_leds pckbd_leds #define kbd_init_hw pckbd_init_hw #define kbd_sysrq_xlate pckbd_sysrq_xlate #define SYSRQ_KEY 0x54 /* Some stoneage hardware needs delays after some operations. */ #define kbd_pause() do { } while(0) struct kbd_ops { /* Keyboard driver resource allocation */ void (*kbd_request_region)(void); int (*kbd_request_irq)(void (*handler)(int, void *, struct pt_regs *)); /* PSaux driver resource management */ int (*aux_request_irq)(void (*handler)(int, void *, struct pt_regs *)); void (*aux_free_irq)(void); /* Methods to access the keyboard processor's I/O registers */ unsigned char (*kbd_read_input)(void); void (*kbd_write_output)(unsigned char val); void (*kbd_write_command)(unsigned char val); unsigned char (*kbd_read_status)(void); }; extern struct kbd_ops *kbd_ops; /* Do the actual calls via kbd_ops vector */ #define kbd_request_region() kbd_ops->kbd_request_region() #define kbd_request_irq(handler) kbd_ops->kbd_request_irq(handler) #define aux_request_irq(hand, dev_id) kbd_ops->aux_request_irq(hand) #define aux_free_irq(dev_id) kbd_ops->aux_free_irq() #define kbd_read_input() kbd_ops->kbd_read_input() #define kbd_write_output(val) kbd_ops->kbd_write_output(val) #define kbd_write_command(val) kbd_ops->kbd_write_command(val) #define kbd_read_status() kbd_ops->kbd_read_status() #else extern int kbd_setkeycode(unsigned int scancode, unsigned int keycode); extern int kbd_getkeycode(unsigned int scancode); extern int kbd_translate(unsigned char scancode, unsigned char *keycode, char raw_mode); extern char kbd_unexpected_up(unsigned char keycode); extern void kbd_leds(unsigned char leds); extern void kbd_init_hw(void); extern unsigned char *kbd_sysrq_xlate; extern unsigned char kbd_sysrq_key; #define SYSRQ_KEY kbd_sysrq_key #endif #endif /* __KERNEL */ #endif /* _ASM_KEYBOARD_H */ |
From: James S. <jsi...@us...> - 2001-11-20 18:05:51
|
Update of /cvsroot/linux-mips/linux/arch/mips64/sibyte/swarm In directory usw-pr-cvs1:/tmp/cvs-serv8953 Modified Files: smp.c Log Message: Various mips 64 updates. Index: smp.c =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips64/sibyte/swarm/smp.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- smp.c 2001/11/08 17:31:17 1.1 +++ smp.c 2001/11/20 18:05:49 1.2 @@ -27,6 +27,7 @@ extern void asmlinkage smp_bootstrap(void); + /* Boot all other cpus in the system, initialize them, and bring them into the boot fn */ int sys_boot_secondary(int cpu, unsigned long sp, unsigned long gp) |
From: James S. <jsi...@us...> - 2001-11-20 18:04:25
|
Update of /cvsroot/linux-mips/linux/arch/mips64/configs In directory usw-pr-cvs1:/tmp/cvs-serv8516/configs Modified Files: defconfig-ip27 defconfig-ip32 Log Message: Various mips 64 updates. Index: defconfig-ip27 =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips64/configs/defconfig-ip27,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- defconfig-ip27 2001/10/29 17:30:56 1.4 +++ defconfig-ip27 2001/11/20 18:04:22 1.5 @@ -10,9 +10,8 @@ # # Machine selection # -# CONFIG_SGI_IP22 is not set CONFIG_SGI_IP27=y -# CONFIG_SGI_IP32 is not set +# CONFIG_SIBYTE_SWARM is not set # CONFIG_SGI_SN0_N_MODE is not set CONFIG_DISCONTIGMEM=y CONFIG_NUMA=y @@ -43,6 +42,7 @@ # CONFIG_CPU_NEVADA is not set # CONFIG_CPU_R8000 is not set CONFIG_CPU_R10000=y +# CONFIG_CPU_SB1 is not set # # General setup @@ -206,7 +206,6 @@ # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_NCR53C406A is not set -# CONFIG_SCSI_NCR_D700 is not set # CONFIG_SCSI_NCR53C7xx is not set # CONFIG_SCSI_NCR53C8XX is not set # CONFIG_SCSI_SYM53C8XX is not set @@ -225,16 +224,6 @@ # CONFIG_SCSI_U14_34F is not set # -# I2O device support -# -# CONFIG_I2O is not set -# CONFIG_I2O_PCI 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 @@ -397,11 +386,13 @@ # CONFIG_VFAT_FS is not set # CONFIG_EFS_FS is not set # CONFIG_JFFS_FS is not set +# CONFIG_JFFS2_FS is not set # CONFIG_CRAMFS is not set # CONFIG_TMPFS is not set # CONFIG_RAMFS is not set # CONFIG_ISO9660_FS is not set # CONFIG_JOLIET is not set +# CONFIG_ZISOFS is not set # CONFIG_MINIX_FS is not set # CONFIG_VXFS_FS is not set # CONFIG_NTFS_FS is not set @@ -444,6 +435,8 @@ # CONFIG_NCPFS_SMALLDOS is not set # CONFIG_NCPFS_NLS is not set # CONFIG_NCPFS_EXTRAS is not set +# CONFIG_ZISOFS_FS is not set +# CONFIG_ZLIB_FS_INFLATE is not set # # Partition Types @@ -476,6 +469,103 @@ # USB support # # CONFIG_USB is not set + +# +# USB Controllers +# +# CONFIG_USB_UHCI is not set +# CONFIG_USB_UHCI_ALT is not set +# CONFIG_USB_OHCI is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_BLUETOOTH is not set +# CONFIG_USB_STORAGE is not set +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_HP8200e is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set + +# +# USB Human Interface Devices (HID) +# + +# +# Input core support is needed for USB HID +# + +# +# USB Imaging devices +# +# CONFIG_USB_DC2XX is not set +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_SCANNER is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_HPUSBSCSI is not set + +# +# USB Multimedia devices +# + +# +# Video4Linux support is needed for USB Multimedia device support +# + +# +# USB Network adaptors +# +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_CATC is not set +# CONFIG_USB_CDCETHER is not set +# CONFIG_USB_USBNET is not set + +# +# USB port drivers +# +# CONFIG_USB_USS720 is not set + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set +# CONFIG_USB_SERIAL_GENERIC is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_IR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +# CONFIG_USB_SERIAL_KEYSPAN is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_XIRCOM is not set +# CONFIG_USB_SERIAL_OMNINET is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_RIO500 is not set # # Input core support Index: defconfig-ip32 =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips64/configs/defconfig-ip32,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- defconfig-ip32 2001/10/29 17:13:58 1.2 +++ defconfig-ip32 2001/11/20 18:04:22 1.3 @@ -10,9 +10,10 @@ # # Machine selection # -# CONFIG_SGI_IP22 is not set # CONFIG_SGI_IP27 is not set +# CONFIG_SGI_IP22 is not set CONFIG_SGI_IP32=y +# CONFIG_SIBYTE_SWARM is not set CONFIG_RWSEM_GENERIC_SPINLOCK=y # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set CONFIG_BOOT_ELF32=y @@ -36,6 +37,7 @@ # CONFIG_CPU_NEVADA is not set # CONFIG_CPU_R8000 is not set # CONFIG_CPU_R10000 is not set +# CONFIG_CPU_SB1 is not set # # General setup @@ -120,6 +122,7 @@ # CONFIG_IPV6 is not set # CONFIG_KHTTPD is not set # CONFIG_ATM is not set +# CONFIG_VLAN_8021Q is not set # # @@ -212,7 +215,6 @@ # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_NCR53C406A is not set -# CONFIG_SCSI_NCR_D700 is not set # CONFIG_SCSI_NCR53C7xx is not set # CONFIG_SCSI_NCR53C8XX is not set # CONFIG_SCSI_SYM53C8XX is not set @@ -232,16 +234,6 @@ # CONFIG_SCSI_DEBUG is not set # -# I2O device support -# -# CONFIG_I2O is not set -# CONFIG_I2O_PCI 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 @@ -377,7 +369,6 @@ # CONFIG_DTLK is not set # CONFIG_R3964 is not set # CONFIG_APPLICOM is not set -# CONFIG_SONYPI is not set # # Ftape, the floppy tape device driver @@ -410,11 +401,13 @@ # CONFIG_VFAT_FS is not set # CONFIG_EFS_FS is not set # CONFIG_JFFS_FS is not set +# CONFIG_JFFS2_FS is not set # CONFIG_CRAMFS is not set CONFIG_TMPFS=y # CONFIG_RAMFS is not set # CONFIG_ISO9660_FS is not set # CONFIG_JOLIET is not set +# CONFIG_ZISOFS is not set # CONFIG_MINIX_FS is not set # CONFIG_VXFS_FS is not set # CONFIG_NTFS_FS is not set @@ -457,6 +450,8 @@ # CONFIG_NCPFS_SMALLDOS is not set # CONFIG_NCPFS_NLS is not set # CONFIG_NCPFS_EXTRAS is not set +# CONFIG_ZISOFS_FS is not set +# CONFIG_ZLIB_FS_INFLATE is not set # # Partition Types @@ -485,6 +480,103 @@ # USB support # # CONFIG_USB is not set + +# +# USB Controllers +# +# CONFIG_USB_UHCI is not set +# CONFIG_USB_UHCI_ALT is not set +# CONFIG_USB_OHCI is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_BLUETOOTH is not set +# CONFIG_USB_STORAGE is not set +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_HP8200e is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set + +# +# USB Human Interface Devices (HID) +# + +# +# Input core support is needed for USB HID +# + +# +# USB Imaging devices +# +# CONFIG_USB_DC2XX is not set +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_SCANNER is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_HPUSBSCSI is not set + +# +# USB Multimedia devices +# + +# +# Video4Linux support is needed for USB Multimedia device support +# + +# +# USB Network adaptors +# +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_CATC is not set +# CONFIG_USB_CDCETHER is not set +# CONFIG_USB_USBNET is not set + +# +# USB port drivers +# +# CONFIG_USB_USS720 is not set + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set +# CONFIG_USB_SERIAL_GENERIC is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_IR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +# CONFIG_USB_SERIAL_KEYSPAN is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_XIRCOM is not set +# CONFIG_USB_SERIAL_OMNINET is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_RIO500 is not set # # Input core support |
From: James S. <jsi...@us...> - 2001-11-20 18:04:25
|
Update of /cvsroot/linux-mips/linux/arch/mips64/kernel In directory usw-pr-cvs1:/tmp/cvs-serv8516/kernel Modified Files: smp.c Added Files: ptrace.c Log Message: Various mips 64 updates. Index: smp.c =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips64/kernel/smp.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- smp.c 2001/11/08 17:11:07 1.9 +++ smp.c 2001/11/20 18:04:22 1.10 @@ -61,6 +61,7 @@ { /* * Remove this CPU + * XXX update this from 32-bit version */ for (;;); } @@ -265,6 +266,11 @@ printk("global_restore_flags: %08lx\n", flags); } } + +static spinlock_t call_lock = SPIN_LOCK_UNLOCKED; + +struct call_data_struct *call_data; + /* * Run a function on all other CPUs. * <func> The function to run. This must be fast and non-blocking. @@ -276,22 +282,14 @@ * Does not return until remote CPUs are nearly ready to execute <func> * or are or have executed. */ -static volatile struct call_data_struct { - void (*func) (void *info); - void *info; - atomic_t started; - atomic_t finished; - int wait; -} *call_data; int smp_call_function (void (*func) (void *info), void *info, int retry, int wait) { struct call_data_struct data; int i, cpus = smp_num_cpus-1; - static spinlock_t lock = SPIN_LOCK_UNLOCKED; - if (cpus == 0) + if (!cpus) return 0; data.func = func; @@ -301,8 +299,9 @@ if (wait) atomic_set(&data.finished, 0); - spin_lock_bh(&lock); + spin_lock_bh(&call_lock); call_data = &data; + /* Send a message to all other CPUs and wait for them to respond */ for (i = 0; i < smp_num_cpus; i++) if (smp_processor_id() != i) @@ -316,7 +315,8 @@ if (wait) while (atomic_read(&data.finished) != cpus) barrier(); - spin_unlock_bh(&lock); + spin_unlock_bh(&call_lock); + return 0; } @@ -330,16 +330,18 @@ * Notify initiating CPU that I've grabbed the data and am * about to execute the function. */ + mb(); atomic_inc(&call_data->started); /* * At this point the info structure may be out of scope unless wait==1. */ (*func)(info); - if (wait) + if (wait) { + mb(); atomic_inc(&call_data->finished); + } } - static void flush_tlb_all_ipi(void *info) { |
From: James S. <jsi...@us...> - 2001-11-20 18:04:25
|
Update of /cvsroot/linux-mips/linux/arch/mips64 In directory usw-pr-cvs1:/tmp/cvs-serv8516 Modified Files: Makefile defconfig Log Message: Various mips 64 updates. Index: Makefile =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips64/Makefile,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- Makefile 2001/09/16 03:28:13 1.4 +++ Makefile 2001/11/20 18:04:22 1.5 @@ -20,9 +20,7 @@ endif ifdef CONFIG_CROSSCOMPILE - ifndef CROSS_COMPILE - CROSS_COMPILE = $(tool-prefix) - endif +CROSS_COMPILE = $(tool-prefix) endif # @@ -64,6 +62,12 @@ endif ifdef CONFIG_CPU_R10000 CFLAGS := $(CFLAGS) -mcpu=r8000 -mips4 +endif +ifdef CONFIG_CPU_SB1 +GCCFLAGS += -mcpu=sb1 -mips2 -Wa,--trap +ifdef CONFIG_SB1_PASS_1_WORKAROUNDS +MODFLAGS += -msb1-pass1-workarounds +endif endif ifdef CONFIG_MIPS_FPU_EMULATOR Index: defconfig =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips64/defconfig,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- defconfig 2001/11/06 20:23:54 1.9 +++ defconfig 2001/11/20 18:04:22 1.10 @@ -10,9 +10,8 @@ # # Machine selection # -# CONFIG_SGI_IP22 is not set CONFIG_SGI_IP27=y -# CONFIG_SGI_IP32 is not set +# CONFIG_SIBYTE_SWARM is not set # CONFIG_SGI_SN0_N_MODE is not set CONFIG_DISCONTIGMEM=y CONFIG_NUMA=y @@ -43,6 +42,7 @@ # CONFIG_CPU_NEVADA is not set # CONFIG_CPU_R8000 is not set CONFIG_CPU_R10000=y +# CONFIG_CPU_SB1 is not set # # General setup |
From: James S. <jsi...@us...> - 2001-11-20 18:01:53
|
Update of /cvsroot/linux-mips/linux/arch/mips64/arc In directory usw-pr-cvs1:/tmp/cvs-serv7937 Added Files: arc_con.c Log Message: Minor cleanups. |
From: James S. <jsi...@us...> - 2001-11-20 18:01:01
|
Update of /cvsroot/linux-mips/linux/arch/mips64/configs In directory usw-pr-cvs1:/tmp/cvs-serv7642/configs Modified Files: defconfig-ip22 Log Message: IP22 uses a PC keyboard. Index: defconfig-ip22 =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips64/configs/defconfig-ip22,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- defconfig-ip22 2001/10/29 17:30:56 1.4 +++ defconfig-ip22 2001/11/20 18:00:58 1.5 @@ -10,15 +10,18 @@ # # Machine selection # -CONFIG_SGI_IP22=y # CONFIG_SGI_IP27 is not set +CONFIG_SGI_IP22=y # CONFIG_SGI_IP32 is not set +# CONFIG_SIBYTE_SWARM is not set CONFIG_RWSEM_GENERIC_SPINLOCK=y # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set -CONFIG_BOOT_ELF32=y CONFIG_ARC32=y -CONFIG_BOARD_SCACHE=y +CONFIG_ARC_CONSOLE=y CONFIG_ARC_MEMORY=y +CONFIG_BOARD_SCACHE=y +CONFIG_PC_KEYB=y +CONFIG_BOOT_ELF32=y CONFIG_SGI=y CONFIG_L1_CACHE_SHIFT=5 # CONFIG_ISA is not set @@ -36,6 +39,7 @@ # CONFIG_CPU_NEVADA is not set # CONFIG_CPU_R8000 is not set # CONFIG_CPU_R10000 is not set +# CONFIG_CPU_SB1 is not set # # General setup @@ -48,7 +52,7 @@ CONFIG_SYSVIPC=y # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y -# CONFIG_ARC_CONSOLE is not set +CONFIG_ARC_CONSOLE=y CONFIG_BINFMT_ELF=y CONFIG_MIPS32_COMPAT=y CONFIG_BINFMT_ELF32=y @@ -124,6 +128,7 @@ # CONFIG_IPV6 is not set # CONFIG_KHTTPD is not set # CONFIG_ATM is not set +# CONFIG_VLAN_8021Q is not set # # @@ -213,7 +218,6 @@ # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_NCR53C406A is not set -# CONFIG_SCSI_NCR_D700 is not set # CONFIG_SCSI_NCR53C7xx is not set # CONFIG_SCSI_PAS16 is not set # CONFIG_SCSI_PCI2000 is not set @@ -227,15 +231,6 @@ # CONFIG_SCSI_DEBUG 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 @@ -368,7 +363,6 @@ # CONFIG_DTLK is not set # CONFIG_R3964 is not set # CONFIG_APPLICOM is not set -# CONFIG_SONYPI is not set # # Ftape, the floppy tape device driver @@ -401,11 +395,13 @@ # CONFIG_VFAT_FS is not set # CONFIG_EFS_FS is not set # CONFIG_JFFS_FS is not set +# CONFIG_JFFS2_FS is not set # CONFIG_CRAMFS is not set # CONFIG_TMPFS is not set # CONFIG_RAMFS is not set CONFIG_ISO9660_FS=y # CONFIG_JOLIET is not set +# CONFIG_ZISOFS is not set # CONFIG_MINIX_FS is not set # CONFIG_VXFS_FS is not set # CONFIG_NTFS_FS is not set @@ -447,6 +443,8 @@ # CONFIG_NCPFS_SMALLDOS is not set # CONFIG_NCPFS_NLS is not set # CONFIG_NCPFS_EXTRAS is not set +# CONFIG_ZISOFS_FS is not set +# CONFIG_ZLIB_FS_INFLATE is not set # # Partition Types @@ -498,6 +496,103 @@ # USB support # # CONFIG_USB is not set + +# +# USB Controllers +# +# CONFIG_USB_UHCI is not set +# CONFIG_USB_UHCI_ALT is not set +# CONFIG_USB_OHCI is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_BLUETOOTH is not set +# CONFIG_USB_STORAGE is not set +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_HP8200e is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set + +# +# USB Human Interface Devices (HID) +# + +# +# Input core support is needed for USB HID +# + +# +# USB Imaging devices +# +# CONFIG_USB_DC2XX is not set +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_SCANNER is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_HPUSBSCSI is not set + +# +# USB Multimedia devices +# + +# +# Video4Linux support is needed for USB Multimedia device support +# + +# +# USB Network adaptors +# +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_CATC is not set +# CONFIG_USB_CDCETHER is not set +# CONFIG_USB_USBNET is not set + +# +# USB port drivers +# +# CONFIG_USB_USS720 is not set + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set +# CONFIG_USB_SERIAL_GENERIC is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_IR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +# CONFIG_USB_SERIAL_KEYSPAN is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_XIRCOM is not set +# CONFIG_USB_SERIAL_OMNINET is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_RIO500 is not set # # Input core support |
From: James S. <jsi...@us...> - 2001-11-20 18:01:01
|
Update of /cvsroot/linux-mips/linux/arch/mips64 In directory usw-pr-cvs1:/tmp/cvs-serv7642 Modified Files: config.in Log Message: IP22 uses a PC keyboard. Index: config.in =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips64/config.in,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- config.in 2001/11/06 02:57:37 1.6 +++ config.in 2001/11/20 18:00:58 1.7 @@ -11,10 +11,12 @@ mainmenu_option next_comment comment 'Machine selection' -choice 'Machine type' \ - "SGI-IP22,Indy/Indigo2 CONFIG_SGI_IP22 \ - SGI-IP27,Origin200/2000 CONFIG_SGI_IP27 \ - SGI-IP32,O2 CONFIG_SGI_IP32" CONFIG_SGI_IP27 +bool ' Support for SGI-IP27 (Origin200/2000)' CONFIG_SGI_IP27 +if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + bool ' Support for SGI-IP22 (Indy/Indigo2)' CONFIG_SGI_IP22 + bool ' Support for SGI-IP32 (O2)' CONFIG_SGI_IP32 +fi +bool ' Support for SiByte SWARM board' CONFIG_SIBYTE_SWARM if [ "$CONFIG_SGI_IP27" = "y" ]; then bool ' IP27 N-Mode' CONFIG_SGI_SN0_N_MODE @@ -26,6 +28,9 @@ bool ' Multi-Processing support' CONFIG_SMP #bool ' IP27 XXL' CONFIG_SGI_SN0_XXL fi +if [ "$CONFIG_SIBYTE_SWARM" = "y" ]; then + bool ' Multi-Processing support' CONFIG_SMP +fi endmenu define_bool CONFIG_RWSEM_GENERIC_SPINLOCK y @@ -46,10 +51,12 @@ unset CONFIG_PCI if [ "$CONFIG_SGI_IP22" = "y" ]; then - define_bool CONFIG_BOOT_ELF32 y define_bool CONFIG_ARC32 y - define_bool CONFIG_BOARD_SCACHE y + define_bool CONFIG_ARC_CONSOLE y define_bool CONFIG_ARC_MEMORY y + define_bool CONFIG_BOARD_SCACHE y + define_bool CONFIG_PC_KEYB y + define_bool CONFIG_BOOT_ELF32 y define_bool CONFIG_SGI y define_int CONFIG_L1_CACHE_SHIFT 5 fi @@ -75,6 +82,15 @@ define_int CONFIG_L1_CACHE_SHIFT 5 fi +if [ "$CONFIG_SIBYTE_SWARM" = "y" ]; then + define_bool CONFIG_BOOT_ELF64 y + define_bool CONFIG_COHERENT_IO y + define_bool CONFIG_SWAP_IO_SPACE y + define_bool CONFIG_CFE y + define_bool CONFIG_SIBYTE_SB1250 y + define_int CONFIG_L1_CACHE_SHIFT 5 +fi + if [ "$CONFIG_ISA" != "y" ]; then define_bool CONFIG_ISA n define_bool CONFIG_EISA n @@ -98,7 +114,8 @@ R5000 CONFIG_CPU_R5000 \ R52x0 CONFIG_CPU_NEVADA \ R8000 CONFIG_CPU_R8000 \ - R10000 CONFIG_CPU_R10000" R4x00 + R10000 CONFIG_CPU_R10000 \ + SB1 CONFIG_CPU_SB1" R4x00 endmenu mainmenu_option next_comment |
From: James S. <jsi...@us...> - 2001-11-20 17:58:39
|
Update of /cvsroot/linux-mips/linux/arch/mips64/mm In directory usw-pr-cvs1:/tmp/cvs-serv6809 Added Files: sb1.c Log Message: More SB1 bits. --- NEW FILE: sb1.c --- /* * Copyright (C) 2000, 2001 Broadcom Corporation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* * sb1250.c: MMU and cache operations for the SB1250 */ #include <asm/mmu_context.h> #include <asm/bootinfo.h> #include <asm/cpu.h> #include <asm/pgtable.h> /*#define SB1_CACHE_CONSERVATIVE*/ /*#define SB1_TLB_CONSERVATIVE */ /* These are probed at ld_mmu time */ static unsigned int icache_size; static unsigned int dcache_size; static unsigned int icache_line_size; static unsigned int dcache_line_size; static unsigned int icache_assoc; static unsigned int dcache_assoc; static unsigned int icache_sets; static unsigned int dcache_sets; static unsigned int tlb_entries; #define read_mips32_cp0_config1() \ ({ int __res; \ __asm__ __volatile__( \ ".set\tnoreorder\n\t" \ ".set\tnoat\n\t" \ ".word\t0x40018001\n\t" \ "move\t%0,$1\n\t" \ ".set\tat\n\t" \ ".set\treorder" \ :"=r" (__res)); \ __res;}) static void sb1_flush_tlb_all(void) { unsigned long flags; unsigned long old_ctx; int entry; __save_and_cli(flags); /* Save old context and create impossible VPN2 value */ old_ctx = (get_entryhi() & 0xff); set_entrylo0(0); set_entrylo1(0); for (entry = 0; entry < tlb_entries; entry++) { set_entryhi(KSEG0 + (PAGE_SIZE << 1) * entry); set_index(entry); tlb_write_indexed(); } set_entryhi(old_ctx); __restore_flags(flags); } /* * Use a bogus region of memory (starting at 0) to sanitize the TLB's. * Use increments of the maximum page size (16MB), and check for duplicate entries * before doing a given write. Then, when we're safe from collisions with the * firmware, go back and give all the entries invalid addresses with the normal * flush routine. */ void sb1_sanitize_tlb(void) { int entry; long addr = 0; long inc = 1<<24; /* 16MB */ /* Save old context and create impossible VPN2 value */ set_entrylo0(0); set_entrylo1(0); for (entry = 0; entry < tlb_entries; entry++) { do { addr += inc; set_entryhi(addr); tlb_probe(); } while ((int)(get_index()) >= 0); set_index(entry); tlb_write_indexed(); } /* Now that we know we're safe from collisions, we can safely flush the TLB with the "normal" routine. */ sb1_flush_tlb_all(); } static void sb1_flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end) { #ifdef SB1_TLB_CONSERVATIVE sb1_flush_tlb_all(); #else unsigned long flags; int cpu; __save_and_cli(flags); cpu = smp_processor_id(); if(CPU_CONTEXT(cpu, mm) != 0) { int size; size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT; size = (size + 1) >> 1; if(size <= 64) { int oldpid = (get_entryhi() & 0xff); int newpid = (CPU_CONTEXT(cpu, mm) & 0xff); start &= (PAGE_MASK << 1); end += ((PAGE_SIZE << 1) - 1); end &= (PAGE_MASK << 1); while(start < end) { int idx; set_entryhi(start | newpid); start += (PAGE_SIZE << 1); tlb_probe(); idx = get_index(); set_entrylo0(0); set_entrylo1(0); set_entryhi(KSEG0 + (idx << (PAGE_SHIFT+1))); if(idx < 0) continue; tlb_write_indexed(); } set_entryhi(oldpid); } else { get_new_cpu_mmu_context(mm, cpu); if (mm == current->active_mm) set_entryhi(CPU_CONTEXT(cpu, mm) & 0xff); } } __restore_flags(flags); #endif } static void sb1_flush_tlb_page(struct vm_area_struct *vma, unsigned long page) { #ifdef SB1_TLB_CONSERVATIVE sb1_flush_tlb_all(); #else unsigned long flags; int cpu = smp_processor_id(); __save_and_cli(flags); if (CPU_CONTEXT(cpu, vma->vm_mm) != 0) { int oldpid, newpid, idx; #ifdef DEBUG_TLB printk("[tlbpage<%d,%08lx>]", CPU_CONTEXT(cpu, vma->vm_mm), page); #endif newpid = (CPU_CONTEXT(cpu, vma->vm_mm) & 0xff); page &= (PAGE_MASK << 1); oldpid = (get_entryhi() & 0xff); set_entryhi(page | newpid); tlb_probe(); idx = get_index(); set_entrylo0(0); set_entrylo1(0); if(idx < 0) goto finish; /* Make sure all entries differ. */ set_entryhi(KSEG0+(idx<<(PAGE_SHIFT + 1))); tlb_write_indexed(); finish: set_entryhi(oldpid); } __restore_flags(flags); #endif } /* All entries common to a mm share an asid. To effectively flush these entries, we just bump the asid. */ static void sb1_flush_tlb_mm(struct mm_struct *mm) { #ifdef SB1_TLB_CONSERVATIVE sb1_flush_tlb_all(); #else unsigned long flags; int cpu; __save_and_cli(flags); cpu = smp_processor_id(); if (CPU_CONTEXT(cpu, mm) != 0) { get_new_cpu_mmu_context(mm, cpu); if (mm == current->active_mm) { set_entryhi(CPU_CONTEXT(cpu, mm) & 0xff); } } __restore_flags(flags); #endif } /* Stolen from mips32 routines */ void sb1_update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte) { #ifdef SB1_TLB_CONSERVATIVE sb1_flush_tlb_all(); #else unsigned long flags; pgd_t *pgdp; pmd_t *pmdp; pte_t *ptep; int idx, pid; /* * Handle debugger faulting in for debugee. */ if (current->active_mm != vma->vm_mm) return; __save_and_cli(flags); pid = get_entryhi() & 0xff; #ifdef DEBUG_TLB if((pid != (CPU_CONTEXT(cpu, vma->vm_mm) & 0xff)) || (CPU_CONTEXT(cpu, vma->vm_mm) == 0)) { printk("update_mmu_cache: Wheee, bogus tlbpid mmpid=%d tlbpid=%d\n", (int) (CPU_CONTEXT(cpu, vma->vm_mm) & 0xff), pid); } #endif address &= (PAGE_MASK << 1); set_entryhi(address | (pid)); pgdp = pgd_offset(vma->vm_mm, address); tlb_probe(); pmdp = pmd_offset(pgdp, address); idx = get_index(); ptep = pte_offset(pmdp, address); set_entrylo0(pte_val(*ptep++) >> 6); set_entrylo1(pte_val(*ptep) >> 6); set_entryhi(address | (pid)); if(idx < 0) { tlb_write_random(); } else { tlb_write_indexed(); } set_entryhi(pid); __restore_flags(flags); #endif } #ifdef CONFIG_SB1_PASS_1_WORKAROUNDS #define SB1_PREF_LOAD_STREAMED_HINT "0" #define SB1_PREF_STORE_STREAMED_HINT "1" #else #define SB1_PREF_LOAD_STREAMED_HINT "4" #define SB1_PREF_STORE_STREAMED_HINT "5" #endif /* These are the functions hooked by the memory management function pointers */ static void sb1_clear_page(void *page) { /* JDCXXX - This should be bottlenecked by the write buffer, but these things tend to be mildly unpredictable...should check this on the performance model */ /* No write-hint type op available. We might be able to go a bit faster by tweaking the caches and using uncached accellerated mode, but doesn't seem worth the complexity. We could also try doing this with a reserved data mover on the sb1250...*/ __asm__ __volatile__( ".set push \n" ".set noreorder \n" ".set noat \n" ".set mips4 \n" " addiu $1, %0, %2 \n" /* Calculate the end of the page to clear */ " pref " SB1_PREF_STORE_STREAMED_HINT ", 0(%0) \n" /* Prefetch the first 4 lines */ " pref " SB1_PREF_STORE_STREAMED_HINT ", 32(%0) \n" " pref " SB1_PREF_STORE_STREAMED_HINT ", 64(%0) \n" " pref " SB1_PREF_STORE_STREAMED_HINT ", 96(%0) \n" "1: sd $0, 0(%0) \n" /* Throw out a cacheline of 0's */ " sd $0, 8(%0) \n" " sd $0, 16(%0) \n" " sd $0, 24(%0) \n" " pref " SB1_PREF_STORE_STREAMED_HINT ",128(%0) \n" /* Prefetch 4 lines ahead */ " bne $1, %0, 1b \n" " addiu %0, %0, 32 \n" /* Next cacheline (This instruction better be short piped!) */ ".set pop \n" :"=r" (page) :"0" (page), "I" (PAGE_SIZE-32) :"$1","memory"); } static void sb1_copy_page(void *to, void *from) { /* The pref's used here are using "streaming" hints, which cause the copied data to be kicked out of the cache sooner. A page copy often ends up copying a lot more data than is commonly used, so this seems to make sense in terms of reducing cache pollution, but I've no real performance data to back this up */ __asm__ __volatile__( ".set push \n" ".set noreorder \n" ".set noat \n" ".set mips4 \n" " daddiu $1, %0, %4 \n" /* Calculate the end of the page to copy */ " pref " SB1_PREF_LOAD_STREAMED_HINT ", 0(%0) \n" /* Prefetch the first 3 lines */ " pref " SB1_PREF_STORE_STREAMED_HINT ", 0(%1) \n" " pref " SB1_PREF_LOAD_STREAMED_HINT ", 32(%0) \n" " pref " SB1_PREF_STORE_STREAMED_HINT ", 32(%1) \n" " pref " SB1_PREF_LOAD_STREAMED_HINT ", 64(%0) \n" " pref " SB1_PREF_STORE_STREAMED_HINT ", 64(%1) \n" "1: ld $2, 0(%0) \n" /* Block copy a cacheline */ " ld $3, 8(%0) \n" " ld $4, 16(%0) \n" " ld $5, 24(%0) \n" " pref " SB1_PREF_LOAD_STREAMED_HINT ", 96(%0) \n" /* Prefetch ahead */ " pref " SB1_PREF_STORE_STREAMED_HINT ", 96(%1) \n" " sd $2, 0(%1) \n" " sd $3, 8(%1) \n" " sd $4, 16(%1) \n" " sd $5, 24(%1) \n" " daddiu %1, %1, 32 \n" /* Next cacheline */ " nop \n" /* Force next add to short pipe */ " nop \n" /* Force next add to short pipe */ " bne $1, %0, 1b \n" " addiu %0, %0, 32 \n" /* Next cacheline */ ".set pop \n" :"=r" (to), "=r" (from) : "0" (from), "1" (to), "I" (PAGE_SIZE-32) :"$1","$2","$3","$4","$5","memory"); /* unsigned long *src = from; unsigned long *dest = to; unsigned long *target = (unsigned long *) (((unsigned long)src) + PAGE_SIZE); while (src != target) { *dest++ = *src++; } */ } /* * The dcache is fully coherent to the system, with one * big caveat: the instruction stream. In other words, * if we miss in the icache, and have dirty data in the * L1 dcache, then we'll go out to memory (or the L2) and * get the not-as-recent data. * * So the only time we have to flush the dcache is when * we're flushing the icache. Since the L2 is fully * coherent to everything, including I/O, we never have * to flush it */ static void sb1_flush_cache_all(void) { /* Haven't worried too much about speed here; given that we're flushing the icache, the time to invalidate is dwarfed by the time it's going to take to refill it. Register usage: $1 - moving cache index $2 - set count */ if (icache_sets) { if (dcache_sets) { __asm__ __volatile__ ( ".set push \n" ".set noreorder \n" ".set noat \n" ".set mips4 \n" " move $1, %2 \n" /* Start at index 0 */ "1: cache 0x1, 0($1) \n" /* WB/Invalidate this index */ " addiu %1, %1, -1 \n" /* Decrement loop count */ " bnez %1, 1b \n" /* loop test */ " daddu $1, $1, %0 \n" /* Next address JDCXXX - Should be short piped */ ".set pop \n" ::"r" (dcache_line_size), "r" (dcache_sets * dcache_assoc), "r" (KSEG0) :"$1"); } __asm__ __volatile__ ( ".set push \n" ".set noreorder \n" ".set noat \n" ".set mips4 \n" " move $1, %2 \n" /* Start at index 0 */ "1: cache 0, 0($1) \n" /* Invalidate this index */ " addiu %1, %1, -1 \n" /* Decrement loop count */ " bnez %1, 1b \n" /* loop test */ " daddu $1, $1, %0 \n" /* Next address JDCXXX - Should be short piped */ ".set pop \n" : :"r" (icache_line_size), "r" (icache_sets * icache_assoc), "r" (KSEG0) :"$1"); } } /* When flushing a range in the icache, we have to first writeback the dcache for the same range, so new ifetches will see any data that was dirty in the dcache */ static void sb1_flush_icache_range(unsigned long start, unsigned long end) { #ifdef SB1_CACHE_CONSERVATIVE sb1_flush_cache_all(); #else if (start == end) { return; } start &= ~((long)(dcache_line_size - 1)); end = (end - 1) & ~((long)(dcache_line_size - 1)); /* The 16M number here is pretty arbitrary */ if ((end-start) >= (16*1024*1024)) { sb1_flush_cache_all(); } else { if (icache_sets) { if (dcache_sets) { #ifdef CONFIG_SB1_PASS_1_WORKAROUNDS unsigned long flags; local_irq_save(flags); #endif __asm__ __volatile__ ( ".set push \n" ".set noreorder \n" ".set noat \n" ".set mips4 \n" " move $1, %0 \n" "1: \n" #ifdef CONFIG_SB1_PASS_1_WORKAROUNDS " lw $0, 0($1) \n" /* Bug 1370, 1368 */ " cache 0x15, 0($1) \n" /* Hit-WB-inval this address */ #else " cache 0x19, 0($1) \n" /* Hit-WB this address */ #endif " bne $1, %1, 1b \n" /* loop test */ " daddu $1, $1, %2 \n" /* next line */ ".set pop \n" ::"r" (start), "r" (end), "r" (dcache_line_size) :"$1"); #ifdef CONFIG_SB1_PASS_1_WORKAROUNDS local_irq_restore(flags); #endif } __asm__ __volatile__ ( ".set push \n" ".set noreorder \n" ".set noat \n" ".set mips4 \n" " move $1, %0 \n" "1: cache 0x10, 0($1) \n" /* Hit-inval this address */ " bne $1, %1, 1b \n" /* loop test */ " daddu $1, $1, %2 \n" /* next line */ ".set pop \n" ::"r" (start), "r" (end), "r" (icache_line_size) :"$1"); } } #endif } /* * Anything that just flushes dcache state can be * ignored, as we're always coherent in dcache space. * This is just a dummy function that all the * nop'ed routines point to */ static void sb1_nop(void) { } static inline void protected_flush_icache_line(unsigned long addr) { __asm__ __volatile__( " .set push \n" " .set noreorder \n" " .set mips4 \n" "1: cache 0x10, (%0) \n" "2: .set pop \n" " .section __ex_table,\"a\"\n" " .dword 1b, 2b \n" " .previous" : : "r" (addr)); } static inline void protected_writeback_dcache_line(unsigned long addr) { #ifdef CONFIG_SB1_PASS_1_WORKAROUNDS unsigned long flags; local_irq_save(flags); #endif __asm__ __volatile__( " .set push \n" " .set noreorder \n" " .set mips4 \n" "1: \n" #ifdef CONFIG_SB1_PASS_1_WORKAROUNDS " lw $0, (%0) \n" " cache 0x15, (%0) \n" #else " cache 0x19, (%0) \n" #endif "2: .set pop \n" " .section __ex_table,\"a\"\n" " .dword 1b, 2b \n" " .previous" : : "r" (addr)); #ifdef CONFIG_SB1_PASS_1_WORKAROUNDS local_irq_restore(flags); #endif } /* * XXX - Still need to really understand this. This is mostly just * derived from the r10k and r4k implementations, and seems to work * but things that "seem to work" when I don't understand *why* they * "seem to work" disturb me greatly...JDC */ static void sb1_flush_cache_sigtramp(unsigned long addr) { #ifdef SB1_CACHE_CONSERVATIVE sb1_flush_cache_all(); #else unsigned long daddr, iaddr; daddr = addr & ~(dcache_line_size - 1); protected_writeback_dcache_line(daddr); protected_writeback_dcache_line(daddr + dcache_line_size); iaddr = addr & ~(icache_line_size - 1); protected_flush_icache_line(iaddr); protected_flush_icache_line(iaddr + icache_line_size); #endif } /* * This only needs to make sure stores done up to this * point are visible to other agents outside the CPU. Given * the coherent nature of the ZBus, all that's required here is * a sync to make sure the data gets out to the caches and is * visible to an arbitrary A Phase from an external agent * * Actually, I'm not even sure that's necessary; the semantics * of this function aren't clear. If it's supposed to serve as * a memory barrier, this is needed. If it's only meant to * prevent data from being invisible to non-cpu memory accessors * for some indefinite period of time (e.g. in a non-coherent * dcache) then this function would be a complete nop. */ static void sb1_flush_page_to_ram(struct page *page) { __asm__ __volatile__( " sync \n" /* Short pipe */ :::"memory"); } static void sb1_flush_icache_page(struct vm_area_struct *vma, struct page *page) { #ifdef SB1_CACHE_CONSERVATIVE sb1_flush_cache_all(); #else unsigned long addr; if ((vma->vm_mm->context == 0) || !(vma->vm_flags & VM_EXEC)) { return; } addr = (unsigned long)page_address(page); sb1_flush_icache_range(addr, addr + PAGE_SIZE); #endif } /* * Cache set values (from the mips64 spec) * 0 - 64 * 1 - 128 * 2 - 256 * 3 - 512 * 4 - 1024 * 5 - 2048 * 6 - 4096 * 7 - Reserved */ static unsigned int decode_cache_sets(unsigned int config_field) { if (config_field == 7) { /* JDCXXX - Find a graceful way to abort. */ return 0; } return (1<<(config_field + 6)); } /* * Cache line size values (from the mips64 spec) * 0 - No cache present. * 1 - 4 bytes * 2 - 8 bytes * 3 - 16 bytes * 4 - 32 bytes * 5 - 64 bytes * 6 - 128 bytes * 7 - Reserved */ static unsigned int decode_cache_line_size(unsigned int config_field) { if (config_field == 0) { return 0; } else if (config_field == 7) { /* JDCXXX - Find a graceful way to abort. */ return 0; } return (1<<(config_field + 1)); } /* * Relevant bits of the config1 register format (from the MIPS32/MIPS64 specs) * * 24:22 Icache sets per way * 21:19 Icache line size * 18:16 Icache Associativity * 15:13 Dcache sets per way * 12:10 Dcache line size * 9:7 Dcache Associativity */ static void probe_cache_sizes(void) { u32 config1 = read_mips32_cp0_config1(); icache_line_size = decode_cache_line_size((config1 >> 19) & 0x7); dcache_line_size = decode_cache_line_size((config1 >> 10) & 0x7); icache_sets = decode_cache_sets((config1 >> 22) & 0x7); dcache_sets = decode_cache_sets((config1 >> 13) & 0x7); icache_assoc = ((config1 >> 16) & 0x7) + 1; dcache_assoc = ((config1 >> 7) & 0x7) + 1; icache_size = icache_line_size * icache_sets * icache_assoc; dcache_size = dcache_line_size * dcache_sets * dcache_assoc; tlb_entries = ((config1 >> 25) & 0x3f) + 1; } void sb1_show_regs(struct pt_regs *regs) { /* Saved main processor registers. */ printk("$0 : %016lx %016lx %016lx %016lx\n", 0UL, regs->regs[1], regs->regs[2], regs->regs[3]); printk("$4 : %016lx %016lx %016lx %016lx\n", regs->regs[4], regs->regs[5], regs->regs[6], regs->regs[7]); printk("$8 : %016lx %016lx %016lx %016lx\n", regs->regs[8], regs->regs[9], regs->regs[10], regs->regs[11]); printk("$12: %016lx %016lx %016lx %016lx\n", regs->regs[12], regs->regs[13], regs->regs[14], regs->regs[15]); printk("$16: %016lx %016lx %016lx %016lx\n", regs->regs[16], regs->regs[17], regs->regs[18], regs->regs[19]); printk("$20: %016lx %016lx %016lx %016lx\n", regs->regs[20], regs->regs[21], regs->regs[22], regs->regs[23]); printk("$24: %016lx %016lx\n", regs->regs[24], regs->regs[25]); printk("$28: %016lx %016lx %016lx %016lx\n", regs->regs[28], regs->regs[29], regs->regs[30], regs->regs[31]); /* Saved cp0 registers. */ printk("epc : %016lx\nStatus: %08lx\nCause : %08lx\n", regs->cp0_epc, regs->cp0_status, regs->cp0_cause); printk("errpc : %016lx\n", read_64bit_cp0_register(CP0_ERROREPC)); } /* This is called from loadmmu.c. We have to set up all the memory management function pointers, as well as initialize the caches and tlbs */ void ld_mmu_sb1(void) { probe_cache_sizes(); _clear_page = sb1_clear_page; _copy_page = sb1_copy_page; _flush_cache_all = sb1_flush_cache_all; _flush_cache_sigtramp = sb1_flush_cache_sigtramp; _flush_page_to_ram = sb1_flush_page_to_ram; _flush_icache_page = sb1_flush_icache_page; _flush_icache_range = sb1_flush_icache_range; _flush_cache_mm = (void (*)(struct mm_struct *))sb1_nop; _flush_cache_range = (void (*)(struct mm_struct *, unsigned long, unsigned long))sb1_nop; _flush_cache_page = (void (*)(struct vm_area_struct *, unsigned long))sb1_nop; _flush_tlb_all = sb1_flush_tlb_all; _flush_tlb_mm = sb1_flush_tlb_mm; _flush_tlb_range = sb1_flush_tlb_range; _flush_tlb_page = sb1_flush_tlb_page; _show_regs = sb1_show_regs; update_mmu_cache = sb1_update_mmu_cache; cpu_data[0].asid_cache = ASID_FIRST_VERSION; /* JDCXXX I'm not sure whether these are necessary: is this the right place to initialize the tlb? If it is, why is it done at this level instead of as common code in loadmmu()? */ flush_cache_all(); sb1_sanitize_tlb(); /* Turn on caching in kseg0 */ set_cp0_config(CONF_CM_CMASK, 0x5); } |
From: James S. <jsi...@us...> - 2001-11-20 17:57:35
|
Update of /cvsroot/linux-mips/linux/arch/mips64/mm In directory usw-pr-cvs1:/tmp/cvs-serv6475 Modified Files: andes.c init.c r4xx0.c Log Message: Nothing here needs <asm/sgialib.h>. Index: andes.c =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips64/mm/andes.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- andes.c 2001/11/19 17:57:38 1.7 +++ andes.c 2001/11/20 17:57:32 1.8 @@ -15,7 +15,6 @@ #include <asm/pgtable.h> #include <asm/r10kcache.h> #include <asm/system.h> -#include <asm/sgialib.h> #include <asm/mmu_context.h> static int scache_lsz64; Index: init.c =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips64/mm/init.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- init.c 2001/10/19 21:19:38 1.3 +++ init.c 2001/11/20 17:57:32 1.4 @@ -32,9 +32,6 @@ #include <asm/system.h> #include <asm/pgtable.h> #include <asm/pgalloc.h> -#ifdef CONFIG_SGI_IP22 -#include <asm/sgialib.h> -#endif #include <asm/mmu_context.h> #include <asm/tlb.h> Index: r4xx0.c =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips64/mm/r4xx0.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- r4xx0.c 2001/11/19 17:57:38 1.8 +++ r4xx0.c 2001/11/20 17:57:32 1.9 @@ -20,7 +20,6 @@ #include <asm/pgtable.h> #include <asm/system.h> #include <asm/bootinfo.h> -#include <asm/sgialib.h> #include <asm/mmu_context.h> /* CP0 hazard avoidance. */ |
From: James S. <jsi...@us...> - 2001-11-20 17:53:06
|
Update of /cvsroot/linux-mips/linux/arch/mips64/mm In directory usw-pr-cvs1:/tmp/cvs-serv5155 Modified Files: loadmmu.c Log Message: No need to include <asm/sgialib.h>. Index: loadmmu.c =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips64/mm/loadmmu.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- loadmmu.c 2001/10/11 23:05:54 1.1 +++ loadmmu.c 2001/11/20 17:53:03 1.2 @@ -17,7 +17,6 @@ #include <asm/pgtable.h> #include <asm/system.h> #include <asm/bootinfo.h> -#include <asm/sgialib.h> /* memory functions */ void (*_clear_page)(void * page); @@ -49,6 +48,7 @@ extern void ld_mmu_r4xx0(void); extern void ld_mmu_andes(void); +extern void ld_mmu_sb1(void); void __init load_mmu(void) { @@ -76,11 +76,16 @@ ld_mmu_r4xx0(); break; #endif - -#if defined (CONFIG_CPU_R10000) +#ifdef CONFIG_CPU_R10000 case CPU_R10000: printk("Loading R10000 MMU routines.\n"); ld_mmu_andes(); + break; +#endif +#if defined CONFIG_CPU_SB1 + case CPU_SB1: + printk("Loading SB1 MMU routines.\n"); + ld_mmu_sb1(); break; #endif |
From: James S. <jsi...@us...> - 2001-11-20 17:51:17
|
Update of /cvsroot/linux-mips/linux/drivers/char In directory usw-pr-cvs1:/tmp/cvs-serv4591/drivers/char Modified Files: Config.in Makefile Added Files: sb1250_duart.c Log Message: SB1250 DUART driver. --- NEW FILE: sb1250_duart.c --- /* * Copyright (C) 2000, 2001 Broadcom Corporation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* * Driver support for the on-chip sb1250 dual-channel serial port, * running in asynchronous mode. Also, support for doing a serial console * on one of those ports * * The non-console part of this code is based heavily on the serial_21285.c * driver also in this directory. See tty_driver.h for a description of some * of the driver functions, though it (like most of the inline code documentation :) * is a bit out of date. */ #include <linux/types.h> #include <linux/serial.h> #include <linux/module.h> #include <linux/console.h> #include <linux/kdev_t.h> #include <linux/major.h> #include <linux/termios.h> #include <linux/spinlock.h> #include <linux/irq.h> #include <linux/errno.h> #include <linux/tty.h> #include <linux/sched.h> #include <linux/tty_flip.h> #include <linux/timer.h> #include <linux/init.h> #include <asm/io.h> #include <asm/uaccess.h> #include <asm/sibyte/swarm.h> #include <asm/sibyte/sb1250.h> #include <asm/sibyte/sbmips.h> #include <asm/sibyte/sb1250_regs.h> #include <asm/sibyte/sb1250_uart.h> #include <asm/sibyte/sb1250_int.h> #include <asm/sibyte/64bit.h> /* Toggle spewing of debugging output */ #undef DUART_SPEW /* * Just stole some device numbers for now. We'll have to either commit to * being gung-ho devfs, or get some official numbers assigned to us in * the future * */ #define SB1250_DUART_NAME "ttySB" #define SB1250_DUART_MAJOR 204 #define SB1250_DUART_MINOR 0 #define SB1250_DUART_AUXNAME "cuaSB" #define SB1250_DUART_AUXMAJOR 205 #define SB1250_DUART_AUXMINOR 0 #define DEFAULT_CFLAGS (CS8 | B115200) #ifdef FORCED_INPUT static struct timer_list inp_timer; static unsigned char inp_cmds[] = ""; "foo\n"; "export LD_DEBUG=all\nfoo\n"; static unsigned char *next_inp; struct tty_struct *stuff_char_tty; static void stuff_char(unsigned long arg) { int was_newline = 0; tty_insert_flip_char(stuff_char_tty, *next_inp, 0); tty_flip_buffer_push(stuff_char_tty); if (*next_inp == '\n') { was_newline = 1; } next_inp++; del_timer(&inp_timer); if (*next_inp) { inp_timer.expires = jiffies + (was_newline?20:2); add_timer(&inp_timer); } } #endif /* Still not sure what the termios structures set up here are for, but we have to supply pointers to them to register the tty driver */ static struct tty_driver sb1250_duart_driver, sb1250_duart_callout_driver; static int ref_count; static struct tty_struct *duart_table[2]; static struct termios *duart_termios[2]; static struct termios *duart_termios_locked[2]; /* This lock protects both the open flags for all the uart states as well as the reference count for the module */ static spinlock_t open_lock = SPIN_LOCK_UNLOCKED; /* Protect the writing stuff from contention */ //static spinlock_t console_lock = SPIN_LOCK_UNLOCKED; /* Bit fields of flags in the flags field below */ #define SD_WRITE_WAKE 0x000000001 typedef struct { struct tty_struct *tty; unsigned char outp_buf[CONFIG_SB1250_DUART_OUTPUT_BUF_SIZE]; unsigned int outp_head; unsigned int outp_tail; unsigned int outp_count; spinlock_t outp_lock; unsigned int outp_stopped; unsigned int open; unsigned long flags; unsigned int last_cflags; } uart_state_t; static uart_state_t uart_states[2] = { [0 ... 1] = { tty: 0, outp_head: 0, outp_tail: 0, outp_lock: SPIN_LOCK_UNLOCKED, outp_count: 0, open: 0, flags: 0, last_cflags: 0, }}; /* * Inline functions local to this module */ /* * Mask out the passed interrupt lines at the duart level. This should be * called while holding the associated outp_lock. */ static inline void duart_mask_ints(unsigned int line, unsigned int mask) { u64 tmp; tmp = in64(IO_SPACE_BASE | A_DUART_IMRREG(line)); tmp &= ~mask; out64(tmp, IO_SPACE_BASE | A_DUART_IMRREG(line)); } /* Unmask the passed interrupt lines at the duart level */ static inline void duart_unmask_ints(unsigned int line, unsigned int mask) { u64 tmp; tmp = in64(IO_SPACE_BASE | A_DUART_IMRREG(line)); tmp |= mask; out64(tmp, IO_SPACE_BASE | A_DUART_IMRREG(line)); } static inline unsigned long get_status_reg(unsigned int line) { return in64(IO_SPACE_BASE | A_DUART_CHANREG(line, R_DUART_STATUS)); } /* Derive which uart a call is for from the passed tty line. */ static inline unsigned int get_line(struct tty_struct *tty) { unsigned int line = MINOR(tty->device)-SB1250_DUART_MINOR; if (line > 1) { panic("Invalid line\n"); } return line; } #define MIN(a, b) (((a)<(b))?(a):(b)) /* * Generic interrupt handler for both channels. dev_id is a pointer * to the proper uart_states structure, so from that we can derive * which port interrupted */ static void duart_int(int irq, void *dev_id, struct pt_regs *regs) { unsigned int line; uart_state_t *us = (uart_state_t *)dev_id; line = us-uart_states; #ifdef DUART_SPEW // setleds("INT!"); printk("DUART INT\n"); #endif /* We could query the ISR to figure out why we are here, but since we are here, we may as well just take care of both rx and tx */ spin_lock(&us->outp_lock); if (get_status_reg(line) & M_DUART_RX_RDY) { do { unsigned int status = get_status_reg(line); unsigned int ch = in64(IO_SPACE_BASE | A_DUART_CHANREG(line, R_DUART_RX_HOLD)); unsigned int flag = 0; if (status & 0x10) { tty_insert_flip_char(us->tty, 0, TTY_OVERRUN); } if (status & 0x20) { printk("Parity error!\n"); flag = TTY_PARITY; } else if (status & 0x40) { printk("Frame error!\n"); flag = TTY_FRAME; } tty_insert_flip_char(us->tty, ch, flag); } while (get_status_reg(line) & M_DUART_RX_RDY); tty_flip_buffer_push(us->tty); } if ((get_status_reg(line) & M_DUART_TX_RDY) && us->outp_count) { do { out64(us->outp_buf[us->outp_head], IO_SPACE_BASE | A_DUART_CHANREG(line, R_DUART_TX_HOLD)); us->outp_head = (us->outp_head + 1) & (CONFIG_SB1250_DUART_OUTPUT_BUF_SIZE-1); us->outp_count--; } while ((get_status_reg(line) & M_DUART_TX_RDY) && us->outp_count); if ((us->flags & SD_WRITE_WAKE) && (us->outp_count < (CONFIG_SB1250_DUART_OUTPUT_BUF_SIZE/2))) { /* We told the discipline at one point that we had no space, so it went to sleep. Wake it up when we hit half empty */ wake_up_interruptible(&us->tty->write_wait); } if (!us->outp_count) { duart_mask_ints(line, M_DUART_IMR_TX); } } spin_unlock(&us->outp_lock); } /* * Actual driver functions */ /* Return the number of characters we can accomodate in a write at this instant */ static int duart_write_room(struct tty_struct *tty) { unsigned long flags; int retval; uart_state_t *us = &uart_states[get_line(tty)]; spin_lock_irqsave(&us->outp_lock, flags); retval = CONFIG_SB1250_DUART_OUTPUT_BUF_SIZE - uart_states[get_line(tty)].outp_count; if (!retval) { us->flags |= SD_WRITE_WAKE; } spin_unlock_irqrestore(&us->outp_lock, flags); #ifdef DUART_SPEW printk("duart_write_room called, returning %i\n", retval); #endif return retval; } /* memcpy the data from src to destination, but take extra care if the data is coming from user space */ static inline int copy_buf(char *dest, const char *src, int size, int from_user) { if (from_user) { (void) copy_from_user(dest, src, size); } else { memcpy(dest, src, size); } return size; } /* Buffer up to count characters from buf to be written. If we don't have other characters buffered, enable the tx interrupt to start sending */ static int duart_write(struct tty_struct * tty, int from_user, const unsigned char *buf, int count) { uart_state_t *us; unsigned long flags; unsigned int line; int chars_written = 0; if (from_user && verify_area(VERIFY_READ, buf, count)) { return -EINVAL; } #ifdef DUART_SPEW printk("duart_write called for %i chars by %i (%s)\n", count, current->pid, current->comm); #endif line = get_line(tty); us = &uart_states[line]; spin_lock_irqsave(&us->outp_lock, flags); if (!count || (us->outp_count == CONFIG_SB1250_DUART_OUTPUT_BUF_SIZE)) { spin_unlock_irqrestore(&us->outp_lock, flags); return 0; } if (us->outp_tail < us->outp_head) { /* Straightforward case; copy from tail to head */ chars_written += copy_buf(us->outp_buf + us->outp_tail, buf, MIN(count, us->outp_head - us->outp_tail), from_user); } else { /* Copy from tail to end of buffer, wrap around and then copy to head */ chars_written += copy_buf(us->outp_buf + us->outp_tail, buf, MIN(CONFIG_SB1250_DUART_OUTPUT_BUF_SIZE - us->outp_tail, count), from_user); if (chars_written < count) { chars_written += copy_buf(us->outp_buf, buf + chars_written, MIN(us->outp_head, count - chars_written), from_user); } } us->outp_tail = (us->outp_tail + chars_written) &(CONFIG_SB1250_DUART_OUTPUT_BUF_SIZE-1); if (!(us->outp_count || us->outp_stopped)) { duart_unmask_ints(line, M_DUART_IMR_TX); } us->outp_count += chars_written; spin_unlock_irqrestore(&us->outp_lock, flags); return chars_written; } /* Buffer one character to be written. If there's not room for it, just drop it on the floor. This is used for echo, among other things */ static void duart_put_char(struct tty_struct *tty, u_char ch) { unsigned long flags; unsigned int line = get_line(tty); uart_state_t *us = &uart_states[line]; #ifdef DUART_SPEW printk("duart_put_char called. Char is %x (%c)\n", (int)ch, ch); #endif spin_lock_irqsave(&us->outp_lock, flags); if (us->outp_count != CONFIG_SB1250_DUART_OUTPUT_BUF_SIZE) { us->outp_buf[us->outp_tail] = ch; us->outp_tail = (us->outp_tail + 1) &(CONFIG_SB1250_DUART_OUTPUT_BUF_SIZE-1); if (!(us->outp_count || us->outp_stopped)) { duart_unmask_ints(line, M_DUART_IMR_TX); } us->outp_count++; } spin_unlock_irqrestore(&us->outp_lock, flags); } /* Return the number of characters in the output buffer that have yet to be written */ static int duart_chars_in_buffer(struct tty_struct *tty) { int retval; unsigned long flags; uart_state_t *us = &uart_states[get_line(tty)]; spin_lock_irqsave(&us->outp_lock, flags); retval = us->outp_count; if (retval) { us->flags |= SD_WRITE_WAKE; } spin_unlock_irqrestore(&us->outp_lock, flags); #ifdef DUART_SPEW printk("duart_chars_in_buffer returning %i\n", retval); #endif return retval; } /* Kill everything we haven't yet shoved into the FIFO. Turn off the transmit interrupt since we've nothing more to transmit */ static void duart_flush_buffer(struct tty_struct *tty) { unsigned long flags; unsigned int line = get_line(tty); uart_state_t *us = &uart_states[get_line(tty)]; #ifdef DUART_SPEW printk("duart_flush_buffer called\n"); #endif duart_mask_ints(line, M_DUART_IMR_TX); spin_lock_irqsave(&us->outp_lock, flags); us->outp_head = us->outp_tail = us->outp_count = 0; spin_unlock_irqrestore(&us->outp_lock, flags); if (us->flags & SD_WRITE_WAKE) { wake_up_interruptible(&us->tty->write_wait); } } /* See sb1250 user manual for details on these registers */ static inline void duart_set_cflag(unsigned int line, unsigned int cflag) { unsigned int mode_reg1 = 0, mode_reg2 = 0; unsigned int clk_divisor; switch (cflag & CSIZE) { case CS7: mode_reg1 |= V_DUART_BITS_PER_CHAR_7; default: /* We don't handle CS5 or CS6...is there a way we're supposed to flag this? right now we just force them to CS8 */ mode_reg1 |= 0x0; break; } if (cflag & CSTOPB) { mode_reg2 |= M_DUART_STOP_BIT_LEN_2; /* XXX was: 0x4; */ } if (!(cflag & PARENB)) { mode_reg1 |= V_DUART_PARITY_MODE_NONE; /* XXX was: 0x8; */ } if (cflag & PARODD) { mode_reg1 |= M_DUART_PARITY_TYPE_ODD; } /* Formula for this is (5000000/baud)-1, but we saturate at 12 bits, which means we can't actually do anything less that 1200 baud */ switch (cflag & CBAUD) { case B200: case B300: case B1200: clk_divisor = 4095; break; case B1800: clk_divisor = 2776; break; case B2400: clk_divisor = 2082; break; case B4800: clk_divisor = 1040; break; default: case B9600: clk_divisor = 519; break; case B19200: clk_divisor = 259; break; case B38400: clk_divisor = 129; break; case B57600: clk_divisor = 85; break; case B115200: clk_divisor = 42; break; } out64(mode_reg1, IO_SPACE_BASE | A_DUART_CHANREG(line, R_DUART_MODE_REG_1)); out64(mode_reg2, IO_SPACE_BASE | A_DUART_CHANREG(line, R_DUART_MODE_REG_2)); out64(clk_divisor, IO_SPACE_BASE | A_DUART_CHANREG(line, R_DUART_CLK_SEL)); uart_states[line].last_cflags = cflag; } /* Handle notification of a termios change. */ static void duart_set_termios(struct tty_struct *tty, struct termios *old) { #ifdef DUART_SPEW printk("duart_set_termios called by %i (%s)\n", current->pid, current->comm); #endif if (old && tty->termios->c_cflag == old->c_cflag) return; duart_set_cflag(get_line(tty), tty->termios->c_cflag); } /* Stop pushing stuff into the fifo, now. Do the mask under the outp_lock to avoid races involving turning the interrupt line on/off */ static void duart_stop(struct tty_struct *tty) { unsigned long flags; unsigned int line = get_line(tty); uart_state_t *us = &uart_states[line]; #ifdef DUART_SPEW printk("duart_stop called\n"); #endif spin_lock_irqsave(&us->outp_lock, flags); duart_mask_ints(get_line(tty), M_DUART_IMR_TX); us->outp_stopped = 1; spin_unlock_irqrestore(&us->outp_lock, flags); } static int duart_ioctl(struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg) { /* if (serial_paranoia_check(info, tty->device, "rs_ioctl")) return -ENODEV;*/ switch (cmd) { case TIOCMGET: printk("Ignoring TIOCMGET\n"); break; case TIOCMBIS: printk("Ignoring TIOCMBIS\n"); break; case TIOCMBIC: printk("Ignoring TIOCMBIC\n"); break; case TIOCMSET: printk("Ignoring TIOCMSET\n"); break; case TIOCGSERIAL: printk("Ignoring TIOCGSERIAL\n"); break; case TIOCSSERIAL: printk("Ignoring TIOCSSERIAL\n"); break; case TIOCSERCONFIG: printk("Ignoring TIOCSERCONFIG\n"); break; case TIOCSERGETLSR: /* Get line status register */ printk("Ignoring TIOCSERGETLSR\n"); break; case TIOCSERGSTRUCT: printk("Ignoring TIOCSERGSTRUCT\n"); break; case TIOCMIWAIT: printk("Ignoring TIOCMIWAIT\n"); break; case TIOCGICOUNT: printk("Ignoring TIOCGICOUNT\n"); break; case TIOCSERGWILD: printk("Ignoring TIOCSERGWILD\n"); break; case TIOCSERSWILD: printk("Ignoring TIOCSERSWILD\n"); break; default: break; } // printk("Ignoring IOCTL %x from pid %i (%s)\n", cmd, current->pid, current->comm); return -ENOIOCTLCMD; #if 0 if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) && (cmd != TIOCSERCONFIG) && (cmd != TIOCSERGSTRUCT) && (cmd != TIOCMIWAIT) && (cmd != TIOCGICOUNT)) { if (tty->flags & (1 << TTY_IO_ERROR)) return -EIO; } switch (cmd) { case TIOCMGET: case TIOCMBIS: case TIOCMBIC: case TIOCMSET: case TIOCGSERIAL: case TIOCSSERIAL: case TIOCSERCONFIG: case TIOCSERGETLSR: /* Get line status register */ case TIOCSERGSTRUCT: case TIOCMIWAIT: case TIOCGICOUNT: case TIOCSERGWILD: case TIOCSERSWILD: /* XXX Implement me! */ printk("IOCTL needs implementing: %x\n", cmd); default: printk("Unknown ioctl: %x\n", cmd); } #endif return 0; } /* Stop pushing stuff into the fifo, now. Do the mask under the outp_lock to avoid races involving turning the interrupt line on/off */ static void duart_start(struct tty_struct *tty) { unsigned long flags; unsigned int line = get_line(tty); uart_state_t *us = &uart_states[line]; #ifdef DUART_SPEW printk("duart_start called\n"); #endif spin_lock_irqsave(&us->outp_lock, flags); if (us->outp_count) { duart_unmask_ints(get_line(tty), M_DUART_IMR_TX); } us->outp_stopped = 0; spin_unlock_irqrestore(&us->outp_lock, flags); } /* Not sure on the semantics of this; are we supposed to wait until the stuff already in the hardware FIFO drains, or are we supposed to wait until we've drained the output buffer, too? I'm assuming the former, 'cause thats what the other drivers seem to assume */ static void duart_wait_until_sent(struct tty_struct *tty, int timeout) { unsigned long target_time; unsigned int line; uart_state_t *us; #ifdef DUART_SPEW printk("duart_wait_until_sent(%d)+\n", timeout); #endif target_time = jiffies + timeout; line = get_line(tty); us = &uart_states[line]; while (!(get_status_reg(line) & M_DUART_TX_EMT) && (jiffies < target_time)) { schedule_timeout(1); } #ifdef DUART_SPEW printk("duart_wait_until_sent()-\n"); #endif } /* Open a tty line. Note that this can be called multiple times, so ->open can be >1. Only set up the tty struct if this is a "new" open, e.g. ->open was zero */ static int duart_open(struct tty_struct *tty, struct file *filp) { unsigned long flags; unsigned int line; uart_state_t *us; MOD_INC_USE_COUNT; #ifndef CONFIG_SIBYTE_SB1250_DUART_NO_PORT_1 if ((MINOR(tty->device)-SB1250_DUART_MINOR) > 1) { #else if ((MINOR(tty->device)-SB1250_DUART_MINOR) > 0) { #endif MOD_DEC_USE_COUNT; return -ENODEV; } #ifdef DUART_SPEW printk("duart_open called by %i (%s), tty is %p, rw is %p, ww is %p\n", current->pid, current->comm, tty, tty->read_wait, tty->write_wait); #endif line = get_line(tty); tty->driver_data = NULL; us = &uart_states[line]; spin_lock_irqsave(&open_lock, flags); if (!us->open) { us->tty = tty; us->tty->termios->c_cflag = us->last_cflags; } us->open++; #ifdef FORCED_INPUT if (!line && (us->open == 1)) { next_inp = inp_cmds; init_timer(&inp_timer); inp_timer.expires = jiffies + 20; inp_timer.data = 0; inp_timer.function = stuff_char; stuff_char_tty = tty; add_timer(&inp_timer); } #endif duart_unmask_ints(line, M_DUART_IMR_RX); spin_unlock_irqrestore(&open_lock, flags); return 0; } /* * Close a reference count out. If reference count hits zero, null the * tty, kill the interrupts. The tty_io driver is responsible for making * sure we've cleared out our internal buffers before calling close() */ static void duart_close(struct tty_struct *tty, struct file *filp) { unsigned long flags; unsigned int line = get_line(tty); uart_state_t *us = &uart_states[line]; #ifdef DUART_SPEW printk("duart_close called by %i (%s)\n", current->pid, current->comm); #endif spin_lock_irqsave(&open_lock, flags); us->open--; #if 0 if (!us->open) { /* Flushing TX stuff here is conservative */ duart_mask_ints(line, M_DUART_IMR_IN | M_DUART_IMR_BRK | M_DUART_IMR_RX | M_DUART_IMR_TX); spin_lock(&us->outp_lock); us->outp_head = us->outp_tail = us->outp_count = us->outp_stopped = 0; us->tty = NULL; spin_unlock(&us->outp_lock); } #endif ref_count--; spin_unlock_irqrestore(&open_lock, flags); MOD_DEC_USE_COUNT; } /* Set up the driver and register it, register the 2 1250 UART interrupts. This is called from tty_init, or as a part of the module init */ int __init sb1250_duart_init(void) { sb1250_duart_driver.magic = TTY_DRIVER_MAGIC; sb1250_duart_driver.driver_name = "ttySB"; sb1250_duart_driver.name = SB1250_DUART_NAME; sb1250_duart_driver.major = SB1250_DUART_MAJOR; sb1250_duart_driver.minor_start = SB1250_DUART_MINOR; sb1250_duart_driver.num = 2; sb1250_duart_driver.type = TTY_DRIVER_TYPE_SERIAL; sb1250_duart_driver.subtype = SERIAL_TYPE_NORMAL; sb1250_duart_driver.init_termios = tty_std_termios; sb1250_duart_driver.flags = TTY_DRIVER_REAL_RAW; sb1250_duart_driver.refcount = &ref_count; sb1250_duart_driver.table = duart_table; sb1250_duart_driver.termios = duart_termios; sb1250_duart_driver.termios_locked = duart_termios_locked; sb1250_duart_driver.open = duart_open; sb1250_duart_driver.close = duart_close; sb1250_duart_driver.write = duart_write; sb1250_duart_driver.put_char = duart_put_char; sb1250_duart_driver.write_room = duart_write_room; sb1250_duart_driver.chars_in_buffer = duart_chars_in_buffer; sb1250_duart_driver.flush_buffer = duart_flush_buffer; sb1250_duart_driver.ioctl = duart_ioctl; sb1250_duart_driver.set_termios = duart_set_termios; sb1250_duart_driver.stop = duart_stop; sb1250_duart_driver.start = duart_start; sb1250_duart_driver.wait_until_sent = duart_wait_until_sent; sb1250_duart_callout_driver = sb1250_duart_driver; sb1250_duart_callout_driver.name = SB1250_DUART_AUXNAME; sb1250_duart_callout_driver.major = SB1250_DUART_AUXMAJOR; sb1250_duart_callout_driver.subtype = SERIAL_TYPE_CALLOUT; if (request_irq(K_INT_UART_0, duart_int, 0, "uart0", &uart_states[0])) { panic("Couldn't get uart0 interrupt line\n"); } #ifndef CONFIG_SIBYTE_SB1250_DUART_NO_PORT_1 if (request_irq(K_INT_UART_1, duart_int, 0, "uart1", &uart_states[1])) { panic("Couldn't get uart1 interrupt line\n"); } #endif /* Interrupts are now active, our ISR can be called. */ if (tty_register_driver(&sb1250_duart_driver)) { printk(KERN_ERR "Couldn't register sb1250 duart serial driver\n"); } if (tty_register_driver(&sb1250_duart_callout_driver)) { printk(KERN_ERR "Couldn't register sb1250 duart callout driver\n"); } duart_set_cflag(0, DEFAULT_CFLAGS); #ifndef CONFIG_SIBYTE_SB1250_DUART_NO_PORT_1 duart_set_cflag(1, DEFAULT_CFLAGS); #endif return 0; } /* Unload the driver. Unregister stuff, get ready to go away */ static void __exit sb1250_duart_fini(void) { unsigned long flags; int ret; save_flags(flags); cli(); ret = tty_unregister_driver(&sb1250_duart_callout_driver); if (ret) { printk(KERN_ERR "Unable to unregister sb1250 duart callout driver (%d)\n", ret); } ret = tty_unregister_driver(&sb1250_duart_driver); if (ret) { printk(KERN_ERR "Unable to unregister sb1250 duart serial driver (%d)\n", ret); } free_irq(K_INT_UART_0, &uart_states[0]); free_irq(K_INT_UART_1, &uart_states[1]); /* mask lines in the scd */ disable_irq(K_INT_UART_0); disable_irq(K_INT_UART_1); restore_flags(flags); } #ifdef MODULE module_init(sb1250_duart_init); module_exit(sb1250_duart_fini); MODULE_DESCRIPTION("SB1250 Duart serial driver"); MODULE_AUTHOR("Justin Carlson <ca...@si...>"); #endif /* * Serial console stuff. * Very basic, polling driver for doing serial console output. * FIXME; there is a race here; we can't be sure that * the tx is still empty without holding outp_lock for this line. * Worst that can happen for now, though, is dropped characters. */ static void ser_console_write(struct console *cons, const char *str, unsigned int count) { unsigned int i; unsigned long flags; spin_lock_irqsave(&uart_states[0].outp_lock, flags); for (i = 0; i < count; i++) { if (str[i] == '\n') { /* Expand LF -> CRLF */ while (!(get_status_reg(0) & M_DUART_TX_RDY)) { /* Spin, doing nothing. */ } out64('\r', IO_SPACE_BASE | A_DUART_CHANREG(0, R_DUART_TX_HOLD)); } while (!(get_status_reg(0) & M_DUART_TX_RDY)) { /* Spin, doing nothing. */ } out64(str[i], IO_SPACE_BASE | A_DUART_CHANREG(0, R_DUART_TX_HOLD)); } spin_unlock_irqrestore(&uart_states[0].outp_lock, flags); } static kdev_t ser_console_device(struct console *c) { return MKDEV(TTY_MAJOR, 64 + c->index); } static int ser_console_wait_key(struct console *cons) { panic("ser_console_wait_key called"); } static int ser_console_setup(struct console *cons, char *str) { /* Initialize the transmitter */ duart_set_cflag(0, DEFAULT_CFLAGS); return 0; } static struct console sb1250_ser_cons = { "ttyS", ser_console_write, /* write */ NULL, /* read */ ser_console_device, /* device */ ser_console_wait_key, /* wait_key */ NULL, /* unblank */ ser_console_setup, /* setup */ CON_PRINTBUFFER | CON_ENABLED, -1, 0, NULL }; void sb1250_serial_console_init(void) { register_console(&sb1250_ser_cons); /*JDCXXX - this should be called from console_setup...but isn't. Why? */ ser_console_setup(NULL, NULL); } Index: Config.in =================================================================== RCS file: /cvsroot/linux-mips/linux/drivers/char/Config.in,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- Config.in 2001/11/10 03:52:49 1.24 +++ Config.in 2001/11/20 17:51:14 1.25 @@ -65,6 +65,14 @@ if [ "$CONFIG_AU1000_UART" = "y" ]; then bool ' Enable Au1000 serial console' CONFIG_AU1000_SERIAL_CONSOLE fi + if [ "$CONFIG_SIBYTE_SB1250" = "y" ]; then + bool ' Support for sb1250 onchip DUART' CONFIG_SIBYTE_SB1250_DUART + if [ "$CONFIG_SIBYTE_SB1250_DUART" = "y" ]; then + bool ' Console on SB1250 DUART' CONFIG_SIBYTE_SB1250_DUART_CONSOLE + int ' Output buffers size (in bytes)' CONFIG_SB1250_DUART_OUTPUT_BUF_SIZE 1024 + bool ' Leave port 1 alone (for kgdb or audio)' CONFIG_SIBYTE_SB1250_DUART_NO_PORT_1 + fi + fi bool 'TXx927 SIO support' CONFIG_TXX927_SERIAL if [ "$CONFIG_TXX927_SERIAL" = "y" ]; then bool 'TXx927 SIO Console support' CONFIG_TXX927_SERIAL_CONSOLE Index: Makefile =================================================================== RCS file: /cvsroot/linux-mips/linux/drivers/char/Makefile,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- Makefile 2001/11/10 03:52:49 1.20 +++ Makefile 2001/11/20 17:51:14 1.21 @@ -152,6 +152,7 @@ obj-$(CONFIG_CYCLADES) += cyclades.o obj-$(CONFIG_STALLION) += stallion.o obj-$(CONFIG_ISTALLION) += istallion.o +obj-$(CONFIG_SIBYTE_SB1250_DUART) += sb1250_duart.o obj-$(CONFIG_COMPUTONE) += ip2.o ip2main.o obj-$(CONFIG_RISCOM8) += riscom8.o obj-$(CONFIG_ISI) += isicom.o |
From: James S. <jsi...@us...> - 2001-11-20 17:51:17
|
Update of /cvsroot/linux-mips/linux/arch/mips/configs In directory usw-pr-cvs1:/tmp/cvs-serv4591/arch/mips/configs Modified Files: defconfig-sb1250-swarm Log Message: SB1250 DUART driver. Index: defconfig-sb1250-swarm =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips/configs/defconfig-sb1250-swarm,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- defconfig-sb1250-swarm 2001/11/19 18:31:56 1.3 +++ defconfig-sb1250-swarm 2001/11/20 17:51:14 1.4 @@ -331,6 +331,10 @@ # CONFIG_SERIAL_TX3912 is not set # CONFIG_SERIAL_TX3912_CONSOLE is not set # CONFIG_AU1000_UART is not set +CONFIG_SIBYTE_SB1250_DUART=y +CONFIG_SIBYTE_SB1250_DUART_CONSOLE=y +CONFIG_SB1250_DUART_OUTPUT_BUF_SIZE=1024 +# CONFIG_SIBYTE_SB1250_DUART_NO_PORT_1 is not set # CONFIG_UNIX98_PTYS is not set # |
From: James S. <jsi...@us...> - 2001-11-20 17:41:52
|
Update of /cvsroot/linux-mips/linux/arch/mips/kernel In directory usw-pr-cvs1:/tmp/cvs-serv2019/mips/kernel Modified Files: setup.c Log Message: Set MIPS_CPU_MCHECK flag if machine check available. Index: setup.c =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips/kernel/setup.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -d -r1.29 -r1.30 --- setup.c 2001/11/19 18:31:01 1.29 +++ setup.c 2001/11/20 17:41:49 1.30 @@ -424,7 +424,8 @@ mips_cpu.isa_level = MIPS_CPU_ISA_M32; mips_cpu.options = MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4KTLB | MIPS_CPU_COUNTER | - MIPS_CPU_DIVEC | MIPS_CPU_WATCH; + MIPS_CPU_DIVEC | MIPS_CPU_WATCH | + MIPS_CPU_MCHECK; config1 = read_mips32_cp0_config1(); if (config1 & (1 << 3)) mips_cpu.options |= MIPS_CPU_WATCH; @@ -440,7 +441,8 @@ /* See comment above about querying options */ mips_cpu.options = MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4KTLB | MIPS_CPU_COUNTER | - MIPS_CPU_DIVEC | MIPS_CPU_WATCH; + MIPS_CPU_DIVEC | MIPS_CPU_WATCH | + MIPS_CPU_MCHECK; config1 = read_mips32_cp0_config1(); if (config1 & (1 << 3)) mips_cpu.options |= MIPS_CPU_WATCH; @@ -484,8 +486,9 @@ case PRID_IMP_SB1: mips_cpu.cputype = CPU_SB1; mips_cpu.isa_level = MIPS_CPU_ISA_M64; - mips_cpu.options = (MIPS_CPU_TLB | MIPS_CPU_4KEX | - MIPS_CPU_COUNTER | MIPS_CPU_DIVEC); + mips_cpu.options = MIPS_CPU_TLB | MIPS_CPU_4KEX | + MIPS_CPU_COUNTER | MIPS_CPU_DIVEC | + MIPS_CPU_MCHECK; #ifndef CONFIG_SB1_PASS_1_WORKAROUNDS /* FPU in pass1 is known to have issues. */ mips_cpu.options |= MIPS_CPU_FPU; |
From: James S. <jsi...@us...> - 2001-11-20 17:41:52
|
Update of /cvsroot/linux-mips/linux/arch/mips64/kernel In directory usw-pr-cvs1:/tmp/cvs-serv2019/mips64/kernel Modified Files: setup.c Log Message: Set MIPS_CPU_MCHECK flag if machine check available. Index: setup.c =================================================================== RCS file: /cvsroot/linux-mips/linux/arch/mips64/kernel/setup.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- setup.c 2001/11/19 17:37:04 1.5 +++ setup.c 2001/11/20 17:41:49 1.6 @@ -372,7 +372,8 @@ mips_cpu.isa_level = MIPS_CPU_ISA_M32; mips_cpu.options = MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4KTLB | MIPS_CPU_COUNTER | - MIPS_CPU_DIVEC | MIPS_CPU_WATCH; + MIPS_CPU_DIVEC | MIPS_CPU_WATCH | + MIPS_CPU_MCHECK; config1 = read_mips32_cp0_config1(); if (config1 & (1 << 3)) mips_cpu.options |= MIPS_CPU_WATCH; @@ -388,7 +389,8 @@ /* See comment above about querying options */ mips_cpu.options = MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4KTLB | MIPS_CPU_COUNTER | - MIPS_CPU_DIVEC | MIPS_CPU_WATCH; + MIPS_CPU_DIVEC | MIPS_CPU_WATCH | + MIPS_CPU_MCHECK; config1 = read_mips32_cp0_config1(); if (config1 & (1 << 3)) mips_cpu.options |= MIPS_CPU_WATCH; @@ -432,8 +434,9 @@ case PRID_IMP_SB1: mips_cpu.cputype = CPU_SB1; mips_cpu.isa_level = MIPS_CPU_ISA_M64; - mips_cpu.options = (MIPS_CPU_TLB | MIPS_CPU_4KEX | - MIPS_CPU_COUNTER | MIPS_CPU_DIVEC); + mips_cpu.options = MIPS_CPU_TLB | MIPS_CPU_4KEX | + MIPS_CPU_COUNTER | MIPS_CPU_DIVEC | + MIPS_CPU_MCHECK; #ifndef CONFIG_SB1_PASS_1_WORKAROUNDS /* FPU in pass1 is known to have issues. */ mips_cpu.options |= MIPS_CPU_FPU; |