static void mdp4_plane_set_scanout(struct drm_plane *plane, struct drm_framebuffer *fb) { struct mdp4_plane *mdp4_plane = to_mdp4_plane(plane); struct mdp4_kms *mdp4_kms = get_kms(plane); enum mdp4_pipe pipe = mdp4_plane->pipe; mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRC_STRIDE_A(pipe), MDP4_PIPE_SRC_STRIDE_A_P0(fb->pitches[0]) | MDP4_PIPE_SRC_STRIDE_A_P1(fb->pitches[1])); mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRC_STRIDE_B(pipe), MDP4_PIPE_SRC_STRIDE_B_P2(fb->pitches[2]) | MDP4_PIPE_SRC_STRIDE_B_P3(fb->pitches[3])); mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP0_BASE(pipe), msm_framebuffer_iova(fb, mdp4_kms->id, 0)); mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP1_BASE(pipe), msm_framebuffer_iova(fb, mdp4_kms->id, 1)); mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP2_BASE(pipe), msm_framebuffer_iova(fb, mdp4_kms->id, 2)); mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRCP3_BASE(pipe), msm_framebuffer_iova(fb, mdp4_kms->id, 3)); plane->fb = fb; }
static void set_scanout_locked(struct drm_plane *plane, struct drm_framebuffer *fb) { struct mdp5_plane *mdp5_plane = to_mdp5_plane(plane); struct mdp5_kms *mdp5_kms = get_kms(plane); enum mdp5_pipe pipe = mdp5_plane->pipe; mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC_STRIDE_A(pipe), MDP5_PIPE_SRC_STRIDE_A_P0(fb->pitches[0]) | MDP5_PIPE_SRC_STRIDE_A_P1(fb->pitches[1])); mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC_STRIDE_B(pipe), MDP5_PIPE_SRC_STRIDE_B_P2(fb->pitches[2]) | MDP5_PIPE_SRC_STRIDE_B_P3(fb->pitches[3])); mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC0_ADDR(pipe), msm_framebuffer_iova(fb, mdp5_kms->id, 0)); mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC1_ADDR(pipe), msm_framebuffer_iova(fb, mdp5_kms->id, 1)); mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC2_ADDR(pipe), msm_framebuffer_iova(fb, mdp5_kms->id, 2)); mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC3_ADDR(pipe), msm_framebuffer_iova(fb, mdp5_kms->id, 4)); plane->fb = fb; }
static int _dpu_format_populate_addrs_linear( struct msm_gem_address_space *aspace, struct drm_framebuffer *fb, struct dpu_hw_fmt_layout *layout) { unsigned int i; /* Can now check the pitches given vs pitches expected */ for (i = 0; i < layout->num_planes; ++i) { if (layout->plane_pitch[i] > fb->pitches[i]) { DRM_ERROR("plane %u expected pitch %u, fb %u\n", i, layout->plane_pitch[i], fb->pitches[i]); return -EINVAL; } } /* Populate addresses for simple formats here */ for (i = 0; i < layout->num_planes; ++i) { if (aspace) layout->plane_addr[i] = msm_framebuffer_iova(fb, aspace, i); if (!layout->plane_addr[i]) { DRM_ERROR("failed to retrieve base addr\n"); return -EFAULT; } } return 0; }
static int _dpu_format_populate_addrs_ubwc( struct msm_gem_address_space *aspace, struct drm_framebuffer *fb, struct dpu_hw_fmt_layout *layout) { uint32_t base_addr = 0; bool meta; if (!fb || !layout) { DRM_ERROR("invalid pointers\n"); return -EINVAL; } if (aspace) base_addr = msm_framebuffer_iova(fb, aspace, 0); if (!base_addr) { DRM_ERROR("failed to retrieve base addr\n"); return -EFAULT; } meta = DPU_FORMAT_IS_UBWC(layout->format); /* Per-format logic for verifying active planes */ if (DPU_FORMAT_IS_YUV(layout->format)) { /************************************************/ /* UBWC ** */ /* buffer ** DPU PLANE */ /* format ** */ /************************************************/ /* ------------------- ** -------------------- */ /* | Y meta | ** | Y bitstream | */ /* | data | ** | plane | */ /* ------------------- ** -------------------- */ /* | Y bitstream | ** | CbCr bitstream | */ /* | data | ** | plane | */ /* ------------------- ** -------------------- */ /* | Cbcr metadata | ** | Y meta | */ /* | data | ** | plane | */ /* ------------------- ** -------------------- */ /* | CbCr bitstream | ** | CbCr meta | */ /* | data | ** | plane | */ /* ------------------- ** -------------------- */ /************************************************/ /* configure Y bitstream plane */ layout->plane_addr[0] = base_addr + layout->plane_size[2]; /* configure CbCr bitstream plane */ layout->plane_addr[1] = base_addr + layout->plane_size[0] + layout->plane_size[2] + layout->plane_size[3]; if (!meta) goto done; /* configure Y metadata plane */ layout->plane_addr[2] = base_addr; /* configure CbCr metadata plane */ layout->plane_addr[3] = base_addr + layout->plane_size[0] + layout->plane_size[2]; } else { /************************************************/ /* UBWC ** */ /* buffer ** DPU PLANE */ /* format ** */ /************************************************/ /* ------------------- ** -------------------- */ /* | RGB meta | ** | RGB bitstream | */ /* | data | ** | plane | */ /* ------------------- ** -------------------- */ /* | RGB bitstream | ** | NONE | */ /* | data | ** | | */ /* ------------------- ** -------------------- */ /* ** | RGB meta | */ /* ** | plane | */ /* ** -------------------- */ /************************************************/ layout->plane_addr[0] = base_addr + layout->plane_size[2]; layout->plane_addr[1] = 0; if (!meta) goto done; layout->plane_addr[2] = base_addr; layout->plane_addr[3] = 0; } done: return 0; }