move arm processor resource to generic location
[AROS.git] / arch / arm-raspi / boot / vc_mb.c
blobe684dd0713036c3aaf00f0c0754eada3ed22c516
1 /*
2 Copyright © 2013-2015, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: VideoCore mailbox support routines
6 Lang: english
7 */
9 #include <hardware/bcm283x.h>
10 #include <hardware/videocore.h>
12 volatile unsigned int *vcmb_read(void *mb, unsigned int chan)
14 unsigned int try = 0x2000000;
15 unsigned int msg;
17 if (chan <= VCMB_CHAN_MAX)
19 while(1)
21 while ((*((volatile unsigned int *)(mb + VCMB_STATUS)) & VCMB_STATUS_READREADY) != 0)
23 asm volatile ("mcr p15, #0, %[r], c7, c14, #0" : : [r] "r" (0) );
25 if(try-- == 0)
27 break;
30 asm volatile ("mcr p15, #0, %[r], c7, c10, #5" : : [r] "r" (0) );
32 msg = *((volatile unsigned int *)(mb + VCMB_READ));
34 asm volatile ("mcr p15, #0, %[r], c7, c10, #5" : : [r] "r" (0) );
36 if ((msg & VCMB_CHAN_MASK) == chan)
37 return (volatile unsigned int *)(msg & ~VCMB_CHAN_MASK);
40 return (volatile unsigned int *)-1;
43 void vcmb_write(void *mb, unsigned int chan, void *msg)
45 if ((((unsigned int)msg & VCMB_CHAN_MASK) == 0) && (chan <= VCMB_CHAN_MAX))
47 while ((*((volatile unsigned int *)(mb + VCMB_STATUS)) & VCMB_STATUS_WRITEREADY) != 0)
49 asm volatile ("mcr p15, #0, %[r], c7, c14, #0" : : [r] "r" (0) );
52 asm volatile ("mcr p15, #0, %[r], c7, c10, #5" : : [r] "r" (0) );
54 *((volatile unsigned int *)(mb + VCMB_WRITE)) = ((unsigned int)msg | chan);