Lines Matching +full:8 +full:- +full:4 +full:- +full:4 +full:- +full:4 +full:- +full:12

5  * See the COPYING file in the top-level directory.
11 #include "hw/qdev-properties.h"
15 #include "hw/arm/raspberrypi-fw-defs.h"
24 /* https://github.com/raspberrypi/firmware/wiki/Mailbox-property-interface */
35 BCM2835FBConfig fbconfig = s->fbdev->config; in bcm2835_property_mbox_push()
40 s->addr = value; in bcm2835_property_mbox_push()
42 tot_len = ldl_le_phys(&s->dma_as, value); in bcm2835_property_mbox_push()
44 /* @(addr + 4) : Buffer response code */ in bcm2835_property_mbox_push()
45 value = s->addr + 8; in bcm2835_property_mbox_push()
46 while (value + 8 <= s->addr + tot_len) { in bcm2835_property_mbox_push()
47 uint32_t tag = ldl_le_phys(&s->dma_as, value); in bcm2835_property_mbox_push()
48 uint32_t bufsize = ldl_le_phys(&s->dma_as, value + 4); in bcm2835_property_mbox_push()
49 /* @(value + 8) : Request/response indicator */ in bcm2835_property_mbox_push()
55 stl_le_phys(&s->dma_as, value + 12, 346337); in bcm2835_property_mbox_push()
56 resplen = 4; in bcm2835_property_mbox_push()
62 resplen = 4; in bcm2835_property_mbox_push()
65 stl_le_phys(&s->dma_as, value + 12, s->board_rev); in bcm2835_property_mbox_push()
66 resplen = 4; in bcm2835_property_mbox_push()
69 resplen = sizeof(s->macaddr.a); in bcm2835_property_mbox_push()
70 dma_memory_write(&s->dma_as, value + 12, s->macaddr.a, resplen, in bcm2835_property_mbox_push()
77 resplen = 8; in bcm2835_property_mbox_push()
81 stl_le_phys(&s->dma_as, value + 12, 0); in bcm2835_property_mbox_push()
83 stl_le_phys(&s->dma_as, value + 16, s->fbdev->vcram_base); in bcm2835_property_mbox_push()
84 resplen = 8; in bcm2835_property_mbox_push()
88 stl_le_phys(&s->dma_as, value + 12, s->fbdev->vcram_base); in bcm2835_property_mbox_push()
90 stl_le_phys(&s->dma_as, value + 16, s->fbdev->vcram_size); in bcm2835_property_mbox_push()
91 resplen = 8; in bcm2835_property_mbox_push()
99 uint32_t state = ldl_le_phys(&s->dma_as, value + 16); in bcm2835_property_mbox_push()
100 stl_le_phys(&s->dma_as, value + 16, (state & 1)); in bcm2835_property_mbox_push()
101 resplen = 8; in bcm2835_property_mbox_push()
108 stl_le_phys(&s->dma_as, value + 16, 0x1); in bcm2835_property_mbox_push()
109 resplen = 8; in bcm2835_property_mbox_push()
116 resplen = 8; in bcm2835_property_mbox_push()
122 switch (ldl_le_phys(&s->dma_as, value + 12)) { in bcm2835_property_mbox_push()
124 stl_le_phys(&s->dma_as, value + 16, RPI_FIRMWARE_EMMC_CLK_RATE); in bcm2835_property_mbox_push()
127 stl_le_phys(&s->dma_as, value + 16, RPI_FIRMWARE_UART_CLK_RATE); in bcm2835_property_mbox_push()
130 stl_le_phys(&s->dma_as, value + 16, RPI_FIRMWARE_CORE_CLK_RATE); in bcm2835_property_mbox_push()
133 stl_le_phys(&s->dma_as, value + 16, in bcm2835_property_mbox_push()
137 resplen = 8; in bcm2835_property_mbox_push()
142 stl_le_phys(&s->dma_as, value + 12, 0); in bcm2835_property_mbox_push()
143 stl_le_phys(&s->dma_as, value + 16, RPI_FIRMWARE_ARM_CLK_ID); in bcm2835_property_mbox_push()
144 resplen = 8; in bcm2835_property_mbox_push()
153 resplen = 8; in bcm2835_property_mbox_push()
159 stl_le_phys(&s->dma_as, value + 16, 25000); in bcm2835_property_mbox_push()
160 resplen = 8; in bcm2835_property_mbox_push()
164 stl_le_phys(&s->dma_as, value + 16, 99000); in bcm2835_property_mbox_push()
165 resplen = 8; in bcm2835_property_mbox_push()
171 stl_le_phys(&s->dma_as, value + 12, fbconfig.base); in bcm2835_property_mbox_push()
172 stl_le_phys(&s->dma_as, value + 16, in bcm2835_property_mbox_push()
174 resplen = 8; in bcm2835_property_mbox_push()
180 resplen = 4; in bcm2835_property_mbox_push()
184 resplen = 8; in bcm2835_property_mbox_push()
187 fbconfig.xres = ldl_le_phys(&s->dma_as, value + 12); in bcm2835_property_mbox_push()
188 fbconfig.yres = ldl_le_phys(&s->dma_as, value + 16); in bcm2835_property_mbox_push()
193 stl_le_phys(&s->dma_as, value + 12, fbconfig.xres); in bcm2835_property_mbox_push()
194 stl_le_phys(&s->dma_as, value + 16, fbconfig.yres); in bcm2835_property_mbox_push()
195 resplen = 8; in bcm2835_property_mbox_push()
198 fbconfig.xres_virtual = ldl_le_phys(&s->dma_as, value + 12); in bcm2835_property_mbox_push()
199 fbconfig.yres_virtual = ldl_le_phys(&s->dma_as, value + 16); in bcm2835_property_mbox_push()
204 stl_le_phys(&s->dma_as, value + 12, fbconfig.xres_virtual); in bcm2835_property_mbox_push()
205 stl_le_phys(&s->dma_as, value + 16, fbconfig.yres_virtual); in bcm2835_property_mbox_push()
206 resplen = 8; in bcm2835_property_mbox_push()
209 resplen = 4; in bcm2835_property_mbox_push()
212 fbconfig.bpp = ldl_le_phys(&s->dma_as, value + 12); in bcm2835_property_mbox_push()
217 stl_le_phys(&s->dma_as, value + 12, fbconfig.bpp); in bcm2835_property_mbox_push()
218 resplen = 4; in bcm2835_property_mbox_push()
221 resplen = 4; in bcm2835_property_mbox_push()
224 fbconfig.pixo = ldl_le_phys(&s->dma_as, value + 12); in bcm2835_property_mbox_push()
229 stl_le_phys(&s->dma_as, value + 12, fbconfig.pixo); in bcm2835_property_mbox_push()
230 resplen = 4; in bcm2835_property_mbox_push()
233 resplen = 4; in bcm2835_property_mbox_push()
236 fbconfig.alpha = ldl_le_phys(&s->dma_as, value + 12); in bcm2835_property_mbox_push()
241 stl_le_phys(&s->dma_as, value + 12, fbconfig.alpha); in bcm2835_property_mbox_push()
242 resplen = 4; in bcm2835_property_mbox_push()
245 stl_le_phys(&s->dma_as, value + 12, in bcm2835_property_mbox_push()
247 resplen = 4; in bcm2835_property_mbox_push()
250 resplen = 8; in bcm2835_property_mbox_push()
253 fbconfig.xoffset = ldl_le_phys(&s->dma_as, value + 12); in bcm2835_property_mbox_push()
254 fbconfig.yoffset = ldl_le_phys(&s->dma_as, value + 16); in bcm2835_property_mbox_push()
259 stl_le_phys(&s->dma_as, value + 12, fbconfig.xoffset); in bcm2835_property_mbox_push()
260 stl_le_phys(&s->dma_as, value + 16, fbconfig.yoffset); in bcm2835_property_mbox_push()
261 resplen = 8; in bcm2835_property_mbox_push()
266 stl_le_phys(&s->dma_as, value + 12, 0); in bcm2835_property_mbox_push()
267 stl_le_phys(&s->dma_as, value + 16, 0); in bcm2835_property_mbox_push()
268 stl_le_phys(&s->dma_as, value + 20, 0); in bcm2835_property_mbox_push()
269 stl_le_phys(&s->dma_as, value + 24, 0); in bcm2835_property_mbox_push()
274 uint32_t offset = ldl_le_phys(&s->dma_as, value + 12); in bcm2835_property_mbox_push()
275 uint32_t length = ldl_le_phys(&s->dma_as, value + 16); in bcm2835_property_mbox_push()
282 uint32_t color = ldl_le_phys(&s->dma_as, value + 20 + (e << 2)); in bcm2835_property_mbox_push()
283 stl_le_phys(&s->dma_as, in bcm2835_property_mbox_push()
284 s->fbdev->vcram_base + ((offset + e) << 2), color); in bcm2835_property_mbox_push()
288 stl_le_phys(&s->dma_as, value + 12, resp); in bcm2835_property_mbox_push()
289 resplen = 4; in bcm2835_property_mbox_push()
293 stl_le_phys(&s->dma_as, value + 12, 1); in bcm2835_property_mbox_push()
294 resplen = 4; in bcm2835_property_mbox_push()
298 /* channels 2-5 */ in bcm2835_property_mbox_push()
299 stl_le_phys(&s->dma_as, value + 12, 0x003C); in bcm2835_property_mbox_push()
300 resplen = 4; in bcm2835_property_mbox_push()
310 resplen = strlen(s->command_line); in bcm2835_property_mbox_push()
312 address_space_write(&s->dma_as, value + 12, in bcm2835_property_mbox_push()
313 MEMTXATTRS_UNSPECIFIED, s->command_line, in bcm2835_property_mbox_push()
318 stl_le_phys(&s->dma_as, value + 12, 0); in bcm2835_property_mbox_push()
319 resplen = 4; in bcm2835_property_mbox_push()
323 stl_le_phys(&s->dma_as, in bcm2835_property_mbox_push()
333 uint32_t start_num = ldl_le_phys(&s->dma_as, value + 12); in bcm2835_property_mbox_push()
334 uint32_t number = ldl_le_phys(&s->dma_as, value + 16); in bcm2835_property_mbox_push()
336 resplen = 8 + 4 * number; in bcm2835_property_mbox_push()
340 uint32_t otp_row = bcm2835_otp_get_row(s->otp, in bcm2835_property_mbox_push()
342 stl_le_phys(&s->dma_as, in bcm2835_property_mbox_push()
343 value + 20 + ((n - start_num) << 2), otp_row); in bcm2835_property_mbox_push()
349 uint32_t start_num = ldl_le_phys(&s->dma_as, value + 12); in bcm2835_property_mbox_push()
350 uint32_t number = ldl_le_phys(&s->dma_as, value + 16); in bcm2835_property_mbox_push()
352 resplen = 4; in bcm2835_property_mbox_push()
357 bcm2835_otp_set_row(s->otp, in bcm2835_property_mbox_push()
364 if (bcm2835_otp_get_row(s->otp, BCM2835_OTP_ROW_32) & in bcm2835_property_mbox_push()
371 uint32_t otp_row = ldl_le_phys(&s->dma_as, in bcm2835_property_mbox_push()
372 value + 20 + ((n - start_num) << 2)); in bcm2835_property_mbox_push()
373 bcm2835_otp_set_row(s->otp, in bcm2835_property_mbox_push()
379 /* Device-specific private key */ in bcm2835_property_mbox_push()
382 uint32_t start_num = ldl_le_phys(&s->dma_as, value + 12); in bcm2835_property_mbox_push()
383 uint32_t number = ldl_le_phys(&s->dma_as, value + 16); in bcm2835_property_mbox_push()
385 resplen = 8 + 4 * number; in bcm2835_property_mbox_push()
389 uint32_t otp_row = bcm2835_otp_get_row(s->otp, in bcm2835_property_mbox_push()
391 stl_le_phys(&s->dma_as, in bcm2835_property_mbox_push()
392 value + 20 + ((n - start_num) << 2), otp_row); in bcm2835_property_mbox_push()
398 uint32_t start_num = ldl_le_phys(&s->dma_as, value + 12); in bcm2835_property_mbox_push()
399 uint32_t number = ldl_le_phys(&s->dma_as, value + 16); in bcm2835_property_mbox_push()
401 resplen = 4; in bcm2835_property_mbox_push()
404 if (bcm2835_otp_get_row(s->otp, BCM2835_OTP_ROW_32) & in bcm2835_property_mbox_push()
411 uint32_t otp_row = ldl_le_phys(&s->dma_as, in bcm2835_property_mbox_push()
412 value + 20 + ((n - start_num) << 2)); in bcm2835_property_mbox_push()
413 bcm2835_otp_set_row(s->otp, in bcm2835_property_mbox_push()
429 stl_le_phys(&s->dma_as, value + 8, (1 << 31) | resplen); in bcm2835_property_mbox_push()
430 value += bufsize + 12; in bcm2835_property_mbox_push()
435 bcm2835_fb_reconfigure(s->fbdev, &fbconfig); in bcm2835_property_mbox_push()
439 stl_le_phys(&s->dma_as, s->addr + 4, (1 << 31)); in bcm2835_property_mbox_push()
450 res = MBOX_CHAN_PROPERTY | s->addr; in bcm2835_property_read()
451 s->pending = false; in bcm2835_property_read()
452 qemu_set_irq(s->mbox_irq, 0); in bcm2835_property_read()
456 res = s->pending; in bcm2835_property_read()
476 assert(!s->pending); in bcm2835_property_write()
477 s->pending = true; in bcm2835_property_write()
479 qemu_set_irq(s->mbox_irq, 1); in bcm2835_property_write()
493 .valid.min_access_size = 4,
494 .valid.max_access_size = 4,
513 memory_region_init_io(&s->iomem, OBJECT(s), &bcm2835_property_ops, s, in bcm2835_property_init()
517 * bcm2835_property_ops call into bcm2835_mbox, which in-turn reads from in bcm2835_property_init()
518 * iomem. As such, mark iomem as re-entracy safe. in bcm2835_property_init()
520 s->iomem.disable_reentrancy_guard = true; in bcm2835_property_init()
522 sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->iomem); in bcm2835_property_init()
523 sysbus_init_irq(SYS_BUS_DEVICE(s), &s->mbox_irq); in bcm2835_property_init()
530 s->pending = false; in bcm2835_property_reset()
539 s->fbdev = BCM2835_FB(obj); in bcm2835_property_realize()
541 obj = object_property_get_link(OBJECT(dev), "dma-mr", &error_abort); in bcm2835_property_realize()
542 s->dma_mr = MEMORY_REGION(obj); in bcm2835_property_realize()
543 address_space_init(&s->dma_as, s->dma_mr, TYPE_BCM2835_PROPERTY "-memory"); in bcm2835_property_realize()
546 s->otp = BCM2835_OTP(obj); in bcm2835_property_realize()
549 qemu_macaddr_default_if_unset(&s->macaddr); in bcm2835_property_realize()
555 DEFINE_PROP_UINT32("board-rev", BCM2835PropertyState, board_rev, 0),
556 DEFINE_PROP_STRING("command-line", BCM2835PropertyState, command_line),
564 dc->realize = bcm2835_property_realize; in bcm2835_property_class_init()
565 dc->vmsd = &vmstate_bcm2835_property; in bcm2835_property_class_init()