mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-03 15:51:40 -04:00
Merge tag 'drm-misc-next-2022-11-10-1' of git://anongit.freedesktop.org/drm/drm-misc into drm-next
drm-misc-next for 6.2: UAPI Changes: Cross-subsystem Changes: Core Changes: - atomic-helper: Add begin_fb_access and end_fb_access hooks - fb-helper: Rework to move fb emulation into helpers - scheduler: rework entity flush, kill and fini - ttm: Optimize pool allocations Driver Changes: - amdgpu: scheduler rework - hdlcd: Switch to DRM-managed resources - ingenic: Fix registration error path - lcdif: FIFO threshold tuning - meson: Fix return type of cvbs' mode_valid - ofdrm: multiple fixes (kconfig, types, endianness) - sun4i: A100 and D1 support - panel: - New Panel: Jadard JD9365DA-H3 Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maxime Ripard <maxime@cerno.tech> Link: https://patchwork.freedesktop.org/patch/msgid/20221110083612.g63eaocoaa554soh@houat
This commit is contained in:
@@ -30,13 +30,12 @@
|
||||
#ifndef DRM_FB_HELPER_H
|
||||
#define DRM_FB_HELPER_H
|
||||
|
||||
struct drm_clip_rect;
|
||||
struct drm_fb_helper;
|
||||
|
||||
#include <drm/drm_client.h>
|
||||
#include <drm/drm_crtc.h>
|
||||
#include <drm/drm_device.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/kgdb.h>
|
||||
|
||||
#include <drm/drm_client.h>
|
||||
|
||||
enum mode_set_atomic {
|
||||
LEAVE_ATOMIC_MODE_SET,
|
||||
@@ -91,6 +90,20 @@ struct drm_fb_helper_funcs {
|
||||
*/
|
||||
int (*fb_probe)(struct drm_fb_helper *helper,
|
||||
struct drm_fb_helper_surface_size *sizes);
|
||||
|
||||
/**
|
||||
* @fb_dirty:
|
||||
*
|
||||
* Driver callback to update the framebuffer memory. If set, fbdev
|
||||
* emulation will invoke this callback in regular intervals after
|
||||
* the framebuffer has been written.
|
||||
*
|
||||
* This callback is optional.
|
||||
*
|
||||
* Returns:
|
||||
* 0 on success, or an error code otherwise.
|
||||
*/
|
||||
int (*fb_dirty)(struct drm_fb_helper *helper, struct drm_clip_rect *clip);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -98,7 +111,7 @@ struct drm_fb_helper_funcs {
|
||||
* @fb: Scanout framebuffer object
|
||||
* @dev: DRM device
|
||||
* @funcs: driver callbacks for fb helper
|
||||
* @fbdev: emulated fbdev device info struct
|
||||
* @info: emulated fbdev device info struct
|
||||
* @pseudo_palette: fake palette of 16 colors
|
||||
* @damage_clip: clip rectangle used with deferred_io to accumulate damage to
|
||||
* the screen buffer
|
||||
@@ -129,7 +142,7 @@ struct drm_fb_helper {
|
||||
struct drm_framebuffer *fb;
|
||||
struct drm_device *dev;
|
||||
const struct drm_fb_helper_funcs *funcs;
|
||||
struct fb_info *fbdev;
|
||||
struct fb_info *info;
|
||||
u32 pseudo_palette[17];
|
||||
struct drm_clip_rect damage_clip;
|
||||
spinlock_t damage_lock;
|
||||
@@ -186,6 +199,15 @@ struct drm_fb_helper {
|
||||
* See also: @deferred_setup
|
||||
*/
|
||||
int preferred_bpp;
|
||||
|
||||
/**
|
||||
* @hint_leak_smem_start:
|
||||
*
|
||||
* Hint to the fbdev emulation to store the framebuffer's physical
|
||||
* address in struct &fb_info.fix.smem_start. If the hint is unset,
|
||||
* the smem_start field should always be cleared to zero.
|
||||
*/
|
||||
bool hint_leak_smem_start;
|
||||
};
|
||||
|
||||
static inline struct drm_fb_helper *
|
||||
@@ -224,8 +246,8 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
|
||||
|
||||
int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper);
|
||||
|
||||
struct fb_info *drm_fb_helper_alloc_fbi(struct drm_fb_helper *fb_helper);
|
||||
void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper);
|
||||
struct fb_info *drm_fb_helper_alloc_info(struct drm_fb_helper *fb_helper);
|
||||
void drm_fb_helper_unregister_info(struct drm_fb_helper *fb_helper);
|
||||
void drm_fb_helper_fill_info(struct fb_info *info,
|
||||
struct drm_fb_helper *fb_helper,
|
||||
struct drm_fb_helper_surface_size *sizes);
|
||||
@@ -244,6 +266,11 @@ void drm_fb_helper_sys_copyarea(struct fb_info *info,
|
||||
void drm_fb_helper_sys_imageblit(struct fb_info *info,
|
||||
const struct fb_image *image);
|
||||
|
||||
ssize_t drm_fb_helper_cfb_read(struct fb_info *info, char __user *buf,
|
||||
size_t count, loff_t *ppos);
|
||||
ssize_t drm_fb_helper_cfb_write(struct fb_info *info, const char __user *buf,
|
||||
size_t count, loff_t *ppos);
|
||||
|
||||
void drm_fb_helper_cfb_fillrect(struct fb_info *info,
|
||||
const struct fb_fillrect *rect);
|
||||
void drm_fb_helper_cfb_copyarea(struct fb_info *info,
|
||||
@@ -267,9 +294,6 @@ int drm_fb_helper_debug_leave(struct fb_info *info);
|
||||
|
||||
void drm_fb_helper_lastclose(struct drm_device *dev);
|
||||
void drm_fb_helper_output_poll_changed(struct drm_device *dev);
|
||||
|
||||
void drm_fbdev_generic_setup(struct drm_device *dev,
|
||||
unsigned int preferred_bpp);
|
||||
#else
|
||||
static inline void drm_fb_helper_prepare(struct drm_device *dev,
|
||||
struct drm_fb_helper *helper,
|
||||
@@ -322,12 +346,12 @@ drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper)
|
||||
}
|
||||
|
||||
static inline struct fb_info *
|
||||
drm_fb_helper_alloc_fbi(struct drm_fb_helper *fb_helper)
|
||||
drm_fb_helper_alloc_info(struct drm_fb_helper *fb_helper)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper)
|
||||
static inline void drm_fb_helper_unregister_info(struct drm_fb_helper *fb_helper)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -389,6 +413,18 @@ static inline void drm_fb_helper_sys_imageblit(struct fb_info *info,
|
||||
{
|
||||
}
|
||||
|
||||
static inline ssize_t drm_fb_helper_cfb_read(struct fb_info *info, char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline ssize_t drm_fb_helper_cfb_write(struct fb_info *info, const char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline void drm_fb_helper_cfb_fillrect(struct fb_info *info,
|
||||
const struct fb_fillrect *rect)
|
||||
{
|
||||
@@ -442,12 +478,6 @@ static inline void drm_fb_helper_lastclose(struct drm_device *dev)
|
||||
static inline void drm_fb_helper_output_poll_changed(struct drm_device *dev)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void
|
||||
drm_fbdev_generic_setup(struct drm_device *dev, unsigned int preferred_bpp)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
15
include/drm/drm_fbdev_generic.h
Normal file
15
include/drm/drm_fbdev_generic.h
Normal file
@@ -0,0 +1,15 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
|
||||
#ifndef DRM_FBDEV_GENERIC_H
|
||||
#define DRM_FBDEV_GENERIC_H
|
||||
|
||||
struct drm_device;
|
||||
|
||||
#ifdef CONFIG_DRM_FBDEV_EMULATION
|
||||
void drm_fbdev_generic_setup(struct drm_device *dev, unsigned int preferred_bpp);
|
||||
#else
|
||||
static inline void drm_fbdev_generic_setup(struct drm_device *dev, unsigned int preferred_bpp)
|
||||
{ }
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -103,8 +103,8 @@ void drm_gem_destroy_shadow_plane_state(struct drm_plane *plane,
|
||||
.atomic_duplicate_state = drm_gem_duplicate_shadow_plane_state, \
|
||||
.atomic_destroy_state = drm_gem_destroy_shadow_plane_state
|
||||
|
||||
int drm_gem_prepare_shadow_fb(struct drm_plane *plane, struct drm_plane_state *plane_state);
|
||||
void drm_gem_cleanup_shadow_fb(struct drm_plane *plane, struct drm_plane_state *plane_state);
|
||||
int drm_gem_begin_shadow_fb_access(struct drm_plane *plane, struct drm_plane_state *plane_state);
|
||||
void drm_gem_end_shadow_fb_access(struct drm_plane *plane, struct drm_plane_state *plane_state);
|
||||
|
||||
/**
|
||||
* DRM_GEM_SHADOW_PLANE_HELPER_FUNCS -
|
||||
@@ -115,13 +115,13 @@ void drm_gem_cleanup_shadow_fb(struct drm_plane *plane, struct drm_plane_state *
|
||||
* functions.
|
||||
*/
|
||||
#define DRM_GEM_SHADOW_PLANE_HELPER_FUNCS \
|
||||
.prepare_fb = drm_gem_prepare_shadow_fb, \
|
||||
.cleanup_fb = drm_gem_cleanup_shadow_fb
|
||||
.begin_fb_access = drm_gem_begin_shadow_fb_access, \
|
||||
.end_fb_access = drm_gem_end_shadow_fb_access
|
||||
|
||||
int drm_gem_simple_kms_prepare_shadow_fb(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *plane_state);
|
||||
void drm_gem_simple_kms_cleanup_shadow_fb(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *plane_state);
|
||||
int drm_gem_simple_kms_begin_shadow_fb_access(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *plane_state);
|
||||
void drm_gem_simple_kms_end_shadow_fb_access(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *plane_state);
|
||||
void drm_gem_simple_kms_reset_shadow_plane(struct drm_simple_display_pipe *pipe);
|
||||
struct drm_plane_state *
|
||||
drm_gem_simple_kms_duplicate_shadow_plane_state(struct drm_simple_display_pipe *pipe);
|
||||
@@ -137,8 +137,8 @@ void drm_gem_simple_kms_destroy_shadow_plane_state(struct drm_simple_display_pip
|
||||
* functions.
|
||||
*/
|
||||
#define DRM_GEM_SIMPLE_DISPLAY_PIPE_SHADOW_PLANE_FUNCS \
|
||||
.prepare_fb = drm_gem_simple_kms_prepare_shadow_fb, \
|
||||
.cleanup_fb = drm_gem_simple_kms_cleanup_shadow_fb, \
|
||||
.begin_fb_access = drm_gem_simple_kms_begin_shadow_fb_access, \
|
||||
.end_fb_access = drm_gem_simple_kms_end_shadow_fb_access, \
|
||||
.reset_plane = drm_gem_simple_kms_reset_shadow_plane, \
|
||||
.duplicate_plane_state = drm_gem_simple_kms_duplicate_shadow_plane_state, \
|
||||
.destroy_plane_state = drm_gem_simple_kms_destroy_shadow_plane_state
|
||||
|
||||
@@ -1184,11 +1184,20 @@ struct drm_plane_helper_funcs {
|
||||
* can call drm_gem_plane_helper_prepare_fb() from their @prepare_fb
|
||||
* hook.
|
||||
*
|
||||
* The resources acquired in @prepare_fb persist after the end of
|
||||
* the atomic commit. Resources that can be release at the commit's end
|
||||
* should be acquired in @begin_fb_access and released in @end_fb_access.
|
||||
* For example, a GEM buffer's pin operation belongs into @prepare_fb to
|
||||
* keep the buffer pinned after the commit. But a vmap operation for
|
||||
* shadow-plane helpers belongs into @begin_fb_access, so that atomic
|
||||
* helpers remove the mapping at the end of the commit.
|
||||
*
|
||||
* The helpers will call @cleanup_fb with matching arguments for every
|
||||
* successful call to this hook.
|
||||
*
|
||||
* This callback is used by the atomic modeset helpers and by the
|
||||
* transitional plane helpers, but it is optional.
|
||||
* transitional plane helpers, but it is optional. See @begin_fb_access
|
||||
* for preparing per-commit resources.
|
||||
*
|
||||
* RETURNS:
|
||||
*
|
||||
@@ -1211,6 +1220,36 @@ struct drm_plane_helper_funcs {
|
||||
void (*cleanup_fb)(struct drm_plane *plane,
|
||||
struct drm_plane_state *old_state);
|
||||
|
||||
/**
|
||||
* @begin_fb_access:
|
||||
*
|
||||
* This hook prepares the plane for access during an atomic commit.
|
||||
* In contrast to @prepare_fb, resources acquired in @begin_fb_access,
|
||||
* are released at the end of the atomic commit in @end_fb_access.
|
||||
*
|
||||
* For example, with shadow-plane helpers, the GEM buffer's vmap
|
||||
* operation belongs into @begin_fb_access, so that the buffer's
|
||||
* memory will be unmapped at the end of the commit in @end_fb_access.
|
||||
* But a GEM buffer's pin operation belongs into @prepare_fb
|
||||
* to keep the buffer pinned after the commit.
|
||||
*
|
||||
* The callback is used by the atomic modeset helpers, but it is optional.
|
||||
* See @end_fb_cleanup for undoing the effects of @begin_fb_access and
|
||||
* @prepare_fb for acquiring resources until the next pageflip.
|
||||
*
|
||||
* Returns:
|
||||
* 0 on success, or a negative errno code otherwise.
|
||||
*/
|
||||
int (*begin_fb_access)(struct drm_plane *plane, struct drm_plane_state *new_plane_state);
|
||||
|
||||
/**
|
||||
* @end_fb_access:
|
||||
*
|
||||
* This hook cleans up resources allocated by @begin_fb_access. It it called
|
||||
* at the end of a commit for the new plane state.
|
||||
*/
|
||||
void (*end_fb_access)(struct drm_plane *plane, struct drm_plane_state *new_plane_state);
|
||||
|
||||
/**
|
||||
* @atomic_check:
|
||||
*
|
||||
|
||||
@@ -135,6 +135,26 @@ struct drm_simple_display_pipe_funcs {
|
||||
void (*cleanup_fb)(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *plane_state);
|
||||
|
||||
/**
|
||||
* @begin_fb_access:
|
||||
*
|
||||
* Optional, called by &drm_plane_helper_funcs.begin_fb_access. Please read
|
||||
* the documentation for the &drm_plane_helper_funcs.begin_fb_access hook for
|
||||
* more details.
|
||||
*/
|
||||
int (*begin_fb_access)(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *new_plane_state);
|
||||
|
||||
/**
|
||||
* @end_fb_access:
|
||||
*
|
||||
* Optional, called by &drm_plane_helper_funcs.end_fb_access. Please read
|
||||
* the documentation for the &drm_plane_helper_funcs.end_fb_access hook for
|
||||
* more details.
|
||||
*/
|
||||
void (*end_fb_access)(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *plane_state);
|
||||
|
||||
/**
|
||||
* @enable_vblank:
|
||||
*
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
*/
|
||||
#define DRM_SCHED_FENCE_DONT_PIPELINE DMA_FENCE_FLAG_USER_BITS
|
||||
|
||||
enum dma_resv_usage;
|
||||
struct dma_resv;
|
||||
struct drm_gem_object;
|
||||
|
||||
struct drm_gpu_scheduler;
|
||||
@@ -327,7 +329,7 @@ struct drm_sched_job {
|
||||
*/
|
||||
union {
|
||||
struct dma_fence_cb finish_cb;
|
||||
struct work_struct work;
|
||||
struct work_struct work;
|
||||
};
|
||||
|
||||
uint64_t id;
|
||||
@@ -375,18 +377,17 @@ enum drm_gpu_sched_stat {
|
||||
*/
|
||||
struct drm_sched_backend_ops {
|
||||
/**
|
||||
* @dependency:
|
||||
* @prepare_job:
|
||||
*
|
||||
* Called when the scheduler is considering scheduling this job next, to
|
||||
* get another struct dma_fence for this job to block on. Once it
|
||||
* returns NULL, run_job() may be called.
|
||||
*
|
||||
* If a driver exclusively uses drm_sched_job_add_dependency() and
|
||||
* drm_sched_job_add_implicit_dependencies() this can be ommitted and
|
||||
* left as NULL.
|
||||
* Can be NULL if no additional preparation to the dependencies are
|
||||
* necessary. Skipped when jobs are killed instead of run.
|
||||
*/
|
||||
struct dma_fence *(*dependency)(struct drm_sched_job *sched_job,
|
||||
struct drm_sched_entity *s_entity);
|
||||
struct dma_fence *(*prepare_job)(struct drm_sched_job *sched_job,
|
||||
struct drm_sched_entity *s_entity);
|
||||
|
||||
/**
|
||||
* @run_job: Called to execute the job once all of the dependencies
|
||||
@@ -514,6 +515,9 @@ int drm_sched_job_init(struct drm_sched_job *job,
|
||||
void drm_sched_job_arm(struct drm_sched_job *job);
|
||||
int drm_sched_job_add_dependency(struct drm_sched_job *job,
|
||||
struct dma_fence *fence);
|
||||
int drm_sched_job_add_resv_dependencies(struct drm_sched_job *job,
|
||||
struct dma_resv *resv,
|
||||
enum dma_resv_usage usage);
|
||||
int drm_sched_job_add_implicit_dependencies(struct drm_sched_job *job,
|
||||
struct drm_gem_object *obj,
|
||||
bool write);
|
||||
@@ -532,8 +536,6 @@ void drm_sched_resubmit_jobs_ext(struct drm_gpu_scheduler *sched, int max);
|
||||
void drm_sched_increase_karma(struct drm_sched_job *bad);
|
||||
void drm_sched_reset_karma(struct drm_sched_job *bad);
|
||||
void drm_sched_increase_karma_ext(struct drm_sched_job *bad, int type);
|
||||
bool drm_sched_dependency_optimized(struct dma_fence* fence,
|
||||
struct drm_sched_entity *entity);
|
||||
void drm_sched_fault(struct drm_gpu_scheduler *sched);
|
||||
void drm_sched_job_kickout(struct drm_sched_job *s_job);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user