|  | * Texas Instruments Keystone Navigator Queue Management SubSystem driver | 
|  |  | 
|  | The QMSS (Queue Manager Sub System) found on Keystone SOCs is one of | 
|  | the main hardware sub system which forms the backbone of the Keystone | 
|  | multi-core Navigator. QMSS consist of queue managers, packed-data structure | 
|  | processors(PDSP), linking RAM, descriptor pools and infrastructure | 
|  | Packet DMA. | 
|  | The Queue Manager is a hardware module that is responsible for accelerating | 
|  | management of the packet queues. Packets are queued/de-queued by writing or | 
|  | reading descriptor address to a particular memory mapped location. The PDSPs | 
|  | perform QMSS related functions like accumulation, QoS, or event management. | 
|  | Linking RAM registers are used to link the descriptors which are stored in | 
|  | descriptor RAM. Descriptor RAM is configurable as internal or external memory. | 
|  | The QMSS driver manages the PDSP setups, linking RAM regions, | 
|  | queue pool management (allocation, push, pop and notify) and descriptor | 
|  | pool management. | 
|  |  | 
|  |  | 
|  | Required properties: | 
|  | - compatible	: Must be "ti,keystone-navigator-qmss"; | 
|  | - clocks	: phandle to the reference clock for this device. | 
|  | - queue-range	: <start number> total range of queue numbers for the device. | 
|  | - linkram0	: <address size> for internal link ram, where size is the total | 
|  | link ram entries. | 
|  | - linkram1	: <address size> for external link ram, where size is the total | 
|  | external link ram entries. If the address is specified as "0" | 
|  | driver will allocate memory. | 
|  | - qmgrs         : child node describing the individual queue managers on the | 
|  | SoC. On keystone 1 devices there should be only one node. | 
|  | On keystone 2 devices there can be more than 1 node. | 
|  | -- managed-queues	: the actual queues managed by each queue manager | 
|  | instance, specified as <"base queue #" "# of queues">. | 
|  | -- reg		: Address and size of the register set for the device. | 
|  | Register regions should be specified in the following | 
|  | order | 
|  | - Queue Peek region. | 
|  | - Queue status RAM. | 
|  | - Queue configuration region. | 
|  | - Descriptor memory setup region. | 
|  | - Queue Management/Queue Proxy region for queue Push. | 
|  | - Queue Management/Queue Proxy region for queue Pop. | 
|  | - queue-pools	: child node classifying the queue ranges into pools. | 
|  | Queue ranges are grouped into 3 type of pools: | 
|  | - qpend	    : pool of qpend(interruptible) queues | 
|  | - general-purpose : pool of general queues, primarly used | 
|  | as free descriptor queues or the | 
|  | transmit DMA queues. | 
|  | - accumulator	    : pool of queues on PDSP accumulator channel | 
|  | Each range can have the following properties: | 
|  | -- qrange		: number of queues to use per queue range, specified as | 
|  | <"base queue #" "# of queues">. | 
|  | -- interrupts		: Optional property to specify the interrupt mapping | 
|  | for interruptible queues. The driver additionaly sets | 
|  | the interrupt affinity hint based on the cpu mask. | 
|  | -- qalloc-by-id	: Optional property to specify that the queues in this | 
|  | range can only be allocated by queue id. | 
|  | -- accumulator	: Accumulator channel specification. Any of the PDSPs in | 
|  | QMSS can be loaded with the accumulator firmware. The | 
|  | accumulator firmware’s job is to poll a select number of | 
|  | queues looking for descriptors that have been pushed | 
|  | into them. Descriptors are popped from the queue and | 
|  | placed in a buffer provided by the host. When the list | 
|  | becomes full or a programmed time period expires, the | 
|  | accumulator triggers an interrupt to the host to read | 
|  | the buffer for descriptor information. This firmware | 
|  | comes in 16, 32, and 48 channel builds. Each of these | 
|  | channels can be configured to monitor 32 contiguous | 
|  | queues.  Accumulator channel property is specified as: | 
|  | <pdsp-id, channel, entries, pacing mode, latency> | 
|  | pdsp-id     : QMSS PDSP running accumulator firmware | 
|  | on which the channel has to be | 
|  | configured | 
|  | channel     : Accumulator channel number | 
|  | entries     : Size of the accumulator descriptor list | 
|  | pacing mode : Interrupt pacing mode | 
|  | 0 : None, i.e interrupt on list full only | 
|  | 1 : Time delay since last interrupt | 
|  | 2 : Time delay since first new packet | 
|  | 3 : Time delay since last new packet | 
|  | latency     : time to delay the interrupt, specified | 
|  | in microseconds. | 
|  | -- multi-queue	: Optional property to specify that the channel has to | 
|  | monitor upto 32 queues starting at the base queue #. | 
|  | - descriptor-regions	: child node describing the memory regions for keystone | 
|  | navigator packet DMA descriptors. The memory for | 
|  | descriptors will be allocated by the driver. | 
|  | -- id				: region number in QMSS. | 
|  | -- region-spec		: specifies the number of descriptors in the | 
|  | region, specified as | 
|  | <"# of descriptors" "descriptor size">. | 
|  | -- link-index			: start index, i.e. index of the first | 
|  | descriptor in the region. | 
|  |  | 
|  | Optional properties: | 
|  | - dma-coherent	: Present if DMA operations are coherent. | 
|  | - pdsps		: child node describing the PDSP configuration. | 
|  | -- firmware		: firmware to be loaded on the PDSP. | 
|  | -- id			: the qmss pdsp that will run the firmware. | 
|  | -- reg		: Address and size of the register set for the PDSP. | 
|  | Register regions should be specified in the following | 
|  | order | 
|  | - PDSP internal RAM region. | 
|  | - PDSP control/status region registers. | 
|  | - QMSS interrupt distributor registers. | 
|  | - PDSP command interface region. | 
|  |  | 
|  | Example: | 
|  |  | 
|  | qmss: qmss@2a40000 { | 
|  | compatible = "ti,keystone-qmss"; | 
|  | dma-coherent; | 
|  | #address-cells = <1>; | 
|  | #size-cells = <1>; | 
|  | clocks = <&chipclk13>; | 
|  | ranges; | 
|  | queue-range	= <0 0x4000>; | 
|  | linkram0	= <0x100000 0x8000>; | 
|  | linkram1	= <0x0 0x10000>; | 
|  |  | 
|  | qmgrs { | 
|  | #address-cells = <1>; | 
|  | #size-cells = <1>; | 
|  | ranges; | 
|  | qmgr0 { | 
|  | managed-queues = <0 0x2000>; | 
|  | reg = <0x2a40000 0x20000>, | 
|  | <0x2a06000 0x400>, | 
|  | <0x2a02000 0x1000>, | 
|  | <0x2a03000 0x1000>, | 
|  | <0x23a80000 0x20000>, | 
|  | <0x2a80000 0x20000>; | 
|  | }; | 
|  |  | 
|  | qmgr1 { | 
|  | managed-queues = <0x2000 0x2000>; | 
|  | reg = <0x2a60000 0x20000>, | 
|  | <0x2a06400 0x400>, | 
|  | <0x2a04000 0x1000>, | 
|  | <0x2a05000 0x1000>, | 
|  | <0x23aa0000 0x20000>, | 
|  | <0x2aa0000 0x20000>; | 
|  | }; | 
|  | }; | 
|  | queue-pools { | 
|  | qpend { | 
|  | qpend-0 { | 
|  | qrange = <658 8>; | 
|  | interrupts =<0 40 0xf04 0 41 0xf04 0 42 0xf04 | 
|  | 0 43 0xf04 0 44 0xf04 0 45 0xf04 | 
|  | 0 46 0xf04 0 47 0xf04>; | 
|  | }; | 
|  | qpend-1 { | 
|  | qrange = <8704 16>; | 
|  | interrupts = <0 48 0xf04 0 49 0xf04 0 50 0xf04 | 
|  | 0 51 0xf04 0 52 0xf04 0 53 0xf04 | 
|  | 0 54 0xf04 0 55 0xf04 0 56 0xf04 | 
|  | 0 57 0xf04 0 58 0xf04 0 59 0xf04 | 
|  | 0 60 0xf04 0 61 0xf04 0 62 0xf04 | 
|  | 0 63 0xf04>; | 
|  | qalloc-by-id; | 
|  | }; | 
|  | qpend-2 { | 
|  | qrange = <8720 16>; | 
|  | interrupts = <0 64 0xf04 0 65 0xf04 0 66 0xf04 | 
|  | 0 59 0xf04 0 68 0xf04 0 69 0xf04 | 
|  | 0 70 0xf04 0 71 0xf04 0 72 0xf04 | 
|  | 0 73 0xf04 0 74 0xf04 0 75 0xf04 | 
|  | 0 76 0xf04 0 77 0xf04 0 78 0xf04 | 
|  | 0 79 0xf04>; | 
|  | }; | 
|  | }; | 
|  | general-purpose { | 
|  | gp-0 { | 
|  | qrange = <4000 64>; | 
|  | }; | 
|  | netcp-tx { | 
|  | qrange = <640 9>; | 
|  | qalloc-by-id; | 
|  | }; | 
|  | }; | 
|  | accumulator { | 
|  | acc-0 { | 
|  | qrange = <128 32>; | 
|  | accumulator = <0 36 16 2 50>; | 
|  | interrupts = <0 215 0xf01>; | 
|  | multi-queue; | 
|  | qalloc-by-id; | 
|  | }; | 
|  | acc-1 { | 
|  | qrange = <160 32>; | 
|  | accumulator = <0 37 16 2 50>; | 
|  | interrupts = <0 216 0xf01>; | 
|  | multi-queue; | 
|  | }; | 
|  | acc-2 { | 
|  | qrange = <192 32>; | 
|  | accumulator = <0 38 16 2 50>; | 
|  | interrupts = <0 217 0xf01>; | 
|  | multi-queue; | 
|  | }; | 
|  | acc-3 { | 
|  | qrange = <224 32>; | 
|  | accumulator = <0 39 16 2 50>; | 
|  | interrupts = <0 218 0xf01>; | 
|  | multi-queue; | 
|  | }; | 
|  | }; | 
|  | }; | 
|  | descriptor-regions { | 
|  | #address-cells = <1>; | 
|  | #size-cells = <1>; | 
|  | ranges; | 
|  | region-12 { | 
|  | id = <12>; | 
|  | region-spec = <8192 128>; /* num_desc desc_size */ | 
|  | link-index = <0x4000>; | 
|  | }; | 
|  | }; | 
|  | pdsps { | 
|  | #address-cells = <1>; | 
|  | #size-cells = <1>; | 
|  | ranges; | 
|  | pdsp0@0x2a10000 { | 
|  | firmware = "keystone/qmss_pdsp_acc48_k2_le_1_0_0_8.fw"; | 
|  | reg = <0x2a10000 0x1000>, | 
|  | <0x2a0f000 0x100>, | 
|  | <0x2a0c000 0x3c8>, | 
|  | <0x2a20000 0x4000>; | 
|  | id = <0>; | 
|  | }; | 
|  | }; | 
|  | }; /* qmss */ |