-static int send_prop(uint32_t *buf)
-{
- mem_barrier();
- mb_write(MB_CHAN_PROP, (uint32_t)buf >> 4);
- mb_read(MB_CHAN_PROP);
- mem_barrier();
- return propbuf[1] == PROP_RESP_OK ? 0 : -1;
-}
-
-int prop_blankscr(int onoff)
-{
- uint32_t *pb = propbuf;
-
- *pb++ = 32;
- *pb++ = 0;
- *pb++ = PROP_TAG_BLANKSCR;
- *pb++ = 4; /* data size */
- *pb++ = PROP_CODE_REQ;
- *pb++ = onoff ? 1 : 0;
- *pb++ = PROP_TAG_END;
- *pb++ = 0; /* padding */
-
- return send_prop(propbuf);
-}
-
-int prop_setres(int xsz, int ysz)
-{
- uint32_t *pb = propbuf;
-
- *pb++ = 32;
- *pb++ = 0;
- *pb++ = PROP_TAG_PHYSRES | PROP_TAG_SET;
- *pb++ = 8; /* data size */
- *pb++ = PROP_CODE_REQ;
- *pb++ = xsz;
- *pb++ = ysz;
- *pb++ = PROP_TAG_END;
-
- return send_prop(propbuf);
-}
-
-int prop_getres(int *xsz, int *ysz)
-{
- uint32_t *pb = propbuf;
- uint32_t *data;
-
- *pb++ = 32;
- *pb++ = 0;
- *pb++ = PROP_TAG_PHYSRES;
- *pb++ = 8;
- *pb++ = PROP_CODE_REQ;
- data = pb;
- *pb++ = 0;
- *pb++ = 0;
- *pb++ = PROP_TAG_END;
-
- if(send_prop(propbuf) == -1) {
- return -1;
- }
- *xsz = data[0];
- *ysz = data[1];
- return 0;
-}
-
-int prop_setvres(int xsz, int ysz)
-{
- uint32_t *pb = propbuf;
-
- *pb++ = 32;
- *pb++ = 0;
- *pb++ = PROP_TAG_VIRTRES | PROP_TAG_SET;
- *pb++ = 8; /* data size */
- *pb++ = PROP_CODE_REQ;
- *pb++ = xsz;
- *pb++ = ysz;
- *pb++ = PROP_TAG_END;
-
- return send_prop(propbuf);
-}
-
-int prop_getvres(int *xsz, int *ysz)
-{
- uint32_t *pb = propbuf;
- uint32_t *data;
-
- *pb++ = 32;
- *pb++ = 0;
- *pb++ = PROP_TAG_VIRTRES;
- *pb++ = 8;
- *pb++ = PROP_CODE_REQ;
- data = pb;
- *pb++ = 0;
- *pb++ = 0;
- *pb++ = PROP_TAG_END;
-
- if(send_prop(propbuf) == -1) {
- return -1;
- }
- *xsz = data[0];
- *ysz = data[1];
- return 0;
-}
-
-int prop_setdepth(int bpp)
-{
- uint32_t *pb = propbuf;
-
- *pb++ = 32;
- *pb++ = 0;
- *pb++ = PROP_TAG_DEPTH | PROP_TAG_SET;
- *pb++ = 4;
- *pb++ = PROP_CODE_REQ;
- *pb++ = bpp;
- *pb++ = PROP_TAG_END;
- *pb++ = 0; /* padding */
-
- return send_prop(propbuf);
-}
-
-int prop_getdepth(void)
-{
- uint32_t *pb = propbuf;
- uint32_t *data;
-
- *pb++ = 32;
- *pb++ = 0;
- *pb++ = PROP_TAG_DEPTH;
- *pb++ = 4; /* data size */
- *pb++ = PROP_CODE_REQ;
- data = pb;
- *pb++ = 0;
- *pb++ = PROP_TAG_END;
- *pb++ = 0; /* padding */
-
- if(send_prop(propbuf) == -1) {
- return 0;
- }
- return *data;
-}
-
-int prop_getpitch(void)
-{
- uint32_t *pb = propbuf;
- uint32_t *data;
-
- *pb++ = 32;
- *pb++ = 0;
- *pb++ = PROP_TAG_PITCH;
- *pb++ = 4; /* data size */
- *pb++ = PROP_CODE_REQ;
- data = pb;
- *pb++ = 0;
- *pb++ = PROP_TAG_END;
- *pb++ = 0; /* padding */
-
- if(send_prop(propbuf) == -1) {
- return 0;
- }
- return *data;
-}
-
-void *prop_allocbuf(int *size)
-{
- uint32_t *pb = propbuf;
- uint32_t *data;
-
- *pb++ = 32;
- *pb++ = 0;
- *pb++ = PROP_TAG_ALLOCBUF;
- *pb++ = 8; /* data size */
- *pb++ = PROP_CODE_REQ;
- data = pb;
- *pb++ = 16; /* alignment */
- *pb++ = 0;
- *pb++ = PROP_TAG_END;
-
- if(send_prop(propbuf) == -1) {
- return 0;
- }
- *size = data[1];
- return (void*)bus2phys(data[0]);
-}
-
-uint32_t mb_read(int chan)
-{
- uint32_t val;
- do {
- mem_barrier();
- while(REG_MB_STAT & MB_STAT_EMPTY);
- mem_barrier();
- val = REG_MB_READ;
- } while((val & 0xf) != chan);
- return val >> 4;
-}
-
-void mb_write(int chan, uint32_t val)