Lines Matching +full:mbox +full:- +full:name
5 * communication with low-bandwidth GPU peripherals. Refs:
7 * https://github.com/raspberrypi/firmware/wiki/Accessing-mailboxes
10 * See the COPYING file in the top-level directory.
35 #define ARM_MC_IHAVEDATAIRQEN 0x00000001 /* mbox irq enable: has data */
36 #define ARM_MC_IHAVESPACEIRQEN 0x00000002 /* mbox irq enable: has space */
37 #define ARM_MC_OPPISEMPTYIRQEN 0x00000004 /* mbox irq enable: Opp is empty */
38 #define ARM_MC_MAIL_CLEAR 0x00000008 /* mbox clear write 1, then 0 */
39 #define ARM_MC_IHAVEDATAIRQPEND 0x00000010 /* mbox irq pending: has space */
40 #define ARM_MC_IHAVESPACEIRQPEND 0x00000020 /* mbox irq pending: Opp is empty */
41 #define ARM_MC_OPPISEMPTYIRQPEND 0x00000040 /* mbox irq pending */
49 mb->status &= ~(ARM_MS_EMPTY | ARM_MS_FULL); in mbox_update_status()
50 if (mb->count == 0) { in mbox_update_status()
51 mb->status |= ARM_MS_EMPTY; in mbox_update_status()
52 } else if (mb->count == MBOX_SIZE) { in mbox_update_status()
53 mb->status |= ARM_MS_FULL; in mbox_update_status()
61 mb->count = 0; in mbox_reset()
62 mb->config = 0; in mbox_reset()
64 mb->reg[n] = MBOX_INVALID_DATA; in mbox_reset()
74 assert(mb->count > 0); in mbox_pull()
75 assert(index < mb->count); in mbox_pull()
77 val = mb->reg[index]; in mbox_pull()
78 for (n = index + 1; n < mb->count; n++) { in mbox_pull()
79 mb->reg[n - 1] = mb->reg[n]; in mbox_pull()
81 mb->count--; in mbox_pull()
82 mb->reg[mb->count] = MBOX_INVALID_DATA; in mbox_pull()
91 assert(mb->count < MBOX_SIZE); in mbox_push()
92 mb->reg[mb->count++] = val; in mbox_push()
102 s->mbox_irq_disabled = true; in bcm2835_mbox_update()
104 /* Get pending responses and put them in the vc->arm mbox, in bcm2835_mbox_update()
108 while (s->available[n] && !(s->mbox[0].status & ARM_MS_FULL)) { in bcm2835_mbox_update()
109 value = ldl_le_phys(&s->mbox_as, n << MBOX_AS_CHAN_SHIFT); in bcm2835_mbox_update()
111 mbox_push(&s->mbox[0], value); in bcm2835_mbox_update()
115 /* TODO (?): Try to push pending requests from the arm->vc mbox */ in bcm2835_mbox_update()
117 /* Re-enable calls from the IRQ routine */ in bcm2835_mbox_update()
118 s->mbox_irq_disabled = false; in bcm2835_mbox_update()
122 s->mbox[0].config &= ~ARM_MC_IHAVEDATAIRQPEND; in bcm2835_mbox_update()
123 if (!(s->mbox[0].status & ARM_MS_EMPTY)) { in bcm2835_mbox_update()
124 s->mbox[0].config |= ARM_MC_IHAVEDATAIRQPEND; in bcm2835_mbox_update()
125 if (s->mbox[0].config & ARM_MC_IHAVEDATAIRQEN) { in bcm2835_mbox_update()
130 qemu_set_irq(s->arm_irq, set); in bcm2835_mbox_update()
137 s->available[irq] = level; in bcm2835_mbox_set_irq()
142 if (!s->mbox_irq_disabled) { in bcm2835_mbox_set_irq()
156 if (s->mbox[0].status & ARM_MS_EMPTY) { in bcm2835_mbox_read()
159 res = mbox_pull(&s->mbox[0], 0); in bcm2835_mbox_read()
164 res = s->mbox[0].reg[0]; in bcm2835_mbox_read()
171 res = s->mbox[0].status; in bcm2835_mbox_read()
175 res = s->mbox[0].config; in bcm2835_mbox_read()
179 res = s->mbox[1].status; in bcm2835_mbox_read()
210 s->mbox[0].config &= ~ARM_MC_IHAVEDATAIRQEN; in bcm2835_mbox_write()
211 s->mbox[0].config |= value & ARM_MC_IHAVEDATAIRQEN; in bcm2835_mbox_write()
215 if (s->mbox[1].status & ARM_MS_FULL) { in bcm2835_mbox_write()
222 if (ldl_le_phys(&s->mbox_as, childaddr + MBOX_AS_PENDING)) { in bcm2835_mbox_write()
223 /* Child busy, push delayed. Push it in the arm->vc mbox */ in bcm2835_mbox_write()
224 mbox_push(&s->mbox[1], value); in bcm2835_mbox_write()
227 stl_le_phys(&s->mbox_as, childaddr, value); in bcm2835_mbox_write()
257 .name = TYPE_BCM2835_MBOX "_box",
271 .name = TYPE_BCM2835_MBOX,
276 VMSTATE_STRUCT_ARRAY(mbox, BCM2835MboxState, 2, 1,
286 memory_region_init_io(&s->iomem, obj, &bcm2835_mbox_ops, s, in bcm2835_mbox_init()
288 sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->iomem); in bcm2835_mbox_init()
289 sysbus_init_irq(SYS_BUS_DEVICE(s), &s->arm_irq); in bcm2835_mbox_init()
298 mbox_reset(&s->mbox[0]); in bcm2835_mbox_reset()
299 mbox_reset(&s->mbox[1]); in bcm2835_mbox_reset()
300 s->mbox_irq_disabled = false; in bcm2835_mbox_reset()
302 s->available[n] = false; in bcm2835_mbox_reset()
311 obj = object_property_get_link(OBJECT(dev), "mbox-mr", &error_abort); in bcm2835_mbox_realize()
312 s->mbox_mr = MEMORY_REGION(obj); in bcm2835_mbox_realize()
313 address_space_init(&s->mbox_as, s->mbox_mr, TYPE_BCM2835_MBOX "-memory"); in bcm2835_mbox_realize()
321 dc->realize = bcm2835_mbox_realize; in bcm2835_mbox_class_init()
323 dc->vmsd = &vmstate_bcm2835_mbox; in bcm2835_mbox_class_init()
327 .name = TYPE_BCM2835_MBOX,