239 lines · plain
1* Texas Instruments Keystone Navigator Queue Management SubSystem driver2 3The QMSS (Queue Manager Sub System) found on Keystone SOCs is one of4the main hardware sub system which forms the backbone of the Keystone5multi-core Navigator. QMSS consist of queue managers, packed-data structure6processors(PDSP), linking RAM, descriptor pools and infrastructure7Packet DMA.8The Queue Manager is a hardware module that is responsible for accelerating9management of the packet queues. Packets are queued/de-queued by writing or10reading descriptor address to a particular memory mapped location. The PDSPs11perform QMSS related functions like accumulation, QoS, or event management.12Linking RAM registers are used to link the descriptors which are stored in13descriptor 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 descriptor16pool management.17 18 19Required properties:20- compatible : Must be "ti,keystone-navigator-qmss".21 : Must be "ti,66ak2g-navss-qm" for QMSS on K2G SoC.22- clocks : phandle to the reference clock for this device.23- queue-range : <start number> total range of queue numbers for the device.24- linkram0 : <address size> for internal link ram, where size is the total25 link ram entries.26- linkram1 : <address size> for external link ram, where size is the total27 external link ram entries. If the address is specified as "0"28 driver will allocate memory.29- qmgrs : child node describing the individual queue managers on the30 SoC. On keystone 1 devices there should be only one node.31 On keystone 2 devices there can be more than 1 node.32 -- managed-queues : the actual queues managed by each queue manager33 instance, specified as <"base queue #" "# of queues">.34 -- reg : Address and size of the register set for the device.35 Register regions should be specified in the following36 order37 - Queue Peek region.38 - Queue status RAM.39 - Queue configuration region.40 - Descriptor memory setup region.41 - Queue Management/Queue Proxy region for queue Push.42 - Queue Management/Queue Proxy region for queue Pop.43 44For QMSS on K2G SoC, following QM reg indexes are used in that order45 - Queue Peek region.46 - Queue configuration region.47 - Queue Management/Queue Proxy region for queue Push/Pop.48 49- queue-pools : child node classifying the queue ranges into pools.50 Queue ranges are grouped into 3 type of pools:51 - qpend : pool of qpend(interruptible) queues52 - general-purpose : pool of general queues, primarily used53 as free descriptor queues or the54 transmit DMA queues.55 - accumulator : pool of queues on PDSP accumulator channel56 Each range can have the following properties:57 -- qrange : number of queues to use per queue range, specified as58 <"base queue #" "# of queues">.59 -- interrupts : Optional property to specify the interrupt mapping60 for interruptible queues. The driver additionally sets61 the interrupt affinity hint based on the cpu mask.62 -- qalloc-by-id : Optional property to specify that the queues in this63 range can only be allocated by queue id.64 -- accumulator : Accumulator channel specification. Any of the PDSPs in65 QMSS can be loaded with the accumulator firmware. The66 accumulator firmware’s job is to poll a select number of67 queues looking for descriptors that have been pushed68 into them. Descriptors are popped from the queue and69 placed in a buffer provided by the host. When the list70 becomes full or a programmed time period expires, the71 accumulator triggers an interrupt to the host to read72 the buffer for descriptor information. This firmware73 comes in 16, 32, and 48 channel builds. Each of these74 channels can be configured to monitor 32 contiguous75 queues. Accumulator channel property is specified as:76 <pdsp-id, channel, entries, pacing mode, latency>77 pdsp-id : QMSS PDSP running accumulator firmware78 on which the channel has to be79 configured80 channel : Accumulator channel number81 entries : Size of the accumulator descriptor list82 pacing mode : Interrupt pacing mode83 0 : None, i.e interrupt on list full only84 1 : Time delay since last interrupt85 2 : Time delay since first new packet86 3 : Time delay since last new packet87 latency : time to delay the interrupt, specified88 in microseconds.89 -- multi-queue : Optional property to specify that the channel has to90 monitor up to 32 queues starting at the base queue #.91- descriptor-regions : child node describing the memory regions for keystone92 navigator packet DMA descriptors. The memory for93 descriptors will be allocated by the driver.94 -- id : region number in QMSS.95 -- region-spec : specifies the number of descriptors in the96 region, specified as97 <"# of descriptors" "descriptor size">.98 -- link-index : start index, i.e. index of the first99 descriptor in the region.100 101Optional properties:102- dma-coherent : Present if DMA operations are coherent.103- pdsps : child node describing the PDSP configuration.104 -- firmware : firmware to be loaded on the PDSP.105 -- id : the qmss pdsp that will run the firmware.106 -- reg : Address and size of the register set for the PDSP.107 Register regions should be specified in the following108 order109 - PDSP internal RAM region.110 - PDSP control/status region registers.111 - QMSS interrupt distributor registers.112 - PDSP command interface region.113 114Example:115 116qmss: qmss@2a40000 {117 compatible = "ti,keystone-qmss";118 dma-coherent;119 #address-cells = <1>;120 #size-cells = <1>;121 clocks = <&chipclk13>;122 ranges;123 queue-range = <0 0x4000>;124 linkram0 = <0x100000 0x8000>;125 linkram1 = <0x0 0x10000>;126 127 qmgrs {128 #address-cells = <1>;129 #size-cells = <1>;130 ranges;131 qmgr0 {132 managed-queues = <0 0x2000>;133 reg = <0x2a40000 0x20000>,134 <0x2a06000 0x400>,135 <0x2a02000 0x1000>,136 <0x2a03000 0x1000>,137 <0x23a80000 0x20000>,138 <0x2a80000 0x20000>;139 };140 141 qmgr1 {142 managed-queues = <0x2000 0x2000>;143 reg = <0x2a60000 0x20000>,144 <0x2a06400 0x400>,145 <0x2a04000 0x1000>,146 <0x2a05000 0x1000>,147 <0x23aa0000 0x20000>,148 <0x2aa0000 0x20000>;149 };150 };151 queue-pools {152 qpend {153 qpend-0 {154 qrange = <658 8>;155 interrupts =<0 40 0xf04 0 41 0xf04 0 42 0xf04156 0 43 0xf04 0 44 0xf04 0 45 0xf04157 0 46 0xf04 0 47 0xf04>;158 };159 qpend-1 {160 qrange = <8704 16>;161 interrupts = <0 48 0xf04 0 49 0xf04 0 50 0xf04162 0 51 0xf04 0 52 0xf04 0 53 0xf04163 0 54 0xf04 0 55 0xf04 0 56 0xf04164 0 57 0xf04 0 58 0xf04 0 59 0xf04165 0 60 0xf04 0 61 0xf04 0 62 0xf04166 0 63 0xf04>;167 qalloc-by-id;168 };169 qpend-2 {170 qrange = <8720 16>;171 interrupts = <0 64 0xf04 0 65 0xf04 0 66 0xf04172 0 59 0xf04 0 68 0xf04 0 69 0xf04173 0 70 0xf04 0 71 0xf04 0 72 0xf04174 0 73 0xf04 0 74 0xf04 0 75 0xf04175 0 76 0xf04 0 77 0xf04 0 78 0xf04176 0 79 0xf04>;177 };178 };179 general-purpose {180 gp-0 {181 qrange = <4000 64>;182 };183 netcp-tx {184 qrange = <640 9>;185 qalloc-by-id;186 };187 };188 accumulator {189 acc-0 {190 qrange = <128 32>;191 accumulator = <0 36 16 2 50>;192 interrupts = <0 215 0xf01>;193 multi-queue;194 qalloc-by-id;195 };196 acc-1 {197 qrange = <160 32>;198 accumulator = <0 37 16 2 50>;199 interrupts = <0 216 0xf01>;200 multi-queue;201 };202 acc-2 {203 qrange = <192 32>;204 accumulator = <0 38 16 2 50>;205 interrupts = <0 217 0xf01>;206 multi-queue;207 };208 acc-3 {209 qrange = <224 32>;210 accumulator = <0 39 16 2 50>;211 interrupts = <0 218 0xf01>;212 multi-queue;213 };214 };215 };216 descriptor-regions {217 #address-cells = <1>;218 #size-cells = <1>;219 ranges;220 region-12 {221 id = <12>;222 region-spec = <8192 128>; /* num_desc desc_size */223 link-index = <0x4000>;224 };225 };226 pdsps {227 #address-cells = <1>;228 #size-cells = <1>;229 ranges;230 pdsp0@2a10000 {231 reg = <0x2a10000 0x1000>,232 <0x2a0f000 0x100>,233 <0x2a0c000 0x3c8>,234 <0x2a20000 0x4000>;235 id = <0>;236 };237 };238}; /* qmss */239