Hi, On Tue, Aug 01, 2023 at 06:10:29PM +0800, Keith Zhao wrote: > +static int vs_crtc_atomic_set_property(struct drm_crtc *crtc, > + struct drm_crtc_state *state, > + struct drm_property *property, > + uint64_t val) > +{ > + struct vs_crtc *vs_crtc = to_vs_crtc(crtc); > + struct vs_crtc_state *vs_crtc_state = to_vs_crtc_state(state); > + > + if (property == vs_crtc->sync_mode) > + vs_crtc_state->sync_mode = val; > + else if (property == vs_crtc->mmu_prefetch) > + vs_crtc_state->mmu_prefetch = val; > + else if (property == vs_crtc->bg_color) > + vs_crtc_state->bg_color = val; > + else if (property == vs_crtc->panel_sync) > + vs_crtc_state->sync_enable = val; > + else if (property == vs_crtc->dither) > + vs_crtc_state->dither_enable = val; > + else > + return -EINVAL; > + > + return 0; > +} > + > +static int vs_crtc_atomic_get_property(struct drm_crtc *crtc, > + const struct drm_crtc_state *state, > + struct drm_property *property, > + uint64_t *val) > +{ > + struct vs_crtc *vs_crtc = to_vs_crtc(crtc); > + const struct vs_crtc_state *vs_crtc_state = > + container_of(state, const struct vs_crtc_state, base); > + > + if (property == vs_crtc->sync_mode) > + *val = vs_crtc_state->sync_mode; > + else if (property == vs_crtc->mmu_prefetch) > + *val = vs_crtc_state->mmu_prefetch; > + else if (property == vs_crtc->bg_color) > + *val = vs_crtc_state->bg_color; > + else if (property == vs_crtc->panel_sync) > + *val = vs_crtc_state->sync_enable; > + else if (property == vs_crtc->dither) > + *val = vs_crtc_state->dither_enable; > + else > + return -EINVAL; > + > + return 0; > +} Any new property needs to follow these requirements: https://docs.kernel.org/gpu/drm-kms.html#requirements https://docs.kernel.org/gpu/drm-uapi.html#open-source-userspace-requirements Also, most of them are suspicious, like sync_mode, mmu_prefetch, panel_sync or dither_enable. Why would you want userspace to change those ? > +static int vs_crtc_late_register(struct drm_crtc *crtc) > +{ > + return 0; > +} You can drop that. > +static int vs_crtc_enable_vblank(struct drm_crtc *crtc) > +{ > + struct vs_crtc *vs_crtc = to_vs_crtc(crtc); > + > + vs_dc_enable_vblank(vs_crtc->dev, true); > + > + return 0; > +} > + > +static void vs_crtc_disable_vblank(struct drm_crtc *crtc) > +{ > + struct vs_crtc *vs_crtc = to_vs_crtc(crtc); > + > + vs_dc_enable_vblank(vs_crtc->dev, false); > +} > + > +static const struct drm_crtc_funcs vs_crtc_funcs = { > + .set_config = drm_atomic_helper_set_config, > + .page_flip = drm_atomic_helper_page_flip, > + .reset = vs_crtc_reset, > + .atomic_duplicate_state = vs_crtc_atomic_duplicate_state, > + .atomic_destroy_state = vs_crtc_atomic_destroy_state, > + .atomic_set_property = vs_crtc_atomic_set_property, > + .atomic_get_property = vs_crtc_atomic_get_property, > + .late_register = vs_crtc_late_register, > + .enable_vblank = vs_crtc_enable_vblank, > + .disable_vblank = vs_crtc_disable_vblank, > +}; > + > +static u8 cal_pixel_bits(u32 bus_format) > +{ > + u8 bpp; > + > + switch (bus_format) { > + case MEDIA_BUS_FMT_RGB565_1X16: > + case MEDIA_BUS_FMT_UYVY8_1X16: > + bpp = 16; > + break; > + case MEDIA_BUS_FMT_RGB666_1X18: > + case MEDIA_BUS_FMT_RGB666_1X24_CPADHI: > + bpp = 18; > + break; > + case MEDIA_BUS_FMT_UYVY10_1X20: > + bpp = 20; > + break; > + case MEDIA_BUS_FMT_BGR888_1X24: > + case MEDIA_BUS_FMT_UYYVYY8_0_5X24: > + case MEDIA_BUS_FMT_YUV8_1X24: > + bpp = 24; > + break; > + case MEDIA_BUS_FMT_RGB101010_1X30: > + case MEDIA_BUS_FMT_UYYVYY10_0_5X30: > + case MEDIA_BUS_FMT_YUV10_1X30: > + bpp = 30; > + break; > + default: > + bpp = 24; > + break; > + } > + > + return bpp; > +} > + > +static bool vs_crtc_mode_fixup(struct drm_crtc *crtc, > + const struct drm_display_mode *mode, > + struct drm_display_mode *adjusted_mode) > +{ > + struct vs_crtc *vs_crtc = to_vs_crtc(crtc); > + > + return vs_dc_mode_fixup(vs_crtc->dev, mode, adjusted_mode); > +} You should be using atomic_check. Maxime
Attachment:
signature.asc
Description: PGP signature