2 * Memory arbiter functions. Allocates bandwidth through the
3 * arbiter and sets up arbiter breakpoints.
5 * The algorithm first assigns slots to the clients that has specified
6 * bandwidth (e.g. ethernet) and then the remaining slots are divided
7 * on all the active clients.
9 * Copyright (c) 2004-2007 Axis Communications AB.
11 * The artpec-3 has two arbiters. The memory hierarchy looks like this:
17 * -------------- ------------------
18 * | foo arbiter|----| Internal memory|
19 * -------------- ------------------
38 #include <hwregs/reg_map.h>
39 #include <hwregs/reg_rdwr.h>
40 #include <hwregs/marb_foo_defs.h>
41 #include <hwregs/marb_bar_defs.h>
43 #include <hwregs/intr_vect.h>
44 #include <linux/interrupt.h>
45 #include <linux/irq.h>
46 #include <linux/signal.h>
47 #include <linux/errno.h>
48 #include <linux/spinlock.h>
50 #include <asm/irq_regs.h>
54 struct crisv32_watch_entry
{
55 unsigned long instance
;
62 #define NUMBER_OF_BP 4
63 #define SDRAM_BANDWIDTH 400000000
64 #define INTMEM_BANDWIDTH 400000000
65 #define NBR_OF_SLOTS 64
66 #define NBR_OF_REGIONS 2
67 #define NBR_OF_CLIENTS 15
69 #define UNASSIGNED 100
72 unsigned long instance
;
75 int requested_slots
[NBR_OF_REGIONS
][NBR_OF_CLIENTS
];
76 int active_clients
[NBR_OF_REGIONS
][NBR_OF_CLIENTS
];
79 static struct crisv32_watch_entry watches
[ARBITERS
][NUMBER_OF_BP
] =
95 struct arbiter arbiters
[ARBITERS
] =
97 { /* L2 cache arbiter */
98 .instance
= regi_marb_foo
,
103 .instance
= regi_marb_bar
,
109 static int max_bandwidth
[NBR_OF_REGIONS
] = {SDRAM_BANDWIDTH
, INTMEM_BANDWIDTH
};
111 DEFINE_SPINLOCK(arbiter_lock
);
114 crisv32_foo_arbiter_irq(int irq
, void *dev_id
);
116 crisv32_bar_arbiter_irq(int irq
, void *dev_id
);
119 * "I'm the arbiter, I know the score.
120 * From square one I'll be watching all 64."
121 * (memory arbiter slots, that is)
124 * Program the memory arbiter slots for "region" according to what's
125 * in requested_slots[] and active_clients[], while minimizing
126 * latency. A caller may pass a non-zero positive amount for
127 * "unused_slots", which must then be the unallocated, remaining
128 * number of slots, free to hand out to any client.
131 static void crisv32_arbiter_config(int arbiter
, int region
, int unused_slots
)
138 * This vector corresponds to the hardware arbiter slots (see
139 * the hardware documentation for semantics). We initialize
140 * each slot with a suitable sentinel value outside the valid
141 * range {0 .. NBR_OF_CLIENTS - 1} and replace them with
142 * client indexes. Then it's fed to the hardware.
144 s8 val
[NBR_OF_SLOTS
];
146 for (slot
= 0; slot
< NBR_OF_SLOTS
; slot
++)
149 for (client
= 0; client
< arbiters
[arbiter
].nbr_clients
; client
++) {
151 /* Allocate the requested non-zero number of slots, but
152 * also give clients with zero-requests one slot each
153 * while stocks last. We do the latter here, in client
154 * order. This makes sure zero-request clients are the
155 * first to get to any spare slots, else those slots
156 * could, when bandwidth is allocated close to the limit,
157 * all be allocated to low-index non-zero-request clients
158 * in the default-fill loop below. Another positive but
159 * secondary effect is a somewhat better spread of the
160 * zero-bandwidth clients in the vector, avoiding some of
161 * the latency that could otherwise be caused by the
162 * partitioning of non-zero-bandwidth clients at low
163 * indexes and zero-bandwidth clients at high
164 * indexes. (Note that this spreading can only affect the
165 * unallocated bandwidth.) All the above only matters for
166 * memory-intensive situations, of course.
168 if (!arbiters
[arbiter
].requested_slots
[region
][client
]) {
170 * Skip inactive clients. Also skip zero-slot
171 * allocations in this pass when there are no known
174 if (!arbiters
[arbiter
].active_clients
[region
][client
] ||
180 /* Only allocate one slot for this client. */
181 interval
= NBR_OF_SLOTS
;
183 interval
= NBR_OF_SLOTS
/
184 arbiters
[arbiter
].requested_slots
[region
][client
];
187 while (pos
< NBR_OF_SLOTS
) {
198 for (slot
= 0; slot
< NBR_OF_SLOTS
; slot
++) {
200 * Allocate remaining slots in round-robin
201 * client-number order for active clients. For this
202 * pass, we ignore requested bandwidth and previous
207 while (!arbiters
[arbiter
].active_clients
[region
][client
]) {
208 client
= (client
+ 1) %
209 arbiters
[arbiter
].nbr_clients
;
214 client
= (client
+ 1) % arbiters
[arbiter
].nbr_clients
;
217 if (region
== EXT_REGION
)
218 REG_WR_INT_VECT(marb_foo
, regi_marb_foo
,
219 rw_l2_slots
, slot
, val
[slot
]);
220 else if (region
== INT_REGION
)
221 REG_WR_INT_VECT(marb_foo
, regi_marb_foo
,
222 rw_intm_slots
, slot
, val
[slot
]);
224 REG_WR_INT_VECT(marb_bar
, regi_marb_bar
,
225 rw_ddr2_slots
, slot
, val
[slot
]);
230 extern char _stext
, _etext
;
232 static void crisv32_arbiter_init(void)
234 static int initialized
;
242 * CPU caches are always set to active, but with zero
243 * bandwidth allocated. It should be ok to allocate zero
244 * bandwidth for the caches, because DMA for other channels
245 * will supposedly finish, once their programmed amount is
246 * done, and then the caches will get access according to the
247 * "fixed scheme" for unclaimed slots. Though, if for some
248 * use-case somewhere, there's a maximum CPU latency for
249 * e.g. some interrupt, we have to start allocating specific
250 * bandwidth for the CPU caches too.
252 arbiters
[0].active_clients
[EXT_REGION
][11] = 1;
253 arbiters
[0].active_clients
[EXT_REGION
][12] = 1;
254 crisv32_arbiter_config(0, EXT_REGION
, 0);
255 crisv32_arbiter_config(0, INT_REGION
, 0);
256 crisv32_arbiter_config(1, EXT_REGION
, 0);
258 if (request_irq(MEMARB_FOO_INTR_VECT
, crisv32_foo_arbiter_irq
,
259 IRQF_DISABLED
, "arbiter", NULL
))
260 printk(KERN_ERR
"Couldn't allocate arbiter IRQ\n");
262 if (request_irq(MEMARB_BAR_INTR_VECT
, crisv32_bar_arbiter_irq
,
263 IRQF_DISABLED
, "arbiter", NULL
))
264 printk(KERN_ERR
"Couldn't allocate arbiter IRQ\n");
266 #ifndef CONFIG_ETRAX_KGDB
267 /* Global watch for writes to kernel text segment. */
268 crisv32_arbiter_watch(virt_to_phys(&_stext
), &_etext
- &_stext
,
269 MARB_CLIENTS(arbiter_all_clients
, arbiter_bar_all_clients
),
270 arbiter_all_write
, NULL
);
273 /* Set up max burst sizes by default */
274 REG_WR_INT(marb_bar
, regi_marb_bar
, rw_h264_rd_burst
, 3);
275 REG_WR_INT(marb_bar
, regi_marb_bar
, rw_h264_wr_burst
, 3);
276 REG_WR_INT(marb_bar
, regi_marb_bar
, rw_ccd_burst
, 3);
277 REG_WR_INT(marb_bar
, regi_marb_bar
, rw_vin_wr_burst
, 3);
278 REG_WR_INT(marb_bar
, regi_marb_bar
, rw_vin_rd_burst
, 3);
279 REG_WR_INT(marb_bar
, regi_marb_bar
, rw_sclr_rd_burst
, 3);
280 REG_WR_INT(marb_bar
, regi_marb_bar
, rw_vout_burst
, 3);
281 REG_WR_INT(marb_bar
, regi_marb_bar
, rw_sclr_fifo_burst
, 3);
282 REG_WR_INT(marb_bar
, regi_marb_bar
, rw_l2cache_burst
, 3);
285 int crisv32_arbiter_allocate_bandwidth(int client
, int region
,
286 unsigned long bandwidth
)
289 int total_assigned
= 0;
290 int total_clients
= 0;
294 crisv32_arbiter_init();
296 if (client
& 0xffff0000) {
301 for (i
= 0; i
< arbiters
[arbiter
].nbr_clients
; i
++) {
302 total_assigned
+= arbiters
[arbiter
].requested_slots
[region
][i
];
303 total_clients
+= arbiters
[arbiter
].active_clients
[region
][i
];
306 /* Avoid division by 0 for 0-bandwidth requests. */
308 ? 0 : NBR_OF_SLOTS
/ (max_bandwidth
[region
] / bandwidth
);
311 * We make sure that there are enough slots only for non-zero
312 * requests. Requesting 0 bandwidth *may* allocate slots,
313 * though if all bandwidth is allocated, such a client won't
314 * get any and will have to rely on getting memory access
315 * according to the fixed scheme that's the default when one
316 * of the slot-allocated clients doesn't claim their slot.
318 if (total_assigned
+ req
> NBR_OF_SLOTS
)
321 arbiters
[arbiter
].active_clients
[region
][client
] = 1;
322 arbiters
[arbiter
].requested_slots
[region
][client
] = req
;
323 crisv32_arbiter_config(arbiter
, region
, NBR_OF_SLOTS
- total_assigned
);
325 /* Propagate allocation from foo to bar */
327 crisv32_arbiter_allocate_bandwidth(8 << 16,
328 EXT_REGION
, bandwidth
);
333 * Main entry for bandwidth deallocation.
335 * Strictly speaking, for a somewhat constant set of clients where
336 * each client gets a constant bandwidth and is just enabled or
337 * disabled (somewhat dynamically), no action is necessary here to
338 * avoid starvation for non-zero-allocation clients, as the allocated
339 * slots will just be unused. However, handing out those unused slots
340 * to active clients avoids needless latency if the "fixed scheme"
341 * would give unclaimed slots to an eager low-index client.
344 void crisv32_arbiter_deallocate_bandwidth(int client
, int region
)
347 int total_assigned
= 0;
350 if (client
& 0xffff0000)
353 arbiters
[arbiter
].requested_slots
[region
][client
] = 0;
354 arbiters
[arbiter
].active_clients
[region
][client
] = 0;
356 for (i
= 0; i
< arbiters
[arbiter
].nbr_clients
; i
++)
357 total_assigned
+= arbiters
[arbiter
].requested_slots
[region
][i
];
359 crisv32_arbiter_config(arbiter
, region
, NBR_OF_SLOTS
- total_assigned
);
362 int crisv32_arbiter_watch(unsigned long start
, unsigned long size
,
363 unsigned long clients
, unsigned long accesses
,
371 crisv32_arbiter_init();
373 if (start
> 0x80000000) {
374 printk(KERN_ERR
"Arbiter: %lX doesn't look like a "
375 "physical address", start
);
379 spin_lock(&arbiter_lock
);
381 if (clients
& 0xffff)
383 if (clients
& 0xffff0000)
386 for (arbiter
= 0; arbiter
< ARBITERS
; arbiter
++) {
390 for (i
= 0; i
< NUMBER_OF_BP
; i
++) {
391 if (!watches
[arbiter
][i
].used
) {
394 intr_mask
= REG_RD_INT(marb_bar
,
395 regi_marb_bar
, rw_intr_mask
);
397 intr_mask
= REG_RD_INT(marb_foo
,
398 regi_marb_foo
, rw_intr_mask
);
400 watches
[arbiter
][i
].used
= 1;
401 watches
[arbiter
][i
].start
= start
;
402 watches
[arbiter
][i
].end
= start
+ size
;
403 watches
[arbiter
][i
].cb
= cb
;
405 ret
|= (i
+ 1) << (arbiter
+ 8);
407 REG_WR_INT(marb_bar_bp
,
408 watches
[arbiter
][i
].instance
,
410 watches
[arbiter
][i
].start
);
411 REG_WR_INT(marb_bar_bp
,
412 watches
[arbiter
][i
].instance
,
414 watches
[arbiter
][i
].end
);
415 REG_WR_INT(marb_bar_bp
,
416 watches
[arbiter
][i
].instance
,
418 REG_WR_INT(marb_bar_bp
,
419 watches
[arbiter
][i
].instance
,
423 REG_WR_INT(marb_foo_bp
,
424 watches
[arbiter
][i
].instance
,
426 watches
[arbiter
][i
].start
);
427 REG_WR_INT(marb_foo_bp
,
428 watches
[arbiter
][i
].instance
,
430 watches
[arbiter
][i
].end
);
431 REG_WR_INT(marb_foo_bp
,
432 watches
[arbiter
][i
].instance
,
434 REG_WR_INT(marb_foo_bp
,
435 watches
[arbiter
][i
].instance
,
436 rw_clients
, clients
>> 16);
449 REG_WR_INT(marb_bar
, regi_marb_bar
,
450 rw_intr_mask
, intr_mask
);
452 REG_WR_INT(marb_foo
, regi_marb_foo
,
453 rw_intr_mask
, intr_mask
);
455 spin_unlock(&arbiter_lock
);
461 spin_unlock(&arbiter_lock
);
468 int crisv32_arbiter_unwatch(int id
)
473 crisv32_arbiter_init();
475 spin_lock(&arbiter_lock
);
477 for (arbiter
= 0; arbiter
< ARBITERS
; arbiter
++) {
481 intr_mask
= REG_RD_INT(marb_bar
, regi_marb_bar
,
484 intr_mask
= REG_RD_INT(marb_foo
, regi_marb_foo
,
487 id2
= (id
& (0xff << (arbiter
+ 8))) >> (arbiter
+ 8);
491 if ((id2
>= NUMBER_OF_BP
) || (!watches
[arbiter
][id2
].used
)) {
492 spin_unlock(&arbiter_lock
);
496 memset(&watches
[arbiter
][id2
], 0,
497 sizeof(struct crisv32_watch_entry
));
509 REG_WR_INT(marb_bar
, regi_marb_bar
, rw_intr_mask
,
512 REG_WR_INT(marb_foo
, regi_marb_foo
, rw_intr_mask
,
516 spin_unlock(&arbiter_lock
);
520 extern void show_registers(struct pt_regs
*regs
);
524 crisv32_foo_arbiter_irq(int irq
, void *dev_id
)
526 reg_marb_foo_r_masked_intr masked_intr
=
527 REG_RD(marb_foo
, regi_marb_foo
, r_masked_intr
);
528 reg_marb_foo_bp_r_brk_clients r_clients
;
529 reg_marb_foo_bp_r_brk_addr r_addr
;
530 reg_marb_foo_bp_r_brk_op r_op
;
531 reg_marb_foo_bp_r_brk_first_client r_first
;
532 reg_marb_foo_bp_r_brk_size r_size
;
533 reg_marb_foo_bp_rw_ack ack
= {0};
534 reg_marb_foo_rw_ack_intr ack_intr
= {
535 .bp0
= 1, .bp1
= 1, .bp2
= 1, .bp3
= 1
537 struct crisv32_watch_entry
*watch
;
538 unsigned arbiter
= (unsigned)dev_id
;
540 masked_intr
= REG_RD(marb_foo
, regi_marb_foo
, r_masked_intr
);
543 watch
= &watches
[arbiter
][0];
544 else if (masked_intr
.bp1
)
545 watch
= &watches
[arbiter
][1];
546 else if (masked_intr
.bp2
)
547 watch
= &watches
[arbiter
][2];
548 else if (masked_intr
.bp3
)
549 watch
= &watches
[arbiter
][3];
553 /* Retrieve all useful information and print it. */
554 r_clients
= REG_RD(marb_foo_bp
, watch
->instance
, r_brk_clients
);
555 r_addr
= REG_RD(marb_foo_bp
, watch
->instance
, r_brk_addr
);
556 r_op
= REG_RD(marb_foo_bp
, watch
->instance
, r_brk_op
);
557 r_first
= REG_RD(marb_foo_bp
, watch
->instance
, r_brk_first_client
);
558 r_size
= REG_RD(marb_foo_bp
, watch
->instance
, r_brk_size
);
560 printk(KERN_DEBUG
"Arbiter IRQ\n");
561 printk(KERN_DEBUG
"Clients %X addr %X op %X first %X size %X\n",
562 REG_TYPE_CONV(int, reg_marb_foo_bp_r_brk_clients
, r_clients
),
563 REG_TYPE_CONV(int, reg_marb_foo_bp_r_brk_addr
, r_addr
),
564 REG_TYPE_CONV(int, reg_marb_foo_bp_r_brk_op
, r_op
),
565 REG_TYPE_CONV(int, reg_marb_foo_bp_r_brk_first_client
, r_first
),
566 REG_TYPE_CONV(int, reg_marb_foo_bp_r_brk_size
, r_size
));
568 REG_WR(marb_foo_bp
, watch
->instance
, rw_ack
, ack
);
569 REG_WR(marb_foo
, regi_marb_foo
, rw_ack_intr
, ack_intr
);
571 printk(KERN_DEBUG
"IRQ occured at %X\n", (unsigned)get_irq_regs());
580 crisv32_bar_arbiter_irq(int irq
, void *dev_id
)
582 reg_marb_bar_r_masked_intr masked_intr
=
583 REG_RD(marb_bar
, regi_marb_bar
, r_masked_intr
);
584 reg_marb_bar_bp_r_brk_clients r_clients
;
585 reg_marb_bar_bp_r_brk_addr r_addr
;
586 reg_marb_bar_bp_r_brk_op r_op
;
587 reg_marb_bar_bp_r_brk_first_client r_first
;
588 reg_marb_bar_bp_r_brk_size r_size
;
589 reg_marb_bar_bp_rw_ack ack
= {0};
590 reg_marb_bar_rw_ack_intr ack_intr
= {
591 .bp0
= 1, .bp1
= 1, .bp2
= 1, .bp3
= 1
593 struct crisv32_watch_entry
*watch
;
594 unsigned arbiter
= (unsigned)dev_id
;
596 masked_intr
= REG_RD(marb_bar
, regi_marb_bar
, r_masked_intr
);
599 watch
= &watches
[arbiter
][0];
600 else if (masked_intr
.bp1
)
601 watch
= &watches
[arbiter
][1];
602 else if (masked_intr
.bp2
)
603 watch
= &watches
[arbiter
][2];
604 else if (masked_intr
.bp3
)
605 watch
= &watches
[arbiter
][3];
609 /* Retrieve all useful information and print it. */
610 r_clients
= REG_RD(marb_bar_bp
, watch
->instance
, r_brk_clients
);
611 r_addr
= REG_RD(marb_bar_bp
, watch
->instance
, r_brk_addr
);
612 r_op
= REG_RD(marb_bar_bp
, watch
->instance
, r_brk_op
);
613 r_first
= REG_RD(marb_bar_bp
, watch
->instance
, r_brk_first_client
);
614 r_size
= REG_RD(marb_bar_bp
, watch
->instance
, r_brk_size
);
616 printk(KERN_DEBUG
"Arbiter IRQ\n");
617 printk(KERN_DEBUG
"Clients %X addr %X op %X first %X size %X\n",
618 REG_TYPE_CONV(int, reg_marb_bar_bp_r_brk_clients
, r_clients
),
619 REG_TYPE_CONV(int, reg_marb_bar_bp_r_brk_addr
, r_addr
),
620 REG_TYPE_CONV(int, reg_marb_bar_bp_r_brk_op
, r_op
),
621 REG_TYPE_CONV(int, reg_marb_bar_bp_r_brk_first_client
, r_first
),
622 REG_TYPE_CONV(int, reg_marb_bar_bp_r_brk_size
, r_size
));
624 REG_WR(marb_bar_bp
, watch
->instance
, rw_ack
, ack
);
625 REG_WR(marb_bar
, regi_marb_bar
, rw_ack_intr
, ack_intr
);
627 printk(KERN_DEBUG
"IRQ occured at %X\n", (unsigned)get_irq_regs()->erp
);