29. MailBox
29.1 Introduction
Mailbox provides CA7 and ARM926 to transfer data to each other through RGST and Interrupt. Both directions support the first type of communication (Remote Function Call) and the second type of communication (Latency Sensitive).
On the RGST, two Register Groups are planned for data transfer in CA7 -> ARM926 and ARM926 -> CA7.
Group 258: Provided CA7 -> ARM926 transfer data usage.
Group 259: Provided ARM926 -> CA7 transfer data usage.
29.2 Function Diagram
A generalized function diagram of MailBox is shown in Figure 29-1.
Figure 29-1 MailBox Functional Blocks
First Function Communication (Remote Function Call)
CA7 continuously writes data to Group 258 (there are 20*32-bit registers in total), and is triggered by software operate Interrupt and notify ARM926.
ARM926 continuously writes data to Group 259 (there are 20*32-bit registers in total), triggered by software operate Interrupt and notify CA7.
The second type of communication (Latency Sensitive)
CA7 will write data to Group 258 then trigger Interrupt to notify ARM926 that only 32-bit transmission is supported at a time.
ARM926 writes data to Group 259 then triggers Interrupt notification CA7, which only supports 32-bit transmission at a time.
29.3 Firmware Architecture
CA7 read status before write information / ARM926 read status before read information
CA7 writes the information to be exchanged into G258.4~31, but before writing, read G258.1[31:4] first, and confirm that the Register Status corresponding to each register is unlocked before it can be written. It indicate that register data has been read by ARM926, can be written to overwrite; but if it is forced to write register with register status of 1, the MailBox is processed by overwriting the previous data. This part should be noted in use. At the same time, Mailbox will pull the corresponding bit of the register to be written in G258.2[31:4] to 1 as the record of transaction overwrite flag.
Finally, according to the first type of communication or the second type of communication to trigger the corresponding interrupt, notify ARM926 to read G258.4~31. The first type of communication before ARM926 read G258.4~23, read G258.1 at first. Only the register corresponding to Register Status is 1 can be read. The second type of communication will first read the corresponding bit of G258.1 according to the interrupt, to confirm that Register Status is 1, and then read from the corresponding register.
Figure 29-2 MailBox Firmware Architecture1
ARM926 read status before write information / CA7 read status before read information
ARM926 writes the information to be exchanged into G259.4~31, but before writing, read G259.1[31:4] first, and confirm that the Register Status corresponding to each register is unlock. It indicates that register data has been read by CA7 and can be overwritten by the overlay. However, if the register with Register Status is 1 is forcibly written, the processing of MailBox is to overwrite the previous data. This part should be noted in use. At the same time, Mailbox will pull the corresponding bit of the register to be written in G259.2[31:4] to 1 as the record of transaction overwrite flag.
Finally, trigger the corresponding interrupt according to the first type of communication or the second type of communication, and notify CA7 to read G259.4~31. The first type of communication should be before CA7 read G259.4~23, read G259.1 at first. Only read the register corresponding to Register Status is 1. The second type of communication will first read the corresponding bit of G259.1 according to the interrupt, to confirm the Register Status is 1, then read from the corresponding register.
Figure 29-3 MailBox Firmware Architecture2
29.4 Registers Map
29.4.1 Registers Memory Map
Address | Group No. | Register Name | Register Description |
0x9C008100 | G258.0 | Mbox_cpub_int_trigger | Trigger CPUB_INT |
0x9C008104 | G258.1 | Mbox0_writelock_flag | Monitor the writelock status of mailbox0 |
0x9C008108 | G258.2 | Mbox0_overwrite_flag | Monitor the overwrite status of mailbox0 |
0x9C00810C | G258.3 | RESERVED | |
0x9C008110 | G258.4 | Mbox0_normal_trans[0] | Normal data transfer from CPUA to CPUB |
~~ | ~~ | ~~ | ~~ |
0x9C00815C | G258.23 | Mbox0_normal_trans[19] | Normal data transfer from CPUA to CPUB |
0x9C008160 | G258.24 | Mbox0_direct_trans[0] | Direct data transfer from CPUA to CPUB |
~~ | ~~ | ~~ | ~~ |
0x9C00817C | G258.31 | Mbox0_direct_trans[7] | Direct data transfer from CPUA to CPUB |
Address | Group No. | Register Name | Register Description |
0x9C008180 | G259.0 | Mbox_cpua_int_trigger | Trigger CPUA_INT |
0x9C008184 | G259.1 | Mbox1_writelock_flag | Monitor the writelock status of mailbox1 |
0x9C008188 | G259.2 | Mbox1_overwrite_flag | Monitor the overwrite status of mailbox1 |
0x9C00818C | G259.3 | RESERVED | |
0x9C008190 | G259.4 | Mbox1_normal_trans[0] | Normal data transfer from CPUB to CPUA |
~~ | ~~ | ~~ | ~~ |
0x9C0081DC | G259.23 | Mbox1_normal_trans[19] | Normal data transfer from CPUB to CPUA |
0x9C0081E0 | G259.24 | Mbox1_direct_trans[0] | Direct data transfer from CPUB to CPUA |
~~ | ~~ | ~~ | ~~ |
0x9C0081FC | G259.31 | Mbox1_direct_trans[7] | Direct data transfer from CPUB to CPUA |
29.4.2 Registers Description
Group 258 Mailbox CPUA to CPUB
258.0 Trigger CPUB_INT (mbox_cpub_int_trigger)
Address: 0x9C008100
Reset: 0x0000 0000
Field Name | Bit | Access | Description |
Reserved | 31:1 | RO | Reserved bits |
CPUB_INT | 0 | RW | Trigger CPUB_INT |
258.1 Mailbox0 Writelock Flag Monitor (mbox0_writelock_flag)
Address: 0x9C008104
Reset: 0x0000 0000
Field Name | Bit | Access | Description |
mbox0_direct_writelock07 | 31 | RW | Monitor the writelock status of direct_reg07 |
mbox0_direct_writelock06 | 30 | RW | Monitor the writelock status of direct_reg06 |
mbox0_direct_writelock05 | 29 | RW | Monitor the writelock status of direct_reg05 |
mbox0_direct_writelock04 | 28 | RW | Monitor the writelock status of direct_reg04 |
mbox0_direct_writelock03 | 27 | RW | Monitor the writelock status of direct_reg03 |
mbox0_direct_writelock02 | 26 | RW | Monitor the writelock status of direct_reg02 |
mbox0_direct_writelock01 | 25 | RW | Monitor the writelock status of direct_reg01 |
mbox0_direct_writelock00 | 24 | RW | Monitor the writelock status of direct_reg00 |
mbox0_ normal _writelock19 | 23 | RW | Monitor the writelock status of normal_reg19 |
mbox0_ normal _writelock18 | 22 | RW | Monitor the writelock status of normal _reg18 |
mbox0_ normal _writelock17 | 21 | RW | Monitor the writelock status of normal _reg17 |
mbox0_ normal _writelock16 | 20 | RW | Monitor the writelock status of normal _reg16 |
mbox0_ normal _writelock15 | 19 | RW | Monitor the writelock status of normal _reg15 |
mbox0_ normal _writelock14 | 18 | RW | Monitor the writelock status of normal _reg14 |
mbox0_ normal _writelock13 | 17 | RW | Monitor the writelock status of normal _reg13 |
mbox0_ normal _writelock12 | 16 | RW | Monitor the writelock status of normal _reg12 |
mbox0_ normal _writelock11 | 15 | RW | Monitor the writelock status of normal_reg11 |
mbox0_ normal _writelock10 | 14 | RW | Monitor the writelock status of normal _reg10 |
mbox0_ normal _writelock09 | 13 | RW | Monitor the writelock status of normal _reg09 |
mbox0_ normal _writelock08 | 12 | RW | Monitor the writelock status of normal _reg08 |
mbox0_ normal _writelock07 | 11 | RW | Monitor the writelock status of normal _reg07 |
mbox0_ normal _writelock06 | 10 | RW | Monitor the writelock status of normal _reg06 |
mbox0_ normal _writelock05 | 9 | RW | Monitor the writelock status of normal _reg05 |
mbox0_ normal _writelock04 | 8 | RW | Monitor the writelock status of normal _reg04 |
mbox0_ normal _writelock03 | 7 | RW | Monitor the writelock status of normal_reg03 |
mbox0_ normal _writelock02 | 6 | RW | Monitor the writelock status of normal _reg02 |