void smfb_copyrect(struct smfb *fb, int sx, int sy, int dx, int dy, int w, int h) { uint32_t dir; /* Compute rop direction */ if (sy < dy || (sy == dy && sx <= dx)) { sx += w - 1; dx += w - 1; sy += h - 1; dy += h - 1; dir = DE_CTRL_RTOL; } else dir = 0; DPR_WRITE(fb, DPR_SRC_COORDS, DPR_COORDS(sx, sy)); DPR_WRITE(fb, DPR_DST_COORDS, DPR_COORDS(dx, dy)); DPR_WRITE(fb, DPR_SPAN_COORDS, DPR_COORDS(w, h)); DPR_WRITE(fb, DPR_DE_CTRL, DE_CTRL_START | DE_CTRL_ROP_ENABLE | dir | (DE_CTRL_COMMAND_BITBLT << DE_CTRL_COMMAND_SHIFT) | (DE_CTRL_ROP_SRC << DE_CTRL_ROP_SHIFT)); DPR_READ(fb, DPR_DE_CTRL); smfb_wait(fb); }
void smfb_fillrect(struct smfb *fb, int x, int y, int w, int h, int bg) { struct rasops_info *ri; ri = &fb->ri; DPR_WRITE(fb, DPR_FG_COLOR, ri->ri_devcmap[bg]); DPR_WRITE(fb, DPR_DST_COORDS, DPR_COORDS(x, y)); DPR_WRITE(fb, DPR_SPAN_COORDS, DPR_COORDS(w, h)); DPR_WRITE(fb, DPR_DE_CTRL, DE_CTRL_START | DE_CTRL_ROP_ENABLE | (DE_CTRL_COMMAND_SOLIDFILL << DE_CTRL_COMMAND_SHIFT) | (DE_CTRL_ROP_SRC << DE_CTRL_ROP_SHIFT)); DPR_READ(fb, DPR_DE_CTRL); smfb_wait(fb); }
int smfb_setup(struct smfb *fb, bus_space_tag_t memt, bus_space_handle_t memh, bus_space_tag_t mmiot, bus_space_handle_t mmioh) { struct rasops_info *ri; int accel = 0; int rc; ri = &fb->ri; ri->ri_width = 1024; ri->ri_height = 600; ri->ri_depth = 16; ri->ri_stride = (ri->ri_width * ri->ri_depth) / 8; ri->ri_flg = RI_CENTER | RI_CLEAR | RI_FULLCLEAR; ri->ri_bits = (void *)bus_space_vaddr(memt, memh); ri->ri_hw = fb; #ifdef __MIPSEL__ /* swap B and R */ ri->ri_rnum = 5; ri->ri_rpos = 11; ri->ri_gnum = 6; ri->ri_gpos = 5; ri->ri_bnum = 5; ri->ri_bpos = 0; #endif rasops_init(ri, 160, 160); strlcpy(fb->wsd.name, "std", sizeof(fb->wsd.name)); fb->wsd.ncols = ri->ri_cols; fb->wsd.nrows = ri->ri_rows; fb->wsd.textops = &ri->ri_ops; fb->wsd.fontwidth = ri->ri_font->fontwidth; fb->wsd.fontheight = ri->ri_font->fontheight; fb->wsd.capabilities = ri->ri_caps; if (fb->is5xx) { fb->dcrt = mmiot; if ((rc = bus_space_subregion(mmiot, mmioh, SM5XX_DCR_BASE, SM5XX_DCR_SIZE, &fb->dcrh)) != 0) return rc; fb->dprt = mmiot; if ((rc = bus_space_subregion(mmiot, mmioh, SM5XX_DPR_BASE, SMXXX_DPR_SIZE, &fb->dprh)) != 0) return rc; fb->mmiot = mmiot; if ((rc = bus_space_subregion(mmiot, mmioh, SM5XX_MMIO_BASE, SM5XX_MMIO_SIZE, &fb->mmioh)) != 0) return rc; accel = 1; } else { fb->dprt = memt; if ((rc = bus_space_subregion(memt, memh, SM7XX_DPR_BASE, SMXXX_DPR_SIZE, &fb->dprh)) != 0) return rc; fb->mmiot = memt; if ((rc = bus_space_subregion(memt, memh, SM7XX_MMIO_BASE, SM7XX_MMIO_SIZE, &fb->mmioh)) != 0) return rc; accel = 1; } /* * Setup 2D acceleration whenever possible */ if (accel) { if (smfb_wait(fb) != 0) accel = 0; } if (accel) { DPR_WRITE(fb, DPR_CROP_TOPLEFT_COORDS, DPR_COORDS(0, 0)); /* use of width both times is intentional */ DPR_WRITE(fb, DPR_PITCH, DPR_COORDS(ri->ri_width, ri->ri_width)); DPR_WRITE(fb, DPR_SRC_WINDOW, DPR_COORDS(ri->ri_width, ri->ri_width)); DPR_WRITE(fb, DPR_BYTE_BIT_MASK, 0xffffffff); DPR_WRITE(fb, DPR_COLOR_COMPARE_MASK, 0); DPR_WRITE(fb, DPR_COLOR_COMPARE, 0); DPR_WRITE(fb, DPR_SRC_BASE, 0); DPR_WRITE(fb, DPR_DST_BASE, 0); DPR_READ(fb, DPR_DST_BASE); ri->ri_ops.copycols = smfb_copycols; ri->ri_ops.copyrows = smfb_copyrows; ri->ri_ops.erasecols = smfb_erasecols; ri->ri_ops.eraserows = smfb_eraserows; } return 0; }
int smfb_setup(struct smfb *fb, vaddr_t fbbase) { struct rasops_info *ri; ri = &fb->ri; ri->ri_width = 1024; ri->ri_height = 600; ri->ri_depth = 16; ri->ri_stride = (ri->ri_width * ri->ri_depth) / 8; ri->ri_flg = RI_CENTER | RI_CLEAR | RI_FULLCLEAR; ri->ri_bits = (void *)fbbase; ri->ri_hw = fb; #ifdef __MIPSEL__ /* swap B and R */ ri->ri_rnum = 5; ri->ri_rpos = 11; ri->ri_gnum = 6; ri->ri_gpos = 5; ri->ri_bnum = 5; ri->ri_bpos = 0; #endif rasops_init(ri, 160, 160); strlcpy(fb->wsd.name, "std", sizeof(fb->wsd.name)); fb->wsd.ncols = ri->ri_cols; fb->wsd.nrows = ri->ri_rows; fb->wsd.textops = &ri->ri_ops; fb->wsd.fontwidth = ri->ri_font->fontwidth; fb->wsd.fontheight = ri->ri_font->fontheight; fb->wsd.capabilities = ri->ri_caps; fb->dpr = (volatile uint32_t *)(fbbase + DPR_BASE); fb->mmio = (volatile uint8_t *)(fbbase + MMIO_BASE); /* * Setup 2D acceleration */ smfb_wait(fb); DPR_WRITE(fb, DPR_CROP_TOPLEFT_COORDS, DPR_COORDS(0, 0)); /* use of width both times is intentional */ DPR_WRITE(fb, DPR_PITCH, DPR_COORDS(ri->ri_width, ri->ri_width)); DPR_WRITE(fb, DPR_SRC_WINDOW, DPR_COORDS(ri->ri_width, ri->ri_width)); DPR_WRITE(fb, DPR_BYTE_BIT_MASK, 0xffffffff); DPR_WRITE(fb, DPR_COLOR_COMPARE_MASK, 0); DPR_WRITE(fb, DPR_COLOR_COMPARE, 0); DPR_WRITE(fb, DPR_SRC_BASE, 0); DPR_WRITE(fb, DPR_DST_BASE, 0); DPR_READ(fb, DPR_DST_BASE); ri->ri_ops.copycols = smfb_copycols; ri->ri_ops.copyrows = smfb_copyrows; ri->ri_ops.erasecols = smfb_erasecols; ri->ri_ops.eraserows = smfb_eraserows; return 0; }