Merge branch 'master'
This commit is contained in:
		
						commit
						a748422ee4
					
				
							
								
								
									
										6
									
								
								CREDITS
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								CREDITS
									
									
									
									
									
								
							| @ -3382,7 +3382,7 @@ S: Germany | ||||
| 
 | ||||
| N: Geert Uytterhoeven | ||||
| E: geert@linux-m68k.org | ||||
| W: http://home.tvd.be/cr26864/ | ||||
| W: http://users.telenet.be/geertu/ | ||||
| P: 1024/862678A6 C51D 361C 0BD1 4C90 B275  C553 6EEA 11BA 8626 78A6 | ||||
| D: m68k/Amiga and PPC/CHRP Longtrail coordinator | ||||
| D: Frame buffer device and XF68_FBDev maintainer | ||||
| @ -3392,8 +3392,8 @@ D: Amiga Buddha and Catweasel chipset IDE | ||||
| D: Atari Falcon chipset IDE | ||||
| D: Amiga Gayle chipset IDE | ||||
| D: mipsel NEC DDB Vrc-5074 | ||||
| S: Emiel Vlieberghlaan 2A/21 | ||||
| S: B-3010 Kessel-Lo | ||||
| S: Haterbeekstraat 55B | ||||
| S: B-3200 Aarschot | ||||
| S: Belgium | ||||
| 
 | ||||
| N: Chris Vance | ||||
|  | ||||
| @ -33,7 +33,9 @@ pci_alloc_consistent(struct pci_dev *dev, size_t size, | ||||
| 
 | ||||
| Consistent memory is memory for which a write by either the device or | ||||
| the processor can immediately be read by the processor or device | ||||
| without having to worry about caching effects. | ||||
| without having to worry about caching effects.  (You may however need | ||||
| to make sure to flush the processor's write buffers before telling | ||||
| devices to read that memory.) | ||||
| 
 | ||||
| This routine allocates a region of <size> bytes of consistent memory. | ||||
| it also returns a <dma_handle> which may be cast to an unsigned | ||||
| @ -304,12 +306,12 @@ dma address with dma_mapping_error(). A non zero return value means the mapping | ||||
| could not be created and the driver should take appropriate action (eg | ||||
| reduce current DMA mapping usage or delay and try again later). | ||||
| 
 | ||||
| int | ||||
| dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, | ||||
| 	   enum dma_data_direction direction) | ||||
| int | ||||
| pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, | ||||
| 	   int nents, int direction) | ||||
| 	int | ||||
| 	dma_map_sg(struct device *dev, struct scatterlist *sg, | ||||
| 		int nents, enum dma_data_direction direction) | ||||
| 	int | ||||
| 	pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, | ||||
| 		int nents, int direction) | ||||
| 
 | ||||
| Maps a scatter gather list from the block layer. | ||||
| 
 | ||||
| @ -327,12 +329,33 @@ critical that the driver do something, in the case of a block driver | ||||
| aborting the request or even oopsing is better than doing nothing and | ||||
| corrupting the filesystem. | ||||
| 
 | ||||
| void | ||||
| dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries, | ||||
| 	     enum dma_data_direction direction) | ||||
| void | ||||
| pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg, | ||||
| 	     int nents, int direction) | ||||
| With scatterlists, you use the resulting mapping like this: | ||||
| 
 | ||||
| 	int i, count = dma_map_sg(dev, sglist, nents, direction); | ||||
| 	struct scatterlist *sg; | ||||
| 
 | ||||
| 	for (i = 0, sg = sglist; i < count; i++, sg++) { | ||||
| 		hw_address[i] = sg_dma_address(sg); | ||||
| 		hw_len[i] = sg_dma_len(sg); | ||||
| 	} | ||||
| 
 | ||||
| where nents is the number of entries in the sglist. | ||||
| 
 | ||||
| The implementation is free to merge several consecutive sglist entries | ||||
| into one (e.g. with an IOMMU, or if several pages just happen to be | ||||
| physically contiguous) and returns the actual number of sg entries it | ||||
| mapped them to. On failure 0, is returned. | ||||
| 
 | ||||
| Then you should loop count times (note: this can be less than nents times) | ||||
| and use sg_dma_address() and sg_dma_len() macros where you previously | ||||
| accessed sg->address and sg->length as shown above. | ||||
| 
 | ||||
| 	void | ||||
| 	dma_unmap_sg(struct device *dev, struct scatterlist *sg, | ||||
| 		int nhwentries, enum dma_data_direction direction) | ||||
| 	void | ||||
| 	pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg, | ||||
| 		int nents, int direction) | ||||
| 
 | ||||
| unmap the previously mapped scatter/gather list.  All the parameters | ||||
| must be the same as those and passed in to the scatter/gather mapping | ||||
|  | ||||
| @ -58,11 +58,15 @@ translating each of those pages back to a kernel address using | ||||
| something like __va().  [ EDIT: Update this when we integrate | ||||
| Gerd Knorr's generic code which does this. ] | ||||
| 
 | ||||
| This rule also means that you may not use kernel image addresses | ||||
| (ie. items in the kernel's data/text/bss segment, or your driver's) | ||||
| nor may you use kernel stack addresses for DMA.  Both of these items | ||||
| might be mapped somewhere entirely different than the rest of physical | ||||
| memory. | ||||
| This rule also means that you may use neither kernel image addresses | ||||
| (items in data/text/bss segments), nor module image addresses, nor | ||||
| stack addresses for DMA.  These could all be mapped somewhere entirely | ||||
| different than the rest of physical memory.  Even if those classes of | ||||
| memory could physically work with DMA, you'd need to ensure the I/O | ||||
| buffers were cacheline-aligned.  Without that, you'd see cacheline | ||||
| sharing problems (data corruption) on CPUs with DMA-incoherent caches. | ||||
| (The CPU could write to one word, DMA would write to a different one | ||||
| in the same cache line, and one of them could be overwritten.) | ||||
| 
 | ||||
| Also, this means that you cannot take the return of a kmap() | ||||
| call and DMA to/from that.  This is similar to vmalloc(). | ||||
| @ -194,7 +198,7 @@ document for how to handle this case. | ||||
| Finally, if your device can only drive the low 24-bits of | ||||
| address during PCI bus mastering you might do something like: | ||||
| 
 | ||||
| 	if (pci_set_dma_mask(pdev, 0x00ffffff)) { | ||||
| 	if (pci_set_dma_mask(pdev, DMA_24BIT_MASK)) { | ||||
| 		printk(KERN_WARNING | ||||
| 		       "mydev: 24-bit DMA addressing not available.\n"); | ||||
| 		goto ignore_this_device; | ||||
| @ -212,7 +216,7 @@ functions (for example a sound card provides playback and record | ||||
| functions) and the various different functions have _different_ | ||||
| DMA addressing limitations, you may wish to probe each mask and | ||||
| only provide the functionality which the machine can handle.  It | ||||
| is important that the last call to pci_set_dma_mask() be for the  | ||||
| is important that the last call to pci_set_dma_mask() be for the | ||||
| most specific mask. | ||||
| 
 | ||||
| Here is pseudo-code showing how this might be done: | ||||
| @ -284,6 +288,11 @@ There are two types of DMA mappings: | ||||
| 
 | ||||
|              in order to get correct behavior on all platforms. | ||||
| 
 | ||||
| 	     Also, on some platforms your driver may need to flush CPU write | ||||
| 	     buffers in much the same way as it needs to flush write buffers | ||||
| 	     found in PCI bridges (such as by reading a register's value | ||||
| 	     after writing it). | ||||
| 
 | ||||
| - Streaming DMA mappings which are usually mapped for one DMA transfer, | ||||
|   unmapped right after it (unless you use pci_dma_sync_* below) and for which | ||||
|   hardware can optimize for sequential accesses. | ||||
| @ -303,6 +312,9 @@ There are two types of DMA mappings: | ||||
| 
 | ||||
| Neither type of DMA mapping has alignment restrictions that come | ||||
| from PCI, although some devices may have such restrictions. | ||||
| Also, systems with caches that aren't DMA-coherent will work better | ||||
| when the underlying buffers don't share cache lines with other data. | ||||
| 
 | ||||
| 
 | ||||
| 		 Using Consistent DMA mappings. | ||||
| 
 | ||||
|  | ||||
| @ -705,7 +705,7 @@ and other resources, etc. | ||||
| 
 | ||||
| 	<sect1><title>ata_scsi_error()</title> | ||||
| 	<para> | ||||
| 	ata_scsi_error() is the current hostt->eh_strategy_handler() | ||||
| 	ata_scsi_error() is the current transportt->eh_strategy_handler() | ||||
| 	for libata.  As discussed above, this will be entered in two | ||||
| 	cases - timeout and ATAPI error completion.  This function | ||||
| 	calls low level libata driver's eng_timeout() callback, the | ||||
|  | ||||
							
								
								
									
										22
									
								
								Documentation/block/switching-sched.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								Documentation/block/switching-sched.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | ||||
| As of the Linux 2.6.10 kernel, it is now possible to change the | ||||
| IO scheduler for a given block device on the fly (thus making it possible, | ||||
| for instance, to set the CFQ scheduler for the system default, but | ||||
| set a specific device to use the anticipatory or noop schedulers - which | ||||
| can improve that device's throughput). | ||||
| 
 | ||||
| To set a specific scheduler, simply do this: | ||||
| 
 | ||||
| echo SCHEDNAME > /sys/block/DEV/queue/scheduler | ||||
| 
 | ||||
| where SCHEDNAME is the name of a defined IO scheduler, and DEV is the | ||||
| device name (hda, hdb, sga, or whatever you happen to have). | ||||
| 
 | ||||
| The list of defined schedulers can be found by simply doing | ||||
| a "cat /sys/block/DEV/queue/scheduler" - the list of valid names | ||||
| will be displayed, with the currently selected scheduler in brackets: | ||||
| 
 | ||||
| # cat /sys/block/hda/queue/scheduler | ||||
| noop anticipatory deadline [cfq] | ||||
| # echo anticipatory > /sys/block/hda/queue/scheduler | ||||
| # cat /sys/block/hda/queue/scheduler | ||||
| noop [anticipatory] deadline cfq | ||||
| @ -53,4 +53,4 @@ the CPUFreq Mailing list: | ||||
| * http://lists.linux.org.uk/mailman/listinfo/cpufreq | ||||
| 
 | ||||
| Clock and voltage scaling for the SA-1100: | ||||
| * http://www.lart.tudelft.nl/projects/scaling | ||||
| * http://www.lartmaker.nl/projects/scaling | ||||
|  | ||||
| @ -25,8 +25,9 @@ Who:	Adrian Bunk <bunk@stusta.de> | ||||
| 
 | ||||
| --------------------------- | ||||
| 
 | ||||
| What:	drivers depending on OBSOLETE_OSS_DRIVER | ||||
| When:	January 2006 | ||||
| What:	drivers that were depending on OBSOLETE_OSS_DRIVER | ||||
|         (config options already removed) | ||||
| When:	before 2.6.19 | ||||
| Why:	OSS drivers with ALSA replacements | ||||
| Who:	Adrian Bunk <bunk@stusta.de> | ||||
| 
 | ||||
| @ -71,14 +72,6 @@ Who:	Mauro Carvalho Chehab <mchehab@brturbo.com.br> | ||||
| 
 | ||||
| --------------------------- | ||||
| 
 | ||||
| What:	remove EXPORT_SYMBOL(panic_timeout) | ||||
| When:	April 2006 | ||||
| Files:	kernel/panic.c | ||||
| Why:	No modular usage in the kernel. | ||||
| Who:	Adrian Bunk <bunk@stusta.de> | ||||
| 
 | ||||
| --------------------------- | ||||
| 
 | ||||
| What:	remove EXPORT_SYMBOL(insert_resource) | ||||
| When:	April 2006 | ||||
| Files:	kernel/resource.c | ||||
|  | ||||
| @ -694,7 +694,7 @@ struct file_operations | ||||
| ---------------------- | ||||
| 
 | ||||
| This describes how the VFS can manipulate an open file. As of kernel | ||||
| 2.6.13, the following members are defined: | ||||
| 2.6.17, the following members are defined: | ||||
| 
 | ||||
| struct file_operations { | ||||
| 	loff_t (*llseek) (struct file *, loff_t, int); | ||||
| @ -723,6 +723,10 @@ struct file_operations { | ||||
| 	int (*check_flags)(int); | ||||
| 	int (*dir_notify)(struct file *filp, unsigned long arg); | ||||
| 	int (*flock) (struct file *, int, struct file_lock *); | ||||
| 	ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, size_t, unsigned  | ||||
| int); | ||||
| 	ssize_t (*splice_read)(struct file *, struct pipe_inode_info *, size_t, unsigned   | ||||
| int); | ||||
| }; | ||||
| 
 | ||||
| Again, all methods are called without any locks being held, unless | ||||
| @ -790,6 +794,12 @@ otherwise noted. | ||||
| 
 | ||||
|   flock: called by the flock(2) system call | ||||
| 
 | ||||
|   splice_write: called by the VFS to splice data from a pipe to a file. This | ||||
| 		method is used by the splice(2) system call | ||||
| 
 | ||||
|   splice_read: called by the VFS to splice data from file to a pipe. This | ||||
| 	       method is used by the splice(2) system call | ||||
| 
 | ||||
| Note that the file operations are implemented by the specific | ||||
| filesystem in which the inode resides. When opening a device node | ||||
| (character or block special) most filesystems will call special | ||||
|  | ||||
| @ -12,18 +12,22 @@ meant as a replacement for the older, individual drivers: | ||||
|                       teletext adapters) | ||||
| 
 | ||||
| It currently supports the following devices: | ||||
|  * Philips adapter | ||||
|  * home brew teletext adapter | ||||
|  * Velleman K8000 adapter | ||||
|  * ELV adapter | ||||
|  * Analog Devices evaluation boards (ADM1025, ADM1030, ADM1031, ADM1032) | ||||
|  * Barco LPT->DVI (K5800236) adapter | ||||
|  * (type=0) Philips adapter | ||||
|  * (type=1) home brew teletext adapter | ||||
|  * (type=2) Velleman K8000 adapter | ||||
|  * (type=3) ELV adapter | ||||
|  * (type=4) Analog Devices ADM1032 evaluation board | ||||
|  * (type=5) Analog Devices evaluation boards: ADM1025, ADM1030, ADM1031 | ||||
|  * (type=6) Barco LPT->DVI (K5800236) adapter | ||||
| 
 | ||||
| These devices use different pinout configurations, so you have to tell | ||||
| the driver what you have, using the type module parameter. There is no | ||||
| way to autodetect the devices. Support for different pinout configurations | ||||
| can be easily added when needed. | ||||
| 
 | ||||
| Earlier kernels defaulted to type=0 (Philips).  But now, if the type | ||||
| parameter is missing, the driver will simply fail to initialize. | ||||
| 
 | ||||
| 
 | ||||
| Building your own adapter | ||||
| ------------------------- | ||||
|  | ||||
							
								
								
									
										286
									
								
								Documentation/isdn/README.gigaset
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										286
									
								
								Documentation/isdn/README.gigaset
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,286 @@ | ||||
| GigaSet 307x Device Driver | ||||
| ========================== | ||||
| 
 | ||||
| 1.   Requirements | ||||
|      ------------ | ||||
| 1.1. Hardware | ||||
|      -------- | ||||
|      This release supports the connection of the Gigaset 307x/417x family of | ||||
|      ISDN DECT bases via Gigaset M101 Data, Gigaset M105 Data or direct USB | ||||
|      connection. The following devices are reported to be compatible: | ||||
|      307x/417x: | ||||
|         Gigaset SX255isdn | ||||
|         Gigaset SX353isdn | ||||
|         Sinus 45 [AB] isdn (Deutsche Telekom) | ||||
|         Sinus 721X/XA | ||||
|         Vox Chicago 390 ISDN (KPN Telecom) | ||||
|      M101: | ||||
|         Sinus 45 Data 1 (Telekom) | ||||
|      M105: | ||||
|         Gigaset USB Adapter DECT | ||||
|         Sinus 45 Data 2 (Telekom) | ||||
|         Sinus 721 data | ||||
|         Chicago 390 USB (KPN) | ||||
|      See also http://www.erbze.info/sinus_gigaset.htm and | ||||
|               http://gigaset307x.sourceforge.net/ | ||||
| 
 | ||||
|      We had also reports from users of Gigaset M105 who could use the drivers | ||||
|      with SX 100 and CX 100 ISDN bases (only in unimodem mode, see section 2.4.) | ||||
|      If you have another device that works with our driver, please let us know. | ||||
|      For example, Gigaset SX205isdn/Sinus 721 X SE and Gigaset SX303isdn bases | ||||
|      are just versions without answering machine of models known to work, so | ||||
|      they should work just as well; but so far we are lacking positive reports | ||||
|      on these. | ||||
| 
 | ||||
|      Chances of getting an USB device to work are good if the output of | ||||
|         lsusb | ||||
|      at the command line contains one of the following: | ||||
|         ID 0681:0001 | ||||
|         ID 0681:0002 | ||||
|         ID 0681:0009 | ||||
|         ID 0681:0021 | ||||
|         ID 0681:0022 | ||||
| 
 | ||||
| 1.2. Software | ||||
|      -------- | ||||
|      The driver works with ISDN4linux and so can be used with any software | ||||
|      which is able to use ISDN4linux for ISDN connections (voice or data). | ||||
|      CAPI4Linux support is planned but not yet available. | ||||
| 
 | ||||
|      There are some user space tools available at | ||||
|      http://sourceforge.net/projects/gigaset307x/ | ||||
|      which provide access to additional device specific functions like SMS, | ||||
|      phonebook or call journal. | ||||
| 
 | ||||
| 
 | ||||
| 2.   How to use the driver | ||||
|      --------------------- | ||||
| 2.1. Modules | ||||
|      ------- | ||||
|      To get the device working, you have to load the proper kernel module. You | ||||
|      can do this using | ||||
|          modprobe modulename | ||||
|      where modulename is usb_gigaset (M105) or bas_gigaset (direct USB | ||||
|      connection to the base). | ||||
| 
 | ||||
| 2.2. Device nodes for user space programs | ||||
|      ------------------------------------ | ||||
|      The device can be accessed from user space (eg. by the user space tools | ||||
|      mentioned in 1.2.) through the device nodes: | ||||
| 
 | ||||
|      - /dev/ttyGU0 for M105 (USB data boxes) | ||||
|      - /dev/ttyGB0 for the base driver (direct USB connection) | ||||
| 
 | ||||
|      You can also select a "default device" which is used by the frontends when | ||||
|      no device node is given as parameter, by creating a symlink /dev/ttyG to | ||||
|      one of them, eg.: | ||||
| 
 | ||||
|         ln -s /dev/ttyGB0 /dev/ttyG | ||||
| 
 | ||||
| 2.3. ISDN4linux | ||||
|      ---------- | ||||
|      This is the "normal" mode of operation. After loading the module you can | ||||
|      set up the ISDN system just as you'd do with any ISDN card. | ||||
|      Your distribution should provide some configuration utility. | ||||
|      If not, you can use some HOWTOs like | ||||
|          http://www.linuxhaven.de/dlhp/HOWTO/DE-ISDN-HOWTO-5.html | ||||
|      If this doesn't work, because you have some recent device like SX100 where | ||||
|      debug output (see section 3.2.) shows something like this when dialing | ||||
|          CMD Received: ERROR | ||||
|          Available Params: 0 | ||||
|          Connection State: 0, Response: -1 | ||||
|          gigaset_process_response: resp_code -1 in ConState 0 ! | ||||
|          Timeout occurred | ||||
|      you might need to use unimodem mode: | ||||
| 
 | ||||
| 2.4. Unimodem mode | ||||
|      ------------- | ||||
|      This is needed for some devices [e.g. SX100] as they have problems with | ||||
|      the "normal" commands. | ||||
| 
 | ||||
|      If you have installed the command line tool gigacontr, you can enter | ||||
|      unimodem mode using | ||||
|          gigacontr --mode unimodem | ||||
|      You can switch back using | ||||
|          gigacontr --mode isdn | ||||
| 
 | ||||
|      You can also load the driver using e.g. | ||||
|          modprobe usb_gigaset startmode=0 | ||||
|      to prevent the driver from starting in "isdn4linux mode". | ||||
| 
 | ||||
|      In this mode the device works like a modem connected to a serial port | ||||
|      (the /dev/ttyGU0, ... mentioned above) which understands the commands | ||||
|          ATZ                 init, reset | ||||
|              => OK or ERROR | ||||
|          ATD | ||||
|          ATDT                dial | ||||
|              => OK, CONNECT, | ||||
|                 BUSY, | ||||
|                 NO DIAL TONE, | ||||
|                 NO CARRIER, | ||||
|                 NO ANSWER | ||||
|          <pause>+++<pause>   change to command mode when connected | ||||
|          ATH                 hangup | ||||
| 
 | ||||
|      You can use some configuration tool of your distribution to configure this | ||||
|      "modem" or configure pppd/wvdial manually. There are some example ppp | ||||
|      configuration files and chat scripts in the gigaset-VERSION/ppp directory. | ||||
|      Please note that the USB drivers are not able to change the state of the | ||||
|      control lines (the M105 driver can be configured to use some undocumented | ||||
|      control requests, if you really need the control lines, though). This means | ||||
|      you must use "Stupid Mode" if you are using wvdial or you should use the | ||||
|      nocrtscts option of pppd. | ||||
|      You must also assure that the ppp_async module is loaded with the parameter | ||||
|      flag_time=0. You can do this e.g. by adding a line like | ||||
| 
 | ||||
|         options ppp_async flag_time=0 | ||||
| 
 | ||||
|      to /etc/modprobe.conf. If your distribution has some local module | ||||
|      configuration file like /etc/modprobe.conf.local, | ||||
|      using that should be preferred. | ||||
| 
 | ||||
| 2.5. Call-ID (CID) mode | ||||
|      ------------------ | ||||
|      Call-IDs are numbers used to tag commands to, and responses from, the | ||||
|      Gigaset base in order to support the simultaneous handling of multiple | ||||
|      ISDN calls. Their use can be enabled ("CID mode") or disabled ("Unimodem | ||||
|      mode"). Without Call-IDs (in Unimodem mode), only a very limited set of | ||||
|      functions is available. It allows outgoing data connections only, but | ||||
|      does not signal incoming calls or other base events. | ||||
| 
 | ||||
|      DECT cordless data devices (M10x) permanently occupy the cordless | ||||
|      connection to the base while Call-IDs are activated. As the Gigaset | ||||
|      bases only support one DECT data connection at a time, this prevents | ||||
|      other DECT cordless data devices from accessing the base. | ||||
| 
 | ||||
|      During active operation, the driver switches to the necessary mode | ||||
|      automatically. However, for the reasons above, the mode chosen when | ||||
|      the device is not in use (idle) can be selected by the user. | ||||
|      - If you want to receive incoming calls, you can use the default | ||||
|        settings (CID mode). | ||||
|      - If you have several DECT data devices (M10x) which you want to use | ||||
|        in turn, select Unimodem mode by passing the parameter "cidmode=0" to | ||||
|        the driver ("modprobe usb_gigaset cidmode=0" or modprobe.conf). | ||||
| 
 | ||||
|      If you want both of these at once, you are out of luck. | ||||
| 
 | ||||
|      You can also use /sys/module/<name>/parameters/cidmode for changing | ||||
|      the CID mode setting (<name> is usb_gigaset or bas_gigaset). | ||||
| 
 | ||||
| 
 | ||||
| 3.   Troubleshooting | ||||
|      --------------- | ||||
| 3.1. Solutions to frequently reported problems | ||||
|      ----------------------------------------- | ||||
|      Problem: | ||||
|         You have a slow provider and isdn4linux gives up dialing too early. | ||||
|      Solution: | ||||
|         Load the isdn module using the dialtimeout option. You can do this e.g. | ||||
|         by adding a line like | ||||
| 
 | ||||
|            options isdn dialtimeout=15 | ||||
| 
 | ||||
|         to /etc/modprobe.conf. If your distribution has some local module | ||||
|         configuration file like /etc/modprobe.conf.local, | ||||
|         using that should be preferred. | ||||
| 
 | ||||
|      Problem: | ||||
|         Your isdn script aborts with a message about isdnlog. | ||||
|      Solution: | ||||
|         Try deactivating (or commenting out) isdnlog. This driver does not | ||||
|         support it. | ||||
| 
 | ||||
|      Problem: | ||||
|         You have two or more DECT data adapters (M101/M105) and only the | ||||
|         first one you turn on works. | ||||
|      Solution: | ||||
|         Select Unimodem mode for all DECT data adapters. (see section 2.4.) | ||||
| 
 | ||||
| 3.2. Telling the driver to provide more information | ||||
|      ---------------------------------------------- | ||||
|      Building the driver with the "Gigaset debugging" kernel configuration | ||||
|      option (CONFIG_GIGASET_DEBUG) gives it the ability to produce additional | ||||
|      information useful for debugging. | ||||
| 
 | ||||
|      You can control the amount of debugging information the driver produces by | ||||
|      writing an appropriate value to /sys/module/gigaset/parameters/debug, e.g. | ||||
|         echo 0 > /sys/module/gigaset/parameters/debug | ||||
|      switches off debugging output completely, | ||||
|         echo 0x10a020 > /sys/module/gigaset/parameters/debug | ||||
|      enables the standard set of debugging output messages. These values are | ||||
|      bit patterns where every bit controls a certain type of debugging output. | ||||
|      See the constants DEBUG_* in the source file gigaset.h for details. | ||||
| 
 | ||||
|      The initial value can be set using the debug parameter when loading the | ||||
|      module "gigaset", e.g. by adding a line | ||||
|         options gigaset debug=0 | ||||
|      to /etc/modprobe.conf, ... | ||||
| 
 | ||||
|      Generated debugging information can be found | ||||
|      - as output of the command | ||||
|          dmesg | ||||
|      - in system log files written by your syslog daemon, usually | ||||
|        in /var/log/, e.g. /var/log/messages. | ||||
| 
 | ||||
| 3.3. Reporting problems and bugs | ||||
|      --------------------------- | ||||
|      If you can't solve problems with the driver on your own, feel free to | ||||
|      use one of the forums, bug trackers, or mailing lists on | ||||
|          http://sourceforge.net/projects/gigaset307x | ||||
|      or write an electronic mail to the maintainers. | ||||
| 
 | ||||
|      Try to provide as much information as possible, such as | ||||
|      - distribution | ||||
|      - kernel version (uname -r) | ||||
|      - gcc version (gcc --version) | ||||
|      - hardware architecture (uname -m, ...) | ||||
|      - type and firmware version of your device (base and wireless module, | ||||
|        if any) | ||||
|      - output of "lsusb -v" (if using an USB device) | ||||
|      - error messages | ||||
|      - relevant system log messages (it would help if you activate debug | ||||
|        output as described in 3.2.) | ||||
| 
 | ||||
|      For help with general configuration problems not specific to our driver, | ||||
|      such as isdn4linux and network configuration issues, please refer to the | ||||
|      appropriate forums and newsgroups. | ||||
| 
 | ||||
| 3.4. Reporting problem solutions | ||||
|      --------------------------- | ||||
|      If you solved a problem with our drivers, wrote startup scripts for your | ||||
|      distribution, ... feel free to contact us (using one of the places | ||||
|      mentioned in 3.3.). We'd like to add scripts, hints, documentation | ||||
|      to the driver and/or the project web page. | ||||
| 
 | ||||
| 
 | ||||
| 4.   Links, other software | ||||
|      --------------------- | ||||
|      - Sourceforge project developing this driver and associated tools | ||||
|          http://sourceforge.net/projects/gigaset307x | ||||
|      - Yahoo! Group on the Siemens Gigaset family of devices | ||||
|          http://de.groups.yahoo.com/group/Siemens-Gigaset | ||||
|      - Siemens Gigaset/T-Sinus compatibility table | ||||
|          http://www.erbze.info/sinus_gigaset.htm | ||||
| 
 | ||||
| 
 | ||||
| 5.   Credits | ||||
|      ------- | ||||
|      Thanks to | ||||
| 
 | ||||
|      Karsten Keil | ||||
|         for his help with isdn4linux | ||||
|      Deti Fliegl | ||||
|         for his base driver code | ||||
|      Dennis Dietrich | ||||
|         for his kernel 2.6 patches | ||||
|      Andreas Rummel | ||||
|         for his work and logs to get unimodem mode working | ||||
|      Andreas Degert | ||||
|         for his logs and patches to get cx 100 working | ||||
|      Dietrich Feist | ||||
|         for his generous donation of one M105 and two M101 cordless adapters | ||||
|      Christoph Schweers | ||||
|         for his generous donation of a M34 device | ||||
| 
 | ||||
|      and all the other people who sent logs and other information. | ||||
| 
 | ||||
| @ -44,7 +44,7 @@ What is covered within this file is mainly information to authors | ||||
| of modules. The author of an external modules should supply | ||||
| a makefile that hides most of the complexity so one only has to type | ||||
| 'make' to build the module. A complete example will be present in | ||||
| chapter ¤. Creating a kbuild file for an external module". | ||||
| chapter 4, "Creating a kbuild file for an external module". | ||||
| 
 | ||||
| 
 | ||||
| === 2. How to build external modules | ||||
|  | ||||
| @ -919,11 +919,11 @@ int main(int argc, char **argv) | ||||
|     int settle_time = 60; | ||||
| 
 | ||||
|     /* Parse the simple command-line */ | ||||
|     if (ac == 2) | ||||
| 	disk = av[1]; | ||||
|     else if (ac == 4) { | ||||
| 	settle_time = atoi(av[2]); | ||||
| 	disk = av[3]; | ||||
|     if (argc == 2) | ||||
| 	disk = argv[1]; | ||||
|     else if (argc == 4) { | ||||
| 	settle_time = atoi(argv[2]); | ||||
| 	disk = argv[3]; | ||||
|     } else | ||||
| 	usage(); | ||||
| 
 | ||||
|  | ||||
| @ -610,6 +610,7 @@ loads.  Consider the following sequence of events: | ||||
| 
 | ||||
| 	CPU 1			CPU 2 | ||||
| 	=======================	======================= | ||||
| 		{ B = 7; X = 9; Y = 8; C = &Y } | ||||
| 	STORE A = 1 | ||||
| 	STORE B = 2 | ||||
| 	<write barrier> | ||||
| @ -651,7 +652,20 @@ In the above example, CPU 2 perceives that B is 7, despite the load of *C | ||||
| (which would be B) coming after the the LOAD of C. | ||||
| 
 | ||||
| If, however, a data dependency barrier were to be placed between the load of C | ||||
| and the load of *C (ie: B) on CPU 2, then the following will occur: | ||||
| and the load of *C (ie: B) on CPU 2: | ||||
| 
 | ||||
| 	CPU 1			CPU 2 | ||||
| 	=======================	======================= | ||||
| 		{ B = 7; X = 9; Y = 8; C = &Y } | ||||
| 	STORE A = 1 | ||||
| 	STORE B = 2 | ||||
| 	<write barrier> | ||||
| 	STORE C = &B		LOAD X | ||||
| 	STORE D = 4		LOAD C (gets &B) | ||||
| 				<data dependency barrier> | ||||
| 				LOAD *C (reads B) | ||||
| 
 | ||||
| then the following will occur: | ||||
| 
 | ||||
| 	+-------+       :      :                :       : | ||||
| 	|       |       +------+                +-------+ | ||||
| @ -829,8 +843,8 @@ There are some more advanced barrier functions: | ||||
|  (*) smp_mb__after_atomic_inc(); | ||||
| 
 | ||||
|      These are for use with atomic add, subtract, increment and decrement | ||||
|      functions, especially when used for reference counting.  These functions | ||||
|      do not imply memory barriers. | ||||
|      functions that don't return a value, especially when used for reference | ||||
|      counting.  These functions do not imply memory barriers. | ||||
| 
 | ||||
|      As an example, consider a piece of code that marks an object as being dead | ||||
|      and then decrements the object's reference count: | ||||
| @ -1263,15 +1277,17 @@ else. | ||||
| ATOMIC OPERATIONS | ||||
| ----------------- | ||||
| 
 | ||||
| Though they are technically interprocessor interaction considerations, atomic | ||||
| operations are noted specially as they do _not_ generally imply memory | ||||
| barriers.  The possible offenders include: | ||||
| Whilst they are technically interprocessor interaction considerations, atomic | ||||
| operations are noted specially as some of them imply full memory barriers and | ||||
| some don't, but they're very heavily relied on as a group throughout the | ||||
| kernel. | ||||
| 
 | ||||
| Any atomic operation that modifies some state in memory and returns information | ||||
| about the state (old or new) implies an SMP-conditional general memory barrier | ||||
| (smp_mb()) on each side of the actual operation.  These include: | ||||
| 
 | ||||
| 	xchg(); | ||||
| 	cmpxchg(); | ||||
| 	test_and_set_bit(); | ||||
| 	test_and_clear_bit(); | ||||
| 	test_and_change_bit(); | ||||
| 	atomic_cmpxchg(); | ||||
| 	atomic_inc_return(); | ||||
| 	atomic_dec_return(); | ||||
| @ -1282,21 +1298,31 @@ barriers.  The possible offenders include: | ||||
| 	atomic_sub_and_test(); | ||||
| 	atomic_add_negative(); | ||||
| 	atomic_add_unless(); | ||||
| 	test_and_set_bit(); | ||||
| 	test_and_clear_bit(); | ||||
| 	test_and_change_bit(); | ||||
| 
 | ||||
| These may be used for such things as implementing LOCK operations or controlling | ||||
| the lifetime of objects by decreasing their reference counts.  In such cases | ||||
| they need preceding memory barriers. | ||||
| These are used for such things as implementing LOCK-class and UNLOCK-class | ||||
| operations and adjusting reference counters towards object destruction, and as | ||||
| such the implicit memory barrier effects are necessary. | ||||
| 
 | ||||
| The following may also be possible offenders as they may be used as UNLOCK | ||||
| operations. | ||||
| 
 | ||||
| The following operation are potential problems as they do _not_ imply memory | ||||
| barriers, but might be used for implementing such things as UNLOCK-class | ||||
| operations: | ||||
| 
 | ||||
| 	atomic_set(); | ||||
| 	set_bit(); | ||||
| 	clear_bit(); | ||||
| 	change_bit(); | ||||
| 	atomic_set(); | ||||
| 
 | ||||
| With these the appropriate explicit memory barrier should be used if necessary | ||||
| (smp_mb__before_clear_bit() for instance). | ||||
| 
 | ||||
| 
 | ||||
| The following are a little tricky: | ||||
| The following also do _not_ imply memory barriers, and so may require explicit | ||||
| memory barriers under some circumstances (smp_mb__before_atomic_dec() for | ||||
| instance)): | ||||
| 
 | ||||
| 	atomic_add(); | ||||
| 	atomic_sub(); | ||||
| @ -1317,10 +1343,12 @@ specific order. | ||||
| 
 | ||||
| 
 | ||||
| Basically, each usage case has to be carefully considered as to whether memory | ||||
| barriers are needed or not.  The simplest rule is probably: if the atomic | ||||
| operation is protected by a lock, then it does not require a barrier unless | ||||
| there's another operation within the critical section with respect to which an | ||||
| ordering must be maintained. | ||||
| barriers are needed or not. | ||||
| 
 | ||||
| [!] Note that special memory barrier primitives are available for these | ||||
| situations because on some CPUs the atomic instructions used imply full memory | ||||
| barriers, and so barrier instructions are superfluous in conjunction with them, | ||||
| and in such cases the special barrier primitives will be no-ops. | ||||
| 
 | ||||
| See Documentation/atomic_ops.txt for more information. | ||||
| 
 | ||||
|  | ||||
| @ -138,19 +138,29 @@ Reading MTRRs from a C program using ioctl()'s: | ||||
| 
 | ||||
| */ | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/stat.h> | ||||
| #include <fcntl.h> | ||||
| #include <sys/ioctl.h> | ||||
| #include <errno.h> | ||||
| #define MTRR_NEED_STRINGS | ||||
| #include <asm/mtrr.h> | ||||
| 
 | ||||
| #define TRUE 1 | ||||
| #define FALSE 0 | ||||
| #define ERRSTRING strerror (errno) | ||||
| 
 | ||||
| static char *mtrr_strings[MTRR_NUM_TYPES] = | ||||
| { | ||||
|     "uncachable",               /* 0 */ | ||||
|     "write-combining",          /* 1 */ | ||||
|     "?",                        /* 2 */ | ||||
|     "?",                        /* 3 */ | ||||
|     "write-through",            /* 4 */ | ||||
|     "write-protect",            /* 5 */ | ||||
|     "write-back",               /* 6 */ | ||||
| }; | ||||
| 
 | ||||
| int main () | ||||
| { | ||||
| @ -232,13 +242,22 @@ Creating MTRRs from a C programme using ioctl()'s: | ||||
| #include <fcntl.h> | ||||
| #include <sys/ioctl.h> | ||||
| #include <errno.h> | ||||
| #define MTRR_NEED_STRINGS | ||||
| #include <asm/mtrr.h> | ||||
| 
 | ||||
| #define TRUE 1 | ||||
| #define FALSE 0 | ||||
| #define ERRSTRING strerror (errno) | ||||
| 
 | ||||
| static char *mtrr_strings[MTRR_NUM_TYPES] = | ||||
| { | ||||
|     "uncachable",               /* 0 */ | ||||
|     "write-combining",          /* 1 */ | ||||
|     "?",                        /* 2 */ | ||||
|     "?",                        /* 3 */ | ||||
|     "write-through",            /* 4 */ | ||||
|     "write-protect",            /* 5 */ | ||||
|     "write-back",               /* 6 */ | ||||
| }; | ||||
| 
 | ||||
| int main (int argc, char **argv) | ||||
| { | ||||
|  | ||||
							
								
								
									
										166
									
								
								Documentation/networking/xfrm_sync.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								Documentation/networking/xfrm_sync.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,166 @@ | ||||
| 
 | ||||
| The sync patches work is based on initial patches from | ||||
| Krisztian <hidden@balabit.hu> and others and additional patches | ||||
| from Jamal <hadi@cyberus.ca>. | ||||
| 
 | ||||
| The end goal for syncing is to be able to insert attributes + generate | ||||
| events so that the an SA can be safely moved from one machine to another | ||||
| for HA purposes. | ||||
| The idea is to synchronize the SA so that the takeover machine can do | ||||
| the processing of the SA as accurate as possible if it has access to it. | ||||
| 
 | ||||
| We already have the ability to generate SA add/del/upd events. | ||||
| These patches add ability to sync and have accurate lifetime byte (to | ||||
| ensure proper decay of SAs) and replay counters to avoid replay attacks | ||||
| with as minimal loss at failover time. | ||||
| This way a backup stays as closely uptodate as an active member. | ||||
| 
 | ||||
| Because the above items change for every packet the SA receives, | ||||
| it is possible for a lot of the events to be generated. | ||||
| For this reason, we also add a nagle-like algorithm to restrict | ||||
| the events. i.e we are going to set thresholds to say "let me | ||||
| know if the replay sequence threshold is reached or 10 secs have passed" | ||||
| These thresholds are set system-wide via sysctls or can be updated | ||||
| per SA. | ||||
| 
 | ||||
| The identified items that need to be synchronized are: | ||||
| - the lifetime byte counter | ||||
| note that: lifetime time limit is not important if you assume the failover | ||||
| machine is known ahead of time since the decay of the time countdown | ||||
| is not driven by packet arrival. | ||||
| - the replay sequence for both inbound and outbound | ||||
| 
 | ||||
| 1) Message Structure | ||||
| ---------------------- | ||||
| 
 | ||||
| nlmsghdr:aevent_id:optional-TLVs. | ||||
| 
 | ||||
| The netlink message types are: | ||||
| 
 | ||||
| XFRM_MSG_NEWAE and XFRM_MSG_GETAE. | ||||
| 
 | ||||
| A XFRM_MSG_GETAE does not have TLVs. | ||||
| A XFRM_MSG_NEWAE will have at least two TLVs (as is | ||||
| discussed further below). | ||||
| 
 | ||||
| aevent_id structure looks like: | ||||
| 
 | ||||
|    struct xfrm_aevent_id { | ||||
|              struct xfrm_usersa_id           sa_id; | ||||
|              __u32                           flags; | ||||
|    }; | ||||
| 
 | ||||
| xfrm_usersa_id in this message layout identifies the SA. | ||||
| 
 | ||||
| flags are used to indicate different things. The possible | ||||
| flags are: | ||||
|         XFRM_AE_RTHR=1, /* replay threshold*/ | ||||
|         XFRM_AE_RVAL=2, /* replay value */ | ||||
|         XFRM_AE_LVAL=4, /* lifetime value */ | ||||
|         XFRM_AE_ETHR=8, /* expiry timer threshold */ | ||||
|         XFRM_AE_CR=16, /* Event cause is replay update */ | ||||
|         XFRM_AE_CE=32, /* Event cause is timer expiry */ | ||||
|         XFRM_AE_CU=64, /* Event cause is policy update */ | ||||
| 
 | ||||
| How these flags are used is dependent on the direction of the | ||||
| message (kernel<->user) as well the cause (config, query or event). | ||||
| This is described below in the different messages. | ||||
| 
 | ||||
| The pid will be set appropriately in netlink to recognize direction | ||||
| (0 to the kernel and pid = processid that created the event | ||||
| when going from kernel to user space) | ||||
| 
 | ||||
| A program needs to subscribe to multicast group XFRMNLGRP_AEVENTS | ||||
| to get notified of these events. | ||||
| 
 | ||||
| 2) TLVS reflect the different parameters: | ||||
| ----------------------------------------- | ||||
| 
 | ||||
| a) byte value (XFRMA_LTIME_VAL) | ||||
| This TLV carries the running/current counter for byte lifetime since | ||||
| last event. | ||||
| 
 | ||||
| b)replay value (XFRMA_REPLAY_VAL) | ||||
| This TLV carries the running/current counter for replay sequence since | ||||
| last event. | ||||
| 
 | ||||
| c)replay threshold (XFRMA_REPLAY_THRESH) | ||||
| This TLV carries the threshold being used by the kernel to trigger events | ||||
| when the replay sequence is exceeded. | ||||
| 
 | ||||
| d) expiry timer (XFRMA_ETIMER_THRESH) | ||||
| This is a timer value in milliseconds which is used as the nagle | ||||
| value to rate limit the events. | ||||
| 
 | ||||
| 3) Default configurations for the parameters: | ||||
| ---------------------------------------------- | ||||
| 
 | ||||
| By default these events should be turned off unless there is | ||||
| at least one listener registered to listen to the multicast | ||||
| group XFRMNLGRP_AEVENTS. | ||||
| 
 | ||||
| Programs installing SAs will need to specify the two thresholds, however, | ||||
| in order to not change existing applications such as racoon | ||||
| we also provide default threshold values for these different parameters | ||||
| in case they are not specified. | ||||
| 
 | ||||
| the two sysctls/proc entries are: | ||||
| a) /proc/sys/net/core/sysctl_xfrm_aevent_etime | ||||
| used to provide default values for the XFRMA_ETIMER_THRESH in incremental | ||||
| units of time of 100ms. The default is 10 (1 second) | ||||
| 
 | ||||
| b) /proc/sys/net/core/sysctl_xfrm_aevent_rseqth | ||||
| used to provide default values for XFRMA_REPLAY_THRESH parameter | ||||
| in incremental packet count. The default is two packets. | ||||
| 
 | ||||
| 4) Message types | ||||
| ---------------- | ||||
| 
 | ||||
| a) XFRM_MSG_GETAE issued by user-->kernel. | ||||
| XFRM_MSG_GETAE does not carry any TLVs. | ||||
| The response is a XFRM_MSG_NEWAE which is formatted based on what | ||||
| XFRM_MSG_GETAE queried for. | ||||
| The response will always have XFRMA_LTIME_VAL and XFRMA_REPLAY_VAL TLVs. | ||||
| *if XFRM_AE_RTHR flag is set, then XFRMA_REPLAY_THRESH is also retrieved | ||||
| *if XFRM_AE_ETHR flag is set, then XFRMA_ETIMER_THRESH is also retrieved | ||||
| 
 | ||||
| b) XFRM_MSG_NEWAE is issued by either user space to configure | ||||
| or kernel to announce events or respond to a XFRM_MSG_GETAE. | ||||
| 
 | ||||
| i) user --> kernel to configure a specific SA. | ||||
| any of the values or threshold parameters can be updated by passing the | ||||
| appropriate TLV. | ||||
| A response is issued back to the sender in user space to indicate success | ||||
| or failure. | ||||
| In the case of success, additionally an event with | ||||
| XFRM_MSG_NEWAE is also issued to any listeners as described in iii). | ||||
| 
 | ||||
| ii) kernel->user direction as a response to XFRM_MSG_GETAE | ||||
| The response will always have XFRMA_LTIME_VAL and XFRMA_REPLAY_VAL TLVs. | ||||
| The threshold TLVs will be included if explicitly requested in | ||||
| the XFRM_MSG_GETAE message. | ||||
| 
 | ||||
| iii) kernel->user to report as event if someone sets any values or | ||||
| thresholds for an SA using XFRM_MSG_NEWAE (as described in #i above). | ||||
| In such a case XFRM_AE_CU flag is set to inform the user that | ||||
| the change happened as a result of an update. | ||||
| The message will always have XFRMA_LTIME_VAL and XFRMA_REPLAY_VAL TLVs. | ||||
| 
 | ||||
| iv) kernel->user to report event when replay threshold or a timeout | ||||
| is exceeded. | ||||
| In such a case either XFRM_AE_CR (replay exceeded) or XFRM_AE_CE (timeout | ||||
| happened) is set to inform the user what happened. | ||||
| Note the two flags are mutually exclusive. | ||||
| The message will always have XFRMA_LTIME_VAL and XFRMA_REPLAY_VAL TLVs. | ||||
| 
 | ||||
| Exceptions to threshold settings | ||||
| -------------------------------- | ||||
| 
 | ||||
| If you have an SA that is getting hit by traffic in bursts such that | ||||
| there is a period where the timer threshold expires with no packets | ||||
| seen, then an odd behavior is seen as follows: | ||||
| The first packet arrival after a timer expiry will trigger a timeout | ||||
| aevent; i.e we dont wait for a timeout period or a packet threshold | ||||
| to be reached. This is done for simplicity and efficiency reasons. | ||||
| 
 | ||||
| -JHS | ||||
| @ -19,9 +19,9 @@ TABLE OF CONTENTS | ||||
| 	[2-1-1] Overview | ||||
| 	[2-1-2] Flow of scmds through EH | ||||
| 	[2-1-3] Flow of control | ||||
|     [2-2] EH through hostt->eh_strategy_handler() | ||||
| 	[2-2-1] Pre hostt->eh_strategy_handler() SCSI midlayer conditions | ||||
| 	[2-2-2] Post hostt->eh_strategy_handler() SCSI midlayer conditions | ||||
|     [2-2] EH through transportt->eh_strategy_handler() | ||||
| 	[2-2-1] Pre transportt->eh_strategy_handler() SCSI midlayer conditions | ||||
| 	[2-2-2] Post transportt->eh_strategy_handler() SCSI midlayer conditions | ||||
| 	[2-2-3] Things to consider | ||||
| 
 | ||||
| 
 | ||||
| @ -413,9 +413,9 @@ scmd->allowed. | ||||
| 	    layer of failure of the scmds. | ||||
| 
 | ||||
| 
 | ||||
| [2-2] EH through hostt->eh_strategy_handler() | ||||
| [2-2] EH through transportt->eh_strategy_handler() | ||||
| 
 | ||||
|  hostt->eh_strategy_handler() is invoked in the place of | ||||
|  transportt->eh_strategy_handler() is invoked in the place of | ||||
| scsi_unjam_host() and it is responsible for whole recovery process. | ||||
| On completion, the handler should have made lower layers forget about | ||||
| all failed scmds and either ready for new commands or offline.  Also, | ||||
| @ -424,7 +424,7 @@ SCSI midlayer.  IOW, of the steps described in [2-1-2], all steps | ||||
| except for #1 must be implemented by eh_strategy_handler(). | ||||
| 
 | ||||
| 
 | ||||
| [2-2-1] Pre hostt->eh_strategy_handler() SCSI midlayer conditions | ||||
| [2-2-1] Pre transportt->eh_strategy_handler() SCSI midlayer conditions | ||||
| 
 | ||||
|  The following conditions are true on entry to the handler. | ||||
| 
 | ||||
| @ -437,7 +437,7 @@ except for #1 must be implemented by eh_strategy_handler(). | ||||
|  - shost->host_failed == shost->host_busy | ||||
| 
 | ||||
| 
 | ||||
| [2-2-2] Post hostt->eh_strategy_handler() SCSI midlayer conditions | ||||
| [2-2-2] Post transportt->eh_strategy_handler() SCSI midlayer conditions | ||||
| 
 | ||||
|  The following conditions must be true on exit from the handler. | ||||
| 
 | ||||
|  | ||||
| @ -804,7 +804,6 @@ Summary: | ||||
|    eh_bus_reset_handler - issue SCSI bus reset | ||||
|    eh_device_reset_handler - issue SCSI device reset | ||||
|    eh_host_reset_handler - reset host (host bus adapter) | ||||
|    eh_strategy_handler - driver supplied alternate to scsi_unjam_host() | ||||
|    info - supply information about given host | ||||
|    ioctl - driver can respond to ioctls | ||||
|    proc_info - supports /proc/scsi/{driver_name}/{host_no} | ||||
| @ -969,24 +968,6 @@ Details: | ||||
|      int eh_host_reset_handler(struct scsi_cmnd * scp) | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  *      eh_strategy_handler - driver supplied alternate to scsi_unjam_host() | ||||
|  *      @shp: host on which error has occurred | ||||
|  * | ||||
|  *      Returns TRUE if host unjammed, else FALSE. | ||||
|  * | ||||
|  *      Locks: none | ||||
|  * | ||||
|  *      Calling context: kernel thread | ||||
|  * | ||||
|  *      Notes: Invoked from scsi_eh thread. LLD supplied alternate to  | ||||
|  *      scsi_unjam_host() found in scsi_error.c | ||||
|  * | ||||
|  *      Optionally defined in: LLD | ||||
|  **/ | ||||
|      int eh_strategy_handler(struct Scsi_Host * shp) | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  *      info - supply information about given host: driver name plus data | ||||
|  *             to distinguish given host | ||||
|  | ||||
| @ -3,14 +3,11 @@ | ||||
| 			-------------------- | ||||
| 
 | ||||
| 
 | ||||
|    $Id: driver,v 1.10 2002/07/22 15:27:30 rmk Exp $ | ||||
| 
 | ||||
| 
 | ||||
| This document is meant as a brief overview of some aspects of the new serial | ||||
| driver.  It is not complete, any questions you have should be directed to | ||||
| <rmk@arm.linux.org.uk> | ||||
| 
 | ||||
| The reference implementation is contained within serial_amba.c. | ||||
| The reference implementation is contained within amba_pl011.c. | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| @ -31,6 +28,11 @@ The serial core provides a few helper functions.  This includes identifing | ||||
| the correct port structure (via uart_get_console) and decoding command line | ||||
| arguments (uart_parse_options). | ||||
| 
 | ||||
| There is also a helper function (uart_write_console) which performs a | ||||
| character by character write, translating newlines to CRLF sequences. | ||||
| Driver writers are recommended to use this function rather than implementing | ||||
| their own version. | ||||
| 
 | ||||
| 
 | ||||
| Locking | ||||
| ------- | ||||
| @ -86,6 +88,7 @@ hardware. | ||||
| 		- TIOCM_DTR	DTR signal. | ||||
| 		- TIOCM_OUT1	OUT1 signal. | ||||
| 		- TIOCM_OUT2	OUT2 signal. | ||||
| 		- TIOCM_LOOP	Set the port into loopback mode. | ||||
| 	If the appropriate bit is set, the signal should be driven | ||||
| 	active.  If the bit is clear, the signal should be driven | ||||
| 	inactive. | ||||
| @ -141,6 +144,10 @@ hardware. | ||||
|   enable_ms(port) | ||||
| 	Enable the modem status interrupts. | ||||
| 
 | ||||
| 	This method may be called multiple times.  Modem status | ||||
| 	interrupts should be disabled when the shutdown method is | ||||
| 	called. | ||||
| 
 | ||||
| 	Locking: port->lock taken. | ||||
| 	Interrupts: locally disabled. | ||||
| 	This call must not sleep | ||||
| @ -160,6 +167,8 @@ hardware. | ||||
| 	state.  Enable the port for reception.  It should not activate | ||||
| 	RTS nor DTR; this will be done via a separate call to set_mctrl. | ||||
| 
 | ||||
| 	This method will only be called when the port is initially opened. | ||||
| 
 | ||||
| 	Locking: port_sem taken. | ||||
| 	Interrupts: globally disabled. | ||||
| 
 | ||||
| @ -169,6 +178,11 @@ hardware. | ||||
| 	RTS nor DTR; this will have already been done via a separate | ||||
| 	call to set_mctrl. | ||||
| 
 | ||||
| 	Drivers must not access port->info once this call has completed. | ||||
| 
 | ||||
| 	This method will only be called when there are no more users of | ||||
| 	this port. | ||||
| 
 | ||||
| 	Locking: port_sem taken. | ||||
| 	Interrupts: caller dependent. | ||||
| 
 | ||||
|  | ||||
| @ -1123,8 +1123,8 @@ | ||||
|           if ((err = pci_enable_device(pci)) < 0) | ||||
|                   return err; | ||||
|           /* check PCI availability (28bit DMA) */ | ||||
|           if (pci_set_dma_mask(pci, 0x0fffffff) < 0 || | ||||
|               pci_set_consistent_dma_mask(pci, 0x0fffffff) < 0) { | ||||
|           if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 || | ||||
|               pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) { | ||||
|                   printk(KERN_ERR "error to set 28bit mask DMA\n"); | ||||
|                   pci_disable_device(pci); | ||||
|                   return -ENXIO; | ||||
| @ -1216,7 +1216,7 @@ | ||||
|         The allocation of PCI resources is done in the | ||||
|       <function>probe()</function> function, and usually an extra | ||||
|       <function>xxx_create()</function> function is written for this | ||||
|       purpose.  | ||||
|       purpose. | ||||
|       </para> | ||||
| 
 | ||||
|       <para> | ||||
| @ -1225,7 +1225,7 @@ | ||||
|       allocating resources. Also, you need to set the proper PCI DMA | ||||
|       mask to limit the accessed i/o range. In some cases, you might | ||||
|       need to call <function>pci_set_master()</function> function, | ||||
|       too.  | ||||
|       too. | ||||
|       </para> | ||||
| 
 | ||||
|       <para> | ||||
| @ -1236,8 +1236,8 @@ | ||||
| <![CDATA[ | ||||
|   if ((err = pci_enable_device(pci)) < 0) | ||||
|           return err; | ||||
|   if (pci_set_dma_mask(pci, 0x0fffffff) < 0 || | ||||
|       pci_set_consistent_dma_mask(pci, 0x0fffffff) < 0) { | ||||
|   if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 || | ||||
|       pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) { | ||||
|           printk(KERN_ERR "error to set 28bit mask DMA\n"); | ||||
|           pci_disable_device(pci); | ||||
|           return -ENXIO; | ||||
| @ -1256,13 +1256,13 @@ | ||||
|       functions. Unlike ALSA ver.0.5.x., there are no helpers for | ||||
|       that. And these resources must be released in the destructor | ||||
|       function (see below). Also, on ALSA 0.9.x, you don't need to | ||||
|       allocate (pseudo-)DMA for PCI like ALSA 0.5.x.  | ||||
|       allocate (pseudo-)DMA for PCI like ALSA 0.5.x. | ||||
|       </para> | ||||
| 
 | ||||
|       <para> | ||||
|         Now assume that this PCI device has an I/O port with 8 bytes | ||||
|         and an interrupt. Then struct <structname>mychip</structname> will have the | ||||
|         following fields:  | ||||
|         following fields: | ||||
| 
 | ||||
|         <informalexample> | ||||
|           <programlisting> | ||||
|  | ||||
| @ -27,12 +27,21 @@ number of free hugetlb pages at any time.  It also displays information about | ||||
| the configured hugepage size - this is needed for generating the proper | ||||
| alignment and size of the arguments to the above system calls. | ||||
| 
 | ||||
| The output of "cat /proc/meminfo" will have output like: | ||||
| The output of "cat /proc/meminfo" will have lines like: | ||||
| 
 | ||||
| ..... | ||||
| HugePages_Total: xxx | ||||
| HugePages_Free:  yyy | ||||
| Hugepagesize:    zzz KB | ||||
| HugePages_Rsvd:  www | ||||
| Hugepagesize:    zzz kB | ||||
| 
 | ||||
| where: | ||||
| HugePages_Total is the size of the pool of hugepages. | ||||
| HugePages_Free is the number of hugepages in the pool that are not yet | ||||
| allocated. | ||||
| HugePages_Rsvd is short for "reserved," and is the number of hugepages | ||||
| for which a commitment to allocate from the pool has been made, but no | ||||
| allocation has yet been made. It's vaguely analogous to overcommit. | ||||
| 
 | ||||
| /proc/filesystems should also show a filesystem of type "hugetlbfs" configured | ||||
| in the kernel. | ||||
| @ -42,11 +51,11 @@ pages in the kernel.  Super user can dynamically request more (or free some | ||||
| pre-configured) hugepages. | ||||
| The allocation (or deallocation) of hugetlb pages is possible only if there are | ||||
| enough physically contiguous free pages in system (freeing of hugepages is | ||||
| possible only if there are enough hugetlb pages free that can be transfered | ||||
| possible only if there are enough hugetlb pages free that can be transferred | ||||
| back to regular memory pool). | ||||
| 
 | ||||
| Pages that are used as hugetlb pages are reserved inside the kernel and can | ||||
| not be used for other purposes. | ||||
| Pages that are used as hugetlb pages are reserved inside the kernel and cannot | ||||
| be used for other purposes. | ||||
| 
 | ||||
| Once the kernel with Hugetlb page support is built and running, a user can | ||||
| use either the mmap system call or shared memory system calls to start using | ||||
| @ -60,7 +69,7 @@ Use the following command to dynamically allocate/deallocate hugepages: | ||||
| This command will try to configure 20 hugepages in the system.  The success | ||||
| or failure of allocation depends on the amount of physically contiguous | ||||
| memory that is preset in system at this time.  System administrators may want | ||||
| to put this command in one of the local rc init file.  This will enable the | ||||
| to put this command in one of the local rc init files.  This will enable the | ||||
| kernel to request huge pages early in the boot process (when the possibility | ||||
| of getting physical contiguous pages is still very high). | ||||
| 
 | ||||
| @ -78,8 +87,8 @@ the uid and gid of the current process are taken.  The mode option sets the | ||||
| mode of root of file system to value & 0777.  This value is given in octal. | ||||
| By default the value 0755 is picked. The size option sets the maximum value of | ||||
| memory (huge pages) allowed for that filesystem (/mnt/huge). The size is | ||||
| rounded down to HPAGE_SIZE.  The option nr_inode sets the maximum number of | ||||
| inodes that /mnt/huge can use.  If the size or nr_inode options are not | ||||
| rounded down to HPAGE_SIZE.  The option nr_inodes sets the maximum number of | ||||
| inodes that /mnt/huge can use.  If the size or nr_inodes options are not | ||||
| provided on command line then no limits are set.  For size and nr_inodes | ||||
| options, you can use [G|g]/[M|m]/[K|k] to represent giga/mega/kilo. For | ||||
| example, size=2K has the same meaning as size=2048. An example is given at | ||||
| @ -88,7 +97,7 @@ the end of this document. | ||||
| read and write system calls are not supported on files that reside on hugetlb | ||||
| file systems. | ||||
| 
 | ||||
| A regular chown, chgrp and chmod commands (with right permissions) could be | ||||
| Regular chown, chgrp, and chmod commands (with right permissions) could be | ||||
| used to change the file attributes on hugetlbfs. | ||||
| 
 | ||||
| Also, it is important to note that no such mount command is required if the | ||||
| @ -96,8 +105,8 @@ applications are going to use only shmat/shmget system calls.  Users who | ||||
| wish to use hugetlb page via shared memory segment should be a member of | ||||
| a supplementary group and system admin needs to configure that gid into | ||||
| /proc/sys/vm/hugetlb_shm_group.  It is possible for same or different | ||||
| applications to use any combination of mmaps and shm* calls.  Though the | ||||
| mount of filesystem will be required for using mmaps. | ||||
| applications to use any combination of mmaps and shm* calls, though the | ||||
| mount of filesystem will be required for using mmap calls. | ||||
| 
 | ||||
| ******************************************************************* | ||||
| 
 | ||||
|  | ||||
| @ -151,6 +151,11 @@ NUMA | ||||
| 
 | ||||
|   numa=fake=X   Fake X nodes and ignore NUMA setup of the actual machine. | ||||
| 
 | ||||
|   numa=hotadd=percent | ||||
| 		Only allow hotadd memory to preallocate page structures upto | ||||
| 		percent of already available memory. | ||||
| 		numa=hotadd=0 will disable hotadd memory. | ||||
| 
 | ||||
| ACPI | ||||
| 
 | ||||
|   acpi=off	Don't enable ACPI | ||||
|  | ||||
							
								
								
									
										2
									
								
								Kbuild
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Kbuild
									
									
									
									
									
								
							| @ -18,7 +18,7 @@ define sed-y | ||||
| 	"/^->/{s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; s:->::; p;}" | ||||
| endef | ||||
| # Override default regexp for specific architectures | ||||
| sed-$(CONFIG_MIPS) := "/^@@@/s///p" | ||||
| sed-$(CONFIG_MIPS) := "/^@@@/{s/^@@@//; s/ \#.*\$$//; p;}" | ||||
| 
 | ||||
| quiet_cmd_offsets = GEN     $@ | ||||
| define cmd_offsets | ||||
|  | ||||
							
								
								
									
										19
									
								
								MAINTAINERS
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								MAINTAINERS
									
									
									
									
									
								
							| @ -411,6 +411,7 @@ AX.25 NETWORK LAYER | ||||
| P:	Ralf Baechle | ||||
| M:	ralf@linux-mips.org | ||||
| L:	linux-hams@vger.kernel.org | ||||
| W:	http://www.linux-ax25.org/ | ||||
| S:	Maintained | ||||
| 
 | ||||
| BAYCOM/HDLCDRV DRIVERS FOR AX.25 | ||||
| @ -1457,6 +1458,13 @@ M:	support@pathscale.com | ||||
| L:	openib-general@openib.org | ||||
| S:	Supported | ||||
| 
 | ||||
| IPMI SUBSYSTEM | ||||
| P:	Corey Minyard | ||||
| M:	minyard@acm.org | ||||
| L:	openipmi-developer@lists.sourceforge.net | ||||
| W:	http://openipmi.sourceforge.net/ | ||||
| S:	Supported | ||||
| 
 | ||||
| IPX NETWORK LAYER | ||||
| P:	Arnaldo Carvalho de Melo | ||||
| M:	acme@conectiva.com.br | ||||
| @ -1556,9 +1564,7 @@ S:	Maintained | ||||
| 
 | ||||
| KEXEC | ||||
| P:	Eric Biederman | ||||
| P:	Randy Dunlap | ||||
| M:	ebiederm@xmission.com | ||||
| M:	rdunlap@xenotime.net | ||||
| W:	http://www.xmission.com/~ebiederm/files/kexec/ | ||||
| L:	linux-kernel@vger.kernel.org | ||||
| L:	fastboot@osdl.org | ||||
| @ -1871,6 +1877,7 @@ NETROM NETWORK LAYER | ||||
| P:	Ralf Baechle | ||||
| M:	ralf@linux-mips.org | ||||
| L:	linux-hams@vger.kernel.org | ||||
| W:	http://www.linux-ax25.org/ | ||||
| S:	Maintained | ||||
| 
 | ||||
| NETWORK BLOCK DEVICE | ||||
| @ -2262,6 +2269,7 @@ ROSE NETWORK LAYER | ||||
| P:	Ralf Baechle | ||||
| M:	ralf@linux-mips.org | ||||
| L:	linux-hams@vger.kernel.org | ||||
| W:	http://www.linux-ax25.org/ | ||||
| S:	Maintained | ||||
| 
 | ||||
| RISCOM8 DRIVER | ||||
| @ -3060,13 +3068,6 @@ M:	khali@linux-fr.org | ||||
| L:	lm-sensors@lm-sensors.org | ||||
| S:	Odd Fixes | ||||
| 
 | ||||
| WAN ROUTER & SANGOMA WANPIPE DRIVERS & API (X.25, FRAME RELAY, PPP, CISCO HDLC) | ||||
| P:	Nenad Corbic | ||||
| M:	ncorbic@sangoma.com | ||||
| M:	dm@sangoma.com | ||||
| W:	http://www.sangoma.com | ||||
| S:	Supported | ||||
| 
 | ||||
| WATCHDOG DEVICE DRIVERS | ||||
| P:	Wim Van Sebroeck | ||||
| M:	wim@iguana.be | ||||
|  | ||||
							
								
								
									
										58
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								Makefile
									
									
									
									
									
								
							| @ -1,7 +1,7 @@ | ||||
| VERSION = 2 | ||||
| PATCHLEVEL = 6 | ||||
| SUBLEVEL = 17 | ||||
| EXTRAVERSION =-rc1 | ||||
| EXTRAVERSION =-rc2 | ||||
| NAME=Sliding Snow Leopard | ||||
| 
 | ||||
| # *DOCUMENTATION*
 | ||||
| @ -1112,7 +1112,6 @@ modules_install: _emodinst_ _emodinst_post | ||||
| install-dir := $(if $(INSTALL_MOD_DIR),$(INSTALL_MOD_DIR),extra) | ||||
| PHONY += _emodinst_ | ||||
| _emodinst_: | ||||
| 	$(Q)rm -rf $(MODLIB)/$(install-dir) | ||||
| 	$(Q)mkdir -p $(MODLIB)/$(install-dir) | ||||
| 	$(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modinst | ||||
| 
 | ||||
| @ -1275,40 +1274,43 @@ kernelversion: | ||||
| 
 | ||||
| # Single targets
 | ||||
| # ---------------------------------------------------------------------------
 | ||||
| # The directory part is taken from first prerequisite, so this
 | ||||
| # works even with external modules
 | ||||
| %.s: %.c prepare scripts FORCE | ||||
| 	$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@) | ||||
| %.i: %.c prepare scripts FORCE | ||||
| 	$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@) | ||||
| %.o: %.c prepare scripts FORCE | ||||
| 	$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@) | ||||
| %.lst: %.c prepare scripts FORCE | ||||
| 	$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@) | ||||
| %.s: %.S prepare scripts FORCE | ||||
| 	$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@) | ||||
| %.o: %.S prepare scripts FORCE | ||||
| 	$(Q)$(MAKE) $(build)=$(dir $<) $(dir $<)$(notdir $@) | ||||
| # Single targets are compatible with:
 | ||||
| # - build whith mixed source and output
 | ||||
| # - build with separate output dir 'make O=...'
 | ||||
| # - external modules
 | ||||
| #
 | ||||
| #  target-dir => where to store outputfile
 | ||||
| #  build-dir  => directory in kernel source tree to use
 | ||||
| 
 | ||||
| # For external modules we shall include any directory of the target,
 | ||||
| # but usual case there is no directory part.
 | ||||
| # make M=`pwd` module.o     => $(dir $@)=./
 | ||||
| # make M=`pwd` foo/module.o => $(dir $@)=foo/
 | ||||
| # make M=`pwd` /            => $(dir $@)=/
 | ||||
|   | ||||
| ifeq ($(KBUILD_EXTMOD),) | ||||
|         target-dir = $(@D) | ||||
|         build-dir  = $(patsubst %/,%,$(dir $@)) | ||||
|         target-dir = $(dir $@) | ||||
| else | ||||
|         zap-slash=$(filter-out .,$(patsubst %/,%,$(dir $@))) | ||||
|         target-dir = $(KBUILD_EXTMOD)$(if $(zap-slash),/$(zap-slash)) | ||||
|         build-dir  = $(KBUILD_EXTMOD)$(if $(zap-slash),/$(zap-slash)) | ||||
|         target-dir = $(if $(KBUILD_EXTMOD),$(dir $<),$(dir $@)) | ||||
| endif | ||||
| 
 | ||||
| / %/:      scripts prepare FORCE | ||||
| %.s: %.c prepare scripts FORCE | ||||
| 	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) | ||||
| %.i: %.c prepare scripts FORCE | ||||
| 	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) | ||||
| %.o: %.c prepare scripts FORCE | ||||
| 	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) | ||||
| %.lst: %.c prepare scripts FORCE | ||||
| 	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) | ||||
| %.s: %.S prepare scripts FORCE | ||||
| 	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) | ||||
| %.o: %.S prepare scripts FORCE | ||||
| 	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@) | ||||
| 
 | ||||
| # Modules
 | ||||
| / %/: prepare scripts FORCE | ||||
| 	$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
 | ||||
| 	$(build)=$(target-dir) | ||||
| %.ko: scripts FORCE | ||||
| 	$(build)=$(build-dir) | ||||
| %.ko: prepare scripts FORCE | ||||
| 	$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1)   \
 | ||||
| 	$(build)=$(target-dir) $(@:.ko=.o) | ||||
| 	$(build)=$(build-dir) $(@:.ko=.o) | ||||
| 	$(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost | ||||
| 
 | ||||
| # FIXME Should go into a make.lib or something 
 | ||||
|  | ||||
							
								
								
									
										23
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								README
									
									
									
									
									
								
							| @ -165,10 +165,31 @@ CONFIGURING the kernel: | ||||
| 	"make xconfig"     X windows (Qt) based configuration tool. | ||||
| 	"make gconfig"     X windows (Gtk) based configuration tool. | ||||
| 	"make oldconfig"   Default all questions based on the contents of | ||||
| 			   your existing ./.config file. | ||||
| 			   your existing ./.config file and asking about | ||||
| 			   new config symbols. | ||||
| 	"make silentoldconfig" | ||||
| 			   Like above, but avoids cluttering the screen | ||||
| 			   with questions already answered. | ||||
| 	"make defconfig"   Create a ./.config file by using the default | ||||
| 			   symbol values from arch/$ARCH/defconfig. | ||||
| 	"make allyesconfig" | ||||
| 			   Create a ./.config file by setting symbol | ||||
| 			   values to 'y' as much as possible. | ||||
| 	"make allmodconfig" | ||||
| 			   Create a ./.config file by setting symbol | ||||
| 			   values to 'm' as much as possible. | ||||
| 	"make allnoconfig" Create a ./.config file by setting symbol | ||||
| 			   values to 'n' as much as possible. | ||||
| 	"make randconfig"  Create a ./.config file by setting symbol | ||||
| 			   values to random values. | ||||
| 
 | ||||
|    The allyesconfig/allmodconfig/allnoconfig/randconfig variants can | ||||
|    also use the environment variable KCONFIG_ALLCONFIG to specify a | ||||
|    filename that contains config options that the user requires to be | ||||
|    set to a specific value.  If KCONFIG_ALLCONFIG=filename is not used, | ||||
|    "make *config" checks for a file named "all{yes/mod/no/random}.config" | ||||
|    for symbol values that are to be forced.  If this file is not found, | ||||
|    it checks for a file named "all.config" to contain forced values. | ||||
|     | ||||
| 	NOTES on "make config": | ||||
| 	- having unnecessary drivers will make the kernel bigger, and can | ||||
|  | ||||
| @ -549,6 +549,11 @@ config NUMA | ||||
| 	  Access).  This option is for configuring high-end multiprocessor | ||||
| 	  server machines.  If in doubt, say N. | ||||
| 
 | ||||
| config NODES_SHIFT | ||||
| 	int | ||||
| 	default "7" | ||||
| 	depends on NEED_MULTIPLE_NODES | ||||
| 
 | ||||
| # LARGE_VMALLOC is racy, if you *really* need it then fix it first | ||||
| config ALPHA_LARGE_VMALLOC | ||||
| 	bool | ||||
|  | ||||
| @ -76,7 +76,6 @@ EXPORT_SYMBOL(strncpy); | ||||
| EXPORT_SYMBOL(strnlen); | ||||
| EXPORT_SYMBOL(strncat); | ||||
| EXPORT_SYMBOL(strstr); | ||||
| EXPORT_SYMBOL(strpbrk); | ||||
| EXPORT_SYMBOL(strchr); | ||||
| EXPORT_SYMBOL(strrchr); | ||||
| EXPORT_SYMBOL(memcmp); | ||||
|  | ||||
| @ -24,6 +24,7 @@ | ||||
| #include <linux/config.h>	/* CONFIG_ALPHA_LCA etc */ | ||||
| #include <linux/mc146818rtc.h> | ||||
| #include <linux/console.h> | ||||
| #include <linux/cpu.h> | ||||
| #include <linux/errno.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/string.h> | ||||
| @ -471,6 +472,22 @@ page_is_ram(unsigned long pfn) | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int __init | ||||
| register_cpus(void) | ||||
| { | ||||
| 	int i; | ||||
| 
 | ||||
| 	for_each_possible_cpu(i) { | ||||
| 		struct cpu *p = kzalloc(sizeof(*p), GFP_KERNEL); | ||||
| 		if (!p) | ||||
| 			return -ENOMEM; | ||||
| 		register_cpu(p, i, NULL); | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| arch_initcall(register_cpus); | ||||
| 
 | ||||
| void __init | ||||
| setup_arch(char **cmdline_p) | ||||
| { | ||||
|  | ||||
| @ -439,7 +439,7 @@ setup_smp(void) | ||||
| 			if ((cpu->flags & 0x1cc) == 0x1cc) { | ||||
| 				smp_num_probed++; | ||||
| 				/* Assume here that "whami" == index */ | ||||
| 				cpu_set(i, cpu_possible_map); | ||||
| 				cpu_set(i, cpu_present_mask); | ||||
| 				cpu->pal_revision = boot_cpu_palrev; | ||||
| 			} | ||||
| 
 | ||||
| @ -450,9 +450,8 @@ setup_smp(void) | ||||
| 		} | ||||
| 	} else { | ||||
| 		smp_num_probed = 1; | ||||
| 		cpu_set(boot_cpuid, cpu_possible_map); | ||||
| 		cpu_set(boot_cpuid, cpu_present_mask); | ||||
| 	} | ||||
| 	cpu_present_mask = cpumask_of_cpu(boot_cpuid); | ||||
| 
 | ||||
| 	printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_mask = %lx\n", | ||||
| 	       smp_num_probed, cpu_possible_map.bits[0]); | ||||
| @ -488,9 +487,8 @@ void __devinit | ||||
| smp_prepare_boot_cpu(void) | ||||
| { | ||||
| 	/*
 | ||||
| 	 * Mark the boot cpu (current cpu) as both present and online | ||||
| 	 * Mark the boot cpu (current cpu) as online | ||||
| 	 */  | ||||
| 	cpu_set(smp_processor_id(), cpu_present_mask); | ||||
| 	cpu_set(smp_processor_id(), cpu_online_map); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -512,6 +512,12 @@ config ARCH_DISCONTIGMEM_ENABLE | ||||
| 	  or have huge holes in the physical address space for other reasons. | ||||
| 	  See <file:Documentation/vm/numa> for more. | ||||
| 
 | ||||
| config NODES_SHIFT | ||||
| 	int | ||||
| 	default "4" if ARCH_LH7A40X | ||||
| 	default "2" | ||||
| 	depends on NEED_MULTIPLE_NODES | ||||
| 
 | ||||
| source "mm/Kconfig" | ||||
| 
 | ||||
| config LEDS | ||||
|  | ||||
| @ -18,6 +18,7 @@ SECTIONS | ||||
|     _start = .; | ||||
|     *(.start) | ||||
|     *(.text) | ||||
|     *(.text.*) | ||||
|     *(.fixup) | ||||
|     *(.gnu.warning) | ||||
|     *(.rodata) | ||||
|  | ||||
| @ -18,6 +18,18 @@ | ||||
| #include <asm/io.h> | ||||
| #include <asm/hardware/scoop.h> | ||||
| 
 | ||||
| /* PCMCIA to Scoop linkage
 | ||||
| 
 | ||||
|    There is no easy way to link multiple scoop devices into one | ||||
|    single entity for the pxa2xx_pcmcia device so this structure | ||||
|    is used which is setup by the platform code. | ||||
| 
 | ||||
|    This file is never modular so this symbol is always | ||||
|    accessile to the board support files. | ||||
| */ | ||||
| struct scoop_pcmcia_config *platform_scoop_config; | ||||
| EXPORT_SYMBOL(platform_scoop_config); | ||||
| 
 | ||||
| #define SCOOP_REG(d,adr) (*(volatile unsigned short*)(d +(adr))) | ||||
| 
 | ||||
| struct  scoop_dev { | ||||
|  | ||||
| @ -1,12 +1,14 @@ | ||||
| # | ||||
| # Automatically generated make config: don't edit | ||||
| # Linux kernel version: 2.6.16 | ||||
| # Mon Mar 20 14:54:51 2006 | ||||
| # Linux kernel version: 2.6.17-rc2 | ||||
| # Wed Apr 19 21:21:01 2006 | ||||
| # | ||||
| CONFIG_ARM=y | ||||
| CONFIG_MMU=y | ||||
| CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||||
| CONFIG_GENERIC_HWEIGHT=y | ||||
| CONFIG_GENERIC_CALIBRATE_DELAY=y | ||||
| CONFIG_VECTORS_BASE=0xffff0000 | ||||
| 
 | ||||
| # | ||||
| # Code maturity level options | ||||
| @ -28,6 +30,7 @@ CONFIG_SYSCTL=y | ||||
| # CONFIG_AUDIT is not set | ||||
| CONFIG_IKCONFIG=y | ||||
| CONFIG_IKCONFIG_PROC=y | ||||
| # CONFIG_RELAY is not set | ||||
| CONFIG_INITRAMFS_SOURCE="" | ||||
| CONFIG_UID16=y | ||||
| CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||||
| @ -43,10 +46,6 @@ CONFIG_BASE_FULL=y | ||||
| CONFIG_FUTEX=y | ||||
| CONFIG_EPOLL=y | ||||
| CONFIG_SHMEM=y | ||||
| CONFIG_CC_ALIGN_FUNCTIONS=0 | ||||
| CONFIG_CC_ALIGN_LABELS=0 | ||||
| CONFIG_CC_ALIGN_LOOPS=0 | ||||
| CONFIG_CC_ALIGN_JUMPS=0 | ||||
| CONFIG_SLAB=y | ||||
| # CONFIG_TINY_SHMEM is not set | ||||
| CONFIG_BASE_SMALL=0 | ||||
| @ -59,7 +58,6 @@ CONFIG_OBSOLETE_INTERMODULE=y | ||||
| CONFIG_MODULES=y | ||||
| CONFIG_MODULE_UNLOAD=y | ||||
| CONFIG_MODULE_FORCE_UNLOAD=y | ||||
| CONFIG_OBSOLETE_MODPARM=y | ||||
| # CONFIG_MODVERSIONS is not set | ||||
| # CONFIG_MODULE_SRCVERSION_ALL is not set | ||||
| CONFIG_KMOD=y | ||||
| @ -67,6 +65,7 @@ CONFIG_KMOD=y | ||||
| # | ||||
| # Block layer | ||||
| # | ||||
| # CONFIG_BLK_DEV_IO_TRACE is not set | ||||
| 
 | ||||
| # | ||||
| # IO Schedulers | ||||
| @ -94,6 +93,7 @@ CONFIG_ARCH_EP93XX=y | ||||
| # CONFIG_ARCH_IOP3XX is not set | ||||
| # CONFIG_ARCH_IXP4XX is not set | ||||
| # CONFIG_ARCH_IXP2000 is not set | ||||
| # CONFIG_ARCH_IXP23XX is not set | ||||
| # CONFIG_ARCH_L7200 is not set | ||||
| # CONFIG_ARCH_PXA is not set | ||||
| # CONFIG_ARCH_RPC is not set | ||||
| @ -112,7 +112,6 @@ CONFIG_ARCH_EP93XX=y | ||||
| # | ||||
| # Cirrus EP93xx Implementation Options | ||||
| # | ||||
| CONFIG_CRUNCH=y | ||||
| 
 | ||||
| # | ||||
| # EP93xx Platforms | ||||
| @ -232,12 +231,15 @@ CONFIG_SYN_COOKIES=y | ||||
| # CONFIG_INET_AH is not set | ||||
| # CONFIG_INET_ESP is not set | ||||
| # CONFIG_INET_IPCOMP is not set | ||||
| # CONFIG_INET_XFRM_TUNNEL is not set | ||||
| # CONFIG_INET_TUNNEL is not set | ||||
| CONFIG_INET_DIAG=y | ||||
| CONFIG_INET_TCP_DIAG=y | ||||
| # CONFIG_TCP_CONG_ADVANCED is not set | ||||
| CONFIG_TCP_CONG_BIC=y | ||||
| # CONFIG_IPV6 is not set | ||||
| # CONFIG_INET6_XFRM_TUNNEL is not set | ||||
| # CONFIG_INET6_TUNNEL is not set | ||||
| # CONFIG_NETFILTER is not set | ||||
| 
 | ||||
| # | ||||
| @ -346,7 +348,6 @@ CONFIG_MTD_CFI_I2=y | ||||
| # CONFIG_MTD_OTP is not set | ||||
| CONFIG_MTD_CFI_INTELEXT=y | ||||
| CONFIG_MTD_CFI_AMDSTD=y | ||||
| CONFIG_MTD_CFI_AMDSTD_RETRY=0 | ||||
| CONFIG_MTD_CFI_STAA=y | ||||
| CONFIG_MTD_CFI_UTIL=y | ||||
| # CONFIG_MTD_RAM is not set | ||||
| @ -371,7 +372,6 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=1 | ||||
| # CONFIG_MTD_SLRAM is not set | ||||
| # CONFIG_MTD_PHRAM is not set | ||||
| # CONFIG_MTD_MTDRAM is not set | ||||
| # CONFIG_MTD_BLKMTD is not set | ||||
| # CONFIG_MTD_BLOCK2MTD is not set | ||||
| 
 | ||||
| # | ||||
| @ -412,7 +412,7 @@ CONFIG_MTD_NAND_IDS=y | ||||
| # CONFIG_BLK_DEV_NBD is not set | ||||
| # CONFIG_BLK_DEV_UB is not set | ||||
| # CONFIG_BLK_DEV_RAM is not set | ||||
| CONFIG_BLK_DEV_RAM_COUNT=16 | ||||
| # CONFIG_BLK_DEV_INITRD is not set | ||||
| # CONFIG_CDROM_PKTCDVD is not set | ||||
| # CONFIG_ATA_OVER_ETH is not set | ||||
| 
 | ||||
| @ -576,13 +576,13 @@ CONFIG_WATCHDOG=y | ||||
| # Watchdog Device Drivers | ||||
| # | ||||
| # CONFIG_SOFT_WATCHDOG is not set | ||||
| CONFIG_EP93XX_WATCHDOG=y | ||||
| 
 | ||||
| # | ||||
| # USB-based Watchdog Cards | ||||
| # | ||||
| # CONFIG_USBPCWATCHDOG is not set | ||||
| # CONFIG_NVRAM is not set | ||||
| # CONFIG_RTC is not set | ||||
| # CONFIG_DTLK is not set | ||||
| # CONFIG_R3964 is not set | ||||
| 
 | ||||
| @ -626,9 +626,7 @@ CONFIG_I2C_ALGOBIT=y | ||||
| # CONFIG_SENSORS_PCF8574 is not set | ||||
| # CONFIG_SENSORS_PCA9539 is not set | ||||
| # CONFIG_SENSORS_PCF8591 is not set | ||||
| # CONFIG_SENSORS_RTC8564 is not set | ||||
| # CONFIG_SENSORS_MAX6875 is not set | ||||
| # CONFIG_RTC_X1205_I2C is not set | ||||
| CONFIG_I2C_DEBUG_CORE=y | ||||
| CONFIG_I2C_DEBUG_ALGO=y | ||||
| CONFIG_I2C_DEBUG_BUS=y | ||||
| @ -690,7 +688,16 @@ CONFIG_HWMON=y | ||||
| # | ||||
| 
 | ||||
| # | ||||
| # Multimedia Capabilities Port drivers | ||||
| # LED devices | ||||
| # | ||||
| # CONFIG_NEW_LEDS is not set | ||||
| 
 | ||||
| # | ||||
| # LED drivers | ||||
| # | ||||
| 
 | ||||
| # | ||||
| # LED Triggers | ||||
| # | ||||
| 
 | ||||
| # | ||||
| @ -702,6 +709,7 @@ CONFIG_HWMON=y | ||||
| # Digital Video Broadcasting Devices | ||||
| # | ||||
| # CONFIG_DVB is not set | ||||
| # CONFIG_USB_DABUSB is not set | ||||
| 
 | ||||
| # | ||||
| # Graphics support | ||||
| @ -718,6 +726,7 @@ CONFIG_HWMON=y | ||||
| # | ||||
| CONFIG_USB_ARCH_HAS_HCD=y | ||||
| # CONFIG_USB_ARCH_HAS_OHCI is not set | ||||
| # CONFIG_USB_ARCH_HAS_EHCI is not set | ||||
| CONFIG_USB=y | ||||
| CONFIG_USB_DEBUG=y | ||||
| 
 | ||||
| @ -775,15 +784,6 @@ CONFIG_USB_STORAGE=y | ||||
| # CONFIG_USB_MDC800 is not set | ||||
| # CONFIG_USB_MICROTEK is not set | ||||
| 
 | ||||
| # | ||||
| # USB Multimedia devices | ||||
| # | ||||
| # CONFIG_USB_DABUSB is not set | ||||
| 
 | ||||
| # | ||||
| # Video4Linux support is needed for USB Multimedia device support | ||||
| # | ||||
| 
 | ||||
| # | ||||
| # USB Network Adapters | ||||
| # | ||||
| @ -813,6 +813,7 @@ CONFIG_USB_SERIAL_CONSOLE=y | ||||
| # CONFIG_USB_SERIAL_CYPRESS_M8 is not set | ||||
| # CONFIG_USB_SERIAL_EMPEG is not set | ||||
| # CONFIG_USB_SERIAL_FTDI_SIO is not set | ||||
| # CONFIG_USB_SERIAL_FUNSOFT is not set | ||||
| # CONFIG_USB_SERIAL_VISOR is not set | ||||
| # CONFIG_USB_SERIAL_IPAQ is not set | ||||
| # CONFIG_USB_SERIAL_IR is not set | ||||
| @ -825,6 +826,7 @@ CONFIG_USB_SERIAL_CONSOLE=y | ||||
| # CONFIG_USB_SERIAL_KLSI is not set | ||||
| # CONFIG_USB_SERIAL_KOBIL_SCT is not set | ||||
| # CONFIG_USB_SERIAL_MCT_U232 is not set | ||||
| # CONFIG_USB_SERIAL_NAVMAN is not set | ||||
| CONFIG_USB_SERIAL_PL2303=y | ||||
| # CONFIG_USB_SERIAL_HP4X is not set | ||||
| # CONFIG_USB_SERIAL_SAFE is not set | ||||
| @ -864,6 +866,32 @@ CONFIG_USB_SERIAL_PL2303=y | ||||
| # | ||||
| # CONFIG_MMC is not set | ||||
| 
 | ||||
| # | ||||
| # Real Time Clock | ||||
| # | ||||
| CONFIG_RTC_LIB=y | ||||
| CONFIG_RTC_CLASS=y | ||||
| CONFIG_RTC_HCTOSYS=y | ||||
| CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||||
| 
 | ||||
| # | ||||
| # RTC interfaces | ||||
| # | ||||
| CONFIG_RTC_INTF_SYSFS=y | ||||
| CONFIG_RTC_INTF_PROC=y | ||||
| CONFIG_RTC_INTF_DEV=y | ||||
| 
 | ||||
| # | ||||
| # RTC drivers | ||||
| # | ||||
| # CONFIG_RTC_DRV_X1205 is not set | ||||
| # CONFIG_RTC_DRV_DS1672 is not set | ||||
| # CONFIG_RTC_DRV_PCF8563 is not set | ||||
| # CONFIG_RTC_DRV_RS5C372 is not set | ||||
| CONFIG_RTC_DRV_M48T86=y | ||||
| CONFIG_RTC_DRV_EP93XX=y | ||||
| # CONFIG_RTC_DRV_TEST is not set | ||||
| 
 | ||||
| # | ||||
| # File systems | ||||
| # | ||||
| @ -912,7 +940,6 @@ CONFIG_SYSFS=y | ||||
| CONFIG_TMPFS=y | ||||
| # CONFIG_HUGETLB_PAGE is not set | ||||
| CONFIG_RAMFS=y | ||||
| # CONFIG_RELAYFS_FS is not set | ||||
| # CONFIG_CONFIGFS_FS is not set | ||||
| 
 | ||||
| # | ||||
| @ -1044,6 +1071,7 @@ CONFIG_LOG_BUF_SHIFT=14 | ||||
| CONFIG_DETECT_SOFTLOCKUP=y | ||||
| # CONFIG_SCHEDSTATS is not set | ||||
| CONFIG_DEBUG_SLAB=y | ||||
| # CONFIG_DEBUG_SLAB_LEAK is not set | ||||
| CONFIG_DEBUG_MUTEXES=y | ||||
| CONFIG_DEBUG_SPINLOCK=y | ||||
| # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||||
| @ -1053,6 +1081,7 @@ CONFIG_DEBUG_BUGVERBOSE=y | ||||
| # CONFIG_DEBUG_FS is not set | ||||
| # CONFIG_DEBUG_VM is not set | ||||
| CONFIG_FRAME_POINTER=y | ||||
| # CONFIG_UNWIND_INFO is not set | ||||
| CONFIG_FORCED_INLINING=y | ||||
| # CONFIG_RCU_TORTURE_TEST is not set | ||||
| CONFIG_DEBUG_USER=y | ||||
|  | ||||
| @ -1,18 +1,19 @@ | ||||
| # | ||||
| # Automatically generated make config: don't edit | ||||
| # Linux kernel version: 2.6.16-rc2 | ||||
| # Wed Feb  8 04:49:11 2006 | ||||
| # Linux kernel version: 2.6.17-rc2 | ||||
| # Wed Apr 19 21:12:49 2006 | ||||
| # | ||||
| CONFIG_ARM=y | ||||
| CONFIG_MMU=y | ||||
| CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||||
| CONFIG_GENERIC_HWEIGHT=y | ||||
| CONFIG_GENERIC_CALIBRATE_DELAY=y | ||||
| CONFIG_VECTORS_BASE=0xffff0000 | ||||
| 
 | ||||
| # | ||||
| # Code maturity level options | ||||
| # | ||||
| CONFIG_EXPERIMENTAL=y | ||||
| CONFIG_CLEAN_COMPILE=y | ||||
| CONFIG_BROKEN_ON_SMP=y | ||||
| CONFIG_INIT_ENV_ARG_LIMIT=32 | ||||
| 
 | ||||
| @ -29,6 +30,7 @@ CONFIG_BSD_PROCESS_ACCT=y | ||||
| CONFIG_SYSCTL=y | ||||
| # CONFIG_AUDIT is not set | ||||
| # CONFIG_IKCONFIG is not set | ||||
| # CONFIG_RELAY is not set | ||||
| CONFIG_INITRAMFS_SOURCE="" | ||||
| CONFIG_UID16=y | ||||
| CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||||
| @ -44,10 +46,6 @@ CONFIG_BASE_FULL=y | ||||
| CONFIG_FUTEX=y | ||||
| CONFIG_EPOLL=y | ||||
| CONFIG_SHMEM=y | ||||
| CONFIG_CC_ALIGN_FUNCTIONS=0 | ||||
| CONFIG_CC_ALIGN_LABELS=0 | ||||
| CONFIG_CC_ALIGN_LOOPS=0 | ||||
| CONFIG_CC_ALIGN_JUMPS=0 | ||||
| CONFIG_SLAB=y | ||||
| # CONFIG_TINY_SHMEM is not set | ||||
| CONFIG_BASE_SMALL=0 | ||||
| @ -60,7 +58,6 @@ CONFIG_OBSOLETE_INTERMODULE=y | ||||
| CONFIG_MODULES=y | ||||
| CONFIG_MODULE_UNLOAD=y | ||||
| # CONFIG_MODULE_FORCE_UNLOAD is not set | ||||
| CONFIG_OBSOLETE_MODPARM=y | ||||
| # CONFIG_MODVERSIONS is not set | ||||
| # CONFIG_MODULE_SRCVERSION_ALL is not set | ||||
| CONFIG_KMOD=y | ||||
| @ -68,6 +65,7 @@ CONFIG_KMOD=y | ||||
| # | ||||
| # Block layer | ||||
| # | ||||
| # CONFIG_BLK_DEV_IO_TRACE is not set | ||||
| 
 | ||||
| # | ||||
| # IO Schedulers | ||||
| @ -89,11 +87,13 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" | ||||
| # CONFIG_ARCH_CLPS711X is not set | ||||
| # CONFIG_ARCH_CO285 is not set | ||||
| # CONFIG_ARCH_EBSA110 is not set | ||||
| # CONFIG_ARCH_EP93XX is not set | ||||
| # CONFIG_ARCH_FOOTBRIDGE is not set | ||||
| # CONFIG_ARCH_INTEGRATOR is not set | ||||
| # CONFIG_ARCH_IOP3XX is not set | ||||
| # CONFIG_ARCH_IXP4XX is not set | ||||
| CONFIG_ARCH_IXP2000=y | ||||
| # CONFIG_ARCH_IXP23XX is not set | ||||
| # CONFIG_ARCH_L7200 is not set | ||||
| # CONFIG_ARCH_PXA is not set | ||||
| # CONFIG_ARCH_RPC is not set | ||||
| @ -123,6 +123,7 @@ CONFIG_ARCH_IXDP2800=y | ||||
| CONFIG_ARCH_IXDP2X00=y | ||||
| CONFIG_ARCH_IXDP2401=y | ||||
| CONFIG_ARCH_IXDP2801=y | ||||
| CONFIG_MACH_IXDP28X5=y | ||||
| CONFIG_ARCH_IXDP2X01=y | ||||
| # CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO is not set | ||||
| 
 | ||||
| @ -147,7 +148,6 @@ CONFIG_XSCALE_PMU=y | ||||
| # Bus support | ||||
| # | ||||
| CONFIG_PCI=y | ||||
| CONFIG_PCI_LEGACY_PROC=y | ||||
| # CONFIG_PCI_DEBUG is not set | ||||
| 
 | ||||
| # | ||||
| @ -160,6 +160,7 @@ CONFIG_PCI_LEGACY_PROC=y | ||||
| # | ||||
| # CONFIG_PREEMPT is not set | ||||
| # CONFIG_NO_IDLE_HZ is not set | ||||
| CONFIG_HZ=100 | ||||
| # CONFIG_AEABI is not set | ||||
| # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set | ||||
| CONFIG_SELECT_MEMORY_MODEL=y | ||||
| @ -213,6 +214,7 @@ CONFIG_NET=y | ||||
| # | ||||
| # Networking options | ||||
| # | ||||
| # CONFIG_NETDEBUG is not set | ||||
| CONFIG_PACKET=y | ||||
| CONFIG_PACKET_MMAP=y | ||||
| CONFIG_UNIX=y | ||||
| @ -232,12 +234,15 @@ CONFIG_SYN_COOKIES=y | ||||
| # CONFIG_INET_AH is not set | ||||
| # CONFIG_INET_ESP is not set | ||||
| # CONFIG_INET_IPCOMP is not set | ||||
| # CONFIG_INET_XFRM_TUNNEL is not set | ||||
| # CONFIG_INET_TUNNEL is not set | ||||
| CONFIG_INET_DIAG=y | ||||
| CONFIG_INET_TCP_DIAG=y | ||||
| # CONFIG_TCP_CONG_ADVANCED is not set | ||||
| CONFIG_TCP_CONG_BIC=y | ||||
| # CONFIG_IPV6 is not set | ||||
| # CONFIG_INET6_XFRM_TUNNEL is not set | ||||
| # CONFIG_INET6_TUNNEL is not set | ||||
| # CONFIG_NETFILTER is not set | ||||
| 
 | ||||
| # | ||||
| @ -347,7 +352,6 @@ CONFIG_MTD_CFI_UTIL=y | ||||
| # CONFIG_MTD_ROM is not set | ||||
| # CONFIG_MTD_ABSENT is not set | ||||
| # CONFIG_MTD_OBSOLETE_CHIPS is not set | ||||
| # CONFIG_MTD_XIP is not set | ||||
| 
 | ||||
| # | ||||
| # Mapping drivers for chip access | ||||
| @ -366,7 +370,6 @@ CONFIG_MTD_IXP2000=y | ||||
| # CONFIG_MTD_SLRAM is not set | ||||
| # CONFIG_MTD_PHRAM is not set | ||||
| # CONFIG_MTD_MTDRAM is not set | ||||
| # CONFIG_MTD_BLKMTD is not set | ||||
| # CONFIG_MTD_BLOCK2MTD is not set | ||||
| 
 | ||||
| # | ||||
| @ -614,8 +617,9 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||||
| # | ||||
| CONFIG_SERIAL_8250=y | ||||
| CONFIG_SERIAL_8250_CONSOLE=y | ||||
| CONFIG_SERIAL_8250_PCI=y | ||||
| CONFIG_SERIAL_8250_NR_UARTS=3 | ||||
| CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | ||||
| CONFIG_SERIAL_8250_RUNTIME_UARTS=3 | ||||
| # CONFIG_SERIAL_8250_EXTENDED is not set | ||||
| 
 | ||||
| # | ||||
| @ -623,6 +627,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | ||||
| # | ||||
| CONFIG_SERIAL_CORE=y | ||||
| CONFIG_SERIAL_CORE_CONSOLE=y | ||||
| # CONFIG_SERIAL_JSM is not set | ||||
| CONFIG_UNIX98_PTYS=y | ||||
| CONFIG_LEGACY_PTYS=y | ||||
| CONFIG_LEGACY_PTY_COUNT=256 | ||||
| @ -650,7 +655,6 @@ CONFIG_IXP2000_WATCHDOG=y | ||||
| # CONFIG_PCIPCWATCHDOG is not set | ||||
| # CONFIG_WDTPCI 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 | ||||
| @ -696,7 +700,6 @@ CONFIG_I2C_IXP2000=y | ||||
| # CONFIG_I2C_PARPORT_LIGHT is not set | ||||
| # CONFIG_I2C_PROSAVAGE is not set | ||||
| # CONFIG_I2C_SAVAGE4 is not set | ||||
| # CONFIG_SCx200_ACB is not set | ||||
| # CONFIG_I2C_SIS5595 is not set | ||||
| # CONFIG_I2C_SIS630 is not set | ||||
| # CONFIG_I2C_SIS96X is not set | ||||
| @ -715,9 +718,7 @@ CONFIG_SENSORS_EEPROM=y | ||||
| # CONFIG_SENSORS_PCF8574 is not set | ||||
| # CONFIG_SENSORS_PCA9539 is not set | ||||
| # CONFIG_SENSORS_PCF8591 is not set | ||||
| # CONFIG_SENSORS_RTC8564 is not set | ||||
| # CONFIG_SENSORS_MAX6875 is not set | ||||
| # CONFIG_RTC_X1205_I2C is not set | ||||
| # CONFIG_I2C_DEBUG_CORE is not set | ||||
| # CONFIG_I2C_DEBUG_ALGO is not set | ||||
| # CONFIG_I2C_DEBUG_BUS is not set | ||||
| @ -729,6 +730,11 @@ CONFIG_SENSORS_EEPROM=y | ||||
| # CONFIG_SPI is not set | ||||
| # CONFIG_SPI_MASTER is not set | ||||
| 
 | ||||
| # | ||||
| # Dallas's 1-wire bus | ||||
| # | ||||
| # CONFIG_W1 is not set | ||||
| 
 | ||||
| # | ||||
| # Hardware Monitoring support | ||||
| # | ||||
| @ -742,6 +748,7 @@ CONFIG_HWMON=y | ||||
| # CONFIG_SENSORS_ASB100 is not set | ||||
| # CONFIG_SENSORS_ATXP1 is not set | ||||
| # CONFIG_SENSORS_DS1621 is not set | ||||
| # CONFIG_SENSORS_F71805F is not set | ||||
| # CONFIG_SENSORS_FSCHER is not set | ||||
| # CONFIG_SENSORS_FSCPOS is not set | ||||
| # CONFIG_SENSORS_GL518SM is not set | ||||
| @ -776,7 +783,16 @@ CONFIG_HWMON=y | ||||
| # | ||||
| 
 | ||||
| # | ||||
| # Multimedia Capabilities Port drivers | ||||
| # LED devices | ||||
| # | ||||
| # CONFIG_NEW_LEDS is not set | ||||
| 
 | ||||
| # | ||||
| # LED drivers | ||||
| # | ||||
| 
 | ||||
| # | ||||
| # LED Triggers | ||||
| # | ||||
| 
 | ||||
| # | ||||
| @ -804,6 +820,7 @@ CONFIG_HWMON=y | ||||
| # | ||||
| CONFIG_USB_ARCH_HAS_HCD=y | ||||
| CONFIG_USB_ARCH_HAS_OHCI=y | ||||
| CONFIG_USB_ARCH_HAS_EHCI=y | ||||
| # CONFIG_USB is not set | ||||
| 
 | ||||
| # | ||||
| @ -820,6 +837,12 @@ CONFIG_USB_ARCH_HAS_OHCI=y | ||||
| # | ||||
| # CONFIG_MMC is not set | ||||
| 
 | ||||
| # | ||||
| # Real Time Clock | ||||
| # | ||||
| CONFIG_RTC_LIB=y | ||||
| # CONFIG_RTC_CLASS is not set | ||||
| 
 | ||||
| # | ||||
| # File systems | ||||
| # | ||||
| @ -870,7 +893,6 @@ CONFIG_SYSFS=y | ||||
| CONFIG_TMPFS=y | ||||
| # CONFIG_HUGETLB_PAGE is not set | ||||
| CONFIG_RAMFS=y | ||||
| # CONFIG_RELAYFS_FS is not set | ||||
| # CONFIG_CONFIGFS_FS is not set | ||||
| 
 | ||||
| # | ||||
| @ -972,6 +994,7 @@ CONFIG_DEBUG_BUGVERBOSE=y | ||||
| # CONFIG_DEBUG_FS is not set | ||||
| # CONFIG_DEBUG_VM is not set | ||||
| CONFIG_FRAME_POINTER=y | ||||
| # CONFIG_UNWIND_INFO is not set | ||||
| CONFIG_FORCED_INLINING=y | ||||
| # CONFIG_RCU_TORTURE_TEST is not set | ||||
| CONFIG_DEBUG_USER=y | ||||
|  | ||||
| @ -1,12 +1,14 @@ | ||||
| # | ||||
| # Automatically generated make config: don't edit | ||||
| # Linux kernel version: 2.6.16 | ||||
| # Tue Mar 21 03:27:20 2006 | ||||
| # Linux kernel version: 2.6.17-rc2 | ||||
| # Wed Apr 19 21:13:50 2006 | ||||
| # | ||||
| CONFIG_ARM=y | ||||
| CONFIG_MMU=y | ||||
| CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||||
| CONFIG_GENERIC_HWEIGHT=y | ||||
| CONFIG_GENERIC_CALIBRATE_DELAY=y | ||||
| CONFIG_VECTORS_BASE=0xffff0000 | ||||
| 
 | ||||
| # | ||||
| # Code maturity level options | ||||
| @ -28,6 +30,7 @@ CONFIG_BSD_PROCESS_ACCT=y | ||||
| CONFIG_SYSCTL=y | ||||
| # CONFIG_AUDIT is not set | ||||
| # CONFIG_IKCONFIG is not set | ||||
| # CONFIG_RELAY is not set | ||||
| CONFIG_INITRAMFS_SOURCE="" | ||||
| CONFIG_UID16=y | ||||
| CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||||
| @ -43,10 +46,6 @@ CONFIG_BASE_FULL=y | ||||
| CONFIG_FUTEX=y | ||||
| CONFIG_EPOLL=y | ||||
| CONFIG_SHMEM=y | ||||
| CONFIG_CC_ALIGN_FUNCTIONS=0 | ||||
| CONFIG_CC_ALIGN_LABELS=0 | ||||
| CONFIG_CC_ALIGN_LOOPS=0 | ||||
| CONFIG_CC_ALIGN_JUMPS=0 | ||||
| CONFIG_SLAB=y | ||||
| # CONFIG_TINY_SHMEM is not set | ||||
| CONFIG_BASE_SMALL=0 | ||||
| @ -59,7 +58,6 @@ CONFIG_OBSOLETE_INTERMODULE=y | ||||
| CONFIG_MODULES=y | ||||
| CONFIG_MODULE_UNLOAD=y | ||||
| # CONFIG_MODULE_FORCE_UNLOAD is not set | ||||
| CONFIG_OBSOLETE_MODPARM=y | ||||
| # CONFIG_MODVERSIONS is not set | ||||
| # CONFIG_MODULE_SRCVERSION_ALL is not set | ||||
| CONFIG_KMOD=y | ||||
| @ -67,6 +65,7 @@ CONFIG_KMOD=y | ||||
| # | ||||
| # Block layer | ||||
| # | ||||
| # CONFIG_BLK_DEV_IO_TRACE is not set | ||||
| 
 | ||||
| # | ||||
| # IO Schedulers | ||||
| @ -143,7 +142,6 @@ CONFIG_CPU_BIG_ENDIAN=y | ||||
| # Bus support | ||||
| # | ||||
| CONFIG_PCI=y | ||||
| CONFIG_PCI_LEGACY_PROC=y | ||||
| # CONFIG_PCI_DEBUG is not set | ||||
| 
 | ||||
| # | ||||
| @ -230,12 +228,15 @@ CONFIG_SYN_COOKIES=y | ||||
| # CONFIG_INET_AH is not set | ||||
| # CONFIG_INET_ESP is not set | ||||
| # CONFIG_INET_IPCOMP is not set | ||||
| # CONFIG_INET_XFRM_TUNNEL is not set | ||||
| # CONFIG_INET_TUNNEL is not set | ||||
| CONFIG_INET_DIAG=y | ||||
| CONFIG_INET_TCP_DIAG=y | ||||
| # CONFIG_TCP_CONG_ADVANCED is not set | ||||
| CONFIG_TCP_CONG_BIC=y | ||||
| # CONFIG_IPV6 is not set | ||||
| # CONFIG_INET6_XFRM_TUNNEL is not set | ||||
| # CONFIG_INET6_TUNNEL is not set | ||||
| # CONFIG_NETFILTER is not set | ||||
| 
 | ||||
| # | ||||
| @ -365,7 +366,6 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=1 | ||||
| # CONFIG_MTD_SLRAM is not set | ||||
| # CONFIG_MTD_PHRAM is not set | ||||
| # CONFIG_MTD_MTDRAM is not set | ||||
| # CONFIG_MTD_BLKMTD is not set | ||||
| # CONFIG_MTD_BLOCK2MTD is not set | ||||
| 
 | ||||
| # | ||||
| @ -527,7 +527,6 @@ CONFIG_BLK_DEV_SD=y | ||||
| # CONFIG_SCSI_INIA100 is not set | ||||
| # CONFIG_SCSI_SYM53C8XX_2 is not set | ||||
| # CONFIG_SCSI_IPR is not set | ||||
| # CONFIG_SCSI_QLOGIC_FC is not set | ||||
| # CONFIG_SCSI_QLOGIC_1280 is not set | ||||
| # CONFIG_SCSI_QLA_FC is not set | ||||
| # CONFIG_SCSI_LPFC is not set | ||||
| @ -735,6 +734,7 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||||
| # | ||||
| CONFIG_SERIAL_8250=y | ||||
| CONFIG_SERIAL_8250_CONSOLE=y | ||||
| CONFIG_SERIAL_8250_PCI=y | ||||
| CONFIG_SERIAL_8250_NR_UARTS=4 | ||||
| CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | ||||
| # CONFIG_SERIAL_8250_EXTENDED is not set | ||||
| @ -776,7 +776,6 @@ CONFIG_WATCHDOG=y | ||||
| # | ||||
| # CONFIG_USBPCWATCHDOG 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 | ||||
| @ -821,7 +820,6 @@ CONFIG_I2C_ALGOBIT=y | ||||
| # CONFIG_I2C_PARPORT_LIGHT is not set | ||||
| # CONFIG_I2C_PROSAVAGE is not set | ||||
| # CONFIG_I2C_SAVAGE4 is not set | ||||
| # CONFIG_SCx200_ACB is not set | ||||
| # CONFIG_I2C_SIS5595 is not set | ||||
| # CONFIG_I2C_SIS630 is not set | ||||
| # CONFIG_I2C_SIS96X is not set | ||||
| @ -840,9 +838,7 @@ CONFIG_SENSORS_EEPROM=y | ||||
| # CONFIG_SENSORS_PCF8574 is not set | ||||
| # CONFIG_SENSORS_PCA9539 is not set | ||||
| # CONFIG_SENSORS_PCF8591 is not set | ||||
| # CONFIG_SENSORS_RTC8564 is not set | ||||
| # CONFIG_SENSORS_MAX6875 is not set | ||||
| # CONFIG_RTC_X1205_I2C is not set | ||||
| # CONFIG_I2C_DEBUG_CORE is not set | ||||
| # CONFIG_I2C_DEBUG_ALGO is not set | ||||
| # CONFIG_I2C_DEBUG_BUS is not set | ||||
| @ -907,7 +903,16 @@ CONFIG_HWMON=y | ||||
| # | ||||
| 
 | ||||
| # | ||||
| # Multimedia Capabilities Port drivers | ||||
| # LED devices | ||||
| # | ||||
| # CONFIG_NEW_LEDS is not set | ||||
| 
 | ||||
| # | ||||
| # LED drivers | ||||
| # | ||||
| 
 | ||||
| # | ||||
| # LED Triggers | ||||
| # | ||||
| 
 | ||||
| # | ||||
| @ -919,6 +924,7 @@ CONFIG_HWMON=y | ||||
| # Digital Video Broadcasting Devices | ||||
| # | ||||
| # CONFIG_DVB is not set | ||||
| # CONFIG_USB_DABUSB is not set | ||||
| 
 | ||||
| # | ||||
| # Graphics support | ||||
| @ -935,6 +941,7 @@ CONFIG_HWMON=y | ||||
| # | ||||
| CONFIG_USB_ARCH_HAS_HCD=y | ||||
| CONFIG_USB_ARCH_HAS_OHCI=y | ||||
| CONFIG_USB_ARCH_HAS_EHCI=y | ||||
| CONFIG_USB=y | ||||
| # CONFIG_USB_DEBUG is not set | ||||
| 
 | ||||
| @ -1000,9 +1007,7 @@ CONFIG_USB_STORAGE=y | ||||
| # CONFIG_USB_ACECAD is not set | ||||
| # CONFIG_USB_KBTAB is not set | ||||
| # CONFIG_USB_POWERMATE is not set | ||||
| # CONFIG_USB_MTOUCH is not set | ||||
| # CONFIG_USB_ITMTOUCH is not set | ||||
| # CONFIG_USB_EGALAX is not set | ||||
| # CONFIG_USB_TOUCHSCREEN is not set | ||||
| # CONFIG_USB_YEALINK is not set | ||||
| # CONFIG_USB_XPAD is not set | ||||
| # CONFIG_USB_ATI_REMOTE is not set | ||||
| @ -1016,15 +1021,6 @@ CONFIG_USB_STORAGE=y | ||||
| # CONFIG_USB_MDC800 is not set | ||||
| # CONFIG_USB_MICROTEK is not set | ||||
| 
 | ||||
| # | ||||
| # USB Multimedia devices | ||||
| # | ||||
| # CONFIG_USB_DABUSB is not set | ||||
| 
 | ||||
| # | ||||
| # Video4Linux support is needed for USB Multimedia device support | ||||
| # | ||||
| 
 | ||||
| # | ||||
| # USB Network Adapters | ||||
| # | ||||
| @ -1075,6 +1071,12 @@ CONFIG_USB_MON=y | ||||
| # | ||||
| # CONFIG_MMC is not set | ||||
| 
 | ||||
| # | ||||
| # Real Time Clock | ||||
| # | ||||
| CONFIG_RTC_LIB=y | ||||
| # CONFIG_RTC_CLASS is not set | ||||
| 
 | ||||
| # | ||||
| # File systems | ||||
| # | ||||
| @ -1127,7 +1129,6 @@ CONFIG_SYSFS=y | ||||
| CONFIG_TMPFS=y | ||||
| # CONFIG_HUGETLB_PAGE is not set | ||||
| CONFIG_RAMFS=y | ||||
| # CONFIG_RELAYFS_FS is not set | ||||
| # CONFIG_CONFIGFS_FS is not set | ||||
| 
 | ||||
| # | ||||
| @ -1268,6 +1269,7 @@ CONFIG_DEBUG_BUGVERBOSE=y | ||||
| # CONFIG_DEBUG_FS is not set | ||||
| # CONFIG_DEBUG_VM is not set | ||||
| CONFIG_FRAME_POINTER=y | ||||
| # CONFIG_UNWIND_INFO is not set | ||||
| CONFIG_FORCED_INLINING=y | ||||
| # CONFIG_RCU_TORTURE_TEST is not set | ||||
| CONFIG_DEBUG_USER=y | ||||
|  | ||||
| @ -101,7 +101,6 @@ EXPORT_SYMBOL(__raw_writesl); | ||||
| 
 | ||||
| 	/* string / mem functions */ | ||||
| EXPORT_SYMBOL(strchr); | ||||
| EXPORT_SYMBOL(strpbrk); | ||||
| EXPORT_SYMBOL(strrchr); | ||||
| EXPORT_SYMBOL(memset); | ||||
| EXPORT_SYMBOL(memcpy); | ||||
|  | ||||
| @ -322,6 +322,12 @@ static void __init setup_processor(void) | ||||
| 	sprintf(system_utsname.machine, "%s%c", list->arch_name, ENDIANNESS); | ||||
| 	sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS); | ||||
| 	elf_hwcap = list->elf_hwcap; | ||||
| #ifndef CONFIG_ARM_THUMB | ||||
| 	elf_hwcap &= ~HWCAP_THUMB; | ||||
| #endif | ||||
| #ifndef CONFIG_VFP | ||||
| 	elf_hwcap &= ~HWCAP_VFP; | ||||
| #endif | ||||
| 
 | ||||
| 	cpu_proc_init(); | ||||
| } | ||||
| @ -401,7 +407,7 @@ static void __init early_initrd(char **p) | ||||
| } | ||||
| __early_param("initrd=", early_initrd); | ||||
| 
 | ||||
| static void __init add_memory(unsigned long start, unsigned long size) | ||||
| static void __init arm_add_memory(unsigned long start, unsigned long size) | ||||
| { | ||||
| 	/*
 | ||||
| 	 * Ensure that start/size are aligned to a page boundary. | ||||
| @ -439,7 +445,7 @@ static void __init early_mem(char **p) | ||||
| 	if (**p == '@') | ||||
| 		start = memparse(*p + 1, p); | ||||
| 
 | ||||
| 	add_memory(start, size); | ||||
| 	arm_add_memory(start, size); | ||||
| } | ||||
| __early_param("mem=", early_mem); | ||||
| 
 | ||||
| @ -581,7 +587,7 @@ static int __init parse_tag_mem32(const struct tag *tag) | ||||
| 			tag->u.mem.start, tag->u.mem.size / 1024); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 	add_memory(tag->u.mem.start, tag->u.mem.size); | ||||
| 	arm_add_memory(tag->u.mem.start, tag->u.mem.size); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| @ -801,7 +807,7 @@ static int __init topology_init(void) | ||||
| { | ||||
| 	int cpu; | ||||
| 
 | ||||
| 	for_each_cpu(cpu) | ||||
| 	for_each_possible_cpu(cpu) | ||||
| 		register_cpu(&per_cpu(cpu_data, cpu).cpu, cpu, NULL); | ||||
| 
 | ||||
| 	return 0; | ||||
|  | ||||
| @ -194,13 +194,23 @@ void __init at91_add_device_eth(struct at91_eth_data *data) {} | ||||
| #if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE) | ||||
| static struct at91_cf_data cf_data; | ||||
| 
 | ||||
| static struct resource at91_cf_resources[] = { | ||||
| 	[0] = { | ||||
| 		.start	= AT91_CF_BASE, | ||||
| 		/* ties up CS4, CS5, and CS6 */ | ||||
| 		.end	= AT91_CF_BASE + (0x30000000 - 1), | ||||
| 		.flags	= IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device at91rm9200_cf_device = { | ||||
| 	.name		= "at91_cf", | ||||
| 	.id		= -1, | ||||
| 	.dev		= { | ||||
| 				.platform_data		= &cf_data, | ||||
| 	}, | ||||
| 	.num_resources	= 0, | ||||
| 	.resource	= at91_cf_resources, | ||||
| 	.num_resources	= ARRAY_SIZE(at91_cf_resources), | ||||
| }; | ||||
| 
 | ||||
| void __init at91_add_device_cf(struct at91_cf_data *data) | ||||
|  | ||||
| @ -91,7 +91,7 @@ static void ixp4xx_config_irq(unsigned irq, enum ixp4xx_irq_type type); | ||||
| /*
 | ||||
|  * IRQ -> GPIO mapping table | ||||
|  */ | ||||
| static char irq2gpio[32] = { | ||||
| static signed char irq2gpio[32] = { | ||||
| 	-1, -1, -1, -1, -1, -1,  0,  1, | ||||
| 	-1, -1, -1, -1, -1, -1, -1, -1, | ||||
| 	-1, -1, -1,  2,  3,  4,  5,  6, | ||||
|  | ||||
| @ -25,10 +25,6 @@ | ||||
| #include <asm/arch/mux.h> | ||||
| #include <asm/arch/gpio.h> | ||||
| 
 | ||||
| extern void omap_nop_release(struct device *dev); | ||||
| 
 | ||||
| /*-------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #if	defined(CONFIG_OMAP1610_IR) || defined(CONFIG_OMAP161O_IR_MODULE) | ||||
| 
 | ||||
| static u64 irda_dmamask = 0xffffffff; | ||||
| @ -37,7 +33,6 @@ static struct platform_device omap1610ir_device = { | ||||
| 	.name = "omap1610-ir", | ||||
| 	.id = -1, | ||||
| 	.dev = { | ||||
| 		.release	= omap_nop_release, | ||||
| 		.dma_mask	= &irda_dmamask, | ||||
| 	}, | ||||
| }; | ||||
| @ -84,9 +79,6 @@ static struct resource rtc_resources[] = { | ||||
| static struct platform_device omap_rtc_device = { | ||||
| 	.name           = "omap_rtc", | ||||
| 	.id             = -1, | ||||
| 	.dev = { | ||||
| 		.release        = omap_nop_release, | ||||
| 	}, | ||||
| 	.num_resources	= ARRAY_SIZE(rtc_resources), | ||||
| 	.resource	= rtc_resources, | ||||
| }; | ||||
| @ -124,9 +116,6 @@ static struct resource sti_resources[] = { | ||||
| static struct platform_device sti_device = { | ||||
| 	.name		= "sti", | ||||
| 	.id		= -1, | ||||
| 	.dev = { | ||||
| 		.release	= omap_nop_release, | ||||
| 	}, | ||||
| 	.num_resources	= ARRAY_SIZE(sti_resources), | ||||
| 	.resource	= sti_resources, | ||||
| }; | ||||
|  | ||||
| @ -25,10 +25,6 @@ | ||||
| #include <asm/arch/mux.h> | ||||
| #include <asm/arch/gpio.h> | ||||
| 
 | ||||
| extern void omap_nop_release(struct device *dev); | ||||
| 
 | ||||
| /*-------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #if 	defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE) | ||||
| 
 | ||||
| #define OMAP2_I2C_BASE2		0x48072000 | ||||
| @ -49,9 +45,6 @@ static struct resource i2c_resources2[] = { | ||||
| static struct platform_device omap_i2c_device2 = { | ||||
|         .name           = "i2c_omap", | ||||
|         .id             = 2, | ||||
|         .dev = { | ||||
|                 .release        = omap_nop_release, | ||||
|         }, | ||||
| 	.num_resources	= ARRAY_SIZE(i2c_resources2), | ||||
| 	.resource	= i2c_resources2, | ||||
| }; | ||||
| @ -100,9 +93,6 @@ static struct resource sti_resources[] = { | ||||
| static struct platform_device sti_device = { | ||||
| 	.name		= "sti", | ||||
| 	.id		= -1, | ||||
| 	.dev = { | ||||
| 		.release	= omap_nop_release, | ||||
| 	}, | ||||
| 	.num_resources	= ARRAY_SIZE(sti_resources), | ||||
| 	.resource	= sti_resources, | ||||
| }; | ||||
|  | ||||
| @ -196,12 +196,9 @@ static int __init corgi_ssp_probe(struct platform_device *dev) | ||||
| 	int ret; | ||||
| 
 | ||||
| 	/* Chip Select - Disable All */ | ||||
| 	GPDR(ssp_machinfo->cs_lcdcon) |= GPIO_bit(ssp_machinfo->cs_lcdcon); /* output */ | ||||
| 	GPSR(ssp_machinfo->cs_lcdcon) = GPIO_bit(ssp_machinfo->cs_lcdcon);  /* High - Disable LCD Control/Timing Gen */ | ||||
| 	GPDR(ssp_machinfo->cs_max1111) |= GPIO_bit(ssp_machinfo->cs_max1111); /* output */ | ||||
| 	GPSR(ssp_machinfo->cs_max1111) = GPIO_bit(ssp_machinfo->cs_max1111);  /* High - Disable MAX1111*/ | ||||
| 	GPDR(ssp_machinfo->cs_ads7846) |= GPIO_bit(ssp_machinfo->cs_ads7846);  /* output */ | ||||
| 	GPSR(ssp_machinfo->cs_ads7846) = GPIO_bit(ssp_machinfo->cs_ads7846);   /* High - Disable ADS7846*/ | ||||
| 	pxa_gpio_mode(ssp_machinfo->cs_lcdcon  | GPIO_OUT | GPIO_DFLT_HIGH); | ||||
|         pxa_gpio_mode(ssp_machinfo->cs_max1111 | GPIO_OUT | GPIO_DFLT_HIGH); | ||||
|         pxa_gpio_mode(ssp_machinfo->cs_ads7846 | GPIO_OUT | GPIO_DFLT_HIGH); | ||||
| 
 | ||||
| 	ret = ssp_init(&corgi_ssp_dev, ssp_machinfo->port, 0); | ||||
| 
 | ||||
|  | ||||
| @ -367,6 +367,8 @@ static int s3c24xx_clkout_setparent(struct clk *clk, struct clk *parent) | ||||
| 		source = S3C2410_MISCCR_CLK0_UPLL; | ||||
| 	else if (parent == &clk_f) | ||||
| 		source = S3C2410_MISCCR_CLK0_FCLK; | ||||
| 	else if (parent == &clk_h) | ||||
| 		source = S3C2410_MISCCR_CLK0_HCLK; | ||||
| 	else if (parent == &clk_p) | ||||
| 		source = S3C2410_MISCCR_CLK0_PCLK; | ||||
| 	else if (clk == &s3c24xx_clkout0 && parent == &s3c24xx_dclk0) | ||||
| @ -376,6 +378,8 @@ static int s3c24xx_clkout_setparent(struct clk *clk, struct clk *parent) | ||||
| 	else | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	clk->parent = parent; | ||||
| 
 | ||||
| 	if (clk == &s3c24xx_dclk0) | ||||
| 		mask = S3C2410_MISCCR_CLK0_MASK; | ||||
| 	else { | ||||
|  | ||||
| @ -37,6 +37,7 @@ | ||||
| 
 | ||||
| #include <asm/arch/nand.h> | ||||
| 
 | ||||
| #include "common-smdk.h" | ||||
| #include "devs.h" | ||||
| #include "pm.h" | ||||
| 
 | ||||
| @ -49,7 +50,7 @@ static struct mtd_partition smdk_default_nand_part[] = { | ||||
| 		.offset	= 0, | ||||
| 	}, | ||||
| 	[1] = { | ||||
| 		.name	= "S3C2410 flash parition 1", | ||||
| 		.name	= "S3C2410 flash partition 1", | ||||
| 		.offset = 0, | ||||
| 		.size	= SZ_2M, | ||||
| 	}, | ||||
|  | ||||
| @ -139,7 +139,7 @@ static int s3c2440_clk_add(struct sys_device *sysdev) | ||||
| 
 | ||||
| 		clkdivn = __raw_readl(S3C2410_CLKDIVN); | ||||
| 		clkdivn |= S3C2440_CLKDIVN_UCLK; | ||||
| 		__raw_writel(camdivn, S3C2410_CLKDIVN); | ||||
| 		__raw_writel(clkdivn, S3C2410_CLKDIVN); | ||||
| 
 | ||||
| 		mutex_unlock(&clocks_mutex); | ||||
| 	} | ||||
|  | ||||
| @ -10,7 +10,7 @@ | ||||
| #include <linux/config.h> | ||||
| #include <linux/linkage.h> | ||||
| #include <linux/init.h> | ||||
| #include <asm/hardware.h> | ||||
| #include <asm/memory.h> | ||||
| #include <asm/page.h> | ||||
| #include "proc-macros.S" | ||||
| 
 | ||||
| @ -46,6 +46,11 @@ | ||||
|  */ | ||||
| #define CACHE_DLIMIT	(CACHE_DSIZE * 4) | ||||
| 
 | ||||
| 	.data | ||||
| flush_base: | ||||
| 	.long	FLUSH_BASE
 | ||||
| 	.text | ||||
| 
 | ||||
| /* | ||||
|  *	flush_user_cache_all() | ||||
|  * | ||||
| @ -63,11 +68,21 @@ ENTRY(v4wb_flush_kern_cache_all) | ||||
| 	mov	ip, #0 | ||||
| 	mcr	p15, 0, ip, c7, c5, 0		@ invalidate I cache
 | ||||
| __flush_whole_cache: | ||||
| 	mov	r0, #FLUSH_BASE | ||||
| 	add	r1, r0, #CACHE_DSIZE | ||||
| 1:	ldr	r2, [r0], #32 | ||||
| 	cmp	r0, r1 | ||||
| 	ldr	r3, =flush_base | ||||
| 	ldr	r1, [r3, #0] | ||||
| 	eor	r1, r1, #CACHE_DSIZE | ||||
| 	str	r1, [r3, #0] | ||||
| 	add	r2, r1, #CACHE_DSIZE | ||||
| 1:	ldr	r3, [r1], #32 | ||||
| 	cmp	r1, r2 | ||||
| 	blo	1b | ||||
| #ifdef FLUSH_BASE_MINICACHE | ||||
| 	add	r2, r2, #FLUSH_BASE_MINICACHE - FLUSH_BASE | ||||
| 	sub	r1, r2, #512			@ only 512 bytes
 | ||||
| 1:	ldr	r3, [r1], #32 | ||||
| 	cmp	r1, r2 | ||||
| 	blo	1b | ||||
| #endif | ||||
| 	mcr	p15, 0, ip, c7, c10, 4		@ drain write buffer
 | ||||
| 	mov	pc, lr | ||||
| 
 | ||||
| @ -82,6 +97,7 @@ __flush_whole_cache: | ||||
|  *	- flags	- vma_area_struct flags describing address space | ||||
|  */ | ||||
| ENTRY(v4wb_flush_user_cache_range) | ||||
| 	mov	ip, #0 | ||||
| 	sub	r3, r1, r0			@ calculate total size
 | ||||
| 	tst	r2, #VM_EXEC			@ executable region? | ||||
| 	mcrne	p15, 0, ip, c7, c5, 0		@ invalidate I cache
 | ||||
|  | ||||
| @ -20,6 +20,7 @@ | ||||
| 
 | ||||
| #include <asm/mach-types.h> | ||||
| #include <asm/setup.h> | ||||
| #include <asm/sizes.h> | ||||
| #include <asm/tlb.h> | ||||
| 
 | ||||
| #include <asm/mach/arch.h> | ||||
| @ -455,14 +456,14 @@ static void __init devicemaps_init(struct machine_desc *mdesc) | ||||
| #ifdef FLUSH_BASE | ||||
| 	map.pfn = __phys_to_pfn(FLUSH_BASE_PHYS); | ||||
| 	map.virtual = FLUSH_BASE; | ||||
| 	map.length = PGDIR_SIZE; | ||||
| 	map.length = SZ_1M; | ||||
| 	map.type = MT_CACHECLEAN; | ||||
| 	create_mapping(&map); | ||||
| #endif | ||||
| #ifdef FLUSH_BASE_MINICACHE | ||||
| 	map.pfn = __phys_to_pfn(FLUSH_BASE_PHYS + PGDIR_SIZE); | ||||
| 	map.pfn = __phys_to_pfn(FLUSH_BASE_PHYS + SZ_1M); | ||||
| 	map.virtual = FLUSH_BASE_MINICACHE; | ||||
| 	map.length = PGDIR_SIZE; | ||||
| 	map.length = SZ_1M; | ||||
| 	map.type = MT_MINICLEAN; | ||||
| 	create_mapping(&map); | ||||
| #endif | ||||
|  | ||||
| @ -26,22 +26,7 @@ | ||||
|  * the cache line size of the I and D cache | ||||
|  */ | ||||
| #define DCACHELINESIZE	32 | ||||
| #define FLUSH_OFFSET	32768 | ||||
| 
 | ||||
| 	.macro flush_110_dcache	rd, ra, re | ||||
| 	ldr	\rd, =flush_base | ||||
| 	ldr	\ra, [\rd] | ||||
| 	eor	\ra, \ra, #FLUSH_OFFSET | ||||
| 	str	\ra, [\rd] | ||||
| 	add	\re, \ra, #16384		@ only necessary for 16k
 | ||||
| 1001:	ldr	\rd, [\ra], #DCACHELINESIZE | ||||
| 	teq	\re, \ra | ||||
| 	bne	1001b | ||||
| 	.endm | ||||
| 
 | ||||
| 	.data | ||||
| flush_base: | ||||
| 	.long	FLUSH_BASE
 | ||||
| 	.text | ||||
| 
 | ||||
| /* | ||||
| @ -145,13 +130,11 @@ ENTRY(cpu_sa110_dcache_clean_area) | ||||
|  */ | ||||
| 	.align	5
 | ||||
| ENTRY(cpu_sa110_switch_mm) | ||||
| 	flush_110_dcache	r3, ip, r1 | ||||
| 	mov	r1, #0 | ||||
| 	mcr	p15, 0, r1, c7, c5, 0		@ invalidate I cache
 | ||||
| 	mcr	p15, 0, r1, c7, c10, 4		@ drain WB
 | ||||
| 	str	lr, [sp, #-4]! | ||||
| 	bl	v4wb_flush_kern_cache_all	@ clears IP
 | ||||
| 	mcr	p15, 0, r0, c2, c0, 0		@ load page table pointer
 | ||||
| 	mcr	p15, 0, r1, c8, c7, 0		@ invalidate I & D TLBs
 | ||||
| 	mov	pc, lr | ||||
| 	mcr	p15, 0, ip, c8, c7, 0		@ invalidate I & D TLBs
 | ||||
| 	ldr	pc, [sp], #4 | ||||
| 
 | ||||
| /* | ||||
|  * cpu_sa110_set_pte(ptep, pte) | ||||
|  | ||||
| @ -30,30 +30,6 @@ | ||||
|  * the cache line size of the I and D cache | ||||
|  */ | ||||
| #define DCACHELINESIZE	32 | ||||
| #define FLUSH_OFFSET	32768 | ||||
| 
 | ||||
| 	.macro flush_1100_dcache rd, ra, re | ||||
| 	ldr	\rd, =flush_base | ||||
| 	ldr	\ra, [\rd] | ||||
| 	eor	\ra, \ra, #FLUSH_OFFSET | ||||
| 	str	\ra, [\rd] | ||||
| 	add	\re, \ra, #8192			@ only necessary for 8k
 | ||||
| 1001:	ldr	\rd, [\ra], #DCACHELINESIZE | ||||
| 	teq	\re, \ra | ||||
| 	bne	1001b | ||||
| #ifdef FLUSH_BASE_MINICACHE | ||||
| 	add	\ra, \ra, #FLUSH_BASE_MINICACHE - FLUSH_BASE | ||||
| 	add	\re, \ra, #512			@ only 512 bytes
 | ||||
| 1002:	ldr	\rd, [\ra], #DCACHELINESIZE | ||||
| 	teq	\re, \ra | ||||
| 	bne	1002b | ||||
| #endif | ||||
| 	.endm | ||||
| 
 | ||||
| 	.data | ||||
| flush_base: | ||||
| 	.long	FLUSH_BASE
 | ||||
| 	.text | ||||
| 
 | ||||
| 	__INIT | ||||
| 
 | ||||
| @ -79,9 +55,8 @@ ENTRY(cpu_sa1100_proc_fin) | ||||
| 	stmfd	sp!, {lr} | ||||
| 	mov	ip, #PSR_F_BIT | PSR_I_BIT | SVC_MODE | ||||
| 	msr	cpsr_c, ip | ||||
| 	flush_1100_dcache r0, r1, r2		@ clean caches
 | ||||
| 	mov	r0, #0 | ||||
| 	mcr	p15, 0, r0, c15, c2, 2		@ Disable clock switching
 | ||||
| 	bl	v4wb_flush_kern_cache_all | ||||
| 	mcr	p15, 0, ip, c15, c2, 2		@ Disable clock switching
 | ||||
| 	mrc	p15, 0, r0, c1, c0, 0		@ ctrl register
 | ||||
| 	bic	r0, r0, #0x1000			@ ...i............
 | ||||
| 	bic	r0, r0, #0x000e			@ ............wca.
 | ||||
| @ -167,14 +142,12 @@ ENTRY(cpu_sa1100_dcache_clean_area) | ||||
|  */ | ||||
| 	.align	5
 | ||||
| ENTRY(cpu_sa1100_switch_mm) | ||||
| 	flush_1100_dcache r3, ip, r1 | ||||
| 	mov	ip, #0 | ||||
| 	mcr	p15, 0, ip, c7, c5, 0		@ invalidate I cache
 | ||||
| 	str	lr, [sp, #-4]! | ||||
| 	bl	v4wb_flush_kern_cache_all	@ clears IP
 | ||||
| 	mcr	p15, 0, ip, c9, c0, 0		@ invalidate RB
 | ||||
| 	mcr	p15, 0, ip, c7, c10, 4		@ drain WB
 | ||||
| 	mcr	p15, 0, r0, c2, c0, 0		@ load page table pointer
 | ||||
| 	mcr	p15, 0, ip, c8, c7, 0		@ invalidate I & D TLBs
 | ||||
| 	mov	pc, lr | ||||
| 	ldr	pc, [sp], #4 | ||||
| 
 | ||||
| /* | ||||
|  * cpu_sa1100_set_pte(ptep, pte) | ||||
|  | ||||
| @ -58,7 +58,7 @@ struct clk * clk_get(struct device *dev, const char *id) | ||||
| 		if (p->id == idno && | ||||
| 		    strcmp(id, p->name) == 0 && try_module_get(p->owner)) { | ||||
| 			clk = p; | ||||
| 			break; | ||||
| 			goto found; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| @ -69,6 +69,7 @@ struct clk * clk_get(struct device *dev, const char *id) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| found: | ||||
| 	mutex_unlock(&clocks_mutex); | ||||
| 
 | ||||
| 	return clk; | ||||
|  | ||||
| @ -26,14 +26,6 @@ | ||||
| #include <asm/arch/gpio.h> | ||||
| #include <asm/arch/menelaus.h> | ||||
| 
 | ||||
| 
 | ||||
| void omap_nop_release(struct device *dev) | ||||
| { | ||||
|         /* Nothing */ | ||||
| } | ||||
| 
 | ||||
| /*-------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| #if 	defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE) | ||||
| 
 | ||||
| #define	OMAP1_I2C_BASE		0xfffb3800 | ||||
| @ -59,9 +51,6 @@ static struct resource i2c_resources1[] = { | ||||
| static struct platform_device omap_i2c_device1 = { | ||||
|         .name           = "i2c_omap", | ||||
|         .id             = 1, | ||||
|         .dev = { | ||||
|                 .release        = omap_nop_release, | ||||
|         }, | ||||
| 	.num_resources	= ARRAY_SIZE(i2c_resources1), | ||||
| 	.resource	= i2c_resources1, | ||||
| }; | ||||
| @ -187,7 +176,6 @@ static struct platform_device mmc_omap_device1 = { | ||||
| 	.name		= "mmci-omap", | ||||
| 	.id		= 1, | ||||
| 	.dev = { | ||||
| 		.release	= omap_nop_release, | ||||
| 		.dma_mask	= &mmc1_dmamask, | ||||
| 		.platform_data	= &mmc1_conf, | ||||
| 	}, | ||||
| @ -217,7 +205,6 @@ static struct platform_device mmc_omap_device2 = { | ||||
| 	.name		= "mmci-omap", | ||||
| 	.id		= 2, | ||||
| 	.dev = { | ||||
| 		.release	= omap_nop_release, | ||||
| 		.dma_mask	= &mmc2_dmamask, | ||||
| 		.platform_data	= &mmc2_conf, | ||||
| 	}, | ||||
| @ -321,9 +308,6 @@ static struct resource uwire_resources[] = { | ||||
| static struct platform_device omap_uwire_device = { | ||||
| 	.name	   = "omap_uwire", | ||||
| 	.id	     = -1, | ||||
| 	.dev = { | ||||
| 		.release	= omap_nop_release, | ||||
| 	}, | ||||
| 	.num_resources	= ARRAY_SIZE(uwire_resources), | ||||
| 	.resource	= uwire_resources, | ||||
| }; | ||||
| @ -365,9 +349,6 @@ static struct resource wdt_resources[] = { | ||||
| static struct platform_device omap_wdt_device = { | ||||
| 	.name	   = "omap_wdt", | ||||
| 	.id	     = -1, | ||||
| 	.dev = { | ||||
| 		.release	= omap_nop_release, | ||||
| 	}, | ||||
| 	.num_resources	= ARRAY_SIZE(wdt_resources), | ||||
| 	.resource	= wdt_resources, | ||||
| }; | ||||
| @ -401,9 +382,6 @@ static struct resource rng_resources[] = { | ||||
| static struct platform_device omap_rng_device = { | ||||
| 	.name	   = "omap_rng", | ||||
| 	.id	     = -1, | ||||
| 	.dev = { | ||||
| 		.release	= omap_nop_release, | ||||
| 	}, | ||||
| 	.num_resources	= ARRAY_SIZE(rng_resources), | ||||
| 	.resource	= rng_resources, | ||||
| }; | ||||
|  | ||||
| @ -588,6 +588,7 @@ static u32 vfp_double_ftosi(int sd, int unused, int dm, u32 fpscr) | ||||
| 	struct vfp_double vdm; | ||||
| 	u32 d, exceptions = 0; | ||||
| 	int rmode = fpscr & FPSCR_RMODE_MASK; | ||||
| 	int tm; | ||||
| 
 | ||||
| 	vfp_double_unpack(&vdm, vfp_get_double(dm)); | ||||
| 	vfp_double_dump("VDM", &vdm); | ||||
| @ -595,10 +596,14 @@ static u32 vfp_double_ftosi(int sd, int unused, int dm, u32 fpscr) | ||||
| 	/*
 | ||||
| 	 * Do we have denormalised number? | ||||
| 	 */ | ||||
| 	if (vfp_double_type(&vdm) & VFP_DENORMAL) | ||||
| 	tm = vfp_double_type(&vdm); | ||||
| 	if (tm & VFP_DENORMAL) | ||||
| 		exceptions |= FPSCR_IDC; | ||||
| 
 | ||||
| 	if (vdm.exponent >= 1023 + 32) { | ||||
| 	if (tm & VFP_NAN) { | ||||
| 		d = 0; | ||||
| 		exceptions |= FPSCR_IOC; | ||||
| 	} else if (vdm.exponent >= 1023 + 32) { | ||||
| 		d = 0x7fffffff; | ||||
| 		if (vdm.sign) | ||||
| 			d = ~d; | ||||
| @ -1122,9 +1127,9 @@ u32 vfp_double_cpdo(u32 inst, u32 fpscr) | ||||
| { | ||||
| 	u32 op = inst & FOP_MASK; | ||||
| 	u32 exceptions = 0; | ||||
| 	unsigned int dd = vfp_get_sd(inst); | ||||
| 	unsigned int dn = vfp_get_sn(inst); | ||||
| 	unsigned int dm = vfp_get_sm(inst); | ||||
| 	unsigned int dd = vfp_get_dd(inst); | ||||
| 	unsigned int dn = vfp_get_dn(inst); | ||||
| 	unsigned int dm = vfp_get_dm(inst); | ||||
| 	unsigned int vecitr, veclen, vecstride; | ||||
| 	u32 (*fop)(int, int, s32, u32); | ||||
| 
 | ||||
| @ -1141,7 +1146,7 @@ u32 vfp_double_cpdo(u32 inst, u32 fpscr) | ||||
| 	pr_debug("VFP: vecstride=%u veclen=%u\n", vecstride, | ||||
| 		 (veclen >> FPSCR_LENGTH_BIT) + 1); | ||||
| 
 | ||||
| 	fop = (op == FOP_EXT) ? fop_extfns[dn] : fop_fns[FOP_TO_IDX(op)]; | ||||
| 	fop = (op == FOP_EXT) ? fop_extfns[FEXT_TO_IDX(inst)] : fop_fns[FOP_TO_IDX(op)]; | ||||
| 	if (!fop) | ||||
| 		goto invalid; | ||||
| 
 | ||||
| @ -1149,17 +1154,13 @@ u32 vfp_double_cpdo(u32 inst, u32 fpscr) | ||||
| 		u32 except; | ||||
| 
 | ||||
| 		if (op == FOP_EXT) | ||||
| 			pr_debug("VFP: itr%d (d%u.%u) = op[%u] (d%u.%u)\n", | ||||
| 			pr_debug("VFP: itr%d (d%u) = op[%u] (d%u)\n", | ||||
| 				 vecitr >> FPSCR_LENGTH_BIT, | ||||
| 				 dd >> 1, dd & 1, dn, | ||||
| 				 dm >> 1, dm & 1); | ||||
| 				 dd, dn, dm); | ||||
| 		else | ||||
| 			pr_debug("VFP: itr%d (d%u.%u) = (d%u.%u) op[%u] (d%u.%u)\n", | ||||
| 			pr_debug("VFP: itr%d (d%u) = (d%u) op[%u] (d%u)\n", | ||||
| 				 vecitr >> FPSCR_LENGTH_BIT, | ||||
| 				 dd >> 1, dd & 1, | ||||
| 				 dn >> 1, dn & 1, | ||||
| 				 FOP_TO_IDX(op), | ||||
| 				 dm >> 1, dm & 1); | ||||
| 				 dd, dn, FOP_TO_IDX(op), dm); | ||||
| 
 | ||||
| 		except = fop(dd, dn, dm, fpscr); | ||||
| 		pr_debug("VFP: itr%d: exceptions=%08x\n", | ||||
|  | ||||
| @ -189,11 +189,10 @@ vfp_put_float: | ||||
| 
 | ||||
| 	.globl	vfp_get_double
 | ||||
| vfp_get_double: | ||||
| 	mov	r0, r0, lsr #1 | ||||
| 	add	pc, pc, r0, lsl #3 | ||||
| 	mov	r0, r0 | ||||
| 	.irp	dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 | ||||
| 	mrrc	p10, 1, r0, r1, c\dr	@ fmrrd	r0, r1, d\dr
 | ||||
| 	mrrc	p11, 1, r0, r1, c\dr	@ fmrrd	r0, r1, d\dr
 | ||||
| 	mov	pc, lr | ||||
| 	.endr | ||||
| 
 | ||||
| @ -204,10 +203,9 @@ vfp_get_double: | ||||
| 
 | ||||
| 	.globl	vfp_put_double
 | ||||
| vfp_put_double: | ||||
| 	mov	r0, r0, lsr #1 | ||||
| 	add	pc, pc, r0, lsl #3 | ||||
| 	mov	r0, r0 | ||||
| 	.irp	dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 | ||||
| 	mcrr	p10, 1, r1, r2, c\dr	@ fmrrd	r1, r2, d\dr
 | ||||
| 	mcrr	p11, 1, r1, r2, c\dr	@ fmdrr	r1, r2, d\dr
 | ||||
| 	mov	pc, lr | ||||
| 	.endr | ||||
|  | ||||
| @ -632,6 +632,7 @@ static u32 vfp_single_ftosi(int sd, int unused, s32 m, u32 fpscr) | ||||
| 	struct vfp_single vsm; | ||||
| 	u32 d, exceptions = 0; | ||||
| 	int rmode = fpscr & FPSCR_RMODE_MASK; | ||||
| 	int tm; | ||||
| 
 | ||||
| 	vfp_single_unpack(&vsm, m); | ||||
| 	vfp_single_dump("VSM", &vsm); | ||||
| @ -639,10 +640,14 @@ static u32 vfp_single_ftosi(int sd, int unused, s32 m, u32 fpscr) | ||||
| 	/*
 | ||||
| 	 * Do we have a denormalised number? | ||||
| 	 */ | ||||
| 	tm = vfp_single_type(&vsm); | ||||
| 	if (vfp_single_type(&vsm) & VFP_DENORMAL) | ||||
| 		exceptions |= FPSCR_IDC; | ||||
| 
 | ||||
| 	if (vsm.exponent >= 127 + 32) { | ||||
| 	if (tm & VFP_NAN) { | ||||
| 		d = 0; | ||||
| 		exceptions |= FPSCR_IOC; | ||||
| 	} else if (vsm.exponent >= 127 + 32) { | ||||
| 		/*
 | ||||
| 		 * m >= 2^31-2^7: invalid | ||||
| 		 */ | ||||
| @ -1188,7 +1193,7 @@ u32 vfp_single_cpdo(u32 inst, u32 fpscr) | ||||
| 	pr_debug("VFP: vecstride=%u veclen=%u\n", vecstride, | ||||
| 		 (veclen >> FPSCR_LENGTH_BIT) + 1); | ||||
| 
 | ||||
| 	fop = (op == FOP_EXT) ? fop_extfns[sn] : fop_fns[FOP_TO_IDX(op)]; | ||||
| 	fop = (op == FOP_EXT) ? fop_extfns[FEXT_TO_IDX(inst)] : fop_fns[FOP_TO_IDX(op)]; | ||||
| 	if (!fop) | ||||
| 		goto invalid; | ||||
| 
 | ||||
|  | ||||
| @ -152,7 +152,6 @@ EXPORT_SYMBOL(strncmp); | ||||
| EXPORT_SYMBOL(strchr); | ||||
| EXPORT_SYMBOL(strlen); | ||||
| EXPORT_SYMBOL(strnlen); | ||||
| EXPORT_SYMBOL(strpbrk); | ||||
| EXPORT_SYMBOL(strrchr); | ||||
| EXPORT_SYMBOL(strstr); | ||||
| EXPORT_SYMBOL(memset); | ||||
|  | ||||
| @ -39,7 +39,6 @@ EXPORT_SYMBOL(loops_per_usec); | ||||
| /* String functions */ | ||||
| EXPORT_SYMBOL(memcmp); | ||||
| EXPORT_SYMBOL(memmove); | ||||
| EXPORT_SYMBOL(strpbrk); | ||||
| EXPORT_SYMBOL(strstr); | ||||
| EXPORT_SYMBOL(strcpy); | ||||
| EXPORT_SYMBOL(strchr); | ||||
|  | ||||
| @ -1170,12 +1170,6 @@ __syscall_badsys: | ||||
| # syscall vector table | ||||
| # | ||||
| ############################################################################### | ||||
| #ifdef CONFIG_MMU | ||||
| #define __MMU(X) X | ||||
| #else | ||||
| #define __MMU(X) sys_ni_syscall | ||||
| #endif | ||||
| 
 | ||||
| 	.section .rodata | ||||
| ALIGN | ||||
| 	.globl		sys_call_table
 | ||||
| @ -1305,7 +1299,7 @@ sys_call_table: | ||||
| 	.long sys_newuname
 | ||||
| 	.long sys_ni_syscall	/* old "cacheflush" */ | ||||
| 	.long sys_adjtimex
 | ||||
| 	.long __MMU(sys_mprotect) /* 125 */ | ||||
| 	.long sys_mprotect	/* 125 */ | ||||
| 	.long sys_sigprocmask
 | ||||
| 	.long sys_ni_syscall	/* old "create_module" */ | ||||
| 	.long sys_init_module
 | ||||
| @ -1324,16 +1318,16 @@ sys_call_table: | ||||
| 	.long sys_getdents
 | ||||
| 	.long sys_select
 | ||||
| 	.long sys_flock
 | ||||
| 	.long __MMU(sys_msync) | ||||
| 	.long sys_msync
 | ||||
| 	.long sys_readv		/* 145 */ | ||||
| 	.long sys_writev
 | ||||
| 	.long sys_getsid
 | ||||
| 	.long sys_fdatasync
 | ||||
| 	.long sys_sysctl
 | ||||
| 	.long __MMU(sys_mlock)		/* 150 */ | ||||
| 	.long __MMU(sys_munlock) | ||||
| 	.long __MMU(sys_mlockall) | ||||
| 	.long __MMU(sys_munlockall) | ||||
| 	.long sys_mlock		/* 150 */ | ||||
| 	.long sys_munlock
 | ||||
| 	.long sys_mlockall
 | ||||
| 	.long sys_munlockall
 | ||||
| 	.long sys_sched_setparam
 | ||||
| 	.long sys_sched_getparam   /* 155 */ | ||||
| 	.long sys_sched_setscheduler
 | ||||
| @ -1343,7 +1337,7 @@ sys_call_table: | ||||
| 	.long sys_sched_get_priority_min  /* 160 */ | ||||
| 	.long sys_sched_rr_get_interval
 | ||||
| 	.long sys_nanosleep
 | ||||
| 	.long __MMU(sys_mremap) | ||||
| 	.long sys_mremap
 | ||||
| 	.long sys_setresuid16
 | ||||
| 	.long sys_getresuid16	/* 165 */ | ||||
| 	.long sys_ni_syscall	/* for vm86 */ | ||||
| @ -1398,8 +1392,8 @@ sys_call_table: | ||||
| 	.long sys_setfsuid		/* 215 */ | ||||
| 	.long sys_setfsgid
 | ||||
| 	.long sys_pivot_root
 | ||||
| 	.long __MMU(sys_mincore) | ||||
| 	.long __MMU(sys_madvise) | ||||
| 	.long sys_mincore
 | ||||
| 	.long sys_madvise
 | ||||
| 	.long sys_getdents64	/* 220 */ | ||||
| 	.long sys_fcntl64
 | ||||
| 	.long sys_ni_syscall	/* reserved for TUX */ | ||||
| @ -1437,7 +1431,7 @@ sys_call_table: | ||||
| 	.long sys_epoll_create
 | ||||
| 	.long sys_epoll_ctl	/* 255 */ | ||||
| 	.long sys_epoll_wait
 | ||||
|  	.long __MMU(sys_remap_file_pages) | ||||
|  	.long sys_remap_file_pages
 | ||||
|  	.long sys_set_tid_address
 | ||||
|  	.long sys_timer_create
 | ||||
|  	.long sys_timer_settime		/* 260 */ | ||||
|  | ||||
| @ -27,7 +27,6 @@ EXPORT_SYMBOL(__ioremap); | ||||
| EXPORT_SYMBOL(iounmap); | ||||
| 
 | ||||
| EXPORT_SYMBOL(strnlen); | ||||
| EXPORT_SYMBOL(strpbrk); | ||||
| EXPORT_SYMBOL(strrchr); | ||||
| EXPORT_SYMBOL(strstr); | ||||
| EXPORT_SYMBOL(strchr); | ||||
|  | ||||
| @ -25,7 +25,6 @@ extern char h8300_debug_device[]; | ||||
| /* platform dependent support */ | ||||
| 
 | ||||
| EXPORT_SYMBOL(strnlen); | ||||
| EXPORT_SYMBOL(strpbrk); | ||||
| EXPORT_SYMBOL(strrchr); | ||||
| EXPORT_SYMBOL(strstr); | ||||
| EXPORT_SYMBOL(strchr); | ||||
|  | ||||
| @ -53,6 +53,35 @@ source "init/Kconfig" | ||||
| 
 | ||||
| menu "Processor type and features" | ||||
| 
 | ||||
| config SMP | ||||
| 	bool "Symmetric multi-processing support" | ||||
| 	---help--- | ||||
| 	  This enables support for systems with more than one CPU. If you have | ||||
| 	  a system with only one CPU, like most personal computers, say N. If | ||||
| 	  you have a system with more than one CPU, say Y. | ||||
| 
 | ||||
| 	  If you say N here, the kernel will run on single and multiprocessor | ||||
| 	  machines, but will use only one CPU of a multiprocessor machine. If | ||||
| 	  you say Y here, the kernel will run on many, but not all, | ||||
| 	  singleprocessor machines. On a singleprocessor machine, the kernel | ||||
| 	  will run faster if you say N here. | ||||
| 
 | ||||
| 	  Note that if you say Y here and choose architecture "586" or | ||||
| 	  "Pentium" under "Processor family", the kernel will not work on 486 | ||||
| 	  architectures. Similarly, multiprocessor kernels for the "PPro" | ||||
| 	  architecture may not work on all Pentium based boards. | ||||
| 
 | ||||
| 	  People using multiprocessor machines who say Y here should also say | ||||
| 	  Y to "Enhanced Real Time Clock Support", below. The "Advanced Power | ||||
| 	  Management" code will be disabled if you say Y here. | ||||
| 
 | ||||
| 	  See also the <file:Documentation/smp.txt>, | ||||
| 	  <file:Documentation/i386/IO-APIC.txt>, | ||||
| 	  <file:Documentation/nmi_watchdog.txt> and the SMP-HOWTO available at | ||||
| 	  <http://www.tldp.org/docs.html#howto>. | ||||
| 
 | ||||
| 	  If you don't know what to do here, say N. | ||||
| 
 | ||||
| choice | ||||
| 	prompt "Subarchitecture Type" | ||||
| 	default X86_PC | ||||
| @ -178,35 +207,6 @@ config HPET_EMULATE_RTC | ||||
| 	depends on HPET_TIMER && RTC=y | ||||
| 	default y | ||||
| 
 | ||||
| config SMP | ||||
| 	bool "Symmetric multi-processing support" | ||||
| 	---help--- | ||||
| 	  This enables support for systems with more than one CPU. If you have | ||||
| 	  a system with only one CPU, like most personal computers, say N. If | ||||
| 	  you have a system with more than one CPU, say Y. | ||||
| 
 | ||||
| 	  If you say N here, the kernel will run on single and multiprocessor | ||||
| 	  machines, but will use only one CPU of a multiprocessor machine. If | ||||
| 	  you say Y here, the kernel will run on many, but not all, | ||||
| 	  singleprocessor machines. On a singleprocessor machine, the kernel | ||||
| 	  will run faster if you say N here. | ||||
| 
 | ||||
| 	  Note that if you say Y here and choose architecture "586" or | ||||
| 	  "Pentium" under "Processor family", the kernel will not work on 486 | ||||
| 	  architectures. Similarly, multiprocessor kernels for the "PPro" | ||||
| 	  architecture may not work on all Pentium based boards. | ||||
| 
 | ||||
| 	  People using multiprocessor machines who say Y here should also say | ||||
| 	  Y to "Enhanced Real Time Clock Support", below. The "Advanced Power | ||||
| 	  Management" code will be disabled if you say Y here. | ||||
| 
 | ||||
| 	  See also the <file:Documentation/smp.txt>, | ||||
| 	  <file:Documentation/i386/IO-APIC.txt>, | ||||
| 	  <file:Documentation/nmi_watchdog.txt> and the SMP-HOWTO available at | ||||
| 	  <http://www.tldp.org/docs.html#howto>. | ||||
| 
 | ||||
| 	  If you don't know what to do here, say N. | ||||
| 
 | ||||
| config NR_CPUS | ||||
| 	int "Maximum number of CPUs (2-255)" | ||||
| 	range 2 255 | ||||
| @ -522,6 +522,12 @@ config NUMA | ||||
| comment "NUMA (Summit) requires SMP, 64GB highmem support, ACPI" | ||||
| 	depends on X86_SUMMIT && (!HIGHMEM64G || !ACPI) | ||||
| 
 | ||||
| config NODES_SHIFT | ||||
| 	int | ||||
| 	default "4" if X86_NUMAQ | ||||
| 	default "3" | ||||
| 	depends on NEED_MULTIPLE_NODES | ||||
| 
 | ||||
| config HAVE_ARCH_BOOTMEM_NODE | ||||
| 	bool | ||||
| 	depends on NUMA | ||||
| @ -757,15 +763,6 @@ config HOTPLUG_CPU | ||||
| 
 | ||||
| 	  Say N. | ||||
| 
 | ||||
| config DOUBLEFAULT | ||||
| 	default y | ||||
| 	bool "Enable doublefault exception handler" if EMBEDDED | ||||
| 	help | ||||
|           This option allows trapping of rare doublefault exceptions that | ||||
|           would otherwise cause a system to silently reboot. Disabling this | ||||
|           option saves about 4k and might cause you much additional grey | ||||
|           hair. | ||||
| 
 | ||||
| endmenu | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -311,5 +311,5 @@ config X86_OOSTORE | ||||
| 
 | ||||
| config X86_TSC | ||||
| 	bool | ||||
| 	depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MGEODEGX1) && !X86_NUMAQ | ||||
| 	depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MGEODEGX1 || MGEODE_LX) && !X86_NUMAQ | ||||
| 	default y | ||||
|  | ||||
| @ -81,4 +81,13 @@ config X86_MPPARSE | ||||
| 	depends on X86_LOCAL_APIC && !X86_VISWS | ||||
| 	default y | ||||
| 
 | ||||
| config DOUBLEFAULT | ||||
| 	default y | ||||
| 	bool "Enable doublefault exception handler" if EMBEDDED | ||||
| 	help | ||||
|           This option allows trapping of rare doublefault exceptions that | ||||
|           would otherwise cause a system to silently reboot. Disabling this | ||||
|           option saves about 4k and might cause you much additional grey | ||||
|           hair. | ||||
| 
 | ||||
| endmenu | ||||
|  | ||||
| @ -97,6 +97,7 @@ | ||||
| #define PARAM_VESAPM_OFF	0x30 | ||||
| #define PARAM_LFB_PAGES		0x32 | ||||
| #define PARAM_VESA_ATTRIB	0x34 | ||||
| #define PARAM_CAPABILITIES	0x36 | ||||
| 
 | ||||
| /* Define DO_STORE according to CONFIG_VIDEO_RETAIN */ | ||||
| #ifdef CONFIG_VIDEO_RETAIN | ||||
| @ -233,6 +234,10 @@ mopar_gr: | ||||
| 	movw	18(%di), %ax | ||||
| 	movl	%eax, %fs:(PARAM_LFB_SIZE) | ||||
| 
 | ||||
| # store mode capabilities | ||||
| 	movl 10(%di), %eax | ||||
| 	movl %eax, %fs:(PARAM_CAPABILITIES) | ||||
| 
 | ||||
| # switching the DAC to 8-bit is for <= 8 bpp only | ||||
| 	movw	%fs:(PARAM_LFB_DEPTH), %ax | ||||
| 	cmpw	$8, %ax | ||||
|  | ||||
| @ -6,7 +6,7 @@ extra-y := head.o init_task.o vmlinux.lds | ||||
| 
 | ||||
| obj-y	:= process.o semaphore.o signal.o entry.o traps.o irq.o \
 | ||||
| 		ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_i386.o \
 | ||||
| 		pci-dma.o i386_ksyms.o i387.o dmi_scan.o bootflag.o \
 | ||||
| 		pci-dma.o i386_ksyms.o i387.o bootflag.o \
 | ||||
| 		quirks.o i8237.o topology.o alternative.o | ||||
| 
 | ||||
| obj-y				+= cpu/ | ||||
|  | ||||
| @ -215,7 +215,7 @@ static int __init acpi_parse_madt(unsigned long phys_addr, unsigned long size) | ||||
| { | ||||
| 	struct acpi_table_madt *madt = NULL; | ||||
| 
 | ||||
| 	if (!phys_addr || !size) | ||||
| 	if (!phys_addr || !size || !cpu_has_apic) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	madt = (struct acpi_table_madt *)__acpi_map_table(phys_addr, size); | ||||
| @ -693,6 +693,9 @@ static int __init acpi_parse_madt_lapic_entries(void) | ||||
| { | ||||
| 	int count; | ||||
| 
 | ||||
| 	if (!cpu_has_apic) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	/* 
 | ||||
| 	 * Note that the LAPIC address is obtained from the MADT (32-bit value) | ||||
| 	 * and (optionally) overriden by a LAPIC_ADDR_OVR entry (64-bit value). | ||||
| @ -751,6 +754,9 @@ static int __init acpi_parse_madt_ioapic_entries(void) | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 
 | ||||
| 	if (!cpu_has_apic) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * if "noapic" boot option, don't look for IO-APICs | ||||
| 	 */ | ||||
| @ -1096,6 +1102,9 @@ int __init acpi_boot_table_init(void) | ||||
| 	dmi_check_system(acpi_dmi_table); | ||||
| #endif | ||||
| 
 | ||||
| 	if (!cpu_has_apic) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * If acpi_disabled, bail out | ||||
| 	 * One exception: acpi=ht continues far enough to enumerate LAPICs | ||||
|  | ||||
| @ -62,6 +62,18 @@ int apic_verbosity; | ||||
| 
 | ||||
| static void apic_pm_activate(void); | ||||
| 
 | ||||
| int modern_apic(void) | ||||
| { | ||||
| 	unsigned int lvr, version; | ||||
| 	/* AMD systems use old APIC versions, so check the CPU */ | ||||
| 	if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD && | ||||
| 		boot_cpu_data.x86 >= 0xf) | ||||
| 		return 1; | ||||
| 	lvr = apic_read(APIC_LVR); | ||||
| 	version = GET_APIC_VERSION(lvr); | ||||
| 	return version >= 0x14; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * 'what should we do if we get a hw irq event on an illegal vector'. | ||||
|  * each architecture has to answer this themselves. | ||||
| @ -119,10 +131,7 @@ void enable_NMI_through_LVT0 (void * dummy) | ||||
| 
 | ||||
| int get_physical_broadcast(void) | ||||
| { | ||||
| 	unsigned int lvr, version; | ||||
| 	lvr = apic_read(APIC_LVR); | ||||
| 	version = GET_APIC_VERSION(lvr); | ||||
| 	if (!APIC_INTEGRATED(version) || version >= 0x14) | ||||
| 	if (modern_apic()) | ||||
| 		return 0xff; | ||||
| 	else | ||||
| 		return 0xf; | ||||
| @ -349,9 +358,9 @@ int __init verify_local_APIC(void) | ||||
| 
 | ||||
| void __init sync_Arb_IDs(void) | ||||
| { | ||||
| 	/* Unsupported on P4 - see Intel Dev. Manual Vol. 3, Ch. 8.6.1 */ | ||||
| 	unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR)); | ||||
| 	if (ver >= 0x14)	/* P4 or higher */ | ||||
| 	/* Unsupported on P4 - see Intel Dev. Manual Vol. 3, Ch. 8.6.1
 | ||||
| 	   And not needed on AMD */ | ||||
| 	if (modern_apic()) | ||||
| 		return; | ||||
| 	/*
 | ||||
| 	 * Wait for idle. | ||||
|  | ||||
| @ -1079,7 +1079,7 @@ static int apm_console_blank(int blank) | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	if (error == APM_NOT_ENGAGED && state != APM_STATE_READY) { | ||||
| 	if (error == APM_NOT_ENGAGED) { | ||||
| 		static int tried; | ||||
| 		int eng_error; | ||||
| 		if (tried++ == 0) { | ||||
|  | ||||
| @ -207,13 +207,13 @@ static void __init init_amd(struct cpuinfo_x86 *c) | ||||
| 		set_bit(X86_FEATURE_K7, c->x86_capability);  | ||||
| 		break; | ||||
| 	} | ||||
| 	if (c->x86 >= 6) | ||||
| 		set_bit(X86_FEATURE_FXSAVE_LEAK, c->x86_capability); | ||||
| 
 | ||||
| 	display_cacheinfo(c); | ||||
| 
 | ||||
| 	if (cpuid_eax(0x80000000) >= 0x80000008) { | ||||
| 		c->x86_max_cores = (cpuid_ecx(0x80000008) & 0xff) + 1; | ||||
| 		if (c->x86_max_cores & (c->x86_max_cores - 1)) | ||||
| 			c->x86_max_cores = 1; | ||||
| 	} | ||||
| 
 | ||||
| 	if (cpuid_eax(0x80000000) >= 0x80000007) { | ||||
|  | ||||
| @ -46,7 +46,7 @@ | ||||
| 
 | ||||
| #define PFX "powernow-k8: " | ||||
| #define BFX PFX "BIOS error: " | ||||
| #define VERSION "version 1.60.1" | ||||
| #define VERSION "version 1.60.2" | ||||
| #include "powernow-k8.h" | ||||
| 
 | ||||
| /* serialize freq changes  */ | ||||
| @ -55,7 +55,7 @@ static DEFINE_MUTEX(fidvid_mutex); | ||||
| static struct powernow_k8_data *powernow_data[NR_CPUS]; | ||||
| 
 | ||||
| #ifndef CONFIG_SMP | ||||
| static cpumask_t cpu_core_map[1] = { CPU_MASK_ALL }; | ||||
| static cpumask_t cpu_core_map[1]; | ||||
| #endif | ||||
| 
 | ||||
| /* Return a frequency in MHz, given an input fid */ | ||||
| @ -905,11 +905,17 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi | ||||
| { | ||||
| 	cpumask_t oldmask = CPU_MASK_ALL; | ||||
| 	struct powernow_k8_data *data = powernow_data[pol->cpu]; | ||||
| 	u32 checkfid = data->currfid; | ||||
| 	u32 checkvid = data->currvid; | ||||
| 	u32 checkfid; | ||||
| 	u32 checkvid; | ||||
| 	unsigned int newstate; | ||||
| 	int ret = -EIO; | ||||
| 
 | ||||
| 	if (!data) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	checkfid = data->currfid; | ||||
| 	checkvid = data->currvid; | ||||
| 
 | ||||
| 	/* only run on specific CPU from here on */ | ||||
| 	oldmask = current->cpus_allowed; | ||||
| 	set_cpus_allowed(current, cpumask_of_cpu(pol->cpu)); | ||||
| @ -969,6 +975,9 @@ static int powernowk8_verify(struct cpufreq_policy *pol) | ||||
| { | ||||
| 	struct powernow_k8_data *data = powernow_data[pol->cpu]; | ||||
| 
 | ||||
| 	if (!data) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	return cpufreq_frequency_table_verify(pol, data->powernow_table); | ||||
| } | ||||
| 
 | ||||
| @ -977,7 +986,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) | ||||
| { | ||||
| 	struct powernow_k8_data *data; | ||||
| 	cpumask_t oldmask = CPU_MASK_ALL; | ||||
| 	int rc, i; | ||||
| 	int rc; | ||||
| 
 | ||||
| 	if (!cpu_online(pol->cpu)) | ||||
| 		return -ENODEV; | ||||
| @ -1063,8 +1072,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) | ||||
| 	printk("cpu_init done, current fid 0x%x, vid 0x%x\n", | ||||
| 	       data->currfid, data->currvid); | ||||
| 
 | ||||
| 	for_each_cpu_mask(i, cpu_core_map[pol->cpu]) | ||||
| 		powernow_data[i] = data; | ||||
| 	powernow_data[pol->cpu] = data; | ||||
| 
 | ||||
| 	return 0; | ||||
| 
 | ||||
|  | ||||
| @ -168,7 +168,7 @@ static int cpuid_class_device_create(int i) | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
| static int __devinit cpuid_class_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) | ||||
| static int cpuid_class_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) | ||||
| { | ||||
| 	unsigned int cpu = (unsigned long)hcpu; | ||||
| 
 | ||||
|  | ||||
| @ -19,7 +19,6 @@ EXPORT_SYMBOL(__put_user_2); | ||||
| EXPORT_SYMBOL(__put_user_4); | ||||
| EXPORT_SYMBOL(__put_user_8); | ||||
| 
 | ||||
| EXPORT_SYMBOL(strpbrk); | ||||
| EXPORT_SYMBOL(strstr); | ||||
| 
 | ||||
| #ifdef CONFIG_SMP | ||||
|  | ||||
| @ -43,7 +43,7 @@ DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL; | ||||
| DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk); | ||||
| 
 | ||||
| /* insert a jmp code */ | ||||
| static inline void set_jmp_op(void *from, void *to) | ||||
| static __always_inline void set_jmp_op(void *from, void *to) | ||||
| { | ||||
| 	struct __arch_jmp_op { | ||||
| 		char op; | ||||
| @ -57,7 +57,7 @@ static inline void set_jmp_op(void *from, void *to) | ||||
| /*
 | ||||
|  * returns non-zero if opcodes can be boosted. | ||||
|  */ | ||||
| static inline int can_boost(kprobe_opcode_t opcode) | ||||
| static __always_inline int can_boost(kprobe_opcode_t opcode) | ||||
| { | ||||
| 	switch (opcode & 0xf0 ) { | ||||
| 	case 0x70: | ||||
| @ -88,7 +88,7 @@ static inline int can_boost(kprobe_opcode_t opcode) | ||||
| /*
 | ||||
|  * returns non-zero if opcode modifies the interrupt flag. | ||||
|  */ | ||||
| static inline int is_IF_modifier(kprobe_opcode_t opcode) | ||||
| static int __kprobes is_IF_modifier(kprobe_opcode_t opcode) | ||||
| { | ||||
| 	switch (opcode) { | ||||
| 	case 0xfa:		/* cli */ | ||||
| @ -138,7 +138,7 @@ void __kprobes arch_remove_kprobe(struct kprobe *p) | ||||
| 	mutex_unlock(&kprobe_mutex); | ||||
| } | ||||
| 
 | ||||
| static inline void save_previous_kprobe(struct kprobe_ctlblk *kcb) | ||||
| static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb) | ||||
| { | ||||
| 	kcb->prev_kprobe.kp = kprobe_running(); | ||||
| 	kcb->prev_kprobe.status = kcb->kprobe_status; | ||||
| @ -146,7 +146,7 @@ static inline void save_previous_kprobe(struct kprobe_ctlblk *kcb) | ||||
| 	kcb->prev_kprobe.saved_eflags = kcb->kprobe_saved_eflags; | ||||
| } | ||||
| 
 | ||||
| static inline void restore_previous_kprobe(struct kprobe_ctlblk *kcb) | ||||
| static void __kprobes restore_previous_kprobe(struct kprobe_ctlblk *kcb) | ||||
| { | ||||
| 	__get_cpu_var(current_kprobe) = kcb->prev_kprobe.kp; | ||||
| 	kcb->kprobe_status = kcb->prev_kprobe.status; | ||||
| @ -154,7 +154,7 @@ static inline void restore_previous_kprobe(struct kprobe_ctlblk *kcb) | ||||
| 	kcb->kprobe_saved_eflags = kcb->prev_kprobe.saved_eflags; | ||||
| } | ||||
| 
 | ||||
| static inline void set_current_kprobe(struct kprobe *p, struct pt_regs *regs, | ||||
| static void __kprobes set_current_kprobe(struct kprobe *p, struct pt_regs *regs, | ||||
| 				struct kprobe_ctlblk *kcb) | ||||
| { | ||||
| 	__get_cpu_var(current_kprobe) = p; | ||||
| @ -164,7 +164,7 @@ static inline void set_current_kprobe(struct kprobe *p, struct pt_regs *regs, | ||||
| 		kcb->kprobe_saved_eflags &= ~IF_MASK; | ||||
| } | ||||
| 
 | ||||
| static inline void prepare_singlestep(struct kprobe *p, struct pt_regs *regs) | ||||
| static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs) | ||||
| { | ||||
| 	regs->eflags |= TF_MASK; | ||||
| 	regs->eflags &= ~IF_MASK; | ||||
| @ -507,7 +507,7 @@ no_change: | ||||
|  * Interrupts are disabled on entry as trap1 is an interrupt gate and they | ||||
|  * remain disabled thoroughout this function. | ||||
|  */ | ||||
| static inline int post_kprobe_handler(struct pt_regs *regs) | ||||
| static int __kprobes post_kprobe_handler(struct pt_regs *regs) | ||||
| { | ||||
| 	struct kprobe *cur = kprobe_running(); | ||||
| 	struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | ||||
| @ -543,7 +543,7 @@ out: | ||||
| 	return 1; | ||||
| } | ||||
| 
 | ||||
| static inline int kprobe_fault_handler(struct pt_regs *regs, int trapnr) | ||||
| static int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr) | ||||
| { | ||||
| 	struct kprobe *cur = kprobe_running(); | ||||
| 	struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | ||||
|  | ||||
| @ -38,12 +38,6 @@ | ||||
| int smp_found_config; | ||||
| unsigned int __initdata maxcpus = NR_CPUS; | ||||
| 
 | ||||
| #ifdef CONFIG_HOTPLUG_CPU | ||||
| #define CPU_HOTPLUG_ENABLED	(1) | ||||
| #else | ||||
| #define CPU_HOTPLUG_ENABLED	(0) | ||||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
|  * Various Linux-internal data structures created from the | ||||
|  * MP-table. | ||||
| @ -110,21 +104,6 @@ static int __init mpf_checksum(unsigned char *mp, int len) | ||||
| static int mpc_record;  | ||||
| static struct mpc_config_translation *translation_table[MAX_MPC_ENTRY] __initdata; | ||||
| 
 | ||||
| #ifdef CONFIG_X86_NUMAQ | ||||
| static int MP_valid_apicid(int apicid, int version) | ||||
| { | ||||
| 	return hweight_long(apicid & 0xf) == 1 && (apicid >> 4) != 0xf; | ||||
| } | ||||
| #else | ||||
| static int MP_valid_apicid(int apicid, int version) | ||||
| { | ||||
| 	if (version >= 0x14) | ||||
| 		return apicid < 0xff; | ||||
| 	else | ||||
| 		return apicid < 0xf; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| static void __devinit MP_processor_info (struct mpc_config_processor *m) | ||||
| { | ||||
|  	int ver, apicid; | ||||
| @ -190,12 +169,6 @@ static void __devinit MP_processor_info (struct mpc_config_processor *m) | ||||
| 
 | ||||
| 	ver = m->mpc_apicver; | ||||
| 
 | ||||
| 	if (!MP_valid_apicid(apicid, ver)) { | ||||
| 		printk(KERN_WARNING "Processor #%d INVALID. (Max ID: %d).\n", | ||||
| 			m->mpc_apicid, MAX_APICS); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Validate version | ||||
| 	 */ | ||||
| @ -225,7 +198,14 @@ static void __devinit MP_processor_info (struct mpc_config_processor *m) | ||||
| 	cpu_set(num_processors, cpu_possible_map); | ||||
| 	num_processors++; | ||||
| 
 | ||||
| 	if (CPU_HOTPLUG_ENABLED || (num_processors > 8)) { | ||||
| 	/*
 | ||||
| 	 * Would be preferable to switch to bigsmp when CONFIG_HOTPLUG_CPU=y | ||||
| 	 * but we need to work other dependencies like SMP_SUSPEND etc | ||||
| 	 * before this can be done without some confusion. | ||||
| 	 * if (CPU_HOTPLUG_ENABLED || num_processors > 8) | ||||
| 	 *       - Ashok Raj <ashok.raj@intel.com> | ||||
| 	 */ | ||||
| 	if (num_processors > 8) { | ||||
| 		switch (boot_cpu_data.x86_vendor) { | ||||
| 		case X86_VENDOR_INTEL: | ||||
| 			if (!APIC_XAPIC(ver)) { | ||||
| @ -249,6 +229,13 @@ static void __init MP_bus_info (struct mpc_config_bus *m) | ||||
| 
 | ||||
| 	mpc_oem_bus_info(m, str, translation_table[mpc_record]); | ||||
| 
 | ||||
| 	if (m->mpc_busid >= MAX_MP_BUSSES) { | ||||
| 		printk(KERN_WARNING "MP table busid value (%d) for bustype %s " | ||||
| 			" is too large, max. supported is %d\n", | ||||
| 			m->mpc_busid, str, MAX_MP_BUSSES - 1); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	if (strncmp(str, BUSTYPE_ISA, sizeof(BUSTYPE_ISA)-1) == 0) { | ||||
| 		mp_bus_id_to_type[m->mpc_busid] = MP_BUS_ISA; | ||||
| 	} else if (strncmp(str, BUSTYPE_EISA, sizeof(BUSTYPE_EISA)-1) == 0) { | ||||
|  | ||||
| @ -251,7 +251,7 @@ static int msr_class_device_create(int i) | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
| static int __devinit msr_class_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) | ||||
| static int msr_class_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) | ||||
| { | ||||
| 	unsigned int cpu = (unsigned long)hcpu; | ||||
| 
 | ||||
|  | ||||
| @ -51,7 +51,5 @@ void mach_reboot_fixups(void) | ||||
| 
 | ||||
| 		cur->reboot_fixup(dev); | ||||
| 	} | ||||
| 
 | ||||
| 	printk(KERN_WARNING "No reboot fixup found for your hardware\n"); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -963,6 +963,36 @@ efi_memory_present_wrapper(unsigned long start, unsigned long end, void *arg) | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
|  /*
 | ||||
|   * This function checks if the entire range <start,end> is mapped with type. | ||||
|   * | ||||
|   * Note: this function only works correct if the e820 table is sorted and | ||||
|   * not-overlapping, which is the case | ||||
|   */ | ||||
| int __init | ||||
| e820_all_mapped(unsigned long start, unsigned long end, unsigned type) | ||||
| { | ||||
| 	int i; | ||||
| 	for (i = 0; i < e820.nr_map; i++) { | ||||
| 		struct e820entry *ei = &e820.map[i]; | ||||
| 		if (type && ei->type != type) | ||||
| 			continue; | ||||
| 		/* is the region (part) in overlap with the current region ?*/ | ||||
| 		if (ei->addr >= end || ei->addr + ei->size <= start) | ||||
| 			continue; | ||||
| 		/* if the region is at the beginning of <start,end> we move
 | ||||
| 		 * start to the end of the region since it's ok until there | ||||
| 		 */ | ||||
| 		if (ei->addr <= start) | ||||
| 			start = ei->addr + ei->size; | ||||
| 		/* if start is now at or beyond end, we're done, full
 | ||||
| 		 * coverage */ | ||||
| 		if (start >= end) | ||||
| 			return 1; /* we're done */ | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Find the highest page frame number we have available | ||||
|  */ | ||||
| @ -1317,8 +1347,8 @@ legacy_init_iomem_resources(struct resource *code_resource, struct resource *dat | ||||
| /*
 | ||||
|  * Request address space for all standard resources | ||||
|  * | ||||
|  * This is called just before pcibios_assign_resources(), which is also | ||||
|  * an fs_initcall, but is linked in later (in arch/i386/pci/i386.c). | ||||
|  * This is called just before pcibios_init(), which is also a | ||||
|  * subsys_initcall, but is linked in later (in arch/i386/pci/common.c). | ||||
|  */ | ||||
| static int __init request_standard_resources(void) | ||||
| { | ||||
| @ -1339,7 +1369,7 @@ static int __init request_standard_resources(void) | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| fs_initcall(request_standard_resources); | ||||
| subsys_initcall(request_standard_resources); | ||||
| 
 | ||||
| static void __init register_memory(void) | ||||
| { | ||||
|  | ||||
| @ -314,3 +314,4 @@ ENTRY(sys_call_table) | ||||
| 	.long sys_get_robust_list
 | ||||
| 	.long sys_splice
 | ||||
| 	.long sys_sync_file_range
 | ||||
| 	.long sys_tee			/* 315 */ | ||||
|  | ||||
| @ -365,6 +365,9 @@ void die(const char * str, struct pt_regs * regs, long err) | ||||
| 
 | ||||
| 	if (++die.lock_owner_depth < 3) { | ||||
| 		int nl = 0; | ||||
| 		unsigned long esp; | ||||
| 		unsigned short ss; | ||||
| 
 | ||||
| 		handle_BUG(regs); | ||||
| 		printk(KERN_EMERG "%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter); | ||||
| #ifdef CONFIG_PREEMPT | ||||
| @ -387,8 +390,19 @@ void die(const char * str, struct pt_regs * regs, long err) | ||||
| 			printk("\n"); | ||||
| 		if (notify_die(DIE_OOPS, str, regs, err, | ||||
| 					current->thread.trap_no, SIGSEGV) != | ||||
| 				NOTIFY_STOP) | ||||
| 				NOTIFY_STOP) { | ||||
| 			show_registers(regs); | ||||
| 			/* Executive summary in case the oops scrolled away */ | ||||
| 			esp = (unsigned long) (®s->esp); | ||||
| 			savesegment(ss, ss); | ||||
| 			if (user_mode(regs)) { | ||||
| 				esp = regs->esp; | ||||
| 				ss = regs->xss & 0xffff; | ||||
| 			} | ||||
| 			printk(KERN_EMERG "EIP: [<%08lx>] ", regs->eip); | ||||
| 			print_symbol("%s", regs->eip); | ||||
| 			printk(" SS:ESP %04x:%08lx\n", ss, esp); | ||||
| 		} | ||||
| 		else | ||||
| 			regs = NULL; | ||||
|   	} else | ||||
|  | ||||
| @ -106,15 +106,20 @@ voyager_module_t *voyager_cat_list; | ||||
| 
 | ||||
| /* the I/O port assignments for the VIC and QIC */ | ||||
| static struct resource vic_res = { | ||||
| 	"Voyager Interrupt Controller", 0xFC00, 0xFC6F }; | ||||
| 	.name	= "Voyager Interrupt Controller", | ||||
| 	.start	= 0xFC00, | ||||
| 	.end	= 0xFC6F | ||||
| }; | ||||
| static struct resource qic_res = { | ||||
| 	"Quad Interrupt Controller", 0xFC70, 0xFCFF }; | ||||
| 	.name	= "Quad Interrupt Controller", | ||||
| 	.start	= 0xFC70, | ||||
| 	.end	= 0xFCFF | ||||
| }; | ||||
| 
 | ||||
| /* This function is used to pack a data bit stream inside a message.
 | ||||
|  * It writes num_bits of the data buffer in msg starting at start_bit. | ||||
|  * Note: This function assumes that any unused bit in the data stream | ||||
|  * is set to zero so that the ors will work correctly */ | ||||
| #define BITS_PER_BYTE 8 | ||||
| static void | ||||
| cat_pack(__u8 *msg, const __u16 start_bit, __u8 *data, const __u16 num_bits) | ||||
| { | ||||
|  | ||||
| @ -651,6 +651,7 @@ void __init mem_init(void) | ||||
|  * Specifically, in the case of x86, we will always add | ||||
|  * memory to the highmem for now. | ||||
|  */ | ||||
| #ifdef CONFIG_HOTPLUG_MEMORY | ||||
| #ifndef CONFIG_NEED_MULTIPLE_NODES | ||||
| int add_memory(u64 start, u64 size) | ||||
| { | ||||
| @ -667,6 +668,7 @@ int remove_memory(u64 start, u64 size) | ||||
| 	return -EINVAL; | ||||
| } | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| kmem_cache_t *pgd_cache; | ||||
| kmem_cache_t *pmd_cache; | ||||
|  | ||||
| @ -4,6 +4,7 @@ | ||||
| 
 | ||||
| #include <linux/pci.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/dmi.h> | ||||
| #include "pci.h" | ||||
| 
 | ||||
| /*
 | ||||
| @ -18,8 +19,10 @@ int pci_conf1_read(unsigned int seg, unsigned int bus, | ||||
| { | ||||
| 	unsigned long flags; | ||||
| 
 | ||||
| 	if (!value || (bus > 255) || (devfn > 255) || (reg > 255)) | ||||
| 	if ((bus > 255) || (devfn > 255) || (reg > 255)) { | ||||
| 		*value = -1; | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	spin_lock_irqsave(&pci_config_lock, flags); | ||||
| 
 | ||||
| @ -91,8 +94,10 @@ static int pci_conf2_read(unsigned int seg, unsigned int bus, | ||||
| 	unsigned long flags; | ||||
| 	int dev, fn; | ||||
| 
 | ||||
| 	if (!value || (bus > 255) || (devfn > 255) || (reg > 255)) | ||||
| 	if ((bus > 255) || (devfn > 255) || (reg > 255)) { | ||||
| 		*value = -1; | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	dev = PCI_SLOT(devfn); | ||||
| 	fn = PCI_FUNC(devfn); | ||||
| @ -188,6 +193,10 @@ static int __init pci_sanity_check(struct pci_raw_ops *o) | ||||
| 
 | ||||
| 	if (pci_probe & PCI_NO_CHECKS) | ||||
| 		return 1; | ||||
| 	/* Assume Type 1 works for newer systems.
 | ||||
| 	   This handles machines that don't have anything on PCI Bus 0. */ | ||||
| 	if (dmi_get_year(DMI_BIOS_DATE) >= 2001) | ||||
| 		return 1; | ||||
| 
 | ||||
| 	for (devfn = 0; devfn < 0x100; devfn++) { | ||||
| 		if (o->read(0, 0, devfn, PCI_CLASS_DEVICE, 2, &x)) | ||||
|  | ||||
| @ -588,7 +588,10 @@ static __init int via_router_probe(struct irq_router *r, | ||||
| 	case PCI_DEVICE_ID_VIA_82C596: | ||||
| 	case PCI_DEVICE_ID_VIA_82C686: | ||||
| 	case PCI_DEVICE_ID_VIA_8231: | ||||
| 	case PCI_DEVICE_ID_VIA_8233A: | ||||
| 	case PCI_DEVICE_ID_VIA_8235: | ||||
| 	case PCI_DEVICE_ID_VIA_8237: | ||||
| 	case PCI_DEVICE_ID_VIA_8237_SATA: | ||||
| 		/* FIXME: add new ones for 8233/5 */ | ||||
| 		r->name = "VIA"; | ||||
| 		r->get = pirq_via_get; | ||||
|  | ||||
| @ -12,14 +12,20 @@ | ||||
| #include <linux/pci.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/acpi.h> | ||||
| #include <asm/e820.h> | ||||
| #include "pci.h" | ||||
| 
 | ||||
| #define MMCONFIG_APER_SIZE (256*1024*1024) | ||||
| 
 | ||||
| /* Assume systems with more busses have correct MCFG */ | ||||
| #define MAX_CHECK_BUS 16 | ||||
| 
 | ||||
| #define mmcfg_virt_addr ((void __iomem *) fix_to_virt(FIX_PCIE_MCFG)) | ||||
| 
 | ||||
| /* The base address of the last MMCONFIG device accessed */ | ||||
| static u32 mmcfg_last_accessed_device; | ||||
| 
 | ||||
| static DECLARE_BITMAP(fallback_slots, 32); | ||||
| static DECLARE_BITMAP(fallback_slots, MAX_CHECK_BUS*32); | ||||
| 
 | ||||
| /*
 | ||||
|  * Functions for accessing PCI configuration space with MMCONFIG accesses | ||||
| @ -29,8 +35,8 @@ static u32 get_base_addr(unsigned int seg, int bus, unsigned devfn) | ||||
| 	int cfg_num = -1; | ||||
| 	struct acpi_table_mcfg_config *cfg; | ||||
| 
 | ||||
| 	if (seg == 0 && bus == 0 && | ||||
| 	    test_bit(PCI_SLOT(devfn), fallback_slots)) | ||||
| 	if (seg == 0 && bus < MAX_CHECK_BUS && | ||||
| 	    test_bit(PCI_SLOT(devfn) + 32*bus, fallback_slots)) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	while (1) { | ||||
| @ -74,8 +80,10 @@ static int pci_mmcfg_read(unsigned int seg, unsigned int bus, | ||||
| 	unsigned long flags; | ||||
| 	u32 base; | ||||
| 
 | ||||
| 	if (!value || (bus > 255) || (devfn > 255) || (reg > 4095)) | ||||
| 	if ((bus > 255) || (devfn > 255) || (reg > 4095)) { | ||||
| 		*value = -1; | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	base = get_base_addr(seg, bus, devfn); | ||||
| 	if (!base) | ||||
| @ -146,29 +154,34 @@ static struct pci_raw_ops pci_mmcfg = { | ||||
|    Normally this can be expressed in the MCFG by not listing them | ||||
|    and assigning suitable _SEGs, but this isn't implemented in some BIOS. | ||||
|    Instead try to discover all devices on bus 0 that are unreachable using MM | ||||
|    and fallback for them. | ||||
|    We only do this for bus 0/seg 0 */ | ||||
|    and fallback for them. */ | ||||
| static __init void unreachable_devices(void) | ||||
| { | ||||
| 	int i; | ||||
| 	int i, k; | ||||
| 	unsigned long flags; | ||||
| 
 | ||||
| 	for (i = 0; i < 32; i++) { | ||||
| 		u32 val1; | ||||
| 		u32 addr; | ||||
| 	for (k = 0; k < MAX_CHECK_BUS; k++) { | ||||
| 		for (i = 0; i < 32; i++) { | ||||
| 			u32 val1; | ||||
| 			u32 addr; | ||||
| 
 | ||||
| 		pci_conf1_read(0, 0, PCI_DEVFN(i, 0), 0, 4, &val1); | ||||
| 		if (val1 == 0xffffffff) | ||||
| 			continue; | ||||
| 			pci_conf1_read(0, k, PCI_DEVFN(i, 0), 0, 4, &val1); | ||||
| 			if (val1 == 0xffffffff) | ||||
| 				continue; | ||||
| 
 | ||||
| 		/* Locking probably not needed, but safer */ | ||||
| 		spin_lock_irqsave(&pci_config_lock, flags); | ||||
| 		addr = get_base_addr(0, 0, PCI_DEVFN(i, 0)); | ||||
| 		if (addr != 0) | ||||
| 			pci_exp_set_dev_base(addr, 0, PCI_DEVFN(i, 0)); | ||||
| 		if (addr == 0 || readl((u32 __iomem *)mmcfg_virt_addr) != val1) | ||||
| 			set_bit(i, fallback_slots); | ||||
| 		spin_unlock_irqrestore(&pci_config_lock, flags); | ||||
| 			/* Locking probably not needed, but safer */ | ||||
| 			spin_lock_irqsave(&pci_config_lock, flags); | ||||
| 			addr = get_base_addr(0, k, PCI_DEVFN(i, 0)); | ||||
| 			if (addr != 0) | ||||
| 				pci_exp_set_dev_base(addr, k, PCI_DEVFN(i, 0)); | ||||
| 			if (addr == 0 || | ||||
| 			    readl((u32 __iomem *)mmcfg_virt_addr) != val1) { | ||||
| 				set_bit(i, fallback_slots); | ||||
| 				printk(KERN_NOTICE | ||||
| 			"PCI: No mmconfig possible on %x:%x\n", k, i); | ||||
| 			} | ||||
| 			spin_unlock_irqrestore(&pci_config_lock, flags); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -183,6 +196,14 @@ void __init pci_mmcfg_init(void) | ||||
| 	    (pci_mmcfg_config[0].base_address == 0)) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (!e820_all_mapped(pci_mmcfg_config[0].base_address, | ||||
| 			pci_mmcfg_config[0].base_address + MMCONFIG_APER_SIZE, | ||||
| 			E820_RESERVED)) { | ||||
| 		printk(KERN_ERR "PCI: BIOS Bug: MCFG area is not E820-reserved\n"); | ||||
| 		printk(KERN_ERR "PCI: Not using MMCONFIG.\n"); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	printk(KERN_INFO "PCI: Using MMCONFIG\n"); | ||||
| 	raw_pci_ops = &pci_mmcfg; | ||||
| 	pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; | ||||
|  | ||||
| @ -260,15 +260,6 @@ config NR_CPUS | ||||
| 	  than 64 will cause the use of a CPU mask array, causing a small | ||||
| 	  performance hit. | ||||
| 
 | ||||
| config IA64_NR_NODES | ||||
| 	int "Maximum number of NODEs (256-1024)" if (IA64_SGI_SN2 || IA64_GENERIC) | ||||
| 	range 256 1024 | ||||
| 	depends on IA64_SGI_SN2 || IA64_GENERIC | ||||
| 	default "256" | ||||
| 	help | ||||
| 	  This option specifies the maximum number of nodes in your SSI system. | ||||
| 	  If in doubt, use the default. | ||||
| 
 | ||||
| config HOTPLUG_CPU | ||||
| 	bool "Support for hot-pluggable CPUs (EXPERIMENTAL)" | ||||
| 	depends on SMP && EXPERIMENTAL | ||||
| @ -352,6 +343,16 @@ config NUMA | ||||
| 	  Access).  This option is for configuring high-end multiprocessor | ||||
| 	  server systems.  If in doubt, say N. | ||||
| 
 | ||||
| config NODES_SHIFT | ||||
| 	int "Max num nodes shift(3-10)" | ||||
| 	range 3 10 | ||||
| 	default "8" | ||||
| 	depends on NEED_MULTIPLE_NODES | ||||
| 	help | ||||
| 	  This option specifies the maximum number of nodes in your SSI system. | ||||
| 	  MAX_NUMNODES will be 2^(This value). | ||||
| 	  If in doubt, use the default. | ||||
| 
 | ||||
| # VIRTUAL_MEM_MAP and FLAT_NODE_MEM_MAP are functionally equivalent. | ||||
| # VIRTUAL_MEM_MAP has been retained for historical reasons. | ||||
| config VIRTUAL_MEM_MAP | ||||
|  | ||||
| @ -7,7 +7,7 @@ extra-y	:= head.o init_task.o vmlinux.lds | ||||
| obj-y := acpi.o entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o	\
 | ||||
| 	 irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o		\
 | ||||
| 	 salinfo.o semaphore.o setup.o signal.o sys_ia64.o time.o traps.o unaligned.o \
 | ||||
| 	 unwind.o mca.o mca_asm.o topology.o dmi_scan.o | ||||
| 	 unwind.o mca.o mca_asm.o topology.o | ||||
| 
 | ||||
| obj-$(CONFIG_IA64_BRL_EMU)	+= brl_emu.o | ||||
| obj-$(CONFIG_IA64_GENERIC)	+= acpi-ext.o | ||||
| @ -30,7 +30,6 @@ obj-$(CONFIG_IA64_MCA_RECOVERY)	+= mca_recovery.o | ||||
| obj-$(CONFIG_KPROBES)		+= kprobes.o jprobes.o | ||||
| obj-$(CONFIG_IA64_UNCACHED_ALLOCATOR)	+= uncached.o | ||||
| mca_recovery-y			+= mca_drv.o mca_drv_asm.o | ||||
| dmi_scan-y			+= ../../i386/kernel/dmi_scan.o | ||||
| 
 | ||||
| # The gate DSO image is built using a special linker script.
 | ||||
| targets += gate.so gate-syms.o | ||||
|  | ||||
| @ -1,105 +1,104 @@ | ||||
| /*
 | ||||
|  * arch/ia64/kernel/acpi-ext.c | ||||
|  * (c) Copyright 2003, 2006 Hewlett-Packard Development Company, L.P. | ||||
|  *	Alex Williamson <alex.williamson@hp.com> | ||||
|  *	Bjorn Helgaas <bjorn.helgaas@hp.com> | ||||
|  * | ||||
|  * Copyright (C) 2003 Hewlett-Packard | ||||
|  * Copyright (C) Alex Williamson | ||||
|  * Copyright (C) Bjorn Helgaas | ||||
|  * | ||||
|  * Vendor specific extensions to ACPI. | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License version 2 as | ||||
|  * published by the Free Software Foundation. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/config.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/types.h> | ||||
| #include <linux/acpi.h> | ||||
| #include <linux/efi.h> | ||||
| 
 | ||||
| #include <asm/acpi-ext.h> | ||||
| 
 | ||||
| struct acpi_vendor_descriptor { | ||||
| 	u8 guid_id; | ||||
| 	efi_guid_t guid; | ||||
| /*
 | ||||
|  * Device CSRs that do not appear in PCI config space should be described | ||||
|  * via ACPI.  This would normally be done with Address Space Descriptors | ||||
|  * marked as "consumer-only," but old versions of Windows and Linux ignore | ||||
|  * the producer/consumer flag, so HP invented a vendor-defined resource to | ||||
|  * describe the location and size of CSR space. | ||||
|  */ | ||||
| 
 | ||||
| struct acpi_vendor_uuid hp_ccsr_uuid = { | ||||
| 	.subtype = 2, | ||||
| 	.data = { 0xf9, 0xad, 0xe9, 0x69, 0x4f, 0x92, 0x5f, 0xab, 0xf6, 0x4a, | ||||
| 	    0x24, 0xd2, 0x01, 0x37, 0x0e, 0xad }, | ||||
| }; | ||||
| 
 | ||||
| struct acpi_vendor_info { | ||||
| 	struct acpi_vendor_descriptor *descriptor; | ||||
| 	u8 *data; | ||||
| 	u32 length; | ||||
| }; | ||||
| 
 | ||||
| acpi_status | ||||
| acpi_vendor_resource_match(struct acpi_resource *resource, void *context) | ||||
| { | ||||
| 	struct acpi_vendor_info *info = (struct acpi_vendor_info *)context; | ||||
| 	struct acpi_resource_vendor *vendor; | ||||
| 	struct acpi_vendor_descriptor *descriptor; | ||||
| 	u32 byte_length; | ||||
| 
 | ||||
| 	if (resource->type != ACPI_RESOURCE_TYPE_VENDOR) | ||||
| 		return AE_OK; | ||||
| 
 | ||||
| 	vendor = (struct acpi_resource_vendor *)&resource->data; | ||||
| 	descriptor = (struct acpi_vendor_descriptor *)vendor->byte_data; | ||||
| 	if (vendor->byte_length <= sizeof(*info->descriptor) || | ||||
| 	    descriptor->guid_id != info->descriptor->guid_id || | ||||
| 	    efi_guidcmp(descriptor->guid, info->descriptor->guid)) | ||||
| 		return AE_OK; | ||||
| 
 | ||||
| 	byte_length = vendor->byte_length - sizeof(struct acpi_vendor_descriptor); | ||||
| 	info->data = acpi_os_allocate(byte_length); | ||||
| 	if (!info->data) | ||||
| 		return AE_NO_MEMORY; | ||||
| 
 | ||||
| 	memcpy(info->data, | ||||
| 	       vendor->byte_data + sizeof(struct acpi_vendor_descriptor), | ||||
| 	       byte_length); | ||||
| 	info->length = byte_length; | ||||
| 	return AE_CTRL_TERMINATE; | ||||
| } | ||||
| 
 | ||||
| acpi_status | ||||
| acpi_find_vendor_resource(acpi_handle obj, struct acpi_vendor_descriptor * id, | ||||
| 			  u8 ** data, u32 * byte_length) | ||||
| { | ||||
| 	struct acpi_vendor_info info; | ||||
| 
 | ||||
| 	info.descriptor = id; | ||||
| 	info.data = NULL; | ||||
| 
 | ||||
| 	acpi_walk_resources(obj, METHOD_NAME__CRS, acpi_vendor_resource_match, | ||||
| 			    &info); | ||||
| 	if (!info.data) | ||||
| 		return AE_NOT_FOUND; | ||||
| 
 | ||||
| 	*data = info.data; | ||||
| 	*byte_length = info.length; | ||||
| 	return AE_OK; | ||||
| } | ||||
| 
 | ||||
| struct acpi_vendor_descriptor hp_ccsr_descriptor = { | ||||
| 	.guid_id = 2, | ||||
| 	.guid = | ||||
| 	    EFI_GUID(0x69e9adf9, 0x924f, 0xab5f, 0xf6, 0x4a, 0x24, 0xd2, 0x01, | ||||
| 		     0x37, 0x0e, 0xad) | ||||
| }; | ||||
| 
 | ||||
| acpi_status hp_acpi_csr_space(acpi_handle obj, u64 * csr_base, u64 * csr_length) | ||||
| static acpi_status hp_ccsr_locate(acpi_handle obj, u64 *base, u64 *length) | ||||
| { | ||||
| 	acpi_status status; | ||||
| 	u8 *data; | ||||
| 	u32 length; | ||||
| 	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | ||||
| 	struct acpi_resource *resource; | ||||
| 	struct acpi_resource_vendor_typed *vendor; | ||||
| 
 | ||||
| 	status = | ||||
| 	    acpi_find_vendor_resource(obj, &hp_ccsr_descriptor, &data, &length); | ||||
| 	status = acpi_get_vendor_resource(obj, METHOD_NAME__CRS, &hp_ccsr_uuid, | ||||
| 		&buffer); | ||||
| 
 | ||||
| 	if (ACPI_FAILURE(status) || length != 16) | ||||
| 	resource = buffer.pointer; | ||||
| 	vendor = &resource->data.vendor_typed; | ||||
| 
 | ||||
| 	if (ACPI_FAILURE(status) || vendor->byte_length < 16) { | ||||
| 		status = AE_NOT_FOUND; | ||||
| 		goto exit; | ||||
| 	} | ||||
| 
 | ||||
| 	memcpy(base, vendor->byte_data, sizeof(*base)); | ||||
| 	memcpy(length, vendor->byte_data + 8, sizeof(*length)); | ||||
| 
 | ||||
|   exit: | ||||
| 	acpi_os_free(buffer.pointer); | ||||
| 	return status; | ||||
| } | ||||
| 
 | ||||
| struct csr_space { | ||||
| 	u64	base; | ||||
| 	u64	length; | ||||
| }; | ||||
| 
 | ||||
| static acpi_status find_csr_space(struct acpi_resource *resource, void *data) | ||||
| { | ||||
| 	struct csr_space *space = data; | ||||
| 	struct acpi_resource_address64 addr; | ||||
| 	acpi_status status; | ||||
| 
 | ||||
| 	status = acpi_resource_to_address64(resource, &addr); | ||||
| 	if (ACPI_SUCCESS(status) && | ||||
| 	    addr.resource_type == ACPI_MEMORY_RANGE && | ||||
| 	    addr.address_length && | ||||
| 	    addr.producer_consumer == ACPI_CONSUMER) { | ||||
| 		space->base = addr.minimum; | ||||
| 		space->length = addr.address_length; | ||||
| 		return AE_CTRL_TERMINATE; | ||||
| 	} | ||||
| 	return AE_OK;		/* keep looking */ | ||||
| } | ||||
| 
 | ||||
| static acpi_status hp_crs_locate(acpi_handle obj, u64 *base, u64 *length) | ||||
| { | ||||
| 	struct csr_space space = { 0, 0 }; | ||||
| 
 | ||||
| 	acpi_walk_resources(obj, METHOD_NAME__CRS, find_csr_space, &space); | ||||
| 	if (!space.length) | ||||
| 		return AE_NOT_FOUND; | ||||
| 
 | ||||
| 	memcpy(csr_base, data, sizeof(*csr_base)); | ||||
| 	memcpy(csr_length, data + 8, sizeof(*csr_length)); | ||||
| 	acpi_os_free(data); | ||||
| 
 | ||||
| 	*base = space.base; | ||||
| 	*length = space.length; | ||||
| 	return AE_OK; | ||||
| } | ||||
| 
 | ||||
| acpi_status hp_acpi_csr_space(acpi_handle obj, u64 *csr_base, u64 *csr_length) | ||||
| { | ||||
| 	acpi_status status; | ||||
| 
 | ||||
| 	status = hp_ccsr_locate(obj, csr_base, csr_length); | ||||
| 	if (ACPI_SUCCESS(status)) | ||||
| 		return status; | ||||
| 
 | ||||
| 	return hp_crs_locate(obj, csr_base, csr_length); | ||||
| } | ||||
| EXPORT_SYMBOL(hp_acpi_csr_space); | ||||
|  | ||||
| @ -1606,5 +1606,9 @@ sys_call_table: | ||||
| 	data8 sys_ni_syscall			// 1295 reserved for ppoll | ||||
| 	data8 sys_unshare | ||||
| 	data8 sys_splice | ||||
| 	data8 sys_set_robust_list | ||||
| 	data8 sys_get_robust_list | ||||
| 	data8 sys_sync_file_range		// 1300 | ||||
| 	data8 sys_tee | ||||
| 
 | ||||
| 	.org sys_call_table + 8*NR_syscalls	// guard against failures to increase NR_syscalls | ||||
|  | ||||
| @ -251,7 +251,7 @@ static void __kprobes prepare_break_inst(uint template, uint  slot, | ||||
| 	update_kprobe_inst_flag(template, slot, major_opcode, kprobe_inst, p); | ||||
| } | ||||
| 
 | ||||
| static inline void get_kprobe_inst(bundle_t *bundle, uint slot, | ||||
| static void __kprobes get_kprobe_inst(bundle_t *bundle, uint slot, | ||||
| 	       	unsigned long *kprobe_inst, uint *major_opcode) | ||||
| { | ||||
| 	unsigned long kprobe_inst_p0, kprobe_inst_p1; | ||||
| @ -278,7 +278,7 @@ static inline void get_kprobe_inst(bundle_t *bundle, uint slot, | ||||
| } | ||||
| 
 | ||||
| /* Returns non-zero if the addr is in the Interrupt Vector Table */ | ||||
| static inline int in_ivt_functions(unsigned long addr) | ||||
| static int __kprobes in_ivt_functions(unsigned long addr) | ||||
| { | ||||
| 	return (addr >= (unsigned long)__start_ivt_text | ||||
| 		&& addr < (unsigned long)__end_ivt_text); | ||||
| @ -308,19 +308,19 @@ static int __kprobes valid_kprobe_addr(int template, int slot, | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static inline void save_previous_kprobe(struct kprobe_ctlblk *kcb) | ||||
| static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb) | ||||
| { | ||||
| 	kcb->prev_kprobe.kp = kprobe_running(); | ||||
| 	kcb->prev_kprobe.status = kcb->kprobe_status; | ||||
| } | ||||
| 
 | ||||
| static inline void restore_previous_kprobe(struct kprobe_ctlblk *kcb) | ||||
| static void __kprobes restore_previous_kprobe(struct kprobe_ctlblk *kcb) | ||||
| { | ||||
| 	__get_cpu_var(current_kprobe) = kcb->prev_kprobe.kp; | ||||
| 	kcb->kprobe_status = kcb->prev_kprobe.status; | ||||
| } | ||||
| 
 | ||||
| static inline void set_current_kprobe(struct kprobe *p, | ||||
| static void __kprobes set_current_kprobe(struct kprobe *p, | ||||
| 			struct kprobe_ctlblk *kcb) | ||||
| { | ||||
| 	__get_cpu_var(current_kprobe) = p; | ||||
|  | ||||
| @ -581,10 +581,12 @@ ia64_mca_rendez_int_handler(int rendez_irq, void *arg, struct pt_regs *regs) | ||||
| { | ||||
| 	unsigned long flags; | ||||
| 	int cpu = smp_processor_id(); | ||||
| 	struct ia64_mca_notify_die nd = | ||||
| 		{ .sos = NULL, .monarch_cpu = &monarch_cpu }; | ||||
| 
 | ||||
| 	/* Mask all interrupts */ | ||||
| 	local_irq_save(flags); | ||||
| 	if (notify_die(DIE_MCA_RENDZVOUS_ENTER, "MCA", regs, 0, 0, 0) | ||||
| 	if (notify_die(DIE_MCA_RENDZVOUS_ENTER, "MCA", regs, (long)&nd, 0, 0) | ||||
| 			== NOTIFY_STOP) | ||||
| 		ia64_mca_spin(__FUNCTION__); | ||||
| 
 | ||||
| @ -594,7 +596,7 @@ ia64_mca_rendez_int_handler(int rendez_irq, void *arg, struct pt_regs *regs) | ||||
| 	 */ | ||||
| 	ia64_sal_mc_rendez(); | ||||
| 
 | ||||
| 	if (notify_die(DIE_MCA_RENDZVOUS_PROCESS, "MCA", regs, 0, 0, 0) | ||||
| 	if (notify_die(DIE_MCA_RENDZVOUS_PROCESS, "MCA", regs, (long)&nd, 0, 0) | ||||
| 			== NOTIFY_STOP) | ||||
| 		ia64_mca_spin(__FUNCTION__); | ||||
| 
 | ||||
| @ -602,7 +604,7 @@ ia64_mca_rendez_int_handler(int rendez_irq, void *arg, struct pt_regs *regs) | ||||
| 	while (monarch_cpu != -1) | ||||
| 	       cpu_relax();	/* spin until monarch leaves */ | ||||
| 
 | ||||
| 	if (notify_die(DIE_MCA_RENDZVOUS_LEAVE, "MCA", regs, 0, 0, 0) | ||||
| 	if (notify_die(DIE_MCA_RENDZVOUS_LEAVE, "MCA", regs, (long)&nd, 0, 0) | ||||
| 			== NOTIFY_STOP) | ||||
| 		ia64_mca_spin(__FUNCTION__); | ||||
| 
 | ||||
| @ -961,7 +963,7 @@ no_mod: | ||||
|  */ | ||||
| 
 | ||||
| static void | ||||
| ia64_wait_for_slaves(int monarch) | ||||
| ia64_wait_for_slaves(int monarch, const char *type) | ||||
| { | ||||
| 	int c, wait = 0, missing = 0; | ||||
| 	for_each_online_cpu(c) { | ||||
| @ -987,7 +989,7 @@ ia64_wait_for_slaves(int monarch) | ||||
| 	} | ||||
| 	if (!missing) | ||||
| 		goto all_in; | ||||
| 	printk(KERN_INFO "OS MCA slave did not rendezvous on cpu"); | ||||
| 	printk(KERN_INFO "OS %s slave did not rendezvous on cpu", type); | ||||
| 	for_each_online_cpu(c) { | ||||
| 		if (c == monarch) | ||||
| 			continue; | ||||
| @ -998,7 +1000,7 @@ ia64_wait_for_slaves(int monarch) | ||||
| 	return; | ||||
| 
 | ||||
| all_in: | ||||
| 	printk(KERN_INFO "All OS MCA slaves have reached rendezvous\n"); | ||||
| 	printk(KERN_INFO "All OS %s slaves have reached rendezvous\n", type); | ||||
| 	return; | ||||
| } | ||||
| 
 | ||||
| @ -1023,6 +1025,8 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw, | ||||
| 		&sos->proc_state_param; | ||||
| 	int recover, cpu = smp_processor_id(); | ||||
| 	task_t *previous_current; | ||||
| 	struct ia64_mca_notify_die nd = | ||||
| 		{ .sos = sos, .monarch_cpu = &monarch_cpu }; | ||||
| 
 | ||||
| 	oops_in_progress = 1;	/* FIXME: make printk NMI/MCA/INIT safe */ | ||||
| 	console_loglevel = 15;	/* make sure printks make it to console */ | ||||
| @ -1031,10 +1035,10 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw, | ||||
| 
 | ||||
| 	previous_current = ia64_mca_modify_original_stack(regs, sw, sos, "MCA"); | ||||
| 	monarch_cpu = cpu; | ||||
| 	if (notify_die(DIE_MCA_MONARCH_ENTER, "MCA", regs, 0, 0, 0) | ||||
| 	if (notify_die(DIE_MCA_MONARCH_ENTER, "MCA", regs, (long)&nd, 0, 0) | ||||
| 			== NOTIFY_STOP) | ||||
| 		ia64_mca_spin(__FUNCTION__); | ||||
| 	ia64_wait_for_slaves(cpu); | ||||
| 	ia64_wait_for_slaves(cpu, "MCA"); | ||||
| 
 | ||||
| 	/* Wakeup all the processors which are spinning in the rendezvous loop.
 | ||||
| 	 * They will leave SAL, then spin in the OS with interrupts disabled | ||||
| @ -1043,7 +1047,7 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw, | ||||
| 	 * spinning in SAL does not work. | ||||
| 	 */ | ||||
| 	ia64_mca_wakeup_all(); | ||||
| 	if (notify_die(DIE_MCA_MONARCH_PROCESS, "MCA", regs, 0, 0, 0) | ||||
| 	if (notify_die(DIE_MCA_MONARCH_PROCESS, "MCA", regs, (long)&nd, 0, 0) | ||||
| 			== NOTIFY_STOP) | ||||
| 		ia64_mca_spin(__FUNCTION__); | ||||
| 
 | ||||
| @ -1064,7 +1068,7 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw, | ||||
| 		ia64_sal_clear_state_info(SAL_INFO_TYPE_MCA); | ||||
| 		sos->os_status = IA64_MCA_CORRECTED; | ||||
| 	} | ||||
| 	if (notify_die(DIE_MCA_MONARCH_LEAVE, "MCA", regs, 0, 0, recover) | ||||
| 	if (notify_die(DIE_MCA_MONARCH_LEAVE, "MCA", regs, (long)&nd, 0, recover) | ||||
| 			== NOTIFY_STOP) | ||||
| 		ia64_mca_spin(__FUNCTION__); | ||||
| 
 | ||||
| @ -1351,10 +1355,14 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw, | ||||
| 	static atomic_t monarchs; | ||||
| 	task_t *previous_current; | ||||
| 	int cpu = smp_processor_id(); | ||||
| 	struct ia64_mca_notify_die nd = | ||||
| 		{ .sos = sos, .monarch_cpu = &monarch_cpu }; | ||||
| 
 | ||||
| 	oops_in_progress = 1;	/* FIXME: make printk NMI/MCA/INIT safe */ | ||||
| 	console_loglevel = 15;	/* make sure printks make it to console */ | ||||
| 
 | ||||
| 	(void) notify_die(DIE_INIT_ENTER, "INIT", regs, (long)&nd, 0, 0); | ||||
| 
 | ||||
| 	printk(KERN_INFO "Entered OS INIT handler. PSP=%lx cpu=%d monarch=%ld\n", | ||||
| 		sos->proc_state_param, cpu, sos->monarch); | ||||
| 	salinfo_log_wakeup(SAL_INFO_TYPE_INIT, NULL, 0, 0); | ||||
| @ -1390,15 +1398,15 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw, | ||||
| 		ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_INIT; | ||||
| 		while (monarch_cpu == -1) | ||||
| 		       cpu_relax();	/* spin until monarch enters */ | ||||
| 		if (notify_die(DIE_INIT_SLAVE_ENTER, "INIT", regs, 0, 0, 0) | ||||
| 		if (notify_die(DIE_INIT_SLAVE_ENTER, "INIT", regs, (long)&nd, 0, 0) | ||||
| 				== NOTIFY_STOP) | ||||
| 			ia64_mca_spin(__FUNCTION__); | ||||
| 		if (notify_die(DIE_INIT_SLAVE_PROCESS, "INIT", regs, 0, 0, 0) | ||||
| 		if (notify_die(DIE_INIT_SLAVE_PROCESS, "INIT", regs, (long)&nd, 0, 0) | ||||
| 				== NOTIFY_STOP) | ||||
| 			ia64_mca_spin(__FUNCTION__); | ||||
| 		while (monarch_cpu != -1) | ||||
| 		       cpu_relax();	/* spin until monarch leaves */ | ||||
| 		if (notify_die(DIE_INIT_SLAVE_LEAVE, "INIT", regs, 0, 0, 0) | ||||
| 		if (notify_die(DIE_INIT_SLAVE_LEAVE, "INIT", regs, (long)&nd, 0, 0) | ||||
| 				== NOTIFY_STOP) | ||||
| 			ia64_mca_spin(__FUNCTION__); | ||||
| 		printk("Slave on cpu %d returning to normal service.\n", cpu); | ||||
| @ -1409,7 +1417,7 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw, | ||||
| 	} | ||||
| 
 | ||||
| 	monarch_cpu = cpu; | ||||
| 	if (notify_die(DIE_INIT_MONARCH_ENTER, "INIT", regs, 0, 0, 0) | ||||
| 	if (notify_die(DIE_INIT_MONARCH_ENTER, "INIT", regs, (long)&nd, 0, 0) | ||||
| 			== NOTIFY_STOP) | ||||
| 		ia64_mca_spin(__FUNCTION__); | ||||
| 
 | ||||
| @ -1421,15 +1429,15 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw, | ||||
| 	 */ | ||||
| 	printk("Delaying for 5 seconds...\n"); | ||||
| 	udelay(5*1000000); | ||||
| 	ia64_wait_for_slaves(cpu); | ||||
| 	ia64_wait_for_slaves(cpu, "INIT"); | ||||
| 	/* If nobody intercepts DIE_INIT_MONARCH_PROCESS then we drop through
 | ||||
| 	 * to default_monarch_init_process() above and just print all the | ||||
| 	 * tasks. | ||||
| 	 */ | ||||
| 	if (notify_die(DIE_INIT_MONARCH_PROCESS, "INIT", regs, 0, 0, 0) | ||||
| 	if (notify_die(DIE_INIT_MONARCH_PROCESS, "INIT", regs, (long)&nd, 0, 0) | ||||
| 			== NOTIFY_STOP) | ||||
| 		ia64_mca_spin(__FUNCTION__); | ||||
| 	if (notify_die(DIE_INIT_MONARCH_LEAVE, "INIT", regs, 0, 0, 0) | ||||
| 	if (notify_die(DIE_INIT_MONARCH_LEAVE, "INIT", regs, (long)&nd, 0, 0) | ||||
| 			== NOTIFY_STOP) | ||||
| 		ia64_mca_spin(__FUNCTION__); | ||||
| 	printk("\nINIT dump complete.  Monarch on cpu %d returning to normal service.\n", cpu); | ||||
| @ -1631,6 +1639,7 @@ ia64_mca_init(void) | ||||
| 			printk(KERN_INFO "Increasing MCA rendezvous timeout from " | ||||
| 				"%ld to %ld milliseconds\n", timeout, isrv.v0); | ||||
| 			timeout = isrv.v0; | ||||
| 			(void) notify_die(DIE_MCA_NEW_TIMEOUT, "MCA", NULL, timeout, 0, 0); | ||||
| 			continue; | ||||
| 		} | ||||
| 		printk(KERN_ERR "Failed to register rendezvous interrupt " | ||||
|  | ||||
| @ -827,7 +827,7 @@ ia64_state_restore: | ||||
| 	ld8 r9=[temp2],16	// sal_gp | ||||
| 	;;
 | ||||
| 	ld8 r22=[temp1],16	// pal_min_state, virtual | ||||
| 	ld8 r21=[temp2],16	// prev_IA64_KR_CURRENT | ||||
| 	ld8 r13=[temp2],16	// prev_IA64_KR_CURRENT | ||||
| 	;;
 | ||||
| 	ld8 r16=[temp1],16	// prev_IA64_KR_CURRENT_STACK | ||||
| 	ld8 r20=[temp2],16	// prev_task | ||||
| @ -848,7 +848,7 @@ ia64_state_restore: | ||||
| 	mov cr.iim=temp3 | ||||
| 	mov cr.iha=temp4 | ||||
| 	dep r22=0,r22,62,1	// pal_min_state, physical, uncached | ||||
| 	mov IA64_KR(CURRENT)=r21 | ||||
| 	mov IA64_KR(CURRENT)=r13 | ||||
| 	ld8 r8=[temp1]		// os_status | ||||
| 	ld8 r10=[temp2]		// context | ||||
| 
 | ||||
| @ -856,7 +856,7 @@ ia64_state_restore: | ||||
| 	 * avoid any dependencies on the algorithm in ia64_switch_to(), just | ||||
| 	 * purge any existing CURRENT_STACK mapping and insert the new one. | ||||
| 	 * | ||||
| 	 * r16 contains prev_IA64_KR_CURRENT_STACK, r21 contains | ||||
| 	 * r16 contains prev_IA64_KR_CURRENT_STACK, r13 contains | ||||
| 	 * prev_IA64_KR_CURRENT, these values may have been changed by the C | ||||
| 	 * code.  Do not use r8, r9, r10, r22, they contain values ready for | ||||
| 	 * the return to SAL. | ||||
| @ -873,7 +873,7 @@ ia64_state_restore: | ||||
| 	;;
 | ||||
| 	srlz.d | ||||
| 
 | ||||
| 	extr.u r19=r21,61,3			// r21 = prev_IA64_KR_CURRENT | ||||
| 	extr.u r19=r13,61,3			// r13 = prev_IA64_KR_CURRENT | ||||
| 	shl r20=r16,IA64_GRANULE_SHIFT		// r16 = prev_IA64_KR_CURRENT_STACK | ||||
| 	movl r21=PAGE_KERNEL			// page properties | ||||
| 	;;
 | ||||
| @ -883,7 +883,7 @@ ia64_state_restore: | ||||
| (p6)	br.spnt 1f				// the dreaded cpu 0 idle task in region 5:( | ||||
| 	;;
 | ||||
| 	mov cr.itir=r18 | ||||
| 	mov cr.ifa=r21 | ||||
| 	mov cr.ifa=r13 | ||||
| 	mov r20=IA64_TR_CURRENT_STACK | ||||
| 	;;
 | ||||
| 	itr.d dtr[r20]=r21 | ||||
|  | ||||
| @ -947,7 +947,7 @@ void | ||||
| percpu_modcopy (void *pcpudst, const void *src, unsigned long size) | ||||
| { | ||||
| 	unsigned int i; | ||||
| 	for_each_cpu(i) { | ||||
| 	for_each_possible_cpu(i) { | ||||
| 		memcpy(pcpudst + __per_cpu_offset[i], src, size); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -519,6 +519,68 @@ void __cpuinit *per_cpu_init(void) | ||||
| } | ||||
| #endif /* CONFIG_SMP */ | ||||
| 
 | ||||
| #ifdef CONFIG_VIRTUAL_MEM_MAP | ||||
| static inline int find_next_valid_pfn_for_pgdat(pg_data_t *pgdat, int i) | ||||
| { | ||||
| 	unsigned long end_address, hole_next_pfn; | ||||
| 	unsigned long stop_address; | ||||
| 
 | ||||
| 	end_address = (unsigned long) &vmem_map[pgdat->node_start_pfn + i]; | ||||
| 	end_address = PAGE_ALIGN(end_address); | ||||
| 
 | ||||
| 	stop_address = (unsigned long) &vmem_map[ | ||||
| 		pgdat->node_start_pfn + pgdat->node_spanned_pages]; | ||||
| 
 | ||||
| 	do { | ||||
| 		pgd_t *pgd; | ||||
| 		pud_t *pud; | ||||
| 		pmd_t *pmd; | ||||
| 		pte_t *pte; | ||||
| 
 | ||||
| 		pgd = pgd_offset_k(end_address); | ||||
| 		if (pgd_none(*pgd)) { | ||||
| 			end_address += PGDIR_SIZE; | ||||
| 			continue; | ||||
| 		} | ||||
| 
 | ||||
| 		pud = pud_offset(pgd, end_address); | ||||
| 		if (pud_none(*pud)) { | ||||
| 			end_address += PUD_SIZE; | ||||
| 			continue; | ||||
| 		} | ||||
| 
 | ||||
| 		pmd = pmd_offset(pud, end_address); | ||||
| 		if (pmd_none(*pmd)) { | ||||
| 			end_address += PMD_SIZE; | ||||
| 			continue; | ||||
| 		} | ||||
| 
 | ||||
| 		pte = pte_offset_kernel(pmd, end_address); | ||||
| retry_pte: | ||||
| 		if (pte_none(*pte)) { | ||||
| 			end_address += PAGE_SIZE; | ||||
| 			pte++; | ||||
| 			if ((end_address < stop_address) && | ||||
| 			    (end_address != ALIGN(end_address, 1UL << PMD_SHIFT))) | ||||
| 				goto retry_pte; | ||||
| 			continue; | ||||
| 		} | ||||
| 		/* Found next valid vmem_map page */ | ||||
| 		break; | ||||
| 	} while (end_address < stop_address); | ||||
| 
 | ||||
| 	end_address = min(end_address, stop_address); | ||||
| 	end_address = end_address - (unsigned long) vmem_map + sizeof(struct page) - 1; | ||||
| 	hole_next_pfn = end_address / sizeof(struct page); | ||||
| 	return hole_next_pfn - pgdat->node_start_pfn; | ||||
| } | ||||
| #else | ||||
| static inline int find_next_valid_pfn_for_pgdat(pg_data_t *pgdat, int i) | ||||
| { | ||||
| 	return i + 1; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * show_mem - give short summary of memory stats | ||||
|  * | ||||
| @ -547,8 +609,10 @@ void show_mem(void) | ||||
| 			struct page *page; | ||||
| 			if (pfn_valid(pgdat->node_start_pfn + i)) | ||||
| 				page = pfn_to_page(pgdat->node_start_pfn + i); | ||||
| 			else | ||||
| 			else { | ||||
| 				i = find_next_valid_pfn_for_pgdat(pgdat, i) - 1; | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (PageReserved(page)) | ||||
| 				reserved++; | ||||
| 			else if (PageSwapCache(page)) | ||||
|  | ||||
| @ -60,6 +60,9 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re | ||||
| 	struct siginfo si; | ||||
| 	unsigned long mask; | ||||
| 
 | ||||
| 	/* mmap_sem is performance critical.... */ | ||||
| 	prefetchw(&mm->mmap_sem); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * If we're in an interrupt or have no user context, we must not take the fault.. | ||||
| 	 */ | ||||
|  | ||||
| @ -1831,7 +1831,7 @@ xpc_initiate_allocate(partid_t partid, int ch_number, u32 flags, void **payload) | ||||
| { | ||||
| 	struct xpc_partition *part = &xpc_partitions[partid]; | ||||
| 	enum xpc_retval ret = xpcUnknownReason; | ||||
| 	struct xpc_msg *msg; | ||||
| 	struct xpc_msg *msg = NULL; | ||||
| 
 | ||||
| 
 | ||||
| 	DBUG_ON(partid <= 0 || partid >= XP_MAX_PARTITIONS); | ||||
|  | ||||
| @ -285,6 +285,11 @@ config NUMA | ||||
| 	depends on SMP && BROKEN | ||||
| 	default n | ||||
| 
 | ||||
| config NODES_SHIFT | ||||
| 	int | ||||
| 	default "1" | ||||
| 	depends on NEED_MULTIPLE_NODES | ||||
| 
 | ||||
| # turning this on wastes a bunch of space. | ||||
| # Summit needs it only when NUMA is on | ||||
| config BOOT_IOREMAP | ||||
|  | ||||
| @ -20,7 +20,7 @@ | ||||
|  * Stack layout in 'ret_from_system_call': | ||||
|  * 	ptrace needs to have all regs on the stack. | ||||
|  *	if the order here is changed, it needs to be | ||||
|  *	updated in fork.c:copy_process, signal.c:do_signal, | ||||
|  *	updated in fork.c:copy_thread, signal.c:do_signal, | ||||
|  *	ptrace.c and ptrace.h | ||||
|  * | ||||
|  * M32Rx/M32R2				M32R | ||||
| @ -41,18 +41,17 @@ | ||||
|  *       @(0x38,sp) - syscall_nr	ditto
 | ||||
|  *       @(0x3c,sp) - acc0h		@(0x3c,sp) - acch
 | ||||
|  *       @(0x40,sp) - acc0l		@(0x40,sp) - accl
 | ||||
|  *       @(0x44,sp) - acc1h		@(0x44,sp) - psw
 | ||||
|  *       @(0x48,sp) - acc1l		@(0x48,sp) - bpc
 | ||||
|  *       @(0x4c,sp) - psw		@(0x4c,sp) - bbpsw
 | ||||
|  *       @(0x50,sp) - bpc		@(0x50,sp) - bbpc
 | ||||
|  *       @(0x54,sp) - bbpsw		@(0x54,sp) - spu (cr3)
 | ||||
|  *       @(0x58,sp) - bbpc		@(0x58,sp) - fp (r13)
 | ||||
|  *       @(0x5c,sp) - spu (cr3)		@(0x5c,sp) - lr (r14)
 | ||||
|  *       @(0x60,sp) - fp (r13)		@(0x60,sp) - spi (cr12)
 | ||||
|  *       @(0x64,sp) - lr (r14)		@(0x64,sp) - orig_r0
 | ||||
|  *       @(0x68,sp) - spi (cr2)
 | ||||
|  *       @(0x6c,sp) - orig_r0
 | ||||
|  * | ||||
|  *       @(0x44,sp) - acc1h		@(0x44,sp) - dummy_acc1h
 | ||||
|  *       @(0x48,sp) - acc1l		@(0x48,sp) - dummy_acc1l
 | ||||
|  *       @(0x4c,sp) - psw		ditto
 | ||||
|  *       @(0x50,sp) - bpc		ditto
 | ||||
|  *       @(0x54,sp) - bbpsw		ditto
 | ||||
|  *       @(0x58,sp) - bbpc		ditto
 | ||||
|  *       @(0x5c,sp) - spu (cr3)		ditto
 | ||||
|  *       @(0x60,sp) - fp (r13)		ditto
 | ||||
|  *       @(0x64,sp) - lr (r14)		ditto
 | ||||
|  *       @(0x68,sp) - spi (cr2)		ditto
 | ||||
|  *       @(0x6c,sp) - orig_r0		ditto
 | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/config.h> | ||||
| @ -102,6 +101,12 @@ | ||||
| #define ACC0L(reg)		@(0x40,reg)
 | ||||
| #define ACC1H(reg)		@(0x44,reg)
 | ||||
| #define ACC1L(reg)		@(0x48,reg)
 | ||||
| #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) | ||||
| #define ACCH(reg)		@(0x3C,reg)
 | ||||
| #define ACCL(reg)		@(0x40,reg)
 | ||||
| #else | ||||
| #error unknown isa configuration | ||||
| #endif | ||||
| #define PSW(reg)		@(0x4C,reg)
 | ||||
| #define BPC(reg)		@(0x50,reg)
 | ||||
| #define BBPSW(reg)		@(0x54,reg)
 | ||||
| @ -111,21 +116,6 @@ | ||||
| #define LR(reg)			@(0x64,reg)
 | ||||
| #define SP(reg)			@(0x68,reg)
 | ||||
| #define ORIG_R0(reg)		@(0x6C,reg)
 | ||||
| #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) | ||||
| #define ACCH(reg)		@(0x3C,reg)
 | ||||
| #define ACCL(reg)		@(0x40,reg)
 | ||||
| #define PSW(reg)		@(0x44,reg)
 | ||||
| #define BPC(reg)		@(0x48,reg)
 | ||||
| #define BBPSW(reg)		@(0x4C,reg)
 | ||||
| #define BBPC(reg)		@(0x50,reg)
 | ||||
| #define SPU(reg)		@(0x54,reg)
 | ||||
| #define FP(reg)			@(0x58,reg)  /* FP = R13 */
 | ||||
| #define LR(reg)			@(0x5C,reg)
 | ||||
| #define SP(reg)			@(0x60,reg)
 | ||||
| #define ORIG_R0(reg)		@(0x64,reg)
 | ||||
| #else | ||||
| #error unknown isa configuration | ||||
| #endif | ||||
| 
 | ||||
| CF_MASK		= 0x00000001 | ||||
| TF_MASK		= 0x00000100 | ||||
| @ -142,7 +132,7 @@ VM_MASK		= 0x00020000 | ||||
| #endif | ||||
| 
 | ||||
| ENTRY(ret_from_fork) | ||||
| 	ld	r0, @sp+
 | ||||
| 	pop	r0 | ||||
| 	bl	schedule_tail | ||||
| 	GET_THREAD_INFO(r8) | ||||
| 	bra	syscall_exit | ||||
| @ -231,7 +221,7 @@ restore_all: | ||||
| 	RESTORE_ALL | ||||
| 
 | ||||
| 	# perform work that needs to be done immediately before resumption | ||||
| 	# r9 : frags | ||||
| 	# r9 : flags | ||||
| 	ALIGN | ||||
| work_pending: | ||||
| 	and3	r4, r9, #_TIF_NEED_RESCHED | ||||
| @ -320,7 +310,7 @@ ENTRY(ei_handler) | ||||
| ;    GET_ICU_STATUS;
 | ||||
| 	seth	r0, #shigh(M32R_ICU_ISTS_ADDR) | ||||
| 	ld	r0, @(low(M32R_ICU_ISTS_ADDR),r0)
 | ||||
| 	st	r0, @-sp
 | ||||
| 	push	r0 | ||||
| #if defined(CONFIG_SMP) | ||||
| 	/* | ||||
| 	 * If IRQ == 0      --> Nothing to do,  Not write IMASK | ||||
| @ -557,7 +547,7 @@ check_end: | ||||
| #endif  /* CONFIG_PLAT_M32104UT */ | ||||
| 	bl	do_IRQ | ||||
| #endif  /* CONFIG_SMP */ | ||||
| 	ld	r14, @sp+
 | ||||
| 	pop	r14 | ||||
| 	seth	r0, #shigh(M32R_ICU_IMASK_ADDR) | ||||
| 	st	r14, @(low(M32R_ICU_IMASK_ADDR),r0)
 | ||||
| #else | ||||
| @ -1015,4 +1005,3 @@ ENTRY(sys_call_table) | ||||
| 	.long sys_waitid
 | ||||
| 
 | ||||
| syscall_table_size=(.-sys_call_table) | ||||
| 
 | ||||
|  | ||||
| @ -23,9 +23,6 @@ EXPORT_SYMBOL(boot_cpu_data); | ||||
| EXPORT_SYMBOL(dump_fpu); | ||||
| EXPORT_SYMBOL(__ioremap); | ||||
| EXPORT_SYMBOL(iounmap); | ||||
| EXPORT_SYMBOL(enable_irq); | ||||
| EXPORT_SYMBOL(disable_irq); | ||||
| EXPORT_SYMBOL(disable_irq_nosync); | ||||
| EXPORT_SYMBOL(kernel_thread); | ||||
| EXPORT_SYMBOL(__down); | ||||
| EXPORT_SYMBOL(__down_interruptible); | ||||
| @ -38,13 +35,6 @@ EXPORT_SYMBOL(__udelay); | ||||
| EXPORT_SYMBOL(__delay); | ||||
| EXPORT_SYMBOL(__const_udelay); | ||||
| 
 | ||||
| EXPORT_SYMBOL(__get_user_1); | ||||
| EXPORT_SYMBOL(__get_user_2); | ||||
| EXPORT_SYMBOL(__get_user_4); | ||||
| 
 | ||||
| EXPORT_SYMBOL(strpbrk); | ||||
| EXPORT_SYMBOL(strstr); | ||||
| 
 | ||||
| EXPORT_SYMBOL(strncpy_from_user); | ||||
| EXPORT_SYMBOL(__strncpy_from_user); | ||||
| EXPORT_SYMBOL(clear_user); | ||||
| @ -59,11 +49,8 @@ extern void *dcache_dummy; | ||||
| EXPORT_SYMBOL(dcache_dummy); | ||||
| #endif | ||||
| EXPORT_SYMBOL(cpu_data); | ||||
| EXPORT_SYMBOL(cpu_online_map); | ||||
| EXPORT_SYMBOL(cpu_callout_map); | ||||
| 
 | ||||
| /* Global SMP stuff */ | ||||
| EXPORT_SYMBOL(synchronize_irq); | ||||
| EXPORT_SYMBOL(smp_call_function); | ||||
| 
 | ||||
| /* TLB flushing */ | ||||
| @ -83,27 +70,11 @@ EXPORT_SYMBOL(__lshrdi3); | ||||
| EXPORT_SYMBOL(__muldi3); | ||||
| 
 | ||||
| /* memory and string operations */ | ||||
| EXPORT_SYMBOL(memchr); | ||||
| EXPORT_SYMBOL(memcpy); | ||||
| /* EXPORT_SYMBOL(memcpy_fromio); // not implement yet */ | ||||
| /* EXPORT_SYMBOL(memcpy_toio); // not implement yet */ | ||||
| EXPORT_SYMBOL(memset); | ||||
| /* EXPORT_SYMBOL(memset_io); // not implement yet */ | ||||
| EXPORT_SYMBOL(memmove); | ||||
| EXPORT_SYMBOL(memcmp); | ||||
| EXPORT_SYMBOL(memscan); | ||||
| EXPORT_SYMBOL(copy_page); | ||||
| EXPORT_SYMBOL(clear_page); | ||||
| 
 | ||||
| EXPORT_SYMBOL(strcat); | ||||
| EXPORT_SYMBOL(strchr); | ||||
| EXPORT_SYMBOL(strcmp); | ||||
| EXPORT_SYMBOL(strcpy); | ||||
| EXPORT_SYMBOL(strlen); | ||||
| EXPORT_SYMBOL(strncat); | ||||
| EXPORT_SYMBOL(strncmp); | ||||
| EXPORT_SYMBOL(strnlen); | ||||
| EXPORT_SYMBOL(strncpy); | ||||
| 
 | ||||
| EXPORT_SYMBOL(_inb); | ||||
| EXPORT_SYMBOL(_inw); | ||||
|  | ||||
| @ -116,6 +116,10 @@ void cpu_idle (void) | ||||
| 
 | ||||
| void machine_restart(char *__unused) | ||||
| { | ||||
| #if defined(CONFIG_PLAT_MAPPI3) | ||||
| 	outw(1, (unsigned long)PLD_REBOOT); | ||||
| #endif | ||||
| 
 | ||||
| 	printk("Please push reset button!\n"); | ||||
| 	while (1) | ||||
| 		cpu_relax(); | ||||
|  | ||||
| @ -9,6 +9,7 @@ | ||||
| 
 | ||||
| #include <linux/config.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/stddef.h> | ||||
| #include <linux/fs.h> | ||||
| #include <linux/sched.h> | ||||
| @ -219,8 +220,6 @@ static unsigned long __init setup_memory(void) | ||||
| extern unsigned long setup_memory(void); | ||||
| #endif	/* CONFIG_DISCONTIGMEM */ | ||||
| 
 | ||||
| #define M32R_PCC_PCATCR	0x00ef7014	/* will move to m32r.h */ | ||||
| 
 | ||||
| void __init setup_arch(char **cmdline_p) | ||||
| { | ||||
| 	ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV); | ||||
| @ -269,15 +268,14 @@ void __init setup_arch(char **cmdline_p) | ||||
| 	paging_init(); | ||||
| } | ||||
| 
 | ||||
| static struct cpu cpu[NR_CPUS]; | ||||
| static struct cpu cpu_devices[NR_CPUS]; | ||||
| 
 | ||||
| static int __init topology_init(void) | ||||
| { | ||||
| 	int cpu_id; | ||||
| 	int i; | ||||
| 
 | ||||
| 	for (cpu_id = 0; cpu_id < NR_CPUS; cpu_id++) | ||||
| 		if (cpu_possible(cpu_id)) | ||||
| 			register_cpu(&cpu[cpu_id], cpu_id, NULL); | ||||
| 	for_each_present_cpu(i) | ||||
| 		register_cpu(&cpu_devices[i], i, NULL); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| @ -118,6 +118,8 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, | ||||
| #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) | ||||
| 	COPY(acch); | ||||
| 	COPY(accl); | ||||
| 	COPY(dummy_acc1h); | ||||
| 	COPY(dummy_acc1l); | ||||
| #else | ||||
| #error unknown isa configuration | ||||
| #endif | ||||
| @ -203,6 +205,8 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, | ||||
| #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R) | ||||
| 	COPY(acch); | ||||
| 	COPY(accl); | ||||
| 	COPY(dummy_acc1h); | ||||
| 	COPY(dummy_acc1l); | ||||
| #else | ||||
| #error unknown isa configuration | ||||
| #endif | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user