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

Reply via email to