unsigned qpu_enable(int file_desc, unsigned enable) { int i=0; unsigned p[32]; p[i++] = 0; // size p[i++] = 0x00000000; // process request p[i++] = 0x30012; // (the tag id) p[i++] = 4; // (size of the buffer) p[i++] = 4; // (size of the data) p[i++] = enable; p[i++] = 0x00000000; // end tag p[0] = i*sizeof *p; // actual size mbox_property(file_desc, p); return p[5]; }
uint32_t mem_unlock(int file_desc, uint32_t handle) { int i=0; uint32_t p[32]; p[i++] = 0; // size p[i++] = 0x00000000; // process request p[i++] = 0x3000e; // (the tag id) p[i++] = 4; // (size of the buffer) p[i++] = 4; // (size of the data) p[i++] = handle; p[i++] = 0x00000000; // end tag p[0] = i * sizeof(*p); // actual size mbox_property(file_desc, p); return p[5]; }
unsigned mem_alloc(int file_desc, unsigned size, unsigned align, unsigned flags) { int i=0; unsigned p[32]; p[i++] = 0; // size p[i++] = 0x00000000; // process request p[i++] = 0x3000c; // (the tag id) p[i++] = 12; // (size of the buffer) p[i++] = 12; // (size of the data) p[i++] = size; // (num bytes? or pages?) p[i++] = align; // (alignment) p[i++] = flags; // (MEM_FLAG_L1_NONALLOCATING) p[i++] = 0x00000000; // end tag p[0] = i*sizeof *p; // actual size mbox_property(file_desc, p); return p[5]; }
unsigned execute_qpu(int file_desc, unsigned num_qpus, unsigned control, unsigned noflush, unsigned timeout) { int i=0; unsigned p[32]; p[i++] = 0; // size p[i++] = 0x00000000; // process request p[i++] = 0x30011; // (the tag id) p[i++] = 16; // (size of the buffer) p[i++] = 16; // (size of the data) p[i++] = num_qpus; p[i++] = control; p[i++] = noflush; p[i++] = timeout; // ms p[i++] = 0x00000000; // end tag p[0] = i*sizeof *p; // actual size mbox_property(file_desc, p); return p[5]; }
unsigned mem_lock(int file_desc, unsigned handle) { int i=0; unsigned p[32]; p[i++] = 0; // size p[i++] = 0x00000000; // process request p[i++] = 0x3000d; // (the tag id) p[i++] = 4; // (size of the buffer) p[i++] = 4; // (size of the data) p[i++] = handle; p[i++] = 0x00000000; // end tag p[0] = i*sizeof *p; // actual size if (mbox_property(file_desc, p) < 0) return ~0; else return p[5]; }
// helper function to set the framebuffer virtual offset == pan static unsigned set_fb_voffs(unsigned *x, unsigned *y) { int i=0; unsigned p[32]; p[i++] = 0; // size p[i++] = 0x00000000; // process request p[i++] = 0x00048009; // get physical (display) width/height p[i++] = 0x00000008; // buffer size p[i++] = 0x00000000; // request size p[i++] = *x; // value buffer p[i++] = *y; // value buffer 2 p[i++] = 0x00000000; // end tag p[0] = i*sizeof *p; // actual size mbox_property(p); *x = p[5]; *y = p[6]; return p[1]; }
unsigned execute_code(int file_desc, unsigned code, unsigned r0, unsigned r1, unsigned r2, unsigned r3, unsigned r4, unsigned r5) { int i=0; unsigned p[32]; p[i++] = 0; // size p[i++] = 0x00000000; // process request p[i++] = 0x30010; // (the tag id) p[i++] = 28; // (size of the buffer) p[i++] = 28; // (size of the data) p[i++] = code; p[i++] = r0; p[i++] = r1; p[i++] = r2; p[i++] = r3; p[i++] = r4; p[i++] = r5; p[i++] = 0x00000000; // end tag p[0] = i*sizeof *p; // actual size mbox_property(file_desc, p); return p[5]; }
unsigned get_board_revision(int file_desc) { int i=0; unsigned p[32]; p[i++] = 0; // size p[i++] = 0x00000000; // process request p[i++] = 0x10002; // (the tag id) p[i++] = 4; // (size of the buffer) p[i++] = 0; // (size of the data) p[i++] = 0; // response buffer p[i++] = 0x00000000; // end tag p[0] = i*sizeof *p; // actual size mbox_property(file_desc, p); // printf("get_board_revision mbox response buffer:\n"); // int pi = 0; // int length = p[0]/sizeof *p; // for (; pi < length; pi++) { // printf("%d: %#x\n", pi, p[pi]); // } return p[5]; }