fu->ops->set_src_stride(fu, src_w, src_x, mt_w, bpp, fb->pitches[0],
baseaddr, use_prefetch);
fu->ops->set_src_buf_dimensions(fu, src_w, src_h, 0, fb_is_interlaced);
+ fu->ops->set_pixel_blend_mode(fu, fb->format->format);
fu->ops->set_fmt(fu, fb->format->format, fb_is_interlaced);
fu->ops->enable_src_buf(fu);
fu->ops->set_framedimensions(fu, src_w, src_h, fb_is_interlaced);
layerblend_pixengcfg_dynamic_prim_sel(lb, stage);
layerblend_pixengcfg_dynamic_sec_sel(lb, source);
layerblend_control(lb, LB_BLEND);
- layerblend_blendcontrol(lb, need_hscaler || need_vscaler);
+ layerblend_blendcontrol(lb, state->normalized_zpos);
layerblend_pixengcfg_clken(lb, CLKEN__AUTOMATIC);
layerblend_position(lb, crtc_x, state->crtc_y);
}
EXPORT_SYMBOL_GPL(fetchdecode_clipoffset);
+static void
+fetchdecode_set_pixel_blend_mode(struct dpu_fetchunit *fu, u32 fb_format)
+{
+ u32 val, mode = ALPHACONSTENABLE;
+
+ switch (fb_format) {
+ case DRM_FORMAT_ARGB8888:
+ case DRM_FORMAT_ABGR8888:
+ case DRM_FORMAT_RGBA8888:
+ case DRM_FORMAT_BGRA8888:
+ mode |= ALPHASRCENABLE;
+ break;
+ }
+
+ mutex_lock(&fu->mutex);
+ val = dpu_fu_read(fu, LAYERPROPERTY0);
+ val &= ~(PREMULCONSTRGB | ALPHA_ENABLE_MASK | RGB_ENABLE_MASK);
+ val |= mode;
+ dpu_fu_write(fu, val, LAYERPROPERTY0);
+
+ val = dpu_fu_read(fu, CONSTANTCOLOR0);
+ val &= ~CONSTANTALPHA_MASK;
+ val |= CONSTANTALPHA(0xff);
+ dpu_fu_write(fu, val, CONSTANTCOLOR0);
+ mutex_unlock(&fu->mutex);
+}
+
static void fetchdecode_enable_src_buf(struct dpu_fetchunit *fu)
{
u32 val;
.set_src_stride = fetchdecode_set_src_stride,
.set_src_buf_dimensions = fetchdecode_set_src_buf_dimensions,
.set_fmt = fetchdecode_set_fmt,
+ .set_pixel_blend_mode = fetchdecode_set_pixel_blend_mode,
.enable_src_buf = fetchdecode_enable_src_buf,
.disable_src_buf = fetchdecode_disable_src_buf,
.is_enabled = fetchdecode_is_enabled,
.set_src_stride = fetchunit_set_src_stride,
.set_src_buf_dimensions = fetchlayer_set_src_buf_dimensions,
.set_fmt = fetchlayer_set_fmt,
+ .set_pixel_blend_mode = fetchunit_set_pixel_blend_mode,
.enable_src_buf = fetchunit_enable_src_buf,
.disable_src_buf = fetchunit_disable_src_buf,
.is_enabled = fetchunit_is_enabled,
}
EXPORT_SYMBOL_GPL(fetchunit_set_src_stride);
+void fetchunit_set_pixel_blend_mode(struct dpu_fetchunit *fu, u32 fb_format)
+{
+ u32 val, mode = ALPHACONSTENABLE;
+
+ switch (fb_format) {
+ case DRM_FORMAT_ARGB8888:
+ case DRM_FORMAT_ABGR8888:
+ case DRM_FORMAT_RGBA8888:
+ case DRM_FORMAT_BGRA8888:
+ mode |= ALPHASRCENABLE;
+ break;
+ }
+
+ mutex_lock(&fu->mutex);
+ val = dpu_fu_read(fu, LAYERPROPERTY(fu->sub_id));
+ val &= ~(PREMULCONSTRGB | ALPHA_ENABLE_MASK | RGB_ENABLE_MASK);
+ val |= mode;
+ dpu_fu_write(fu, val, LAYERPROPERTY(fu->sub_id));
+
+ val = dpu_fu_read(fu, CONSTANTCOLOR(fu->sub_id));
+ val &= ~CONSTANTALPHA_MASK;
+ val |= CONSTANTALPHA(0xff);
+ dpu_fu_write(fu, val, CONSTANTCOLOR(fu->sub_id));
+ mutex_unlock(&fu->mutex);
+}
+EXPORT_SYMBOL_GPL(fetchunit_set_pixel_blend_mode);
+
void fetchunit_enable_src_buf(struct dpu_fetchunit *fu)
{
u32 val;
.set_src_stride = fetchunit_set_src_stride,
.set_src_buf_dimensions = fetchwarp_set_src_buf_dimensions,
.set_fmt = fetchwarp_set_fmt,
+ .set_pixel_blend_mode = fetchunit_set_pixel_blend_mode,
.enable_src_buf = fetchunit_enable_src_buf,
.disable_src_buf = fetchunit_disable_src_buf,
.is_enabled = fetchunit_is_enabled,
#define BLENDCONTROL 0x10
#define ALPHA(a) (((a) & 0xFF) << 16)
#define PRIM_C_BLD_FUNC__ONE_MINUS_SEC_ALPHA 0x5
-#define PRIM_C_BLD_FUNC__PRIM_ALPHA 0x2
+#define PRIM_C_BLD_FUNC__ZERO 0x0
#define SEC_C_BLD_FUNC__CONST_ALPHA (0x6 << 4)
-#define SEC_C_BLD_FUNC__ONE_MINUS_PRIM_ALPHA (0x3 << 4)
-#define PRIM_A_BLD_FUNC__ONE_MINUS_SEC_ALPHA (0x5 << 8)
#define PRIM_A_BLD_FUNC__ZERO (0x0 << 8)
-#define SEC_A_BLD_FUNC__ONE (0x1 << 12)
#define SEC_A_BLD_FUNC__ZERO (0x0 << 12)
#define POSITION 0x14
#define XPOS(x) ((x) & 0x7FFF)
}
EXPORT_SYMBOL_GPL(layerblend_control);
-void layerblend_blendcontrol(struct dpu_layerblend *lb, bool sec_from_scaler)
+void layerblend_blendcontrol(struct dpu_layerblend *lb, unsigned int zpos)
{
u32 val;
- val = ALPHA(0xff) |
- PRIM_C_BLD_FUNC__PRIM_ALPHA |
- SEC_C_BLD_FUNC__ONE_MINUS_PRIM_ALPHA |
- PRIM_A_BLD_FUNC__ZERO;
+ val = ALPHA(0xff) | PRIM_A_BLD_FUNC__ZERO | SEC_A_BLD_FUNC__ZERO |
+ SEC_C_BLD_FUNC__CONST_ALPHA;
- val |= sec_from_scaler ? SEC_A_BLD_FUNC__ZERO : SEC_A_BLD_FUNC__ONE;
+ if (zpos == 0)
+ val |= PRIM_C_BLD_FUNC__ZERO;
+ else
+ val |= PRIM_C_BLD_FUNC__ONE_MINUS_SEC_ALPHA;
mutex_lock(&lb->mutex);
dpu_lb_write(lb, val, BLENDCONTROL);
#define CLIPWINDOWYOFFSET(y) (((y) & 0x7FFF) << 16)
#define CLIPWINDOWWIDTH(w) (((w) - 1) & 0x3FFF)
#define CLIPWINDOWHEIGHT(h) ((((h) - 1) & 0x3FFF) << 16)
+#define CONSTANTALPHA_MASK 0xFF
+#define CONSTANTALPHA(n) ((n) & CONSTANTALPHA_MASK)
#define PALETTEENABLE BIT(0)
typedef enum {
TILE_FILL_ZERO,
#define ALPHACONSTENABLE BIT(9)
#define ALPHAMASKENABLE BIT(10)
#define ALPHATRANSENABLE BIT(11)
+#define ALPHA_ENABLE_MASK (ALPHASRCENABLE | ALPHACONSTENABLE | \
+ ALPHAMASKENABLE | ALPHATRANSENABLE)
#define RGBALPHASRCENABLE BIT(12)
#define RGBALPHACONSTENABLE BIT(13)
#define RGBALPHAMASKENABLE BIT(14)
#define RGBALPHATRANSENABLE BIT(15)
+#define RGB_ENABLE_MASK (RGBALPHASRCENABLE | \
+ RGBALPHACONSTENABLE | \
+ RGBALPHAMASKENABLE | \
+ RGBALPHATRANSENABLE)
#define PREMULCONSTRGB BIT(16)
typedef enum {
YUVCONVERSIONMODE__OFF,
void (*set_fmt)(struct dpu_fetchunit *fu, u32 fmt, bool deinterlace);
+ void (*set_pixel_blend_mode)(struct dpu_fetchunit *fu, u32 fb_format);
+
void (*enable_src_buf)(struct dpu_fetchunit *fu);
void (*disable_src_buf)(struct dpu_fetchunit *fu);
bool (*is_enabled)(struct dpu_fetchunit *fu);
void layerblend_shdtoksel(struct dpu_layerblend *lb, lb_shadow_sel_t sel);
void layerblend_shdldsel(struct dpu_layerblend *lb, lb_shadow_sel_t sel);
void layerblend_control(struct dpu_layerblend *lb, lb_mode_t mode);
-void layerblend_blendcontrol(struct dpu_layerblend *lb, bool sec_from_scaler);
+void layerblend_blendcontrol(struct dpu_layerblend *lb, unsigned int zpos);
void layerblend_position(struct dpu_layerblend *lb, int x, int y);
struct dpu_layerblend *dpu_lb_get(struct dpu_soc *dpu, int id);
void dpu_lb_put(struct dpu_layerblend *lb);
unsigned int width, unsigned int x_offset,
unsigned int mt_w, int bpp, unsigned int stride,
dma_addr_t baddr, bool use_prefetch);
+void fetchunit_set_pixel_blend_mode(struct dpu_fetchunit *fu, u32 fb_format);
void fetchunit_enable_src_buf(struct dpu_fetchunit *fu);
void fetchunit_disable_src_buf(struct dpu_fetchunit *fu);
bool fetchunit_is_enabled(struct dpu_fetchunit *fu);