Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: drivers/net/wireless/ath/ath9k/recv.c drivers/net/wireless/mwifiex/pcie.c net/ipv6/sit.c The SIT driver conflict consists of a bug fix being done by hand in 'net' (missing u64_stats_init()) whilst in 'net-next' a helper was created (netdev_alloc_pcpu_stats()) which takes care of this. The two wireless conflicts were overlapping changes. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
				commit
				
					
						67ddc87f16
					
				
			
		
					 494 changed files with 4864 additions and 2987 deletions
				
			
		| 
						 | 
					@ -3,8 +3,7 @@ Date:		Nov 2010
 | 
				
			||||||
Contact:	Kay Sievers <kay.sievers@vrfy.org>
 | 
					Contact:	Kay Sievers <kay.sievers@vrfy.org>
 | 
				
			||||||
Description:
 | 
					Description:
 | 
				
			||||||
		 Shows the list of currently configured
 | 
							 Shows the list of currently configured
 | 
				
			||||||
		 tty devices used for the console,
 | 
							 console devices, like 'tty1 ttyS0'.
 | 
				
			||||||
		 like 'tty1 ttyS0'.
 | 
					 | 
				
			||||||
		 The last entry in the file is the active
 | 
							 The last entry in the file is the active
 | 
				
			||||||
		 device connected to /dev/console.
 | 
							 device connected to /dev/console.
 | 
				
			||||||
		 The file supports poll() to detect virtual
 | 
							 The file supports poll() to detect virtual
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -82,7 +82,19 @@ Most of the hard work is done for the driver in the PCI layer.  It simply
 | 
				
			||||||
has to request that the PCI layer set up the MSI capability for this
 | 
					has to request that the PCI layer set up the MSI capability for this
 | 
				
			||||||
device.
 | 
					device.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
4.2.1 pci_enable_msi_range
 | 
					4.2.1 pci_enable_msi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int pci_enable_msi(struct pci_dev *dev)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A successful call allocates ONE interrupt to the device, regardless
 | 
				
			||||||
 | 
					of how many MSIs the device supports.  The device is switched from
 | 
				
			||||||
 | 
					pin-based interrupt mode to MSI mode.  The dev->irq number is changed
 | 
				
			||||||
 | 
					to a new number which represents the message signaled interrupt;
 | 
				
			||||||
 | 
					consequently, this function should be called before the driver calls
 | 
				
			||||||
 | 
					request_irq(), because an MSI is delivered via a vector that is
 | 
				
			||||||
 | 
					different from the vector of a pin-based interrupt.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					4.2.2 pci_enable_msi_range
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec)
 | 
					int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -147,6 +159,11 @@ static int foo_driver_enable_msi(struct pci_dev *pdev, int nvec)
 | 
				
			||||||
	return pci_enable_msi_range(pdev, nvec, nvec);
 | 
						return pci_enable_msi_range(pdev, nvec, nvec);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Note, unlike pci_enable_msi_exact() function, which could be also used to
 | 
				
			||||||
 | 
					enable a particular number of MSI-X interrupts, pci_enable_msi_range()
 | 
				
			||||||
 | 
					returns either a negative errno or 'nvec' (not negative errno or 0 - as
 | 
				
			||||||
 | 
					pci_enable_msi_exact() does).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
4.2.1.3 Single MSI mode
 | 
					4.2.1.3 Single MSI mode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The most notorious example of the request type described above is
 | 
					The most notorious example of the request type described above is
 | 
				
			||||||
| 
						 | 
					@ -158,7 +175,27 @@ static int foo_driver_enable_single_msi(struct pci_dev *pdev)
 | 
				
			||||||
	return pci_enable_msi_range(pdev, 1, 1);
 | 
						return pci_enable_msi_range(pdev, 1, 1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
4.2.2 pci_disable_msi
 | 
					Note, unlike pci_enable_msi() function, which could be also used to
 | 
				
			||||||
 | 
					enable the single MSI mode, pci_enable_msi_range() returns either a
 | 
				
			||||||
 | 
					negative errno or 1 (not negative errno or 0 - as pci_enable_msi()
 | 
				
			||||||
 | 
					does).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					4.2.3 pci_enable_msi_exact
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int pci_enable_msi_exact(struct pci_dev *dev, int nvec)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This variation on pci_enable_msi_range() call allows a device driver to
 | 
				
			||||||
 | 
					request exactly 'nvec' MSIs.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If this function returns a negative number, it indicates an error and
 | 
				
			||||||
 | 
					the driver should not attempt to request any more MSI interrupts for
 | 
				
			||||||
 | 
					this device.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					By contrast with pci_enable_msi_range() function, pci_enable_msi_exact()
 | 
				
			||||||
 | 
					returns zero in case of success, which indicates MSI interrupts have been
 | 
				
			||||||
 | 
					successfully allocated.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					4.2.4 pci_disable_msi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void pci_disable_msi(struct pci_dev *dev)
 | 
					void pci_disable_msi(struct pci_dev *dev)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -172,7 +209,7 @@ on any interrupt for which it previously called request_irq().
 | 
				
			||||||
Failure to do so results in a BUG_ON(), leaving the device with
 | 
					Failure to do so results in a BUG_ON(), leaving the device with
 | 
				
			||||||
MSI enabled and thus leaking its vector.
 | 
					MSI enabled and thus leaking its vector.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
4.2.3 pci_msi_vec_count
 | 
					4.2.4 pci_msi_vec_count
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int pci_msi_vec_count(struct pci_dev *dev)
 | 
					int pci_msi_vec_count(struct pci_dev *dev)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -257,7 +294,7 @@ possible, likely up to the limit returned by pci_msix_vec_count() function:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int foo_driver_enable_msix(struct foo_adapter *adapter, int nvec)
 | 
					static int foo_driver_enable_msix(struct foo_adapter *adapter, int nvec)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return pci_enable_msi_range(adapter->pdev, adapter->msix_entries,
 | 
						return pci_enable_msix_range(adapter->pdev, adapter->msix_entries,
 | 
				
			||||||
				     1, nvec);
 | 
									     1, nvec);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -269,7 +306,7 @@ In this case the function could look like this:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int foo_driver_enable_msix(struct foo_adapter *adapter, int nvec)
 | 
					static int foo_driver_enable_msix(struct foo_adapter *adapter, int nvec)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return pci_enable_msi_range(adapter->pdev, adapter->msix_entries,
 | 
						return pci_enable_msix_range(adapter->pdev, adapter->msix_entries,
 | 
				
			||||||
				     FOO_DRIVER_MINIMUM_NVEC, nvec);
 | 
									     FOO_DRIVER_MINIMUM_NVEC, nvec);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -282,10 +319,15 @@ parameters:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int foo_driver_enable_msix(struct foo_adapter *adapter, int nvec)
 | 
					static int foo_driver_enable_msix(struct foo_adapter *adapter, int nvec)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return pci_enable_msi_range(adapter->pdev, adapter->msix_entries,
 | 
						return pci_enable_msix_range(adapter->pdev, adapter->msix_entries,
 | 
				
			||||||
				     nvec, nvec);
 | 
									     nvec, nvec);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Note, unlike pci_enable_msix_exact() function, which could be also used to
 | 
				
			||||||
 | 
					enable a particular number of MSI-X interrupts, pci_enable_msix_range()
 | 
				
			||||||
 | 
					returns either a negative errno or 'nvec' (not negative errno or 0 - as
 | 
				
			||||||
 | 
					pci_enable_msix_exact() does).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
4.3.1.3 Specific requirements to the number of MSI-X interrupts
 | 
					4.3.1.3 Specific requirements to the number of MSI-X interrupts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
As noted above, there could be devices that can not operate with just any
 | 
					As noted above, there could be devices that can not operate with just any
 | 
				
			||||||
| 
						 | 
					@ -332,7 +374,64 @@ Note how pci_enable_msix_range() return value is analized for a fallback -
 | 
				
			||||||
any error code other than -ENOSPC indicates a fatal error and should not
 | 
					any error code other than -ENOSPC indicates a fatal error and should not
 | 
				
			||||||
be retried.
 | 
					be retried.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
4.3.2 pci_disable_msix
 | 
					4.3.2 pci_enable_msix_exact
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int pci_enable_msix_exact(struct pci_dev *dev,
 | 
				
			||||||
 | 
								  struct msix_entry *entries, int nvec)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This variation on pci_enable_msix_range() call allows a device driver to
 | 
				
			||||||
 | 
					request exactly 'nvec' MSI-Xs.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If this function returns a negative number, it indicates an error and
 | 
				
			||||||
 | 
					the driver should not attempt to allocate any more MSI-X interrupts for
 | 
				
			||||||
 | 
					this device.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					By contrast with pci_enable_msix_range() function, pci_enable_msix_exact()
 | 
				
			||||||
 | 
					returns zero in case of success, which indicates MSI-X interrupts have been
 | 
				
			||||||
 | 
					successfully allocated.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Another version of a routine that enables MSI-X mode for a device with
 | 
				
			||||||
 | 
					specific requirements described in chapter 4.3.1.3 might look like this:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Assume 'minvec' and 'maxvec' are non-zero
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static int foo_driver_enable_msix(struct foo_adapter *adapter,
 | 
				
			||||||
 | 
									  int minvec, int maxvec)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						minvec = roundup_pow_of_two(minvec);
 | 
				
			||||||
 | 
						maxvec = rounddown_pow_of_two(maxvec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (minvec > maxvec)
 | 
				
			||||||
 | 
							return -ERANGE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					retry:
 | 
				
			||||||
 | 
						rc = pci_enable_msix_exact(adapter->pdev,
 | 
				
			||||||
 | 
									   adapter->msix_entries, maxvec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * -ENOSPC is the only error code allowed to be analyzed
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						if (rc == -ENOSPC) {
 | 
				
			||||||
 | 
							if (maxvec == 1)
 | 
				
			||||||
 | 
								return -ENOSPC;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							maxvec /= 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (minvec > maxvec)
 | 
				
			||||||
 | 
								return -ENOSPC;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							goto retry;
 | 
				
			||||||
 | 
						} else if (rc < 0) {
 | 
				
			||||||
 | 
							return rc;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return maxvec;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					4.3.3 pci_disable_msix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void pci_disable_msix(struct pci_dev *dev)
 | 
					void pci_disable_msix(struct pci_dev *dev)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -91,7 +91,7 @@ Boards:
 | 
				
			||||||
  compatible = "ti,omap3-beagle", "ti,omap3"
 | 
					  compatible = "ti,omap3-beagle", "ti,omap3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- OMAP3 Tobi with Overo : Commercial expansion board with daughter board
 | 
					- OMAP3 Tobi with Overo : Commercial expansion board with daughter board
 | 
				
			||||||
  compatible = "ti,omap3-tobi", "ti,omap3-overo", "ti,omap3"
 | 
					  compatible = "gumstix,omap3-overo-tobi", "gumstix,omap3-overo", "ti,omap3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- OMAP4 SDP : Software Development Board
 | 
					- OMAP4 SDP : Software Development Board
 | 
				
			||||||
  compatible = "ti,omap4-sdp", "ti,omap4430"
 | 
					  compatible = "ti,omap4-sdp", "ti,omap4430"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,9 +21,9 @@ Required Properties:
 | 
				
			||||||
    must appear in the same order as the output clocks.
 | 
					    must appear in the same order as the output clocks.
 | 
				
			||||||
  - #clock-cells: Must be 1
 | 
					  - #clock-cells: Must be 1
 | 
				
			||||||
  - clock-output-names: The name of the clocks as free-form strings
 | 
					  - clock-output-names: The name of the clocks as free-form strings
 | 
				
			||||||
  - renesas,indices: Indices of the gate clocks into the group (0 to 31)
 | 
					  - renesas,clock-indices: Indices of the gate clocks into the group (0 to 31)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The clocks, clock-output-names and renesas,indices properties contain one
 | 
					The clocks, clock-output-names and renesas,clock-indices properties contain one
 | 
				
			||||||
entry per gate clock. The MSTP groups are sparsely populated. Unimplemented
 | 
					entry per gate clock. The MSTP groups are sparsely populated. Unimplemented
 | 
				
			||||||
gate clocks must not be declared.
 | 
					gate clocks must not be declared.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,12 +1,16 @@
 | 
				
			||||||
* Freescale Smart Direct Memory Access (SDMA) Controller for i.MX
 | 
					* Freescale Smart Direct Memory Access (SDMA) Controller for i.MX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Required properties:
 | 
					Required properties:
 | 
				
			||||||
- compatible : Should be "fsl,imx31-sdma", "fsl,imx31-to1-sdma",
 | 
					- compatible : Should be one of
 | 
				
			||||||
  "fsl,imx31-to2-sdma", "fsl,imx35-sdma", "fsl,imx35-to1-sdma",
 | 
					      "fsl,imx25-sdma"
 | 
				
			||||||
  "fsl,imx35-to2-sdma", "fsl,imx51-sdma", "fsl,imx53-sdma" or
 | 
					      "fsl,imx31-sdma", "fsl,imx31-to1-sdma", "fsl,imx31-to2-sdma"
 | 
				
			||||||
  "fsl,imx6q-sdma". The -to variants should be preferred since they
 | 
					      "fsl,imx35-sdma", "fsl,imx35-to1-sdma", "fsl,imx35-to2-sdma"
 | 
				
			||||||
  allow to determnine the correct ROM script addresses needed for
 | 
					      "fsl,imx51-sdma"
 | 
				
			||||||
  the driver to work without additional firmware.
 | 
					      "fsl,imx53-sdma"
 | 
				
			||||||
 | 
					      "fsl,imx6q-sdma"
 | 
				
			||||||
 | 
					  The -to variants should be preferred since they allow to determnine the
 | 
				
			||||||
 | 
					  correct ROM script addresses needed for the driver to work without additional
 | 
				
			||||||
 | 
					  firmware.
 | 
				
			||||||
- reg : Should contain SDMA registers location and length
 | 
					- reg : Should contain SDMA registers location and length
 | 
				
			||||||
- interrupts : Should contain SDMA interrupt
 | 
					- interrupts : Should contain SDMA interrupt
 | 
				
			||||||
- #dma-cells : Must be <3>.
 | 
					- #dma-cells : Must be <3>.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										22
									
								
								Documentation/devicetree/bindings/net/opencores-ethoc.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								Documentation/devicetree/bindings/net/opencores-ethoc.txt
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					* OpenCores MAC 10/100 Mbps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Required properties:
 | 
				
			||||||
 | 
					- compatible: Should be "opencores,ethoc".
 | 
				
			||||||
 | 
					- reg: two memory regions (address and length),
 | 
				
			||||||
 | 
					  first region is for the device registers and descriptor rings,
 | 
				
			||||||
 | 
					  second is for the device packet memory.
 | 
				
			||||||
 | 
					- interrupts: interrupt for the device.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Optional properties:
 | 
				
			||||||
 | 
					- clocks: phandle to refer to the clk used as per
 | 
				
			||||||
 | 
					  Documentation/devicetree/bindings/clock/clock-bindings.txt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Examples:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						enet0: ethoc@fd030000 {
 | 
				
			||||||
 | 
							compatible = "opencores,ethoc";
 | 
				
			||||||
 | 
							reg = <0xfd030000 0x4000 0xfd800000 0x4000>;
 | 
				
			||||||
 | 
							interrupts = <1>;
 | 
				
			||||||
 | 
							local-mac-address = [00 50 c2 13 6f 00];
 | 
				
			||||||
 | 
							clocks = <&osc>;
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
| 
						 | 
					@ -554,12 +554,6 @@ solution for a couple of reasons:
 | 
				
			||||||
  not specified in the struct can_frame and therefore it is only valid in
 | 
					  not specified in the struct can_frame and therefore it is only valid in
 | 
				
			||||||
  CANFD_MTU sized CAN FD frames.
 | 
					  CANFD_MTU sized CAN FD frames.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  As long as the payload length is <=8 the received CAN frames from CAN FD
 | 
					 | 
				
			||||||
  capable CAN devices can be received and read by legacy sockets too. When
 | 
					 | 
				
			||||||
  user-generated CAN FD frames have a payload length <=8 these can be send
 | 
					 | 
				
			||||||
  by legacy CAN network interfaces too. Sending CAN FD frames with payload
 | 
					 | 
				
			||||||
  length > 8 to a legacy CAN network interface returns an -EMSGSIZE error.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Implementation hint for new CAN applications:
 | 
					  Implementation hint for new CAN applications:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  To build a CAN FD aware application use struct canfd_frame as basic CAN
 | 
					  To build a CAN FD aware application use struct canfd_frame as basic CAN
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										49
									
								
								MAINTAINERS
									
										
									
									
									
								
							
							
						
						
									
										49
									
								
								MAINTAINERS
									
										
									
									
									
								
							| 
						 | 
					@ -73,7 +73,8 @@ Descriptions of section entries:
 | 
				
			||||||
	L: Mailing list that is relevant to this area
 | 
						L: Mailing list that is relevant to this area
 | 
				
			||||||
	W: Web-page with status/info
 | 
						W: Web-page with status/info
 | 
				
			||||||
	Q: Patchwork web based patch tracking system site
 | 
						Q: Patchwork web based patch tracking system site
 | 
				
			||||||
	T: SCM tree type and location.  Type is one of: git, hg, quilt, stgit, topgit.
 | 
						T: SCM tree type and location.
 | 
				
			||||||
 | 
						   Type is one of: git, hg, quilt, stgit, topgit
 | 
				
			||||||
	S: Status, one of the following:
 | 
						S: Status, one of the following:
 | 
				
			||||||
	   Supported:	Someone is actually paid to look after this.
 | 
						   Supported:	Someone is actually paid to look after this.
 | 
				
			||||||
	   Maintained:	Someone actually looks after it.
 | 
						   Maintained:	Someone actually looks after it.
 | 
				
			||||||
| 
						 | 
					@ -538,7 +539,7 @@ F:	arch/alpha/
 | 
				
			||||||
ALTERA UART/JTAG UART SERIAL DRIVERS
 | 
					ALTERA UART/JTAG UART SERIAL DRIVERS
 | 
				
			||||||
M:	Tobias Klauser <tklauser@distanz.ch>
 | 
					M:	Tobias Klauser <tklauser@distanz.ch>
 | 
				
			||||||
L:	linux-serial@vger.kernel.org
 | 
					L:	linux-serial@vger.kernel.org
 | 
				
			||||||
L:	nios2-dev@sopc.et.ntust.edu.tw (moderated for non-subscribers)
 | 
					L:	nios2-dev@lists.rocketboards.org (moderated for non-subscribers)
 | 
				
			||||||
S:	Maintained
 | 
					S:	Maintained
 | 
				
			||||||
F:	drivers/tty/serial/altera_uart.c
 | 
					F:	drivers/tty/serial/altera_uart.c
 | 
				
			||||||
F:	drivers/tty/serial/altera_jtaguart.c
 | 
					F:	drivers/tty/serial/altera_jtaguart.c
 | 
				
			||||||
| 
						 | 
					@ -1866,6 +1867,7 @@ F:	drivers/net/ethernet/broadcom/bnx2x/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BROADCOM BCM281XX/BCM11XXX ARM ARCHITECTURE
 | 
					BROADCOM BCM281XX/BCM11XXX ARM ARCHITECTURE
 | 
				
			||||||
M:	Christian Daudt <bcm@fixthebug.org>
 | 
					M:	Christian Daudt <bcm@fixthebug.org>
 | 
				
			||||||
 | 
					M:	Matt Porter <mporter@linaro.org>
 | 
				
			||||||
L:	bcm-kernel-feedback-list@broadcom.com
 | 
					L:	bcm-kernel-feedback-list@broadcom.com
 | 
				
			||||||
T:	git git://git.github.com/broadcom/bcm11351
 | 
					T:	git git://git.github.com/broadcom/bcm11351
 | 
				
			||||||
S:	Maintained
 | 
					S:	Maintained
 | 
				
			||||||
| 
						 | 
					@ -2164,7 +2166,7 @@ F:	Documentation/zh_CN/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CHIPIDEA USB HIGH SPEED DUAL ROLE CONTROLLER
 | 
					CHIPIDEA USB HIGH SPEED DUAL ROLE CONTROLLER
 | 
				
			||||||
M:	Peter Chen <Peter.Chen@freescale.com>
 | 
					M:	Peter Chen <Peter.Chen@freescale.com>
 | 
				
			||||||
T:	git://github.com/hzpeterchen/linux-usb.git
 | 
					T:	git git://github.com/hzpeterchen/linux-usb.git
 | 
				
			||||||
L:	linux-usb@vger.kernel.org
 | 
					L:	linux-usb@vger.kernel.org
 | 
				
			||||||
S:	Maintained
 | 
					S:	Maintained
 | 
				
			||||||
F:	drivers/usb/chipidea/
 | 
					F:	drivers/usb/chipidea/
 | 
				
			||||||
| 
						 | 
					@ -2387,7 +2389,7 @@ M:      Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
 | 
				
			||||||
M:	Daniel Lezcano <daniel.lezcano@linaro.org>
 | 
					M:	Daniel Lezcano <daniel.lezcano@linaro.org>
 | 
				
			||||||
L:	linux-pm@vger.kernel.org
 | 
					L:	linux-pm@vger.kernel.org
 | 
				
			||||||
L:	linux-arm-kernel@lists.infradead.org
 | 
					L:	linux-arm-kernel@lists.infradead.org
 | 
				
			||||||
T:      git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
 | 
				
			||||||
S:	Maintained
 | 
					S:	Maintained
 | 
				
			||||||
F:	drivers/cpuidle/cpuidle-big_little.c
 | 
					F:	drivers/cpuidle/cpuidle-big_little.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2396,7 +2398,7 @@ M:	Rafael J. Wysocki <rjw@rjwysocki.net>
 | 
				
			||||||
M:	Daniel Lezcano <daniel.lezcano@linaro.org>
 | 
					M:	Daniel Lezcano <daniel.lezcano@linaro.org>
 | 
				
			||||||
L:	linux-pm@vger.kernel.org
 | 
					L:	linux-pm@vger.kernel.org
 | 
				
			||||||
S:	Maintained
 | 
					S:	Maintained
 | 
				
			||||||
T:	git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
 | 
				
			||||||
F:	drivers/cpuidle/*
 | 
					F:	drivers/cpuidle/*
 | 
				
			||||||
F:	include/linux/cpuidle.h
 | 
					F:	include/linux/cpuidle.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2414,8 +2416,10 @@ F:	tools/power/cpupower/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CPUSETS
 | 
					CPUSETS
 | 
				
			||||||
M:	Li Zefan <lizefan@huawei.com>
 | 
					M:	Li Zefan <lizefan@huawei.com>
 | 
				
			||||||
 | 
					L:	cgroups@vger.kernel.org
 | 
				
			||||||
W:	http://www.bullopensource.org/cpuset/
 | 
					W:	http://www.bullopensource.org/cpuset/
 | 
				
			||||||
W:	http://oss.sgi.com/projects/cpusets/
 | 
					W:	http://oss.sgi.com/projects/cpusets/
 | 
				
			||||||
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git
 | 
				
			||||||
S:	Maintained
 | 
					S:	Maintained
 | 
				
			||||||
F:	Documentation/cgroups/cpusets.txt
 | 
					F:	Documentation/cgroups/cpusets.txt
 | 
				
			||||||
F:	include/linux/cpuset.h
 | 
					F:	include/linux/cpuset.h
 | 
				
			||||||
| 
						 | 
					@ -2614,9 +2618,9 @@ DC395x SCSI driver
 | 
				
			||||||
M:	Oliver Neukum <oliver@neukum.org>
 | 
					M:	Oliver Neukum <oliver@neukum.org>
 | 
				
			||||||
M:	Ali Akcaagac <aliakc@web.de>
 | 
					M:	Ali Akcaagac <aliakc@web.de>
 | 
				
			||||||
M:	Jamie Lenehan <lenehan@twibble.org>
 | 
					M:	Jamie Lenehan <lenehan@twibble.org>
 | 
				
			||||||
W:	http://twibble.org/dist/dc395x/
 | 
					 | 
				
			||||||
L:	dc395x@twibble.org
 | 
					L:	dc395x@twibble.org
 | 
				
			||||||
L:	http://lists.twibble.org/mailman/listinfo/dc395x/
 | 
					W:	http://twibble.org/dist/dc395x/
 | 
				
			||||||
 | 
					W:	http://lists.twibble.org/mailman/listinfo/dc395x/
 | 
				
			||||||
S:	Maintained
 | 
					S:	Maintained
 | 
				
			||||||
F:	Documentation/scsi/dc395x.txt
 | 
					F:	Documentation/scsi/dc395x.txt
 | 
				
			||||||
F:	drivers/scsi/dc395x.*
 | 
					F:	drivers/scsi/dc395x.*
 | 
				
			||||||
| 
						 | 
					@ -2851,12 +2855,22 @@ F:	lib/kobj*
 | 
				
			||||||
DRM DRIVERS
 | 
					DRM DRIVERS
 | 
				
			||||||
M:	David Airlie <airlied@linux.ie>
 | 
					M:	David Airlie <airlied@linux.ie>
 | 
				
			||||||
L:	dri-devel@lists.freedesktop.org
 | 
					L:	dri-devel@lists.freedesktop.org
 | 
				
			||||||
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6.git
 | 
					T:	git git://people.freedesktop.org/~airlied/linux
 | 
				
			||||||
S:	Maintained
 | 
					S:	Maintained
 | 
				
			||||||
F:	drivers/gpu/drm/
 | 
					F:	drivers/gpu/drm/
 | 
				
			||||||
F:	include/drm/
 | 
					F:	include/drm/
 | 
				
			||||||
F:	include/uapi/drm/
 | 
					F:	include/uapi/drm/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RADEON DRM DRIVERS
 | 
				
			||||||
 | 
					M:	Alex Deucher <alexander.deucher@amd.com>
 | 
				
			||||||
 | 
					M:	Christian König <christian.koenig@amd.com>
 | 
				
			||||||
 | 
					L:	dri-devel@lists.freedesktop.org
 | 
				
			||||||
 | 
					T:	git git://people.freedesktop.org/~agd5f/linux
 | 
				
			||||||
 | 
					S:	Supported
 | 
				
			||||||
 | 
					F:	drivers/gpu/drm/radeon/
 | 
				
			||||||
 | 
					F:	include/drm/radeon*
 | 
				
			||||||
 | 
					F:	include/uapi/drm/radeon*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets)
 | 
					INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets)
 | 
				
			||||||
M:	Daniel Vetter <daniel.vetter@ffwll.ch>
 | 
					M:	Daniel Vetter <daniel.vetter@ffwll.ch>
 | 
				
			||||||
M:	Jani Nikula <jani.nikula@linux.intel.com>
 | 
					M:	Jani Nikula <jani.nikula@linux.intel.com>
 | 
				
			||||||
| 
						 | 
					@ -3088,6 +3102,8 @@ F:	fs/ecryptfs/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EDAC-CORE
 | 
					EDAC-CORE
 | 
				
			||||||
M:	Doug Thompson <dougthompson@xmission.com>
 | 
					M:	Doug Thompson <dougthompson@xmission.com>
 | 
				
			||||||
 | 
					M:	Borislav Petkov <bp@alien8.de>
 | 
				
			||||||
 | 
					M:	Mauro Carvalho Chehab <m.chehab@samsung.com>
 | 
				
			||||||
L:	linux-edac@vger.kernel.org
 | 
					L:	linux-edac@vger.kernel.org
 | 
				
			||||||
W:	bluesmoke.sourceforge.net
 | 
					W:	bluesmoke.sourceforge.net
 | 
				
			||||||
S:	Supported
 | 
					S:	Supported
 | 
				
			||||||
| 
						 | 
					@ -4551,6 +4567,7 @@ F:	Documentation/networking/ixgbevf.txt
 | 
				
			||||||
F:	Documentation/networking/i40e.txt
 | 
					F:	Documentation/networking/i40e.txt
 | 
				
			||||||
F:	Documentation/networking/i40evf.txt
 | 
					F:	Documentation/networking/i40evf.txt
 | 
				
			||||||
F:	drivers/net/ethernet/intel/
 | 
					F:	drivers/net/ethernet/intel/
 | 
				
			||||||
 | 
					F:	drivers/net/ethernet/intel/*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
INTEL-MID GPIO DRIVER
 | 
					INTEL-MID GPIO DRIVER
 | 
				
			||||||
M:	David Cohen <david.a.cohen@linux.intel.com>
 | 
					M:	David Cohen <david.a.cohen@linux.intel.com>
 | 
				
			||||||
| 
						 | 
					@ -4907,7 +4924,7 @@ F:	drivers/staging/ktap/
 | 
				
			||||||
KCONFIG
 | 
					KCONFIG
 | 
				
			||||||
M:	"Yann E. MORIN" <yann.morin.1998@free.fr>
 | 
					M:	"Yann E. MORIN" <yann.morin.1998@free.fr>
 | 
				
			||||||
L:	linux-kbuild@vger.kernel.org
 | 
					L:	linux-kbuild@vger.kernel.org
 | 
				
			||||||
T:	git://gitorious.org/linux-kconfig/linux-kconfig
 | 
					T:	git git://gitorious.org/linux-kconfig/linux-kconfig
 | 
				
			||||||
S:	Maintained
 | 
					S:	Maintained
 | 
				
			||||||
F:	Documentation/kbuild/kconfig-language.txt
 | 
					F:	Documentation/kbuild/kconfig-language.txt
 | 
				
			||||||
F:	scripts/kconfig/
 | 
					F:	scripts/kconfig/
 | 
				
			||||||
| 
						 | 
					@ -5504,6 +5521,11 @@ W:	http://www.kernel.org/doc/man-pages
 | 
				
			||||||
L:	linux-man@vger.kernel.org
 | 
					L:	linux-man@vger.kernel.org
 | 
				
			||||||
S:	Maintained
 | 
					S:	Maintained
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MARVELL ARMADA DRM SUPPORT
 | 
				
			||||||
 | 
					M:	Russell King <rmk+kernel@arm.linux.org.uk>
 | 
				
			||||||
 | 
					S:	Maintained
 | 
				
			||||||
 | 
					F:	drivers/gpu/drm/armada/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MARVELL GIGABIT ETHERNET DRIVERS (skge/sky2)
 | 
					MARVELL GIGABIT ETHERNET DRIVERS (skge/sky2)
 | 
				
			||||||
M:	Mirko Lindner <mlindner@marvell.com>
 | 
					M:	Mirko Lindner <mlindner@marvell.com>
 | 
				
			||||||
M:	Stephen Hemminger <stephen@networkplumber.org>
 | 
					M:	Stephen Hemminger <stephen@networkplumber.org>
 | 
				
			||||||
| 
						 | 
					@ -5721,7 +5743,7 @@ L:	linux-rdma@vger.kernel.org
 | 
				
			||||||
W:	http://www.mellanox.com
 | 
					W:	http://www.mellanox.com
 | 
				
			||||||
Q:	http://patchwork.ozlabs.org/project/netdev/list/
 | 
					Q:	http://patchwork.ozlabs.org/project/netdev/list/
 | 
				
			||||||
Q:	http://patchwork.kernel.org/project/linux-rdma/list/
 | 
					Q:	http://patchwork.kernel.org/project/linux-rdma/list/
 | 
				
			||||||
T:	git://openfabrics.org/~eli/connect-ib.git
 | 
					T:	git git://openfabrics.org/~eli/connect-ib.git
 | 
				
			||||||
S:	Supported
 | 
					S:	Supported
 | 
				
			||||||
F:	drivers/net/ethernet/mellanox/mlx5/core/
 | 
					F:	drivers/net/ethernet/mellanox/mlx5/core/
 | 
				
			||||||
F:	include/linux/mlx5/
 | 
					F:	include/linux/mlx5/
 | 
				
			||||||
| 
						 | 
					@ -5731,7 +5753,7 @@ M:      Eli Cohen <eli@mellanox.com>
 | 
				
			||||||
L:	linux-rdma@vger.kernel.org
 | 
					L:	linux-rdma@vger.kernel.org
 | 
				
			||||||
W:	http://www.mellanox.com
 | 
					W:	http://www.mellanox.com
 | 
				
			||||||
Q:	http://patchwork.kernel.org/project/linux-rdma/list/
 | 
					Q:	http://patchwork.kernel.org/project/linux-rdma/list/
 | 
				
			||||||
T:      git://openfabrics.org/~eli/connect-ib.git
 | 
					T:	git git://openfabrics.org/~eli/connect-ib.git
 | 
				
			||||||
S:	Supported
 | 
					S:	Supported
 | 
				
			||||||
F:	include/linux/mlx5/
 | 
					F:	include/linux/mlx5/
 | 
				
			||||||
F:	drivers/infiniband/hw/mlx5/
 | 
					F:	drivers/infiniband/hw/mlx5/
 | 
				
			||||||
| 
						 | 
					@ -8442,8 +8464,8 @@ TARGET SUBSYSTEM
 | 
				
			||||||
M:	Nicholas A. Bellinger <nab@linux-iscsi.org>
 | 
					M:	Nicholas A. Bellinger <nab@linux-iscsi.org>
 | 
				
			||||||
L:	linux-scsi@vger.kernel.org
 | 
					L:	linux-scsi@vger.kernel.org
 | 
				
			||||||
L:	target-devel@vger.kernel.org
 | 
					L:	target-devel@vger.kernel.org
 | 
				
			||||||
L:	http://groups.google.com/group/linux-iscsi-target-dev
 | 
					 | 
				
			||||||
W:	http://www.linux-iscsi.org
 | 
					W:	http://www.linux-iscsi.org
 | 
				
			||||||
 | 
					W:	http://groups.google.com/group/linux-iscsi-target-dev
 | 
				
			||||||
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending.git master
 | 
					T:	git git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending.git master
 | 
				
			||||||
S:	Supported
 | 
					S:	Supported
 | 
				
			||||||
F:	drivers/target/
 | 
					F:	drivers/target/
 | 
				
			||||||
| 
						 | 
					@ -9728,7 +9750,6 @@ F:	drivers/xen/*swiotlb*
 | 
				
			||||||
XFS FILESYSTEM
 | 
					XFS FILESYSTEM
 | 
				
			||||||
P:	Silicon Graphics Inc
 | 
					P:	Silicon Graphics Inc
 | 
				
			||||||
M:	Dave Chinner <david@fromorbit.com>
 | 
					M:	Dave Chinner <david@fromorbit.com>
 | 
				
			||||||
M:	Ben Myers <bpm@sgi.com>
 | 
					 | 
				
			||||||
M:	xfs@oss.sgi.com
 | 
					M:	xfs@oss.sgi.com
 | 
				
			||||||
L:	xfs@oss.sgi.com
 | 
					L:	xfs@oss.sgi.com
 | 
				
			||||||
W:	http://oss.sgi.com/projects/xfs
 | 
					W:	http://oss.sgi.com/projects/xfs
 | 
				
			||||||
| 
						 | 
					@ -9797,7 +9818,7 @@ ZR36067 VIDEO FOR LINUX DRIVER
 | 
				
			||||||
L:	mjpeg-users@lists.sourceforge.net
 | 
					L:	mjpeg-users@lists.sourceforge.net
 | 
				
			||||||
L:	linux-media@vger.kernel.org
 | 
					L:	linux-media@vger.kernel.org
 | 
				
			||||||
W:	http://mjpeg.sourceforge.net/driver-zoran/
 | 
					W:	http://mjpeg.sourceforge.net/driver-zoran/
 | 
				
			||||||
T:	Mercurial http://linuxtv.org/hg/v4l-dvb
 | 
					T:	hg http://linuxtv.org/hg/v4l-dvb
 | 
				
			||||||
S:	Odd Fixes
 | 
					S:	Odd Fixes
 | 
				
			||||||
F:	drivers/media/pci/zoran/
 | 
					F:	drivers/media/pci/zoran/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								Makefile
									
										
									
									
									
								
							| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
VERSION = 3
 | 
					VERSION = 3
 | 
				
			||||||
PATCHLEVEL = 14
 | 
					PATCHLEVEL = 14
 | 
				
			||||||
SUBLEVEL = 0
 | 
					SUBLEVEL = 0
 | 
				
			||||||
EXTRAVERSION = -rc3
 | 
					EXTRAVERSION = -rc5
 | 
				
			||||||
NAME = Shuffling Zombie Juror
 | 
					NAME = Shuffling Zombie Juror
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# *DOCUMENTATION*
 | 
					# *DOCUMENTATION*
 | 
				
			||||||
| 
						 | 
					@ -605,10 +605,11 @@ endif
 | 
				
			||||||
ifdef CONFIG_CC_STACKPROTECTOR_REGULAR
 | 
					ifdef CONFIG_CC_STACKPROTECTOR_REGULAR
 | 
				
			||||||
  stackp-flag := -fstack-protector
 | 
					  stackp-flag := -fstack-protector
 | 
				
			||||||
  ifeq ($(call cc-option, $(stackp-flag)),)
 | 
					  ifeq ($(call cc-option, $(stackp-flag)),)
 | 
				
			||||||
    $(warning Cannot use CONFIG_CC_STACKPROTECTOR: \
 | 
					    $(warning Cannot use CONFIG_CC_STACKPROTECTOR_REGULAR: \
 | 
				
			||||||
	      -fstack-protector not supported by compiler))
 | 
					             -fstack-protector not supported by compiler)
 | 
				
			||||||
  endif
 | 
					  endif
 | 
				
			||||||
else ifdef CONFIG_CC_STACKPROTECTOR_STRONG
 | 
					else
 | 
				
			||||||
 | 
					ifdef CONFIG_CC_STACKPROTECTOR_STRONG
 | 
				
			||||||
  stackp-flag := -fstack-protector-strong
 | 
					  stackp-flag := -fstack-protector-strong
 | 
				
			||||||
  ifeq ($(call cc-option, $(stackp-flag)),)
 | 
					  ifeq ($(call cc-option, $(stackp-flag)),)
 | 
				
			||||||
    $(warning Cannot use CONFIG_CC_STACKPROTECTOR_STRONG: \
 | 
					    $(warning Cannot use CONFIG_CC_STACKPROTECTOR_STRONG: \
 | 
				
			||||||
| 
						 | 
					@ -618,6 +619,7 @@ else
 | 
				
			||||||
  # Force off for distro compilers that enable stack protector by default.
 | 
					  # Force off for distro compilers that enable stack protector by default.
 | 
				
			||||||
  stackp-flag := $(call cc-option, -fno-stack-protector)
 | 
					  stackp-flag := $(call cc-option, -fno-stack-protector)
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
KBUILD_CFLAGS += $(stackp-flag)
 | 
					KBUILD_CFLAGS += $(stackp-flag)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# This warning generated too much noise in a regular build.
 | 
					# This warning generated too much noise in a regular build.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -209,7 +209,8 @@ dtb-$(CONFIG_ARCH_OMAP2PLUS) += omap2420-h4.dtb \
 | 
				
			||||||
	omap3-n900.dtb \
 | 
						omap3-n900.dtb \
 | 
				
			||||||
	omap3-n9.dtb \
 | 
						omap3-n9.dtb \
 | 
				
			||||||
	omap3-n950.dtb \
 | 
						omap3-n950.dtb \
 | 
				
			||||||
	omap3-tobi.dtb \
 | 
						omap3-overo-tobi.dtb \
 | 
				
			||||||
 | 
						omap3-overo-storm-tobi.dtb \
 | 
				
			||||||
	omap3-gta04.dtb \
 | 
						omap3-gta04.dtb \
 | 
				
			||||||
	omap3-igep0020.dtb \
 | 
						omap3-igep0020.dtb \
 | 
				
			||||||
	omap3-igep0030.dtb \
 | 
						omap3-igep0030.dtb \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -121,7 +121,7 @@
 | 
				
			||||||
		ti,model = "AM335x-EVMSK";
 | 
							ti,model = "AM335x-EVMSK";
 | 
				
			||||||
		ti,audio-codec = <&tlv320aic3106>;
 | 
							ti,audio-codec = <&tlv320aic3106>;
 | 
				
			||||||
		ti,mcasp-controller = <&mcasp1>;
 | 
							ti,mcasp-controller = <&mcasp1>;
 | 
				
			||||||
		ti,codec-clock-rate = <24576000>;
 | 
							ti,codec-clock-rate = <24000000>;
 | 
				
			||||||
		ti,audio-routing =
 | 
							ti,audio-routing =
 | 
				
			||||||
			"Headphone Jack",       "HPLOUT",
 | 
								"Headphone Jack",       "HPLOUT",
 | 
				
			||||||
			"Headphone Jack",       "HPROUT";
 | 
								"Headphone Jack",       "HPROUT";
 | 
				
			||||||
| 
						 | 
					@ -256,6 +256,12 @@
 | 
				
			||||||
		>;
 | 
							>;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mmc1_pins: pinmux_mmc1_pins {
 | 
				
			||||||
 | 
							pinctrl-single,pins = <
 | 
				
			||||||
 | 
								0x160 (PIN_INPUT | MUX_MODE7) /* spi0_cs1.gpio0_6 */
 | 
				
			||||||
 | 
							>;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mcasp1_pins: mcasp1_pins {
 | 
						mcasp1_pins: mcasp1_pins {
 | 
				
			||||||
		pinctrl-single,pins = <
 | 
							pinctrl-single,pins = <
 | 
				
			||||||
			0x10c (PIN_INPUT_PULLDOWN | MUX_MODE4) /* mii1_crs.mcasp1_aclkx */
 | 
								0x10c (PIN_INPUT_PULLDOWN | MUX_MODE4) /* mii1_crs.mcasp1_aclkx */
 | 
				
			||||||
| 
						 | 
					@ -456,6 +462,9 @@
 | 
				
			||||||
	status = "okay";
 | 
						status = "okay";
 | 
				
			||||||
	vmmc-supply = <&vmmc_reg>;
 | 
						vmmc-supply = <&vmmc_reg>;
 | 
				
			||||||
	bus-width = <4>;
 | 
						bus-width = <4>;
 | 
				
			||||||
 | 
						pinctrl-names = "default";
 | 
				
			||||||
 | 
						pinctrl-0 = <&mmc1_pins>;
 | 
				
			||||||
 | 
						cd-gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
&sham {
 | 
					&sham {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,6 +23,7 @@
 | 
				
			||||||
		gpio0 = &gpio0;
 | 
							gpio0 = &gpio0;
 | 
				
			||||||
		gpio1 = &gpio1;
 | 
							gpio1 = &gpio1;
 | 
				
			||||||
		gpio2 = &gpio2;
 | 
							gpio2 = &gpio2;
 | 
				
			||||||
 | 
							eth3 = ð3;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cpus {
 | 
						cpus {
 | 
				
			||||||
| 
						 | 
					@ -291,7 +292,7 @@
 | 
				
			||||||
				interrupts = <91>;
 | 
									interrupts = <91>;
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			ethernet@34000 {
 | 
								eth3: ethernet@34000 {
 | 
				
			||||||
				compatible = "marvell,armada-370-neta";
 | 
									compatible = "marvell,armada-370-neta";
 | 
				
			||||||
				reg = <0x34000 0x4000>;
 | 
									reg = <0x34000 0x4000>;
 | 
				
			||||||
				interrupts = <14>;
 | 
									interrupts = <14>;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -379,15 +379,6 @@
 | 
				
			||||||
				#clock-cells = <1>;
 | 
									#clock-cells = <1>;
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			pmu_intc: pmu-interrupt-ctrl@d0050 {
 | 
					 | 
				
			||||||
				compatible = "marvell,dove-pmu-intc";
 | 
					 | 
				
			||||||
				interrupt-controller;
 | 
					 | 
				
			||||||
				#interrupt-cells = <1>;
 | 
					 | 
				
			||||||
				reg = <0xd0050 0x8>;
 | 
					 | 
				
			||||||
				interrupts = <33>;
 | 
					 | 
				
			||||||
				marvell,#interrupts = <7>;
 | 
					 | 
				
			||||||
			};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			pinctrl: pin-ctrl@d0200 {
 | 
								pinctrl: pin-ctrl@d0200 {
 | 
				
			||||||
				compatible = "marvell,dove-pinctrl";
 | 
									compatible = "marvell,dove-pinctrl";
 | 
				
			||||||
				reg = <0xd0200 0x10>;
 | 
									reg = <0xd0200 0x10>;
 | 
				
			||||||
| 
						 | 
					@ -610,8 +601,6 @@
 | 
				
			||||||
			rtc: real-time-clock@d8500 {
 | 
								rtc: real-time-clock@d8500 {
 | 
				
			||||||
				compatible = "marvell,orion-rtc";
 | 
									compatible = "marvell,orion-rtc";
 | 
				
			||||||
				reg = <0xd8500 0x20>;
 | 
									reg = <0xd8500 0x20>;
 | 
				
			||||||
				interrupt-parent = <&pmu_intc>;
 | 
					 | 
				
			||||||
				interrupts = <5>;
 | 
					 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			gpio2: gpio-ctrl@e8400 {
 | 
								gpio2: gpio-ctrl@e8400 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -612,7 +612,7 @@ clocks {
 | 
				
			||||||
		compatible = "ti,keystone,psc-clock";
 | 
							compatible = "ti,keystone,psc-clock";
 | 
				
			||||||
		clocks = <&chipclk13>;
 | 
							clocks = <&chipclk13>;
 | 
				
			||||||
		clock-output-names = "vcp-3";
 | 
							clock-output-names = "vcp-3";
 | 
				
			||||||
		reg = <0x0235000a8 0xb00>, <0x02350060 0x400>;
 | 
							reg = <0x023500a8 0xb00>, <0x02350060 0x400>;
 | 
				
			||||||
		reg-names = "control", "domain";
 | 
							reg-names = "control", "domain";
 | 
				
			||||||
		domain-id = <24>;
 | 
							domain-id = <24>;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,7 +32,7 @@
 | 
				
			||||||
		aux-button {
 | 
							aux-button {
 | 
				
			||||||
			label = "aux";
 | 
								label = "aux";
 | 
				
			||||||
			linux,code = <169>;
 | 
								linux,code = <169>;
 | 
				
			||||||
			gpios = <&gpio1 7 GPIO_ACTIVE_LOW>;
 | 
								gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
			gpio-key,wakeup;
 | 
								gpio-key,wakeup;
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
| 
						 | 
					@ -92,6 +92,8 @@
 | 
				
			||||||
	bmp085@77 {
 | 
						bmp085@77 {
 | 
				
			||||||
		compatible = "bosch,bmp085";
 | 
							compatible = "bosch,bmp085";
 | 
				
			||||||
		reg = <0x77>;
 | 
							reg = <0x77>;
 | 
				
			||||||
 | 
							interrupt-parent = <&gpio4>;
 | 
				
			||||||
 | 
							interrupts = <17 IRQ_TYPE_EDGE_RISING>;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* leds */
 | 
						/* leds */
 | 
				
			||||||
| 
						 | 
					@ -141,8 +143,8 @@
 | 
				
			||||||
	pinctrl-names = "default";
 | 
						pinctrl-names = "default";
 | 
				
			||||||
	pinctrl-0 = <&mmc1_pins>;
 | 
						pinctrl-0 = <&mmc1_pins>;
 | 
				
			||||||
	vmmc-supply = <&vmmc1>;
 | 
						vmmc-supply = <&vmmc1>;
 | 
				
			||||||
	vmmc_aux-supply = <&vsim>;
 | 
					 | 
				
			||||||
	bus-width = <4>;
 | 
						bus-width = <4>;
 | 
				
			||||||
 | 
						ti,non-removable;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
&mmc2 {
 | 
					&mmc2 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,5 +14,5 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/ {
 | 
					/ {
 | 
				
			||||||
	model = "Nokia N9";
 | 
						model = "Nokia N9";
 | 
				
			||||||
	compatible = "nokia,omap3-n9", "ti,omap3";
 | 
						compatible = "nokia,omap3-n9", "ti,omap36xx", "ti,omap3";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright (C) 2013 Pavel Machek <pavel@ucw.cz>
 | 
					 * Copyright (C) 2013 Pavel Machek <pavel@ucw.cz>
 | 
				
			||||||
 * Copyright 2013 Aaro Koskinen <aaro.koskinen@iki.fi>
 | 
					 * Copyright (C) 2013-2014 Aaro Koskinen <aaro.koskinen@iki.fi>
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software; you can redistribute it and/or modify
 | 
					 * This program is free software; you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License version 2 (or later) as
 | 
					 * it under the terms of the GNU General Public License version 2 (or later) as
 | 
				
			||||||
| 
						 | 
					@ -13,7 +13,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/ {
 | 
					/ {
 | 
				
			||||||
	model = "Nokia N900";
 | 
						model = "Nokia N900";
 | 
				
			||||||
	compatible = "nokia,omap3-n900", "ti,omap3";
 | 
						compatible = "nokia,omap3-n900", "ti,omap3430", "ti,omap3";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cpus {
 | 
						cpus {
 | 
				
			||||||
		cpu@0 {
 | 
							cpu@0 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,5 +14,5 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/ {
 | 
					/ {
 | 
				
			||||||
	model = "Nokia N950";
 | 
						model = "Nokia N950";
 | 
				
			||||||
	compatible = "nokia,omap3-n950", "ti,omap3";
 | 
						compatible = "nokia,omap3-n950", "ti,omap36xx", "ti,omap3";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										22
									
								
								arch/arm/boot/dts/omap3-overo-storm-tobi.dts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								arch/arm/boot/dts/omap3-overo-storm-tobi.dts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (C) 2012 Florian Vaussard, EPFL Mobots group
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * 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.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Tobi expansion board is manufactured by Gumstix Inc.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/dts-v1/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "omap36xx.dtsi"
 | 
				
			||||||
 | 
					#include "omap3-overo-tobi-common.dtsi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/ {
 | 
				
			||||||
 | 
						model = "OMAP36xx/AM37xx/DM37xx Gumstix Overo on Tobi";
 | 
				
			||||||
 | 
						compatible = "gumstix,omap3-overo-tobi", "gumstix,omap3-overo", "ti,omap36xx", "ti,omap3";
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,9 +13,6 @@
 | 
				
			||||||
#include "omap3-overo.dtsi"
 | 
					#include "omap3-overo.dtsi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/ {
 | 
					/ {
 | 
				
			||||||
	model = "TI OMAP3 Gumstix Overo on Tobi";
 | 
					 | 
				
			||||||
	compatible = "ti,omap3-tobi", "ti,omap3-overo", "ti,omap3";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	leds {
 | 
						leds {
 | 
				
			||||||
		compatible = "gpio-leds";
 | 
							compatible = "gpio-leds";
 | 
				
			||||||
		heartbeat {
 | 
							heartbeat {
 | 
				
			||||||
							
								
								
									
										22
									
								
								arch/arm/boot/dts/omap3-overo-tobi.dts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								arch/arm/boot/dts/omap3-overo-tobi.dts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (C) 2012 Florian Vaussard, EPFL Mobots group
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * 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.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Tobi expansion board is manufactured by Gumstix Inc.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/dts-v1/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "omap34xx.dtsi"
 | 
				
			||||||
 | 
					#include "omap3-overo-tobi-common.dtsi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/ {
 | 
				
			||||||
 | 
						model = "OMAP35xx Gumstix Overo on Tobi";
 | 
				
			||||||
 | 
						compatible = "gumstix,omap3-overo-tobi", "gumstix,omap3-overo", "ti,omap3430", "ti,omap3";
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,9 +9,6 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * The Gumstix Overo must be combined with an expansion board.
 | 
					 * The Gumstix Overo must be combined with an expansion board.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
/dts-v1/;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "omap34xx.dtsi"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/ {
 | 
					/ {
 | 
				
			||||||
	pwmleds {
 | 
						pwmleds {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,6 +57,8 @@
 | 
				
			||||||
			resets = <&tegra_car 27>;
 | 
								resets = <&tegra_car 27>;
 | 
				
			||||||
			reset-names = "dc";
 | 
								reset-names = "dc";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								nvidia,head = <0>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			rgb {
 | 
								rgb {
 | 
				
			||||||
				status = "disabled";
 | 
									status = "disabled";
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
| 
						 | 
					@ -72,6 +74,8 @@
 | 
				
			||||||
			resets = <&tegra_car 26>;
 | 
								resets = <&tegra_car 26>;
 | 
				
			||||||
			reset-names = "dc";
 | 
								reset-names = "dc";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								nvidia,head = <1>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			rgb {
 | 
								rgb {
 | 
				
			||||||
				status = "disabled";
 | 
									status = "disabled";
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -94,6 +94,8 @@
 | 
				
			||||||
			resets = <&tegra_car 27>;
 | 
								resets = <&tegra_car 27>;
 | 
				
			||||||
			reset-names = "dc";
 | 
								reset-names = "dc";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								nvidia,head = <0>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			rgb {
 | 
								rgb {
 | 
				
			||||||
				status = "disabled";
 | 
									status = "disabled";
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
| 
						 | 
					@ -109,6 +111,8 @@
 | 
				
			||||||
			resets = <&tegra_car 26>;
 | 
								resets = <&tegra_car 26>;
 | 
				
			||||||
			reset-names = "dc";
 | 
								reset-names = "dc";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								nvidia,head = <1>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			rgb {
 | 
								rgb {
 | 
				
			||||||
				status = "disabled";
 | 
									status = "disabled";
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,7 @@
 | 
				
			||||||
	compatible = "nvidia,cardhu", "nvidia,tegra30";
 | 
						compatible = "nvidia,cardhu", "nvidia,tegra30";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	aliases {
 | 
						aliases {
 | 
				
			||||||
		rtc0 = "/i2c@7000d000/tps6586x@34";
 | 
							rtc0 = "/i2c@7000d000/tps65911@2d";
 | 
				
			||||||
		rtc1 = "/rtc@7000e000";
 | 
							rtc1 = "/rtc@7000e000";
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -170,6 +170,8 @@
 | 
				
			||||||
			resets = <&tegra_car 27>;
 | 
								resets = <&tegra_car 27>;
 | 
				
			||||||
			reset-names = "dc";
 | 
								reset-names = "dc";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								nvidia,head = <0>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			rgb {
 | 
								rgb {
 | 
				
			||||||
				status = "disabled";
 | 
									status = "disabled";
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
| 
						 | 
					@ -185,6 +187,8 @@
 | 
				
			||||||
			resets = <&tegra_car 26>;
 | 
								resets = <&tegra_car 26>;
 | 
				
			||||||
			reset-names = "dc";
 | 
								reset-names = "dc";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								nvidia,head = <1>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			rgb {
 | 
								rgb {
 | 
				
			||||||
				status = "disabled";
 | 
									status = "disabled";
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,2 +0,0 @@
 | 
				
			||||||
/include/ "tests-phandle.dtsi"
 | 
					 | 
				
			||||||
/include/ "tests-interrupts.dtsi"
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
/include/ "versatile-ab.dts"
 | 
					#include <versatile-ab.dts>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/ {
 | 
					/ {
 | 
				
			||||||
	model = "ARM Versatile PB";
 | 
						model = "ARM Versatile PB";
 | 
				
			||||||
| 
						 | 
					@ -47,4 +47,4 @@
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/include/ "testcases/tests.dtsi"
 | 
					#include <testcases.dtsi>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -878,7 +878,8 @@ static int hyp_init_cpu_pm_notifier(struct notifier_block *self,
 | 
				
			||||||
				    unsigned long cmd,
 | 
									    unsigned long cmd,
 | 
				
			||||||
				    void *v)
 | 
									    void *v)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (cmd == CPU_PM_EXIT) {
 | 
						if (cmd == CPU_PM_EXIT &&
 | 
				
			||||||
 | 
						    __hyp_get_vectors() == hyp_default_vectors) {
 | 
				
			||||||
		cpu_init_hyp_mode(NULL);
 | 
							cpu_init_hyp_mode(NULL);
 | 
				
			||||||
		return NOTIFY_OK;
 | 
							return NOTIFY_OK;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -220,6 +220,10 @@ after_vfp_restore:
 | 
				
			||||||
 * in Hyp mode (see init_hyp_mode in arch/arm/kvm/arm.c).  Return values are
 | 
					 * in Hyp mode (see init_hyp_mode in arch/arm/kvm/arm.c).  Return values are
 | 
				
			||||||
 * passed in r0 and r1.
 | 
					 * passed in r0 and r1.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 | 
					 * A function pointer with a value of 0xffffffff has a special meaning,
 | 
				
			||||||
 | 
					 * and is used to implement __hyp_get_vectors in the same way as in
 | 
				
			||||||
 | 
					 * arch/arm/kernel/hyp_stub.S.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 * The calling convention follows the standard AAPCS:
 | 
					 * The calling convention follows the standard AAPCS:
 | 
				
			||||||
 *   r0 - r3: caller save
 | 
					 *   r0 - r3: caller save
 | 
				
			||||||
 *   r12:     caller save
 | 
					 *   r12:     caller save
 | 
				
			||||||
| 
						 | 
					@ -363,6 +367,11 @@ hyp_hvc:
 | 
				
			||||||
host_switch_to_hyp:
 | 
					host_switch_to_hyp:
 | 
				
			||||||
	pop	{r0, r1, r2}
 | 
						pop	{r0, r1, r2}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Check for __hyp_get_vectors */
 | 
				
			||||||
 | 
						cmp	r0, #-1
 | 
				
			||||||
 | 
						mrceq	p15, 4, r0, c12, c0, 0	@ get HVBAR
 | 
				
			||||||
 | 
						beq	1f
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	push	{lr}
 | 
						push	{lr}
 | 
				
			||||||
	mrs	lr, SPSR
 | 
						mrs	lr, SPSR
 | 
				
			||||||
	push	{lr}
 | 
						push	{lr}
 | 
				
			||||||
| 
						 | 
					@ -378,7 +387,7 @@ THUMB(	orr	lr, #1)
 | 
				
			||||||
	pop	{lr}
 | 
						pop	{lr}
 | 
				
			||||||
	msr	SPSR_csxf, lr
 | 
						msr	SPSR_csxf, lr
 | 
				
			||||||
	pop	{lr}
 | 
						pop	{lr}
 | 
				
			||||||
	eret
 | 
					1:	eret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
guest_trap:
 | 
					guest_trap:
 | 
				
			||||||
	load_vcpu			@ Load VCPU pointer to r0
 | 
						load_vcpu			@ Load VCPU pointer to r0
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -101,11 +101,9 @@ obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
 | 
				
			||||||
obj-$(CONFIG_SOC_IMX6Q) += clk-imx6q.o mach-imx6q.o
 | 
					obj-$(CONFIG_SOC_IMX6Q) += clk-imx6q.o mach-imx6q.o
 | 
				
			||||||
obj-$(CONFIG_SOC_IMX6SL) += clk-imx6sl.o mach-imx6sl.o
 | 
					obj-$(CONFIG_SOC_IMX6SL) += clk-imx6sl.o mach-imx6sl.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ifeq ($(CONFIG_PM),y)
 | 
					 | 
				
			||||||
obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o headsmp.o
 | 
					obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o headsmp.o
 | 
				
			||||||
# i.MX6SL reuses i.MX6Q code
 | 
					# i.MX6SL reuses i.MX6Q code
 | 
				
			||||||
obj-$(CONFIG_SOC_IMX6SL) += pm-imx6q.o headsmp.o
 | 
					obj-$(CONFIG_SOC_IMX6SL) += pm-imx6q.o headsmp.o
 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# i.MX5 based machines
 | 
					# i.MX5 based machines
 | 
				
			||||||
obj-$(CONFIG_MACH_MX51_BABBAGE) += mach-mx51_babbage.o
 | 
					obj-$(CONFIG_MACH_MX51_BABBAGE) += mach-mx51_babbage.o
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -144,13 +144,11 @@ void imx6q_set_chicken_bit(void);
 | 
				
			||||||
void imx_cpu_die(unsigned int cpu);
 | 
					void imx_cpu_die(unsigned int cpu);
 | 
				
			||||||
int imx_cpu_kill(unsigned int cpu);
 | 
					int imx_cpu_kill(unsigned int cpu);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_PM
 | 
					 | 
				
			||||||
void imx6q_pm_init(void);
 | 
					void imx6q_pm_init(void);
 | 
				
			||||||
void imx6q_pm_set_ccm_base(void __iomem *base);
 | 
					void imx6q_pm_set_ccm_base(void __iomem *base);
 | 
				
			||||||
 | 
					#ifdef CONFIG_PM
 | 
				
			||||||
void imx5_pm_init(void);
 | 
					void imx5_pm_init(void);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
static inline void imx6q_pm_init(void) {}
 | 
					 | 
				
			||||||
static inline void imx6q_pm_set_ccm_base(void __iomem *base) {}
 | 
					 | 
				
			||||||
static inline void imx5_pm_init(void) {}
 | 
					static inline void imx5_pm_init(void) {}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -156,6 +156,7 @@ static struct omap_usb_config nokia770_usb_config __initdata = {
 | 
				
			||||||
	.register_dev	= 1,
 | 
						.register_dev	= 1,
 | 
				
			||||||
	.hmc_mode	= 16,
 | 
						.hmc_mode	= 16,
 | 
				
			||||||
	.pins[0]	= 6,
 | 
						.pins[0]	= 6,
 | 
				
			||||||
 | 
						.extcon		= "tahvo-usb",
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
 | 
					#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -50,6 +50,7 @@ config SOC_OMAP5
 | 
				
			||||||
	bool "TI OMAP5"
 | 
						bool "TI OMAP5"
 | 
				
			||||||
	depends on ARCH_MULTI_V7
 | 
						depends on ARCH_MULTI_V7
 | 
				
			||||||
	select ARCH_OMAP2PLUS
 | 
						select ARCH_OMAP2PLUS
 | 
				
			||||||
 | 
						select ARCH_HAS_OPP
 | 
				
			||||||
	select ARM_CPU_SUSPEND if PM
 | 
						select ARM_CPU_SUSPEND if PM
 | 
				
			||||||
	select ARM_GIC
 | 
						select ARM_GIC
 | 
				
			||||||
	select CPU_V7
 | 
						select CPU_V7
 | 
				
			||||||
| 
						 | 
					@ -63,6 +64,7 @@ config SOC_AM33XX
 | 
				
			||||||
	bool "TI AM33XX"
 | 
						bool "TI AM33XX"
 | 
				
			||||||
	depends on ARCH_MULTI_V7
 | 
						depends on ARCH_MULTI_V7
 | 
				
			||||||
	select ARCH_OMAP2PLUS
 | 
						select ARCH_OMAP2PLUS
 | 
				
			||||||
 | 
						select ARCH_HAS_OPP
 | 
				
			||||||
	select ARM_CPU_SUSPEND if PM
 | 
						select ARM_CPU_SUSPEND if PM
 | 
				
			||||||
	select CPU_V7
 | 
						select CPU_V7
 | 
				
			||||||
	select MULTI_IRQ_HANDLER
 | 
						select MULTI_IRQ_HANDLER
 | 
				
			||||||
| 
						 | 
					@ -72,6 +74,7 @@ config SOC_AM43XX
 | 
				
			||||||
	depends on ARCH_MULTI_V7
 | 
						depends on ARCH_MULTI_V7
 | 
				
			||||||
	select CPU_V7
 | 
						select CPU_V7
 | 
				
			||||||
	select ARCH_OMAP2PLUS
 | 
						select ARCH_OMAP2PLUS
 | 
				
			||||||
 | 
						select ARCH_HAS_OPP
 | 
				
			||||||
	select MULTI_IRQ_HANDLER
 | 
						select MULTI_IRQ_HANDLER
 | 
				
			||||||
	select ARM_GIC
 | 
						select ARM_GIC
 | 
				
			||||||
	select MACH_OMAP_GENERIC
 | 
						select MACH_OMAP_GENERIC
 | 
				
			||||||
| 
						 | 
					@ -80,6 +83,7 @@ config SOC_DRA7XX
 | 
				
			||||||
	bool "TI DRA7XX"
 | 
						bool "TI DRA7XX"
 | 
				
			||||||
	depends on ARCH_MULTI_V7
 | 
						depends on ARCH_MULTI_V7
 | 
				
			||||||
	select ARCH_OMAP2PLUS
 | 
						select ARCH_OMAP2PLUS
 | 
				
			||||||
 | 
						select ARCH_HAS_OPP
 | 
				
			||||||
	select ARM_CPU_SUSPEND if PM
 | 
						select ARM_CPU_SUSPEND if PM
 | 
				
			||||||
	select ARM_GIC
 | 
						select ARM_GIC
 | 
				
			||||||
	select CPU_V7
 | 
						select CPU_V7
 | 
				
			||||||
| 
						 | 
					@ -268,9 +272,6 @@ config MACH_OMAP_3430SDP
 | 
				
			||||||
	default y
 | 
						default y
 | 
				
			||||||
	select OMAP_PACKAGE_CBB
 | 
						select OMAP_PACKAGE_CBB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config MACH_NOKIA_N800
 | 
					 | 
				
			||||||
       bool
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
config MACH_NOKIA_N810
 | 
					config MACH_NOKIA_N810
 | 
				
			||||||
       bool
 | 
					       bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -281,7 +282,6 @@ config MACH_NOKIA_N8X0
 | 
				
			||||||
	bool "Nokia N800/N810"
 | 
						bool "Nokia N800/N810"
 | 
				
			||||||
	depends on SOC_OMAP2420
 | 
						depends on SOC_OMAP2420
 | 
				
			||||||
	default y
 | 
						default y
 | 
				
			||||||
	select MACH_NOKIA_N800
 | 
					 | 
				
			||||||
	select MACH_NOKIA_N810
 | 
						select MACH_NOKIA_N810
 | 
				
			||||||
	select MACH_NOKIA_N810_WIMAX
 | 
						select MACH_NOKIA_N810_WIMAX
 | 
				
			||||||
	select OMAP_PACKAGE_ZAC
 | 
						select OMAP_PACKAGE_ZAC
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1339,7 +1339,7 @@ static void __maybe_unused gpmc_read_timings_dt(struct device_node *np,
 | 
				
			||||||
		of_property_read_bool(np, "gpmc,time-para-granularity");
 | 
							of_property_read_bool(np, "gpmc,time-para-granularity");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_MTD_NAND
 | 
					#if IS_ENABLED(CONFIG_MTD_NAND)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const char * const nand_xfer_types[] = {
 | 
					static const char * const nand_xfer_types[] = {
 | 
				
			||||||
	[NAND_OMAP_PREFETCH_POLLED]		= "prefetch-polled",
 | 
						[NAND_OMAP_PREFETCH_POLLED]		= "prefetch-polled",
 | 
				
			||||||
| 
						 | 
					@ -1429,7 +1429,7 @@ static int gpmc_probe_nand_child(struct platform_device *pdev,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_MTD_ONENAND
 | 
					#if IS_ENABLED(CONFIG_MTD_ONENAND)
 | 
				
			||||||
static int gpmc_probe_onenand_child(struct platform_device *pdev,
 | 
					static int gpmc_probe_onenand_child(struct platform_device *pdev,
 | 
				
			||||||
				 struct device_node *child)
 | 
									 struct device_node *child)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -179,15 +179,6 @@ static struct map_desc omap34xx_io_desc[] __initdata = {
 | 
				
			||||||
		.length		= L4_EMU_34XX_SIZE,
 | 
							.length		= L4_EMU_34XX_SIZE,
 | 
				
			||||||
		.type		= MT_DEVICE
 | 
							.type		= MT_DEVICE
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
#if defined(CONFIG_DEBUG_LL) &&							\
 | 
					 | 
				
			||||||
	(defined(CONFIG_MACH_OMAP_ZOOM2) || defined(CONFIG_MACH_OMAP_ZOOM3))
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		.virtual	= ZOOM_UART_VIRT,
 | 
					 | 
				
			||||||
		.pfn		= __phys_to_pfn(ZOOM_UART_BASE),
 | 
					 | 
				
			||||||
		.length		= SZ_1M,
 | 
					 | 
				
			||||||
		.type		= MT_DEVICE
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,6 +38,7 @@
 | 
				
			||||||
#include <linux/mtd/physmap.h>
 | 
					#include <linux/mtd/physmap.h>
 | 
				
			||||||
#include <linux/usb/gpio_vbus.h>
 | 
					#include <linux/usb/gpio_vbus.h>
 | 
				
			||||||
#include <linux/reboot.h>
 | 
					#include <linux/reboot.h>
 | 
				
			||||||
 | 
					#include <linux/regulator/fixed.h>
 | 
				
			||||||
#include <linux/regulator/max1586.h>
 | 
					#include <linux/regulator/max1586.h>
 | 
				
			||||||
#include <linux/slab.h>
 | 
					#include <linux/slab.h>
 | 
				
			||||||
#include <linux/i2c/pxa-i2c.h>
 | 
					#include <linux/i2c/pxa-i2c.h>
 | 
				
			||||||
| 
						 | 
					@ -714,6 +715,10 @@ static struct gpio global_gpios[] = {
 | 
				
			||||||
	{ GPIO56_MT9M111_nOE, GPIOF_OUT_INIT_LOW, "Camera nOE" },
 | 
						{ GPIO56_MT9M111_nOE, GPIOF_OUT_INIT_LOW, "Camera nOE" },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static struct regulator_consumer_supply fixed_5v0_consumers[] = {
 | 
				
			||||||
 | 
						REGULATOR_SUPPLY("power", "pwm-backlight"),
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void __init mioa701_machine_init(void)
 | 
					static void __init mioa701_machine_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int rc;
 | 
						int rc;
 | 
				
			||||||
| 
						 | 
					@ -753,6 +758,10 @@ static void __init mioa701_machine_init(void)
 | 
				
			||||||
	pxa_set_i2c_info(&i2c_pdata);
 | 
						pxa_set_i2c_info(&i2c_pdata);
 | 
				
			||||||
	pxa27x_set_i2c_power_info(NULL);
 | 
						pxa27x_set_i2c_power_info(NULL);
 | 
				
			||||||
	pxa_set_camera_info(&mioa701_pxacamera_platform_data);
 | 
						pxa_set_camera_info(&mioa701_pxacamera_platform_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						regulator_register_always_on(0, "fixed-5.0V", fixed_5v0_consumers,
 | 
				
			||||||
 | 
									     ARRAY_SIZE(fixed_5v0_consumers),
 | 
				
			||||||
 | 
									     5000000);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void mioa701_machine_exit(void)
 | 
					static void mioa701_machine_exit(void)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,6 +24,7 @@
 | 
				
			||||||
#include <linux/cpu_pm.h>
 | 
					#include <linux/cpu_pm.h>
 | 
				
			||||||
#include <linux/suspend.h>
 | 
					#include <linux/suspend.h>
 | 
				
			||||||
#include <linux/err.h>
 | 
					#include <linux/err.h>
 | 
				
			||||||
 | 
					#include <linux/slab.h>
 | 
				
			||||||
#include <linux/clk/tegra.h>
 | 
					#include <linux/clk/tegra.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <asm/smp_plat.h>
 | 
					#include <asm/smp_plat.h>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -73,10 +73,20 @@ u32 tegra_uart_config[3] = {
 | 
				
			||||||
static void __init tegra_init_cache(void)
 | 
					static void __init tegra_init_cache(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef CONFIG_CACHE_L2X0
 | 
					#ifdef CONFIG_CACHE_L2X0
 | 
				
			||||||
 | 
						static const struct of_device_id pl310_ids[] __initconst = {
 | 
				
			||||||
 | 
							{ .compatible = "arm,pl310-cache",  },
 | 
				
			||||||
 | 
							{}
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct device_node *np;
 | 
				
			||||||
	int ret;
 | 
						int ret;
 | 
				
			||||||
	void __iomem *p = IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x3000;
 | 
						void __iomem *p = IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x3000;
 | 
				
			||||||
	u32 aux_ctrl, cache_type;
 | 
						u32 aux_ctrl, cache_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						np = of_find_matching_node(NULL, pl310_ids);
 | 
				
			||||||
 | 
						if (!np)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cache_type = readl(p + L2X0_CACHE_TYPE);
 | 
						cache_type = readl(p + L2X0_CACHE_TYPE);
 | 
				
			||||||
	aux_ctrl = (cache_type & 0x700) << (17-8);
 | 
						aux_ctrl = (cache_type & 0x700) << (17-8);
 | 
				
			||||||
	aux_ctrl |= 0x7C400001;
 | 
						aux_ctrl |= 0x7C400001;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1358,7 +1358,7 @@ static void *arm_iommu_alloc_attrs(struct device *dev, size_t size,
 | 
				
			||||||
	*handle = DMA_ERROR_CODE;
 | 
						*handle = DMA_ERROR_CODE;
 | 
				
			||||||
	size = PAGE_ALIGN(size);
 | 
						size = PAGE_ALIGN(size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (gfp & GFP_ATOMIC)
 | 
						if (!(gfp & __GFP_WAIT))
 | 
				
			||||||
		return __iommu_alloc_atomic(dev, size, handle);
 | 
							return __iommu_alloc_atomic(dev, size, handle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,6 +16,8 @@
 | 
				
			||||||
#ifndef __ASM_PERCPU_H
 | 
					#ifndef __ASM_PERCPU_H
 | 
				
			||||||
#define __ASM_PERCPU_H
 | 
					#define __ASM_PERCPU_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_SMP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void set_my_cpu_offset(unsigned long off)
 | 
					static inline void set_my_cpu_offset(unsigned long off)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	asm volatile("msr tpidr_el1, %0" :: "r" (off) : "memory");
 | 
						asm volatile("msr tpidr_el1, %0" :: "r" (off) : "memory");
 | 
				
			||||||
| 
						 | 
					@ -36,6 +38,12 @@ static inline unsigned long __my_cpu_offset(void)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#define __my_cpu_offset __my_cpu_offset()
 | 
					#define __my_cpu_offset __my_cpu_offset()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else	/* !CONFIG_SMP */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define set_my_cpu_offset(x)	do { } while (0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* CONFIG_SMP */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <asm-generic/percpu.h>
 | 
					#include <asm-generic/percpu.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* __ASM_PERCPU_H */
 | 
					#endif /* __ASM_PERCPU_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -136,11 +136,11 @@ extern struct page *empty_zero_page;
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * The following only work if pte_present(). Undefined behaviour otherwise.
 | 
					 * The following only work if pte_present(). Undefined behaviour otherwise.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#define pte_present(pte)	(pte_val(pte) & (PTE_VALID | PTE_PROT_NONE))
 | 
					#define pte_present(pte)	(!!(pte_val(pte) & (PTE_VALID | PTE_PROT_NONE)))
 | 
				
			||||||
#define pte_dirty(pte)		(pte_val(pte) & PTE_DIRTY)
 | 
					#define pte_dirty(pte)		(!!(pte_val(pte) & PTE_DIRTY))
 | 
				
			||||||
#define pte_young(pte)		(pte_val(pte) & PTE_AF)
 | 
					#define pte_young(pte)		(!!(pte_val(pte) & PTE_AF))
 | 
				
			||||||
#define pte_special(pte)	(pte_val(pte) & PTE_SPECIAL)
 | 
					#define pte_special(pte)	(!!(pte_val(pte) & PTE_SPECIAL))
 | 
				
			||||||
#define pte_write(pte)		(pte_val(pte) & PTE_WRITE)
 | 
					#define pte_write(pte)		(!!(pte_val(pte) & PTE_WRITE))
 | 
				
			||||||
#define pte_exec(pte)		(!(pte_val(pte) & PTE_UXN))
 | 
					#define pte_exec(pte)		(!(pte_val(pte) & PTE_UXN))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define pte_valid_user(pte) \
 | 
					#define pte_valid_user(pte) \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,7 +48,11 @@ int unwind_frame(struct stackframe *frame)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	frame->sp = fp + 0x10;
 | 
						frame->sp = fp + 0x10;
 | 
				
			||||||
	frame->fp = *(unsigned long *)(fp);
 | 
						frame->fp = *(unsigned long *)(fp);
 | 
				
			||||||
	frame->pc = *(unsigned long *)(fp + 8);
 | 
						/*
 | 
				
			||||||
 | 
						 * -4 here because we care about the PC at time of bl,
 | 
				
			||||||
 | 
						 * not where the return will go.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						frame->pc = *(unsigned long *)(fp + 8) - 4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -694,6 +694,24 @@ __hyp_panic_str:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	.align	2
 | 
						.align	2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * u64 kvm_call_hyp(void *hypfn, ...);
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This is not really a variadic function in the classic C-way and care must
 | 
				
			||||||
 | 
					 * be taken when calling this to ensure parameters are passed in registers
 | 
				
			||||||
 | 
					 * only, since the stack will change between the caller and the callee.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Call the function with the first argument containing a pointer to the
 | 
				
			||||||
 | 
					 * function you wish to call in Hyp mode, and subsequent arguments will be
 | 
				
			||||||
 | 
					 * passed as x0, x1, and x2 (a maximum of 3 arguments in addition to the
 | 
				
			||||||
 | 
					 * function pointer can be passed).  The function being called must be mapped
 | 
				
			||||||
 | 
					 * in Hyp mode (see init_hyp_mode in arch/arm/kvm/arm.c).  Return values are
 | 
				
			||||||
 | 
					 * passed in r0 and r1.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * A function pointer with a value of 0 has a special meaning, and is
 | 
				
			||||||
 | 
					 * used to implement __hyp_get_vectors in the same way as in
 | 
				
			||||||
 | 
					 * arch/arm64/kernel/hyp_stub.S.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
ENTRY(kvm_call_hyp)
 | 
					ENTRY(kvm_call_hyp)
 | 
				
			||||||
	hvc	#0
 | 
						hvc	#0
 | 
				
			||||||
	ret
 | 
						ret
 | 
				
			||||||
| 
						 | 
					@ -737,7 +755,12 @@ el1_sync:					// Guest trapped into EL2
 | 
				
			||||||
	pop	x2, x3
 | 
						pop	x2, x3
 | 
				
			||||||
	pop	x0, x1
 | 
						pop	x0, x1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	push	lr, xzr
 | 
						/* Check for __hyp_get_vectors */
 | 
				
			||||||
 | 
						cbnz	x0, 1f
 | 
				
			||||||
 | 
						mrs	x0, vbar_el2
 | 
				
			||||||
 | 
						b	2f
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1:	push	lr, xzr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Compute the function address in EL2, and shuffle the parameters.
 | 
						 * Compute the function address in EL2, and shuffle the parameters.
 | 
				
			||||||
| 
						 | 
					@ -750,7 +773,7 @@ el1_sync:					// Guest trapped into EL2
 | 
				
			||||||
	blr	lr
 | 
						blr	lr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pop	lr, xzr
 | 
						pop	lr, xzr
 | 
				
			||||||
	eret
 | 
					2:	eret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
el1_trap:
 | 
					el1_trap:
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
 | 
					generic-y += barrier.h
 | 
				
			||||||
generic-y += bitsperlong.h
 | 
					generic-y += bitsperlong.h
 | 
				
			||||||
generic-y += clkdev.h
 | 
					generic-y += clkdev.h
 | 
				
			||||||
generic-y += cputime.h
 | 
					generic-y += cputime.h
 | 
				
			||||||
| 
						 | 
					@ -6,6 +6,7 @@ generic-y += device.h
 | 
				
			||||||
generic-y += emergency-restart.h
 | 
					generic-y += emergency-restart.h
 | 
				
			||||||
generic-y += errno.h
 | 
					generic-y += errno.h
 | 
				
			||||||
generic-y += exec.h
 | 
					generic-y += exec.h
 | 
				
			||||||
 | 
					generic-y += hash.h
 | 
				
			||||||
generic-y += hw_irq.h
 | 
					generic-y += hw_irq.h
 | 
				
			||||||
generic-y += ioctl.h
 | 
					generic-y += ioctl.h
 | 
				
			||||||
generic-y += ipcbuf.h
 | 
					generic-y += ipcbuf.h
 | 
				
			||||||
| 
						 | 
					@ -18,6 +19,7 @@ generic-y += local.h
 | 
				
			||||||
generic-y += mman.h
 | 
					generic-y += mman.h
 | 
				
			||||||
generic-y += mutex.h
 | 
					generic-y += mutex.h
 | 
				
			||||||
generic-y += percpu.h
 | 
					generic-y += percpu.h
 | 
				
			||||||
 | 
					generic-y += preempt.h
 | 
				
			||||||
generic-y += resource.h
 | 
					generic-y += resource.h
 | 
				
			||||||
generic-y += scatterlist.h
 | 
					generic-y += scatterlist.h
 | 
				
			||||||
generic-y += sections.h
 | 
					generic-y += sections.h
 | 
				
			||||||
| 
						 | 
					@ -31,5 +33,3 @@ generic-y += trace_clock.h
 | 
				
			||||||
generic-y += types.h
 | 
					generic-y += types.h
 | 
				
			||||||
generic-y += word-at-a-time.h
 | 
					generic-y += word-at-a-time.h
 | 
				
			||||||
generic-y += xor.h
 | 
					generic-y += xor.h
 | 
				
			||||||
generic-y += preempt.h
 | 
					 | 
				
			||||||
generic-y += hash.h
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,8 +0,0 @@
 | 
				
			||||||
#ifndef _M68K_BARRIER_H
 | 
					 | 
				
			||||||
#define _M68K_BARRIER_H
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define nop()		do { asm volatile ("nop"); barrier(); } while (0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <asm-generic/barrier.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* _M68K_BARRIER_H */
 | 
					 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@
 | 
				
			||||||
#include <uapi/asm/unistd.h>
 | 
					#include <uapi/asm/unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NR_syscalls		349
 | 
					#define NR_syscalls		351
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define __ARCH_WANT_OLD_READDIR
 | 
					#define __ARCH_WANT_OLD_READDIR
 | 
				
			||||||
#define __ARCH_WANT_OLD_STAT
 | 
					#define __ARCH_WANT_OLD_STAT
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -354,5 +354,7 @@
 | 
				
			||||||
#define __NR_process_vm_writev	346
 | 
					#define __NR_process_vm_writev	346
 | 
				
			||||||
#define __NR_kcmp		347
 | 
					#define __NR_kcmp		347
 | 
				
			||||||
#define __NR_finit_module	348
 | 
					#define __NR_finit_module	348
 | 
				
			||||||
 | 
					#define __NR_sched_setattr	349
 | 
				
			||||||
 | 
					#define __NR_sched_getattr	350
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* _UAPI_ASM_M68K_UNISTD_H_ */
 | 
					#endif /* _UAPI_ASM_M68K_UNISTD_H_ */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -369,4 +369,6 @@ ENTRY(sys_call_table)
 | 
				
			||||||
	.long sys_process_vm_writev
 | 
						.long sys_process_vm_writev
 | 
				
			||||||
	.long sys_kcmp
 | 
						.long sys_kcmp
 | 
				
			||||||
	.long sys_finit_module
 | 
						.long sys_finit_module
 | 
				
			||||||
 | 
						.long sys_sched_setattr
 | 
				
			||||||
 | 
						.long sys_sched_getattr		/* 350 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -200,10 +200,11 @@ static inline void __user *arch_compat_alloc_user_space(long len)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * We can't access below the stack pointer in the 32bit ABI and
 | 
						 * We can't access below the stack pointer in the 32bit ABI and
 | 
				
			||||||
	 * can access 288 bytes in the 64bit ABI
 | 
						 * can access 288 bytes in the 64bit big-endian ABI,
 | 
				
			||||||
 | 
						 * or 512 bytes with the new ELFv2 little-endian ABI.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	if (!is_32bit_task())
 | 
						if (!is_32bit_task())
 | 
				
			||||||
		usp -= 288;
 | 
							usp -= USER_REDZONE_SIZE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return (void __user *) (usp - len);
 | 
						return (void __user *) (usp - len);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -816,8 +816,8 @@ int64_t opal_pci_next_error(uint64_t phb_id, uint64_t *first_frozen_pe,
 | 
				
			||||||
int64_t opal_pci_poll(uint64_t phb_id);
 | 
					int64_t opal_pci_poll(uint64_t phb_id);
 | 
				
			||||||
int64_t opal_return_cpu(void);
 | 
					int64_t opal_return_cpu(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int64_t opal_xscom_read(uint32_t gcid, uint32_t pcb_addr, __be64 *val);
 | 
					int64_t opal_xscom_read(uint32_t gcid, uint64_t pcb_addr, __be64 *val);
 | 
				
			||||||
int64_t opal_xscom_write(uint32_t gcid, uint32_t pcb_addr, uint64_t val);
 | 
					int64_t opal_xscom_write(uint32_t gcid, uint64_t pcb_addr, uint64_t val);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int64_t opal_lpc_write(uint32_t chip_id, enum OpalLPCAddressType addr_type,
 | 
					int64_t opal_lpc_write(uint32_t chip_id, enum OpalLPCAddressType addr_type,
 | 
				
			||||||
		       uint32_t addr, uint32_t data, uint32_t sz);
 | 
							       uint32_t addr, uint32_t data, uint32_t sz);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,11 +28,23 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __powerpc64__
 | 
					#ifdef __powerpc64__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Size of redzone that userspace is allowed to use below the stack
 | 
				
			||||||
 | 
					 * pointer.  This is 288 in the 64-bit big-endian ELF ABI, and 512 in
 | 
				
			||||||
 | 
					 * the new ELFv2 little-endian ABI, so we allow the larger amount.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * For kernel code we allow a 288-byte redzone, in order to conserve
 | 
				
			||||||
 | 
					 * kernel stack space; gcc currently only uses 288 bytes, and will
 | 
				
			||||||
 | 
					 * hopefully allow explicit control of the redzone size in future.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define USER_REDZONE_SIZE	512
 | 
				
			||||||
 | 
					#define KERNEL_REDZONE_SIZE	288
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define STACK_FRAME_OVERHEAD	112	/* size of minimum stack frame */
 | 
					#define STACK_FRAME_OVERHEAD	112	/* size of minimum stack frame */
 | 
				
			||||||
#define STACK_FRAME_LR_SAVE	2	/* Location of LR in stack frame */
 | 
					#define STACK_FRAME_LR_SAVE	2	/* Location of LR in stack frame */
 | 
				
			||||||
#define STACK_FRAME_REGS_MARKER	ASM_CONST(0x7265677368657265)
 | 
					#define STACK_FRAME_REGS_MARKER	ASM_CONST(0x7265677368657265)
 | 
				
			||||||
#define STACK_INT_FRAME_SIZE	(sizeof(struct pt_regs) + \
 | 
					#define STACK_INT_FRAME_SIZE	(sizeof(struct pt_regs) + \
 | 
				
			||||||
					STACK_FRAME_OVERHEAD + 288)
 | 
									 STACK_FRAME_OVERHEAD + KERNEL_REDZONE_SIZE)
 | 
				
			||||||
#define STACK_FRAME_MARKER	12
 | 
					#define STACK_FRAME_MARKER	12
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Size of dummy stack frame allocated when calling signal handler. */
 | 
					/* Size of dummy stack frame allocated when calling signal handler. */
 | 
				
			||||||
| 
						 | 
					@ -41,6 +53,8 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#else /* __powerpc64__ */
 | 
					#else /* __powerpc64__ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define USER_REDZONE_SIZE	0
 | 
				
			||||||
 | 
					#define KERNEL_REDZONE_SIZE	0
 | 
				
			||||||
#define STACK_FRAME_OVERHEAD	16	/* size of minimum stack frame */
 | 
					#define STACK_FRAME_OVERHEAD	16	/* size of minimum stack frame */
 | 
				
			||||||
#define STACK_FRAME_LR_SAVE	1	/* Location of LR in stack frame */
 | 
					#define STACK_FRAME_LR_SAVE	1	/* Location of LR in stack frame */
 | 
				
			||||||
#define STACK_FRAME_REGS_MARKER	ASM_CONST(0x72656773)
 | 
					#define STACK_FRAME_REGS_MARKER	ASM_CONST(0x72656773)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -98,17 +98,19 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf,
 | 
				
			||||||
			size_t csize, unsigned long offset, int userbuf)
 | 
								size_t csize, unsigned long offset, int userbuf)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	void  *vaddr;
 | 
						void  *vaddr;
 | 
				
			||||||
 | 
						phys_addr_t paddr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!csize)
 | 
						if (!csize)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	csize = min_t(size_t, csize, PAGE_SIZE);
 | 
						csize = min_t(size_t, csize, PAGE_SIZE);
 | 
				
			||||||
 | 
						paddr = pfn << PAGE_SHIFT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((min_low_pfn < pfn) && (pfn < max_pfn)) {
 | 
						if (memblock_is_region_memory(paddr, csize)) {
 | 
				
			||||||
		vaddr = __va(pfn << PAGE_SHIFT);
 | 
							vaddr = __va(paddr);
 | 
				
			||||||
		csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf);
 | 
							csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		vaddr = __ioremap(pfn << PAGE_SHIFT, PAGE_SIZE, 0);
 | 
							vaddr = __ioremap(paddr, PAGE_SIZE, 0);
 | 
				
			||||||
		csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf);
 | 
							csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf);
 | 
				
			||||||
		iounmap(vaddr);
 | 
							iounmap(vaddr);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -74,6 +74,7 @@ ftrace_modify_code(unsigned long ip, unsigned int old, unsigned int new)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static int test_24bit_addr(unsigned long ip, unsigned long addr)
 | 
					static int test_24bit_addr(unsigned long ip, unsigned long addr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						addr = ppc_function_entry((void *)addr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* use the create_branch to verify that this offset can be branched */
 | 
						/* use the create_branch to verify that this offset can be branched */
 | 
				
			||||||
	return create_branch((unsigned int *)ip, addr, 0);
 | 
						return create_branch((unsigned int *)ip, addr, 0);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -65,8 +65,8 @@ struct rt_sigframe {
 | 
				
			||||||
	struct siginfo __user *pinfo;
 | 
						struct siginfo __user *pinfo;
 | 
				
			||||||
	void __user *puc;
 | 
						void __user *puc;
 | 
				
			||||||
	struct siginfo info;
 | 
						struct siginfo info;
 | 
				
			||||||
	/* 64 bit ABI allows for 288 bytes below sp before decrementing it. */
 | 
						/* New 64 bit little-endian ABI allows redzone of 512 bytes below sp */
 | 
				
			||||||
	char abigap[288];
 | 
						char abigap[USER_REDZONE_SIZE];
 | 
				
			||||||
} __attribute__ ((aligned (16)));
 | 
					} __attribute__ ((aligned (16)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const char fmt32[] = KERN_INFO \
 | 
					static const char fmt32[] = KERN_INFO \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -114,6 +114,7 @@ DEFINE_SIMPLE_ATTRIBUTE(ioda_eeh_inbB_dbgfs_ops, ioda_eeh_inbB_dbgfs_get,
 | 
				
			||||||
			ioda_eeh_inbB_dbgfs_set, "0x%llx\n");
 | 
								ioda_eeh_inbB_dbgfs_set, "0x%llx\n");
 | 
				
			||||||
#endif /* CONFIG_DEBUG_FS */
 | 
					#endif /* CONFIG_DEBUG_FS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * ioda_eeh_post_init - Chip dependent post initialization
 | 
					 * ioda_eeh_post_init - Chip dependent post initialization
 | 
				
			||||||
 * @hose: PCI controller
 | 
					 * @hose: PCI controller
 | 
				
			||||||
| 
						 | 
					@ -221,6 +222,22 @@ static int ioda_eeh_set_option(struct eeh_pe *pe, int option)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void ioda_eeh_phb_diag(struct pci_controller *hose)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct pnv_phb *phb = hose->private_data;
 | 
				
			||||||
 | 
						long rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rc = opal_pci_get_phb_diag_data2(phb->opal_id, phb->diag.blob,
 | 
				
			||||||
 | 
										 PNV_PCI_DIAG_BUF_SIZE);
 | 
				
			||||||
 | 
						if (rc != OPAL_SUCCESS) {
 | 
				
			||||||
 | 
							pr_warning("%s: Failed to get diag-data for PHB#%x (%ld)\n",
 | 
				
			||||||
 | 
								    __func__, hose->global_number, rc);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pnv_pci_dump_phb_diag_data(hose, phb->diag.blob);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * ioda_eeh_get_state - Retrieve the state of PE
 | 
					 * ioda_eeh_get_state - Retrieve the state of PE
 | 
				
			||||||
 * @pe: EEH PE
 | 
					 * @pe: EEH PE
 | 
				
			||||||
| 
						 | 
					@ -272,6 +289,9 @@ static int ioda_eeh_get_state(struct eeh_pe *pe)
 | 
				
			||||||
			result |= EEH_STATE_DMA_ACTIVE;
 | 
								result |= EEH_STATE_DMA_ACTIVE;
 | 
				
			||||||
			result |= EEH_STATE_MMIO_ENABLED;
 | 
								result |= EEH_STATE_MMIO_ENABLED;
 | 
				
			||||||
			result |= EEH_STATE_DMA_ENABLED;
 | 
								result |= EEH_STATE_DMA_ENABLED;
 | 
				
			||||||
 | 
							} else if (!(pe->state & EEH_PE_ISOLATED)) {
 | 
				
			||||||
 | 
								eeh_pe_state_mark(pe, EEH_PE_ISOLATED);
 | 
				
			||||||
 | 
								ioda_eeh_phb_diag(hose);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return result;
 | 
							return result;
 | 
				
			||||||
| 
						 | 
					@ -315,6 +335,15 @@ static int ioda_eeh_get_state(struct eeh_pe *pe)
 | 
				
			||||||
			   __func__, fstate, hose->global_number, pe_no);
 | 
								   __func__, fstate, hose->global_number, pe_no);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Dump PHB diag-data for frozen PE */
 | 
				
			||||||
 | 
						if (result != EEH_STATE_NOT_SUPPORT &&
 | 
				
			||||||
 | 
						    (result & (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE)) !=
 | 
				
			||||||
 | 
						    (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE) &&
 | 
				
			||||||
 | 
						    !(pe->state & EEH_PE_ISOLATED)) {
 | 
				
			||||||
 | 
							eeh_pe_state_mark(pe, EEH_PE_ISOLATED);
 | 
				
			||||||
 | 
							ioda_eeh_phb_diag(hose);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return result;
 | 
						return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -529,42 +558,6 @@ static int ioda_eeh_reset(struct eeh_pe *pe, int option)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * ioda_eeh_get_log - Retrieve error log
 | 
					 | 
				
			||||||
 * @pe: EEH PE
 | 
					 | 
				
			||||||
 * @severity: Severity level of the log
 | 
					 | 
				
			||||||
 * @drv_log: buffer to store the log
 | 
					 | 
				
			||||||
 * @len: space of the log buffer
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * The function is used to retrieve error log from P7IOC.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static int ioda_eeh_get_log(struct eeh_pe *pe, int severity,
 | 
					 | 
				
			||||||
			    char *drv_log, unsigned long len)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	s64 ret;
 | 
					 | 
				
			||||||
	unsigned long flags;
 | 
					 | 
				
			||||||
	struct pci_controller *hose = pe->phb;
 | 
					 | 
				
			||||||
	struct pnv_phb *phb = hose->private_data;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	spin_lock_irqsave(&phb->lock, flags);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ret = opal_pci_get_phb_diag_data2(phb->opal_id,
 | 
					 | 
				
			||||||
			phb->diag.blob, PNV_PCI_DIAG_BUF_SIZE);
 | 
					 | 
				
			||||||
	if (ret) {
 | 
					 | 
				
			||||||
		spin_unlock_irqrestore(&phb->lock, flags);
 | 
					 | 
				
			||||||
		pr_warning("%s: Can't get log for PHB#%x-PE#%x (%lld)\n",
 | 
					 | 
				
			||||||
			   __func__, hose->global_number, pe->addr, ret);
 | 
					 | 
				
			||||||
		return -EIO;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* The PHB diag-data is always indicative */
 | 
					 | 
				
			||||||
	pnv_pci_dump_phb_diag_data(hose, phb->diag.blob);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	spin_unlock_irqrestore(&phb->lock, flags);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * ioda_eeh_configure_bridge - Configure the PCI bridges for the indicated PE
 | 
					 * ioda_eeh_configure_bridge - Configure the PCI bridges for the indicated PE
 | 
				
			||||||
 * @pe: EEH PE
 | 
					 * @pe: EEH PE
 | 
				
			||||||
| 
						 | 
					@ -646,22 +639,6 @@ static void ioda_eeh_hub_diag(struct pci_controller *hose)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ioda_eeh_phb_diag(struct pci_controller *hose)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct pnv_phb *phb = hose->private_data;
 | 
					 | 
				
			||||||
	long rc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	rc = opal_pci_get_phb_diag_data2(phb->opal_id, phb->diag.blob,
 | 
					 | 
				
			||||||
					 PNV_PCI_DIAG_BUF_SIZE);
 | 
					 | 
				
			||||||
	if (rc != OPAL_SUCCESS) {
 | 
					 | 
				
			||||||
		pr_warning("%s: Failed to get diag-data for PHB#%x (%ld)\n",
 | 
					 | 
				
			||||||
			    __func__, hose->global_number, rc);
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	pnv_pci_dump_phb_diag_data(hose, phb->diag.blob);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int ioda_eeh_get_phb_pe(struct pci_controller *hose,
 | 
					static int ioda_eeh_get_phb_pe(struct pci_controller *hose,
 | 
				
			||||||
			       struct eeh_pe **pe)
 | 
								       struct eeh_pe **pe)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -834,6 +811,20 @@ static int ioda_eeh_next_error(struct eeh_pe **pe)
 | 
				
			||||||
				__func__, err_type);
 | 
									__func__, err_type);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
 | 
							 * EEH core will try recover from fenced PHB or
 | 
				
			||||||
 | 
							 * frozen PE. In the time for frozen PE, EEH core
 | 
				
			||||||
 | 
							 * enable IO path for that before collecting logs,
 | 
				
			||||||
 | 
							 * but it ruins the site. So we have to dump the
 | 
				
			||||||
 | 
							 * log in advance here.
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							if ((ret == EEH_NEXT_ERR_FROZEN_PE  ||
 | 
				
			||||||
 | 
							    ret == EEH_NEXT_ERR_FENCED_PHB) &&
 | 
				
			||||||
 | 
							    !((*pe)->state & EEH_PE_ISOLATED)) {
 | 
				
			||||||
 | 
								eeh_pe_state_mark(*pe, EEH_PE_ISOLATED);
 | 
				
			||||||
 | 
								ioda_eeh_phb_diag(hose);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * If we have no errors on the specific PHB or only
 | 
							 * If we have no errors on the specific PHB or only
 | 
				
			||||||
		 * informative error there, we continue poking it.
 | 
							 * informative error there, we continue poking it.
 | 
				
			||||||
| 
						 | 
					@ -852,7 +843,6 @@ struct pnv_eeh_ops ioda_eeh_ops = {
 | 
				
			||||||
	.set_option		= ioda_eeh_set_option,
 | 
						.set_option		= ioda_eeh_set_option,
 | 
				
			||||||
	.get_state		= ioda_eeh_get_state,
 | 
						.get_state		= ioda_eeh_get_state,
 | 
				
			||||||
	.reset			= ioda_eeh_reset,
 | 
						.reset			= ioda_eeh_reset,
 | 
				
			||||||
	.get_log		= ioda_eeh_get_log,
 | 
					 | 
				
			||||||
	.configure_bridge	= ioda_eeh_configure_bridge,
 | 
						.configure_bridge	= ioda_eeh_configure_bridge,
 | 
				
			||||||
	.next_error		= ioda_eeh_next_error
 | 
						.next_error		= ioda_eeh_next_error
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -71,11 +71,11 @@ static int opal_xscom_err_xlate(int64_t rc)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u64 opal_scom_unmangle(u64 reg)
 | 
					static u64 opal_scom_unmangle(u64 addr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * XSCOM indirect addresses have the top bit set. Additionally
 | 
						 * XSCOM indirect addresses have the top bit set. Additionally
 | 
				
			||||||
	 * the reset of the top 3 nibbles is always 0.
 | 
						 * the rest of the top 3 nibbles is always 0.
 | 
				
			||||||
	 *
 | 
						 *
 | 
				
			||||||
	 * Because the debugfs interface uses signed offsets and shifts
 | 
						 * Because the debugfs interface uses signed offsets and shifts
 | 
				
			||||||
	 * the address left by 3, we basically cannot use the top 4 bits
 | 
						 * the address left by 3, we basically cannot use the top 4 bits
 | 
				
			||||||
| 
						 | 
					@ -86,10 +86,13 @@ static u64 opal_scom_unmangle(u64 reg)
 | 
				
			||||||
	 * conversion here. To leave room for further xscom address
 | 
						 * conversion here. To leave room for further xscom address
 | 
				
			||||||
	 * expansion, we only clear out the top byte
 | 
						 * expansion, we only clear out the top byte
 | 
				
			||||||
	 *
 | 
						 *
 | 
				
			||||||
 | 
						 * For in-kernel use, we also support the real indirect bit, so
 | 
				
			||||||
 | 
						 * we test for any of the top 5 bits
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	if (reg & (1ull << 59))
 | 
						if (addr & (0x1full << 59))
 | 
				
			||||||
		reg = (reg & ~(0xffull << 56)) | (1ull << 63);
 | 
							addr = (addr & ~(0xffull << 56)) | (1ull << 63);
 | 
				
			||||||
	return reg;
 | 
						return addr;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int opal_scom_read(scom_map_t map, u64 reg, u64 *value)
 | 
					static int opal_scom_read(scom_map_t map, u64 reg, u64 *value)
 | 
				
			||||||
| 
						 | 
					@ -98,8 +101,8 @@ static int opal_scom_read(scom_map_t map, u64 reg, u64 *value)
 | 
				
			||||||
	int64_t rc;
 | 
						int64_t rc;
 | 
				
			||||||
	__be64 v;
 | 
						__be64 v;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	reg = opal_scom_unmangle(reg);
 | 
						reg = opal_scom_unmangle(m->addr + reg);
 | 
				
			||||||
	rc = opal_xscom_read(m->chip, m->addr + reg, (__be64 *)__pa(&v));
 | 
						rc = opal_xscom_read(m->chip, reg, (__be64 *)__pa(&v));
 | 
				
			||||||
	*value = be64_to_cpu(v);
 | 
						*value = be64_to_cpu(v);
 | 
				
			||||||
	return opal_xscom_err_xlate(rc);
 | 
						return opal_xscom_err_xlate(rc);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -109,8 +112,8 @@ static int opal_scom_write(scom_map_t map, u64 reg, u64 value)
 | 
				
			||||||
	struct opal_scom_map *m = map;
 | 
						struct opal_scom_map *m = map;
 | 
				
			||||||
	int64_t rc;
 | 
						int64_t rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	reg = opal_scom_unmangle(reg);
 | 
						reg = opal_scom_unmangle(m->addr + reg);
 | 
				
			||||||
	rc = opal_xscom_write(m->chip, m->addr + reg, value);
 | 
						rc = opal_xscom_write(m->chip, reg, value);
 | 
				
			||||||
	return opal_xscom_err_xlate(rc);
 | 
						return opal_xscom_err_xlate(rc);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -134,57 +134,72 @@ static void pnv_pci_dump_p7ioc_diag_data(struct pci_controller *hose,
 | 
				
			||||||
	pr_info("P7IOC PHB#%d Diag-data (Version: %d)\n\n",
 | 
						pr_info("P7IOC PHB#%d Diag-data (Version: %d)\n\n",
 | 
				
			||||||
		hose->global_number, common->version);
 | 
							hose->global_number, common->version);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pr_info("  brdgCtl:              %08x\n", data->brdgCtl);
 | 
						if (data->brdgCtl)
 | 
				
			||||||
 | 
							pr_info("  brdgCtl:     %08x\n",
 | 
				
			||||||
	pr_info("  portStatusReg:        %08x\n", data->portStatusReg);
 | 
								data->brdgCtl);
 | 
				
			||||||
	pr_info("  rootCmplxStatus:      %08x\n", data->rootCmplxStatus);
 | 
						if (data->portStatusReg || data->rootCmplxStatus ||
 | 
				
			||||||
	pr_info("  busAgentStatus:       %08x\n", data->busAgentStatus);
 | 
						    data->busAgentStatus)
 | 
				
			||||||
 | 
							pr_info("  UtlSts:      %08x %08x %08x\n",
 | 
				
			||||||
	pr_info("  deviceStatus:         %08x\n", data->deviceStatus);
 | 
								data->portStatusReg, data->rootCmplxStatus,
 | 
				
			||||||
	pr_info("  slotStatus:           %08x\n", data->slotStatus);
 | 
								data->busAgentStatus);
 | 
				
			||||||
	pr_info("  linkStatus:           %08x\n", data->linkStatus);
 | 
						if (data->deviceStatus || data->slotStatus   ||
 | 
				
			||||||
	pr_info("  devCmdStatus:         %08x\n", data->devCmdStatus);
 | 
						    data->linkStatus   || data->devCmdStatus ||
 | 
				
			||||||
	pr_info("  devSecStatus:         %08x\n", data->devSecStatus);
 | 
						    data->devSecStatus)
 | 
				
			||||||
 | 
							pr_info("  RootSts:     %08x %08x %08x %08x %08x\n",
 | 
				
			||||||
	pr_info("  rootErrorStatus:      %08x\n", data->rootErrorStatus);
 | 
								data->deviceStatus, data->slotStatus,
 | 
				
			||||||
	pr_info("  uncorrErrorStatus:    %08x\n", data->uncorrErrorStatus);
 | 
								data->linkStatus, data->devCmdStatus,
 | 
				
			||||||
	pr_info("  corrErrorStatus:      %08x\n", data->corrErrorStatus);
 | 
								data->devSecStatus);
 | 
				
			||||||
	pr_info("  tlpHdr1:              %08x\n", data->tlpHdr1);
 | 
						if (data->rootErrorStatus   || data->uncorrErrorStatus ||
 | 
				
			||||||
	pr_info("  tlpHdr2:              %08x\n", data->tlpHdr2);
 | 
						    data->corrErrorStatus)
 | 
				
			||||||
	pr_info("  tlpHdr3:              %08x\n", data->tlpHdr3);
 | 
							pr_info("  RootErrSts:  %08x %08x %08x\n",
 | 
				
			||||||
	pr_info("  tlpHdr4:              %08x\n", data->tlpHdr4);
 | 
								data->rootErrorStatus, data->uncorrErrorStatus,
 | 
				
			||||||
	pr_info("  sourceId:             %08x\n", data->sourceId);
 | 
								data->corrErrorStatus);
 | 
				
			||||||
	pr_info("  errorClass:           %016llx\n", data->errorClass);
 | 
						if (data->tlpHdr1 || data->tlpHdr2 ||
 | 
				
			||||||
	pr_info("  correlator:           %016llx\n", data->correlator);
 | 
						    data->tlpHdr3 || data->tlpHdr4)
 | 
				
			||||||
	pr_info("  p7iocPlssr:           %016llx\n", data->p7iocPlssr);
 | 
							pr_info("  RootErrLog:  %08x %08x %08x %08x\n",
 | 
				
			||||||
	pr_info("  p7iocCsr:             %016llx\n", data->p7iocCsr);
 | 
								data->tlpHdr1, data->tlpHdr2,
 | 
				
			||||||
	pr_info("  lemFir:               %016llx\n", data->lemFir);
 | 
								data->tlpHdr3, data->tlpHdr4);
 | 
				
			||||||
	pr_info("  lemErrorMask:         %016llx\n", data->lemErrorMask);
 | 
						if (data->sourceId || data->errorClass ||
 | 
				
			||||||
	pr_info("  lemWOF:               %016llx\n", data->lemWOF);
 | 
						    data->correlator)
 | 
				
			||||||
	pr_info("  phbErrorStatus:       %016llx\n", data->phbErrorStatus);
 | 
							pr_info("  RootErrLog1: %08x %016llx %016llx\n",
 | 
				
			||||||
	pr_info("  phbFirstErrorStatus:  %016llx\n", data->phbFirstErrorStatus);
 | 
								data->sourceId, data->errorClass,
 | 
				
			||||||
	pr_info("  phbErrorLog0:         %016llx\n", data->phbErrorLog0);
 | 
								data->correlator);
 | 
				
			||||||
	pr_info("  phbErrorLog1:         %016llx\n", data->phbErrorLog1);
 | 
						if (data->p7iocPlssr || data->p7iocCsr)
 | 
				
			||||||
	pr_info("  mmioErrorStatus:      %016llx\n", data->mmioErrorStatus);
 | 
							pr_info("  PhbSts:      %016llx %016llx\n",
 | 
				
			||||||
	pr_info("  mmioFirstErrorStatus: %016llx\n", data->mmioFirstErrorStatus);
 | 
								data->p7iocPlssr, data->p7iocCsr);
 | 
				
			||||||
	pr_info("  mmioErrorLog0:        %016llx\n", data->mmioErrorLog0);
 | 
						if (data->lemFir || data->lemErrorMask ||
 | 
				
			||||||
	pr_info("  mmioErrorLog1:        %016llx\n", data->mmioErrorLog1);
 | 
						    data->lemWOF)
 | 
				
			||||||
	pr_info("  dma0ErrorStatus:      %016llx\n", data->dma0ErrorStatus);
 | 
							pr_info("  Lem:         %016llx %016llx %016llx\n",
 | 
				
			||||||
	pr_info("  dma0FirstErrorStatus: %016llx\n", data->dma0FirstErrorStatus);
 | 
								data->lemFir, data->lemErrorMask,
 | 
				
			||||||
	pr_info("  dma0ErrorLog0:        %016llx\n", data->dma0ErrorLog0);
 | 
								data->lemWOF);
 | 
				
			||||||
	pr_info("  dma0ErrorLog1:        %016llx\n", data->dma0ErrorLog1);
 | 
						if (data->phbErrorStatus || data->phbFirstErrorStatus ||
 | 
				
			||||||
	pr_info("  dma1ErrorStatus:      %016llx\n", data->dma1ErrorStatus);
 | 
						    data->phbErrorLog0   || data->phbErrorLog1)
 | 
				
			||||||
	pr_info("  dma1FirstErrorStatus: %016llx\n", data->dma1FirstErrorStatus);
 | 
							pr_info("  PhbErr:      %016llx %016llx %016llx %016llx\n",
 | 
				
			||||||
	pr_info("  dma1ErrorLog0:        %016llx\n", data->dma1ErrorLog0);
 | 
								data->phbErrorStatus, data->phbFirstErrorStatus,
 | 
				
			||||||
	pr_info("  dma1ErrorLog1:        %016llx\n", data->dma1ErrorLog1);
 | 
								data->phbErrorLog0, data->phbErrorLog1);
 | 
				
			||||||
 | 
						if (data->mmioErrorStatus || data->mmioFirstErrorStatus ||
 | 
				
			||||||
 | 
						    data->mmioErrorLog0   || data->mmioErrorLog1)
 | 
				
			||||||
 | 
							pr_info("  OutErr:      %016llx %016llx %016llx %016llx\n",
 | 
				
			||||||
 | 
								data->mmioErrorStatus, data->mmioFirstErrorStatus,
 | 
				
			||||||
 | 
								data->mmioErrorLog0, data->mmioErrorLog1);
 | 
				
			||||||
 | 
						if (data->dma0ErrorStatus || data->dma0FirstErrorStatus ||
 | 
				
			||||||
 | 
						    data->dma0ErrorLog0   || data->dma0ErrorLog1)
 | 
				
			||||||
 | 
							pr_info("  InAErr:      %016llx %016llx %016llx %016llx\n",
 | 
				
			||||||
 | 
								data->dma0ErrorStatus, data->dma0FirstErrorStatus,
 | 
				
			||||||
 | 
								data->dma0ErrorLog0, data->dma0ErrorLog1);
 | 
				
			||||||
 | 
						if (data->dma1ErrorStatus || data->dma1FirstErrorStatus ||
 | 
				
			||||||
 | 
						    data->dma1ErrorLog0   || data->dma1ErrorLog1)
 | 
				
			||||||
 | 
							pr_info("  InBErr:      %016llx %016llx %016llx %016llx\n",
 | 
				
			||||||
 | 
								data->dma1ErrorStatus, data->dma1FirstErrorStatus,
 | 
				
			||||||
 | 
								data->dma1ErrorLog0, data->dma1ErrorLog1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < OPAL_P7IOC_NUM_PEST_REGS; i++) {
 | 
						for (i = 0; i < OPAL_P7IOC_NUM_PEST_REGS; i++) {
 | 
				
			||||||
		if ((data->pestA[i] >> 63) == 0 &&
 | 
							if ((data->pestA[i] >> 63) == 0 &&
 | 
				
			||||||
		    (data->pestB[i] >> 63) == 0)
 | 
							    (data->pestB[i] >> 63) == 0)
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		pr_info("  PE[%3d] PESTA:        %016llx\n", i, data->pestA[i]);
 | 
							pr_info("  PE[%3d] A/B: %016llx %016llx\n",
 | 
				
			||||||
		pr_info("          PESTB:        %016llx\n", data->pestB[i]);
 | 
								i, data->pestA[i], data->pestB[i]);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -197,62 +212,77 @@ static void pnv_pci_dump_phb3_diag_data(struct pci_controller *hose,
 | 
				
			||||||
	data = (struct OpalIoPhb3ErrorData*)common;
 | 
						data = (struct OpalIoPhb3ErrorData*)common;
 | 
				
			||||||
	pr_info("PHB3 PHB#%d Diag-data (Version: %d)\n\n",
 | 
						pr_info("PHB3 PHB#%d Diag-data (Version: %d)\n\n",
 | 
				
			||||||
		hose->global_number, common->version);
 | 
							hose->global_number, common->version);
 | 
				
			||||||
 | 
						if (data->brdgCtl)
 | 
				
			||||||
	pr_info("  brdgCtl:              %08x\n", data->brdgCtl);
 | 
							pr_info("  brdgCtl:     %08x\n",
 | 
				
			||||||
 | 
								data->brdgCtl);
 | 
				
			||||||
	pr_info("  portStatusReg:        %08x\n", data->portStatusReg);
 | 
						if (data->portStatusReg || data->rootCmplxStatus ||
 | 
				
			||||||
	pr_info("  rootCmplxStatus:      %08x\n", data->rootCmplxStatus);
 | 
						    data->busAgentStatus)
 | 
				
			||||||
	pr_info("  busAgentStatus:       %08x\n", data->busAgentStatus);
 | 
							pr_info("  UtlSts:      %08x %08x %08x\n",
 | 
				
			||||||
 | 
								data->portStatusReg, data->rootCmplxStatus,
 | 
				
			||||||
	pr_info("  deviceStatus:         %08x\n", data->deviceStatus);
 | 
								data->busAgentStatus);
 | 
				
			||||||
	pr_info("  slotStatus:           %08x\n", data->slotStatus);
 | 
						if (data->deviceStatus || data->slotStatus   ||
 | 
				
			||||||
	pr_info("  linkStatus:           %08x\n", data->linkStatus);
 | 
						    data->linkStatus   || data->devCmdStatus ||
 | 
				
			||||||
	pr_info("  devCmdStatus:         %08x\n", data->devCmdStatus);
 | 
						    data->devSecStatus)
 | 
				
			||||||
	pr_info("  devSecStatus:         %08x\n", data->devSecStatus);
 | 
							pr_info("  RootSts:     %08x %08x %08x %08x %08x\n",
 | 
				
			||||||
 | 
								data->deviceStatus, data->slotStatus,
 | 
				
			||||||
	pr_info("  rootErrorStatus:      %08x\n", data->rootErrorStatus);
 | 
								data->linkStatus, data->devCmdStatus,
 | 
				
			||||||
	pr_info("  uncorrErrorStatus:    %08x\n", data->uncorrErrorStatus);
 | 
								data->devSecStatus);
 | 
				
			||||||
	pr_info("  corrErrorStatus:      %08x\n", data->corrErrorStatus);
 | 
						if (data->rootErrorStatus || data->uncorrErrorStatus ||
 | 
				
			||||||
	pr_info("  tlpHdr1:              %08x\n", data->tlpHdr1);
 | 
						    data->corrErrorStatus)
 | 
				
			||||||
	pr_info("  tlpHdr2:              %08x\n", data->tlpHdr2);
 | 
							pr_info("  RootErrSts:  %08x %08x %08x\n",
 | 
				
			||||||
	pr_info("  tlpHdr3:              %08x\n", data->tlpHdr3);
 | 
								data->rootErrorStatus, data->uncorrErrorStatus,
 | 
				
			||||||
	pr_info("  tlpHdr4:              %08x\n", data->tlpHdr4);
 | 
								data->corrErrorStatus);
 | 
				
			||||||
	pr_info("  sourceId:             %08x\n", data->sourceId);
 | 
						if (data->tlpHdr1 || data->tlpHdr2 ||
 | 
				
			||||||
	pr_info("  errorClass:           %016llx\n", data->errorClass);
 | 
						    data->tlpHdr3 || data->tlpHdr4)
 | 
				
			||||||
	pr_info("  correlator:           %016llx\n", data->correlator);
 | 
							pr_info("  RootErrLog:  %08x %08x %08x %08x\n",
 | 
				
			||||||
 | 
								data->tlpHdr1, data->tlpHdr2,
 | 
				
			||||||
	pr_info("  nFir:                 %016llx\n", data->nFir);
 | 
								data->tlpHdr3, data->tlpHdr4);
 | 
				
			||||||
	pr_info("  nFirMask:             %016llx\n", data->nFirMask);
 | 
						if (data->sourceId || data->errorClass ||
 | 
				
			||||||
	pr_info("  nFirWOF:              %016llx\n", data->nFirWOF);
 | 
						    data->correlator)
 | 
				
			||||||
	pr_info("  PhbPlssr:             %016llx\n", data->phbPlssr);
 | 
							pr_info("  RootErrLog1: %08x %016llx %016llx\n",
 | 
				
			||||||
	pr_info("  PhbCsr:               %016llx\n", data->phbCsr);
 | 
								data->sourceId, data->errorClass,
 | 
				
			||||||
	pr_info("  lemFir:               %016llx\n", data->lemFir);
 | 
								data->correlator);
 | 
				
			||||||
	pr_info("  lemErrorMask:         %016llx\n", data->lemErrorMask);
 | 
						if (data->nFir || data->nFirMask ||
 | 
				
			||||||
	pr_info("  lemWOF:               %016llx\n", data->lemWOF);
 | 
						    data->nFirWOF)
 | 
				
			||||||
	pr_info("  phbErrorStatus:       %016llx\n", data->phbErrorStatus);
 | 
							pr_info("  nFir:        %016llx %016llx %016llx\n",
 | 
				
			||||||
	pr_info("  phbFirstErrorStatus:  %016llx\n", data->phbFirstErrorStatus);
 | 
								data->nFir, data->nFirMask,
 | 
				
			||||||
	pr_info("  phbErrorLog0:         %016llx\n", data->phbErrorLog0);
 | 
								data->nFirWOF);
 | 
				
			||||||
	pr_info("  phbErrorLog1:         %016llx\n", data->phbErrorLog1);
 | 
						if (data->phbPlssr || data->phbCsr)
 | 
				
			||||||
	pr_info("  mmioErrorStatus:      %016llx\n", data->mmioErrorStatus);
 | 
							pr_info("  PhbSts:      %016llx %016llx\n",
 | 
				
			||||||
	pr_info("  mmioFirstErrorStatus: %016llx\n", data->mmioFirstErrorStatus);
 | 
								data->phbPlssr, data->phbCsr);
 | 
				
			||||||
	pr_info("  mmioErrorLog0:        %016llx\n", data->mmioErrorLog0);
 | 
						if (data->lemFir || data->lemErrorMask ||
 | 
				
			||||||
	pr_info("  mmioErrorLog1:        %016llx\n", data->mmioErrorLog1);
 | 
						    data->lemWOF)
 | 
				
			||||||
	pr_info("  dma0ErrorStatus:      %016llx\n", data->dma0ErrorStatus);
 | 
							pr_info("  Lem:         %016llx %016llx %016llx\n",
 | 
				
			||||||
	pr_info("  dma0FirstErrorStatus: %016llx\n", data->dma0FirstErrorStatus);
 | 
								data->lemFir, data->lemErrorMask,
 | 
				
			||||||
	pr_info("  dma0ErrorLog0:        %016llx\n", data->dma0ErrorLog0);
 | 
								data->lemWOF);
 | 
				
			||||||
	pr_info("  dma0ErrorLog1:        %016llx\n", data->dma0ErrorLog1);
 | 
						if (data->phbErrorStatus || data->phbFirstErrorStatus ||
 | 
				
			||||||
	pr_info("  dma1ErrorStatus:      %016llx\n", data->dma1ErrorStatus);
 | 
						    data->phbErrorLog0   || data->phbErrorLog1)
 | 
				
			||||||
	pr_info("  dma1FirstErrorStatus: %016llx\n", data->dma1FirstErrorStatus);
 | 
							pr_info("  PhbErr:      %016llx %016llx %016llx %016llx\n",
 | 
				
			||||||
	pr_info("  dma1ErrorLog0:        %016llx\n", data->dma1ErrorLog0);
 | 
								data->phbErrorStatus, data->phbFirstErrorStatus,
 | 
				
			||||||
	pr_info("  dma1ErrorLog1:        %016llx\n", data->dma1ErrorLog1);
 | 
								data->phbErrorLog0, data->phbErrorLog1);
 | 
				
			||||||
 | 
						if (data->mmioErrorStatus || data->mmioFirstErrorStatus ||
 | 
				
			||||||
 | 
						    data->mmioErrorLog0   || data->mmioErrorLog1)
 | 
				
			||||||
 | 
							pr_info("  OutErr:      %016llx %016llx %016llx %016llx\n",
 | 
				
			||||||
 | 
								data->mmioErrorStatus, data->mmioFirstErrorStatus,
 | 
				
			||||||
 | 
								data->mmioErrorLog0, data->mmioErrorLog1);
 | 
				
			||||||
 | 
						if (data->dma0ErrorStatus || data->dma0FirstErrorStatus ||
 | 
				
			||||||
 | 
						    data->dma0ErrorLog0   || data->dma0ErrorLog1)
 | 
				
			||||||
 | 
							pr_info("  InAErr:      %016llx %016llx %016llx %016llx\n",
 | 
				
			||||||
 | 
								data->dma0ErrorStatus, data->dma0FirstErrorStatus,
 | 
				
			||||||
 | 
								data->dma0ErrorLog0, data->dma0ErrorLog1);
 | 
				
			||||||
 | 
						if (data->dma1ErrorStatus || data->dma1FirstErrorStatus ||
 | 
				
			||||||
 | 
						    data->dma1ErrorLog0   || data->dma1ErrorLog1)
 | 
				
			||||||
 | 
							pr_info("  InBErr:      %016llx %016llx %016llx %016llx\n",
 | 
				
			||||||
 | 
								data->dma1ErrorStatus, data->dma1FirstErrorStatus,
 | 
				
			||||||
 | 
								data->dma1ErrorLog0, data->dma1ErrorLog1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < OPAL_PHB3_NUM_PEST_REGS; i++) {
 | 
						for (i = 0; i < OPAL_PHB3_NUM_PEST_REGS; i++) {
 | 
				
			||||||
		if ((data->pestA[i] >> 63) == 0 &&
 | 
							if ((data->pestA[i] >> 63) == 0 &&
 | 
				
			||||||
		    (data->pestB[i] >> 63) == 0)
 | 
							    (data->pestB[i] >> 63) == 0)
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		pr_info("  PE[%3d] PESTA:        %016llx\n", i, data->pestA[i]);
 | 
							pr_info("  PE[%3d] A/B: %016llx %016llx\n",
 | 
				
			||||||
		pr_info("          PESTB:        %016llx\n", data->pestB[i]);
 | 
								i, data->pestA[i], data->pestB[i]);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,12 +35,7 @@
 | 
				
			||||||
#include "offline_states.h"
 | 
					#include "offline_states.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* This version can't take the spinlock, because it never returns */
 | 
					/* This version can't take the spinlock, because it never returns */
 | 
				
			||||||
static struct rtas_args rtas_stop_self_args = {
 | 
					static int rtas_stop_self_token = RTAS_UNKNOWN_SERVICE;
 | 
				
			||||||
	.token = RTAS_UNKNOWN_SERVICE,
 | 
					 | 
				
			||||||
	.nargs = 0,
 | 
					 | 
				
			||||||
	.nret = 1,
 | 
					 | 
				
			||||||
	.rets = &rtas_stop_self_args.args[0],
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
static DEFINE_PER_CPU(enum cpu_state_vals, preferred_offline_state) =
 | 
					static DEFINE_PER_CPU(enum cpu_state_vals, preferred_offline_state) =
 | 
				
			||||||
							CPU_STATE_OFFLINE;
 | 
												CPU_STATE_OFFLINE;
 | 
				
			||||||
| 
						 | 
					@ -93,15 +88,20 @@ void set_default_offline_state(int cpu)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void rtas_stop_self(void)
 | 
					static void rtas_stop_self(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct rtas_args *args = &rtas_stop_self_args;
 | 
						struct rtas_args args = {
 | 
				
			||||||
 | 
							.token = cpu_to_be32(rtas_stop_self_token),
 | 
				
			||||||
 | 
							.nargs = 0,
 | 
				
			||||||
 | 
							.nret = 1,
 | 
				
			||||||
 | 
							.rets = &args.args[0],
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local_irq_disable();
 | 
						local_irq_disable();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BUG_ON(args->token == RTAS_UNKNOWN_SERVICE);
 | 
						BUG_ON(rtas_stop_self_token == RTAS_UNKNOWN_SERVICE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	printk("cpu %u (hwid %u) Ready to die...\n",
 | 
						printk("cpu %u (hwid %u) Ready to die...\n",
 | 
				
			||||||
	       smp_processor_id(), hard_smp_processor_id());
 | 
						       smp_processor_id(), hard_smp_processor_id());
 | 
				
			||||||
	enter_rtas(__pa(args));
 | 
						enter_rtas(__pa(&args));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	panic("Alas, I survived.\n");
 | 
						panic("Alas, I survived.\n");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -392,10 +392,10 @@ static int __init pseries_cpu_hotplug_init(void)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rtas_stop_self_args.token = rtas_token("stop-self");
 | 
						rtas_stop_self_token = rtas_token("stop-self");
 | 
				
			||||||
	qcss_tok = rtas_token("query-cpu-stopped-state");
 | 
						qcss_tok = rtas_token("query-cpu-stopped-state");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (rtas_stop_self_args.token == RTAS_UNKNOWN_SERVICE ||
 | 
						if (rtas_stop_self_token == RTAS_UNKNOWN_SERVICE ||
 | 
				
			||||||
			qcss_tok == RTAS_UNKNOWN_SERVICE) {
 | 
								qcss_tok == RTAS_UNKNOWN_SERVICE) {
 | 
				
			||||||
		printk(KERN_INFO "CPU Hotplug not supported by firmware "
 | 
							printk(KERN_INFO "CPU Hotplug not supported by firmware "
 | 
				
			||||||
				"- disabling.\n");
 | 
									"- disabling.\n");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1421,5 +1421,5 @@ ENTRY(sys_sched_setattr_wrapper)
 | 
				
			||||||
ENTRY(sys_sched_getattr_wrapper)
 | 
					ENTRY(sys_sched_getattr_wrapper)
 | 
				
			||||||
	lgfr	%r2,%r2			# pid_t
 | 
						lgfr	%r2,%r2			# pid_t
 | 
				
			||||||
	llgtr	%r3,%r3			# const char __user *
 | 
						llgtr	%r3,%r3			# const char __user *
 | 
				
			||||||
	llgfr	%r3,%r3			# unsigned int
 | 
						llgfr	%r4,%r4			# unsigned int
 | 
				
			||||||
	jg	sys_sched_getattr
 | 
						jg	sys_sched_getattr
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -206,11 +206,13 @@ static void dma_cleanup_tables(struct zpci_dev *zdev)
 | 
				
			||||||
	zdev->dma_table = NULL;
 | 
						zdev->dma_table = NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static unsigned long __dma_alloc_iommu(struct zpci_dev *zdev, unsigned long start,
 | 
					static unsigned long __dma_alloc_iommu(struct zpci_dev *zdev,
 | 
				
			||||||
				   int size)
 | 
									       unsigned long start, int size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned long boundary_size = 0x1000000;
 | 
						unsigned long boundary_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						boundary_size = ALIGN(dma_get_seg_boundary(&zdev->pdev->dev) + 1,
 | 
				
			||||||
 | 
								      PAGE_SIZE) >> PAGE_SHIFT;
 | 
				
			||||||
	return iommu_area_alloc(zdev->iommu_bitmap, zdev->iommu_pages,
 | 
						return iommu_area_alloc(zdev->iommu_bitmap, zdev->iommu_pages,
 | 
				
			||||||
				start, size, 0, boundary_size, 0);
 | 
									start, size, 0, boundary_size, 0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@
 | 
				
			||||||
#define SH_CACHE_ASSOC		8
 | 
					#define SH_CACHE_ASSOC		8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(CONFIG_CPU_SUBTYPE_SH7619)
 | 
					#if defined(CONFIG_CPU_SUBTYPE_SH7619)
 | 
				
			||||||
#define CCR		0xffffffec
 | 
					#define SH_CCR		0xffffffec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CCR_CACHE_CE	0x01	/* Cache enable */
 | 
					#define CCR_CACHE_CE	0x01	/* Cache enable */
 | 
				
			||||||
#define CCR_CACHE_WT	0x02    /* CCR[bit1=1,bit2=1] */
 | 
					#define CCR_CACHE_WT	0x02    /* CCR[bit1=1,bit2=1] */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,8 +17,8 @@
 | 
				
			||||||
#define SH_CACHE_COMBINED	4
 | 
					#define SH_CACHE_COMBINED	4
 | 
				
			||||||
#define SH_CACHE_ASSOC		8
 | 
					#define SH_CACHE_ASSOC		8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CCR		0xfffc1000 /* CCR1 */
 | 
					#define SH_CCR		0xfffc1000 /* CCR1 */
 | 
				
			||||||
#define CCR2		0xfffc1004
 | 
					#define SH_CCR2		0xfffc1004
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Most of the SH-2A CCR1 definitions resemble the SH-4 ones. All others not
 | 
					 * Most of the SH-2A CCR1 definitions resemble the SH-4 ones. All others not
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,7 @@
 | 
				
			||||||
#define SH_CACHE_COMBINED	4
 | 
					#define SH_CACHE_COMBINED	4
 | 
				
			||||||
#define SH_CACHE_ASSOC		8
 | 
					#define SH_CACHE_ASSOC		8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CCR		0xffffffec	/* Address of Cache Control Register */
 | 
					#define SH_CCR		0xffffffec	/* Address of Cache Control Register */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CCR_CACHE_CE	0x01	/* Cache Enable */
 | 
					#define CCR_CACHE_CE	0x01	/* Cache Enable */
 | 
				
			||||||
#define CCR_CACHE_WT	0x02	/* Write-Through (for P0,U0,P3) (else writeback) */
 | 
					#define CCR_CACHE_WT	0x02	/* Write-Through (for P0,U0,P3) (else writeback) */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,7 @@
 | 
				
			||||||
#define SH_CACHE_COMBINED	4
 | 
					#define SH_CACHE_COMBINED	4
 | 
				
			||||||
#define SH_CACHE_ASSOC		8
 | 
					#define SH_CACHE_ASSOC		8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CCR		0xff00001c	/* Address of Cache Control Register */
 | 
					#define SH_CCR		0xff00001c	/* Address of Cache Control Register */
 | 
				
			||||||
#define CCR_CACHE_OCE	0x0001	/* Operand Cache Enable */
 | 
					#define CCR_CACHE_OCE	0x0001	/* Operand Cache Enable */
 | 
				
			||||||
#define CCR_CACHE_WT	0x0002	/* Write-Through (for P0,U0,P3) (else writeback)*/
 | 
					#define CCR_CACHE_WT	0x0002	/* Write-Through (for P0,U0,P3) (else writeback)*/
 | 
				
			||||||
#define CCR_CACHE_CB	0x0004	/* Copy-Back (for P1) (else writethrough) */
 | 
					#define CCR_CACHE_CB	0x0004	/* Copy-Back (for P1) (else writethrough) */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -112,7 +112,7 @@ static void cache_init(void)
 | 
				
			||||||
	unsigned long ccr, flags;
 | 
						unsigned long ccr, flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	jump_to_uncached();
 | 
						jump_to_uncached();
 | 
				
			||||||
	ccr = __raw_readl(CCR);
 | 
						ccr = __raw_readl(SH_CCR);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * At this point we don't know whether the cache is enabled or not - a
 | 
						 * At this point we don't know whether the cache is enabled or not - a
 | 
				
			||||||
| 
						 | 
					@ -189,7 +189,7 @@ static void cache_init(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	l2_cache_init();
 | 
						l2_cache_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	__raw_writel(flags, CCR);
 | 
						__raw_writel(flags, SH_CCR);
 | 
				
			||||||
	back_to_cached();
 | 
						back_to_cached();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,7 +36,7 @@ static int cache_seq_show(struct seq_file *file, void *iter)
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	jump_to_uncached();
 | 
						jump_to_uncached();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ccr = __raw_readl(CCR);
 | 
						ccr = __raw_readl(SH_CCR);
 | 
				
			||||||
	if ((ccr & CCR_CACHE_ENABLE) == 0) {
 | 
						if ((ccr & CCR_CACHE_ENABLE) == 0) {
 | 
				
			||||||
		back_to_cached();
 | 
							back_to_cached();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,9 +63,9 @@ static void sh2__flush_invalidate_region(void *start, int size)
 | 
				
			||||||
	local_irq_save(flags);
 | 
						local_irq_save(flags);
 | 
				
			||||||
	jump_to_uncached();
 | 
						jump_to_uncached();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ccr = __raw_readl(CCR);
 | 
						ccr = __raw_readl(SH_CCR);
 | 
				
			||||||
	ccr |= CCR_CACHE_INVALIDATE;
 | 
						ccr |= CCR_CACHE_INVALIDATE;
 | 
				
			||||||
	__raw_writel(ccr, CCR);
 | 
						__raw_writel(ccr, SH_CCR);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	back_to_cached();
 | 
						back_to_cached();
 | 
				
			||||||
	local_irq_restore(flags);
 | 
						local_irq_restore(flags);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -134,7 +134,8 @@ static void sh2a__flush_invalidate_region(void *start, int size)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* If there are too many pages then just blow the cache */
 | 
						/* If there are too many pages then just blow the cache */
 | 
				
			||||||
	if (((end - begin) >> PAGE_SHIFT) >= MAX_OCACHE_PAGES) {
 | 
						if (((end - begin) >> PAGE_SHIFT) >= MAX_OCACHE_PAGES) {
 | 
				
			||||||
		__raw_writel(__raw_readl(CCR) | CCR_OCACHE_INVALIDATE, CCR);
 | 
							__raw_writel(__raw_readl(SH_CCR) | CCR_OCACHE_INVALIDATE,
 | 
				
			||||||
 | 
								     SH_CCR);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		for (v = begin; v < end; v += L1_CACHE_BYTES)
 | 
							for (v = begin; v < end; v += L1_CACHE_BYTES)
 | 
				
			||||||
			sh2a_invalidate_line(CACHE_OC_ADDRESS_ARRAY, v);
 | 
								sh2a_invalidate_line(CACHE_OC_ADDRESS_ARRAY, v);
 | 
				
			||||||
| 
						 | 
					@ -167,7 +168,8 @@ static void sh2a_flush_icache_range(void *args)
 | 
				
			||||||
	/* I-Cache invalidate */
 | 
						/* I-Cache invalidate */
 | 
				
			||||||
	/* If there are too many pages then just blow the cache */
 | 
						/* If there are too many pages then just blow the cache */
 | 
				
			||||||
	if (((end - start) >> PAGE_SHIFT) >= MAX_ICACHE_PAGES) {
 | 
						if (((end - start) >> PAGE_SHIFT) >= MAX_ICACHE_PAGES) {
 | 
				
			||||||
		__raw_writel(__raw_readl(CCR) | CCR_ICACHE_INVALIDATE, CCR);
 | 
							__raw_writel(__raw_readl(SH_CCR) | CCR_ICACHE_INVALIDATE,
 | 
				
			||||||
 | 
								     SH_CCR);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		for (v = start; v < end; v += L1_CACHE_BYTES)
 | 
							for (v = start; v < end; v += L1_CACHE_BYTES)
 | 
				
			||||||
			sh2a_invalidate_line(CACHE_IC_ADDRESS_ARRAY, v);
 | 
								sh2a_invalidate_line(CACHE_IC_ADDRESS_ARRAY, v);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -133,9 +133,9 @@ static void flush_icache_all(void)
 | 
				
			||||||
	jump_to_uncached();
 | 
						jump_to_uncached();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Flush I-cache */
 | 
						/* Flush I-cache */
 | 
				
			||||||
	ccr = __raw_readl(CCR);
 | 
						ccr = __raw_readl(SH_CCR);
 | 
				
			||||||
	ccr |= CCR_CACHE_ICI;
 | 
						ccr |= CCR_CACHE_ICI;
 | 
				
			||||||
	__raw_writel(ccr, CCR);
 | 
						__raw_writel(ccr, SH_CCR);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * back_to_cached() will take care of the barrier for us, don't add
 | 
						 * back_to_cached() will take care of the barrier for us, don't add
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,7 @@ void __init shx3_cache_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned int ccr;
 | 
						unsigned int ccr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ccr = __raw_readl(CCR);
 | 
						ccr = __raw_readl(SH_CCR);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * If we've got cache aliases, resolve them in hardware.
 | 
						 * If we've got cache aliases, resolve them in hardware.
 | 
				
			||||||
| 
						 | 
					@ -40,5 +40,5 @@ void __init shx3_cache_init(void)
 | 
				
			||||||
	ccr |= CCR_CACHE_IBE;
 | 
						ccr |= CCR_CACHE_IBE;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	writel_uncached(ccr, CCR);
 | 
						writel_uncached(ccr, SH_CCR);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -285,8 +285,8 @@ void __init cpu_cache_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned int cache_disabled = 0;
 | 
						unsigned int cache_disabled = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CCR
 | 
					#ifdef SH_CCR
 | 
				
			||||||
	cache_disabled = !(__raw_readl(CCR) & CCR_CACHE_ENABLE);
 | 
						cache_disabled = !(__raw_readl(SH_CCR) & CCR_CACHE_ENABLE);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	compute_alias(&boot_cpu_data.icache);
 | 
						compute_alias(&boot_cpu_data.icache);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,7 +27,7 @@ config SPARC
 | 
				
			||||||
	select RTC_DRV_M48T59
 | 
						select RTC_DRV_M48T59
 | 
				
			||||||
	select HAVE_DMA_ATTRS
 | 
						select HAVE_DMA_ATTRS
 | 
				
			||||||
	select HAVE_DMA_API_DEBUG
 | 
						select HAVE_DMA_API_DEBUG
 | 
				
			||||||
	select HAVE_ARCH_JUMP_LABEL
 | 
						select HAVE_ARCH_JUMP_LABEL if SPARC64
 | 
				
			||||||
	select GENERIC_IRQ_SHOW
 | 
						select GENERIC_IRQ_SHOW
 | 
				
			||||||
	select ARCH_WANT_IPC_PARSE_VERSION
 | 
						select ARCH_WANT_IPC_PARSE_VERSION
 | 
				
			||||||
	select GENERIC_PCI_IOMAP
 | 
						select GENERIC_PCI_IOMAP
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,6 +14,7 @@
 | 
				
			||||||
#include <linux/pagemap.h>
 | 
					#include <linux/pagemap.h>
 | 
				
			||||||
#include <linux/vmalloc.h>
 | 
					#include <linux/vmalloc.h>
 | 
				
			||||||
#include <linux/kdebug.h>
 | 
					#include <linux/kdebug.h>
 | 
				
			||||||
 | 
					#include <linux/export.h>
 | 
				
			||||||
#include <linux/kernel.h>
 | 
					#include <linux/kernel.h>
 | 
				
			||||||
#include <linux/init.h>
 | 
					#include <linux/init.h>
 | 
				
			||||||
#include <linux/log2.h>
 | 
					#include <linux/log2.h>
 | 
				
			||||||
| 
						 | 
					@ -62,6 +63,7 @@ extern unsigned long last_valid_pfn;
 | 
				
			||||||
static pgd_t *srmmu_swapper_pg_dir;
 | 
					static pgd_t *srmmu_swapper_pg_dir;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const struct sparc32_cachetlb_ops *sparc32_cachetlb_ops;
 | 
					const struct sparc32_cachetlb_ops *sparc32_cachetlb_ops;
 | 
				
			||||||
 | 
					EXPORT_SYMBOL(sparc32_cachetlb_ops);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_SMP
 | 
					#ifdef CONFIG_SMP
 | 
				
			||||||
const struct sparc32_cachetlb_ops *local_ops;
 | 
					const struct sparc32_cachetlb_ops *local_ops;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -111,7 +111,7 @@ struct mem_vector {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MEM_AVOID_MAX 5
 | 
					#define MEM_AVOID_MAX 5
 | 
				
			||||||
struct mem_vector mem_avoid[MEM_AVOID_MAX];
 | 
					static struct mem_vector mem_avoid[MEM_AVOID_MAX];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool mem_contains(struct mem_vector *region, struct mem_vector *item)
 | 
					static bool mem_contains(struct mem_vector *region, struct mem_vector *item)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -180,7 +180,7 @@ static void mem_avoid_init(unsigned long input, unsigned long input_size,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Does this memory vector overlap a known avoided area? */
 | 
					/* Does this memory vector overlap a known avoided area? */
 | 
				
			||||||
bool mem_avoid_overlap(struct mem_vector *img)
 | 
					static bool mem_avoid_overlap(struct mem_vector *img)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -192,8 +192,9 @@ bool mem_avoid_overlap(struct mem_vector *img)
 | 
				
			||||||
	return false;
 | 
						return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned long slots[CONFIG_RANDOMIZE_BASE_MAX_OFFSET / CONFIG_PHYSICAL_ALIGN];
 | 
					static unsigned long slots[CONFIG_RANDOMIZE_BASE_MAX_OFFSET /
 | 
				
			||||||
unsigned long slot_max = 0;
 | 
								   CONFIG_PHYSICAL_ALIGN];
 | 
				
			||||||
 | 
					static unsigned long slot_max;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void slots_append(unsigned long addr)
 | 
					static void slots_append(unsigned long addr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,6 +66,6 @@ extern void tsc_save_sched_clock_state(void);
 | 
				
			||||||
extern void tsc_restore_sched_clock_state(void);
 | 
					extern void tsc_restore_sched_clock_state(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* MSR based TSC calibration for Intel Atom SoC platforms */
 | 
					/* MSR based TSC calibration for Intel Atom SoC platforms */
 | 
				
			||||||
int try_msr_calibrate_tsc(unsigned long *fast_calibrate);
 | 
					unsigned long try_msr_calibrate_tsc(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* _ASM_X86_TSC_H */
 | 
					#endif /* _ASM_X86_TSC_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1192,6 +1192,9 @@ static void x86_pmu_del(struct perf_event *event, int flags)
 | 
				
			||||||
	for (i = 0; i < cpuc->n_events; i++) {
 | 
						for (i = 0; i < cpuc->n_events; i++) {
 | 
				
			||||||
		if (event == cpuc->event_list[i]) {
 | 
							if (event == cpuc->event_list[i]) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (i >= cpuc->n_events - cpuc->n_added)
 | 
				
			||||||
 | 
									--cpuc->n_added;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (x86_pmu.put_event_constraints)
 | 
								if (x86_pmu.put_event_constraints)
 | 
				
			||||||
				x86_pmu.put_event_constraints(cpuc, event);
 | 
									x86_pmu.put_event_constraints(cpuc, event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1521,6 +1524,8 @@ static int __init init_hw_perf_events(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pr_cont("%s PMU driver.\n", x86_pmu.name);
 | 
						pr_cont("%s PMU driver.\n", x86_pmu.name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						x86_pmu.attr_rdpmc = 1; /* enable userspace RDPMC usage by default */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (quirk = x86_pmu.quirks; quirk; quirk = quirk->next)
 | 
						for (quirk = x86_pmu.quirks; quirk; quirk = quirk->next)
 | 
				
			||||||
		quirk->func();
 | 
							quirk->func();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1534,7 +1539,6 @@ static int __init init_hw_perf_events(void)
 | 
				
			||||||
		__EVENT_CONSTRAINT(0, (1ULL << x86_pmu.num_counters) - 1,
 | 
							__EVENT_CONSTRAINT(0, (1ULL << x86_pmu.num_counters) - 1,
 | 
				
			||||||
				   0, x86_pmu.num_counters, 0, 0);
 | 
									   0, x86_pmu.num_counters, 0, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	x86_pmu.attr_rdpmc = 1; /* enable userspace RDPMC usage by default */
 | 
					 | 
				
			||||||
	x86_pmu_format_group.attrs = x86_pmu.format_attrs;
 | 
						x86_pmu_format_group.attrs = x86_pmu.format_attrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (x86_pmu.event_attrs)
 | 
						if (x86_pmu.event_attrs)
 | 
				
			||||||
| 
						 | 
					@ -1820,9 +1824,12 @@ static ssize_t set_attr_rdpmc(struct device *cdev,
 | 
				
			||||||
	if (ret)
 | 
						if (ret)
 | 
				
			||||||
		return ret;
 | 
							return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (x86_pmu.attr_rdpmc_broken)
 | 
				
			||||||
 | 
							return -ENOTSUPP;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!!val != !!x86_pmu.attr_rdpmc) {
 | 
						if (!!val != !!x86_pmu.attr_rdpmc) {
 | 
				
			||||||
		x86_pmu.attr_rdpmc = !!val;
 | 
							x86_pmu.attr_rdpmc = !!val;
 | 
				
			||||||
		smp_call_function(change_rdpmc, (void *)val, 1);
 | 
							on_each_cpu(change_rdpmc, (void *)val, 1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return count;
 | 
						return count;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -409,6 +409,7 @@ struct x86_pmu {
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * sysfs attrs
 | 
						 * sysfs attrs
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
 | 
						int		attr_rdpmc_broken;
 | 
				
			||||||
	int		attr_rdpmc;
 | 
						int		attr_rdpmc;
 | 
				
			||||||
	struct attribute **format_attrs;
 | 
						struct attribute **format_attrs;
 | 
				
			||||||
	struct attribute **event_attrs;
 | 
						struct attribute **event_attrs;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1361,10 +1361,8 @@ static int intel_pmu_handle_irq(struct pt_regs *regs)
 | 
				
			||||||
	intel_pmu_disable_all();
 | 
						intel_pmu_disable_all();
 | 
				
			||||||
	handled = intel_pmu_drain_bts_buffer();
 | 
						handled = intel_pmu_drain_bts_buffer();
 | 
				
			||||||
	status = intel_pmu_get_status();
 | 
						status = intel_pmu_get_status();
 | 
				
			||||||
	if (!status) {
 | 
						if (!status)
 | 
				
			||||||
		intel_pmu_enable_all(0);
 | 
							goto done;
 | 
				
			||||||
		return handled;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	loops = 0;
 | 
						loops = 0;
 | 
				
			||||||
again:
 | 
					again:
 | 
				
			||||||
| 
						 | 
					@ -2310,10 +2308,7 @@ __init int intel_pmu_init(void)
 | 
				
			||||||
	if (version > 1)
 | 
						if (version > 1)
 | 
				
			||||||
		x86_pmu.num_counters_fixed = max((int)edx.split.num_counters_fixed, 3);
 | 
							x86_pmu.num_counters_fixed = max((int)edx.split.num_counters_fixed, 3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						if (boot_cpu_has(X86_FEATURE_PDCM)) {
 | 
				
			||||||
	 * v2 and above have a perf capabilities MSR
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	if (version > 1) {
 | 
					 | 
				
			||||||
		u64 capabilities;
 | 
							u64 capabilities;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		rdmsrl(MSR_IA32_PERF_CAPABILITIES, capabilities);
 | 
							rdmsrl(MSR_IA32_PERF_CAPABILITIES, capabilities);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -501,8 +501,11 @@ static struct extra_reg snbep_uncore_cbox_extra_regs[] = {
 | 
				
			||||||
	SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN,
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN,
 | 
				
			||||||
				  SNBEP_CBO_PMON_CTL_TID_EN, 0x1),
 | 
									  SNBEP_CBO_PMON_CTL_TID_EN, 0x1),
 | 
				
			||||||
	SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4),
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4),
 | 
				
			||||||
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x4334, 0xffff, 0x6),
 | 
				
			||||||
	SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4),
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4),
 | 
				
			||||||
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x4534, 0xffff, 0x6),
 | 
				
			||||||
	SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4),
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4),
 | 
				
			||||||
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x4934, 0xffff, 0x6),
 | 
				
			||||||
	SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0x6),
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0x6),
 | 
				
			||||||
	SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x8),
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x8),
 | 
				
			||||||
	SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x8),
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x8),
 | 
				
			||||||
| 
						 | 
					@ -1178,10 +1181,15 @@ static struct extra_reg ivt_uncore_cbox_extra_regs[] = {
 | 
				
			||||||
	SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN,
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN,
 | 
				
			||||||
				  SNBEP_CBO_PMON_CTL_TID_EN, 0x1),
 | 
									  SNBEP_CBO_PMON_CTL_TID_EN, 0x1),
 | 
				
			||||||
	SNBEP_CBO_EVENT_EXTRA_REG(0x1031, 0x10ff, 0x2),
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x1031, 0x10ff, 0x2),
 | 
				
			||||||
	SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4),
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x1134, 0xffff, 0x4),
 | 
				
			||||||
	SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4),
 | 
					 | 
				
			||||||
	SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4),
 | 
					 | 
				
			||||||
	SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0xc),
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0xc),
 | 
				
			||||||
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x5134, 0xffff, 0xc),
 | 
				
			||||||
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4),
 | 
				
			||||||
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x4334, 0xffff, 0xc),
 | 
				
			||||||
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4),
 | 
				
			||||||
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x4534, 0xffff, 0xc),
 | 
				
			||||||
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4),
 | 
				
			||||||
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x4934, 0xffff, 0xc),
 | 
				
			||||||
	SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x10),
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x10),
 | 
				
			||||||
	SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x10),
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x10),
 | 
				
			||||||
	SNBEP_CBO_EVENT_EXTRA_REG(0x2135, 0xffff, 0x10),
 | 
						SNBEP_CBO_EVENT_EXTRA_REG(0x2135, 0xffff, 0x10),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -231,31 +231,49 @@ static __initconst const struct x86_pmu p6_pmu = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static __init void p6_pmu_rdpmc_quirk(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (boot_cpu_data.x86_mask < 9) {
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
 | 
							 * PPro erratum 26; fixed in stepping 9 and above.
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							pr_warn("Userspace RDPMC support disabled due to a CPU erratum\n");
 | 
				
			||||||
 | 
							x86_pmu.attr_rdpmc_broken = 1;
 | 
				
			||||||
 | 
							x86_pmu.attr_rdpmc = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__init int p6_pmu_init(void)
 | 
					__init int p6_pmu_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						x86_pmu = p6_pmu;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (boot_cpu_data.x86_model) {
 | 
						switch (boot_cpu_data.x86_model) {
 | 
				
			||||||
	case 1:
 | 
						case  1: /* Pentium Pro */
 | 
				
			||||||
	case 3:  /* Pentium Pro */
 | 
							x86_add_quirk(p6_pmu_rdpmc_quirk);
 | 
				
			||||||
	case 5:
 | 
					 | 
				
			||||||
	case 6:  /* Pentium II */
 | 
					 | 
				
			||||||
	case 7:
 | 
					 | 
				
			||||||
	case 8:
 | 
					 | 
				
			||||||
	case 11: /* Pentium III */
 | 
					 | 
				
			||||||
	case 9:
 | 
					 | 
				
			||||||
	case 13:
 | 
					 | 
				
			||||||
		/* Pentium M */
 | 
					 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case  3: /* Pentium II - Klamath */
 | 
				
			||||||
 | 
						case  5: /* Pentium II - Deschutes */
 | 
				
			||||||
 | 
						case  6: /* Pentium II - Mendocino */
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case  7: /* Pentium III - Katmai */
 | 
				
			||||||
 | 
						case  8: /* Pentium III - Coppermine */
 | 
				
			||||||
 | 
						case 10: /* Pentium III Xeon */
 | 
				
			||||||
 | 
						case 11: /* Pentium III - Tualatin */
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case  9: /* Pentium M - Banias */
 | 
				
			||||||
 | 
						case 13: /* Pentium M - Dothan */
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		pr_cont("unsupported p6 CPU model %d ",
 | 
							pr_cont("unsupported p6 CPU model %d ", boot_cpu_data.x86_model);
 | 
				
			||||||
			boot_cpu_data.x86_model);
 | 
					 | 
				
			||||||
		return -ENODEV;
 | 
							return -ENODEV;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	x86_pmu = p6_pmu;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	memcpy(hw_cache_event_ids, p6_hw_cache_event_ids,
 | 
						memcpy(hw_cache_event_ids, p6_hw_cache_event_ids,
 | 
				
			||||||
		sizeof(hw_cache_event_ids));
 | 
							sizeof(hw_cache_event_ids));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -279,5 +279,7 @@ void arch_crash_save_vmcoreinfo(void)
 | 
				
			||||||
	VMCOREINFO_SYMBOL(node_data);
 | 
						VMCOREINFO_SYMBOL(node_data);
 | 
				
			||||||
	VMCOREINFO_LENGTH(node_data, MAX_NUMNODES);
 | 
						VMCOREINFO_LENGTH(node_data, MAX_NUMNODES);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
						vmcoreinfo_append_str("KERNELOFFSET=%lx\n",
 | 
				
			||||||
 | 
								      (unsigned long)&_text - __START_KERNEL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -100,8 +100,10 @@ void *dma_generic_alloc_coherent(struct device *dev, size_t size,
 | 
				
			||||||
	flag |= __GFP_ZERO;
 | 
						flag |= __GFP_ZERO;
 | 
				
			||||||
again:
 | 
					again:
 | 
				
			||||||
	page = NULL;
 | 
						page = NULL;
 | 
				
			||||||
	if (!(flag & GFP_ATOMIC))
 | 
						/* CMA can be used only in the context which permits sleeping */
 | 
				
			||||||
 | 
						if (flag & __GFP_WAIT)
 | 
				
			||||||
		page = dma_alloc_from_contiguous(dev, count, get_order(size));
 | 
							page = dma_alloc_from_contiguous(dev, count, get_order(size));
 | 
				
			||||||
 | 
						/* fallback */
 | 
				
			||||||
	if (!page)
 | 
						if (!page)
 | 
				
			||||||
		page = alloc_pages_node(dev_to_node(dev), flag, get_order(size));
 | 
							page = alloc_pages_node(dev_to_node(dev), flag, get_order(size));
 | 
				
			||||||
	if (!page)
 | 
						if (!page)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -653,13 +653,10 @@ unsigned long native_calibrate_tsc(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Calibrate TSC using MSR for Intel Atom SoCs */
 | 
						/* Calibrate TSC using MSR for Intel Atom SoCs */
 | 
				
			||||||
	local_irq_save(flags);
 | 
						local_irq_save(flags);
 | 
				
			||||||
	i = try_msr_calibrate_tsc(&fast_calibrate);
 | 
						fast_calibrate = try_msr_calibrate_tsc();
 | 
				
			||||||
	local_irq_restore(flags);
 | 
						local_irq_restore(flags);
 | 
				
			||||||
	if (i >= 0) {
 | 
						if (fast_calibrate)
 | 
				
			||||||
		if (i == 0)
 | 
					 | 
				
			||||||
			pr_warn("Fast TSC calibration using MSR failed\n");
 | 
					 | 
				
			||||||
		return fast_calibrate;
 | 
							return fast_calibrate;
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local_irq_save(flags);
 | 
						local_irq_save(flags);
 | 
				
			||||||
	fast_calibrate = quick_pit_calibrate();
 | 
						fast_calibrate = quick_pit_calibrate();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,7 +53,7 @@ static struct freq_desc freq_desc_tables[] = {
 | 
				
			||||||
	/* TNG */
 | 
						/* TNG */
 | 
				
			||||||
	{ 6, 0x4a, 1, { 0, FREQ_100, FREQ_133, 0, 0, 0, 0, 0 } },
 | 
						{ 6, 0x4a, 1, { 0, FREQ_100, FREQ_133, 0, 0, 0, 0, 0 } },
 | 
				
			||||||
	/* VLV2 */
 | 
						/* VLV2 */
 | 
				
			||||||
	{ 6, 0x37, 1, { 0, FREQ_100, FREQ_133, FREQ_166, 0, 0, 0, 0 } },
 | 
						{ 6, 0x37, 1, { FREQ_83, FREQ_100, FREQ_133, FREQ_166, 0, 0, 0, 0 } },
 | 
				
			||||||
	/* ANN */
 | 
						/* ANN */
 | 
				
			||||||
	{ 6, 0x5a, 1, { FREQ_83, FREQ_100, FREQ_133, FREQ_100, 0, 0, 0, 0 } },
 | 
						{ 6, 0x5a, 1, { FREQ_83, FREQ_100, FREQ_133, FREQ_100, 0, 0, 0, 0 } },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -77,21 +77,18 @@ static int match_cpu(u8 family, u8 model)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Do MSR calibration only for known/supported CPUs.
 | 
					 * Do MSR calibration only for known/supported CPUs.
 | 
				
			||||||
 * Return values:
 | 
					 *
 | 
				
			||||||
 * -1: CPU is unknown/unsupported for MSR based calibration
 | 
					 * Returns the calibration value or 0 if MSR calibration failed.
 | 
				
			||||||
 *  0: CPU is known/supported, but calibration failed
 | 
					 | 
				
			||||||
 *  1: CPU is known/supported, and calibration succeeded
 | 
					 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int try_msr_calibrate_tsc(unsigned long *fast_calibrate)
 | 
					unsigned long try_msr_calibrate_tsc(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int cpu_index;
 | 
					 | 
				
			||||||
	u32 lo, hi, ratio, freq_id, freq;
 | 
						u32 lo, hi, ratio, freq_id, freq;
 | 
				
			||||||
 | 
						unsigned long res;
 | 
				
			||||||
 | 
						int cpu_index;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cpu_index = match_cpu(boot_cpu_data.x86, boot_cpu_data.x86_model);
 | 
						cpu_index = match_cpu(boot_cpu_data.x86, boot_cpu_data.x86_model);
 | 
				
			||||||
	if (cpu_index < 0)
 | 
						if (cpu_index < 0)
 | 
				
			||||||
		return -1;
 | 
							return 0;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	*fast_calibrate = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (freq_desc_tables[cpu_index].msr_plat) {
 | 
						if (freq_desc_tables[cpu_index].msr_plat) {
 | 
				
			||||||
		rdmsr(MSR_PLATFORM_INFO, lo, hi);
 | 
							rdmsr(MSR_PLATFORM_INFO, lo, hi);
 | 
				
			||||||
| 
						 | 
					@ -103,7 +100,7 @@ int try_msr_calibrate_tsc(unsigned long *fast_calibrate)
 | 
				
			||||||
	pr_info("Maximum core-clock to bus-clock ratio: 0x%x\n", ratio);
 | 
						pr_info("Maximum core-clock to bus-clock ratio: 0x%x\n", ratio);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!ratio)
 | 
						if (!ratio)
 | 
				
			||||||
		return 0;
 | 
							goto fail;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Get FSB FREQ ID */
 | 
						/* Get FSB FREQ ID */
 | 
				
			||||||
	rdmsr(MSR_FSB_FREQ, lo, hi);
 | 
						rdmsr(MSR_FSB_FREQ, lo, hi);
 | 
				
			||||||
| 
						 | 
					@ -112,16 +109,19 @@ int try_msr_calibrate_tsc(unsigned long *fast_calibrate)
 | 
				
			||||||
	pr_info("Resolved frequency ID: %u, frequency: %u KHz\n",
 | 
						pr_info("Resolved frequency ID: %u, frequency: %u KHz\n",
 | 
				
			||||||
				freq_id, freq);
 | 
									freq_id, freq);
 | 
				
			||||||
	if (!freq)
 | 
						if (!freq)
 | 
				
			||||||
		return 0;
 | 
							goto fail;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* TSC frequency = maximum resolved freq * maximum resolved bus ratio */
 | 
						/* TSC frequency = maximum resolved freq * maximum resolved bus ratio */
 | 
				
			||||||
	*fast_calibrate = freq * ratio;
 | 
						res = freq * ratio;
 | 
				
			||||||
	pr_info("TSC runs at %lu KHz\n", *fast_calibrate);
 | 
						pr_info("TSC runs at %lu KHz\n", res);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_X86_LOCAL_APIC
 | 
					#ifdef CONFIG_X86_LOCAL_APIC
 | 
				
			||||||
	lapic_timer_frequency = (freq * 1000) / HZ;
 | 
						lapic_timer_frequency = (freq * 1000) / HZ;
 | 
				
			||||||
	pr_info("lapic_timer_frequency = %d\n", lapic_timer_frequency);
 | 
						pr_info("lapic_timer_frequency = %d\n", lapic_timer_frequency);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
						return res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 1;
 | 
					fail:
 | 
				
			||||||
 | 
						pr_warn("Fast TSC calibration using MSR failed\n");
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2672,6 +2672,7 @@ static int __direct_map(struct kvm_vcpu *vcpu, gpa_t v, int write,
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							drop_large_spte(vcpu, iterator.sptep);
 | 
				
			||||||
		if (!is_shadow_present_pte(*iterator.sptep)) {
 | 
							if (!is_shadow_present_pte(*iterator.sptep)) {
 | 
				
			||||||
			u64 base_addr = iterator.addr;
 | 
								u64 base_addr = iterator.addr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6688,7 +6688,7 @@ static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu)
 | 
				
			||||||
		else if (is_page_fault(intr_info))
 | 
							else if (is_page_fault(intr_info))
 | 
				
			||||||
			return enable_ept;
 | 
								return enable_ept;
 | 
				
			||||||
		else if (is_no_device(intr_info) &&
 | 
							else if (is_no_device(intr_info) &&
 | 
				
			||||||
			 !(nested_read_cr0(vmcs12) & X86_CR0_TS))
 | 
								 !(vmcs12->guest_cr0 & X86_CR0_TS))
 | 
				
			||||||
			return 0;
 | 
								return 0;
 | 
				
			||||||
		return vmcs12->exception_bitmap &
 | 
							return vmcs12->exception_bitmap &
 | 
				
			||||||
				(1u << (intr_info & INTR_INFO_VECTOR_MASK));
 | 
									(1u << (intr_info & INTR_INFO_VECTOR_MASK));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6186,7 +6186,7 @@ static int complete_emulated_mmio(struct kvm_vcpu *vcpu)
 | 
				
			||||||
		frag->len -= len;
 | 
							frag->len -= len;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (vcpu->mmio_cur_fragment == vcpu->mmio_nr_fragments) {
 | 
						if (vcpu->mmio_cur_fragment >= vcpu->mmio_nr_fragments) {
 | 
				
			||||||
		vcpu->mmio_needed = 0;
 | 
							vcpu->mmio_needed = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* FIXME: return into emulator if single-stepping.  */
 | 
							/* FIXME: return into emulator if single-stepping.  */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,6 +20,7 @@ config XTENSA
 | 
				
			||||||
	select HAVE_FUNCTION_TRACER
 | 
						select HAVE_FUNCTION_TRACER
 | 
				
			||||||
	select HAVE_IRQ_TIME_ACCOUNTING
 | 
						select HAVE_IRQ_TIME_ACCOUNTING
 | 
				
			||||||
	select HAVE_PERF_EVENTS
 | 
						select HAVE_PERF_EVENTS
 | 
				
			||||||
 | 
						select COMMON_CLK
 | 
				
			||||||
	help
 | 
						help
 | 
				
			||||||
	  Xtensa processors are 32-bit RISC machines designed by Tensilica
 | 
						  Xtensa processors are 32-bit RISC machines designed by Tensilica
 | 
				
			||||||
	  primarily for embedded systems.  These processors are both
 | 
						  primarily for embedded systems.  These processors are both
 | 
				
			||||||
| 
						 | 
					@ -80,7 +81,6 @@ choice
 | 
				
			||||||
config XTENSA_VARIANT_FSF
 | 
					config XTENSA_VARIANT_FSF
 | 
				
			||||||
	bool "fsf - default (not generic) configuration"
 | 
						bool "fsf - default (not generic) configuration"
 | 
				
			||||||
	select MMU
 | 
						select MMU
 | 
				
			||||||
	select HAVE_XTENSA_GPIO32
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
config XTENSA_VARIANT_DC232B
 | 
					config XTENSA_VARIANT_DC232B
 | 
				
			||||||
	bool "dc232b - Diamond 232L Standard Core Rev.B (LE)"
 | 
						bool "dc232b - Diamond 232L Standard Core Rev.B (LE)"
 | 
				
			||||||
| 
						 | 
					@ -135,7 +135,6 @@ config HAVE_SMP
 | 
				
			||||||
config SMP
 | 
					config SMP
 | 
				
			||||||
	bool "Enable Symmetric multi-processing support"
 | 
						bool "Enable Symmetric multi-processing support"
 | 
				
			||||||
	depends on HAVE_SMP
 | 
						depends on HAVE_SMP
 | 
				
			||||||
	select USE_GENERIC_SMP_HELPERS
 | 
					 | 
				
			||||||
	select GENERIC_SMP_IDLE_THREAD
 | 
						select GENERIC_SMP_IDLE_THREAD
 | 
				
			||||||
	help
 | 
						help
 | 
				
			||||||
	  Enabled SMP Software; allows more than one CPU/CORE
 | 
						  Enabled SMP Software; allows more than one CPU/CORE
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,6 +35,13 @@
 | 
				
			||||||
		interrupt-controller;
 | 
							interrupt-controller;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						clocks {
 | 
				
			||||||
 | 
							osc: main-oscillator {
 | 
				
			||||||
 | 
								#clock-cells = <0>;
 | 
				
			||||||
 | 
								compatible = "fixed-clock";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	serial0: serial@fd050020 {
 | 
						serial0: serial@fd050020 {
 | 
				
			||||||
		device_type = "serial";
 | 
							device_type = "serial";
 | 
				
			||||||
		compatible = "ns16550a";
 | 
							compatible = "ns16550a";
 | 
				
			||||||
| 
						 | 
					@ -42,9 +49,7 @@
 | 
				
			||||||
		reg = <0xfd050020 0x20>;
 | 
							reg = <0xfd050020 0x20>;
 | 
				
			||||||
		reg-shift = <2>;
 | 
							reg-shift = <2>;
 | 
				
			||||||
		interrupts = <0 1>; /* external irq 0 */
 | 
							interrupts = <0 1>; /* external irq 0 */
 | 
				
			||||||
		/* Filled in by platform_setup from FPGA register
 | 
							clocks = <&osc>;
 | 
				
			||||||
		 * clock-frequency = <100000000>;
 | 
					 | 
				
			||||||
		 */
 | 
					 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	enet0: ethoc@fd030000 {
 | 
						enet0: ethoc@fd030000 {
 | 
				
			||||||
| 
						 | 
					@ -52,5 +57,6 @@
 | 
				
			||||||
		reg = <0xfd030000 0x4000 0xfd800000 0x4000>;
 | 
							reg = <0xfd030000 0x4000 0xfd800000 0x4000>;
 | 
				
			||||||
		interrupts = <1 1>; /* external irq 1 */
 | 
							interrupts = <1 1>; /* external irq 1 */
 | 
				
			||||||
		local-mac-address = [00 50 c2 13 6f 00];
 | 
							local-mac-address = [00 50 c2 13 6f 00];
 | 
				
			||||||
 | 
							clocks = <&osc>;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_MMU
 | 
					#ifdef CONFIG_MMU
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && CONFIG_OF
 | 
					#if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && defined(CONFIG_OF)
 | 
				
			||||||
extern unsigned long xtensa_kio_paddr;
 | 
					extern unsigned long xtensa_kio_paddr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline unsigned long xtensa_get_kio_paddr(void)
 | 
					static inline unsigned long xtensa_get_kio_paddr(void)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,25 +23,37 @@ void secondary_trap_init(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void spill_registers(void)
 | 
					static inline void spill_registers(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					#if XCHAL_NUM_AREGS > 16
 | 
				
			||||||
	__asm__ __volatile__ (
 | 
						__asm__ __volatile__ (
 | 
				
			||||||
		"movi	a14, "__stringify((1 << PS_EXCM_BIT) | LOCKLEVEL)"\n\t"
 | 
							"	call12	1f\n"
 | 
				
			||||||
		"mov	a12, a0\n\t"
 | 
							"	_j	2f\n"
 | 
				
			||||||
		"rsr	a13, sar\n\t"
 | 
							"	retw\n"
 | 
				
			||||||
		"xsr	a14, ps\n\t"
 | 
							"	.align	4\n"
 | 
				
			||||||
		"movi	a0, _spill_registers\n\t"
 | 
							"1:\n"
 | 
				
			||||||
		"rsync\n\t"
 | 
							"	_entry	a1, 48\n"
 | 
				
			||||||
		"callx0 a0\n\t"
 | 
							"	addi	a12, a0, 3\n"
 | 
				
			||||||
		"mov	a0, a12\n\t"
 | 
					#if XCHAL_NUM_AREGS > 32
 | 
				
			||||||
		"wsr	a13, sar\n\t"
 | 
							"	.rept	(" __stringify(XCHAL_NUM_AREGS) " - 32) / 12\n"
 | 
				
			||||||
		"wsr	a14, ps\n\t"
 | 
							"	_entry	a1, 48\n"
 | 
				
			||||||
		: :
 | 
							"	mov	a12, a0\n"
 | 
				
			||||||
#if defined(CONFIG_FRAME_POINTER)
 | 
							"	.endr\n"
 | 
				
			||||||
		: "a2", "a3", "a4",       "a11", "a12", "a13", "a14", "a15",
 | 
					#endif
 | 
				
			||||||
#else
 | 
							"	_entry	a1, 48\n"
 | 
				
			||||||
		: "a2", "a3", "a4", "a7", "a11", "a12", "a13", "a14", "a15",
 | 
					#if XCHAL_NUM_AREGS % 12 == 0
 | 
				
			||||||
 | 
							"	mov	a8, a8\n"
 | 
				
			||||||
 | 
					#elif XCHAL_NUM_AREGS % 12 == 4
 | 
				
			||||||
 | 
							"	mov	a12, a12\n"
 | 
				
			||||||
 | 
					#elif XCHAL_NUM_AREGS % 12 == 8
 | 
				
			||||||
 | 
							"	mov	a4, a4\n"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
							"	retw\n"
 | 
				
			||||||
 | 
							"2:\n"
 | 
				
			||||||
 | 
							: : : "a12", "a13", "memory");
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						__asm__ __volatile__ (
 | 
				
			||||||
 | 
							"	mov	a12, a12\n"
 | 
				
			||||||
 | 
							: : : "memory");
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
		  "memory");
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* _XTENSA_TRAPS_H */
 | 
					#endif /* _XTENSA_TRAPS_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,7 @@
 | 
				
			||||||
#define XCHAL_KIO_DEFAULT_PADDR		0xf0000000
 | 
					#define XCHAL_KIO_DEFAULT_PADDR		0xf0000000
 | 
				
			||||||
#define XCHAL_KIO_SIZE			0x10000000
 | 
					#define XCHAL_KIO_SIZE			0x10000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && CONFIG_OF
 | 
					#if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && defined(CONFIG_OF)
 | 
				
			||||||
#define XCHAL_KIO_PADDR			xtensa_get_kio_paddr()
 | 
					#define XCHAL_KIO_PADDR			xtensa_get_kio_paddr()
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
#define XCHAL_KIO_PADDR			XCHAL_KIO_DEFAULT_PADDR
 | 
					#define XCHAL_KIO_PADDR			XCHAL_KIO_DEFAULT_PADDR
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -734,7 +734,12 @@ __SYSCALL(332, sys_finit_module, 3)
 | 
				
			||||||
#define __NR_accept4				333
 | 
					#define __NR_accept4				333
 | 
				
			||||||
__SYSCALL(333, sys_accept4, 4)
 | 
					__SYSCALL(333, sys_accept4, 4)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define __NR_syscall_count			334
 | 
					#define __NR_sched_setattr			334
 | 
				
			||||||
 | 
					__SYSCALL(334, sys_sched_setattr, 2)
 | 
				
			||||||
 | 
					#define __NR_sched_getattr			335
 | 
				
			||||||
 | 
					__SYSCALL(335, sys_sched_getattr, 3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define __NR_syscall_count			336
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * sysxtensa syscall handler
 | 
					 * sysxtensa syscall handler
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1081,34 +1081,202 @@ ENTRY(fast_syscall_spill_registers)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rsr	a0, sar
 | 
						rsr	a0, sar
 | 
				
			||||||
	s32i	a3, a2, PT_AREG3
 | 
						s32i	a3, a2, PT_AREG3
 | 
				
			||||||
 | 
						s32i	a0, a2, PT_SAR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* The spill routine might clobber a4, a7, a8, a11, a12, and a15. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	s32i	a4, a2, PT_AREG4
 | 
						s32i	a4, a2, PT_AREG4
 | 
				
			||||||
	s32i	a0, a2, PT_AREG5	# store SAR to PT_AREG5
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* The spill routine might clobber a7, a11, and a15. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	s32i	a7, a2, PT_AREG7
 | 
						s32i	a7, a2, PT_AREG7
 | 
				
			||||||
 | 
						s32i	a8, a2, PT_AREG8
 | 
				
			||||||
	s32i	a11, a2, PT_AREG11
 | 
						s32i	a11, a2, PT_AREG11
 | 
				
			||||||
 | 
						s32i	a12, a2, PT_AREG12
 | 
				
			||||||
	s32i	a15, a2, PT_AREG15
 | 
						s32i	a15, a2, PT_AREG15
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	call0	_spill_registers	# destroys a3, a4, and SAR
 | 
						/*
 | 
				
			||||||
 | 
						 * Rotate ws so that the current windowbase is at bit 0.
 | 
				
			||||||
 | 
						 * Assume ws = xxxwww1yy (www1 current window frame).
 | 
				
			||||||
 | 
						 * Rotate ws right so that a4 = yyxxxwww1.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rsr	a0, windowbase
 | 
				
			||||||
 | 
						rsr	a3, windowstart		# a3 = xxxwww1yy
 | 
				
			||||||
 | 
						ssr	a0			# holds WB
 | 
				
			||||||
 | 
						slli	a0, a3, WSBITS
 | 
				
			||||||
 | 
						or	a3, a3, a0		# a3 = xxxwww1yyxxxwww1yy
 | 
				
			||||||
 | 
						srl	a3, a3			# a3 = 00xxxwww1yyxxxwww1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* We are done if there are no more than the current register frame. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						extui	a3, a3, 1, WSBITS-1	# a3 = 0yyxxxwww
 | 
				
			||||||
 | 
						movi	a0, (1 << (WSBITS-1))
 | 
				
			||||||
 | 
						_beqz	a3, .Lnospill		# only one active frame? jump
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* We want 1 at the top, so that we return to the current windowbase */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						or	a3, a3, a0		# 1yyxxxwww
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Skip empty frames - get 'oldest' WINDOWSTART-bit. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wsr	a3, windowstart		# save shifted windowstart
 | 
				
			||||||
 | 
						neg	a0, a3
 | 
				
			||||||
 | 
						and	a3, a0, a3		# first bit set from right: 000010000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ffs_ws	a0, a3			# a0: shifts to skip empty frames
 | 
				
			||||||
 | 
						movi	a3, WSBITS
 | 
				
			||||||
 | 
						sub	a0, a3, a0		# WSBITS-a0:number of 0-bits from right
 | 
				
			||||||
 | 
						ssr	a0			# save in SAR for later.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rsr	a3, windowbase
 | 
				
			||||||
 | 
						add	a3, a3, a0
 | 
				
			||||||
 | 
						wsr	a3, windowbase
 | 
				
			||||||
 | 
						rsync
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rsr	a3, windowstart
 | 
				
			||||||
 | 
						srl	a3, a3			# shift windowstart
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* WB is now just one frame below the oldest frame in the register
 | 
				
			||||||
 | 
						   window. WS is shifted so the oldest frame is in bit 0, thus, WB
 | 
				
			||||||
 | 
						   and WS differ by one 4-register frame. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Save frames. Depending what call was used (call4, call8, call12),
 | 
				
			||||||
 | 
						 * we have to save 4,8. or 12 registers.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Lloop: _bbsi.l	a3, 1, .Lc4
 | 
				
			||||||
 | 
						_bbci.l	a3, 2, .Lc12
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Lc8:	s32e	a4, a13, -16
 | 
				
			||||||
 | 
						l32e	a4, a5, -12
 | 
				
			||||||
 | 
						s32e	a8, a4, -32
 | 
				
			||||||
 | 
						s32e	a5, a13, -12
 | 
				
			||||||
 | 
						s32e	a6, a13, -8
 | 
				
			||||||
 | 
						s32e	a7, a13, -4
 | 
				
			||||||
 | 
						s32e	a9, a4, -28
 | 
				
			||||||
 | 
						s32e	a10, a4, -24
 | 
				
			||||||
 | 
						s32e	a11, a4, -20
 | 
				
			||||||
 | 
						srli	a11, a3, 2		# shift windowbase by 2
 | 
				
			||||||
 | 
						rotw	2
 | 
				
			||||||
 | 
						_bnei	a3, 1, .Lloop
 | 
				
			||||||
 | 
						j	.Lexit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Lc4:	s32e	a4, a9, -16
 | 
				
			||||||
 | 
						s32e	a5, a9, -12
 | 
				
			||||||
 | 
						s32e	a6, a9, -8
 | 
				
			||||||
 | 
						s32e	a7, a9, -4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						srli	a7, a3, 1
 | 
				
			||||||
 | 
						rotw	1
 | 
				
			||||||
 | 
						_bnei	a3, 1, .Lloop
 | 
				
			||||||
 | 
						j	.Lexit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Lc12:	_bbci.l	a3, 3, .Linvalid_mask	# bit 2 shouldn't be zero!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* 12-register frame (call12) */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						l32e	a0, a5, -12
 | 
				
			||||||
 | 
						s32e	a8, a0, -48
 | 
				
			||||||
 | 
						mov	a8, a0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						s32e	a9, a8, -44
 | 
				
			||||||
 | 
						s32e	a10, a8, -40
 | 
				
			||||||
 | 
						s32e	a11, a8, -36
 | 
				
			||||||
 | 
						s32e	a12, a8, -32
 | 
				
			||||||
 | 
						s32e	a13, a8, -28
 | 
				
			||||||
 | 
						s32e	a14, a8, -24
 | 
				
			||||||
 | 
						s32e	a15, a8, -20
 | 
				
			||||||
 | 
						srli	a15, a3, 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* The stack pointer for a4..a7 is out of reach, so we rotate the
 | 
				
			||||||
 | 
						 * window, grab the stackpointer, and rotate back.
 | 
				
			||||||
 | 
						 * Alternatively, we could also use the following approach, but that
 | 
				
			||||||
 | 
						 * makes the fixup routine much more complicated:
 | 
				
			||||||
 | 
						 * rotw	1
 | 
				
			||||||
 | 
						 * s32e	a0, a13, -16
 | 
				
			||||||
 | 
						 * ...
 | 
				
			||||||
 | 
						 * rotw 2
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rotw	1
 | 
				
			||||||
 | 
						mov	a4, a13
 | 
				
			||||||
 | 
						rotw	-1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						s32e	a4, a8, -16
 | 
				
			||||||
 | 
						s32e	a5, a8, -12
 | 
				
			||||||
 | 
						s32e	a6, a8, -8
 | 
				
			||||||
 | 
						s32e	a7, a8, -4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rotw	3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_beqi	a3, 1, .Lexit
 | 
				
			||||||
 | 
						j	.Lloop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Lexit:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Done. Do the final rotation and set WS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rotw	1
 | 
				
			||||||
 | 
						rsr	a3, windowbase
 | 
				
			||||||
 | 
						ssl	a3
 | 
				
			||||||
 | 
						movi	a3, 1
 | 
				
			||||||
 | 
						sll	a3, a3
 | 
				
			||||||
 | 
						wsr	a3, windowstart
 | 
				
			||||||
 | 
					.Lnospill:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Advance PC, restore registers and SAR, and return from exception. */
 | 
						/* Advance PC, restore registers and SAR, and return from exception. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	l32i	a3, a2, PT_AREG5
 | 
						l32i	a3, a2, PT_SAR
 | 
				
			||||||
	l32i	a4, a2, PT_AREG4
 | 
					 | 
				
			||||||
	l32i	a0, a2, PT_AREG0
 | 
						l32i	a0, a2, PT_AREG0
 | 
				
			||||||
	wsr	a3, sar
 | 
						wsr	a3, sar
 | 
				
			||||||
	l32i	a3, a2, PT_AREG3
 | 
						l32i	a3, a2, PT_AREG3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Restore clobbered registers. */
 | 
						/* Restore clobbered registers. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						l32i	a4, a2, PT_AREG4
 | 
				
			||||||
	l32i	a7, a2, PT_AREG7
 | 
						l32i	a7, a2, PT_AREG7
 | 
				
			||||||
 | 
						l32i	a8, a2, PT_AREG8
 | 
				
			||||||
	l32i	a11, a2, PT_AREG11
 | 
						l32i	a11, a2, PT_AREG11
 | 
				
			||||||
 | 
						l32i	a12, a2, PT_AREG12
 | 
				
			||||||
	l32i	a15, a2, PT_AREG15
 | 
						l32i	a15, a2, PT_AREG15
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	movi	a2, 0
 | 
						movi	a2, 0
 | 
				
			||||||
	rfe
 | 
						rfe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.Linvalid_mask:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* We get here because of an unrecoverable error in the window
 | 
				
			||||||
 | 
						 * registers, so set up a dummy frame and kill the user application.
 | 
				
			||||||
 | 
						 * Note: We assume EXC_TABLE_KSTK contains a valid stack pointer.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						movi	a0, 1
 | 
				
			||||||
 | 
						movi	a1, 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wsr	a0, windowstart
 | 
				
			||||||
 | 
						wsr	a1, windowbase
 | 
				
			||||||
 | 
						rsync
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						movi	a0, 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rsr	a3, excsave1
 | 
				
			||||||
 | 
						l32i	a1, a3, EXC_TABLE_KSTK
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						movi	a4, (1 << PS_WOE_BIT) | LOCKLEVEL
 | 
				
			||||||
 | 
						wsr	a4, ps
 | 
				
			||||||
 | 
						rsync
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						movi	a6, SIGSEGV
 | 
				
			||||||
 | 
						movi	a4, do_exit
 | 
				
			||||||
 | 
						callx4	a4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* shouldn't return, so panic */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wsr	a0, excsave1
 | 
				
			||||||
 | 
						movi	a0, unrecoverable_exception
 | 
				
			||||||
 | 
						callx0	a0		# should not return
 | 
				
			||||||
 | 
					1:	j	1b
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENDPROC(fast_syscall_spill_registers)
 | 
					ENDPROC(fast_syscall_spill_registers)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Fixup handler.
 | 
					/* Fixup handler.
 | 
				
			||||||
| 
						 | 
					@ -1117,6 +1285,13 @@ ENDPROC(fast_syscall_spill_registers)
 | 
				
			||||||
 * We basically restore WINDOWBASE and WINDOWSTART to the condition when
 | 
					 * We basically restore WINDOWBASE and WINDOWSTART to the condition when
 | 
				
			||||||
 * we entered the spill routine and jump to the user exception handler.
 | 
					 * we entered the spill routine and jump to the user exception handler.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 | 
					 * Note that we only need to restore the bits in windowstart that have not
 | 
				
			||||||
 | 
					 * been spilled yet by the _spill_register routine. Luckily, a3 contains a
 | 
				
			||||||
 | 
					 * rotated windowstart with only those bits set for frames that haven't been
 | 
				
			||||||
 | 
					 * spilled yet. Because a3 is rotated such that bit 0 represents the register
 | 
				
			||||||
 | 
					 * frame for the current windowbase - 1, we need to rotate a3 left by the
 | 
				
			||||||
 | 
					 * value of the current windowbase + 1 and move it to windowstart.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 * a0: value of depc, original value in depc
 | 
					 * a0: value of depc, original value in depc
 | 
				
			||||||
 * a2: trashed, original value in EXC_TABLE_DOUBLE_SAVE
 | 
					 * a2: trashed, original value in EXC_TABLE_DOUBLE_SAVE
 | 
				
			||||||
 * a3: exctable, original value in excsave1
 | 
					 * a3: exctable, original value in excsave1
 | 
				
			||||||
| 
						 | 
					@ -1131,10 +1306,15 @@ ENTRY(fast_syscall_spill_registers_fixup)
 | 
				
			||||||
	/* We need to make sure the current registers (a0-a3) are preserved.
 | 
						/* We need to make sure the current registers (a0-a3) are preserved.
 | 
				
			||||||
	 * To do this, we simply set the bit for the current window frame
 | 
						 * To do this, we simply set the bit for the current window frame
 | 
				
			||||||
	 * in WS, so that the exception handlers save them to the task stack.
 | 
						 * in WS, so that the exception handlers save them to the task stack.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * Note: we use a3 to set the windowbase, so we take a special care
 | 
				
			||||||
 | 
						 * of it, saving it in the original _spill_registers frame across
 | 
				
			||||||
 | 
						 * the exception handler call.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	xsr	a3, excsave1	# get spill-mask
 | 
						xsr	a3, excsave1	# get spill-mask
 | 
				
			||||||
	slli	a3, a3, 1	# shift left by one
 | 
						slli	a3, a3, 1	# shift left by one
 | 
				
			||||||
 | 
						addi	a3, a3, 1	# set the bit for the current window frame
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	slli	a2, a3, 32-WSBITS
 | 
						slli	a2, a3, 32-WSBITS
 | 
				
			||||||
	src	a2, a3, a2	# a2 = xxwww1yyxxxwww1yy......
 | 
						src	a2, a3, a2	# a2 = xxwww1yyxxxwww1yy......
 | 
				
			||||||
| 
						 | 
					@ -1220,209 +1400,6 @@ ENTRY(fast_syscall_spill_registers_fixup_return)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENDPROC(fast_syscall_spill_registers_fixup_return)
 | 
					ENDPROC(fast_syscall_spill_registers_fixup_return)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * spill all registers.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This is not a real function. The following conditions must be met:
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *  - must be called with call0.
 | 
					 | 
				
			||||||
 *  - uses a3, a4 and SAR.
 | 
					 | 
				
			||||||
 *  - the last 'valid' register of each frame are clobbered.
 | 
					 | 
				
			||||||
 *  - the caller must have registered a fixup handler
 | 
					 | 
				
			||||||
 *    (or be inside a critical section)
 | 
					 | 
				
			||||||
 *  - PS_EXCM must be set (PS_WOE cleared?)
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ENTRY(_spill_registers)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	 * Rotate ws so that the current windowbase is at bit 0.
 | 
					 | 
				
			||||||
	 * Assume ws = xxxwww1yy (www1 current window frame).
 | 
					 | 
				
			||||||
	 * Rotate ws right so that a4 = yyxxxwww1.
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	rsr	a4, windowbase
 | 
					 | 
				
			||||||
	rsr	a3, windowstart		# a3 = xxxwww1yy
 | 
					 | 
				
			||||||
	ssr	a4			# holds WB
 | 
					 | 
				
			||||||
	slli	a4, a3, WSBITS
 | 
					 | 
				
			||||||
	or	a3, a3, a4		# a3 = xxxwww1yyxxxwww1yy
 | 
					 | 
				
			||||||
	srl	a3, a3			# a3 = 00xxxwww1yyxxxwww1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* We are done if there are no more than the current register frame. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	extui	a3, a3, 1, WSBITS-1	# a3 = 0yyxxxwww
 | 
					 | 
				
			||||||
	movi	a4, (1 << (WSBITS-1))
 | 
					 | 
				
			||||||
	_beqz	a3, .Lnospill		# only one active frame? jump
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* We want 1 at the top, so that we return to the current windowbase */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	or	a3, a3, a4		# 1yyxxxwww
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Skip empty frames - get 'oldest' WINDOWSTART-bit. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	wsr	a3, windowstart		# save shifted windowstart
 | 
					 | 
				
			||||||
	neg	a4, a3
 | 
					 | 
				
			||||||
	and	a3, a4, a3		# first bit set from right: 000010000
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ffs_ws	a4, a3			# a4: shifts to skip empty frames
 | 
					 | 
				
			||||||
	movi	a3, WSBITS
 | 
					 | 
				
			||||||
	sub	a4, a3, a4		# WSBITS-a4:number of 0-bits from right
 | 
					 | 
				
			||||||
	ssr	a4			# save in SAR for later.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	rsr	a3, windowbase
 | 
					 | 
				
			||||||
	add	a3, a3, a4
 | 
					 | 
				
			||||||
	wsr	a3, windowbase
 | 
					 | 
				
			||||||
	rsync
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	rsr	a3, windowstart
 | 
					 | 
				
			||||||
	srl	a3, a3			# shift windowstart
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* WB is now just one frame below the oldest frame in the register
 | 
					 | 
				
			||||||
	   window. WS is shifted so the oldest frame is in bit 0, thus, WB
 | 
					 | 
				
			||||||
	   and WS differ by one 4-register frame. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Save frames. Depending what call was used (call4, call8, call12),
 | 
					 | 
				
			||||||
	 * we have to save 4,8. or 12 registers.
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	_bbsi.l	a3, 1, .Lc4
 | 
					 | 
				
			||||||
	_bbsi.l	a3, 2, .Lc8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Special case: we have a call12-frame starting at a4. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	_bbci.l	a3, 3, .Lc12	# bit 3 shouldn't be zero! (Jump to Lc12 first)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	s32e	a4, a1, -16	# a1 is valid with an empty spill area
 | 
					 | 
				
			||||||
	l32e	a4, a5, -12
 | 
					 | 
				
			||||||
	s32e	a8, a4, -48
 | 
					 | 
				
			||||||
	mov	a8, a4
 | 
					 | 
				
			||||||
	l32e	a4, a1, -16
 | 
					 | 
				
			||||||
	j	.Lc12c
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.Lnospill:
 | 
					 | 
				
			||||||
	ret
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.Lloop: _bbsi.l	a3, 1, .Lc4
 | 
					 | 
				
			||||||
	_bbci.l	a3, 2, .Lc12
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.Lc8:	s32e	a4, a13, -16
 | 
					 | 
				
			||||||
	l32e	a4, a5, -12
 | 
					 | 
				
			||||||
	s32e	a8, a4, -32
 | 
					 | 
				
			||||||
	s32e	a5, a13, -12
 | 
					 | 
				
			||||||
	s32e	a6, a13, -8
 | 
					 | 
				
			||||||
	s32e	a7, a13, -4
 | 
					 | 
				
			||||||
	s32e	a9, a4, -28
 | 
					 | 
				
			||||||
	s32e	a10, a4, -24
 | 
					 | 
				
			||||||
	s32e	a11, a4, -20
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	srli	a11, a3, 2		# shift windowbase by 2
 | 
					 | 
				
			||||||
	rotw	2
 | 
					 | 
				
			||||||
	_bnei	a3, 1, .Lloop
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.Lexit: /* Done. Do the final rotation, set WS, and return. */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	rotw	1
 | 
					 | 
				
			||||||
	rsr	a3, windowbase
 | 
					 | 
				
			||||||
	ssl	a3
 | 
					 | 
				
			||||||
	movi	a3, 1
 | 
					 | 
				
			||||||
	sll	a3, a3
 | 
					 | 
				
			||||||
	wsr	a3, windowstart
 | 
					 | 
				
			||||||
	ret
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.Lc4:	s32e	a4, a9, -16
 | 
					 | 
				
			||||||
	s32e	a5, a9, -12
 | 
					 | 
				
			||||||
	s32e	a6, a9, -8
 | 
					 | 
				
			||||||
	s32e	a7, a9, -4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	srli	a7, a3, 1
 | 
					 | 
				
			||||||
	rotw	1
 | 
					 | 
				
			||||||
	_bnei	a3, 1, .Lloop
 | 
					 | 
				
			||||||
	j	.Lexit
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.Lc12:	_bbci.l	a3, 3, .Linvalid_mask	# bit 2 shouldn't be zero!
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* 12-register frame (call12) */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	l32e	a2, a5, -12
 | 
					 | 
				
			||||||
	s32e	a8, a2, -48
 | 
					 | 
				
			||||||
	mov	a8, a2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.Lc12c: s32e	a9, a8, -44
 | 
					 | 
				
			||||||
	s32e	a10, a8, -40
 | 
					 | 
				
			||||||
	s32e	a11, a8, -36
 | 
					 | 
				
			||||||
	s32e	a12, a8, -32
 | 
					 | 
				
			||||||
	s32e	a13, a8, -28
 | 
					 | 
				
			||||||
	s32e	a14, a8, -24
 | 
					 | 
				
			||||||
	s32e	a15, a8, -20
 | 
					 | 
				
			||||||
	srli	a15, a3, 3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* The stack pointer for a4..a7 is out of reach, so we rotate the
 | 
					 | 
				
			||||||
	 * window, grab the stackpointer, and rotate back.
 | 
					 | 
				
			||||||
	 * Alternatively, we could also use the following approach, but that
 | 
					 | 
				
			||||||
	 * makes the fixup routine much more complicated:
 | 
					 | 
				
			||||||
	 * rotw	1
 | 
					 | 
				
			||||||
	 * s32e	a0, a13, -16
 | 
					 | 
				
			||||||
	 * ...
 | 
					 | 
				
			||||||
	 * rotw 2
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	rotw	1
 | 
					 | 
				
			||||||
	mov	a5, a13
 | 
					 | 
				
			||||||
	rotw	-1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	s32e	a4, a9, -16
 | 
					 | 
				
			||||||
	s32e	a5, a9, -12
 | 
					 | 
				
			||||||
	s32e	a6, a9, -8
 | 
					 | 
				
			||||||
	s32e	a7, a9, -4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	rotw	3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	_beqi	a3, 1, .Lexit
 | 
					 | 
				
			||||||
	j	.Lloop
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.Linvalid_mask:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* We get here because of an unrecoverable error in the window
 | 
					 | 
				
			||||||
	 * registers. If we are in user space, we kill the application,
 | 
					 | 
				
			||||||
	 * however, this condition is unrecoverable in kernel space.
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	rsr	a0, ps
 | 
					 | 
				
			||||||
	_bbci.l	a0, PS_UM_BIT, 1f
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* User space: Setup a dummy frame and kill application.
 | 
					 | 
				
			||||||
	 * Note: We assume EXC_TABLE_KSTK contains a valid stack pointer.
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	movi	a0, 1
 | 
					 | 
				
			||||||
	movi	a1, 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	wsr	a0, windowstart
 | 
					 | 
				
			||||||
	wsr	a1, windowbase
 | 
					 | 
				
			||||||
	rsync
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	movi	a0, 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	rsr	a3, excsave1
 | 
					 | 
				
			||||||
	l32i	a1, a3, EXC_TABLE_KSTK
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	movi	a4, (1 << PS_WOE_BIT) | LOCKLEVEL
 | 
					 | 
				
			||||||
	wsr	a4, ps
 | 
					 | 
				
			||||||
	rsync
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	movi	a6, SIGSEGV
 | 
					 | 
				
			||||||
	movi	a4, do_exit
 | 
					 | 
				
			||||||
	callx4	a4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
1:	/* Kernel space: PANIC! */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	wsr	a0, excsave1
 | 
					 | 
				
			||||||
	movi	a0, unrecoverable_exception
 | 
					 | 
				
			||||||
	callx0	a0		# should not return
 | 
					 | 
				
			||||||
1:	j	1b
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ENDPROC(_spill_registers)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef CONFIG_MMU
 | 
					#ifdef CONFIG_MMU
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * We should never get here. Bail out!
 | 
					 * We should never get here. Bail out!
 | 
				
			||||||
| 
						 | 
					@ -1794,6 +1771,43 @@ ENTRY(system_call)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENDPROC(system_call)
 | 
					ENDPROC(system_call)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Spill live registers on the kernel stack macro.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Entry condition: ps.woe is set, ps.excm is cleared
 | 
				
			||||||
 | 
					 * Exit condition: windowstart has single bit set
 | 
				
			||||||
 | 
					 * May clobber: a12, a13
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
						.macro	spill_registers_kernel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if XCHAL_NUM_AREGS > 16
 | 
				
			||||||
 | 
						call12	1f
 | 
				
			||||||
 | 
						_j	2f
 | 
				
			||||||
 | 
						retw
 | 
				
			||||||
 | 
						.align	4
 | 
				
			||||||
 | 
					1:
 | 
				
			||||||
 | 
						_entry	a1, 48
 | 
				
			||||||
 | 
						addi	a12, a0, 3
 | 
				
			||||||
 | 
					#if XCHAL_NUM_AREGS > 32
 | 
				
			||||||
 | 
						.rept	(XCHAL_NUM_AREGS - 32) / 12
 | 
				
			||||||
 | 
						_entry	a1, 48
 | 
				
			||||||
 | 
						mov	a12, a0
 | 
				
			||||||
 | 
						.endr
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						_entry	a1, 48
 | 
				
			||||||
 | 
					#if XCHAL_NUM_AREGS % 12 == 0
 | 
				
			||||||
 | 
						mov	a8, a8
 | 
				
			||||||
 | 
					#elif XCHAL_NUM_AREGS % 12 == 4
 | 
				
			||||||
 | 
						mov	a12, a12
 | 
				
			||||||
 | 
					#elif XCHAL_NUM_AREGS % 12 == 8
 | 
				
			||||||
 | 
						mov	a4, a4
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						retw
 | 
				
			||||||
 | 
					2:
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						mov	a12, a12
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						.endm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Task switch.
 | 
					 * Task switch.
 | 
				
			||||||
| 
						 | 
					@ -1806,21 +1820,20 @@ ENTRY(_switch_to)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	entry	a1, 16
 | 
						entry	a1, 16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mov	a12, a2			# preserve 'prev' (a2)
 | 
						mov	a10, a2			# preserve 'prev' (a2)
 | 
				
			||||||
	mov	a13, a3			# and 'next' (a3)
 | 
						mov	a11, a3			# and 'next' (a3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	l32i	a4, a2, TASK_THREAD_INFO
 | 
						l32i	a4, a2, TASK_THREAD_INFO
 | 
				
			||||||
	l32i	a5, a3, TASK_THREAD_INFO
 | 
						l32i	a5, a3, TASK_THREAD_INFO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	save_xtregs_user a4 a6 a8 a9 a10 a11 THREAD_XTREGS_USER
 | 
						save_xtregs_user a4 a6 a8 a9 a12 a13 THREAD_XTREGS_USER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	s32i	a0, a12, THREAD_RA	# save return address
 | 
						s32i	a0, a10, THREAD_RA	# save return address
 | 
				
			||||||
	s32i	a1, a12, THREAD_SP	# save stack pointer
 | 
						s32i	a1, a10, THREAD_SP	# save stack pointer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Disable ints while we manipulate the stack pointer. */
 | 
						/* Disable ints while we manipulate the stack pointer. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	movi	a14, (1 << PS_EXCM_BIT) | LOCKLEVEL
 | 
						rsil	a14, LOCKLEVEL
 | 
				
			||||||
	xsr	a14, ps
 | 
					 | 
				
			||||||
	rsr	a3, excsave1
 | 
						rsr	a3, excsave1
 | 
				
			||||||
	rsync
 | 
						rsync
 | 
				
			||||||
	s32i	a3, a3, EXC_TABLE_FIXUP	/* enter critical section */
 | 
						s32i	a3, a3, EXC_TABLE_FIXUP	/* enter critical section */
 | 
				
			||||||
| 
						 | 
					@ -1835,7 +1848,7 @@ ENTRY(_switch_to)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Flush register file. */
 | 
						/* Flush register file. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	call0	_spill_registers	# destroys a3, a4, and SAR
 | 
						spill_registers_kernel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Set kernel stack (and leave critical section)
 | 
						/* Set kernel stack (and leave critical section)
 | 
				
			||||||
	 * Note: It's save to set it here. The stack will not be overwritten
 | 
						 * Note: It's save to set it here. The stack will not be overwritten
 | 
				
			||||||
| 
						 | 
					@ -1851,13 +1864,13 @@ ENTRY(_switch_to)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* restore context of the task 'next' */
 | 
						/* restore context of the task 'next' */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	l32i	a0, a13, THREAD_RA	# restore return address
 | 
						l32i	a0, a11, THREAD_RA	# restore return address
 | 
				
			||||||
	l32i	a1, a13, THREAD_SP	# restore stack pointer
 | 
						l32i	a1, a11, THREAD_SP	# restore stack pointer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	load_xtregs_user a5 a6 a8 a9 a10 a11 THREAD_XTREGS_USER
 | 
						load_xtregs_user a5 a6 a8 a9 a12 a13 THREAD_XTREGS_USER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wsr	a14, ps
 | 
						wsr	a14, ps
 | 
				
			||||||
	mov	a2, a12			# return 'prev'
 | 
						mov	a2, a10			# return 'prev'
 | 
				
			||||||
	rsync
 | 
						rsync
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	retw
 | 
						retw
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,6 +22,7 @@
 | 
				
			||||||
#include <linux/bootmem.h>
 | 
					#include <linux/bootmem.h>
 | 
				
			||||||
#include <linux/kernel.h>
 | 
					#include <linux/kernel.h>
 | 
				
			||||||
#include <linux/percpu.h>
 | 
					#include <linux/percpu.h>
 | 
				
			||||||
 | 
					#include <linux/clk-provider.h>
 | 
				
			||||||
#include <linux/cpu.h>
 | 
					#include <linux/cpu.h>
 | 
				
			||||||
#include <linux/of_fdt.h>
 | 
					#include <linux/of_fdt.h>
 | 
				
			||||||
#include <linux/of_platform.h>
 | 
					#include <linux/of_platform.h>
 | 
				
			||||||
| 
						 | 
					@ -276,6 +277,7 @@ void __init early_init_devtree(void *params)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int __init xtensa_device_probe(void)
 | 
					static int __init xtensa_device_probe(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						of_clk_init(NULL);
 | 
				
			||||||
	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
 | 
						of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,6 +30,7 @@
 | 
				
			||||||
#include <asm/platform.h>
 | 
					#include <asm/platform.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned long ccount_freq;		/* ccount Hz */
 | 
					unsigned long ccount_freq;		/* ccount Hz */
 | 
				
			||||||
 | 
					EXPORT_SYMBOL(ccount_freq);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static cycle_t ccount_read(struct clocksource *cs)
 | 
					static cycle_t ccount_read(struct clocksource *cs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -235,7 +235,7 @@ ENTRY(_DoubleExceptionVector)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Check for overflow/underflow exception, jump if overflow. */
 | 
						/* Check for overflow/underflow exception, jump if overflow. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_bbci.l	a0, 6, _DoubleExceptionVector_WindowOverflow
 | 
						bbci.l	a0, 6, _DoubleExceptionVector_WindowOverflow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Restart window underflow exception.
 | 
						 * Restart window underflow exception.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -122,9 +122,7 @@ EXPORT_SYMBOL(insw);
 | 
				
			||||||
EXPORT_SYMBOL(insl);
 | 
					EXPORT_SYMBOL(insl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern long common_exception_return;
 | 
					extern long common_exception_return;
 | 
				
			||||||
extern long _spill_registers;
 | 
					 | 
				
			||||||
EXPORT_SYMBOL(common_exception_return);
 | 
					EXPORT_SYMBOL(common_exception_return);
 | 
				
			||||||
EXPORT_SYMBOL(_spill_registers);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_FUNCTION_TRACER
 | 
					#ifdef CONFIG_FUNCTION_TRACER
 | 
				
			||||||
EXPORT_SYMBOL(_mcount);
 | 
					EXPORT_SYMBOL(_mcount);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -90,7 +90,7 @@ int __init mem_reserve(unsigned long start, unsigned long end, int must_exist)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Initialize the bootmem system and give it all the memory we have available.
 | 
					 * Initialize the bootmem system and give it all low memory we have available.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void __init bootmem_init(void)
 | 
					void __init bootmem_init(void)
 | 
				
			||||||
| 
						 | 
					@ -142,9 +142,14 @@ void __init bootmem_init(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Add all remaining memory pieces into the bootmem map */
 | 
						/* Add all remaining memory pieces into the bootmem map */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i=0; i<sysmem.nr_banks; i++)
 | 
						for (i = 0; i < sysmem.nr_banks; i++) {
 | 
				
			||||||
 | 
							if (sysmem.bank[i].start >> PAGE_SHIFT < max_low_pfn) {
 | 
				
			||||||
 | 
								unsigned long end = min(max_low_pfn << PAGE_SHIFT,
 | 
				
			||||||
 | 
											sysmem.bank[i].end);
 | 
				
			||||||
			free_bootmem(sysmem.bank[i].start,
 | 
								free_bootmem(sysmem.bank[i].start,
 | 
				
			||||||
			     sysmem.bank[i].end - sysmem.bank[i].start);
 | 
									     end - sysmem.bank[i].start);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue