mirror of https://gitee.com/openkylin/linux.git
Merge tag 'topic/drm-misc-2015-11-26' of git://anongit.freedesktop.org/drm-intel into drm-next
Here's the first drm-misc pull, with really mostly misc stuff all over. Somewhat invasive is only Ville's change to mark the arg struct for fb_create const - that might conflict with a new driver pull. So better to get in fast. * tag 'topic/drm-misc-2015-11-26' of git://anongit.freedesktop.org/drm-intel: drm/mm: use list_next_entry drm/i915: fix potential dangling else problems in for_each_ macros drm: fix potential dangling else problems in for_each_ macros drm/sysfs: Send out uevent when connector->force changes drm/atomic: Small documentation fix. drm/mm: rewrite drm_mm_for_each_hole drm/sysfs: Grab lock for edid/modes_show drm: Print the src/dst/clip rectangles in error in drm_plane_helper drm: Add "prefix" parameter to drm_rect_debug_print() drm: Keep coordinates in the typical x, y, w, h order instead of x, y, h, w drm: Pass the user drm_mode_fb_cmd2 as const to .fb_create() drm: modes: replace simple_strtoul by kstrtouint drm: Describe the Rotation property bits. drm: Remove unused fbdev_list members GPU-DRM: Delete unnecessary checks before drm_property_unreference_blob() drm/dp: add eDP DPCD backlight control bit definitions drm/tegra: Remove local fbdev emulation Kconfig option drm/imx: Remove local fbdev emulation Kconfig option drm/gem: Update/Polish docs drm: Update GEM refcounting docs
This commit is contained in:
commit
aeb745e9b5
|
@ -615,18 +615,6 @@ char *date;</synopsis>
|
|||
<function>drm_gem_object_init</function>. Storage for private GEM
|
||||
objects must be managed by drivers.
|
||||
</para>
|
||||
<para>
|
||||
Drivers that do not need to extend GEM objects with private information
|
||||
can call the <function>drm_gem_object_alloc</function> function to
|
||||
allocate and initialize a struct <structname>drm_gem_object</structname>
|
||||
instance. The GEM core will call the optional driver
|
||||
<methodname>gem_init_object</methodname> operation after initializing
|
||||
the GEM object with <function>drm_gem_object_init</function>.
|
||||
<synopsis>int (*gem_init_object) (struct drm_gem_object *obj);</synopsis>
|
||||
</para>
|
||||
<para>
|
||||
No alloc-and-init function exists for private GEM objects.
|
||||
</para>
|
||||
</sect3>
|
||||
<sect3>
|
||||
<title>GEM Objects Lifetime</title>
|
||||
|
@ -635,10 +623,10 @@ char *date;</synopsis>
|
|||
acquired and release by <function>calling drm_gem_object_reference</function>
|
||||
and <function>drm_gem_object_unreference</function> respectively. The
|
||||
caller must hold the <structname>drm_device</structname>
|
||||
<structfield>struct_mutex</structfield> lock. As a convenience, GEM
|
||||
provides the <function>drm_gem_object_reference_unlocked</function> and
|
||||
<function>drm_gem_object_unreference_unlocked</function> functions that
|
||||
can be called without holding the lock.
|
||||
<structfield>struct_mutex</structfield> lock when calling
|
||||
<function>drm_gem_object_reference</function>. As a convenience, GEM
|
||||
provides <function>drm_gem_object_unreference_unlocked</function>
|
||||
functions that can be called without holding the lock.
|
||||
</para>
|
||||
<para>
|
||||
When the last reference to a GEM object is released the GEM core calls
|
||||
|
@ -649,15 +637,9 @@ char *date;</synopsis>
|
|||
</para>
|
||||
<para>
|
||||
<synopsis>void (*gem_free_object) (struct drm_gem_object *obj);</synopsis>
|
||||
Drivers are responsible for freeing all GEM object resources, including
|
||||
the resources created by the GEM core. If an mmap offset has been
|
||||
created for the object (in which case
|
||||
<structname>drm_gem_object</structname>::<structfield>map_list</structfield>::<structfield>map</structfield>
|
||||
is not NULL) it must be freed by a call to
|
||||
<function>drm_gem_free_mmap_offset</function>. The shmfs backing store
|
||||
must be released by calling <function>drm_gem_object_release</function>
|
||||
(that function can safely be called if no shmfs backing store has been
|
||||
created).
|
||||
Drivers are responsible for freeing all GEM object resources. This includes
|
||||
the resources created by the GEM core, which need to be released with
|
||||
<function>drm_gem_object_release</function>.
|
||||
</para>
|
||||
</sect3>
|
||||
<sect3>
|
||||
|
@ -740,17 +722,10 @@ char *date;</synopsis>
|
|||
DRM identifies the GEM object to be mapped by a fake offset passed
|
||||
through the mmap offset argument. Prior to being mapped, a GEM object
|
||||
must thus be associated with a fake offset. To do so, drivers must call
|
||||
<function>drm_gem_create_mmap_offset</function> on the object. The
|
||||
function allocates a fake offset range from a pool and stores the
|
||||
offset divided by PAGE_SIZE in
|
||||
<literal>obj->map_list.hash.key</literal>. Care must be taken not to
|
||||
call <function>drm_gem_create_mmap_offset</function> if a fake offset
|
||||
has already been allocated for the object. This can be tested by
|
||||
<literal>obj->map_list.map</literal> being non-NULL.
|
||||
<function>drm_gem_create_mmap_offset</function> on the object.
|
||||
</para>
|
||||
<para>
|
||||
Once allocated, the fake offset value
|
||||
(<literal>obj->map_list.hash.key << PAGE_SHIFT</literal>)
|
||||
must be passed to the application in a driver-specific way and can then
|
||||
be used as the mmap offset argument.
|
||||
</para>
|
||||
|
@ -836,10 +811,11 @@ char *date;</synopsis>
|
|||
abstracted from the client in libdrm.
|
||||
</para>
|
||||
</sect3>
|
||||
<sect3>
|
||||
<title>GEM Function Reference</title>
|
||||
</sect2>
|
||||
<sect2>
|
||||
<title>GEM Function Reference</title>
|
||||
!Edrivers/gpu/drm/drm_gem.c
|
||||
</sect3>
|
||||
!Iinclude/drm/drm_gem.h
|
||||
</sect2>
|
||||
<sect2>
|
||||
<title>VMA Offset Manager</title>
|
||||
|
|
|
@ -481,7 +481,7 @@ static const struct drm_framebuffer_funcs amdgpu_fb_funcs = {
|
|||
int
|
||||
amdgpu_framebuffer_init(struct drm_device *dev,
|
||||
struct amdgpu_framebuffer *rfb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj)
|
||||
{
|
||||
int ret;
|
||||
|
@ -498,7 +498,7 @@ amdgpu_framebuffer_init(struct drm_device *dev,
|
|||
static struct drm_framebuffer *
|
||||
amdgpu_user_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *file_priv,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct drm_gem_object *obj;
|
||||
struct amdgpu_framebuffer *amdgpu_fb;
|
||||
|
|
|
@ -45,7 +45,6 @@
|
|||
struct amdgpu_fbdev {
|
||||
struct drm_fb_helper helper;
|
||||
struct amdgpu_framebuffer rfb;
|
||||
struct list_head fbdev_list;
|
||||
struct amdgpu_device *adev;
|
||||
};
|
||||
|
||||
|
|
|
@ -551,7 +551,7 @@ int amdgpu_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe,
|
|||
|
||||
int amdgpu_framebuffer_init(struct drm_device *dev,
|
||||
struct amdgpu_framebuffer *rfb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj);
|
||||
|
||||
int amdgpufb_remove(struct drm_device *dev, struct drm_framebuffer *fb);
|
||||
|
|
|
@ -35,7 +35,7 @@ static const struct drm_framebuffer_funcs armada_fb_funcs = {
|
|||
};
|
||||
|
||||
struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_mode_fb_cmd2 *mode, struct armada_gem_object *obj)
|
||||
const struct drm_mode_fb_cmd2 *mode, struct armada_gem_object *obj)
|
||||
{
|
||||
struct armada_framebuffer *dfb;
|
||||
uint8_t format, config;
|
||||
|
@ -101,7 +101,7 @@ struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
|
|||
}
|
||||
|
||||
static struct drm_framebuffer *armada_fb_create(struct drm_device *dev,
|
||||
struct drm_file *dfile, struct drm_mode_fb_cmd2 *mode)
|
||||
struct drm_file *dfile, const struct drm_mode_fb_cmd2 *mode)
|
||||
{
|
||||
struct armada_gem_object *obj;
|
||||
struct armada_framebuffer *dfb;
|
||||
|
|
|
@ -19,6 +19,6 @@ struct armada_framebuffer {
|
|||
#define drm_fb_obj(fb) drm_fb_to_armada_fb(fb)->obj
|
||||
|
||||
struct armada_framebuffer *armada_framebuffer_create(struct drm_device *,
|
||||
struct drm_mode_fb_cmd2 *, struct armada_gem_object *);
|
||||
const struct drm_mode_fb_cmd2 *, struct armada_gem_object *);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -256,7 +256,6 @@ struct ast_framebuffer {
|
|||
struct ast_fbdev {
|
||||
struct drm_fb_helper helper;
|
||||
struct ast_framebuffer afb;
|
||||
struct list_head fbdev_list;
|
||||
void *sysram;
|
||||
int size;
|
||||
struct ttm_bo_kmap_obj mapping;
|
||||
|
@ -309,7 +308,7 @@ extern void ast_mode_fini(struct drm_device *dev);
|
|||
|
||||
int ast_framebuffer_init(struct drm_device *dev,
|
||||
struct ast_framebuffer *ast_fb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj);
|
||||
|
||||
int ast_fbdev_init(struct drm_device *dev);
|
||||
|
|
|
@ -163,7 +163,7 @@ static struct fb_ops astfb_ops = {
|
|||
};
|
||||
|
||||
static int astfb_create_object(struct ast_fbdev *afbdev,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object **gobj_p)
|
||||
{
|
||||
struct drm_device *dev = afbdev->helper.dev;
|
||||
|
|
|
@ -309,7 +309,7 @@ static const struct drm_framebuffer_funcs ast_fb_funcs = {
|
|||
|
||||
int ast_framebuffer_init(struct drm_device *dev,
|
||||
struct ast_framebuffer *ast_fb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj)
|
||||
{
|
||||
int ret;
|
||||
|
@ -327,7 +327,7 @@ int ast_framebuffer_init(struct drm_device *dev,
|
|||
static struct drm_framebuffer *
|
||||
ast_user_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *filp,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct drm_gem_object *obj;
|
||||
struct ast_framebuffer *ast_fb;
|
||||
|
|
|
@ -402,7 +402,7 @@ static irqreturn_t atmel_hlcdc_dc_irq_handler(int irq, void *data)
|
|||
}
|
||||
|
||||
static struct drm_framebuffer *atmel_hlcdc_fb_create(struct drm_device *dev,
|
||||
struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
return drm_fb_cma_create(dev, file_priv, mode_cmd);
|
||||
}
|
||||
|
|
|
@ -149,7 +149,7 @@ int bochs_dumb_mmap_offset(struct drm_file *file, struct drm_device *dev,
|
|||
|
||||
int bochs_framebuffer_init(struct drm_device *dev,
|
||||
struct bochs_framebuffer *gfb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj);
|
||||
int bochs_bo_pin(struct bochs_bo *bo, u32 pl_flag, u64 *gpu_addr);
|
||||
int bochs_bo_unpin(struct bochs_bo *bo);
|
||||
|
|
|
@ -34,7 +34,7 @@ static struct fb_ops bochsfb_ops = {
|
|||
};
|
||||
|
||||
static int bochsfb_create_object(struct bochs_device *bochs,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object **gobj_p)
|
||||
{
|
||||
struct drm_device *dev = bochs->dev;
|
||||
|
|
|
@ -484,7 +484,7 @@ static const struct drm_framebuffer_funcs bochs_fb_funcs = {
|
|||
|
||||
int bochs_framebuffer_init(struct drm_device *dev,
|
||||
struct bochs_framebuffer *gfb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj)
|
||||
{
|
||||
int ret;
|
||||
|
@ -502,7 +502,7 @@ int bochs_framebuffer_init(struct drm_device *dev,
|
|||
static struct drm_framebuffer *
|
||||
bochs_user_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *filp,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct drm_gem_object *obj;
|
||||
struct bochs_framebuffer *bochs_fb;
|
||||
|
|
|
@ -153,7 +153,6 @@ struct cirrus_device {
|
|||
struct cirrus_fbdev {
|
||||
struct drm_fb_helper helper;
|
||||
struct cirrus_framebuffer gfb;
|
||||
struct list_head fbdev_list;
|
||||
void *sysram;
|
||||
int size;
|
||||
int x1, y1, x2, y2; /* dirty rect */
|
||||
|
@ -207,7 +206,7 @@ int cirrus_dumb_create(struct drm_file *file,
|
|||
|
||||
int cirrus_framebuffer_init(struct drm_device *dev,
|
||||
struct cirrus_framebuffer *gfb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj);
|
||||
|
||||
bool cirrus_check_framebuffer(struct cirrus_device *cdev, int width, int height,
|
||||
|
|
|
@ -135,7 +135,7 @@ static struct fb_ops cirrusfb_ops = {
|
|||
};
|
||||
|
||||
static int cirrusfb_create_object(struct cirrus_fbdev *afbdev,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object **gobj_p)
|
||||
{
|
||||
struct drm_device *dev = afbdev->helper.dev;
|
||||
|
|
|
@ -29,7 +29,7 @@ static const struct drm_framebuffer_funcs cirrus_fb_funcs = {
|
|||
|
||||
int cirrus_framebuffer_init(struct drm_device *dev,
|
||||
struct cirrus_framebuffer *gfb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj)
|
||||
{
|
||||
int ret;
|
||||
|
@ -47,7 +47,7 @@ int cirrus_framebuffer_init(struct drm_device *dev,
|
|||
static struct drm_framebuffer *
|
||||
cirrus_user_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *filp,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct cirrus_device *cdev = dev->dev_private;
|
||||
struct drm_gem_object *obj;
|
||||
|
|
|
@ -316,8 +316,7 @@ int drm_atomic_set_mode_for_crtc(struct drm_crtc_state *state,
|
|||
if (mode && memcmp(&state->mode, mode, sizeof(*mode)) == 0)
|
||||
return 0;
|
||||
|
||||
if (state->mode_blob)
|
||||
drm_property_unreference_blob(state->mode_blob);
|
||||
drm_property_unreference_blob(state->mode_blob);
|
||||
state->mode_blob = NULL;
|
||||
|
||||
if (mode) {
|
||||
|
@ -363,8 +362,7 @@ int drm_atomic_set_mode_prop_for_crtc(struct drm_crtc_state *state,
|
|||
if (blob == state->mode_blob)
|
||||
return 0;
|
||||
|
||||
if (state->mode_blob)
|
||||
drm_property_unreference_blob(state->mode_blob);
|
||||
drm_property_unreference_blob(state->mode_blob);
|
||||
state->mode_blob = NULL;
|
||||
|
||||
if (blob) {
|
||||
|
@ -419,8 +417,7 @@ int drm_atomic_crtc_set_property(struct drm_crtc *crtc,
|
|||
struct drm_property_blob *mode =
|
||||
drm_property_lookup_blob(dev, val);
|
||||
ret = drm_atomic_set_mode_prop_for_crtc(state, mode);
|
||||
if (mode)
|
||||
drm_property_unreference_blob(mode);
|
||||
drm_property_unreference_blob(mode);
|
||||
return ret;
|
||||
}
|
||||
else if (crtc->funcs->atomic_set_property)
|
||||
|
@ -1433,7 +1430,7 @@ static int atomic_set_prop(struct drm_atomic_state *state,
|
|||
}
|
||||
|
||||
/**
|
||||
* drm_atomic_update_old_fb -- Unset old_fb pointers and set plane->fb pointers.
|
||||
* drm_atomic_clean_old_fb -- Unset old_fb pointers and set plane->fb pointers.
|
||||
*
|
||||
* @dev: drm device to check.
|
||||
* @plane_mask: plane mask for planes that were updated.
|
||||
|
|
|
@ -1485,12 +1485,12 @@ int drm_atomic_helper_update_plane(struct drm_plane *plane,
|
|||
drm_atomic_set_fb_for_plane(plane_state, fb);
|
||||
plane_state->crtc_x = crtc_x;
|
||||
plane_state->crtc_y = crtc_y;
|
||||
plane_state->crtc_h = crtc_h;
|
||||
plane_state->crtc_w = crtc_w;
|
||||
plane_state->crtc_h = crtc_h;
|
||||
plane_state->src_x = src_x;
|
||||
plane_state->src_y = src_y;
|
||||
plane_state->src_h = src_h;
|
||||
plane_state->src_w = src_w;
|
||||
plane_state->src_h = src_h;
|
||||
|
||||
if (plane == crtc->cursor)
|
||||
state->legacy_cursor_update = true;
|
||||
|
@ -1609,12 +1609,12 @@ int __drm_atomic_helper_disable_plane(struct drm_plane *plane,
|
|||
drm_atomic_set_fb_for_plane(plane_state, NULL);
|
||||
plane_state->crtc_x = 0;
|
||||
plane_state->crtc_y = 0;
|
||||
plane_state->crtc_h = 0;
|
||||
plane_state->crtc_w = 0;
|
||||
plane_state->crtc_h = 0;
|
||||
plane_state->src_x = 0;
|
||||
plane_state->src_y = 0;
|
||||
plane_state->src_h = 0;
|
||||
plane_state->src_w = 0;
|
||||
plane_state->src_h = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1797,16 +1797,16 @@ int __drm_atomic_helper_set_config(struct drm_mode_set *set,
|
|||
drm_atomic_set_fb_for_plane(primary_state, set->fb);
|
||||
primary_state->crtc_x = 0;
|
||||
primary_state->crtc_y = 0;
|
||||
primary_state->crtc_h = vdisplay;
|
||||
primary_state->crtc_w = hdisplay;
|
||||
primary_state->crtc_h = vdisplay;
|
||||
primary_state->src_x = set->x << 16;
|
||||
primary_state->src_y = set->y << 16;
|
||||
if (primary_state->rotation & (BIT(DRM_ROTATE_90) | BIT(DRM_ROTATE_270))) {
|
||||
primary_state->src_h = hdisplay << 16;
|
||||
primary_state->src_w = vdisplay << 16;
|
||||
primary_state->src_h = hdisplay << 16;
|
||||
} else {
|
||||
primary_state->src_h = vdisplay << 16;
|
||||
primary_state->src_w = hdisplay << 16;
|
||||
primary_state->src_h = vdisplay << 16;
|
||||
}
|
||||
|
||||
commit:
|
||||
|
@ -2184,7 +2184,7 @@ EXPORT_SYMBOL(drm_atomic_helper_connector_dpms);
|
|||
*/
|
||||
void drm_atomic_helper_crtc_reset(struct drm_crtc *crtc)
|
||||
{
|
||||
if (crtc->state && crtc->state->mode_blob)
|
||||
if (crtc->state)
|
||||
drm_property_unreference_blob(crtc->state->mode_blob);
|
||||
kfree(crtc->state);
|
||||
crtc->state = kzalloc(sizeof(*crtc->state), GFP_KERNEL);
|
||||
|
@ -2252,8 +2252,7 @@ EXPORT_SYMBOL(drm_atomic_helper_crtc_duplicate_state);
|
|||
void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc,
|
||||
struct drm_crtc_state *state)
|
||||
{
|
||||
if (state->mode_blob)
|
||||
drm_property_unreference_blob(state->mode_blob);
|
||||
drm_property_unreference_blob(state->mode_blob);
|
||||
}
|
||||
EXPORT_SYMBOL(__drm_atomic_helper_crtc_destroy_state);
|
||||
|
||||
|
|
|
@ -45,7 +45,7 @@
|
|||
|
||||
static struct drm_framebuffer *
|
||||
internal_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_mode_fb_cmd2 *r,
|
||||
const struct drm_mode_fb_cmd2 *r,
|
||||
struct drm_file *file_priv);
|
||||
|
||||
/* Avoid boilerplate. I'm tired of typing. */
|
||||
|
@ -3235,7 +3235,7 @@ static int framebuffer_check(const struct drm_mode_fb_cmd2 *r)
|
|||
|
||||
static struct drm_framebuffer *
|
||||
internal_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_mode_fb_cmd2 *r,
|
||||
const struct drm_mode_fb_cmd2 *r,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_mode_config *config = &dev->mode_config;
|
||||
|
|
|
@ -818,7 +818,7 @@ EXPORT_SYMBOL(drm_helper_connector_dpms);
|
|||
* metadata fields.
|
||||
*/
|
||||
void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
|
|
@ -74,7 +74,7 @@ static struct drm_framebuffer_funcs drm_fb_cma_funcs = {
|
|||
};
|
||||
|
||||
static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_cma_object **obj,
|
||||
const const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_cma_object **obj,
|
||||
unsigned int num_planes)
|
||||
{
|
||||
struct drm_fb_cma *fb_cma;
|
||||
|
@ -107,7 +107,7 @@ static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev,
|
|||
* checked before calling this function.
|
||||
*/
|
||||
struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
|
||||
struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct drm_fb_cma *fb_cma;
|
||||
struct drm_gem_cma_object *objs[4];
|
||||
|
|
|
@ -244,8 +244,9 @@ drm_gem_object_handle_unreference_unlocked(struct drm_gem_object *obj)
|
|||
* @filp: drm file-private structure to use for the handle look up
|
||||
* @handle: userspace handle to delete
|
||||
*
|
||||
* Removes the GEM handle from the @filp lookup table and if this is the last
|
||||
* handle also cleans up linked resources like GEM names.
|
||||
* Removes the GEM handle from the @filp lookup table which has been added with
|
||||
* drm_gem_handle_create(). If this is the last handle also cleans up linked
|
||||
* resources like GEM names.
|
||||
*/
|
||||
int
|
||||
drm_gem_handle_delete(struct drm_file *filp, u32 handle)
|
||||
|
@ -314,6 +315,10 @@ EXPORT_SYMBOL(drm_gem_dumb_destroy);
|
|||
* This expects the dev->object_name_lock to be held already and will drop it
|
||||
* before returning. Used to avoid races in establishing new handles when
|
||||
* importing an object from either an flink name or a dma-buf.
|
||||
*
|
||||
* Handles must be release again through drm_gem_handle_delete(). This is done
|
||||
* when userspace closes @file_priv for all attached handles, or through the
|
||||
* GEM_CLOSE ioctl for individual handles.
|
||||
*/
|
||||
int
|
||||
drm_gem_handle_create_tail(struct drm_file *file_priv,
|
||||
|
@ -541,7 +546,17 @@ void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages,
|
|||
}
|
||||
EXPORT_SYMBOL(drm_gem_put_pages);
|
||||
|
||||
/** Returns a reference to the object named by the handle. */
|
||||
/**
|
||||
* drm_gem_object_lookup - look up a GEM object from it's handle
|
||||
* @dev: DRM device
|
||||
* @filp: DRM file private date
|
||||
* @handle: userspace handle
|
||||
*
|
||||
* Returns:
|
||||
*
|
||||
* A reference to the object named by the handle if such exists on @filp, NULL
|
||||
* otherwise.
|
||||
*/
|
||||
struct drm_gem_object *
|
||||
drm_gem_object_lookup(struct drm_device *dev, struct drm_file *filp,
|
||||
u32 handle)
|
||||
|
@ -774,6 +789,13 @@ drm_gem_object_free(struct kref *kref)
|
|||
}
|
||||
EXPORT_SYMBOL(drm_gem_object_free);
|
||||
|
||||
/**
|
||||
* drm_gem_vm_open - vma->ops->open implementation for GEM
|
||||
* @vma: VM area structure
|
||||
*
|
||||
* This function implements the #vm_operations_struct open() callback for GEM
|
||||
* drivers. This must be used together with drm_gem_vm_close().
|
||||
*/
|
||||
void drm_gem_vm_open(struct vm_area_struct *vma)
|
||||
{
|
||||
struct drm_gem_object *obj = vma->vm_private_data;
|
||||
|
@ -782,6 +804,13 @@ void drm_gem_vm_open(struct vm_area_struct *vma)
|
|||
}
|
||||
EXPORT_SYMBOL(drm_gem_vm_open);
|
||||
|
||||
/**
|
||||
* drm_gem_vm_close - vma->ops->close implementation for GEM
|
||||
* @vma: VM area structure
|
||||
*
|
||||
* This function implements the #vm_operations_struct close() callback for GEM
|
||||
* drivers. This must be used together with drm_gem_vm_open().
|
||||
*/
|
||||
void drm_gem_vm_close(struct vm_area_struct *vma)
|
||||
{
|
||||
struct drm_gem_object *obj = vma->vm_private_data;
|
||||
|
|
|
@ -1230,7 +1230,7 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option,
|
|||
unsigned int xres = 0, yres = 0, bpp = 32, refresh = 0;
|
||||
bool yres_specified = false, cvt = false, rb = false;
|
||||
bool interlace = false, margins = false, was_digit = false;
|
||||
int i;
|
||||
int i, err;
|
||||
enum drm_connector_force force = DRM_FORCE_UNSPECIFIED;
|
||||
|
||||
#ifdef CONFIG_FB
|
||||
|
@ -1250,7 +1250,9 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option,
|
|||
case '@':
|
||||
if (!refresh_specified && !bpp_specified &&
|
||||
!yres_specified && !cvt && !rb && was_digit) {
|
||||
refresh = simple_strtol(&name[i+1], NULL, 10);
|
||||
err = kstrtouint(&name[i + 1], 10, &refresh);
|
||||
if (err)
|
||||
return false;
|
||||
refresh_specified = true;
|
||||
was_digit = false;
|
||||
} else
|
||||
|
@ -1259,7 +1261,9 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option,
|
|||
case '-':
|
||||
if (!bpp_specified && !yres_specified && !cvt &&
|
||||
!rb && was_digit) {
|
||||
bpp = simple_strtol(&name[i+1], NULL, 10);
|
||||
err = kstrtouint(&name[i + 1], 10, &bpp);
|
||||
if (err)
|
||||
return false;
|
||||
bpp_specified = true;
|
||||
was_digit = false;
|
||||
} else
|
||||
|
@ -1267,7 +1271,9 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option,
|
|||
break;
|
||||
case 'x':
|
||||
if (!yres_specified && was_digit) {
|
||||
yres = simple_strtol(&name[i+1], NULL, 10);
|
||||
err = kstrtouint(&name[i + 1], 10, &yres);
|
||||
if (err)
|
||||
return false;
|
||||
yres_specified = true;
|
||||
was_digit = false;
|
||||
} else
|
||||
|
@ -1491,4 +1497,4 @@ int drm_mode_convert_umode(struct drm_display_mode *out,
|
|||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -164,6 +164,8 @@ int drm_plane_helper_check_update(struct drm_plane *plane,
|
|||
vscale = drm_rect_calc_vscale(src, dest, min_scale, max_scale);
|
||||
if (hscale < 0 || vscale < 0) {
|
||||
DRM_DEBUG_KMS("Invalid scaling of plane\n");
|
||||
drm_rect_debug_print("src: ", src, true);
|
||||
drm_rect_debug_print("dst: ", dest, false);
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
|
@ -180,6 +182,8 @@ int drm_plane_helper_check_update(struct drm_plane *plane,
|
|||
|
||||
if (!can_position && !drm_rect_equals(dest, clip)) {
|
||||
DRM_DEBUG_KMS("Plane must cover entire CRTC\n");
|
||||
drm_rect_debug_print("dst: ", dest, false);
|
||||
drm_rect_debug_print("clip: ", clip, false);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
|
@ -147,6 +147,8 @@ static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connect
|
|||
list_for_each_entry(mode, &connector->modes, head)
|
||||
mode->status = MODE_UNVERIFIED;
|
||||
|
||||
old_status = connector->status;
|
||||
|
||||
if (connector->force) {
|
||||
if (connector->force == DRM_FORCE_ON ||
|
||||
connector->force == DRM_FORCE_ON_DIGITAL)
|
||||
|
@ -156,33 +158,31 @@ static int drm_helper_probe_single_connector_modes_merge_bits(struct drm_connect
|
|||
if (connector->funcs->force)
|
||||
connector->funcs->force(connector);
|
||||
} else {
|
||||
old_status = connector->status;
|
||||
|
||||
connector->status = connector->funcs->detect(connector, true);
|
||||
}
|
||||
|
||||
/*
|
||||
* Normally either the driver's hpd code or the poll loop should
|
||||
* pick up any changes and fire the hotplug event. But if
|
||||
* userspace sneaks in a probe, we might miss a change. Hence
|
||||
* check here, and if anything changed start the hotplug code.
|
||||
*/
|
||||
if (old_status != connector->status) {
|
||||
DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %d to %d\n",
|
||||
connector->base.id,
|
||||
connector->name,
|
||||
old_status, connector->status);
|
||||
|
||||
/*
|
||||
* Normally either the driver's hpd code or the poll loop should
|
||||
* pick up any changes and fire the hotplug event. But if
|
||||
* userspace sneaks in a probe, we might miss a change. Hence
|
||||
* check here, and if anything changed start the hotplug code.
|
||||
* The hotplug event code might call into the fb
|
||||
* helpers, and so expects that we do not hold any
|
||||
* locks. Fire up the poll struct instead, it will
|
||||
* disable itself again.
|
||||
*/
|
||||
if (old_status != connector->status) {
|
||||
DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %d to %d\n",
|
||||
connector->base.id,
|
||||
connector->name,
|
||||
old_status, connector->status);
|
||||
|
||||
/*
|
||||
* The hotplug event code might call into the fb
|
||||
* helpers, and so expects that we do not hold any
|
||||
* locks. Fire up the poll struct instead, it will
|
||||
* disable itself again.
|
||||
*/
|
||||
dev->mode_config.delayed_event = true;
|
||||
if (dev->mode_config.poll_enabled)
|
||||
schedule_delayed_work(&dev->mode_config.output_poll_work,
|
||||
0);
|
||||
}
|
||||
dev->mode_config.delayed_event = true;
|
||||
if (dev->mode_config.poll_enabled)
|
||||
schedule_delayed_work(&dev->mode_config.output_poll_work,
|
||||
0);
|
||||
}
|
||||
|
||||
/* Re-enable polling in case the global poll config changed. */
|
||||
|
|
|
@ -275,22 +275,23 @@ EXPORT_SYMBOL(drm_rect_calc_vscale_relaxed);
|
|||
|
||||
/**
|
||||
* drm_rect_debug_print - print the rectangle information
|
||||
* @prefix: prefix string
|
||||
* @r: rectangle to print
|
||||
* @fixed_point: rectangle is in 16.16 fixed point format
|
||||
*/
|
||||
void drm_rect_debug_print(const struct drm_rect *r, bool fixed_point)
|
||||
void drm_rect_debug_print(const char *prefix, const struct drm_rect *r, bool fixed_point)
|
||||
{
|
||||
int w = drm_rect_width(r);
|
||||
int h = drm_rect_height(r);
|
||||
|
||||
if (fixed_point)
|
||||
DRM_DEBUG_KMS("%d.%06ux%d.%06u%+d.%06u%+d.%06u\n",
|
||||
DRM_DEBUG_KMS("%s%d.%06ux%d.%06u%+d.%06u%+d.%06u\n", prefix,
|
||||
w >> 16, ((w & 0xffff) * 15625) >> 10,
|
||||
h >> 16, ((h & 0xffff) * 15625) >> 10,
|
||||
r->x1 >> 16, ((r->x1 & 0xffff) * 15625) >> 10,
|
||||
r->y1 >> 16, ((r->y1 & 0xffff) * 15625) >> 10);
|
||||
else
|
||||
DRM_DEBUG_KMS("%dx%d%+d%+d\n", w, h, r->x1, r->y1);
|
||||
DRM_DEBUG_KMS("%s%dx%d%+d%+d\n", prefix, w, h, r->x1, r->y1);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_rect_debug_print);
|
||||
|
||||
|
|
|
@ -167,47 +167,35 @@ static ssize_t status_store(struct device *device,
|
|||
{
|
||||
struct drm_connector *connector = to_drm_connector(device);
|
||||
struct drm_device *dev = connector->dev;
|
||||
enum drm_connector_status old_status;
|
||||
enum drm_connector_force old_force;
|
||||
int ret;
|
||||
|
||||
ret = mutex_lock_interruptible(&dev->mode_config.mutex);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
old_status = connector->status;
|
||||
old_force = connector->force;
|
||||
|
||||
if (sysfs_streq(buf, "detect")) {
|
||||
if (sysfs_streq(buf, "detect"))
|
||||
connector->force = 0;
|
||||
connector->status = connector->funcs->detect(connector, true);
|
||||
} else if (sysfs_streq(buf, "on")) {
|
||||
else if (sysfs_streq(buf, "on"))
|
||||
connector->force = DRM_FORCE_ON;
|
||||
} else if (sysfs_streq(buf, "on-digital")) {
|
||||
else if (sysfs_streq(buf, "on-digital"))
|
||||
connector->force = DRM_FORCE_ON_DIGITAL;
|
||||
} else if (sysfs_streq(buf, "off")) {
|
||||
else if (sysfs_streq(buf, "off"))
|
||||
connector->force = DRM_FORCE_OFF;
|
||||
} else
|
||||
else
|
||||
ret = -EINVAL;
|
||||
|
||||
if (ret == 0 && connector->force) {
|
||||
if (connector->force == DRM_FORCE_ON ||
|
||||
connector->force == DRM_FORCE_ON_DIGITAL)
|
||||
connector->status = connector_status_connected;
|
||||
else
|
||||
connector->status = connector_status_disconnected;
|
||||
if (connector->funcs->force)
|
||||
connector->funcs->force(connector);
|
||||
}
|
||||
|
||||
if (old_status != connector->status) {
|
||||
DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %d to %d\n",
|
||||
if (old_force != connector->force || !connector->force) {
|
||||
DRM_DEBUG_KMS("[CONNECTOR:%d:%s] force updated from %d to %d or reprobing\n",
|
||||
connector->base.id,
|
||||
connector->name,
|
||||
old_status, connector->status);
|
||||
old_force, connector->force);
|
||||
|
||||
dev->mode_config.delayed_event = true;
|
||||
if (dev->mode_config.poll_enabled)
|
||||
schedule_delayed_work(&dev->mode_config.output_poll_work,
|
||||
0);
|
||||
connector->funcs->fill_modes(connector,
|
||||
dev->mode_config.max_width,
|
||||
dev->mode_config.max_height);
|
||||
}
|
||||
|
||||
mutex_unlock(&dev->mode_config.mutex);
|
||||
|
@ -256,23 +244,29 @@ static ssize_t edid_show(struct file *filp, struct kobject *kobj,
|
|||
struct drm_connector *connector = to_drm_connector(connector_dev);
|
||||
unsigned char *edid;
|
||||
size_t size;
|
||||
ssize_t ret = 0;
|
||||
|
||||
mutex_lock(&connector->dev->mode_config.mutex);
|
||||
if (!connector->edid_blob_ptr)
|
||||
return 0;
|
||||
goto unlock;
|
||||
|
||||
edid = connector->edid_blob_ptr->data;
|
||||
size = connector->edid_blob_ptr->length;
|
||||
if (!edid)
|
||||
return 0;
|
||||
goto unlock;
|
||||
|
||||
if (off >= size)
|
||||
return 0;
|
||||
goto unlock;
|
||||
|
||||
if (off + count > size)
|
||||
count = size - off;
|
||||
memcpy(buf, edid + off, count);
|
||||
|
||||
return count;
|
||||
ret = count;
|
||||
unlock:
|
||||
mutex_unlock(&connector->dev->mode_config.mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t modes_show(struct device *device,
|
||||
|
@ -283,10 +277,12 @@ static ssize_t modes_show(struct device *device,
|
|||
struct drm_display_mode *mode;
|
||||
int written = 0;
|
||||
|
||||
mutex_lock(&connector->dev->mode_config.mutex);
|
||||
list_for_each_entry(mode, &connector->modes, head) {
|
||||
written += snprintf(buf + written, PAGE_SIZE - written, "%s\n",
|
||||
mode->name);
|
||||
}
|
||||
mutex_unlock(&connector->dev->mode_config.mutex);
|
||||
|
||||
return written;
|
||||
}
|
||||
|
|
|
@ -117,7 +117,7 @@ static struct drm_framebuffer_funcs exynos_drm_fb_funcs = {
|
|||
|
||||
struct drm_framebuffer *
|
||||
exynos_drm_framebuffer_init(struct drm_device *dev,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct exynos_drm_gem **exynos_gem,
|
||||
int count)
|
||||
{
|
||||
|
@ -154,7 +154,7 @@ exynos_drm_framebuffer_init(struct drm_device *dev,
|
|||
|
||||
static struct drm_framebuffer *
|
||||
exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct exynos_drm_gem *exynos_gem[MAX_FB_BUFFER];
|
||||
struct drm_gem_object *obj;
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
struct drm_framebuffer *
|
||||
exynos_drm_framebuffer_init(struct drm_device *dev,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct exynos_drm_gem **exynos_gem,
|
||||
int count);
|
||||
|
||||
|
|
|
@ -241,7 +241,7 @@ static struct fb_ops psbfb_unaccel_ops = {
|
|||
*/
|
||||
static int psb_framebuffer_init(struct drm_device *dev,
|
||||
struct psb_framebuffer *fb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct gtt_range *gt)
|
||||
{
|
||||
u32 bpp, depth;
|
||||
|
@ -284,7 +284,7 @@ static int psb_framebuffer_init(struct drm_device *dev,
|
|||
|
||||
static struct drm_framebuffer *psb_framebuffer_create
|
||||
(struct drm_device *dev,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct gtt_range *gt)
|
||||
{
|
||||
struct psb_framebuffer *fb;
|
||||
|
@ -488,7 +488,7 @@ static int psbfb_create(struct psb_fbdev *fbdev,
|
|||
*/
|
||||
static struct drm_framebuffer *psb_user_framebuffer_create
|
||||
(struct drm_device *dev, struct drm_file *filp,
|
||||
struct drm_mode_fb_cmd2 *cmd)
|
||||
const struct drm_mode_fb_cmd2 *cmd)
|
||||
{
|
||||
struct gtt_range *r;
|
||||
struct drm_gem_object *obj;
|
||||
|
|
|
@ -288,7 +288,7 @@ struct i915_hotplug {
|
|||
list_for_each_entry(intel_plane, \
|
||||
&(dev)->mode_config.plane_list, \
|
||||
base.head) \
|
||||
if ((intel_plane)->pipe == (intel_crtc)->pipe)
|
||||
for_each_if ((intel_plane)->pipe == (intel_crtc)->pipe)
|
||||
|
||||
#define for_each_intel_crtc(dev, intel_crtc) \
|
||||
list_for_each_entry(intel_crtc, &dev->mode_config.crtc_list, base.head)
|
||||
|
@ -305,15 +305,15 @@ struct i915_hotplug {
|
|||
|
||||
#define for_each_encoder_on_crtc(dev, __crtc, intel_encoder) \
|
||||
list_for_each_entry((intel_encoder), &(dev)->mode_config.encoder_list, base.head) \
|
||||
if ((intel_encoder)->base.crtc == (__crtc))
|
||||
for_each_if ((intel_encoder)->base.crtc == (__crtc))
|
||||
|
||||
#define for_each_connector_on_encoder(dev, __encoder, intel_connector) \
|
||||
list_for_each_entry((intel_connector), &(dev)->mode_config.connector_list, base.head) \
|
||||
if ((intel_connector)->base.encoder == (__encoder))
|
||||
for_each_if ((intel_connector)->base.encoder == (__encoder))
|
||||
|
||||
#define for_each_power_domain(domain, mask) \
|
||||
for ((domain) = 0; (domain) < POWER_DOMAIN_NUM; (domain)++) \
|
||||
if ((1 << (domain)) & (mask))
|
||||
for_each_if ((1 << (domain)) & (mask))
|
||||
|
||||
struct drm_i915_private;
|
||||
struct i915_mm_struct;
|
||||
|
@ -734,7 +734,7 @@ struct intel_uncore {
|
|||
for ((i__) = 0, (domain__) = &(dev_priv__)->uncore.fw_domain[0]; \
|
||||
(i__) < FW_DOMAIN_ID_COUNT; \
|
||||
(i__)++, (domain__) = &(dev_priv__)->uncore.fw_domain[i__]) \
|
||||
if (((mask__) & (dev_priv__)->uncore.fw_domains) & (1 << (i__)))
|
||||
for_each_if (((mask__) & (dev_priv__)->uncore.fw_domains) & (1 << (i__)))
|
||||
|
||||
#define for_each_fw_domain(domain__, dev_priv__, i__) \
|
||||
for_each_fw_domain_mask(domain__, FORCEWAKE_ALL, dev_priv__, i__)
|
||||
|
@ -1979,7 +1979,7 @@ static inline struct drm_i915_private *guc_to_i915(struct intel_guc *guc)
|
|||
/* Iterate over initialised rings */
|
||||
#define for_each_ring(ring__, dev_priv__, i__) \
|
||||
for ((i__) = 0; (i__) < I915_NUM_RINGS; (i__)++) \
|
||||
if (((ring__) = &(dev_priv__)->ring[(i__)]), intel_ring_initialized((ring__)))
|
||||
for_each_if ((((ring__) = &(dev_priv__)->ring[(i__)]), intel_ring_initialized((ring__))))
|
||||
|
||||
enum hdmi_force_audio {
|
||||
HDMI_AUDIO_OFF_DVI = -2, /* no aux data for HDMI-DVI converter */
|
||||
|
|
|
@ -12281,7 +12281,7 @@ static bool intel_fuzzy_clock_check(int clock1, int clock2)
|
|||
list_for_each_entry((intel_crtc), \
|
||||
&(dev)->mode_config.crtc_list, \
|
||||
base.head) \
|
||||
if (mask & (1 <<(intel_crtc)->pipe))
|
||||
for_each_if (mask & (1 <<(intel_crtc)->pipe))
|
||||
|
||||
static bool
|
||||
intel_compare_m_n(unsigned int m, unsigned int n,
|
||||
|
@ -14377,7 +14377,7 @@ static int intel_framebuffer_init(struct drm_device *dev,
|
|||
static struct drm_framebuffer *
|
||||
intel_user_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *filp,
|
||||
struct drm_mode_fb_cmd2 *user_mode_cmd)
|
||||
const struct drm_mode_fb_cmd2 *user_mode_cmd)
|
||||
{
|
||||
struct drm_i915_gem_object *obj;
|
||||
struct drm_mode_fb_cmd2 mode_cmd = *user_mode_cmd;
|
||||
|
|
|
@ -123,8 +123,6 @@ struct intel_framebuffer {
|
|||
struct intel_fbdev {
|
||||
struct drm_fb_helper helper;
|
||||
struct intel_framebuffer *fb;
|
||||
struct list_head fbdev_list;
|
||||
struct drm_display_mode *our_mode;
|
||||
int preferred_bpp;
|
||||
};
|
||||
|
||||
|
|
|
@ -117,7 +117,7 @@ static inline struct intel_dsi_host *to_intel_dsi_host(struct mipi_dsi_host *h)
|
|||
|
||||
#define for_each_dsi_port(__port, __ports_mask) \
|
||||
for ((__port) = PORT_A; (__port) < I915_MAX_PORTS; (__port)++) \
|
||||
if ((__ports_mask) & (1 << (__port)))
|
||||
for_each_if ((__ports_mask) & (1 << (__port)))
|
||||
|
||||
static inline struct intel_dsi *enc_to_intel_dsi(struct drm_encoder *encoder)
|
||||
{
|
||||
|
|
|
@ -57,13 +57,13 @@
|
|||
i < (power_domains)->power_well_count && \
|
||||
((power_well) = &(power_domains)->power_wells[i]); \
|
||||
i++) \
|
||||
if ((power_well)->domains & (domain_mask))
|
||||
for_each_if ((power_well)->domains & (domain_mask))
|
||||
|
||||
#define for_each_power_well_rev(i, power_well, domain_mask, power_domains) \
|
||||
for (i = (power_domains)->power_well_count - 1; \
|
||||
i >= 0 && ((power_well) = &(power_domains)->power_wells[i]);\
|
||||
i--) \
|
||||
if ((power_well)->domains & (domain_mask))
|
||||
for_each_if ((power_well)->domains & (domain_mask))
|
||||
|
||||
bool intel_display_power_well_is_enabled(struct drm_i915_private *dev_priv,
|
||||
int power_well_id);
|
||||
|
|
|
@ -832,8 +832,8 @@ intel_check_sprite_plane(struct drm_plane *plane,
|
|||
hscale = drm_rect_calc_hscale(src, dst, min_scale, max_scale);
|
||||
if (hscale < 0) {
|
||||
DRM_DEBUG_KMS("Horizontal scaling factor out of limits\n");
|
||||
drm_rect_debug_print(src, true);
|
||||
drm_rect_debug_print(dst, false);
|
||||
drm_rect_debug_print("src: ", src, true);
|
||||
drm_rect_debug_print("dst: ", dst, false);
|
||||
|
||||
return hscale;
|
||||
}
|
||||
|
@ -841,8 +841,8 @@ intel_check_sprite_plane(struct drm_plane *plane,
|
|||
vscale = drm_rect_calc_vscale(src, dst, min_scale, max_scale);
|
||||
if (vscale < 0) {
|
||||
DRM_DEBUG_KMS("Vertical scaling factor out of limits\n");
|
||||
drm_rect_debug_print(src, true);
|
||||
drm_rect_debug_print(dst, false);
|
||||
drm_rect_debug_print("src: ", src, true);
|
||||
drm_rect_debug_print("dst: ", dst, false);
|
||||
|
||||
return vscale;
|
||||
}
|
||||
|
|
|
@ -10,15 +10,6 @@ config DRM_IMX
|
|||
help
|
||||
enable i.MX graphics support
|
||||
|
||||
config DRM_IMX_FB_HELPER
|
||||
tristate "provide legacy framebuffer /dev/fb0"
|
||||
select DRM_KMS_CMA_HELPER
|
||||
depends on DRM_IMX
|
||||
help
|
||||
The DRM framework can provide a legacy /dev/fb0 framebuffer
|
||||
for your device. This is necessary to get a framebuffer console
|
||||
and also for applications using the legacy framebuffer API
|
||||
|
||||
config DRM_IMX_PARALLEL_DISPLAY
|
||||
tristate "Support for parallel displays"
|
||||
select DRM_PANEL
|
||||
|
|
|
@ -49,8 +49,10 @@ struct imx_drm_crtc {
|
|||
struct imx_drm_crtc_helper_funcs imx_drm_helper_funcs;
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION)
|
||||
static int legacyfb_depth = 16;
|
||||
module_param(legacyfb_depth, int, 0444);
|
||||
#endif
|
||||
|
||||
int imx_drm_crtc_id(struct imx_drm_crtc *crtc)
|
||||
{
|
||||
|
@ -60,26 +62,20 @@ EXPORT_SYMBOL_GPL(imx_drm_crtc_id);
|
|||
|
||||
static void imx_drm_driver_lastclose(struct drm_device *drm)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_DRM_IMX_FB_HELPER)
|
||||
struct imx_drm_device *imxdrm = drm->dev_private;
|
||||
|
||||
if (imxdrm->fbhelper)
|
||||
drm_fbdev_cma_restore_mode(imxdrm->fbhelper);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int imx_drm_driver_unload(struct drm_device *drm)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_DRM_IMX_FB_HELPER)
|
||||
struct imx_drm_device *imxdrm = drm->dev_private;
|
||||
#endif
|
||||
|
||||
drm_kms_helper_poll_fini(drm);
|
||||
|
||||
#if IS_ENABLED(CONFIG_DRM_IMX_FB_HELPER)
|
||||
if (imxdrm->fbhelper)
|
||||
drm_fbdev_cma_fini(imxdrm->fbhelper);
|
||||
#endif
|
||||
|
||||
component_unbind_all(drm->dev, drm);
|
||||
|
||||
|
@ -215,11 +211,9 @@ EXPORT_SYMBOL_GPL(imx_drm_encoder_destroy);
|
|||
|
||||
static void imx_drm_output_poll_changed(struct drm_device *drm)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_DRM_IMX_FB_HELPER)
|
||||
struct imx_drm_device *imxdrm = drm->dev_private;
|
||||
|
||||
drm_fbdev_cma_hotplug_event(imxdrm->fbhelper);
|
||||
#endif
|
||||
}
|
||||
|
||||
static struct drm_mode_config_funcs imx_drm_mode_config_funcs = {
|
||||
|
@ -308,7 +302,7 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
|
|||
* The fb helper takes copies of key hardware information, so the
|
||||
* crtcs/connectors/encoders must not change after this point.
|
||||
*/
|
||||
#if IS_ENABLED(CONFIG_DRM_IMX_FB_HELPER)
|
||||
#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION)
|
||||
if (legacyfb_depth != 16 && legacyfb_depth != 32) {
|
||||
dev_warn(drm->dev, "Invalid legacyfb_depth. Defaulting to 16bpp\n");
|
||||
legacyfb_depth = 16;
|
||||
|
|
|
@ -252,7 +252,7 @@ void mgag200_fbdev_fini(struct mga_device *mdev);
|
|||
/* mgag200_main.c */
|
||||
int mgag200_framebuffer_init(struct drm_device *dev,
|
||||
struct mga_framebuffer *mfb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj);
|
||||
|
||||
|
||||
|
|
|
@ -138,7 +138,7 @@ static struct fb_ops mgag200fb_ops = {
|
|||
};
|
||||
|
||||
static int mgag200fb_create_object(struct mga_fbdev *afbdev,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object **gobj_p)
|
||||
{
|
||||
struct drm_device *dev = afbdev->helper.dev;
|
||||
|
|
|
@ -29,7 +29,7 @@ static const struct drm_framebuffer_funcs mga_fb_funcs = {
|
|||
|
||||
int mgag200_framebuffer_init(struct drm_device *dev,
|
||||
struct mga_framebuffer *gfb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj)
|
||||
{
|
||||
int ret;
|
||||
|
@ -47,7 +47,7 @@ int mgag200_framebuffer_init(struct drm_device *dev,
|
|||
static struct drm_framebuffer *
|
||||
mgag200_user_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *filp,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct drm_gem_object *obj;
|
||||
struct mga_framebuffer *mga_fb;
|
||||
|
|
|
@ -240,9 +240,9 @@ uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb, int id, int plane);
|
|||
struct drm_gem_object *msm_framebuffer_bo(struct drm_framebuffer *fb, int plane);
|
||||
const struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb);
|
||||
struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
|
||||
struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
|
||||
struct drm_fb_helper *msm_fbdev_init(struct drm_device *dev);
|
||||
|
||||
|
|
|
@ -138,7 +138,7 @@ const struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb)
|
|||
}
|
||||
|
||||
struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct drm_gem_object *bos[4] = {0};
|
||||
struct drm_framebuffer *fb;
|
||||
|
@ -168,7 +168,7 @@ struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
|
|||
}
|
||||
|
||||
struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
|
||||
{
|
||||
struct msm_drm_private *priv = dev->dev_private;
|
||||
struct msm_kms *kms = priv->kms;
|
||||
|
|
|
@ -246,7 +246,7 @@ static const struct drm_framebuffer_funcs nouveau_framebuffer_funcs = {
|
|||
int
|
||||
nouveau_framebuffer_init(struct drm_device *dev,
|
||||
struct nouveau_framebuffer *nv_fb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct nouveau_bo *nvbo)
|
||||
{
|
||||
struct nouveau_display *disp = nouveau_display(dev);
|
||||
|
@ -272,7 +272,7 @@ nouveau_framebuffer_init(struct drm_device *dev,
|
|||
static struct drm_framebuffer *
|
||||
nouveau_user_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *file_priv,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct nouveau_framebuffer *nouveau_fb;
|
||||
struct drm_gem_object *gem;
|
||||
|
|
|
@ -23,7 +23,7 @@ nouveau_framebuffer(struct drm_framebuffer *fb)
|
|||
}
|
||||
|
||||
int nouveau_framebuffer_init(struct drm_device *, struct nouveau_framebuffer *,
|
||||
struct drm_mode_fb_cmd2 *, struct nouveau_bo *);
|
||||
const struct drm_mode_fb_cmd2 *, struct nouveau_bo *);
|
||||
|
||||
struct nouveau_page_flip_state {
|
||||
struct list_head head;
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
struct nouveau_fbdev {
|
||||
struct drm_fb_helper helper;
|
||||
struct nouveau_framebuffer nouveau_fb;
|
||||
struct list_head fbdev_list;
|
||||
struct drm_device *dev;
|
||||
unsigned int saved_flags;
|
||||
struct nvif_object surf2d;
|
||||
|
|
|
@ -172,9 +172,9 @@ void copy_timings_drm_to_omap(struct omap_video_timings *timings,
|
|||
uint32_t omap_framebuffer_get_formats(uint32_t *pixel_formats,
|
||||
uint32_t max_formats, enum omap_color_mode supported_modes);
|
||||
struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
|
||||
struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p);
|
||||
int omap_framebuffer_pin(struct drm_framebuffer *fb);
|
||||
void omap_framebuffer_unpin(struct drm_framebuffer *fb);
|
||||
|
@ -248,7 +248,7 @@ struct omap_dss_device *omap_encoder_get_dssdev(struct drm_encoder *encoder);
|
|||
|
||||
static inline int objects_lookup(struct drm_device *dev,
|
||||
struct drm_file *filp, uint32_t pixel_format,
|
||||
struct drm_gem_object **bos, uint32_t *handles)
|
||||
struct drm_gem_object **bos, const uint32_t *handles)
|
||||
{
|
||||
int i, n = drm_format_num_planes(pixel_format);
|
||||
|
||||
|
|
|
@ -364,7 +364,7 @@ void omap_framebuffer_describe(struct drm_framebuffer *fb, struct seq_file *m)
|
|||
#endif
|
||||
|
||||
struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct drm_gem_object *bos[4];
|
||||
struct drm_framebuffer *fb;
|
||||
|
@ -386,7 +386,7 @@ struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
|
|||
}
|
||||
|
||||
struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
|
||||
{
|
||||
struct omap_framebuffer *omap_fb = NULL;
|
||||
struct drm_framebuffer *fb = NULL;
|
||||
|
|
|
@ -521,7 +521,7 @@ static const struct drm_framebuffer_funcs qxl_fb_funcs = {
|
|||
int
|
||||
qxl_framebuffer_init(struct drm_device *dev,
|
||||
struct qxl_framebuffer *qfb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj)
|
||||
{
|
||||
int ret;
|
||||
|
@ -1003,7 +1003,7 @@ static int qdev_output_init(struct drm_device *dev, int num_output)
|
|||
static struct drm_framebuffer *
|
||||
qxl_user_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *file_priv,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct drm_gem_object *obj;
|
||||
struct qxl_framebuffer *qxl_fb;
|
||||
|
|
|
@ -390,7 +390,7 @@ void qxl_fbdev_set_suspend(struct qxl_device *qdev, int state);
|
|||
int
|
||||
qxl_framebuffer_init(struct drm_device *dev,
|
||||
struct qxl_framebuffer *rfb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj);
|
||||
void qxl_display_read_client_monitors_config(struct qxl_device *qdev);
|
||||
void qxl_send_monitors_config(struct qxl_device *qdev);
|
||||
|
|
|
@ -40,7 +40,6 @@
|
|||
struct qxl_fbdev {
|
||||
struct drm_fb_helper helper;
|
||||
struct qxl_framebuffer qfb;
|
||||
struct list_head fbdev_list;
|
||||
struct qxl_device *qdev;
|
||||
|
||||
spinlock_t delayed_ops_lock;
|
||||
|
@ -283,7 +282,7 @@ int qxl_get_handle_for_primary_fb(struct qxl_device *qdev,
|
|||
}
|
||||
|
||||
static int qxlfb_create_pinned_object(struct qxl_fbdev *qfbdev,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object **gobj_p)
|
||||
{
|
||||
struct qxl_device *qdev = qfbdev->qdev;
|
||||
|
|
|
@ -1292,7 +1292,7 @@ static const struct drm_framebuffer_funcs radeon_fb_funcs = {
|
|||
int
|
||||
radeon_framebuffer_init(struct drm_device *dev,
|
||||
struct radeon_framebuffer *rfb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj)
|
||||
{
|
||||
int ret;
|
||||
|
@ -1309,7 +1309,7 @@ radeon_framebuffer_init(struct drm_device *dev,
|
|||
static struct drm_framebuffer *
|
||||
radeon_user_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *file_priv,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct drm_gem_object *obj;
|
||||
struct radeon_framebuffer *radeon_fb;
|
||||
|
|
|
@ -44,7 +44,6 @@
|
|||
struct radeon_fbdev {
|
||||
struct drm_fb_helper helper;
|
||||
struct radeon_framebuffer rfb;
|
||||
struct list_head fbdev_list;
|
||||
struct radeon_device *rdev;
|
||||
};
|
||||
|
||||
|
|
|
@ -929,7 +929,7 @@ extern void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green
|
|||
u16 *blue, int regno);
|
||||
int radeon_framebuffer_init(struct drm_device *dev,
|
||||
struct radeon_framebuffer *rfb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj);
|
||||
|
||||
int radeonfb_remove(struct drm_device *dev, struct drm_framebuffer *fb);
|
||||
|
|
|
@ -136,7 +136,7 @@ int rcar_du_dumb_create(struct drm_file *file, struct drm_device *dev,
|
|||
|
||||
static struct drm_framebuffer *
|
||||
rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct rcar_du_device *rcdu = dev->dev_private;
|
||||
const struct rcar_du_format_info *format;
|
||||
|
|
|
@ -72,7 +72,7 @@ static struct drm_framebuffer_funcs rockchip_drm_fb_funcs = {
|
|||
};
|
||||
|
||||
static struct rockchip_drm_fb *
|
||||
rockchip_fb_alloc(struct drm_device *dev, struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
rockchip_fb_alloc(struct drm_device *dev, const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object **obj, unsigned int num_planes)
|
||||
{
|
||||
struct rockchip_drm_fb *rockchip_fb;
|
||||
|
@ -102,7 +102,7 @@ rockchip_fb_alloc(struct drm_device *dev, struct drm_mode_fb_cmd2 *mode_cmd,
|
|||
|
||||
static struct drm_framebuffer *
|
||||
rockchip_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct rockchip_drm_fb *rockchip_fb;
|
||||
struct drm_gem_object *objs[ROCKCHIP_MAX_FB_BUFFER];
|
||||
|
@ -173,7 +173,7 @@ static const struct drm_mode_config_funcs rockchip_drm_mode_config_funcs = {
|
|||
|
||||
struct drm_framebuffer *
|
||||
rockchip_drm_framebuffer_init(struct drm_device *dev,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj)
|
||||
{
|
||||
struct rockchip_drm_fb *rockchip_fb;
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
struct drm_framebuffer *
|
||||
rockchip_drm_framebuffer_init(struct drm_device *dev,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj);
|
||||
void rockchip_drm_framebuffer_fini(struct drm_framebuffer *fb);
|
||||
|
||||
|
|
|
@ -104,7 +104,7 @@ const struct shmob_drm_format_info *shmob_drm_format_info(u32 fourcc)
|
|||
|
||||
static struct drm_framebuffer *
|
||||
shmob_drm_fb_create(struct drm_device *dev, struct drm_file *file_priv,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
const struct shmob_drm_format_info *format;
|
||||
|
||||
|
|
|
@ -16,18 +16,6 @@ config DRM_TEGRA
|
|||
|
||||
if DRM_TEGRA
|
||||
|
||||
config DRM_TEGRA_FBDEV
|
||||
bool "Enable legacy fbdev support"
|
||||
select DRM_KMS_FB_HELPER
|
||||
select FB_SYS_FILLRECT
|
||||
select FB_SYS_COPYAREA
|
||||
select FB_SYS_IMAGEBLIT
|
||||
default y
|
||||
help
|
||||
Choose this option if you have a need for the legacy fbdev support.
|
||||
Note that this support also provides the Linux console on top of
|
||||
the Tegra modesetting driver.
|
||||
|
||||
config DRM_TEGRA_DEBUG
|
||||
bool "NVIDIA Tegra DRM debug support"
|
||||
help
|
||||
|
|
|
@ -106,7 +106,7 @@ static int tegra_atomic_commit(struct drm_device *drm,
|
|||
|
||||
static const struct drm_mode_config_funcs tegra_drm_mode_funcs = {
|
||||
.fb_create = tegra_fb_create,
|
||||
#ifdef CONFIG_DRM_TEGRA_FBDEV
|
||||
#ifdef CONFIG_DRM_FBDEV_EMULATION
|
||||
.output_poll_changed = tegra_fb_output_poll_changed,
|
||||
#endif
|
||||
.atomic_check = drm_atomic_helper_check,
|
||||
|
@ -260,7 +260,7 @@ static void tegra_drm_context_free(struct tegra_drm_context *context)
|
|||
|
||||
static void tegra_drm_lastclose(struct drm_device *drm)
|
||||
{
|
||||
#ifdef CONFIG_DRM_TEGRA_FBDEV
|
||||
#ifdef CONFIG_DRM_FBDEV_EMULATION
|
||||
struct tegra_drm *tegra = drm->dev_private;
|
||||
|
||||
tegra_fbdev_restore_mode(tegra->fbdev);
|
||||
|
|
|
@ -30,7 +30,7 @@ struct tegra_fb {
|
|||
unsigned int num_planes;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_DRM_TEGRA_FBDEV
|
||||
#ifdef CONFIG_DRM_FBDEV_EMULATION
|
||||
struct tegra_fbdev {
|
||||
struct drm_fb_helper base;
|
||||
struct tegra_fb *fb;
|
||||
|
@ -46,7 +46,7 @@ struct tegra_drm {
|
|||
struct mutex clients_lock;
|
||||
struct list_head clients;
|
||||
|
||||
#ifdef CONFIG_DRM_TEGRA_FBDEV
|
||||
#ifdef CONFIG_DRM_FBDEV_EMULATION
|
||||
struct tegra_fbdev *fbdev;
|
||||
#endif
|
||||
|
||||
|
@ -268,12 +268,12 @@ int tegra_fb_get_tiling(struct drm_framebuffer *framebuffer,
|
|||
struct tegra_bo_tiling *tiling);
|
||||
struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
|
||||
struct drm_file *file,
|
||||
struct drm_mode_fb_cmd2 *cmd);
|
||||
const struct drm_mode_fb_cmd2 *cmd);
|
||||
int tegra_drm_fb_prepare(struct drm_device *drm);
|
||||
void tegra_drm_fb_free(struct drm_device *drm);
|
||||
int tegra_drm_fb_init(struct drm_device *drm);
|
||||
void tegra_drm_fb_exit(struct drm_device *drm);
|
||||
#ifdef CONFIG_DRM_TEGRA_FBDEV
|
||||
#ifdef CONFIG_DRM_FBDEV_EMULATION
|
||||
void tegra_fbdev_restore_mode(struct tegra_fbdev *fbdev);
|
||||
void tegra_fb_output_poll_changed(struct drm_device *drm);
|
||||
#endif
|
||||
|
|
|
@ -18,7 +18,7 @@ static inline struct tegra_fb *to_tegra_fb(struct drm_framebuffer *fb)
|
|||
return container_of(fb, struct tegra_fb, base);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DRM_TEGRA_FBDEV
|
||||
#ifdef CONFIG_DRM_FBDEV_EMULATION
|
||||
static inline struct tegra_fbdev *to_tegra_fbdev(struct drm_fb_helper *helper)
|
||||
{
|
||||
return container_of(helper, struct tegra_fbdev, base);
|
||||
|
@ -92,7 +92,7 @@ static struct drm_framebuffer_funcs tegra_fb_funcs = {
|
|||
};
|
||||
|
||||
static struct tegra_fb *tegra_fb_alloc(struct drm_device *drm,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct tegra_bo **planes,
|
||||
unsigned int num_planes)
|
||||
{
|
||||
|
@ -131,7 +131,7 @@ static struct tegra_fb *tegra_fb_alloc(struct drm_device *drm,
|
|||
|
||||
struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
|
||||
struct drm_file *file,
|
||||
struct drm_mode_fb_cmd2 *cmd)
|
||||
const struct drm_mode_fb_cmd2 *cmd)
|
||||
{
|
||||
unsigned int hsub, vsub, i;
|
||||
struct tegra_bo *planes[4];
|
||||
|
@ -181,7 +181,7 @@ struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
|
|||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DRM_TEGRA_FBDEV
|
||||
#ifdef CONFIG_DRM_FBDEV_EMULATION
|
||||
static struct fb_ops tegra_fb_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.fb_fillrect = drm_fb_helper_sys_fillrect,
|
||||
|
@ -370,7 +370,7 @@ void tegra_fb_output_poll_changed(struct drm_device *drm)
|
|||
|
||||
int tegra_drm_fb_prepare(struct drm_device *drm)
|
||||
{
|
||||
#ifdef CONFIG_DRM_TEGRA_FBDEV
|
||||
#ifdef CONFIG_DRM_FBDEV_EMULATION
|
||||
struct tegra_drm *tegra = drm->dev_private;
|
||||
|
||||
tegra->fbdev = tegra_fbdev_create(drm);
|
||||
|
@ -383,7 +383,7 @@ int tegra_drm_fb_prepare(struct drm_device *drm)
|
|||
|
||||
void tegra_drm_fb_free(struct drm_device *drm)
|
||||
{
|
||||
#ifdef CONFIG_DRM_TEGRA_FBDEV
|
||||
#ifdef CONFIG_DRM_FBDEV_EMULATION
|
||||
struct tegra_drm *tegra = drm->dev_private;
|
||||
|
||||
tegra_fbdev_free(tegra->fbdev);
|
||||
|
@ -392,7 +392,7 @@ void tegra_drm_fb_free(struct drm_device *drm)
|
|||
|
||||
int tegra_drm_fb_init(struct drm_device *drm)
|
||||
{
|
||||
#ifdef CONFIG_DRM_TEGRA_FBDEV
|
||||
#ifdef CONFIG_DRM_FBDEV_EMULATION
|
||||
struct tegra_drm *tegra = drm->dev_private;
|
||||
int err;
|
||||
|
||||
|
@ -407,7 +407,7 @@ int tegra_drm_fb_init(struct drm_device *drm)
|
|||
|
||||
void tegra_drm_fb_exit(struct drm_device *drm)
|
||||
{
|
||||
#ifdef CONFIG_DRM_TEGRA_FBDEV
|
||||
#ifdef CONFIG_DRM_FBDEV_EMULATION
|
||||
struct tegra_drm *tegra = drm->dev_private;
|
||||
|
||||
tegra_fbdev_exit(tegra->fbdev);
|
||||
|
|
|
@ -46,7 +46,7 @@ void tilcdc_module_cleanup(struct tilcdc_module *mod)
|
|||
static struct of_device_id tilcdc_of_match[];
|
||||
|
||||
static struct drm_framebuffer *tilcdc_fb_create(struct drm_device *dev,
|
||||
struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
return drm_fb_cma_create(dev, file_priv, mode_cmd);
|
||||
}
|
||||
|
|
|
@ -108,7 +108,7 @@ void udl_fbdev_unplug(struct drm_device *dev);
|
|||
struct drm_framebuffer *
|
||||
udl_fb_user_fb_create(struct drm_device *dev,
|
||||
struct drm_file *file,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
|
||||
int udl_render_hline(struct drm_device *dev, int bpp, struct urb **urb_ptr,
|
||||
const char *front, char **urb_buf_ptr,
|
||||
|
|
|
@ -33,7 +33,6 @@ module_param(fb_defio, int, S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP);
|
|||
struct udl_fbdev {
|
||||
struct drm_fb_helper helper;
|
||||
struct udl_framebuffer ufb;
|
||||
struct list_head fbdev_list;
|
||||
int fb_count;
|
||||
};
|
||||
|
||||
|
@ -456,7 +455,7 @@ static const struct drm_framebuffer_funcs udlfb_funcs = {
|
|||
static int
|
||||
udl_framebuffer_init(struct drm_device *dev,
|
||||
struct udl_framebuffer *ufb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct udl_gem_object *obj)
|
||||
{
|
||||
int ret;
|
||||
|
@ -624,7 +623,7 @@ void udl_fbdev_unplug(struct drm_device *dev)
|
|||
struct drm_framebuffer *
|
||||
udl_fb_user_fb_create(struct drm_device *dev,
|
||||
struct drm_file *file,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct drm_gem_object *obj;
|
||||
struct udl_framebuffer *ufb;
|
||||
|
|
|
@ -215,7 +215,7 @@ static const struct drm_framebuffer_funcs virtio_gpu_fb_funcs = {
|
|||
int
|
||||
virtio_gpu_framebuffer_init(struct drm_device *dev,
|
||||
struct virtio_gpu_framebuffer *vgfb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj)
|
||||
{
|
||||
int ret;
|
||||
|
@ -465,7 +465,7 @@ static int vgdev_output_init(struct virtio_gpu_device *vgdev, int index)
|
|||
static struct drm_framebuffer *
|
||||
virtio_gpu_user_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *file_priv,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct drm_gem_object *obj = NULL;
|
||||
struct virtio_gpu_framebuffer *virtio_gpu_fb;
|
||||
|
|
|
@ -328,7 +328,7 @@ void virtio_gpu_dequeue_fence_func(struct work_struct *work);
|
|||
/* virtio_gpu_display.c */
|
||||
int virtio_gpu_framebuffer_init(struct drm_device *dev,
|
||||
struct virtio_gpu_framebuffer *vgfb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj);
|
||||
int virtio_gpu_modeset_init(struct virtio_gpu_device *vgdev);
|
||||
void virtio_gpu_modeset_fini(struct virtio_gpu_device *vgdev);
|
||||
|
|
|
@ -32,7 +32,6 @@
|
|||
struct virtio_gpu_fbdev {
|
||||
struct drm_fb_helper helper;
|
||||
struct virtio_gpu_framebuffer vgfb;
|
||||
struct list_head fbdev_list;
|
||||
struct virtio_gpu_device *vgdev;
|
||||
struct delayed_work work;
|
||||
};
|
||||
|
|
|
@ -930,7 +930,7 @@ vmw_kms_new_framebuffer(struct vmw_private *dev_priv,
|
|||
|
||||
static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
|
||||
struct drm_file *file_priv,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd2)
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd2)
|
||||
{
|
||||
struct vmw_private *dev_priv = vmw_priv(dev);
|
||||
struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile;
|
||||
|
|
|
@ -1111,4 +1111,7 @@ static __inline__ bool drm_can_sleep(void)
|
|||
return true;
|
||||
}
|
||||
|
||||
/* helper for handling conditionals in various for_each macros */
|
||||
#define for_each_if(condition) if (!(condition)) {} else
|
||||
|
||||
#endif
|
||||
|
|
|
@ -149,7 +149,7 @@ int __must_check drm_atomic_async_commit(struct drm_atomic_state *state);
|
|||
((connector) = (state)->connectors[__i], \
|
||||
(connector_state) = (state)->connector_states[__i], 1); \
|
||||
(__i)++) \
|
||||
if (connector)
|
||||
for_each_if (connector)
|
||||
|
||||
#define for_each_crtc_in_state(state, crtc, crtc_state, __i) \
|
||||
for ((__i) = 0; \
|
||||
|
@ -157,7 +157,7 @@ int __must_check drm_atomic_async_commit(struct drm_atomic_state *state);
|
|||
((crtc) = (state)->crtcs[__i], \
|
||||
(crtc_state) = (state)->crtc_states[__i], 1); \
|
||||
(__i)++) \
|
||||
if (crtc_state)
|
||||
for_each_if (crtc_state)
|
||||
|
||||
#define for_each_plane_in_state(state, plane, plane_state, __i) \
|
||||
for ((__i) = 0; \
|
||||
|
@ -165,7 +165,7 @@ int __must_check drm_atomic_async_commit(struct drm_atomic_state *state);
|
|||
((plane) = (state)->planes[__i], \
|
||||
(plane_state) = (state)->plane_states[__i], 1); \
|
||||
(__i)++) \
|
||||
if (plane_state)
|
||||
for_each_if (plane_state)
|
||||
static inline bool
|
||||
drm_atomic_crtc_needs_modeset(struct drm_crtc_state *state)
|
||||
{
|
||||
|
|
|
@ -85,7 +85,11 @@ static inline uint64_t I642U64(int64_t val)
|
|||
return (uint64_t)*((uint64_t *)&val);
|
||||
}
|
||||
|
||||
/* rotation property bits */
|
||||
/*
|
||||
* Rotation property bits. DRM_ROTATE_<degrees> rotates the image by the
|
||||
* specified amount in degrees in counter clockwise direction. DRM_REFLECT_X and
|
||||
* DRM_REFLECT_Y reflects the image along the specified axis prior to rotation
|
||||
*/
|
||||
#define DRM_ROTATE_MASK 0x0f
|
||||
#define DRM_ROTATE_0 0
|
||||
#define DRM_ROTATE_90 1
|
||||
|
@ -992,7 +996,7 @@ struct drm_mode_set {
|
|||
struct drm_mode_config_funcs {
|
||||
struct drm_framebuffer *(*fb_create)(struct drm_device *dev,
|
||||
struct drm_file *file_priv,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
void (*output_poll_changed)(struct drm_device *dev);
|
||||
|
||||
int (*atomic_check)(struct drm_device *dev,
|
||||
|
@ -1166,7 +1170,7 @@ struct drm_mode_config {
|
|||
*/
|
||||
#define drm_for_each_plane_mask(plane, dev, plane_mask) \
|
||||
list_for_each_entry((plane), &(dev)->mode_config.plane_list, head) \
|
||||
if ((plane_mask) & (1 << drm_plane_index(plane)))
|
||||
for_each_if ((plane_mask) & (1 << drm_plane_index(plane)))
|
||||
|
||||
|
||||
#define obj_to_crtc(x) container_of(x, struct drm_crtc, base)
|
||||
|
@ -1543,7 +1547,7 @@ static inline struct drm_property *drm_property_find(struct drm_device *dev,
|
|||
/* Plane list iterator for legacy (overlay only) planes. */
|
||||
#define drm_for_each_legacy_plane(plane, dev) \
|
||||
list_for_each_entry(plane, &(dev)->mode_config.plane_list, head) \
|
||||
if (plane->type == DRM_PLANE_TYPE_OVERLAY)
|
||||
for_each_if (plane->type == DRM_PLANE_TYPE_OVERLAY)
|
||||
|
||||
#define drm_for_each_plane(plane, dev) \
|
||||
list_for_each_entry(plane, &(dev)->mode_config.plane_list, head)
|
||||
|
|
|
@ -197,7 +197,7 @@ extern int drm_helper_connector_dpms(struct drm_connector *connector, int mode);
|
|||
extern void drm_helper_move_panel_connectors_to_head(struct drm_device *);
|
||||
|
||||
extern void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
|
||||
static inline void drm_crtc_helper_add(struct drm_crtc *crtc,
|
||||
const struct drm_crtc_helper_funcs *funcs)
|
||||
|
|
|
@ -455,16 +455,52 @@
|
|||
# define DP_EDP_14 0x03
|
||||
|
||||
#define DP_EDP_GENERAL_CAP_1 0x701
|
||||
# define DP_EDP_TCON_BACKLIGHT_ADJUSTMENT_CAP (1 << 0)
|
||||
# define DP_EDP_BACKLIGHT_PIN_ENABLE_CAP (1 << 1)
|
||||
# define DP_EDP_BACKLIGHT_AUX_ENABLE_CAP (1 << 2)
|
||||
# define DP_EDP_PANEL_SELF_TEST_PIN_ENABLE_CAP (1 << 3)
|
||||
# define DP_EDP_PANEL_SELF_TEST_AUX_ENABLE_CAP (1 << 4)
|
||||
# define DP_EDP_FRC_ENABLE_CAP (1 << 5)
|
||||
# define DP_EDP_COLOR_ENGINE_CAP (1 << 6)
|
||||
# define DP_EDP_SET_POWER_CAP (1 << 7)
|
||||
|
||||
#define DP_EDP_BACKLIGHT_ADJUSTMENT_CAP 0x702
|
||||
# define DP_EDP_BACKLIGHT_BRIGHTNESS_PWM_PIN_CAP (1 << 0)
|
||||
# define DP_EDP_BACKLIGHT_BRIGHTNESS_AUX_SET_CAP (1 << 1)
|
||||
# define DP_EDP_BACKLIGHT_BRIGHTNESS_BYTE_COUNT (1 << 2)
|
||||
# define DP_EDP_BACKLIGHT_AUX_PWM_PRODUCT_CAP (1 << 3)
|
||||
# define DP_EDP_BACKLIGHT_FREQ_PWM_PIN_PASSTHRU_CAP (1 << 4)
|
||||
# define DP_EDP_BACKLIGHT_FREQ_AUX_SET_CAP (1 << 5)
|
||||
# define DP_EDP_DYNAMIC_BACKLIGHT_CAP (1 << 6)
|
||||
# define DP_EDP_VBLANK_BACKLIGHT_UPDATE_CAP (1 << 7)
|
||||
|
||||
#define DP_EDP_GENERAL_CAP_2 0x703
|
||||
# define DP_EDP_OVERDRIVE_ENGINE_ENABLED (1 << 0)
|
||||
|
||||
#define DP_EDP_GENERAL_CAP_3 0x704 /* eDP 1.4 */
|
||||
# define DP_EDP_X_REGION_CAP_MASK (0xf << 0)
|
||||
# define DP_EDP_X_REGION_CAP_SHIFT 0
|
||||
# define DP_EDP_Y_REGION_CAP_MASK (0xf << 4)
|
||||
# define DP_EDP_Y_REGION_CAP_SHIFT 4
|
||||
|
||||
#define DP_EDP_DISPLAY_CONTROL_REGISTER 0x720
|
||||
# define DP_EDP_BACKLIGHT_ENABLE (1 << 0)
|
||||
# define DP_EDP_BLACK_VIDEO_ENABLE (1 << 1)
|
||||
# define DP_EDP_FRC_ENABLE (1 << 2)
|
||||
# define DP_EDP_COLOR_ENGINE_ENABLE (1 << 3)
|
||||
# define DP_EDP_VBLANK_BACKLIGHT_UPDATE_ENABLE (1 << 7)
|
||||
|
||||
#define DP_EDP_BACKLIGHT_MODE_SET_REGISTER 0x721
|
||||
# define DP_EDP_BACKLIGHT_CONTROL_MODE_MASK (3 << 0)
|
||||
# define DP_EDP_BACKLIGHT_CONTROL_MODE_PWM (0 << 0)
|
||||
# define DP_EDP_BACKLIGHT_CONTROL_MODE_PRESET (1 << 0)
|
||||
# define DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD (2 << 0)
|
||||
# define DP_EDP_BACKLIGHT_CONTROL_MODE_PRODUCT (3 << 0)
|
||||
# define DP_EDP_BACKLIGHT_FREQ_PWM_PIN_PASSTHRU_ENABLE (1 << 2)
|
||||
# define DP_EDP_BACKLIGHT_FREQ_AUX_SET_ENABLE (1 << 3)
|
||||
# define DP_EDP_DYNAMIC_BACKLIGHT_ENABLE (1 << 4)
|
||||
# define DP_EDP_REGIONAL_BACKLIGHT_ENABLE (1 << 5)
|
||||
# define DP_EDP_UPDATE_REGION_BRIGHTNESS (1 << 6) /* eDP 1.4 */
|
||||
|
||||
#define DP_EDP_BACKLIGHT_BRIGHTNESS_MSB 0x722
|
||||
#define DP_EDP_BACKLIGHT_BRIGHTNESS_LSB 0x723
|
||||
|
|
|
@ -18,7 +18,7 @@ void drm_fbdev_cma_restore_mode(struct drm_fbdev_cma *fbdev_cma);
|
|||
void drm_fbdev_cma_hotplug_event(struct drm_fbdev_cma *fbdev_cma);
|
||||
|
||||
struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
|
||||
struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
|
||||
struct drm_gem_cma_object *drm_fb_cma_get_gem_obj(struct drm_framebuffer *fb,
|
||||
unsigned int plane);
|
||||
|
|
|
@ -35,76 +35,129 @@
|
|||
*/
|
||||
|
||||
/**
|
||||
* This structure defines the drm_mm memory object, which will be used by the
|
||||
* DRM for its buffer objects.
|
||||
* struct drm_gem_object - GEM buffer object
|
||||
*
|
||||
* This structure defines the generic parts for GEM buffer objects, which are
|
||||
* mostly around handling mmap and userspace handles.
|
||||
*
|
||||
* Buffer objects are often abbreviated to BO.
|
||||
*/
|
||||
struct drm_gem_object {
|
||||
/** Reference count of this object */
|
||||
/**
|
||||
* @refcount:
|
||||
*
|
||||
* Reference count of this object
|
||||
*
|
||||
* Please use drm_gem_object_reference() to acquire and
|
||||
* drm_gem_object_unreference() or drm_gem_object_unreference_unlocked()
|
||||
* to release a reference to a GEM buffer object.
|
||||
*/
|
||||
struct kref refcount;
|
||||
|
||||
/**
|
||||
* handle_count - gem file_priv handle count of this object
|
||||
* @handle_count:
|
||||
*
|
||||
* This is the GEM file_priv handle count of this object.
|
||||
*
|
||||
* Each handle also holds a reference. Note that when the handle_count
|
||||
* drops to 0 any global names (e.g. the id in the flink namespace) will
|
||||
* be cleared.
|
||||
*
|
||||
* Protected by dev->object_name_lock.
|
||||
* */
|
||||
*/
|
||||
unsigned handle_count;
|
||||
|
||||
/** Related drm device */
|
||||
/**
|
||||
* @dev: DRM dev this object belongs to.
|
||||
*/
|
||||
struct drm_device *dev;
|
||||
|
||||
/** File representing the shmem storage */
|
||||
/**
|
||||
* @filp:
|
||||
*
|
||||
* SHMEM file node used as backing storage for swappable buffer objects.
|
||||
* GEM also supports driver private objects with driver-specific backing
|
||||
* storage (contiguous CMA memory, special reserved blocks). In this
|
||||
* case @filp is NULL.
|
||||
*/
|
||||
struct file *filp;
|
||||
|
||||
/* Mapping info for this object */
|
||||
/**
|
||||
* @vma_node:
|
||||
*
|
||||
* Mapping info for this object to support mmap. Drivers are supposed to
|
||||
* allocate the mmap offset using drm_gem_create_mmap_offset(). The
|
||||
* offset itself can be retrieved using drm_vma_node_offset_addr().
|
||||
*
|
||||
* Memory mapping itself is handled by drm_gem_mmap(), which also checks
|
||||
* that userspace is allowed to access the object.
|
||||
*/
|
||||
struct drm_vma_offset_node vma_node;
|
||||
|
||||
/**
|
||||
* @size:
|
||||
*
|
||||
* Size of the object, in bytes. Immutable over the object's
|
||||
* lifetime.
|
||||
*/
|
||||
size_t size;
|
||||
|
||||
/**
|
||||
* @name:
|
||||
*
|
||||
* Global name for this object, starts at 1. 0 means unnamed.
|
||||
* Access is covered by the object_name_lock in the related drm_device
|
||||
* Access is covered by dev->object_name_lock. This is used by the GEM_FLINK
|
||||
* and GEM_OPEN ioctls.
|
||||
*/
|
||||
int name;
|
||||
|
||||
/**
|
||||
* Memory domains. These monitor which caches contain read/write data
|
||||
* @read_domains:
|
||||
*
|
||||
* Read memory domains. These monitor which caches contain read/write data
|
||||
* related to the object. When transitioning from one set of domains
|
||||
* to another, the driver is called to ensure that caches are suitably
|
||||
* flushed and invalidated
|
||||
* flushed and invalidated.
|
||||
*/
|
||||
uint32_t read_domains;
|
||||
|
||||
/**
|
||||
* @write_domain: Corresponding unique write memory domain.
|
||||
*/
|
||||
uint32_t write_domain;
|
||||
|
||||
/**
|
||||
* @pending_read_domains:
|
||||
*
|
||||
* While validating an exec operation, the
|
||||
* new read/write domain values are computed here.
|
||||
* They will be transferred to the above values
|
||||
* at the point that any cache flushing occurs
|
||||
*/
|
||||
uint32_t pending_read_domains;
|
||||
|
||||
/**
|
||||
* @pending_write_domain: Write domain similar to @pending_read_domains.
|
||||
*/
|
||||
uint32_t pending_write_domain;
|
||||
|
||||
/**
|
||||
* dma_buf - dma buf associated with this GEM object
|
||||
* @dma_buf:
|
||||
*
|
||||
* dma-buf associated with this GEM object.
|
||||
*
|
||||
* Pointer to the dma-buf associated with this gem object (either
|
||||
* through importing or exporting). We break the resulting reference
|
||||
* loop when the last gem handle for this object is released.
|
||||
*
|
||||
* Protected by obj->object_name_lock
|
||||
* Protected by obj->object_name_lock.
|
||||
*/
|
||||
struct dma_buf *dma_buf;
|
||||
|
||||
/**
|
||||
* import_attach - dma buf attachment backing this object
|
||||
* @import_attach:
|
||||
*
|
||||
* dma-buf attachment backing this object.
|
||||
*
|
||||
* Any foreign dma_buf imported as a gem object has this set to the
|
||||
* attachment point for the device. This is invariant over the lifetime
|
||||
|
@ -133,12 +186,30 @@ int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size,
|
|||
struct vm_area_struct *vma);
|
||||
int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
|
||||
|
||||
/**
|
||||
* drm_gem_object_reference - acquire a GEM BO reference
|
||||
* @obj: GEM buffer object
|
||||
*
|
||||
* This acquires additional reference to @obj. It is illegal to call this
|
||||
* without already holding a reference. No locks required.
|
||||
*/
|
||||
static inline void
|
||||
drm_gem_object_reference(struct drm_gem_object *obj)
|
||||
{
|
||||
kref_get(&obj->refcount);
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_gem_object_unreference - release a GEM BO reference
|
||||
* @obj: GEM buffer object
|
||||
*
|
||||
* This releases a reference to @obj. Callers must hold the dev->struct_mutex
|
||||
* lock when calling this function, even when the driver doesn't use
|
||||
* dev->struct_mutex for anything.
|
||||
*
|
||||
* For drivers not encumbered with legacy locking use
|
||||
* drm_gem_object_unreference_unlocked() instead.
|
||||
*/
|
||||
static inline void
|
||||
drm_gem_object_unreference(struct drm_gem_object *obj)
|
||||
{
|
||||
|
@ -149,6 +220,13 @@ drm_gem_object_unreference(struct drm_gem_object *obj)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_gem_object_unreference_unlocked - release a GEM BO reference
|
||||
* @obj: GEM buffer object
|
||||
*
|
||||
* This releases a reference to @obj. Callers must not hold the
|
||||
* dev->struct_mutex lock when calling this function.
|
||||
*/
|
||||
static inline void
|
||||
drm_gem_object_unreference_unlocked(struct drm_gem_object *obj)
|
||||
{
|
||||
|
|
|
@ -148,8 +148,7 @@ static inline u64 drm_mm_hole_node_start(struct drm_mm_node *hole_node)
|
|||
|
||||
static inline u64 __drm_mm_hole_node_end(struct drm_mm_node *hole_node)
|
||||
{
|
||||
return list_entry(hole_node->node_list.next,
|
||||
struct drm_mm_node, node_list)->start;
|
||||
return list_next_entry(hole_node, node_list)->start;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -180,6 +179,14 @@ static inline u64 drm_mm_hole_node_end(struct drm_mm_node *hole_node)
|
|||
&(mm)->head_node.node_list, \
|
||||
node_list)
|
||||
|
||||
#define __drm_mm_for_each_hole(entry, mm, hole_start, hole_end, backwards) \
|
||||
for (entry = list_entry((backwards) ? (mm)->hole_stack.prev : (mm)->hole_stack.next, struct drm_mm_node, hole_stack); \
|
||||
&entry->hole_stack != &(mm)->hole_stack ? \
|
||||
hole_start = drm_mm_hole_node_start(entry), \
|
||||
hole_end = drm_mm_hole_node_end(entry), \
|
||||
1 : 0; \
|
||||
entry = list_entry((backwards) ? entry->hole_stack.prev : entry->hole_stack.next, struct drm_mm_node, hole_stack))
|
||||
|
||||
/**
|
||||
* drm_mm_for_each_hole - iterator to walk over all holes
|
||||
* @entry: drm_mm_node used internally to track progress
|
||||
|
@ -200,20 +207,7 @@ static inline u64 drm_mm_hole_node_end(struct drm_mm_node *hole_node)
|
|||
* going backwards.
|
||||
*/
|
||||
#define drm_mm_for_each_hole(entry, mm, hole_start, hole_end) \
|
||||
for (entry = list_entry((mm)->hole_stack.next, struct drm_mm_node, hole_stack); \
|
||||
&entry->hole_stack != &(mm)->hole_stack ? \
|
||||
hole_start = drm_mm_hole_node_start(entry), \
|
||||
hole_end = drm_mm_hole_node_end(entry), \
|
||||
1 : 0; \
|
||||
entry = list_entry(entry->hole_stack.next, struct drm_mm_node, hole_stack))
|
||||
|
||||
#define __drm_mm_for_each_hole(entry, mm, hole_start, hole_end, backwards) \
|
||||
for (entry = list_entry((backwards) ? (mm)->hole_stack.prev : (mm)->hole_stack.next, struct drm_mm_node, hole_stack); \
|
||||
&entry->hole_stack != &(mm)->hole_stack ? \
|
||||
hole_start = drm_mm_hole_node_start(entry), \
|
||||
hole_end = drm_mm_hole_node_end(entry), \
|
||||
1 : 0; \
|
||||
entry = list_entry((backwards) ? entry->hole_stack.prev : entry->hole_stack.next, struct drm_mm_node, hole_stack))
|
||||
__drm_mm_for_each_hole(entry, mm, hole_start, hole_end, 0)
|
||||
|
||||
/*
|
||||
* Basic range manager support (drm_mm.c)
|
||||
|
|
|
@ -162,7 +162,8 @@ int drm_rect_calc_hscale_relaxed(struct drm_rect *src,
|
|||
int drm_rect_calc_vscale_relaxed(struct drm_rect *src,
|
||||
struct drm_rect *dst,
|
||||
int min_vscale, int max_vscale);
|
||||
void drm_rect_debug_print(const struct drm_rect *r, bool fixed_point);
|
||||
void drm_rect_debug_print(const char *prefix,
|
||||
const struct drm_rect *r, bool fixed_point);
|
||||
void drm_rect_rotate(struct drm_rect *r,
|
||||
int width, int height,
|
||||
unsigned int rotation);
|
||||
|
|
Loading…
Reference in New Issue