Merge remote-tracking branch 'scottwood/next' into next
Scott says: "Highlights include a bunch of 8xx optimizations, device tree bindings for Freescale BMan, QMan, and FMan datapath components, misc device tree updates, and inbound rio window support."
This commit is contained in:
		
						commit
						35891d40bf
					
				| @ -62,6 +62,8 @@ Required properties: | ||||
| 		It takes parent's clock-frequency as its clock. | ||||
| 	* "fsl,qoriq-sysclk-2.0": for input system clock (v2.0). | ||||
| 		It takes parent's clock-frequency as its clock. | ||||
| 	* "fsl,qoriq-platform-pll-1.0" for the platform PLL clock (v1.0) | ||||
| 	* "fsl,qoriq-platform-pll-2.0" for the platform PLL clock (v2.0) | ||||
| - #clock-cells: From common clock binding. The number of cells in a | ||||
| 	clock-specifier. Should be <0> for "fsl,qoriq-sysclk-[1,2].0" | ||||
| 	clocks, or <1> for "fsl,qoriq-core-pll-[1,2].0" clocks. | ||||
| @ -128,8 +130,16 @@ Example for clock block and clock provider: | ||||
| 			clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2"; | ||||
| 			clock-output-names = "cmux1"; | ||||
| 		}; | ||||
| 
 | ||||
| 		platform-pll: platform-pll@c00 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0xc00 0x4>; | ||||
| 			compatible = "fsl,qoriq-platform-pll-1.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "platform-pll", "platform-pll-div2"; | ||||
| 		}; | ||||
| 	}; | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| Example for clock consumer: | ||||
| 
 | ||||
| @ -139,4 +149,4 @@ Example for clock consumer: | ||||
| 		clocks = <&mux0>; | ||||
| 		... | ||||
| 	}; | ||||
|   } | ||||
| }; | ||||
|  | ||||
							
								
								
									
										534
									
								
								Documentation/devicetree/bindings/powerpc/fsl/fman.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										534
									
								
								Documentation/devicetree/bindings/powerpc/fsl/fman.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,534 @@ | ||||
| ============================================================================= | ||||
| Freescale Frame Manager Device Bindings | ||||
| 
 | ||||
| CONTENTS | ||||
|   - FMan Node | ||||
|   - FMan Port Node | ||||
|   - FMan MURAM Node | ||||
|   - FMan dTSEC/XGEC/mEMAC Node | ||||
|   - FMan IEEE 1588 Node | ||||
|   - Example | ||||
| 
 | ||||
| ============================================================================= | ||||
| FMan Node | ||||
| 
 | ||||
| DESCRIPTION | ||||
| 
 | ||||
| Due to the fact that the FMan is an aggregation of sub-engines (ports, MACs, | ||||
| etc.) the FMan node will have child nodes for each of them. | ||||
| 
 | ||||
| PROPERTIES | ||||
| 
 | ||||
| - compatible | ||||
| 		Usage: required | ||||
| 		Value type: <stringlist> | ||||
| 		Definition: Must include "fsl,fman" | ||||
| 		FMan version can be determined via FM_IP_REV_1 register in the | ||||
| 		FMan block. The offset is 0xc4 from the beginning of the | ||||
| 		Frame Processing Manager memory map (0xc3000 from the | ||||
| 		beginning of the FMan node). | ||||
| 
 | ||||
| - cell-index | ||||
| 		Usage: required | ||||
| 		Value type: <u32> | ||||
| 		Definition: Specifies the index of the FMan unit. | ||||
| 
 | ||||
| 		The cell-index value may be used by the SoC, to identify the | ||||
| 		FMan unit in the SoC memory map. In the table bellow, | ||||
| 		there's a description of the cell-index use in each SoC: | ||||
| 
 | ||||
| 		- P1023: | ||||
| 		register[bit]			FMan unit	cell-index | ||||
| 		============================================================ | ||||
| 		DEVDISR[1]			1		0 | ||||
| 
 | ||||
| 		- P2041, P3041, P4080 P5020, P5040: | ||||
| 		register[bit]			FMan unit	cell-index | ||||
| 		============================================================ | ||||
| 		DCFG_DEVDISR2[6]		1		0 | ||||
| 		DCFG_DEVDISR2[14]		2		1 | ||||
| 			(Second FM available only in P4080 and P5040) | ||||
| 
 | ||||
| 		- B4860, T1040, T2080, T4240: | ||||
| 		register[bit]			FMan unit	cell-index | ||||
| 		============================================================ | ||||
| 		DCFG_CCSR_DEVDISR2[24]		1		0 | ||||
| 		DCFG_CCSR_DEVDISR2[25]		2		1 | ||||
| 			(Second FM available only in T4240) | ||||
| 
 | ||||
| 		DEVDISR, DCFG_DEVDISR2 and DCFG_CCSR_DEVDISR2 are located in | ||||
| 		the specific SoC "Device Configuration/Pin Control" Memory | ||||
| 		Map. | ||||
| 
 | ||||
| - reg | ||||
| 		Usage: required | ||||
| 		Value type: <prop-encoded-array> | ||||
| 		Definition: A standard property. Specifies the offset of the | ||||
| 		following configuration registers: | ||||
| 		- BMI configuration registers. | ||||
| 		- QMI configuration registers. | ||||
| 		- DMA configuration registers. | ||||
| 		- FPM configuration registers. | ||||
| 		- FMan controller configuration registers. | ||||
| 
 | ||||
| - ranges | ||||
| 		Usage: required | ||||
| 		Value type: <prop-encoded-array> | ||||
| 		Definition: A standard property. | ||||
| 
 | ||||
| - clocks | ||||
| 		Usage: required | ||||
| 		Value type: <prop-encoded-array> | ||||
| 		Definition: phandle for the fman input clock. | ||||
| 
 | ||||
| - clock-names | ||||
| 		usage: required | ||||
| 		Value type: <stringlist> | ||||
| 		Definition: "fmanclk" for the fman input clock. | ||||
| 
 | ||||
| - interrupts | ||||
| 		Usage: required | ||||
| 		Value type: <prop-encoded-array> | ||||
| 		Definition: A pair of IRQs are specified in this property. | ||||
| 		The first element is associated with the event interrupts and | ||||
| 		the second element is associated with the error interrupts. | ||||
| 
 | ||||
| - fsl,qman-channel-range | ||||
| 		Usage: required | ||||
| 		Value type: <prop-encoded-array> | ||||
| 		Definition: Specifies the range of the available dedicated | ||||
| 		channels in the FMan. The first cell specifies the beginning | ||||
| 		of the range and the second cell specifies the number of | ||||
| 		channels. | ||||
| 		Further information available at: | ||||
| 		"Work Queue (WQ) Channel Assignments in the QMan" section | ||||
| 		in DPAA Reference Manual. | ||||
| 
 | ||||
| - fsl,qman | ||||
| - fsl,bman | ||||
| 		Usage: required | ||||
| 		Definition: See soc/fsl/qman.txt and soc/fsl/bman.txt | ||||
| 
 | ||||
| ============================================================================= | ||||
| FMan MURAM Node | ||||
| 
 | ||||
| DESCRIPTION | ||||
| 
 | ||||
| FMan Internal memory - shared between all the FMan modules. | ||||
| It contains data structures that are common and written to or read by | ||||
| the modules. | ||||
| FMan internal memory is split into the following parts: | ||||
| 	Packet buffering (Tx/Rx FIFOs) | ||||
| 	Frames internal context | ||||
| 
 | ||||
| PROPERTIES | ||||
| 
 | ||||
| - compatible | ||||
| 		Usage: required | ||||
| 		Value type: <stringlist> | ||||
| 		Definition: Must include "fsl,fman-muram" | ||||
| 
 | ||||
| - ranges | ||||
| 		Usage: required | ||||
| 		Value type: <prop-encoded-array> | ||||
| 		Definition: A standard property. | ||||
| 		Specifies the multi-user memory offset and the size within | ||||
| 		the FMan. | ||||
| 
 | ||||
| EXAMPLE | ||||
| 
 | ||||
| muram@0 { | ||||
| 	compatible = "fsl,fman-muram"; | ||||
| 	ranges = <0 0x000000 0x28000>; | ||||
| }; | ||||
| 
 | ||||
| ============================================================================= | ||||
| FMan Port Node | ||||
| 
 | ||||
| DESCRIPTION | ||||
| 
 | ||||
| The Frame Manager (FMan) supports several types of hardware ports: | ||||
| 	Ethernet receiver (RX) | ||||
| 	Ethernet transmitter (TX) | ||||
| 	Offline/Host command (O/H) | ||||
| 
 | ||||
| PROPERTIES | ||||
| 
 | ||||
| - compatible | ||||
| 		Usage: required | ||||
| 		Value type: <stringlist> | ||||
| 		Definition: A standard property. | ||||
| 		Must include one of the following: | ||||
| 			- "fsl,fman-v2-port-oh" for FManV2 OH ports | ||||
| 			- "fsl,fman-v2-port-rx" for FManV2 RX ports | ||||
| 			- "fsl,fman-v2-port-tx" for FManV2 TX ports | ||||
| 			- "fsl,fman-v3-port-oh" for FManV3 OH ports | ||||
| 			- "fsl,fman-v3-port-rx" for FManV3 RX ports | ||||
| 			- "fsl,fman-v3-port-tx" for FManV3 TX ports | ||||
| 
 | ||||
| - cell-index | ||||
| 		Usage: required | ||||
| 		Value type: <u32> | ||||
| 		Definition: Specifies the hardware port id. | ||||
| 		Each hardware port on the FMan has its own hardware PortID. | ||||
| 		Super set of all hardware Port IDs available at FMan Reference | ||||
| 		Manual under "FMan Hardware Ports in Freescale Devices" table. | ||||
| 
 | ||||
| 		Each hardware port is assigned a 4KB, port-specific page in | ||||
| 		the FMan hardware port memory region (which is part of the | ||||
| 		FMan memory map). The first 4 KB in the FMan hardware ports | ||||
| 		memory region is used for what are called common registers. | ||||
| 		The subsequent 63 4KB pages are allocated to the hardware | ||||
| 		ports. | ||||
| 		The page of a specific port is determined by the cell-index. | ||||
| 
 | ||||
| - reg | ||||
| 		Usage: required | ||||
| 		Value type: <prop-encoded-array> | ||||
| 		Definition: There is one reg region describing the port | ||||
| 		configuration registers. | ||||
| 
 | ||||
| EXAMPLE | ||||
| 
 | ||||
| port@a8000 { | ||||
| 	cell-index = <0x28>; | ||||
| 	compatible = "fsl,fman-v2-port-tx"; | ||||
| 	reg = <0xa8000 0x1000>; | ||||
| }; | ||||
| 
 | ||||
| port@88000 { | ||||
| 	cell-index = <0x8>; | ||||
| 	compatible = "fsl,fman-v2-port-rx"; | ||||
| 	reg = <0x88000 0x1000>; | ||||
| }; | ||||
| 
 | ||||
| port@81000 { | ||||
| 	cell-index = <0x1>; | ||||
| 	compatible = "fsl,fman-v2-port-oh"; | ||||
| 	reg = <0x81000 0x1000>; | ||||
| }; | ||||
| 
 | ||||
| ============================================================================= | ||||
| FMan dTSEC/XGEC/mEMAC Node | ||||
| 
 | ||||
| DESCRIPTION | ||||
| 
 | ||||
| mEMAC/dTSEC/XGEC are the Ethernet network interfaces | ||||
| 
 | ||||
| PROPERTIES | ||||
| 
 | ||||
| - compatible | ||||
| 		Usage: required | ||||
| 		Value type: <stringlist> | ||||
| 		Definition: A standard property. | ||||
| 		Must include one of the following: | ||||
| 		- "fsl,fman-dtsec" for dTSEC MAC | ||||
| 		- "fsl,fman-xgec" for XGEC MAC | ||||
| 		- "fsl,fman-memac for mEMAC MAC | ||||
| 
 | ||||
| - cell-index | ||||
| 		Usage: required | ||||
| 		Value type: <u32> | ||||
| 		Definition: Specifies the MAC id. | ||||
| 
 | ||||
| 		The cell-index value may be used by the FMan or the SoC, to | ||||
| 		identify the MAC unit in the FMan (or SoC) memory map. | ||||
| 		In the tables bellow there's a description of the cell-index | ||||
| 		use, there are two tables, one describes the use of cell-index | ||||
| 		by the FMan, the second describes the use by the SoC: | ||||
| 
 | ||||
| 		1. FMan Registers | ||||
| 
 | ||||
| 		FManV2: | ||||
| 		register[bit]		MAC		cell-index | ||||
| 		============================================================ | ||||
| 		FM_EPI[16]		XGEC		8 | ||||
| 		FM_EPI[16+n]		dTSECn		n-1 | ||||
| 		FM_NPI[11+n]		dTSECn		n-1 | ||||
| 			n = 1,..,5 | ||||
| 
 | ||||
| 		FManV3: | ||||
| 		register[bit]		MAC		cell-index | ||||
| 		============================================================ | ||||
| 		FM_EPI[16+n]		mEMACn		n-1 | ||||
| 		FM_EPI[25]		mEMAC10		9 | ||||
| 
 | ||||
| 		FM_NPI[11+n]		mEMACn		n-1 | ||||
| 		FM_NPI[10]		mEMAC10		9 | ||||
| 		FM_NPI[11]		mEMAC9		8 | ||||
| 			n = 1,..8 | ||||
| 
 | ||||
| 		FM_EPI and FM_NPI are located in the FMan memory map. | ||||
| 
 | ||||
| 		2. SoC registers: | ||||
| 
 | ||||
| 		- P2041, P3041, P4080 P5020, P5040: | ||||
| 		register[bit]		FMan		MAC		cell | ||||
| 					Unit				index | ||||
| 		============================================================ | ||||
| 		DCFG_DEVDISR2[7]	1		XGEC		8 | ||||
| 		DCFG_DEVDISR2[7+n]	1		dTSECn		n-1 | ||||
| 		DCFG_DEVDISR2[15]	2		XGEC		8 | ||||
| 		DCFG_DEVDISR2[15+n]	2		dTSECn		n-1 | ||||
| 			n = 1,..5 | ||||
| 
 | ||||
| 		- T1040, T2080, T4240, B4860: | ||||
| 		register[bit]			FMan	MAC		cell | ||||
| 						Unit			index | ||||
| 		============================================================ | ||||
| 		DCFG_CCSR_DEVDISR2[n-1]		1	mEMACn		n-1 | ||||
| 		DCFG_CCSR_DEVDISR2[11+n]	2	mEMACn		n-1 | ||||
| 			n = 1,..6,9,10 | ||||
| 
 | ||||
| 		EVDISR, DCFG_DEVDISR2 and DCFG_CCSR_DEVDISR2 are located in | ||||
| 		the specific SoC "Device Configuration/Pin Control" Memory | ||||
| 		Map. | ||||
| 
 | ||||
| - reg | ||||
| 		Usage: required | ||||
| 		Value type: <prop-encoded-array> | ||||
| 		Definition: A standard property. | ||||
| 
 | ||||
| - fsl,fman-ports | ||||
| 		Usage: required | ||||
| 		Value type: <prop-encoded-array> | ||||
| 		Definition: An array of two phandles - the first references is | ||||
| 		the FMan RX port and the second is the TX port used by this | ||||
| 		MAC. | ||||
| 
 | ||||
| - ptp-timer | ||||
| 		Usage required | ||||
| 		Value type: <phandle> | ||||
| 		Definition: A phandle for 1EEE1588 timer. | ||||
| 
 | ||||
| EXAMPLE | ||||
| 
 | ||||
| fman1_tx28: port@a8000 { | ||||
| 	cell-index = <0x28>; | ||||
| 	compatible = "fsl,fman-v2-port-tx"; | ||||
| 	reg = <0xa8000 0x1000>; | ||||
| }; | ||||
| 
 | ||||
| fman1_rx8: port@88000 { | ||||
| 	cell-index = <0x8>; | ||||
| 	compatible = "fsl,fman-v2-port-rx"; | ||||
| 	reg = <0x88000 0x1000>; | ||||
| }; | ||||
| 
 | ||||
| ptp-timer: ptp_timer@fe000 { | ||||
| 	compatible = "fsl,fman-ptp-timer"; | ||||
| 	reg = <0xfe000 0x1000>; | ||||
| }; | ||||
| 
 | ||||
| ethernet@e0000 { | ||||
| 	compatible = "fsl,fman-dtsec"; | ||||
| 	cell-index = <0>; | ||||
| 	reg = <0xe0000 0x1000>; | ||||
| 	fsl,fman-ports = <&fman1_rx8 &fman1_tx28>; | ||||
| 	ptp-timer = <&ptp-timer>; | ||||
| }; | ||||
| 
 | ||||
| ============================================================================ | ||||
| FMan IEEE 1588 Node | ||||
| 
 | ||||
| DESCRIPTION | ||||
| 
 | ||||
| The FMan interface to support IEEE 1588 | ||||
| 
 | ||||
| 
 | ||||
| PROPERTIES | ||||
| 
 | ||||
| - compatible | ||||
| 		Usage: required | ||||
| 		Value type: <stringlist> | ||||
| 		Definition: A standard property. | ||||
| 		Must include "fsl,fman-ptp-timer". | ||||
| 
 | ||||
| - reg | ||||
| 		Usage: required | ||||
| 		Value type: <prop-encoded-array> | ||||
| 		Definition: A standard property. | ||||
| 
 | ||||
| EXAMPLE | ||||
| 
 | ||||
| ptp-timer@fe000 { | ||||
| 	compatible = "fsl,fman-ptp-timer"; | ||||
| 	reg = <0xfe000 0x1000>; | ||||
| }; | ||||
| 
 | ||||
| ============================================================================= | ||||
| Example | ||||
| 
 | ||||
| fman@400000 { | ||||
| 	#address-cells = <1>; | ||||
| 	#size-cells = <1>; | ||||
| 	cell-index = <1>; | ||||
| 	compatible = "fsl,fman" | ||||
| 	ranges = <0 0x400000 0x100000>; | ||||
| 	reg = <0x400000 0x100000>; | ||||
| 	clocks = <&fman_clk>; | ||||
| 	clock-names = "fmanclk"; | ||||
| 	interrupts = < | ||||
| 		96 2 0 0 | ||||
| 		16 2 1 1>; | ||||
| 	fsl,qman-channel-range = <0x40 0xc>; | ||||
| 
 | ||||
| 	muram@0 { | ||||
| 		compatible = "fsl,fman-muram"; | ||||
| 		reg = <0x0 0x28000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	port@81000 { | ||||
| 		cell-index = <1>; | ||||
| 		compatible = "fsl,fman-v2-port-oh"; | ||||
| 		reg = <0x81000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	port@82000 { | ||||
| 		cell-index = <2>; | ||||
| 		compatible = "fsl,fman-v2-port-oh"; | ||||
| 		reg = <0x82000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	port@83000 { | ||||
| 		cell-index = <3>; | ||||
| 		compatible = "fsl,fman-v2-port-oh"; | ||||
| 		reg = <0x83000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	port@84000 { | ||||
| 		cell-index = <4>; | ||||
| 		compatible = "fsl,fman-v2-port-oh"; | ||||
| 		reg = <0x84000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	port@85000 { | ||||
| 		cell-index = <5>; | ||||
| 		compatible = "fsl,fman-v2-port-oh"; | ||||
| 		reg = <0x85000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	port@86000 { | ||||
| 		cell-index = <6>; | ||||
| 		compatible = "fsl,fman-v2-port-oh"; | ||||
| 		reg = <0x86000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	fman1_rx_0x8: port@88000 { | ||||
| 		cell-index = <0x8>; | ||||
| 		compatible = "fsl,fman-v2-port-rx"; | ||||
| 		reg = <0x88000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	fman1_rx_0x9: port@89000 { | ||||
| 		cell-index = <0x9>; | ||||
| 		compatible = "fsl,fman-v2-port-rx"; | ||||
| 		reg = <0x89000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	fman1_rx_0xa: port@8a000 { | ||||
| 		cell-index = <0xa>; | ||||
| 		compatible = "fsl,fman-v2-port-rx"; | ||||
| 		reg = <0x8a000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	fman1_rx_0xb: port@8b000 { | ||||
| 		cell-index = <0xb>; | ||||
| 		compatible = "fsl,fman-v2-port-rx"; | ||||
| 		reg = <0x8b000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	fman1_rx_0xc: port@8c000 { | ||||
| 		cell-index = <0xc>; | ||||
| 		compatible = "fsl,fman-v2-port-rx"; | ||||
| 		reg = <0x8c000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	fman1_rx_0x10: port@90000 { | ||||
| 		cell-index = <0x10>; | ||||
| 		compatible = "fsl,fman-v2-port-rx"; | ||||
| 		reg = <0x90000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	fman1_tx_0x28: port@a8000 { | ||||
| 		cell-index = <0x28>; | ||||
| 		compatible = "fsl,fman-v2-port-tx"; | ||||
| 		reg = <0xa8000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	fman1_tx_0x29: port@a9000 { | ||||
| 		cell-index = <0x29>; | ||||
| 		compatible = "fsl,fman-v2-port-tx"; | ||||
| 		reg = <0xa9000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	fman1_tx_0x2a: port@aa000 { | ||||
| 		cell-index = <0x2a>; | ||||
| 		compatible = "fsl,fman-v2-port-tx"; | ||||
| 		reg = <0xaa000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	fman1_tx_0x2b: port@ab000 { | ||||
| 		cell-index = <0x2b>; | ||||
| 		compatible = "fsl,fman-v2-port-tx"; | ||||
| 		reg = <0xab000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	fman1_tx_0x2c: port@ac0000 { | ||||
| 		cell-index = <0x2c>; | ||||
| 		compatible = "fsl,fman-v2-port-tx"; | ||||
| 		reg = <0xac000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	fman1_tx_0x30: port@b0000 { | ||||
| 		cell-index = <0x30>; | ||||
| 		compatible = "fsl,fman-v2-port-tx"; | ||||
| 		reg = <0xb0000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| 	ethernet@e0000 { | ||||
| 		compatible = "fsl,fman-dtsec"; | ||||
| 		cell-index = <0>; | ||||
| 		reg = <0xe0000 0x1000>; | ||||
| 		fsl,fman-ports = <&fman1_rx_0x8 &fman1_tx_0x28>; | ||||
| 	}; | ||||
| 
 | ||||
| 	ethernet@e2000 { | ||||
| 		compatible = "fsl,fman-dtsec"; | ||||
| 		cell-index = <1>; | ||||
| 		reg = <0xe2000 0x1000>; | ||||
| 		fsl,fman-ports = <&fman1_rx_0x9 &fman1_tx_0x29>; | ||||
| 	}; | ||||
| 
 | ||||
| 	ethernet@e4000 { | ||||
| 		compatible = "fsl,fman-dtsec"; | ||||
| 		cell-index = <2>; | ||||
| 		reg = <0xe4000 0x1000>; | ||||
| 		fsl,fman-ports = <&fman1_rx_0xa &fman1_tx_0x2a>; | ||||
| 	}; | ||||
| 
 | ||||
| 	ethernet@e6000 { | ||||
| 		compatible = "fsl,fman-dtsec"; | ||||
| 		cell-index = <3>; | ||||
| 		reg = <0xe6000 0x1000>; | ||||
| 		fsl,fman-ports = <&fman1_rx_0xb &fman1_tx_0x2b>; | ||||
| 	}; | ||||
| 
 | ||||
| 	ethernet@e8000 { | ||||
| 		compatible = "fsl,fman-dtsec"; | ||||
| 		cell-index = <4>; | ||||
| 		reg = <0xf0000 0x1000>; | ||||
| 		fsl,fman-ports = <&fman1_rx_0xc &fman1_tx_0x2c>; | ||||
| 
 | ||||
| 	ethernet@f0000 { | ||||
| 		cell-index = <8>; | ||||
| 		compatible = "fsl,fman-xgec"; | ||||
| 		reg = <0xf0000 0x1000>; | ||||
| 		fsl,fman-ports = <&fman1_rx_0x10 &fman1_tx_0x30>; | ||||
| 	}; | ||||
| 
 | ||||
| 	ptp-timer@fe000 { | ||||
| 		compatible = "fsl,fman-ptp-timer"; | ||||
| 		reg = <0xfe000 0x1000>; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										56
									
								
								Documentation/devicetree/bindings/soc/fsl/bman-portals.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								Documentation/devicetree/bindings/soc/fsl/bman-portals.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,56 @@ | ||||
| QorIQ DPAA Buffer Manager Portals Device Tree Binding | ||||
| 
 | ||||
| Copyright (C) 2008 - 2014 Freescale Semiconductor Inc. | ||||
| 
 | ||||
| CONTENTS | ||||
| 
 | ||||
| 	- BMan Portal | ||||
| 	- Example | ||||
| 
 | ||||
| BMan Portal Node | ||||
| 
 | ||||
| Portals are memory mapped interfaces to BMan that allow low-latency, lock-less | ||||
| interaction by software running on processor cores, accelerators and network | ||||
| interfaces with the BMan | ||||
| 
 | ||||
| PROPERTIES | ||||
| 
 | ||||
| - compatible | ||||
| 	Usage:		Required | ||||
| 	Value type:	<stringlist> | ||||
| 	Definition:	Must include "fsl,bman-portal-<hardware revision>" | ||||
| 			May include "fsl,<SoC>-bman-portal" or "fsl,bman-portal" | ||||
| 
 | ||||
| - reg | ||||
| 	Usage:		Required | ||||
| 	Value type:	<prop-encoded-array> | ||||
| 	Definition:	Two regions. The first is the cache-enabled region of | ||||
| 			the portal. The second is the cache-inhibited region of | ||||
| 			the portal | ||||
| 
 | ||||
| - interrupts | ||||
| 	Usage:		Required | ||||
| 	Value type:	<prop-encoded-array> | ||||
| 	Definition:	Standard property | ||||
| 
 | ||||
| EXAMPLE | ||||
| 
 | ||||
| The example below shows a (P4080) BMan portals container/bus node with two portals | ||||
| 
 | ||||
| 	bman-portals@ff4000000 { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 		compatible = "simple-bus"; | ||||
| 		ranges = <0 0xf 0xf4000000 0x200000>; | ||||
| 
 | ||||
| 		bman-portal@0 { | ||||
| 			compatible = "fsl,bman-portal-1.0.0", "fsl,bman-portal"; | ||||
| 			reg = <0x0 0x4000>, <0x100000 0x1000>; | ||||
| 			interrupts = <105 2 0 0>; | ||||
| 		}; | ||||
| 		bman-portal@4000 { | ||||
| 			compatible = "fsl,bman-portal-1.0.0", "fsl,bman-portal"; | ||||
| 			reg = <0x4000 0x4000>, <0x101000 0x1000>; | ||||
| 			interrupts = <107 2 0 0>; | ||||
| 		}; | ||||
| 	}; | ||||
							
								
								
									
										125
									
								
								Documentation/devicetree/bindings/soc/fsl/bman.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								Documentation/devicetree/bindings/soc/fsl/bman.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,125 @@ | ||||
| QorIQ DPAA Buffer Manager Device Tree Bindings | ||||
| 
 | ||||
| Copyright (C) 2008 - 2014 Freescale Semiconductor Inc. | ||||
| 
 | ||||
| CONTENTS | ||||
| 
 | ||||
| 	- BMan Node | ||||
| 	- BMan Private Memory Node | ||||
| 	- Example | ||||
| 
 | ||||
| BMan Node | ||||
| 
 | ||||
| The Buffer Manager is part of the Data-Path Acceleration Architecture (DPAA). | ||||
| BMan supports hardware allocation and deallocation of buffers belonging to pools | ||||
| originally created by software with configurable depletion thresholds. This | ||||
| binding covers the CCSR space programming model | ||||
| 
 | ||||
| PROPERTIES | ||||
| 
 | ||||
| - compatible | ||||
| 	Usage:		Required | ||||
| 	Value type:	<stringlist> | ||||
| 	Definition:	Must include "fsl,bman" | ||||
| 			May include "fsl,<SoC>-bman" | ||||
| 
 | ||||
| - reg | ||||
| 	Usage:		Required | ||||
| 	Value type:	<prop-encoded-array> | ||||
| 	Definition:	Registers region within the CCSR address space | ||||
| 
 | ||||
| The BMan revision information is located in the BMAN_IP_REV_1/2 registers which | ||||
| are located at offsets 0xbf8 and 0xbfc | ||||
| 
 | ||||
| - interrupts | ||||
| 	Usage:		Required | ||||
| 	Value type:	<prop-encoded-array> | ||||
| 	Definition:	Standard property. The error interrupt | ||||
| 
 | ||||
| - fsl,liodn | ||||
| 	Usage:		See pamu.txt | ||||
| 	Value type:	<prop-encoded-array> | ||||
| 	Definition:	PAMU property used for static LIODN assignment | ||||
| 
 | ||||
| - fsl,iommu-parent | ||||
| 	Usage:		See pamu.txt | ||||
| 	Value type:	<phandle> | ||||
| 	Definition:	PAMU property used for dynamic LIODN assignment | ||||
| 
 | ||||
| 	For additional details about the PAMU/LIODN binding(s) see pamu.txt | ||||
| 
 | ||||
| Devices connected to a BMan instance via Direct Connect Portals (DCP) must link | ||||
| to the respective BMan instance | ||||
| 
 | ||||
| - fsl,bman | ||||
| 	Usage:		Required | ||||
| 	Value type:	<prop-encoded-array> | ||||
| 	Description:	List of phandle and DCP index pairs, to the BMan instance | ||||
| 			to which this device is connected via the DCP | ||||
| 
 | ||||
| BMan Private Memory Node | ||||
| 
 | ||||
| BMan requires a contiguous range of physical memory used for the backing store | ||||
| for BMan Free Buffer Proxy Records (FBPR). This memory is reserved/allocated as a | ||||
| node under the /reserved-memory node | ||||
| 
 | ||||
| The BMan FBPR memory node must be named "bman-fbpr" | ||||
| 
 | ||||
| PROPERTIES | ||||
| 
 | ||||
| - compatible | ||||
| 	Usage:		required | ||||
| 	Value type:	<stringlist> | ||||
| 	Definition:	Must inclide "fsl,bman-fbpr" | ||||
| 
 | ||||
| The following constraints are relevant to the FBPR private memory: | ||||
| 	- The size must be 2^(size + 1), with size = 11..33. That is 4 KiB to | ||||
| 	  16 GiB | ||||
| 	- The alignment must be a muliptle of the memory size | ||||
| 
 | ||||
| The size of the FBPR must be chosen by observing the hardware features configured | ||||
| via the Reset Configuration Word (RCW) and that are relevant to a specific board | ||||
| (e.g. number of MAC(s) pinned-out, number of offline/host command FMan ports, | ||||
| etc.). The size configured in the DT must reflect the hardware capabilities and | ||||
| not the specific needs of an application | ||||
| 
 | ||||
| For additional details about reserved memory regions see reserved-memory.txt | ||||
| 
 | ||||
| EXAMPLE | ||||
| 
 | ||||
| The example below shows a BMan FBPR dynamic allocation memory node | ||||
| 
 | ||||
| 	reserved-memory { | ||||
| 		#address-cells = <2>; | ||||
| 		#size-cells = <2>; | ||||
| 		ranges; | ||||
| 
 | ||||
| 		bman_fbpr: bman-fbpr { | ||||
| 			compatible = "fsl,bman-fbpr"; | ||||
| 			alloc-ranges = <0 0 0xf 0xffffffff>; | ||||
| 			size = <0 0x1000000>; | ||||
| 			alignment = <0 0x1000000>; | ||||
| 		}; | ||||
| 	}; | ||||
| 
 | ||||
| The example below shows a (P4080) BMan CCSR-space node | ||||
| 
 | ||||
| 	crypto@300000 { | ||||
| 		... | ||||
| 		fsl,bman = <&bman, 2>; | ||||
| 		... | ||||
| 	}; | ||||
| 
 | ||||
| 	bman: bman@31a000 { | ||||
| 		compatible = "fsl,bman"; | ||||
| 		reg = <0x31a000 0x1000>; | ||||
| 		interrupts = <16 2 1 2>; | ||||
| 		fsl,liodn = <0x17>; | ||||
| 		memory-region = <&bman_fbpr>; | ||||
| 	}; | ||||
| 
 | ||||
| 	fman@400000 { | ||||
| 		... | ||||
| 		fsl,bman = <&bman, 0>; | ||||
| 		... | ||||
| 	}; | ||||
							
								
								
									
										154
									
								
								Documentation/devicetree/bindings/soc/fsl/qman-portals.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								Documentation/devicetree/bindings/soc/fsl/qman-portals.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,154 @@ | ||||
| QorIQ DPAA Queue Manager Portals Device Tree Binding | ||||
| 
 | ||||
| Copyright (C) 2008 - 2014 Freescale Semiconductor Inc. | ||||
| 
 | ||||
| CONTENTS | ||||
| 
 | ||||
| 	- QMan Portal | ||||
| 	- QMan Pool Channel | ||||
| 	- Example | ||||
| 
 | ||||
| QMan Portal Node | ||||
| 
 | ||||
| Portals are memory mapped interfaces to QMan that allow low-latency, lock-less | ||||
| interaction by software running on processor cores, accelerators and network | ||||
| interfaces with the QMan | ||||
| 
 | ||||
| PROPERTIES | ||||
| 
 | ||||
| - compatible | ||||
| 	Usage:		Required | ||||
| 	Value type:	<stringlist> | ||||
| 	Definition:	Must include "fsl,qman-portal-<hardware revision>" | ||||
| 			May include "fsl,<SoC>-qman-portal" or "fsl,qman-portal" | ||||
| 
 | ||||
| - reg | ||||
| 	Usage:		Required | ||||
| 	Value type:	<prop-encoded-array> | ||||
| 	Definition:	Two regions. The first is the cache-enabled region of | ||||
| 			the portal. The second is the cache-inhibited region of | ||||
| 			the portal | ||||
| 
 | ||||
| - interrupts | ||||
| 	Usage:		Required | ||||
| 	Value type:	<prop-encoded-array> | ||||
| 	Definition:	Standard property | ||||
| 
 | ||||
| - fsl,liodn | ||||
| 	Usage:		See pamu.txt | ||||
| 	Value type:	<prop-encoded-array> | ||||
| 	Definition:	Two LIODN(s). DQRR LIODN (DLIODN) and Frame LIODN | ||||
| 			(FLIODN) | ||||
| 
 | ||||
| - fsl,iommu-parent | ||||
| 	Usage:		See pamu.txt | ||||
| 	Value type:	<phandle> | ||||
| 	Definition:	PAMU property used for dynamic LIODN assignment | ||||
| 
 | ||||
| 	For additional details about the PAMU/LIODN binding(s) see pamu.txt | ||||
| 
 | ||||
| - fsl,qman-channel-id | ||||
| 	Usage:		Required | ||||
| 	Value type:	<u32> | ||||
| 	Definition:	The hardware index of the channel. This can also be | ||||
| 			determined by dividing any of the channel's 8 work queue | ||||
| 			IDs by 8 | ||||
| 
 | ||||
| In addition to these properties the qman-portals should have sub-nodes to | ||||
| represent the HW devices/portals that are connected to the software portal | ||||
| described here | ||||
| 
 | ||||
| The currently supported sub-nodes are: | ||||
| 	* fman0 | ||||
| 	* fman1 | ||||
| 	* pme | ||||
| 	* crypto | ||||
| 
 | ||||
| These subnodes should have the following properties: | ||||
| 
 | ||||
| - fsl,liodn | ||||
| 	Usage:		See pamu.txt | ||||
| 	Value type:	<prop-encoded-array> | ||||
| 	Definition:	PAMU property used for static LIODN assignment | ||||
| 
 | ||||
| - fsl,iommu-parent | ||||
| 	Usage:		See pamu.txt | ||||
| 	Value type:	<phandle> | ||||
| 	Definition:	PAMU property used for dynamic LIODN assignment | ||||
| 
 | ||||
| - dev-handle | ||||
| 	Usage:		Required | ||||
| 	Value type:	<phandle> | ||||
| 	Definition:	The phandle to the particular hardware device that this | ||||
| 			portal is connected to. | ||||
| 
 | ||||
| DPAA QMan Pool Channel Nodes | ||||
| 
 | ||||
| Pool Channels are defined with the following properties. | ||||
| 
 | ||||
| PROPERTIES | ||||
| 
 | ||||
| - compatible | ||||
| 	Usage:		Required | ||||
| 	Value type:	<stringlist> | ||||
| 	Definition:	Must include "fsl,qman-pool-channel" | ||||
| 			May include "fsl,<SoC>-qman-pool-channel" | ||||
| 
 | ||||
| - fsl,qman-channel-id | ||||
| 	Usage:		Required | ||||
| 	Value type:	<u32> | ||||
| 	Definition:	The hardware index of the channel. This can also be | ||||
| 			determined by dividing any of the channel's 8 work queue | ||||
| 			IDs by 8 | ||||
| 
 | ||||
| EXAMPLE | ||||
| 
 | ||||
| The example below shows a (P4080) QMan portals container/bus node with two portals | ||||
| 
 | ||||
| 	qman-portals@ff4200000 { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 		compatible = "simple-bus"; | ||||
| 		ranges = <0 0xf 0xf4200000 0x200000>; | ||||
| 
 | ||||
| 		qman-portal@0 { | ||||
| 			compatible = "fsl,qman-portal-1.2.0", "fsl,qman-portal"; | ||||
| 			reg = <0 0x4000>, <0x100000 0x1000>; | ||||
| 			interrupts = <104 2 0 0>; | ||||
| 			fsl,liodn = <1 2>; | ||||
| 			fsl,qman-channel-id = <0>; | ||||
| 
 | ||||
| 			fman0 { | ||||
| 				fsl,liodn = <0x21>; | ||||
| 				dev-handle = <&fman0>; | ||||
| 			}; | ||||
| 			fman1 { | ||||
| 				fsl,liodn = <0xa1>; | ||||
| 				dev-handle = <&fman1>; | ||||
| 			}; | ||||
| 			crypto { | ||||
| 				fsl,liodn = <0x41 0x66>; | ||||
| 				dev-handle = <&crypto>; | ||||
| 			}; | ||||
| 		}; | ||||
| 		qman-portal@4000 { | ||||
| 			compatible = "fsl,qman-portal-1.2.0", "fsl,qman-portal"; | ||||
| 			reg = <0x4000 0x4000>, <0x101000 0x1000>; | ||||
| 			interrupts = <106 2 0 0>; | ||||
| 			fsl,liodn = <3 4>; | ||||
| 			fsl,qman-channel-id = <1>; | ||||
| 
 | ||||
| 			fman0 { | ||||
| 				fsl,liodn = <0x22>; | ||||
| 				dev-handle = <&fman0>; | ||||
| 			}; | ||||
| 			fman1 { | ||||
| 				fsl,liodn = <0xa2>; | ||||
| 				dev-handle = <&fman1>; | ||||
| 			}; | ||||
| 			crypto { | ||||
| 				fsl,liodn = <0x42 0x67>; | ||||
| 				dev-handle = <&crypto>; | ||||
| 			}; | ||||
| 		}; | ||||
| 	}; | ||||
							
								
								
									
										165
									
								
								Documentation/devicetree/bindings/soc/fsl/qman.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								Documentation/devicetree/bindings/soc/fsl/qman.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,165 @@ | ||||
| QorIQ DPAA Queue Manager Device Tree Binding | ||||
| 
 | ||||
| Copyright (C) 2008 - 2014 Freescale Semiconductor Inc. | ||||
| 
 | ||||
| CONTENTS | ||||
| 
 | ||||
| 	- QMan Node | ||||
| 	- QMan Private Memory Nodes | ||||
| 	- Example | ||||
| 
 | ||||
| QMan Node | ||||
| 
 | ||||
| The Queue Manager is part of the Data-Path Acceleration Architecture (DPAA). QMan | ||||
| supports queuing and QoS scheduling of frames to CPUs, network interfaces and | ||||
| DPAA logic modules, maintains packet ordering within flows. Besides providing | ||||
| flow-level queuing, is also responsible for congestion management functions such | ||||
| as RED/WRED, congestion notifications and tail discards. This binding covers the | ||||
| CCSR space programming model | ||||
| 
 | ||||
| PROPERTIES | ||||
| 
 | ||||
| - compatible | ||||
| 	Usage:		Required | ||||
| 	Value type:	<stringlist> | ||||
| 	Definition:	Must include "fsl,qman" | ||||
| 			May include "fsl,<SoC>-qman" | ||||
| 
 | ||||
| - reg | ||||
| 	Usage:		Required | ||||
| 	Value type:	<prop-encoded-array> | ||||
| 	Definition:	Registers region within the CCSR address space | ||||
| 
 | ||||
| The QMan revision information is located in the QMAN_IP_REV_1/2 registers which | ||||
| are located at offsets 0xbf8 and 0xbfc | ||||
| 
 | ||||
| - interrupts | ||||
| 	Usage:		Required | ||||
| 	Value type:	<prop-encoded-array> | ||||
| 	Definition:	Standard property. The error interrupt | ||||
| 
 | ||||
| - fsl,liodn | ||||
| 	Usage:		See pamu.txt | ||||
| 	Value type:	<prop-encoded-array> | ||||
| 	Definition:	PAMU property used for static LIODN assignment | ||||
| 
 | ||||
| - fsl,iommu-parent | ||||
| 	Usage:		See pamu.txt | ||||
| 	Value type:	<phandle> | ||||
| 	Definition:	PAMU property used for dynamic LIODN assignment | ||||
| 
 | ||||
| 	For additional details about the PAMU/LIODN binding(s) see pamu.txt | ||||
| 
 | ||||
| - clocks | ||||
| 	Usage:		See clock-bindings.txt and qoriq-clock.txt | ||||
| 	Value type:	<prop-encoded-array> | ||||
| 	Definition:	Reference input clock. Its frequency is half of the | ||||
| 			platform clock | ||||
| 
 | ||||
| Devices connected to a QMan instance via Direct Connect Portals (DCP) must link | ||||
| to the respective QMan instance | ||||
| 
 | ||||
| - fsl,qman | ||||
| 	Usage:		Required | ||||
| 	Value type:	<prop-encoded-array> | ||||
| 	Description:	List of phandle and DCP index pairs, to the QMan instance | ||||
| 			to which this device is connected via the DCP | ||||
| 
 | ||||
| QMan Private Memory Nodes | ||||
| 
 | ||||
| QMan requires two contiguous range of physical memory used for the backing store | ||||
| for QMan Frame Queue Descriptor (FQD) and Packed Frame Descriptor Record (PFDR). | ||||
| This memory is reserved/allocated as a nodes under the /reserved-memory node | ||||
| 
 | ||||
| The QMan FQD memory node must be named "qman-fqd" | ||||
| 
 | ||||
| PROPERTIES | ||||
| 
 | ||||
| - compatible | ||||
| 	Usage:		required | ||||
| 	Value type:	<stringlist> | ||||
| 	Definition:	Must inclide "fsl,qman-fqd" | ||||
| 
 | ||||
| The QMan PFDR memory node must be named "qman-pfdr" | ||||
| 
 | ||||
| PROPERTIES | ||||
| 
 | ||||
| - compatible | ||||
| 	Usage:		required | ||||
| 	Value type:	<stringlist> | ||||
| 	Definition:	Must inclide "fsl,qman-pfdr" | ||||
| 
 | ||||
| The following constraints are relevant to the FQD and PFDR private memory: | ||||
| 	- The size must be 2^(size + 1), with size = 11..29. That is 4 KiB to | ||||
| 	  1 GiB | ||||
| 	- The alignment must be a muliptle of the memory size | ||||
| 
 | ||||
| The size of the FQD and PFDP must be chosen by observing the hardware features | ||||
| configured via the Reset Configuration Word (RCW) and that are relevant to a | ||||
| specific board (e.g. number of MAC(s) pinned-out, number of offline/host command | ||||
| FMan ports, etc.). The size configured in the DT must reflect the hardware | ||||
| capabilities and not the specific needs of an application | ||||
| 
 | ||||
| For additional details about reserved memory regions see reserved-memory.txt | ||||
| 
 | ||||
| EXAMPLE | ||||
| 
 | ||||
| The example below shows a QMan FQD and a PFDR dynamic allocation memory nodes | ||||
| 
 | ||||
| 	reserved-memory { | ||||
| 		#address-cells = <2>; | ||||
| 		#size-cells = <2>; | ||||
| 		ranges; | ||||
| 
 | ||||
| 		qman_fqd: qman-fqd { | ||||
| 			compatible = "fsl,qman-fqd"; | ||||
| 			alloc-ranges = <0 0 0xf 0xffffffff>; | ||||
| 			size = <0 0x400000>; | ||||
| 			alignment = <0 0x400000>; | ||||
| 		}; | ||||
| 		qman_pfdr: qman-pfdr { | ||||
| 			compatible = "fsl,qman-pfdr"; | ||||
| 			alloc-ranges = <0 0 0xf 0xffffffff>; | ||||
| 			size = <0 0x2000000>; | ||||
| 			alignment = <0 0x2000000>; | ||||
| 		}; | ||||
| 	}; | ||||
| 
 | ||||
| The example below shows a (P4080) QMan CCSR-space node | ||||
| 
 | ||||
| 	clockgen: global-utilities@e1000 { | ||||
| 		... | ||||
| 		sysclk: sysclk { | ||||
| 			... | ||||
| 		}; | ||||
| 		... | ||||
| 		platform_pll: platform-pll@c00 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0xc00 0x4>; | ||||
| 			compatible = "fsl,qoriq-platform-pll-1.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "platform-pll", "platform-pll-div2"; | ||||
| 		}; | ||||
| 		... | ||||
| 	}; | ||||
| 
 | ||||
| 	crypto@300000 { | ||||
| 		... | ||||
| 		fsl,qman = <&qman, 2>; | ||||
| 		... | ||||
| 	}; | ||||
| 
 | ||||
| 	qman: qman@318000 { | ||||
| 		compatible = "fsl,qman"; | ||||
| 		reg = <0x318000 0x1000>; | ||||
| 		interrupts = <16 2 1 3> | ||||
| 		fsl,liodn = <0x16>; | ||||
| 		memory-region = <&qman_fqd &qman_pfdr>; | ||||
| 		clocks = <&platform_pll 1>; | ||||
| 	}; | ||||
| 
 | ||||
| 	fman@400000 { | ||||
| 		... | ||||
| 		fsl,qman = <&qman, 0>; | ||||
| 		... | ||||
| 	}; | ||||
| @ -552,7 +552,7 @@ config PPC_4K_PAGES | ||||
| 	bool "4k page size" | ||||
| 
 | ||||
| config PPC_16K_PAGES | ||||
| 	bool "16k page size" if 44x | ||||
| 	bool "16k page size" if 44x || PPC_8xx | ||||
| 
 | ||||
| config PPC_64K_PAGES | ||||
| 	bool "64k page size" if 44x || PPC_STD_MMU_64 || PPC_BOOK3E_64 | ||||
|  | ||||
| @ -193,9 +193,9 @@ | ||||
| 		fsl,liodn-bits = <12>; | ||||
| 	}; | ||||
| 
 | ||||
| 	clockgen: global-utilities@e1000 { | ||||
| /include/ "fsl/qoriq-clockgen2.dtsi" | ||||
| 	global-utilities@e1000 { | ||||
| 		compatible = "fsl,b4-clockgen", "fsl,qoriq-clockgen-2.0"; | ||||
| 		reg = <0xe1000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| /include/ "fsl/qoriq-dma-0.dtsi" | ||||
|  | ||||
| @ -152,6 +152,29 @@ | ||||
| 						reg = <0x68>; | ||||
| 					}; | ||||
| 				}; | ||||
| 
 | ||||
| 				i2c@2 { | ||||
| 					#address-cells = <1>; | ||||
| 					#size-cells = <0>; | ||||
| 					reg = <0x2>; | ||||
| 
 | ||||
| 					ina220@40 { | ||||
| 						compatible = "ti,ina220"; | ||||
| 						reg = <0x40>; | ||||
| 						shunt-resistor = <1000>; | ||||
| 					}; | ||||
| 				}; | ||||
| 
 | ||||
| 				i2c@3 { | ||||
| 					#address-cells = <1>; | ||||
| 					#size-cells = <0>; | ||||
| 					reg = <0x3>; | ||||
| 
 | ||||
| 					adt7461@4c { | ||||
| 						compatible = "adi,adt7461"; | ||||
| 						reg = <0x4c>; | ||||
| 					}; | ||||
| 				}; | ||||
| 			}; | ||||
| 		}; | ||||
| 
 | ||||
|  | ||||
| @ -40,31 +40,6 @@ | ||||
| 		compatible = "fsl,ifc-nand"; | ||||
| 		reg = <0x0 0x0 0x4000>; | ||||
| 
 | ||||
| 		partition@0 { | ||||
| 			/* This location must not be altered  */ | ||||
| 			/* 3MB for u-boot Bootloader Image */ | ||||
| 			reg = <0x0 0x00300000>; | ||||
| 			label = "NAND U-Boot Image"; | ||||
| 			read-only; | ||||
| 		}; | ||||
| 
 | ||||
| 		partition@300000 { | ||||
| 			/* 1MB for DTB Image */ | ||||
| 			reg = <0x00300000 0x00100000>; | ||||
| 			label = "NAND DTB Image"; | ||||
| 		}; | ||||
| 
 | ||||
| 		partition@400000 { | ||||
| 			/* 8MB for Linux Kernel Image */ | ||||
| 			reg = <0x00400000 0x00800000>; | ||||
| 			label = "NAND Linux Kernel Image"; | ||||
| 		}; | ||||
| 
 | ||||
| 		partition@c00000 { | ||||
| 			/* Rest space for Root file System Image */ | ||||
| 			reg = <0x00c00000 0x07400000>; | ||||
| 			label = "NAND RFS Image"; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| @ -82,31 +57,6 @@ | ||||
| 			reg = <0>; | ||||
| 			spi-max-frequency = <50000000>; | ||||
| 
 | ||||
| 			/* 512KB for u-boot Bootloader Image */ | ||||
| 			partition@0 { | ||||
| 				reg = <0x0 0x00080000>; | ||||
| 				label = "SPI Flash U-Boot Image"; | ||||
| 				read-only; | ||||
| 			}; | ||||
| 
 | ||||
| 			/* 512KB for DTB Image */ | ||||
| 			partition@80000 { | ||||
| 				reg = <0x00080000 0x00080000>; | ||||
| 				label = "SPI Flash DTB Image"; | ||||
| 			}; | ||||
| 
 | ||||
| 			/* 4MB for Linux Kernel Image */ | ||||
| 			partition@100000 { | ||||
| 				reg = <0x00100000 0x00400000>; | ||||
| 				label = "SPI Flash Kernel Image"; | ||||
| 			}; | ||||
| 
 | ||||
| 			/*11MB for RFS Image */ | ||||
| 			partition@500000 { | ||||
| 				reg = <0x00500000 0x00B00000>; | ||||
| 				label = "SPI Flash RFS Image"; | ||||
| 			}; | ||||
| 
 | ||||
| 		}; | ||||
| 	}; | ||||
| 
 | ||||
|  | ||||
| @ -80,33 +80,9 @@ | ||||
| 		compatible = "fsl,b4420-device-config", "fsl,qoriq-device-config-2.0"; | ||||
| 	}; | ||||
| 
 | ||||
| 	clockgen: global-utilities@e1000 { | ||||
| /include/ "qoriq-clockgen2.dtsi" | ||||
| 	global-utilities@e1000 { | ||||
| 		compatible = "fsl,b4420-clockgen", "fsl,qoriq-clockgen-2.0"; | ||||
| 		ranges = <0x0 0xe1000 0x1000>; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 
 | ||||
| 		sysclk: sysclk { | ||||
| 			#clock-cells = <0>; | ||||
| 			compatible = "fsl,qoriq-sysclk-2.0"; | ||||
| 			clock-output-names = "sysclk"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll0: pll0@800 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x800 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-2.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll0", "pll0-div2", "pll0-div4"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll1: pll1@820 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x820 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-2.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll1", "pll1-div2", "pll1-div4"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mux0: mux0@0 { | ||||
| 			#clock-cells = <0>; | ||||
|  | ||||
| @ -124,33 +124,9 @@ | ||||
| 		compatible = "fsl,b4860-device-config", "fsl,qoriq-device-config-2.0"; | ||||
| 	}; | ||||
| 
 | ||||
| 	clockgen: global-utilities@e1000 { | ||||
| /include/ "qoriq-clockgen2.dtsi" | ||||
| 	global-utilities@e1000 { | ||||
| 		compatible = "fsl,b4860-clockgen", "fsl,qoriq-clockgen-2.0"; | ||||
| 		ranges = <0x0 0xe1000 0x1000>; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 
 | ||||
| 		sysclk: sysclk { | ||||
| 			#clock-cells = <0>; | ||||
| 			compatible = "fsl,qoriq-sysclk-2.0"; | ||||
| 			clock-output-names = "sysclk"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll0: pll0@800 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x800 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-2.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll0", "pll0-div2", "pll0-div4"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll1: pll1@820 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x820 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-2.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll1", "pll1-div2", "pll1-div4"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mux0: mux0@0 { | ||||
| 			#clock-cells = <0>; | ||||
|  | ||||
| @ -305,53 +305,9 @@ | ||||
| 		#sleep-cells = <2>; | ||||
| 	}; | ||||
| 
 | ||||
| 	clockgen: global-utilities@e1000 { | ||||
| /include/ "qoriq-clockgen1.dtsi" | ||||
| 	global-utilities@e1000 { | ||||
| 		compatible = "fsl,p2041-clockgen", "fsl,qoriq-clockgen-1.0"; | ||||
| 		ranges = <0x0 0xe1000 0x1000>; | ||||
| 		reg = <0xe1000 0x1000>; | ||||
| 		clock-frequency = <0>; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 
 | ||||
| 		sysclk: sysclk { | ||||
| 			#clock-cells = <0>; | ||||
| 			compatible = "fsl,qoriq-sysclk-1.0"; | ||||
| 			clock-output-names = "sysclk"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll0: pll0@800 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x800 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-1.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll0", "pll0-div2"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll1: pll1@820 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x820 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-1.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll1", "pll1-div2"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mux0: mux0@0 { | ||||
| 			#clock-cells = <0>; | ||||
| 			reg = <0x0 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-mux-1.0"; | ||||
| 			clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>; | ||||
| 			clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2"; | ||||
| 			clock-output-names = "cmux0"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mux1: mux1@20 { | ||||
| 			#clock-cells = <0>; | ||||
| 			reg = <0x20 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-mux-1.0"; | ||||
| 			clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>; | ||||
| 			clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2"; | ||||
| 			clock-output-names = "cmux1"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mux2: mux2@40 { | ||||
| 			#clock-cells = <0>; | ||||
|  | ||||
| @ -332,53 +332,9 @@ | ||||
| 		#sleep-cells = <2>; | ||||
| 	}; | ||||
| 
 | ||||
| 	clockgen: global-utilities@e1000 { | ||||
| /include/ "qoriq-clockgen1.dtsi" | ||||
| 	global-utilities@e1000 { | ||||
| 		compatible = "fsl,p3041-clockgen", "fsl,qoriq-clockgen-1.0"; | ||||
| 		ranges = <0x0 0xe1000 0x1000>; | ||||
| 		reg = <0xe1000 0x1000>; | ||||
| 		clock-frequency = <0>; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 
 | ||||
| 		sysclk: sysclk { | ||||
| 			#clock-cells = <0>; | ||||
| 			compatible = "fsl,qoriq-sysclk-1.0"; | ||||
| 			clock-output-names = "sysclk"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll0: pll0@800 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x800 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-1.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll0", "pll0-div2"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll1: pll1@820 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x820 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-1.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll1", "pll1-div2"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mux0: mux0@0 { | ||||
| 			#clock-cells = <0>; | ||||
| 			reg = <0x0 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-mux-1.0"; | ||||
| 			clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>; | ||||
| 			clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2"; | ||||
| 			clock-output-names = "cmux0"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mux1: mux1@20 { | ||||
| 			#clock-cells = <0>; | ||||
| 			reg = <0x20 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-mux-1.0"; | ||||
| 			clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>; | ||||
| 			clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2"; | ||||
| 			clock-output-names = "cmux1"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mux2: mux2@40 { | ||||
| 			#clock-cells = <0>; | ||||
|  | ||||
| @ -352,35 +352,9 @@ | ||||
| 		#sleep-cells = <2>; | ||||
| 	}; | ||||
| 
 | ||||
| 	clockgen: global-utilities@e1000 { | ||||
| /include/ "qoriq-clockgen1.dtsi" | ||||
| 	global-utilities@e1000 { | ||||
| 		compatible = "fsl,p4080-clockgen", "fsl,qoriq-clockgen-1.0"; | ||||
| 		ranges = <0x0 0xe1000 0x1000>; | ||||
| 		reg = <0xe1000 0x1000>; | ||||
| 		clock-frequency = <0>; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 
 | ||||
| 		sysclk: sysclk { | ||||
| 			#clock-cells = <0>; | ||||
| 			compatible = "fsl,qoriq-sysclk-1.0"; | ||||
| 			clock-output-names = "sysclk"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll0: pll0@800 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x800 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-1.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll0", "pll0-div2"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll1: pll1@820 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x820 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-1.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll1", "pll1-div2"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll2: pll2@840 { | ||||
| 			#clock-cells = <1>; | ||||
| @ -398,24 +372,6 @@ | ||||
| 			clock-output-names = "pll3", "pll3-div2"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mux0: mux0@0 { | ||||
| 			#clock-cells = <0>; | ||||
| 			reg = <0x0 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-mux-1.0"; | ||||
| 			clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>; | ||||
| 			clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2"; | ||||
| 			clock-output-names = "cmux0"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mux1: mux1@20 { | ||||
| 			#clock-cells = <0>; | ||||
| 			reg = <0x20 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-mux-1.0"; | ||||
| 			clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>; | ||||
| 			clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2"; | ||||
| 			clock-output-names = "cmux1"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mux2: mux2@40 { | ||||
| 			#clock-cells = <0>; | ||||
| 			reg = <0x40 0x4>; | ||||
|  | ||||
| @ -337,53 +337,9 @@ | ||||
| 		#sleep-cells = <2>; | ||||
| 	}; | ||||
| 
 | ||||
| 	clockgen: global-utilities@e1000 { | ||||
| /include/ "qoriq-clockgen1.dtsi" | ||||
| 	global-utilities@e1000 { | ||||
| 		compatible = "fsl,p5020-clockgen", "fsl,qoriq-clockgen-1.0"; | ||||
| 		ranges = <0x0 0xe1000 0x1000>; | ||||
| 		reg = <0xe1000 0x1000>; | ||||
| 		clock-frequency = <0>; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 
 | ||||
| 		sysclk: sysclk { | ||||
| 			#clock-cells = <0>; | ||||
| 			compatible = "fsl,qoriq-sysclk-1.0"; | ||||
| 			clock-output-names = "sysclk"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll0: pll0@800 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x800 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-1.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll0", "pll0-div2"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll1: pll1@820 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x820 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-1.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll1", "pll1-div2"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mux0: mux0@0 { | ||||
| 			#clock-cells = <0>; | ||||
| 			reg = <0x0 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-mux-1.0"; | ||||
| 			clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>; | ||||
| 			clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2"; | ||||
| 			clock-output-names = "cmux0"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mux1: mux1@20 { | ||||
| 			#clock-cells = <0>; | ||||
| 			reg = <0x20 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-mux-1.0"; | ||||
| 			clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>; | ||||
| 			clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2"; | ||||
| 			clock-output-names = "cmux1"; | ||||
| 		}; | ||||
| 	}; | ||||
| 
 | ||||
| 	rcpm: global-utilities@e2000 { | ||||
|  | ||||
| @ -297,53 +297,9 @@ | ||||
| 		#sleep-cells = <2>; | ||||
| 	}; | ||||
| 
 | ||||
| 	clockgen: global-utilities@e1000 { | ||||
| /include/ "qoriq-clockgen1.dtsi" | ||||
| 	global-utilities@e1000 { | ||||
| 		compatible = "fsl,p5040-clockgen", "fsl,qoriq-clockgen-1.0"; | ||||
| 		ranges = <0x0 0xe1000 0x1000>; | ||||
| 		reg = <0xe1000 0x1000>; | ||||
| 		clock-frequency = <0>; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 
 | ||||
| 		sysclk: sysclk { | ||||
| 			#clock-cells = <0>; | ||||
| 			compatible = "fsl,qoriq-sysclk-1.0"; | ||||
| 			clock-output-names = "sysclk"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll0: pll0@800 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x800 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-1.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll0", "pll0-div2"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll1: pll1@820 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x820 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-1.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll1", "pll1-div2"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mux0: mux0@0 { | ||||
| 			#clock-cells = <0>; | ||||
| 			reg = <0x0 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-mux-1.0"; | ||||
| 			clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>; | ||||
| 			clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2"; | ||||
| 			clock-output-names = "cmux0"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mux1: mux1@20 { | ||||
| 			#clock-cells = <0>; | ||||
| 			reg = <0x20 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-mux-1.0"; | ||||
| 			clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>; | ||||
| 			clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2"; | ||||
| 			clock-output-names = "cmux1"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mux2: mux2@40 { | ||||
| 			#clock-cells = <0>; | ||||
|  | ||||
							
								
								
									
										85
									
								
								arch/powerpc/boot/dts/fsl/qoriq-clockgen1.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								arch/powerpc/boot/dts/fsl/qoriq-clockgen1.dtsi
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,85 @@ | ||||
| /* | ||||
|  * QorIQ clock control device tree stub [ controller @ offset 0xe1000 ] | ||||
|  * | ||||
|  * Copyright 2014 Freescale Semiconductor Inc. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions are met: | ||||
|  *     * Redistributions of source code must retain the above copyright | ||||
|  *	 notice, this list of conditions and the following disclaimer. | ||||
|  *     * Redistributions in binary form must reproduce the above copyright | ||||
|  *	 notice, this list of conditions and the following disclaimer in the | ||||
|  *	 documentation and/or other materials provided with the distribution. | ||||
|  *     * Neither the name of Freescale Semiconductor nor the | ||||
|  *	 names of its contributors may be used to endorse or promote products | ||||
|  *	 derived from this software without specific prior written permission. | ||||
|  * | ||||
|  * | ||||
|  * ALTERNATIVELY, this software may be distributed under the terms of the | ||||
|  * GNU General Public License ("GPL") as published by the Free Software | ||||
|  * Foundation, either version 2 of that License or (at your option) any | ||||
|  * later version. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY | ||||
|  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
|  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
|  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY | ||||
|  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
|  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
|  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
|  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
|  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
|  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| global-utilities@e1000 { | ||||
| 	compatible = "fsl,qoriq-clockgen-1.0"; | ||||
| 	ranges = <0x0 0xe1000 0x1000>; | ||||
| 	reg = <0xe1000 0x1000>; | ||||
| 	clock-frequency = <0>; | ||||
| 	#address-cells = <1>; | ||||
| 	#size-cells = <1>; | ||||
| 
 | ||||
| 	sysclk: sysclk { | ||||
| 		#clock-cells = <0>; | ||||
| 		compatible = "fsl,qoriq-sysclk-1.0", "fixed-clock"; | ||||
| 		clock-output-names = "sysclk"; | ||||
| 	}; | ||||
| 	pll0: pll0@800 { | ||||
| 		#clock-cells = <1>; | ||||
| 		reg = <0x800 0x4>; | ||||
| 		compatible = "fsl,qoriq-core-pll-1.0"; | ||||
| 		clocks = <&sysclk>; | ||||
| 		clock-output-names = "pll0", "pll0-div2"; | ||||
| 	}; | ||||
| 	pll1: pll1@820 { | ||||
| 		#clock-cells = <1>; | ||||
| 		reg = <0x820 0x4>; | ||||
| 		compatible = "fsl,qoriq-core-pll-1.0"; | ||||
| 		clocks = <&sysclk>; | ||||
| 		clock-output-names = "pll1", "pll1-div2"; | ||||
| 	}; | ||||
| 	mux0: mux0@0 { | ||||
| 		#clock-cells = <0>; | ||||
| 		reg = <0x0 0x4>; | ||||
| 		compatible = "fsl,qoriq-core-mux-1.0"; | ||||
| 		clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>; | ||||
| 		clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2"; | ||||
| 		clock-output-names = "cmux0"; | ||||
| 	}; | ||||
| 	mux1: mux1@20 { | ||||
| 		#clock-cells = <0>; | ||||
| 		reg = <0x20 0x4>; | ||||
| 		compatible = "fsl,qoriq-core-mux-1.0"; | ||||
| 		clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>; | ||||
| 		clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2"; | ||||
| 		clock-output-names = "cmux1"; | ||||
| 	}; | ||||
| 	platform_pll: platform-pll@c00 { | ||||
| 		#clock-cells = <1>; | ||||
| 		reg = <0xc00 0x4>; | ||||
| 		compatible = "fsl,qoriq-platform-pll-1.0"; | ||||
| 		clocks = <&sysclk>; | ||||
| 		clock-output-names = "platform-pll", "platform-pll-div2"; | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										68
									
								
								arch/powerpc/boot/dts/fsl/qoriq-clockgen2.dtsi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								arch/powerpc/boot/dts/fsl/qoriq-clockgen2.dtsi
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,68 @@ | ||||
| /* | ||||
|  * QorIQ clock control device tree stub [ controller @ offset 0xe1000 ] | ||||
|  * | ||||
|  * Copyright 2014 Freescale Semiconductor Inc. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions are met: | ||||
|  *     * Redistributions of source code must retain the above copyright | ||||
|  *	 notice, this list of conditions and the following disclaimer. | ||||
|  *     * Redistributions in binary form must reproduce the above copyright | ||||
|  *	 notice, this list of conditions and the following disclaimer in the | ||||
|  *	 documentation and/or other materials provided with the distribution. | ||||
|  *     * Neither the name of Freescale Semiconductor nor the | ||||
|  *	 names of its contributors may be used to endorse or promote products | ||||
|  *	 derived from this software without specific prior written permission. | ||||
|  * | ||||
|  * | ||||
|  * ALTERNATIVELY, this software may be distributed under the terms of the | ||||
|  * GNU General Public License ("GPL") as published by the Free Software | ||||
|  * Foundation, either version 2 of that License or (at your option) any | ||||
|  * later version. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY | ||||
|  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
|  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
|  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY | ||||
|  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
|  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
|  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
|  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
|  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
|  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
| 
 | ||||
| global-utilities@e1000 { | ||||
| 	compatible = "fsl,qoriq-clockgen-2.0"; | ||||
| 	ranges = <0x0 0xe1000 0x1000>; | ||||
| 	reg = <0xe1000 0x1000>; | ||||
| 	#address-cells = <1>; | ||||
| 	#size-cells = <1>; | ||||
| 
 | ||||
| 	sysclk: sysclk { | ||||
| 		#clock-cells = <0>; | ||||
| 		compatible = "fsl,qoriq-sysclk-2.0", "fixed-clock"; | ||||
| 		clock-output-names = "sysclk"; | ||||
| 	}; | ||||
| 	pll0: pll0@800 { | ||||
| 		#clock-cells = <1>; | ||||
| 		reg = <0x800 0x4>; | ||||
| 		compatible = "fsl,qoriq-core-pll-2.0"; | ||||
| 		clocks = <&sysclk>; | ||||
| 		clock-output-names = "pll0", "pll0-div2", "pll0-div4"; | ||||
| 	}; | ||||
| 	pll1: pll1@820 { | ||||
| 		#clock-cells = <1>; | ||||
| 		reg = <0x820 0x4>; | ||||
| 		compatible = "fsl,qoriq-core-pll-2.0"; | ||||
| 		clocks = <&sysclk>; | ||||
| 		clock-output-names = "pll1", "pll1-div2", "pll1-div4"; | ||||
| 	}; | ||||
| 	platform_pll: platform-pll@c00 { | ||||
| 		#clock-cells = <1>; | ||||
| 		reg = <0xc00 0x4>; | ||||
| 		compatible = "fsl,qoriq-platform-pll-2.0"; | ||||
| 		clocks = <&sysclk>; | ||||
| 		clock-output-names = "platform-pll", "platform-pll-div2"; | ||||
| 	}; | ||||
| }; | ||||
| @ -281,35 +281,9 @@ | ||||
| 		fsl,liodn-bits = <12>; | ||||
| 	}; | ||||
| 
 | ||||
| 	clockgen: global-utilities@e1000 { | ||||
| /include/ "qoriq-clockgen2.dtsi" | ||||
| 	global-utilities@e1000 { | ||||
| 		compatible = "fsl,t1040-clockgen", "fsl,qoriq-clockgen-2.0"; | ||||
| 		ranges = <0x0 0xe1000 0x1000>; | ||||
| 		reg = <0xe1000 0x1000>; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 
 | ||||
| 		sysclk: sysclk { | ||||
| 			#clock-cells = <0>; | ||||
| 			compatible = "fsl,qoriq-sysclk-2.0"; | ||||
| 			clock-output-names = "sysclk", "fixed-clock"; | ||||
| 		}; | ||||
| 
 | ||||
| 
 | ||||
| 		pll0: pll0@800 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x800 4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-2.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll0", "pll0-div2", "pll0-div4"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll1: pll1@820 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x820 4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-2.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll1", "pll1-div2", "pll1-div4"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mux0: mux0@0 { | ||||
| 			#clock-cells = <0>; | ||||
|  | ||||
| @ -305,34 +305,9 @@ | ||||
| 		fsl,liodn-bits = <12>; | ||||
| 	}; | ||||
| 
 | ||||
| 	clockgen: global-utilities@e1000 { | ||||
| /include/ "qoriq-clockgen2.dtsi" | ||||
| 	global-utilities@e1000 { | ||||
| 		compatible = "fsl,t2080-clockgen", "fsl,qoriq-clockgen-2.0"; | ||||
| 		ranges = <0x0 0xe1000 0x1000>; | ||||
| 		reg = <0xe1000 0x1000>; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 
 | ||||
| 		sysclk: sysclk { | ||||
| 			#clock-cells = <0>; | ||||
| 			compatible = "fsl,qoriq-sysclk-2.0"; | ||||
| 			clock-output-names = "sysclk", "fixed-clock"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll0: pll0@800 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x800 4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-2.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll0", "pll0-div2", "pll0-div4"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll1: pll1@820 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x820 4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-2.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll1", "pll1-div2", "pll1-div4"; | ||||
| 		}; | ||||
| 
 | ||||
| 		mux0: mux0@0 { | ||||
| 			#clock-cells = <0>; | ||||
|  | ||||
| @ -368,34 +368,9 @@ | ||||
| 		fsl,liodn-bits = <12>; | ||||
| 	}; | ||||
| 
 | ||||
| 	clockgen: global-utilities@e1000 { | ||||
| /include/ "qoriq-clockgen2.dtsi" | ||||
| 	global-utilities@e1000 { | ||||
| 		compatible = "fsl,t4240-clockgen", "fsl,qoriq-clockgen-2.0"; | ||||
| 		ranges = <0x0 0xe1000 0x1000>; | ||||
| 		reg = <0xe1000 0x1000>; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 
 | ||||
| 		sysclk: sysclk { | ||||
| 			#clock-cells = <0>; | ||||
| 			compatible = "fsl,qoriq-sysclk-2.0"; | ||||
| 			clock-output-names = "sysclk"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll0: pll0@800 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x800 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-2.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll0", "pll0-div2", "pll0-div4"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll1: pll1@820 { | ||||
| 			#clock-cells = <1>; | ||||
| 			reg = <0x820 0x4>; | ||||
| 			compatible = "fsl,qoriq-core-pll-2.0"; | ||||
| 			clocks = <&sysclk>; | ||||
| 			clock-output-names = "pll1", "pll1-div2", "pll1-div4"; | ||||
| 		}; | ||||
| 
 | ||||
| 		pll2: pll2@840 { | ||||
| 			#clock-cells = <1>; | ||||
|  | ||||
| @ -98,6 +98,26 @@ | ||||
| 				reg = <0x68>; | ||||
| 				interrupts = <0x1 0x1 0 0>; | ||||
| 			}; | ||||
| 			ina220@40 { | ||||
| 				compatible = "ti,ina220"; | ||||
| 				reg = <0x40>; | ||||
| 				shunt-resistor = <1000>; | ||||
| 			}; | ||||
| 			ina220@41 { | ||||
| 				compatible = "ti,ina220"; | ||||
| 				reg = <0x41>; | ||||
| 				shunt-resistor = <1000>; | ||||
| 			}; | ||||
| 			ina220@44 { | ||||
| 				compatible = "ti,ina220"; | ||||
| 				reg = <0x44>; | ||||
| 				shunt-resistor = <1000>; | ||||
| 			}; | ||||
| 			ina220@45 { | ||||
| 				compatible = "ti,ina220"; | ||||
| 				reg = <0x45>; | ||||
| 				shunt-resistor = <1000>; | ||||
| 			}; | ||||
| 			adt7461@4c { | ||||
| 				compatible = "adi,adt7461"; | ||||
| 				reg = <0x4c>; | ||||
|  | ||||
| @ -98,6 +98,26 @@ | ||||
| 				reg = <0x68>; | ||||
| 				interrupts = <0x1 0x1 0 0>; | ||||
| 			}; | ||||
| 			ina220@40 { | ||||
| 				compatible = "ti,ina220"; | ||||
| 				reg = <0x40>; | ||||
| 				shunt-resistor = <1000>; | ||||
| 			}; | ||||
| 			ina220@41 { | ||||
| 				compatible = "ti,ina220"; | ||||
| 				reg = <0x41>; | ||||
| 				shunt-resistor = <1000>; | ||||
| 			}; | ||||
| 			ina220@44 { | ||||
| 				compatible = "ti,ina220"; | ||||
| 				reg = <0x44>; | ||||
| 				shunt-resistor = <1000>; | ||||
| 			}; | ||||
| 			ina220@45 { | ||||
| 				compatible = "ti,ina220"; | ||||
| 				reg = <0x45>; | ||||
| 				shunt-resistor = <1000>; | ||||
| 			}; | ||||
| 			adt7461@4c { | ||||
| 				compatible = "adi,adt7461"; | ||||
| 				reg = <0x4c>; | ||||
|  | ||||
| @ -95,6 +95,26 @@ | ||||
| 				reg = <0x68>; | ||||
| 				interrupts = <0x1 0x1 0 0>; | ||||
| 			}; | ||||
| 			ina220@40 { | ||||
| 				compatible = "ti,ina220"; | ||||
| 				reg = <0x40>; | ||||
| 				shunt-resistor = <1000>; | ||||
| 			}; | ||||
| 			ina220@41 { | ||||
| 				compatible = "ti,ina220"; | ||||
| 				reg = <0x41>; | ||||
| 				shunt-resistor = <1000>; | ||||
| 			}; | ||||
| 			ina220@44 { | ||||
| 				compatible = "ti,ina220"; | ||||
| 				reg = <0x44>; | ||||
| 				shunt-resistor = <1000>; | ||||
| 			}; | ||||
| 			ina220@45 { | ||||
| 				compatible = "ti,ina220"; | ||||
| 				reg = <0x45>; | ||||
| 				shunt-resistor = <1000>; | ||||
| 			}; | ||||
| 			adt7461@4c { | ||||
| 				compatible = "adi,adt7461"; | ||||
| 				reg = <0x4c>; | ||||
|  | ||||
| @ -83,6 +83,13 @@ | ||||
| 			}; | ||||
| 		}; | ||||
| 
 | ||||
| 		i2c@118000 { | ||||
| 			adt7461@4c { | ||||
| 				compatible = "adi,adt7461"; | ||||
| 				reg = <0x4c>; | ||||
| 			}; | ||||
| 		}; | ||||
| 
 | ||||
| 		i2c@118100 { | ||||
| 			pca9546@77 { | ||||
| 				compatible = "nxp,pca9546"; | ||||
|  | ||||
| @ -169,6 +169,17 @@ | ||||
| 						shunt-resistor = <1000>; | ||||
| 					}; | ||||
| 				}; | ||||
| 
 | ||||
| 				i2c@3 { | ||||
| 					#address-cells = <1>; | ||||
| 					#size-cells = <0>; | ||||
| 					reg = <0x3>; | ||||
| 
 | ||||
| 					adt7461@4c { | ||||
| 						compatible = "adi,adt7461"; | ||||
| 						reg = <0x4c>; | ||||
| 					}; | ||||
| 				}; | ||||
| 			}; | ||||
| 		}; | ||||
| 
 | ||||
|  | ||||
| @ -250,9 +250,9 @@ | ||||
| 		fsl,liodn-bits = <12>; | ||||
| 	}; | ||||
| 
 | ||||
| 	clockgen: global-utilities@e1000 { | ||||
| /include/ "fsl/qoriq-clockgen2.dtsi" | ||||
| 	global-utilities@e1000 { | ||||
| 		compatible = "fsl,t4240-clockgen", "fsl,qoriq-clockgen-2.0"; | ||||
| 		reg = <0xe1000 0x1000>; | ||||
| 	}; | ||||
| 
 | ||||
| /include/ "fsl/qoriq-dma-0.dtsi" | ||||
|  | ||||
| @ -144,6 +144,7 @@ CONFIG_RTC_DRV_DS1374=y | ||||
| CONFIG_RTC_DRV_DS3232=y | ||||
| CONFIG_UIO=y | ||||
| CONFIG_STAGING=y | ||||
| CONFIG_MEMORY=y | ||||
| CONFIG_VIRT_DRIVERS=y | ||||
| CONFIG_FSL_HV_MANAGER=y | ||||
| CONFIG_EXT2_FS=y | ||||
|  | ||||
| @ -118,6 +118,7 @@ CONFIG_FSL_DMA=y | ||||
| CONFIG_VIRT_DRIVERS=y | ||||
| CONFIG_FSL_HV_MANAGER=y | ||||
| CONFIG_FSL_CORENET_CF=y | ||||
| CONFIG_MEMORY=y | ||||
| CONFIG_EXT2_FS=y | ||||
| CONFIG_EXT3_FS=y | ||||
| CONFIG_ISO9660_FS=m | ||||
|  | ||||
| @ -215,6 +215,7 @@ CONFIG_RTC_DRV_DS3232=y | ||||
| CONFIG_RTC_DRV_CMOS=y | ||||
| CONFIG_DMADEVICES=y | ||||
| CONFIG_FSL_DMA=y | ||||
| CONFIG_MEMORY=y | ||||
| # CONFIG_NET_DMA is not set | ||||
| CONFIG_EXT2_FS=y | ||||
| CONFIG_EXT3_FS=y | ||||
|  | ||||
| @ -216,6 +216,7 @@ CONFIG_RTC_DRV_DS3232=y | ||||
| CONFIG_RTC_DRV_CMOS=y | ||||
| CONFIG_DMADEVICES=y | ||||
| CONFIG_FSL_DMA=y | ||||
| CONFIG_MEMORY=y | ||||
| # CONFIG_NET_DMA is not set | ||||
| CONFIG_EXT2_FS=y | ||||
| CONFIG_EXT3_FS=y | ||||
|  | ||||
| @ -68,7 +68,10 @@ struct ccsr_guts { | ||||
| 	u8	res0b4[0xc0 - 0xb4]; | ||||
| 	__be32  iovselsr;	/* 0x.00c0 - I/O voltage select status register
 | ||||
| 					     Called 'elbcvselcr' on 86xx SOCs */ | ||||
| 	u8	res0c4[0x224 - 0xc4]; | ||||
| 	u8	res0c4[0x100 - 0xc4]; | ||||
| 	__be32	rcwsr[16];	/* 0x.0100 - Reset Control Word Status registers
 | ||||
| 					     There are 16 registers */ | ||||
| 	u8	res140[0x224 - 0x140]; | ||||
| 	__be32  iodelay1;	/* 0x.0224 - IO delay control register 1 */ | ||||
| 	__be32  iodelay2;	/* 0x.0228 - IO delay control register 2 */ | ||||
| 	u8	res22c[0x604 - 0x22c]; | ||||
|  | ||||
| @ -56,6 +56,7 @@ | ||||
|  * additional information from the MI_EPN, and MI_TWC registers. | ||||
|  */ | ||||
| #define SPRN_MI_RPN	790 | ||||
| #define MI_SPS16K	0x00000008	/* Small page size (0 = 4k, 1 = 16k) */ | ||||
| 
 | ||||
| /* Define an RPN value for mapping kernel memory to large virtual
 | ||||
|  * pages for boot initialization.  This has real page number of 0, | ||||
| @ -129,6 +130,7 @@ | ||||
|  * additional information from the MD_EPN, and MD_TWC registers. | ||||
|  */ | ||||
| #define SPRN_MD_RPN	798 | ||||
| #define MD_SPS16K	0x00000008	/* Small page size (0 = 4k, 1 = 16k) */ | ||||
| 
 | ||||
| /* This is a temporary storage register that could be used to save
 | ||||
|  * a processor working register during a tablewalk. | ||||
|  | ||||
| @ -170,6 +170,25 @@ static inline unsigned long pte_update(pte_t *p, | ||||
| #ifdef PTE_ATOMIC_UPDATES | ||||
| 	unsigned long old, tmp; | ||||
| 
 | ||||
| #ifdef CONFIG_PPC_8xx | ||||
| 	unsigned long tmp2; | ||||
| 
 | ||||
| 	__asm__ __volatile__("\
 | ||||
| 1:	lwarx	%0,0,%4\n\ | ||||
| 	andc	%1,%0,%5\n\ | ||||
| 	or	%1,%1,%6\n\ | ||||
| 	/* 0x200 == Extended encoding, bit 22 */ \ | ||||
| 	/* Bit 22 has to be 1 if neither _PAGE_USER nor _PAGE_RW are set */ \ | ||||
| 	rlwimi	%1,%1,32-2,0x200\n /* get _PAGE_USER */ \ | ||||
| 	rlwinm	%3,%1,32-1,0x200\n /* get _PAGE_RW */ \ | ||||
| 	or	%1,%3,%1\n\ | ||||
| 	xori	%1,%1,0x200\n" | ||||
| "	stwcx.	%1,0,%4\n\
 | ||||
| 	bne-	1b" | ||||
| 	: "=&r" (old), "=&r" (tmp), "=m" (*p), "=&r" (tmp2) | ||||
| 	: "r" (p), "r" (clr), "r" (set), "m" (*p) | ||||
| 	: "cc" ); | ||||
| #else /* CONFIG_PPC_8xx */ | ||||
| 	__asm__ __volatile__("\
 | ||||
| 1:	lwarx	%0,0,%3\n\ | ||||
| 	andc	%1,%0,%4\n\ | ||||
| @ -180,6 +199,7 @@ static inline unsigned long pte_update(pte_t *p, | ||||
| 	: "=&r" (old), "=&r" (tmp), "=m" (*p) | ||||
| 	: "r" (p), "r" (clr), "r" (set), "m" (*p) | ||||
| 	: "cc" ); | ||||
| #endif /* CONFIG_PPC_8xx */ | ||||
| #else /* PTE_ATOMIC_UPDATES */ | ||||
| 	unsigned long old = pte_val(*p); | ||||
| 	*p = __pte((old & ~clr) | set); | ||||
|  | ||||
| @ -48,19 +48,22 @@ | ||||
|  */ | ||||
| #define _PAGE_RW	0x0400	/* lsb PP bits, inverted in HW */ | ||||
| #define _PAGE_USER	0x0800	/* msb PP bits */ | ||||
| /* set when neither _PAGE_USER nor _PAGE_RW are set */ | ||||
| #define _PAGE_KNLRO	0x0200 | ||||
| 
 | ||||
| #define _PMD_PRESENT	0x0001 | ||||
| #define _PMD_BAD	0x0ff0 | ||||
| #define _PMD_PAGE_MASK	0x000c | ||||
| #define _PMD_PAGE_8M	0x000c | ||||
| 
 | ||||
| #define _PTE_NONE_MASK _PAGE_ACCESSED | ||||
| #define _PTE_NONE_MASK _PAGE_KNLRO | ||||
| 
 | ||||
| /* Until my rework is finished, 8xx still needs atomic PTE updates */ | ||||
| #define PTE_ATOMIC_UPDATES	1 | ||||
| 
 | ||||
| /* We need to add _PAGE_SHARED to kernel pages */ | ||||
| #define _PAGE_KERNEL_RO	(_PAGE_SHARED) | ||||
| #define _PAGE_KERNEL_RO	(_PAGE_SHARED | _PAGE_KNLRO) | ||||
| #define _PAGE_KERNEL_ROX	(_PAGE_EXEC | _PAGE_KNLRO) | ||||
| #define _PAGE_KERNEL_RW	(_PAGE_DIRTY | _PAGE_RW | _PAGE_HWWRITE) | ||||
| 
 | ||||
| #endif /* __KERNEL__ */ | ||||
|  | ||||
| @ -33,13 +33,31 @@ | ||||
| 
 | ||||
| /* Macro to make the code more readable. */ | ||||
| #ifdef CONFIG_8xx_CPU6 | ||||
| #define DO_8xx_CPU6(val, reg)	\ | ||||
| 	li	reg, val;	\
 | ||||
| 	stw	reg, 12(r0);	\
 | ||||
| 	lwz	reg, 12(r0);
 | ||||
| #define SPRN_MI_TWC_ADDR	0x2b80 | ||||
| #define SPRN_MI_RPN_ADDR	0x2d80 | ||||
| #define SPRN_MD_TWC_ADDR	0x3b80 | ||||
| #define SPRN_MD_RPN_ADDR	0x3d80 | ||||
| 
 | ||||
| #define MTSPR_CPU6(spr, reg, treg)	\ | ||||
| 	li	treg, spr##_ADDR;	\ | ||||
| 	stw	treg, 12(r0);		\
 | ||||
| 	lwz	treg, 12(r0);		\
 | ||||
| 	mtspr	spr, reg | ||||
| #else | ||||
| #define DO_8xx_CPU6(val, reg) | ||||
| #define MTSPR_CPU6(spr, reg, treg)	\ | ||||
| 	mtspr	spr, reg | ||||
| #endif | ||||
| 
 | ||||
| /* | ||||
|  * Value for the bits that have fixed value in RPN entries. | ||||
|  * Also used for tagging DAR for DTLBerror. | ||||
|  */ | ||||
| #ifdef CONFIG_PPC_16K_PAGES | ||||
| #define RPN_PATTERN	(0x00f0 | MD_SPS16K) | ||||
| #else | ||||
| #define RPN_PATTERN	0x00f0 | ||||
| #endif | ||||
| 
 | ||||
| 	__HEAD | ||||
| _ENTRY(_stext);
 | ||||
| _ENTRY(_start);
 | ||||
| @ -65,13 +83,6 @@ _ENTRY(_start); | ||||
|  * 8M 1:1.  I also mapped an additional I/O space 1:1 so we can get to | ||||
|  * the "internal" processor registers before MMU_init is called. | ||||
|  * | ||||
|  * The TLB code currently contains a major hack.  Since I use the condition | ||||
|  * code register, I have to save and restore it.  I am out of registers, so | ||||
|  * I just store it in memory location 0 (the TLB handlers are not reentrant). | ||||
|  * To avoid making any decisions, I need to use the "segment" valid bit | ||||
|  * in the first level table, but that would require many changes to the | ||||
|  * Linux page directory/table functions that I don't want to do right now. | ||||
|  * | ||||
|  *	-- Dan | ||||
|  */ | ||||
| 	.globl	__start
 | ||||
| @ -211,7 +222,7 @@ MachineCheck: | ||||
| 	EXCEPTION_PROLOG | ||||
| 	mfspr r4,SPRN_DAR | ||||
| 	stw r4,_DAR(r11) | ||||
| 	li r5,0x00f0 | ||||
| 	li r5,RPN_PATTERN | ||||
| 	mtspr SPRN_DAR,r5	/* Tag DAR, to be used in DTLB Error */ | ||||
| 	mfspr r5,SPRN_DSISR | ||||
| 	stw r5,_DSISR(r11) | ||||
| @ -219,30 +230,16 @@ MachineCheck: | ||||
| 	EXC_XFER_STD(0x200, machine_check_exception) | ||||
| 
 | ||||
| /* Data access exception. | ||||
|  * This is "never generated" by the MPC8xx.  We jump to it for other | ||||
|  * translation errors. | ||||
|  * This is "never generated" by the MPC8xx. | ||||
|  */ | ||||
| 	. = 0x300 | ||||
| DataAccess: | ||||
| 	EXCEPTION_PROLOG | ||||
| 	mfspr	r10,SPRN_DSISR | ||||
| 	stw	r10,_DSISR(r11) | ||||
| 	mr	r5,r10 | ||||
| 	mfspr	r4,SPRN_DAR | ||||
| 	li	r10,0x00f0 | ||||
| 	mtspr	SPRN_DAR,r10	/* Tag DAR, to be used in DTLB Error */ | ||||
| 	EXC_XFER_LITE(0x300, handle_page_fault) | ||||
| 
 | ||||
| /* Instruction access exception. | ||||
|  * This is "never generated" by the MPC8xx.  We jump to it for other | ||||
|  * translation errors. | ||||
|  * This is "never generated" by the MPC8xx. | ||||
|  */ | ||||
| 	. = 0x400 | ||||
| InstructionAccess: | ||||
| 	EXCEPTION_PROLOG | ||||
| 	mr	r4,r12 | ||||
| 	mr	r5,r9 | ||||
| 	EXC_XFER_LITE(0x400, handle_page_fault) | ||||
| 
 | ||||
| /* External interrupt */ | ||||
| 	EXCEPTION(0x500, HardwareInterrupt, do_IRQ, EXC_XFER_LITE) | ||||
| @ -253,7 +250,7 @@ Alignment: | ||||
| 	EXCEPTION_PROLOG | ||||
| 	mfspr	r4,SPRN_DAR | ||||
| 	stw	r4,_DAR(r11) | ||||
| 	li	r5,0x00f0 | ||||
| 	li	r5,RPN_PATTERN | ||||
| 	mtspr	SPRN_DAR,r5	/* Tag DAR, to be used in DTLB Error */ | ||||
| 	mfspr	r5,SPRN_DSISR | ||||
| 	stw	r5,_DSISR(r11) | ||||
| @ -292,8 +289,8 @@ SystemCall: | ||||
| 	. = 0x1100 | ||||
| /* | ||||
|  * For the MPC8xx, this is a software tablewalk to load the instruction | ||||
|  * TLB.  It is modelled after the example in the Motorola manual.  The task | ||||
|  * switch loads the M_TWB register with the pointer to the first level table. | ||||
|  * TLB.  The task switch loads the M_TW register with the pointer to the first | ||||
|  * level table. | ||||
|  * If we discover there is no second level table (value is zero) or if there | ||||
|  * is an invalid pte, we load that into the TLB, which causes another fault | ||||
|  * into the TLB Error interrupt where we can handle such problems. | ||||
| @ -302,20 +299,17 @@ SystemCall: | ||||
|  */ | ||||
| InstructionTLBMiss: | ||||
| #ifdef CONFIG_8xx_CPU6 | ||||
| 	stw	r3, 8(r0) | ||||
| 	mtspr	SPRN_DAR, r3 | ||||
| #endif | ||||
| 	EXCEPTION_PROLOG_0 | ||||
| 	mtspr	SPRN_SPRG_SCRATCH2, r10 | ||||
| 	mfspr	r10, SPRN_SRR0	/* Get effective address of fault */ | ||||
| #ifdef CONFIG_8xx_CPU15 | ||||
| 	addi	r11, r10, 0x1000 | ||||
| 	addi	r11, r10, PAGE_SIZE | ||||
| 	tlbie	r11 | ||||
| 	addi	r11, r10, -0x1000 | ||||
| 	addi	r11, r10, -PAGE_SIZE | ||||
| 	tlbie	r11 | ||||
| #endif | ||||
| 	DO_8xx_CPU6(0x3780, r3) | ||||
| 	mtspr	SPRN_MD_EPN, r10	/* Have to use MD_EPN for walk, MI_EPN can't */ | ||||
| 	mfspr	r10, SPRN_M_TWB	/* Get level 1 table entry address */ | ||||
| 
 | ||||
| 	/* If we are faulting a kernel address, we have to use the | ||||
| 	 * kernel page tables. | ||||
| @ -323,32 +317,37 @@ InstructionTLBMiss: | ||||
| #ifdef CONFIG_MODULES | ||||
| 	/* Only modules will cause ITLB Misses as we always | ||||
| 	 * pin the first 8MB of kernel memory */ | ||||
| 	andi.	r11, r10, 0x0800	/* Address >= 0x80000000 */ | ||||
| 	andis.	r11, r10, 0x8000	/* Address >= 0x80000000 */ | ||||
| #endif | ||||
| 	mfspr	r11, SPRN_M_TW	/* Get level 1 table base address */ | ||||
| #ifdef CONFIG_MODULES | ||||
| 	beq	3f | ||||
| 	lis	r11, swapper_pg_dir@h
 | ||||
| 	ori	r11, r11, swapper_pg_dir@l
 | ||||
| 	rlwimi	r10, r11, 0, 2, 19 | ||||
| 	lis	r11, (swapper_pg_dir-PAGE_OFFSET)@h
 | ||||
| 	ori	r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
 | ||||
| 3: | ||||
| #endif | ||||
| 	lwz	r11, 0(r10)	/* Get the level 1 entry */ | ||||
| 	/* Extract level 1 index */ | ||||
| 	rlwinm	r10, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29 | ||||
| 	lwzx	r11, r10, r11	/* Get the level 1 entry */ | ||||
| 	rlwinm.	r10, r11,0,0,19	/* Extract page descriptor page address */ | ||||
| 	beq	2f		/* If zero, don't try to find a pte */ | ||||
| 
 | ||||
| 	/* We have a pte table, so load the MI_TWC with the attributes | ||||
| 	 * for this "segment." | ||||
| 	 */ | ||||
| 	ori	r11,r11,1		/* Set valid bit */ | ||||
| 	DO_8xx_CPU6(0x2b80, r3) | ||||
| 	mtspr	SPRN_MI_TWC, r11	/* Set segment attributes */ | ||||
| 	DO_8xx_CPU6(0x3b80, r3) | ||||
| 	mtspr	SPRN_MD_TWC, r11	/* Load pte table base address */ | ||||
| 	mfspr	r11, SPRN_MD_TWC	/* ....and get the pte address */ | ||||
| 	lwz	r10, 0(r11)	/* Get the pte */ | ||||
| 	MTSPR_CPU6(SPRN_MI_TWC, r11, r3)	/* Set segment attributes */ | ||||
| 	mfspr	r11, SPRN_SRR0	/* Get effective address of fault */ | ||||
| 	/* Extract level 2 index */ | ||||
| 	rlwinm	r11, r11, 32 - (PAGE_SHIFT - 2), 32 - PAGE_SHIFT, 29 | ||||
| 	lwzx	r10, r10, r11	/* Get the pte */ | ||||
| 
 | ||||
| #ifdef CONFIG_SWAP | ||||
| 	andi.	r11, r10, _PAGE_ACCESSED | _PAGE_PRESENT | ||||
| 	cmpwi	cr0, r11, _PAGE_ACCESSED | _PAGE_PRESENT | ||||
| 	li	r11, RPN_PATTERN | ||||
| 	bne-	cr0, 2f | ||||
| #else | ||||
| 	li	r11, RPN_PATTERN | ||||
| #endif | ||||
| 	/* The Linux PTE won't go exactly into the MMU TLB. | ||||
| 	 * Software indicator bits 21 and 28 must be clear. | ||||
| @ -356,62 +355,63 @@ InstructionTLBMiss: | ||||
| 	 * set.  All other Linux PTE bits control the behavior | ||||
| 	 * of the MMU. | ||||
| 	 */ | ||||
| 	li	r11, 0x00f0 | ||||
| 	rlwimi	r10, r11, 0, 0x07f8	/* Set 24-27, clear 21-23,28 */ | ||||
| 	DO_8xx_CPU6(0x2d80, r3) | ||||
| 	mtspr	SPRN_MI_RPN, r10	/* Update TLB entry */ | ||||
| 	MTSPR_CPU6(SPRN_MI_RPN, r10, r3)	/* Update TLB entry */ | ||||
| 
 | ||||
| 	/* Restore registers */ | ||||
| #ifdef CONFIG_8xx_CPU6 | ||||
| 	lwz	r3, 8(r0) | ||||
| 	mfspr	r3, SPRN_DAR | ||||
| 	mtspr	SPRN_DAR, r11	/* Tag DAR */ | ||||
| #endif | ||||
| 	mfspr	r10, SPRN_SPRG_SCRATCH2 | ||||
| 	EXCEPTION_EPILOG_0 | ||||
| 	rfi | ||||
| 2: | ||||
| 	mfspr	r11, SPRN_SRR1 | ||||
| 	mfspr	r10, SPRN_SRR1 | ||||
| 	/* clear all error bits as TLB Miss | ||||
| 	 * sets a few unconditionally | ||||
| 	*/ | ||||
| 	rlwinm	r11, r11, 0, 0xffff | ||||
| 	mtspr	SPRN_SRR1, r11 | ||||
| 	rlwinm	r10, r10, 0, 0xffff | ||||
| 	mtspr	SPRN_SRR1, r10 | ||||
| 
 | ||||
| 	/* Restore registers */ | ||||
| #ifdef CONFIG_8xx_CPU6 | ||||
| 	lwz	r3, 8(r0) | ||||
| 	mfspr	r3, SPRN_DAR | ||||
| 	mtspr	SPRN_DAR, r11	/* Tag DAR */ | ||||
| #endif | ||||
| 	mfspr	r10, SPRN_SPRG_SCRATCH2 | ||||
| 	EXCEPTION_EPILOG_0 | ||||
| 	b	InstructionAccess | ||||
| 	b	InstructionTLBError1 | ||||
| 
 | ||||
| 	. = 0x1200 | ||||
| DataStoreTLBMiss: | ||||
| #ifdef CONFIG_8xx_CPU6 | ||||
| 	stw	r3, 8(r0) | ||||
| 	mtspr	SPRN_DAR, r3 | ||||
| #endif | ||||
| 	EXCEPTION_PROLOG_0 | ||||
| 	mtspr	SPRN_SPRG_SCRATCH2, r10 | ||||
| 	mfspr	r10, SPRN_M_TWB	/* Get level 1 table entry address */ | ||||
| 	mfspr	r10, SPRN_MD_EPN | ||||
| 
 | ||||
| 	/* If we are faulting a kernel address, we have to use the | ||||
| 	 * kernel page tables. | ||||
| 	 */ | ||||
| 	andi.	r11, r10, 0x0800 | ||||
| 	andis.	r11, r10, 0x8000 | ||||
| 	mfspr	r11, SPRN_M_TW	/* Get level 1 table base address */ | ||||
| 	beq	3f | ||||
| 	lis	r11, swapper_pg_dir@h
 | ||||
| 	ori	r11, r11, swapper_pg_dir@l
 | ||||
| 	rlwimi	r10, r11, 0, 2, 19 | ||||
| 	lis	r11, (swapper_pg_dir-PAGE_OFFSET)@h
 | ||||
| 	ori	r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
 | ||||
| 3: | ||||
| 	lwz	r11, 0(r10)	/* Get the level 1 entry */ | ||||
| 	/* Extract level 1 index */ | ||||
| 	rlwinm	r10, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29 | ||||
| 	lwzx	r11, r10, r11	/* Get the level 1 entry */ | ||||
| 	rlwinm.	r10, r11,0,0,19	/* Extract page descriptor page address */ | ||||
| 	beq	2f		/* If zero, don't try to find a pte */ | ||||
| 
 | ||||
| 	/* We have a pte table, so load fetch the pte from the table. | ||||
| 	 */ | ||||
| 	ori	r11, r11, 1	/* Set valid bit in physical L2 page */ | ||||
| 	DO_8xx_CPU6(0x3b80, r3) | ||||
| 	mtspr	SPRN_MD_TWC, r11	/* Load pte table base address */ | ||||
| 	mfspr	r10, SPRN_MD_TWC	/* ....and get the pte address */ | ||||
| 	mfspr	r10, SPRN_MD_EPN	/* Get address of fault */ | ||||
| 	/* Extract level 2 index */ | ||||
| 	rlwinm	r10, r10, 32 - (PAGE_SHIFT - 2), 32 - PAGE_SHIFT, 29 | ||||
| 	rlwimi	r10, r11, 0, 0, 32 - PAGE_SHIFT - 1	/* Add level 2 base */ | ||||
| 	lwz	r10, 0(r10)	/* Get the pte */ | ||||
| 
 | ||||
| 	/* Insert the Guarded flag into the TWC from the Linux PTE. | ||||
| @ -425,8 +425,7 @@ DataStoreTLBMiss: | ||||
| 	 * It is bit 25 in the Linux PTE and bit 30 in the TWC | ||||
| 	 */ | ||||
| 	rlwimi	r11, r10, 32-5, 30, 30 | ||||
| 	DO_8xx_CPU6(0x3b80, r3) | ||||
| 	mtspr	SPRN_MD_TWC, r11 | ||||
| 	MTSPR_CPU6(SPRN_MD_TWC, r11, r3) | ||||
| 
 | ||||
| 	/* Both _PAGE_ACCESSED and _PAGE_PRESENT has to be set. | ||||
| 	 * We also need to know if the insn is a load/store, so: | ||||
| @ -442,14 +441,8 @@ DataStoreTLBMiss: | ||||
| 	and	r11, r11, r10 | ||||
| 	rlwimi	r10, r11, 0, _PAGE_PRESENT | ||||
| #endif | ||||
| 	/* Honour kernel RO, User NA */ | ||||
| 	/* 0x200 == Extended encoding, bit 22 */ | ||||
| 	rlwimi	r10, r10, 32-2, 0x200 /* Copy USER to bit 22, 0x200 */ | ||||
| 	/* r11 =  (r10 & _PAGE_RW) >> 1 */ | ||||
| 	rlwinm	r11, r10, 32-1, 0x200 | ||||
| 	or	r10, r11, r10 | ||||
| 	/* invert RW and 0x200 bits */ | ||||
| 	xori	r10, r10, _PAGE_RW | 0x200 | ||||
| 	/* invert RW */ | ||||
| 	xori	r10, r10, _PAGE_RW | ||||
| 
 | ||||
| 	/* The Linux PTE won't go exactly into the MMU TLB. | ||||
| 	 * Software indicator bits 22 and 28 must be clear. | ||||
| @ -457,14 +450,13 @@ DataStoreTLBMiss: | ||||
| 	 * set.  All other Linux PTE bits control the behavior | ||||
| 	 * of the MMU. | ||||
| 	 */ | ||||
| 2:	li	r11, 0x00f0 | ||||
| 2:	li	r11, RPN_PATTERN | ||||
| 	rlwimi	r10, r11, 0, 24, 28	/* Set 24-27, clear 28 */ | ||||
| 	DO_8xx_CPU6(0x3d80, r3) | ||||
| 	mtspr	SPRN_MD_RPN, r10	/* Update TLB entry */ | ||||
| 	MTSPR_CPU6(SPRN_MD_RPN, r10, r3)	/* Update TLB entry */ | ||||
| 
 | ||||
| 	/* Restore registers */ | ||||
| #ifdef CONFIG_8xx_CPU6 | ||||
| 	lwz	r3, 8(r0) | ||||
| 	mfspr	r3, SPRN_DAR | ||||
| #endif | ||||
| 	mtspr	SPRN_DAR, r11	/* Tag DAR */ | ||||
| 	mfspr	r10, SPRN_SPRG_SCRATCH2 | ||||
| @ -477,7 +469,17 @@ DataStoreTLBMiss: | ||||
|  */ | ||||
| 	. = 0x1300 | ||||
| InstructionTLBError: | ||||
| 	b	InstructionAccess | ||||
| 	EXCEPTION_PROLOG_0 | ||||
| InstructionTLBError1: | ||||
| 	EXCEPTION_PROLOG_1 | ||||
| 	EXCEPTION_PROLOG_2 | ||||
| 	mr	r4,r12 | ||||
| 	mr	r5,r9 | ||||
| 	andis.	r10,r5,0x4000 | ||||
| 	beq+	1f | ||||
| 	tlbie	r4 | ||||
| 	/* 0x400 is InstructionAccess exception, needed by bad_page_fault() */ | ||||
| 1:	EXC_XFER_LITE(0x400, handle_page_fault) | ||||
| 
 | ||||
| /* This is the data TLB error on the MPC8xx.  This could be due to | ||||
|  * many reasons, including a dirty update to a pte.  We bail out to | ||||
| @ -488,11 +490,21 @@ DataTLBError: | ||||
| 	EXCEPTION_PROLOG_0 | ||||
| 
 | ||||
| 	mfspr	r11, SPRN_DAR | ||||
| 	cmpwi	cr0, r11, 0x00f0 | ||||
| 	cmpwi	cr0, r11, RPN_PATTERN | ||||
| 	beq-	FixupDAR	/* must be a buggy dcbX, icbi insn. */ | ||||
| DARFixed:/* Return from dcbx instruction bug workaround */ | ||||
| 	EXCEPTION_EPILOG_0 | ||||
| 	b	DataAccess | ||||
| 	EXCEPTION_PROLOG_1 | ||||
| 	EXCEPTION_PROLOG_2 | ||||
| 	mfspr	r5,SPRN_DSISR | ||||
| 	stw	r5,_DSISR(r11) | ||||
| 	mfspr	r4,SPRN_DAR | ||||
| 	andis.	r10,r5,0x4000 | ||||
| 	beq+	1f | ||||
| 	tlbie	r4 | ||||
| 1:	li	r10,RPN_PATTERN | ||||
| 	mtspr	SPRN_DAR,r10	/* Tag DAR, to be used in DTLB Error */ | ||||
| 	/* 0x300 is DataAccess exception, needed by bad_page_fault() */ | ||||
| 	EXC_XFER_LITE(0x300, handle_page_fault) | ||||
| 
 | ||||
| 	EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_EE) | ||||
| 	EXCEPTION(0x1600, Trap_16, unknown_exception, EXC_XFER_EE) | ||||
| @ -521,29 +533,30 @@ DARFixed:/* Return from dcbx instruction bug workaround */ | ||||
| #define NO_SELF_MODIFYING_CODE | ||||
| FixupDAR:/* Entry point for dcbx workaround. */ | ||||
| #ifdef CONFIG_8xx_CPU6 | ||||
| 	stw	r3, 8(r0) | ||||
| 	mtspr	SPRN_DAR, r3 | ||||
| #endif | ||||
| 	mtspr	SPRN_SPRG_SCRATCH2, r10 | ||||
| 	/* fetch instruction from memory. */ | ||||
| 	mfspr	r10, SPRN_SRR0 | ||||
| 	andis.	r11, r10, 0x8000	/* Address >= 0x80000000 */ | ||||
| 	DO_8xx_CPU6(0x3780, r3) | ||||
| 	mtspr	SPRN_MD_EPN, r10 | ||||
| 	mfspr	r11, SPRN_M_TWB	/* Get level 1 table entry address */ | ||||
| 	mfspr	r11, SPRN_M_TW	/* Get level 1 table base address */ | ||||
| 	beq-	3f		/* Branch if user space */ | ||||
| 	lis	r11, (swapper_pg_dir-PAGE_OFFSET)@h
 | ||||
| 	ori	r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
 | ||||
| 	rlwimi	r11, r10, 32-20, 0xffc /* r11 = r11&~0xffc|(r10>>20)&0xffc */ | ||||
| 3:	lwz	r11, 0(r11)	/* Get the level 1 entry */ | ||||
| 	DO_8xx_CPU6(0x3b80, r3) | ||||
| 	mtspr	SPRN_MD_TWC, r11	/* Load pte table base address */ | ||||
| 	mfspr	r11, SPRN_MD_TWC	/* ....and get the pte address */ | ||||
| 	lwz	r11, 0(r11)	/* Get the pte */ | ||||
| 	/* Extract level 1 index */ | ||||
| 3:	rlwinm	r10, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29 | ||||
| 	lwzx	r11, r10, r11	/* Get the level 1 entry */ | ||||
| 	rlwinm	r10, r11,0,0,19	/* Extract page descriptor page address */ | ||||
| 	mfspr	r11, SPRN_SRR0	/* Get effective address of fault */ | ||||
| 	/* Extract level 2 index */ | ||||
| 	rlwinm	r11, r11, 32 - (PAGE_SHIFT - 2), 32 - PAGE_SHIFT, 29 | ||||
| 	lwzx	r11, r10, r11	/* Get the pte */ | ||||
| #ifdef CONFIG_8xx_CPU6 | ||||
| 	lwz	r3, 8(r0)	/* restore r3 from memory */ | ||||
| 	mfspr	r3, SPRN_DAR | ||||
| #endif | ||||
| 	/* concat physical page address(r11) and page offset(r10) */ | ||||
| 	rlwimi	r11, r10, 0, 20, 31 | ||||
| 	mfspr	r10, SPRN_SRR0 | ||||
| 	rlwimi	r11, r10, 0, 32 - PAGE_SHIFT, 31 | ||||
| 	lwz	r11,0(r11) | ||||
| /* Check if it really is a dcbx instruction. */ | ||||
| /* dcbt and dcbtst does not generate DTLB Misses/Errors, | ||||
| @ -698,11 +711,11 @@ start_here: | ||||
| #ifdef CONFIG_8xx_CPU6 | ||||
| 	lis	r4, cpu6_errata_word@h
 | ||||
| 	ori	r4, r4, cpu6_errata_word@l
 | ||||
| 	li	r3, 0x3980 | ||||
| 	li	r3, 0x3f80 | ||||
| 	stw	r3, 12(r4) | ||||
| 	lwz	r3, 12(r4) | ||||
| #endif | ||||
| 	mtspr	SPRN_M_TWB, r6 | ||||
| 	mtspr	SPRN_M_TW, r6 | ||||
| 	lis	r4,2f@h
 | ||||
| 	ori	r4,r4,2f@l
 | ||||
| 	tophys(r4,r4) | ||||
| @ -876,10 +889,10 @@ _GLOBAL(set_context) | ||||
| 	lis	r6, cpu6_errata_word@h
 | ||||
| 	ori	r6, r6, cpu6_errata_word@l
 | ||||
| 	tophys	(r4, r4) | ||||
| 	li	r7, 0x3980 | ||||
| 	li	r7, 0x3f80 | ||||
| 	stw	r7, 12(r6) | ||||
| 	lwz	r7, 12(r6) | ||||
|         mtspr   SPRN_M_TWB, r4               /* Update MMU base address */ | ||||
|         mtspr   SPRN_M_TW, r4               /* Update MMU base address */ | ||||
| 	li	r7, 0x3380 | ||||
| 	stw	r7, 12(r6) | ||||
| 	lwz	r7, 12(r6) | ||||
| @ -887,7 +900,7 @@ _GLOBAL(set_context) | ||||
| #else | ||||
|         mtspr   SPRN_M_CASID,r3		/* Update context */ | ||||
| 	tophys	(r4, r4) | ||||
| 	mtspr	SPRN_M_TWB, r4		/* and pgd */ | ||||
| 	mtspr	SPRN_M_TW, r4		/* and pgd */ | ||||
| #endif | ||||
| 	SYNC | ||||
| 	blr | ||||
| @ -919,12 +932,13 @@ set_dec_cpu6: | ||||
| 	.globl	sdata
 | ||||
| sdata: | ||||
| 	.globl	empty_zero_page
 | ||||
| 	.align	PAGE_SHIFT
 | ||||
| empty_zero_page: | ||||
| 	.space	4096
 | ||||
| 	.space	PAGE_SIZE
 | ||||
| 
 | ||||
| 	.globl	swapper_pg_dir
 | ||||
| swapper_pg_dir: | ||||
| 	.space	4096
 | ||||
| 	.space	PGD_TABLE_SIZE
 | ||||
| 
 | ||||
| /* Room for two PTE table poiners, usually the kernel and current user | ||||
|  * pointer to their respective root page table (pgdir). | ||||
|  | ||||
| @ -43,7 +43,6 @@ | ||||
| #include <asm/tlbflush.h> | ||||
| #include <asm/siginfo.h> | ||||
| #include <asm/debug.h> | ||||
| #include <mm/mmu_decl.h> | ||||
| 
 | ||||
| #include "icswx.h" | ||||
| 
 | ||||
| @ -380,12 +379,6 @@ good_area: | ||||
| 		goto bad_area; | ||||
| #endif /* CONFIG_6xx */ | ||||
| #if defined(CONFIG_8xx) | ||||
| 	/* 8xx sometimes need to load a invalid/non-present TLBs.
 | ||||
| 	 * These must be invalidated separately as linux mm don't. | ||||
| 	 */ | ||||
| 	if (error_code & 0x40000000) /* no translation? */ | ||||
| 		_tlbil_va(address, 0, 0, 0); | ||||
| 
 | ||||
|         /* The MPC8xx seems to always set 0x80000000, which is
 | ||||
|          * "undefined".  Of those that can be set, this is the only | ||||
|          * one which seems bad. | ||||
|  | ||||
| @ -1,6 +1,3 @@ | ||||
| config FADS | ||||
| 	bool | ||||
| 
 | ||||
| config CPM1 | ||||
| 	bool | ||||
| 	select CPM | ||||
| @ -13,7 +10,6 @@ choice | ||||
| 
 | ||||
| config MPC8XXFADS | ||||
| 	bool "FADS" | ||||
| 	select FADS | ||||
| 
 | ||||
| config MPC86XADS | ||||
| 	bool "MPC86XADS" | ||||
|  | ||||
| @ -58,6 +58,19 @@ | ||||
| #define RIO_ISR_AACR		0x10120 | ||||
| #define RIO_ISR_AACR_AA		0x1	/* Accept All ID */ | ||||
| 
 | ||||
| #define RIWTAR_TRAD_VAL_SHIFT	12 | ||||
| #define RIWTAR_TRAD_MASK	0x00FFFFFF | ||||
| #define RIWBAR_BADD_VAL_SHIFT	12 | ||||
| #define RIWBAR_BADD_MASK	0x003FFFFF | ||||
| #define RIWAR_ENABLE		0x80000000 | ||||
| #define RIWAR_TGINT_LOCAL	0x00F00000 | ||||
| #define RIWAR_RDTYP_NO_SNOOP	0x00040000 | ||||
| #define RIWAR_RDTYP_SNOOP	0x00050000 | ||||
| #define RIWAR_WRTYP_NO_SNOOP	0x00004000 | ||||
| #define RIWAR_WRTYP_SNOOP	0x00005000 | ||||
| #define RIWAR_WRTYP_ALLOC	0x00006000 | ||||
| #define RIWAR_SIZE_MASK		0x0000003F | ||||
| 
 | ||||
| #define __fsl_read_rio_config(x, addr, err, op)		\ | ||||
| 	__asm__ __volatile__(				\ | ||||
| 		"1:	"op" %1,0(%2)\n"		\ | ||||
| @ -266,6 +279,89 @@ fsl_rio_config_write(struct rio_mport *mport, int index, u16 destid, | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void fsl_rio_inbound_mem_init(struct rio_priv *priv) | ||||
| { | ||||
| 	int i; | ||||
| 
 | ||||
| 	/* close inbound windows */ | ||||
| 	for (i = 0; i < RIO_INB_ATMU_COUNT; i++) | ||||
| 		out_be32(&priv->inb_atmu_regs[i].riwar, 0); | ||||
| } | ||||
| 
 | ||||
| int fsl_map_inb_mem(struct rio_mport *mport, dma_addr_t lstart, | ||||
| 	u64 rstart, u32 size, u32 flags) | ||||
| { | ||||
| 	struct rio_priv *priv = mport->priv; | ||||
| 	u32 base_size; | ||||
| 	unsigned int base_size_log; | ||||
| 	u64 win_start, win_end; | ||||
| 	u32 riwar; | ||||
| 	int i; | ||||
| 
 | ||||
| 	if ((size & (size - 1)) != 0) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	base_size_log = ilog2(size); | ||||
| 	base_size = 1 << base_size_log; | ||||
| 
 | ||||
| 	/* check if addresses are aligned with the window size */ | ||||
| 	if (lstart & (base_size - 1)) | ||||
| 		return -EINVAL; | ||||
| 	if (rstart & (base_size - 1)) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	/* check for conflicting ranges */ | ||||
| 	for (i = 0; i < RIO_INB_ATMU_COUNT; i++) { | ||||
| 		riwar = in_be32(&priv->inb_atmu_regs[i].riwar); | ||||
| 		if ((riwar & RIWAR_ENABLE) == 0) | ||||
| 			continue; | ||||
| 		win_start = ((u64)(in_be32(&priv->inb_atmu_regs[i].riwbar) & RIWBAR_BADD_MASK)) | ||||
| 			<< RIWBAR_BADD_VAL_SHIFT; | ||||
| 		win_end = win_start + ((1 << ((riwar & RIWAR_SIZE_MASK) + 1)) - 1); | ||||
| 		if (rstart < win_end && (rstart + size) > win_start) | ||||
| 			return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	/* find unused atmu */ | ||||
| 	for (i = 0; i < RIO_INB_ATMU_COUNT; i++) { | ||||
| 		riwar = in_be32(&priv->inb_atmu_regs[i].riwar); | ||||
| 		if ((riwar & RIWAR_ENABLE) == 0) | ||||
| 			break; | ||||
| 	} | ||||
| 	if (i >= RIO_INB_ATMU_COUNT) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	out_be32(&priv->inb_atmu_regs[i].riwtar, lstart >> RIWTAR_TRAD_VAL_SHIFT); | ||||
| 	out_be32(&priv->inb_atmu_regs[i].riwbar, rstart >> RIWBAR_BADD_VAL_SHIFT); | ||||
| 	out_be32(&priv->inb_atmu_regs[i].riwar, RIWAR_ENABLE | RIWAR_TGINT_LOCAL | | ||||
| 		RIWAR_RDTYP_SNOOP | RIWAR_WRTYP_SNOOP | (base_size_log - 1)); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| void fsl_unmap_inb_mem(struct rio_mport *mport, dma_addr_t lstart) | ||||
| { | ||||
| 	u32 win_start_shift, base_start_shift; | ||||
| 	struct rio_priv *priv = mport->priv; | ||||
| 	u32 riwar, riwtar; | ||||
| 	int i; | ||||
| 
 | ||||
| 	/* skip default window */ | ||||
| 	base_start_shift = lstart >> RIWTAR_TRAD_VAL_SHIFT; | ||||
| 	for (i = 0; i < RIO_INB_ATMU_COUNT; i++) { | ||||
| 		riwar = in_be32(&priv->inb_atmu_regs[i].riwar); | ||||
| 		if ((riwar & RIWAR_ENABLE) == 0) | ||||
| 			continue; | ||||
| 
 | ||||
| 		riwtar = in_be32(&priv->inb_atmu_regs[i].riwtar); | ||||
| 		win_start_shift = riwtar & RIWTAR_TRAD_MASK; | ||||
| 		if (win_start_shift == base_start_shift) { | ||||
| 			out_be32(&priv->inb_atmu_regs[i].riwar, riwar & ~RIWAR_ENABLE); | ||||
| 			return; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void fsl_rio_port_error_handler(int offset) | ||||
| { | ||||
| 	/*XXX: Error recovery is not implemented, we just clear errors */ | ||||
| @ -389,6 +485,8 @@ int fsl_rio_setup(struct platform_device *dev) | ||||
| 	ops->add_outb_message = fsl_add_outb_message; | ||||
| 	ops->add_inb_buffer = fsl_add_inb_buffer; | ||||
| 	ops->get_inb_message = fsl_get_inb_message; | ||||
| 	ops->map_inb = fsl_map_inb_mem; | ||||
| 	ops->unmap_inb = fsl_unmap_inb_mem; | ||||
| 
 | ||||
| 	rmu_node = of_parse_phandle(dev->dev.of_node, "fsl,srio-rmu-handle", 0); | ||||
| 	if (!rmu_node) { | ||||
| @ -602,6 +700,11 @@ int fsl_rio_setup(struct platform_device *dev) | ||||
| 			RIO_ATMU_REGS_PORT2_OFFSET)); | ||||
| 
 | ||||
| 		priv->maint_atmu_regs = priv->atmu_regs + 1; | ||||
| 		priv->inb_atmu_regs = (struct rio_inb_atmu_regs __iomem *) | ||||
| 			(priv->regs_win + | ||||
| 			((i == 0) ? RIO_INB_ATMU_REGS_PORT1_OFFSET : | ||||
| 			RIO_INB_ATMU_REGS_PORT2_OFFSET)); | ||||
| 
 | ||||
| 
 | ||||
| 		/* Set to receive any dist ID for serial RapidIO controller. */ | ||||
| 		if (port->phy_type == RIO_PHY_SERIAL) | ||||
| @ -620,6 +723,7 @@ int fsl_rio_setup(struct platform_device *dev) | ||||
| 		rio_law_start = range_start; | ||||
| 
 | ||||
| 		fsl_rio_setup_rmu(port, rmu_np[i]); | ||||
| 		fsl_rio_inbound_mem_init(priv); | ||||
| 
 | ||||
| 		dbell->mport[i] = port; | ||||
| 
 | ||||
|  | ||||
| @ -50,9 +50,12 @@ | ||||
| #define RIO_S_DBELL_REGS_OFFSET	0x13400 | ||||
| #define RIO_S_PW_REGS_OFFSET	0x134e0 | ||||
| #define RIO_ATMU_REGS_DBELL_OFFSET	0x10C40 | ||||
| #define RIO_INB_ATMU_REGS_PORT1_OFFSET 0x10d60 | ||||
| #define RIO_INB_ATMU_REGS_PORT2_OFFSET 0x10f60 | ||||
| 
 | ||||
| #define MAX_MSG_UNIT_NUM	2 | ||||
| #define MAX_PORT_NUM		4 | ||||
| #define RIO_INB_ATMU_COUNT	4 | ||||
| 
 | ||||
| struct rio_atmu_regs { | ||||
| 	 u32 rowtar; | ||||
| @ -63,6 +66,15 @@ struct rio_atmu_regs { | ||||
| 	 u32 pad2[3]; | ||||
| }; | ||||
| 
 | ||||
| struct rio_inb_atmu_regs { | ||||
| 	u32 riwtar; | ||||
| 	u32 pad1; | ||||
| 	u32 riwbar; | ||||
| 	u32 pad2; | ||||
| 	u32 riwar; | ||||
| 	u32 pad3[3]; | ||||
| }; | ||||
| 
 | ||||
| struct rio_dbell_ring { | ||||
| 	void *virt; | ||||
| 	dma_addr_t phys; | ||||
| @ -99,6 +111,7 @@ struct rio_priv { | ||||
| 	void __iomem *regs_win; | ||||
| 	struct rio_atmu_regs __iomem *atmu_regs; | ||||
| 	struct rio_atmu_regs __iomem *maint_atmu_regs; | ||||
| 	struct rio_inb_atmu_regs __iomem *inb_atmu_regs; | ||||
| 	void __iomem *maint_win; | ||||
| 	void *rmm_handle; /* RapidIO message manager(unit) Handle */ | ||||
| }; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user