1* Texas Instruments Keystone Navigator Queue Management SubSystem driver
2
3The QMSS (Queue Manager Sub System) found on Keystone SOCs is one of
4the main hardware sub system which forms the backbone of the Keystone
5multi-core Navigator. QMSS consist of queue managers, packed-data structure
6processors(PDSP), linking RAM, descriptor pools and infrastructure
7Packet DMA.
8The Queue Manager is a hardware module that is responsible for accelerating
9management of the packet queues. Packets are queued/de-queued by writing or
10reading descriptor address to a particular memory mapped location. The PDSPs
11perform QMSS related functions like accumulation, QoS, or event management.
12Linking RAM registers are used to link the descriptors which are stored in
13descriptor RAM. Descriptor RAM is configurable as internal or external memory.
14The QMSS driver manages the PDSP setups, linking RAM regions,
15queue pool management (allocation, push, pop and notify) and descriptor
16pool management.
17
18
19Required properties:
20- compatible	: Must be "ti,keystone-navigator-qmss";
21- clocks	: phandle to the reference clock for this device.
22- queue-range	: <start number> total range of queue numbers for the device.
23- linkram0	: <address size> for internal link ram, where size is the total
24		  link ram entries.
25- linkram1	: <address size> for external link ram, where size is the total
26		  external link ram entries. If the address is specified as "0"
27		  driver will allocate memory.
28- qmgrs         : child node describing the individual queue managers on the
29		  SoC. On keystone 1 devices there should be only one node.
30		  On keystone 2 devices there can be more than 1 node.
31  -- managed-queues	: the actual queues managed by each queue manager
32			  instance, specified as <"base queue #" "# of queues">.
33  -- reg		: Address and size of the register set for the device.
34			  Register regions should be specified in the following
35			  order
36			  - Queue Peek region.
37			  - Queue status RAM.
38			  - Queue configuration region.
39			  - Descriptor memory setup region.
40			  - Queue Management/Queue Proxy region for queue Push.
41			  - Queue Management/Queue Proxy region for queue Pop.
42- queue-pools	: child node classifying the queue ranges into pools.
43		  Queue ranges are grouped into 3 type of pools:
44		  - qpend	    : pool of qpend(interruptible) queues
45		  - general-purpose : pool of general queues, primarily used
46				      as free descriptor queues or the
47				      transmit DMA queues.
48		  - accumulator	    : pool of queues on PDSP accumulator channel
49		  Each range can have the following properties:
50  -- qrange		: number of queues to use per queue range, specified as
51			  <"base queue #" "# of queues">.
52  -- interrupts		: Optional property to specify the interrupt mapping
53			  for interruptible queues. The driver additionally sets
54			  the interrupt affinity hint based on the cpu mask.
55  -- qalloc-by-id	: Optional property to specify that the queues in this
56			  range can only be allocated by queue id.
57  -- accumulator	: Accumulator channel specification. Any of the PDSPs in
58			  QMSS can be loaded with the accumulator firmware. The
59			  accumulator firmware’s job is to poll a select number of
60			  queues looking for descriptors that have been pushed
61			  into them. Descriptors are popped from the queue and
62			  placed in a buffer provided by the host. When the list
63			  becomes full or a programmed time period expires, the
64			  accumulator triggers an interrupt to the host to read
65			  the buffer for descriptor information. This firmware
66			  comes in 16, 32, and 48 channel builds. Each of these
67			  channels can be configured to monitor 32 contiguous
68			  queues.  Accumulator channel property is specified as:
69			  <pdsp-id, channel, entries, pacing mode, latency>
70			  pdsp-id     : QMSS PDSP running accumulator firmware
71					on which the channel has to be
72					configured
73			  channel     : Accumulator channel number
74			  entries     : Size of the accumulator descriptor list
75			  pacing mode : Interrupt pacing mode
76					0 : None, i.e interrupt on list full only
77					1 : Time delay since last interrupt
78					2 : Time delay since first new packet
79					3 : Time delay since last new packet
80			  latency     : time to delay the interrupt, specified
81					in microseconds.
82  -- multi-queue	: Optional property to specify that the channel has to
83			  monitor up to 32 queues starting at the base queue #.
84- descriptor-regions	: child node describing the memory regions for keystone
85			  navigator packet DMA descriptors. The memory for
86			  descriptors will be allocated by the driver.
87  -- id				: region number in QMSS.
88  -- region-spec		: specifies the number of descriptors in the
89				  region, specified as
90				  <"# of descriptors" "descriptor size">.
91  -- link-index			: start index, i.e. index of the first
92				  descriptor in the region.
93
94Optional properties:
95- dma-coherent	: Present if DMA operations are coherent.
96- pdsps		: child node describing the PDSP configuration.
97  -- firmware		: firmware to be loaded on the PDSP.
98  -- id			: the qmss pdsp that will run the firmware.
99  -- reg		: Address and size of the register set for the PDSP.
100			  Register regions should be specified in the following
101			  order
102			  - PDSP internal RAM region.
103			  - PDSP control/status region registers.
104			  - QMSS interrupt distributor registers.
105			  - PDSP command interface region.
106
107Example:
108
109qmss: qmss@2a40000 {
110	compatible = "ti,keystone-qmss";
111	dma-coherent;
112	#address-cells = <1>;
113	#size-cells = <1>;
114	clocks = <&chipclk13>;
115	ranges;
116	queue-range	= <0 0x4000>;
117	linkram0	= <0x100000 0x8000>;
118	linkram1	= <0x0 0x10000>;
119
120	qmgrs {
121		#address-cells = <1>;
122		#size-cells = <1>;
123		ranges;
124		qmgr0 {
125			managed-queues = <0 0x2000>;
126			reg = <0x2a40000 0x20000>,
127			      <0x2a06000 0x400>,
128			      <0x2a02000 0x1000>,
129			      <0x2a03000 0x1000>,
130			      <0x23a80000 0x20000>,
131			      <0x2a80000 0x20000>;
132		};
133
134		qmgr1 {
135			managed-queues = <0x2000 0x2000>;
136			reg = <0x2a60000 0x20000>,
137			      <0x2a06400 0x400>,
138			      <0x2a04000 0x1000>,
139			      <0x2a05000 0x1000>,
140			      <0x23aa0000 0x20000>,
141			      <0x2aa0000 0x20000>;
142		};
143	};
144	queue-pools {
145		qpend {
146			qpend-0 {
147				qrange = <658 8>;
148				interrupts =<0 40 0xf04 0 41 0xf04 0 42 0xf04
149					     0 43 0xf04 0 44 0xf04 0 45 0xf04
150					     0 46 0xf04 0 47 0xf04>;
151			};
152			qpend-1 {
153				qrange = <8704 16>;
154				interrupts = <0 48 0xf04 0 49 0xf04 0 50 0xf04
155					      0 51 0xf04 0 52 0xf04 0 53 0xf04
156					      0 54 0xf04 0 55 0xf04 0 56 0xf04
157					      0 57 0xf04 0 58 0xf04 0 59 0xf04
158					      0 60 0xf04 0 61 0xf04 0 62 0xf04
159					      0 63 0xf04>;
160				qalloc-by-id;
161			};
162			qpend-2 {
163				qrange = <8720 16>;
164				interrupts = <0 64 0xf04 0 65 0xf04 0 66 0xf04
165					      0 59 0xf04 0 68 0xf04 0 69 0xf04
166					      0 70 0xf04 0 71 0xf04 0 72 0xf04
167					      0 73 0xf04 0 74 0xf04 0 75 0xf04
168					      0 76 0xf04 0 77 0xf04 0 78 0xf04
169					      0 79 0xf04>;
170			};
171		};
172		general-purpose {
173			gp-0 {
174				qrange = <4000 64>;
175			};
176			netcp-tx {
177				qrange = <640 9>;
178				qalloc-by-id;
179			};
180		};
181		accumulator {
182			acc-0 {
183				qrange = <128 32>;
184				accumulator = <0 36 16 2 50>;
185				interrupts = <0 215 0xf01>;
186				multi-queue;
187				qalloc-by-id;
188			};
189			acc-1 {
190				qrange = <160 32>;
191				accumulator = <0 37 16 2 50>;
192				interrupts = <0 216 0xf01>;
193				multi-queue;
194			};
195			acc-2 {
196				qrange = <192 32>;
197				accumulator = <0 38 16 2 50>;
198				interrupts = <0 217 0xf01>;
199				multi-queue;
200			};
201			acc-3 {
202				qrange = <224 32>;
203				accumulator = <0 39 16 2 50>;
204				interrupts = <0 218 0xf01>;
205				multi-queue;
206			};
207		};
208	};
209	descriptor-regions {
210		#address-cells = <1>;
211		#size-cells = <1>;
212		ranges;
213		region-12 {
214			id = <12>;
215			region-spec = <8192 128>; /* num_desc desc_size */
216			link-index = <0x4000>;
217		};
218	};
219	pdsps {
220		#address-cells = <1>;
221		#size-cells = <1>;
222		ranges;
223		pdsp0@2a10000 {
224			reg = <0x2a10000 0x1000>,
225			      <0x2a0f000 0x100>,
226			      <0x2a0c000 0x3c8>,
227			      <0x2a20000 0x4000>;
228			id = <0>;
229		};
230	};
231}; /* qmss */
232