mirror of
https://github.com/torvalds/linux.git
synced 2026-05-29 17:43:52 +02:00
drm-misc-next for 6.17:
UAPI Changes: Cross-subsystem Changes: Core Changes: - mode_config: Change fb_create prototype to pass the drm_format_info and avoid redundant lookups in drivers - sched: kunit improvements, memory leak fixes, reset handling improvements - tests: kunit EDID update Driver Changes: - amdgpu: Hibernation fixes, structure lifetime fixes - nouveau: sched improvements - sitronix: Add Sitronix ST7567 Support - bridge: - Make connector available to bridge detect hook - panel: - More refcounting changes - New panels: BOE NE14QDM -----BEGIN PGP SIGNATURE----- iJUEABMJAB0WIQTkHFbLp4ejekA/qfgnX84Zoj2+dgUCaHisvgAKCRAnX84Zoj2+ dihcAX49H551lQ42amN11jN4pR2tpKLjRMCSsNnXzkokJYx8adEaGTcZq+0Oi9rZ muGQKJABf2SSb/bem7qEu0JVL3/Pz8DOLbKIE4ltPMlHfYF5NzJhy3AKIMIjMLH7 XqSDXOMgjA== =CfQG -----END PGP SIGNATURE----- Merge tag 'drm-misc-next-2025-07-17' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-next drm-misc-next for 6.17: UAPI Changes: Cross-subsystem Changes: Core Changes: - mode_config: Change fb_create prototype to pass the drm_format_info and avoid redundant lookups in drivers - sched: kunit improvements, memory leak fixes, reset handling improvements - tests: kunit EDID update Driver Changes: - amdgpu: Hibernation fixes, structure lifetime fixes - nouveau: sched improvements - sitronix: Add Sitronix ST7567 Support - bridge: - Make connector available to bridge detect hook - panel: - More refcounting changes - New panels: BOE NE14QDM Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maxime Ripard <mripard@redhat.com> Link: https://lore.kernel.org/r/20250717-efficient-kudu-of-fantasy-ff95e0@houat
This commit is contained in:
commit
be3cd668ff
|
|
@ -19,6 +19,8 @@ properties:
|
|||
- const: samsung,atna33xc20
|
||||
- items:
|
||||
- enum:
|
||||
# Samsung 13" 3K (2880×1920 pixels) eDP AMOLED panel
|
||||
- samsung,atna30dw01
|
||||
# Samsung 14" WQXGA+ (2880×1800 pixels) eDP AMOLED panel
|
||||
- samsung,atna40yk20
|
||||
# Samsung 14.5" WQXGA+ (2880x1800 pixels) eDP AMOLED panel
|
||||
|
|
|
|||
|
|
@ -58,12 +58,6 @@ properties:
|
|||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
"#address-cells":
|
||||
const: 1
|
||||
|
||||
"#size-cells":
|
||||
const: 0
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- clocks
|
||||
|
|
|
|||
|
|
@ -0,0 +1,63 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/display/sitronix,st7567.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Sitronix ST7567 Display Controller
|
||||
|
||||
maintainers:
|
||||
- Javier Martinez Canillas <javierm@redhat.com>
|
||||
|
||||
description:
|
||||
Sitronix ST7567 is a driver and controller for monochrome
|
||||
dot matrix LCD panels.
|
||||
|
||||
allOf:
|
||||
- $ref: panel/panel-common.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: sitronix,st7567
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
width-mm: true
|
||||
height-mm: true
|
||||
panel-timing: true
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- width-mm
|
||||
- height-mm
|
||||
- panel-timing
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
display@3f {
|
||||
compatible = "sitronix,st7567";
|
||||
reg = <0x3f>;
|
||||
width-mm = <37>;
|
||||
height-mm = <27>;
|
||||
|
||||
panel-timing {
|
||||
hactive = <128>;
|
||||
vactive = <64>;
|
||||
hback-porch = <0>;
|
||||
vback-porch = <0>;
|
||||
clock-frequency = <0>;
|
||||
hfront-porch = <0>;
|
||||
hsync-len = <0>;
|
||||
vfront-porch = <0>;
|
||||
vsync-len = <0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
@ -447,7 +447,7 @@ hang is usually the most critical one which can result in consequential hangs or
|
|||
complete wedging.
|
||||
|
||||
Task information
|
||||
---------------
|
||||
----------------
|
||||
|
||||
The information about which application (if any) was involved in the device
|
||||
wedging is useful for userspace if they want to notify the user about what
|
||||
|
|
@ -460,8 +460,8 @@ event string.
|
|||
|
||||
The reliability of this information is driver and hardware specific, and should
|
||||
be taken with a caution regarding it's precision. To have a big picture of what
|
||||
really happened, the devcoredump file provides should have much more detailed
|
||||
information about the device state and about the event.
|
||||
really happened, the devcoredump file provides much more detailed information
|
||||
about the device state and about the event.
|
||||
|
||||
Consumer prerequisites
|
||||
----------------------
|
||||
|
|
|
|||
|
|
@ -7835,6 +7835,7 @@ F: drivers/gpu/drm/sitronix/st7586.c
|
|||
DRM DRIVER FOR SITRONIX ST7571 PANELS
|
||||
M: Marcus Folkesson <marcus.folkesson@gmail.com>
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/display/sitronix,st7567.yaml
|
||||
F: Documentation/devicetree/bindings/display/sitronix,st7571.yaml
|
||||
F: drivers/gpu/drm/sitronix/st7571-i2c.c
|
||||
|
||||
|
|
|
|||
|
|
@ -361,7 +361,7 @@ aie2_sched_job_timedout(struct drm_sched_job *sched_job)
|
|||
aie2_hwctx_restart(xdna, hwctx);
|
||||
mutex_unlock(&xdna->dev_lock);
|
||||
|
||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
||||
return DRM_GPU_SCHED_STAT_RESET;
|
||||
}
|
||||
|
||||
static const struct drm_sched_backend_ops sched_ops = {
|
||||
|
|
|
|||
|
|
@ -66,6 +66,20 @@ static pm_message_t pm_transition;
|
|||
static DEFINE_MUTEX(async_wip_mtx);
|
||||
static int async_error;
|
||||
|
||||
/**
|
||||
* pm_hibernate_is_recovering - if recovering from hibernate due to error.
|
||||
*
|
||||
* Used to query if dev_pm_ops.thaw() is called for normal hibernation case or
|
||||
* recovering from some error.
|
||||
*
|
||||
* Return: true for error case, false for normal case.
|
||||
*/
|
||||
bool pm_hibernate_is_recovering(void)
|
||||
{
|
||||
return pm_transition.event == PM_EVENT_RECOVER;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pm_hibernate_is_recovering);
|
||||
|
||||
static const char *pm_verb(int event)
|
||||
{
|
||||
switch (event) {
|
||||
|
|
|
|||
|
|
@ -5021,8 +5021,16 @@ static int amdgpu_device_evict_resources(struct amdgpu_device *adev)
|
|||
return 0;
|
||||
|
||||
ret = amdgpu_ttm_evict_resources(adev, TTM_PL_VRAM);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
dev_warn(adev->dev, "evicting device resources failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (adev->in_s4) {
|
||||
ret = ttm_device_prepare_hibernation(&adev->mman.bdev);
|
||||
if (ret)
|
||||
dev_err(adev->dev, "prepare hibernation failed, %d\n", ret);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1196,13 +1196,14 @@ static int amdgpu_display_get_fb_info(const struct amdgpu_framebuffer *amdgpu_fb
|
|||
static int amdgpu_display_gem_fb_verify_and_init(struct drm_device *dev,
|
||||
struct amdgpu_framebuffer *rfb,
|
||||
struct drm_file *file_priv,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj)
|
||||
{
|
||||
int ret;
|
||||
|
||||
rfb->base.obj[0] = obj;
|
||||
drm_helper_mode_fill_fb_struct(dev, &rfb->base, mode_cmd);
|
||||
drm_helper_mode_fill_fb_struct(dev, &rfb->base, info, mode_cmd);
|
||||
/* Verify that the modifier is supported. */
|
||||
if (!drm_any_plane_has_format(dev, mode_cmd->pixel_format,
|
||||
mode_cmd->modifier[0])) {
|
||||
|
|
@ -1297,6 +1298,7 @@ static int amdgpu_display_framebuffer_init(struct drm_device *dev,
|
|||
struct drm_framebuffer *
|
||||
amdgpu_display_user_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *file_priv,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct amdgpu_framebuffer *amdgpu_fb;
|
||||
|
|
@ -1330,7 +1332,7 @@ amdgpu_display_user_framebuffer_create(struct drm_device *dev,
|
|||
}
|
||||
|
||||
ret = amdgpu_display_gem_fb_verify_and_init(dev, amdgpu_fb, file_priv,
|
||||
mode_cmd, obj);
|
||||
info, mode_cmd, obj);
|
||||
if (ret) {
|
||||
kfree(amdgpu_fb);
|
||||
drm_gem_object_put(obj);
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ uint32_t amdgpu_display_supported_domains(struct amdgpu_device *adev,
|
|||
struct drm_framebuffer *
|
||||
amdgpu_display_user_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *file_priv,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
const struct drm_format_info *
|
||||
amdgpu_lookup_format_info(u32 format, uint64_t modifier);
|
||||
|
|
|
|||
|
|
@ -2541,6 +2541,10 @@ amdgpu_pci_shutdown(struct pci_dev *pdev)
|
|||
if (amdgpu_ras_intr_triggered())
|
||||
return;
|
||||
|
||||
/* device maybe not resumed here, return immediately in this case */
|
||||
if (adev->in_s4 && adev->in_suspend)
|
||||
return;
|
||||
|
||||
/* if we are running in a VM, make sure the device
|
||||
* torn down properly on reboot/shutdown.
|
||||
* unfortunately we can't detect certain
|
||||
|
|
@ -2557,6 +2561,10 @@ static int amdgpu_pmops_prepare(struct device *dev)
|
|||
struct drm_device *drm_dev = dev_get_drvdata(dev);
|
||||
struct amdgpu_device *adev = drm_to_adev(drm_dev);
|
||||
|
||||
/* device maybe not resumed here, return immediately in this case */
|
||||
if (adev->in_s4 && adev->in_suspend)
|
||||
return 0;
|
||||
|
||||
/* Return a positive number here so
|
||||
* DPM_FLAG_SMART_SUSPEND works properly
|
||||
*/
|
||||
|
|
@ -2655,12 +2663,21 @@ static int amdgpu_pmops_thaw(struct device *dev)
|
|||
{
|
||||
struct drm_device *drm_dev = dev_get_drvdata(dev);
|
||||
|
||||
/* do not resume device if it's normal hibernation */
|
||||
if (!pm_hibernate_is_recovering())
|
||||
return 0;
|
||||
|
||||
return amdgpu_device_resume(drm_dev, true);
|
||||
}
|
||||
|
||||
static int amdgpu_pmops_poweroff(struct device *dev)
|
||||
{
|
||||
struct drm_device *drm_dev = dev_get_drvdata(dev);
|
||||
struct amdgpu_device *adev = drm_to_adev(drm_dev);
|
||||
|
||||
/* device maybe not resumed here, return immediately in this case */
|
||||
if (adev->in_s4 && adev->in_suspend)
|
||||
return 0;
|
||||
|
||||
return amdgpu_device_suspend(drm_dev, true);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ static enum drm_gpu_sched_stat amdgpu_job_timedout(struct drm_sched_job *s_job)
|
|||
struct amdgpu_ring *ring = to_amdgpu_ring(s_job->sched);
|
||||
struct amdgpu_job *job = to_amdgpu_job(s_job);
|
||||
struct drm_wedge_task_info *info = NULL;
|
||||
struct amdgpu_task_info *ti;
|
||||
struct amdgpu_task_info *ti = NULL;
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
int idx, r;
|
||||
|
||||
|
|
@ -148,8 +148,6 @@ static enum drm_gpu_sched_stat amdgpu_job_timedout(struct drm_sched_job *s_job)
|
|||
|
||||
dma_fence_set_error(&s_job->s_fence->finished, -ETIME);
|
||||
|
||||
amdgpu_vm_put_task_info(ti);
|
||||
|
||||
if (amdgpu_device_should_recover_gpu(ring->adev)) {
|
||||
struct amdgpu_reset_context reset_context;
|
||||
memset(&reset_context, 0, sizeof(reset_context));
|
||||
|
|
@ -175,8 +173,9 @@ static enum drm_gpu_sched_stat amdgpu_job_timedout(struct drm_sched_job *s_job)
|
|||
}
|
||||
|
||||
exit:
|
||||
amdgpu_vm_put_task_info(ti);
|
||||
drm_dev_exit(idx);
|
||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
||||
return DRM_GPU_SCHED_STAT_RESET;
|
||||
}
|
||||
|
||||
int amdgpu_job_alloc(struct amdgpu_device *adev, struct amdgpu_vm *vm,
|
||||
|
|
|
|||
|
|
@ -521,8 +521,10 @@ amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args)
|
|||
}
|
||||
|
||||
queue_name = kasprintf(GFP_KERNEL, "queue-%d", qid);
|
||||
if (!queue_name)
|
||||
return -ENOMEM;
|
||||
if (!queue_name) {
|
||||
r = -ENOMEM;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
/* Queue dentry per client to hold MQD information */
|
||||
|
|
|
|||
|
|
@ -92,9 +92,9 @@ enum dm_micro_swizzle {
|
|||
MICRO_SWIZZLE_R = 3
|
||||
};
|
||||
|
||||
const struct drm_format_info *amdgpu_dm_plane_get_format_info(const struct drm_mode_fb_cmd2 *cmd)
|
||||
const struct drm_format_info *amdgpu_dm_plane_get_format_info(u32 pixel_format, u64 modifier)
|
||||
{
|
||||
return amdgpu_lookup_format_info(cmd->pixel_format, cmd->modifier[0]);
|
||||
return amdgpu_lookup_format_info(pixel_format, modifier);
|
||||
}
|
||||
|
||||
void amdgpu_dm_plane_fill_blending_from_plane_state(const struct drm_plane_state *plane_state,
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ int amdgpu_dm_plane_init(struct amdgpu_display_manager *dm,
|
|||
unsigned long possible_crtcs,
|
||||
const struct dc_plane_cap *plane_cap);
|
||||
|
||||
const struct drm_format_info *amdgpu_dm_plane_get_format_info(const struct drm_mode_fb_cmd2 *cmd);
|
||||
const struct drm_format_info *amdgpu_dm_plane_get_format_info(u32 pixel_format, u64 modifier);
|
||||
|
||||
void amdgpu_dm_plane_fill_blending_from_plane_state(const struct drm_plane_state *plane_state,
|
||||
bool *per_pixel_alpha, bool *pre_multiplied_alpha,
|
||||
|
|
|
|||
|
|
@ -157,6 +157,7 @@ komeda_fb_none_afbc_size_check(struct komeda_dev *mdev, struct komeda_fb *kfb,
|
|||
|
||||
struct drm_framebuffer *
|
||||
komeda_fb_create(struct drm_device *dev, struct drm_file *file,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct komeda_dev *mdev = dev->dev_private;
|
||||
|
|
@ -177,7 +178,7 @@ komeda_fb_create(struct drm_device *dev, struct drm_file *file,
|
|||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
drm_helper_mode_fill_fb_struct(dev, &kfb->base, mode_cmd);
|
||||
drm_helper_mode_fill_fb_struct(dev, &kfb->base, info, mode_cmd);
|
||||
|
||||
if (kfb->base.modifier)
|
||||
ret = komeda_fb_afbc_size_check(kfb, file, mode_cmd);
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ struct komeda_fb {
|
|||
|
||||
struct drm_framebuffer *
|
||||
komeda_fb_create(struct drm_device *dev, struct drm_file *file,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
int komeda_fb_check_src_coords(const struct komeda_fb *kfb,
|
||||
u32 src_x, u32 src_y, u32 src_w, u32 src_h);
|
||||
|
|
|
|||
|
|
@ -306,10 +306,10 @@ malidp_verify_afbc_framebuffer_caps(struct drm_device *dev,
|
|||
static bool
|
||||
malidp_verify_afbc_framebuffer_size(struct drm_device *dev,
|
||||
struct drm_file *file,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
int n_superblocks = 0;
|
||||
const struct drm_format_info *info;
|
||||
struct drm_gem_object *objs = NULL;
|
||||
u32 afbc_superblock_size = 0, afbc_superblock_height = 0;
|
||||
u32 afbc_superblock_width = 0, afbc_size = 0;
|
||||
|
|
@ -325,8 +325,6 @@ malidp_verify_afbc_framebuffer_size(struct drm_device *dev,
|
|||
return false;
|
||||
}
|
||||
|
||||
info = drm_get_format_info(dev, mode_cmd);
|
||||
|
||||
n_superblocks = (mode_cmd->width / afbc_superblock_width) *
|
||||
(mode_cmd->height / afbc_superblock_height);
|
||||
|
||||
|
|
@ -366,24 +364,26 @@ malidp_verify_afbc_framebuffer_size(struct drm_device *dev,
|
|||
|
||||
static bool
|
||||
malidp_verify_afbc_framebuffer(struct drm_device *dev, struct drm_file *file,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
if (malidp_verify_afbc_framebuffer_caps(dev, mode_cmd))
|
||||
return malidp_verify_afbc_framebuffer_size(dev, file, mode_cmd);
|
||||
return malidp_verify_afbc_framebuffer_size(dev, file, info, mode_cmd);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static struct drm_framebuffer *
|
||||
malidp_fb_create(struct drm_device *dev, struct drm_file *file,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
if (mode_cmd->modifier[0]) {
|
||||
if (!malidp_verify_afbc_framebuffer(dev, file, mode_cmd))
|
||||
if (!malidp_verify_afbc_framebuffer(dev, file, info, mode_cmd))
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
return drm_gem_fb_create(dev, file, mode_cmd);
|
||||
return drm_gem_fb_create(dev, file, info, mode_cmd);
|
||||
}
|
||||
|
||||
static const struct drm_mode_config_funcs malidp_mode_config_funcs = {
|
||||
|
|
|
|||
|
|
@ -18,7 +18,9 @@ static const struct drm_framebuffer_funcs armada_fb_funcs = {
|
|||
};
|
||||
|
||||
struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
|
||||
const struct drm_mode_fb_cmd2 *mode, struct armada_gem_object *obj)
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode,
|
||||
struct armada_gem_object *obj)
|
||||
{
|
||||
struct armada_framebuffer *dfb;
|
||||
uint8_t format, config;
|
||||
|
|
@ -64,7 +66,7 @@ struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
|
|||
dfb->mod = config;
|
||||
dfb->fb.obj[0] = &obj->obj;
|
||||
|
||||
drm_helper_mode_fill_fb_struct(dev, &dfb->fb, mode);
|
||||
drm_helper_mode_fill_fb_struct(dev, &dfb->fb, info, mode);
|
||||
|
||||
ret = drm_framebuffer_init(dev, &dfb->fb, &armada_fb_funcs);
|
||||
if (ret) {
|
||||
|
|
@ -84,9 +86,9 @@ struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
|
|||
}
|
||||
|
||||
struct drm_framebuffer *armada_fb_create(struct drm_device *dev,
|
||||
struct drm_file *dfile, const struct drm_mode_fb_cmd2 *mode)
|
||||
struct drm_file *dfile, const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode)
|
||||
{
|
||||
const struct drm_format_info *info = drm_get_format_info(dev, mode);
|
||||
struct armada_gem_object *obj;
|
||||
struct armada_framebuffer *dfb;
|
||||
int ret;
|
||||
|
|
@ -122,7 +124,7 @@ struct drm_framebuffer *armada_fb_create(struct drm_device *dev,
|
|||
goto err_unref;
|
||||
}
|
||||
|
||||
dfb = armada_framebuffer_create(dev, mode, obj);
|
||||
dfb = armada_framebuffer_create(dev, info, mode, obj);
|
||||
if (IS_ERR(dfb)) {
|
||||
ret = PTR_ERR(dfb);
|
||||
goto err;
|
||||
|
|
|
|||
|
|
@ -17,7 +17,9 @@ struct armada_framebuffer {
|
|||
#define drm_fb_obj(fb) drm_to_armada_gem((fb)->obj[0])
|
||||
|
||||
struct armada_framebuffer *armada_framebuffer_create(struct drm_device *,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *, struct armada_gem_object *);
|
||||
struct drm_framebuffer *armada_fb_create(struct drm_device *dev,
|
||||
struct drm_file *dfile, const struct drm_mode_fb_cmd2 *mode);
|
||||
struct drm_file *dfile, const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -78,7 +78,10 @@ int armada_fbdev_driver_fbdev_probe(struct drm_fb_helper *fbh,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
dfb = armada_framebuffer_create(dev, &mode, obj);
|
||||
dfb = armada_framebuffer_create(dev,
|
||||
drm_get_format_info(dev, mode.pixel_format,
|
||||
mode.modifier[0]),
|
||||
&mode, obj);
|
||||
|
||||
/*
|
||||
* A reference is now held by the framebuffer object if
|
||||
|
|
|
|||
|
|
@ -399,8 +399,8 @@ static inline struct adv7511 *bridge_to_adv7511(struct drm_bridge *bridge)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_DRM_I2C_ADV7511_CEC
|
||||
int adv7511_cec_init(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge);
|
||||
int adv7511_cec_init(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector);
|
||||
int adv7511_cec_enable(struct drm_bridge *bridge, bool enable);
|
||||
int adv7511_cec_log_addr(struct drm_bridge *bridge, u8 addr);
|
||||
int adv7511_cec_transmit(struct drm_bridge *bridge, u8 attempts,
|
||||
|
|
@ -424,12 +424,12 @@ int adv7533_attach_dsi(struct adv7511 *adv);
|
|||
int adv7533_parse_dt(struct device_node *np, struct adv7511 *adv);
|
||||
|
||||
#ifdef CONFIG_DRM_I2C_ADV7511_AUDIO
|
||||
int adv7511_hdmi_audio_startup(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge);
|
||||
void adv7511_hdmi_audio_shutdown(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge);
|
||||
int adv7511_hdmi_audio_prepare(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge,
|
||||
int adv7511_hdmi_audio_startup(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector);
|
||||
void adv7511_hdmi_audio_shutdown(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector);
|
||||
int adv7511_hdmi_audio_prepare(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector,
|
||||
struct hdmi_codec_daifmt *fmt,
|
||||
struct hdmi_codec_params *hparms);
|
||||
#else /*CONFIG_DRM_I2C_ADV7511_AUDIO */
|
||||
|
|
|
|||
|
|
@ -55,8 +55,8 @@ static int adv7511_update_cts_n(struct adv7511 *adv7511)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int adv7511_hdmi_audio_prepare(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge,
|
||||
int adv7511_hdmi_audio_prepare(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector,
|
||||
struct hdmi_codec_daifmt *fmt,
|
||||
struct hdmi_codec_params *hparms)
|
||||
{
|
||||
|
|
@ -168,8 +168,8 @@ int adv7511_hdmi_audio_prepare(struct drm_connector *connector,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int adv7511_hdmi_audio_startup(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge)
|
||||
int adv7511_hdmi_audio_startup(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
struct adv7511 *adv7511 = bridge_to_adv7511(bridge);
|
||||
|
||||
|
|
@ -206,8 +206,8 @@ int adv7511_hdmi_audio_startup(struct drm_connector *connector,
|
|||
return 0;
|
||||
}
|
||||
|
||||
void adv7511_hdmi_audio_shutdown(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge)
|
||||
void adv7511_hdmi_audio_shutdown(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
struct adv7511 *adv7511 = bridge_to_adv7511(bridge);
|
||||
|
||||
|
|
|
|||
|
|
@ -346,8 +346,8 @@ static int adv7511_cec_parse_dt(struct device *dev, struct adv7511 *adv7511)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int adv7511_cec_init(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge)
|
||||
int adv7511_cec_init(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
struct adv7511 *adv7511 = bridge_to_adv7511(bridge);
|
||||
struct device *dev = &adv7511->i2c_main->dev;
|
||||
|
|
|
|||
|
|
@ -864,7 +864,8 @@ static int adv7511_bridge_attach(struct drm_bridge *bridge,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static enum drm_connector_status adv7511_bridge_detect(struct drm_bridge *bridge)
|
||||
static enum drm_connector_status
|
||||
adv7511_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct adv7511 *adv = bridge_to_adv7511(bridge);
|
||||
|
||||
|
|
|
|||
|
|
@ -2448,7 +2448,7 @@ anx7625_audio_update_connector_status(struct anx7625_data *ctx,
|
|||
enum drm_connector_status status);
|
||||
|
||||
static enum drm_connector_status
|
||||
anx7625_bridge_detect(struct drm_bridge *bridge)
|
||||
anx7625_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct anx7625_data *ctx = bridge_to_anx7625(bridge);
|
||||
struct device *dev = ctx->dev;
|
||||
|
|
|
|||
|
|
@ -2143,7 +2143,8 @@ static int cdns_mhdp_atomic_check(struct drm_bridge *bridge,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static enum drm_connector_status cdns_mhdp_bridge_detect(struct drm_bridge *bridge)
|
||||
static enum drm_connector_status
|
||||
cdns_mhdp_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct cdns_mhdp_device *mhdp = bridge_to_mhdp(bridge);
|
||||
|
||||
|
|
|
|||
|
|
@ -215,7 +215,7 @@ static enum drm_connector_status ch7033_connector_detect(
|
|||
{
|
||||
struct ch7033_priv *priv = conn_to_ch7033_priv(connector);
|
||||
|
||||
return drm_bridge_detect(priv->next_bridge);
|
||||
return drm_bridge_detect(priv->next_bridge, connector);
|
||||
}
|
||||
|
||||
static const struct drm_connector_funcs ch7033_connector_funcs = {
|
||||
|
|
|
|||
|
|
@ -40,8 +40,7 @@ static int display_connector_attach(struct drm_bridge *bridge,
|
|||
return flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR ? 0 : -EINVAL;
|
||||
}
|
||||
|
||||
static enum drm_connector_status
|
||||
display_connector_detect(struct drm_bridge *bridge)
|
||||
static enum drm_connector_status display_connector_detect(struct drm_bridge *bridge)
|
||||
{
|
||||
struct display_connector *conn = to_display_connector(bridge);
|
||||
|
||||
|
|
@ -82,6 +81,12 @@ display_connector_detect(struct drm_bridge *bridge)
|
|||
}
|
||||
}
|
||||
|
||||
static enum drm_connector_status
|
||||
display_connector_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
return display_connector_detect(bridge);
|
||||
}
|
||||
|
||||
static const struct drm_edid *display_connector_edid_read(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
|
|
@ -172,7 +177,7 @@ static u32 *display_connector_get_input_bus_fmts(struct drm_bridge *bridge,
|
|||
|
||||
static const struct drm_bridge_funcs display_connector_bridge_funcs = {
|
||||
.attach = display_connector_attach,
|
||||
.detect = display_connector_detect,
|
||||
.detect = display_connector_bridge_detect,
|
||||
.edid_read = display_connector_edid_read,
|
||||
.atomic_get_output_bus_fmts = display_connector_get_output_bus_fmts,
|
||||
.atomic_get_input_bus_fmts = display_connector_get_input_bus_fmts,
|
||||
|
|
|
|||
|
|
@ -693,7 +693,8 @@ static int it6263_bridge_attach(struct drm_bridge *bridge,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static enum drm_connector_status it6263_bridge_detect(struct drm_bridge *bridge)
|
||||
static enum drm_connector_status
|
||||
it6263_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct it6263 *it = bridge_to_it6263(bridge);
|
||||
|
||||
|
|
|
|||
|
|
@ -3238,7 +3238,7 @@ static void it6505_bridge_atomic_post_disable(struct drm_bridge *bridge,
|
|||
}
|
||||
|
||||
static enum drm_connector_status
|
||||
it6505_bridge_detect(struct drm_bridge *bridge)
|
||||
it6505_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct it6505 *it6505 = bridge_to_it6505(bridge);
|
||||
|
||||
|
|
|
|||
|
|
@ -843,7 +843,8 @@ static enum drm_mode_status it66121_bridge_mode_valid(struct drm_bridge *bridge,
|
|||
return MODE_OK;
|
||||
}
|
||||
|
||||
static enum drm_connector_status it66121_bridge_detect(struct drm_bridge *bridge)
|
||||
static enum drm_connector_status
|
||||
it66121_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge);
|
||||
|
||||
|
|
|
|||
|
|
@ -408,7 +408,7 @@ lt8912_connector_detect(struct drm_connector *connector, bool force)
|
|||
struct lt8912 *lt = connector_to_lt8912(connector);
|
||||
|
||||
if (lt->hdmi_port->ops & DRM_BRIDGE_OP_DETECT)
|
||||
return drm_bridge_detect(lt->hdmi_port);
|
||||
return drm_bridge_detect(lt->hdmi_port, connector);
|
||||
|
||||
return lt8912_check_cable_status(lt);
|
||||
}
|
||||
|
|
@ -607,12 +607,12 @@ lt8912_bridge_mode_valid(struct drm_bridge *bridge,
|
|||
}
|
||||
|
||||
static enum drm_connector_status
|
||||
lt8912_bridge_detect(struct drm_bridge *bridge)
|
||||
lt8912_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct lt8912 *lt = bridge_to_lt8912(bridge);
|
||||
|
||||
if (lt->hdmi_port->ops & DRM_BRIDGE_OP_DETECT)
|
||||
return drm_bridge_detect(lt->hdmi_port);
|
||||
return drm_bridge_detect(lt->hdmi_port, connector);
|
||||
|
||||
return lt8912_check_cable_status(lt);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -543,7 +543,8 @@ static int lt9611_regulator_enable(struct lt9611 *lt9611)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static enum drm_connector_status lt9611_bridge_detect(struct drm_bridge *bridge)
|
||||
static enum drm_connector_status
|
||||
lt9611_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
|
||||
unsigned int reg_val = 0;
|
||||
|
|
@ -936,8 +937,8 @@ lt9611_hdmi_tmds_char_rate_valid(const struct drm_bridge *bridge,
|
|||
return MODE_OK;
|
||||
}
|
||||
|
||||
static int lt9611_hdmi_audio_startup(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge)
|
||||
static int lt9611_hdmi_audio_startup(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
|
||||
|
||||
|
|
@ -952,8 +953,8 @@ static int lt9611_hdmi_audio_startup(struct drm_connector *connector,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int lt9611_hdmi_audio_prepare(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge,
|
||||
static int lt9611_hdmi_audio_prepare(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector,
|
||||
struct hdmi_codec_daifmt *fmt,
|
||||
struct hdmi_codec_params *hparms)
|
||||
{
|
||||
|
|
@ -974,8 +975,8 @@ static int lt9611_hdmi_audio_prepare(struct drm_connector *connector,
|
|||
&hparms->cea);
|
||||
}
|
||||
|
||||
static void lt9611_hdmi_audio_shutdown(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge)
|
||||
static void lt9611_hdmi_audio_shutdown(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
|
||||
|
||||
|
|
|
|||
|
|
@ -353,7 +353,8 @@ static void lt9611uxc_bridge_mode_set(struct drm_bridge *bridge,
|
|||
lt9611uxc_unlock(lt9611uxc);
|
||||
}
|
||||
|
||||
static enum drm_connector_status lt9611uxc_bridge_detect(struct drm_bridge *bridge)
|
||||
static enum drm_connector_status
|
||||
lt9611uxc_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct lt9611uxc *lt9611uxc = bridge_to_lt9611uxc(bridge);
|
||||
unsigned int reg_val = 0;
|
||||
|
|
|
|||
|
|
@ -120,7 +120,8 @@ drm_connector_helper_funcs ge_b850v3_lvds_connector_helper_funcs = {
|
|||
.get_modes = ge_b850v3_lvds_get_modes,
|
||||
};
|
||||
|
||||
static enum drm_connector_status ge_b850v3_lvds_bridge_detect(struct drm_bridge *bridge)
|
||||
static enum drm_connector_status
|
||||
ge_b850v3_lvds_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct i2c_client *stdp4028_i2c =
|
||||
ge_b850v3_lvds_ptr->stdp4028_i2c;
|
||||
|
|
@ -141,7 +142,7 @@ static enum drm_connector_status ge_b850v3_lvds_bridge_detect(struct drm_bridge
|
|||
static enum drm_connector_status ge_b850v3_lvds_detect(struct drm_connector *connector,
|
||||
bool force)
|
||||
{
|
||||
return ge_b850v3_lvds_bridge_detect(&ge_b850v3_lvds_ptr->bridge);
|
||||
return ge_b850v3_lvds_bridge_detect(&ge_b850v3_lvds_ptr->bridge, connector);
|
||||
}
|
||||
|
||||
static const struct drm_connector_funcs ge_b850v3_lvds_connector_funcs = {
|
||||
|
|
|
|||
|
|
@ -458,7 +458,8 @@ static int sii902x_bridge_attach(struct drm_bridge *bridge,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static enum drm_connector_status sii902x_bridge_detect(struct drm_bridge *bridge)
|
||||
static enum drm_connector_status
|
||||
sii902x_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct sii902x *sii902x = bridge_to_sii902x(bridge);
|
||||
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ simple_bridge_connector_detect(struct drm_connector *connector, bool force)
|
|||
{
|
||||
struct simple_bridge *sbridge = drm_connector_to_simple_bridge(connector);
|
||||
|
||||
return drm_bridge_detect(sbridge->next_bridge);
|
||||
return drm_bridge_detect(sbridge->next_bridge, connector);
|
||||
}
|
||||
|
||||
static const struct drm_connector_funcs simple_bridge_con_funcs = {
|
||||
|
|
|
|||
|
|
@ -440,8 +440,8 @@ static void dw_hdmi_qp_set_sample_rate(struct dw_hdmi_qp *hdmi, unsigned long lo
|
|||
dw_hdmi_qp_set_cts_n(hdmi, cts, n);
|
||||
}
|
||||
|
||||
static int dw_hdmi_qp_audio_enable(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge)
|
||||
static int dw_hdmi_qp_audio_enable(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
struct dw_hdmi_qp *hdmi = dw_hdmi_qp_from_bridge(bridge);
|
||||
|
||||
|
|
@ -451,8 +451,8 @@ static int dw_hdmi_qp_audio_enable(struct drm_connector *connector,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int dw_hdmi_qp_audio_prepare(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge,
|
||||
static int dw_hdmi_qp_audio_prepare(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector,
|
||||
struct hdmi_codec_daifmt *fmt,
|
||||
struct hdmi_codec_params *hparms)
|
||||
{
|
||||
|
|
@ -497,8 +497,8 @@ static void dw_hdmi_qp_audio_disable_regs(struct dw_hdmi_qp *hdmi)
|
|||
AVP_DATAPATH_PACKET_AUDIO_SWDISABLE, GLOBAL_SWDISABLE);
|
||||
}
|
||||
|
||||
static void dw_hdmi_qp_audio_disable(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge)
|
||||
static void dw_hdmi_qp_audio_disable(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
struct dw_hdmi_qp *hdmi = dw_hdmi_qp_from_bridge(bridge);
|
||||
|
||||
|
|
@ -876,7 +876,7 @@ static void dw_hdmi_qp_bridge_atomic_disable(struct drm_bridge *bridge,
|
|||
}
|
||||
|
||||
static enum drm_connector_status
|
||||
dw_hdmi_qp_bridge_detect(struct drm_bridge *bridge)
|
||||
dw_hdmi_qp_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct dw_hdmi_qp *hdmi = bridge->driver_private;
|
||||
|
||||
|
|
|
|||
|
|
@ -2978,7 +2978,8 @@ static void dw_hdmi_bridge_atomic_enable(struct drm_bridge *bridge,
|
|||
mutex_unlock(&hdmi->mutex);
|
||||
}
|
||||
|
||||
static enum drm_connector_status dw_hdmi_bridge_detect(struct drm_bridge *bridge)
|
||||
static enum drm_connector_status
|
||||
dw_hdmi_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct dw_hdmi *hdmi = bridge->driver_private;
|
||||
|
||||
|
|
|
|||
|
|
@ -1760,7 +1760,8 @@ static const struct drm_connector_helper_funcs tc_connector_helper_funcs = {
|
|||
.get_modes = tc_connector_get_modes,
|
||||
};
|
||||
|
||||
static enum drm_connector_status tc_bridge_detect(struct drm_bridge *bridge)
|
||||
static enum drm_connector_status
|
||||
tc_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct tc_data *tc = bridge_to_tc(bridge);
|
||||
bool conn;
|
||||
|
|
@ -1785,7 +1786,7 @@ tc_connector_detect(struct drm_connector *connector, bool force)
|
|||
struct tc_data *tc = connector_to_tc(connector);
|
||||
|
||||
if (tc->hpd_pin >= 0)
|
||||
return tc_bridge_detect(&tc->bridge);
|
||||
return tc_bridge_detect(&tc->bridge, connector);
|
||||
|
||||
if (tc->panel_bridge)
|
||||
return connector_status_connected;
|
||||
|
|
|
|||
|
|
@ -1155,7 +1155,8 @@ static void ti_sn_bridge_atomic_post_disable(struct drm_bridge *bridge,
|
|||
pm_runtime_put_sync(pdata->dev);
|
||||
}
|
||||
|
||||
static enum drm_connector_status ti_sn_bridge_detect(struct drm_bridge *bridge)
|
||||
static enum drm_connector_status
|
||||
ti_sn_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct ti_sn65dsi86 *pdata = bridge_to_ti_sn65dsi86(bridge);
|
||||
int val = 0;
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ tfp410_connector_detect(struct drm_connector *connector, bool force)
|
|||
{
|
||||
struct tfp410 *dvi = drm_connector_to_tfp410(connector);
|
||||
|
||||
return drm_bridge_detect(dvi->next_bridge);
|
||||
return drm_bridge_detect(dvi->next_bridge, connector);
|
||||
}
|
||||
|
||||
static const struct drm_connector_funcs tfp410_con_funcs = {
|
||||
|
|
|
|||
|
|
@ -77,6 +77,12 @@ static enum drm_connector_status tpd12s015_detect(struct drm_bridge *bridge)
|
|||
return connector_status_disconnected;
|
||||
}
|
||||
|
||||
static enum drm_connector_status
|
||||
tpd12s015_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
return tpd12s015_detect(bridge);
|
||||
}
|
||||
|
||||
static void tpd12s015_hpd_enable(struct drm_bridge *bridge)
|
||||
{
|
||||
struct tpd12s015_device *tpd = to_tpd12s015(bridge);
|
||||
|
|
@ -94,7 +100,7 @@ static void tpd12s015_hpd_disable(struct drm_bridge *bridge)
|
|||
static const struct drm_bridge_funcs tpd12s015_bridge_funcs = {
|
||||
.attach = tpd12s015_attach,
|
||||
.detach = tpd12s015_detach,
|
||||
.detect = tpd12s015_detect,
|
||||
.detect = tpd12s015_bridge_detect,
|
||||
.hpd_enable = tpd12s015_hpd_enable,
|
||||
.hpd_disable = tpd12s015_hpd_disable,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -210,7 +210,7 @@ drm_bridge_connector_detect(struct drm_connector *connector, bool force)
|
|||
enum drm_connector_status status;
|
||||
|
||||
if (detect) {
|
||||
status = detect->funcs->detect(detect);
|
||||
status = detect->funcs->detect(detect, connector);
|
||||
|
||||
if (hdmi)
|
||||
drm_atomic_helper_connector_hdmi_hotplug(connector, status);
|
||||
|
|
@ -463,7 +463,7 @@ static int drm_bridge_connector_audio_startup(struct drm_connector *connector)
|
|||
if (!bridge->funcs->hdmi_audio_startup)
|
||||
return 0;
|
||||
|
||||
return bridge->funcs->hdmi_audio_startup(connector, bridge);
|
||||
return bridge->funcs->hdmi_audio_startup(bridge, connector);
|
||||
}
|
||||
|
||||
if (bridge_connector->bridge_dp_audio) {
|
||||
|
|
@ -472,7 +472,7 @@ static int drm_bridge_connector_audio_startup(struct drm_connector *connector)
|
|||
if (!bridge->funcs->dp_audio_startup)
|
||||
return 0;
|
||||
|
||||
return bridge->funcs->dp_audio_startup(connector, bridge);
|
||||
return bridge->funcs->dp_audio_startup(bridge, connector);
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
|
|
@ -489,13 +489,13 @@ static int drm_bridge_connector_audio_prepare(struct drm_connector *connector,
|
|||
if (bridge_connector->bridge_hdmi_audio) {
|
||||
bridge = bridge_connector->bridge_hdmi_audio;
|
||||
|
||||
return bridge->funcs->hdmi_audio_prepare(connector, bridge, fmt, hparms);
|
||||
return bridge->funcs->hdmi_audio_prepare(bridge, connector, fmt, hparms);
|
||||
}
|
||||
|
||||
if (bridge_connector->bridge_dp_audio) {
|
||||
bridge = bridge_connector->bridge_dp_audio;
|
||||
|
||||
return bridge->funcs->dp_audio_prepare(connector, bridge, fmt, hparms);
|
||||
return bridge->funcs->dp_audio_prepare(bridge, connector, fmt, hparms);
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
|
|
@ -509,12 +509,12 @@ static void drm_bridge_connector_audio_shutdown(struct drm_connector *connector)
|
|||
|
||||
if (bridge_connector->bridge_hdmi_audio) {
|
||||
bridge = bridge_connector->bridge_hdmi_audio;
|
||||
bridge->funcs->hdmi_audio_shutdown(connector, bridge);
|
||||
bridge->funcs->hdmi_audio_shutdown(bridge, connector);
|
||||
}
|
||||
|
||||
if (bridge_connector->bridge_dp_audio) {
|
||||
bridge = bridge_connector->bridge_dp_audio;
|
||||
bridge->funcs->dp_audio_shutdown(connector, bridge);
|
||||
bridge->funcs->dp_audio_shutdown(bridge, connector);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -531,7 +531,7 @@ static int drm_bridge_connector_audio_mute_stream(struct drm_connector *connecto
|
|||
if (!bridge->funcs->hdmi_audio_mute_stream)
|
||||
return -ENOTSUPP;
|
||||
|
||||
return bridge->funcs->hdmi_audio_mute_stream(connector, bridge,
|
||||
return bridge->funcs->hdmi_audio_mute_stream(bridge, connector,
|
||||
enable, direction);
|
||||
}
|
||||
|
||||
|
|
@ -541,7 +541,7 @@ static int drm_bridge_connector_audio_mute_stream(struct drm_connector *connecto
|
|||
if (!bridge->funcs->dp_audio_mute_stream)
|
||||
return -ENOTSUPP;
|
||||
|
||||
return bridge->funcs->dp_audio_mute_stream(connector, bridge,
|
||||
return bridge->funcs->dp_audio_mute_stream(bridge, connector,
|
||||
enable, direction);
|
||||
}
|
||||
|
||||
|
|
@ -604,7 +604,7 @@ static int drm_bridge_connector_hdmi_cec_init(struct drm_connector *connector)
|
|||
if (!bridge->funcs->hdmi_cec_init)
|
||||
return 0;
|
||||
|
||||
return bridge->funcs->hdmi_cec_init(connector, bridge);
|
||||
return bridge->funcs->hdmi_cec_init(bridge, connector);
|
||||
}
|
||||
|
||||
static const struct drm_connector_hdmi_cec_funcs drm_bridge_connector_hdmi_cec_funcs = {
|
||||
|
|
|
|||
|
|
@ -1237,12 +1237,13 @@ EXPORT_SYMBOL(drm_atomic_bridge_chain_check);
|
|||
* The detection status on success, or connector_status_unknown if the bridge
|
||||
* doesn't support output detection.
|
||||
*/
|
||||
enum drm_connector_status drm_bridge_detect(struct drm_bridge *bridge)
|
||||
enum drm_connector_status
|
||||
drm_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
if (!(bridge->ops & DRM_BRIDGE_OP_DETECT))
|
||||
return connector_status_unknown;
|
||||
|
||||
return bridge->funcs->detect(bridge);
|
||||
return bridge->funcs->detect(bridge, connector);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(drm_bridge_detect);
|
||||
|
||||
|
|
|
|||
|
|
@ -417,7 +417,8 @@ EXPORT_SYMBOL(drm_format_info);
|
|||
/**
|
||||
* drm_get_format_info - query information for a given framebuffer configuration
|
||||
* @dev: DRM device
|
||||
* @mode_cmd: metadata from the userspace fb creation request
|
||||
* @pixel_format: pixel format (DRM_FORMAT_*)
|
||||
* @modifier: modifier
|
||||
*
|
||||
* Returns:
|
||||
* The instance of struct drm_format_info that describes the pixel format, or
|
||||
|
|
@ -425,15 +426,16 @@ EXPORT_SYMBOL(drm_format_info);
|
|||
*/
|
||||
const struct drm_format_info *
|
||||
drm_get_format_info(struct drm_device *dev,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
u32 pixel_format, u64 modifier)
|
||||
{
|
||||
const struct drm_format_info *info = NULL;
|
||||
|
||||
if (dev->mode_config.funcs->get_format_info)
|
||||
info = dev->mode_config.funcs->get_format_info(mode_cmd);
|
||||
info = dev->mode_config.funcs->get_format_info(pixel_format,
|
||||
modifier);
|
||||
|
||||
if (!info)
|
||||
info = drm_format_info(mode_cmd->pixel_format);
|
||||
info = drm_format_info(pixel_format);
|
||||
|
||||
return info;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -153,18 +153,11 @@ int drm_mode_addfb_ioctl(struct drm_device *dev,
|
|||
}
|
||||
|
||||
static int framebuffer_check(struct drm_device *dev,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *r)
|
||||
{
|
||||
const struct drm_format_info *info;
|
||||
int i;
|
||||
|
||||
/* check if the format is supported at all */
|
||||
if (!__drm_format_info(r->pixel_format)) {
|
||||
drm_dbg_kms(dev, "bad framebuffer format %p4cc\n",
|
||||
&r->pixel_format);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (r->width == 0) {
|
||||
drm_dbg_kms(dev, "bad framebuffer width %u\n", r->width);
|
||||
return -EINVAL;
|
||||
|
|
@ -175,9 +168,6 @@ static int framebuffer_check(struct drm_device *dev,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* now let the driver pick its own format info */
|
||||
info = drm_get_format_info(dev, r);
|
||||
|
||||
for (i = 0; i < info->num_planes; i++) {
|
||||
unsigned int width = drm_format_info_plane_width(info, r->width, i);
|
||||
unsigned int height = drm_format_info_plane_height(info, r->height, i);
|
||||
|
|
@ -272,6 +262,7 @@ drm_internal_framebuffer_create(struct drm_device *dev,
|
|||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_mode_config *config = &dev->mode_config;
|
||||
const struct drm_format_info *info;
|
||||
struct drm_framebuffer *fb;
|
||||
int ret;
|
||||
|
||||
|
|
@ -297,11 +288,21 @@ drm_internal_framebuffer_create(struct drm_device *dev,
|
|||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
ret = framebuffer_check(dev, r);
|
||||
/* check if the format is supported at all */
|
||||
if (!__drm_format_info(r->pixel_format)) {
|
||||
drm_dbg_kms(dev, "bad framebuffer format %p4cc\n",
|
||||
&r->pixel_format);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
/* now let the driver pick its own format info */
|
||||
info = drm_get_format_info(dev, r->pixel_format, r->modifier[0]);
|
||||
|
||||
ret = framebuffer_check(dev, info, r);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
fb = dev->mode_config.funcs->fb_create(dev, file_priv, r);
|
||||
fb = dev->mode_config.funcs->fb_create(dev, file_priv, info, r);
|
||||
if (IS_ERR(fb)) {
|
||||
drm_dbg_kms(dev, "could not create framebuffer\n");
|
||||
return fb;
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@ EXPORT_SYMBOL_GPL(drm_gem_fb_get_obj);
|
|||
static int
|
||||
drm_gem_fb_init(struct drm_device *dev,
|
||||
struct drm_framebuffer *fb,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object **obj, unsigned int num_planes,
|
||||
const struct drm_framebuffer_funcs *funcs)
|
||||
|
|
@ -75,7 +76,7 @@ drm_gem_fb_init(struct drm_device *dev,
|
|||
unsigned int i;
|
||||
int ret;
|
||||
|
||||
drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
|
||||
drm_helper_mode_fill_fb_struct(dev, fb, info, mode_cmd);
|
||||
|
||||
for (i = 0; i < num_planes; i++)
|
||||
fb->obj[i] = obj[i];
|
||||
|
|
@ -136,6 +137,7 @@ EXPORT_SYMBOL(drm_gem_fb_create_handle);
|
|||
* @dev: DRM device
|
||||
* @fb: framebuffer object
|
||||
* @file: DRM file that holds the GEM handle(s) backing the framebuffer
|
||||
* @info: pixel format information
|
||||
* @mode_cmd: Metadata from the userspace framebuffer creation request
|
||||
* @funcs: vtable to be used for the new framebuffer object
|
||||
*
|
||||
|
|
@ -152,20 +154,14 @@ EXPORT_SYMBOL(drm_gem_fb_create_handle);
|
|||
int drm_gem_fb_init_with_funcs(struct drm_device *dev,
|
||||
struct drm_framebuffer *fb,
|
||||
struct drm_file *file,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_framebuffer_funcs *funcs)
|
||||
{
|
||||
const struct drm_format_info *info;
|
||||
struct drm_gem_object *objs[DRM_FORMAT_MAX_PLANES];
|
||||
unsigned int i;
|
||||
int ret;
|
||||
|
||||
info = drm_get_format_info(dev, mode_cmd);
|
||||
if (!info) {
|
||||
drm_dbg_kms(dev, "Failed to get FB format info\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (drm_drv_uses_atomic_modeset(dev) &&
|
||||
!drm_any_plane_has_format(dev, mode_cmd->pixel_format,
|
||||
mode_cmd->modifier[0])) {
|
||||
|
|
@ -200,7 +196,7 @@ int drm_gem_fb_init_with_funcs(struct drm_device *dev,
|
|||
}
|
||||
}
|
||||
|
||||
ret = drm_gem_fb_init(dev, fb, mode_cmd, objs, i, funcs);
|
||||
ret = drm_gem_fb_init(dev, fb, info, mode_cmd, objs, i, funcs);
|
||||
if (ret)
|
||||
goto err_gem_object_put;
|
||||
|
||||
|
|
@ -221,6 +217,7 @@ EXPORT_SYMBOL_GPL(drm_gem_fb_init_with_funcs);
|
|||
* callback
|
||||
* @dev: DRM device
|
||||
* @file: DRM file that holds the GEM handle(s) backing the framebuffer
|
||||
* @info: pixel format information
|
||||
* @mode_cmd: Metadata from the userspace framebuffer creation request
|
||||
* @funcs: vtable to be used for the new framebuffer object
|
||||
*
|
||||
|
|
@ -233,6 +230,7 @@ EXPORT_SYMBOL_GPL(drm_gem_fb_init_with_funcs);
|
|||
*/
|
||||
struct drm_framebuffer *
|
||||
drm_gem_fb_create_with_funcs(struct drm_device *dev, struct drm_file *file,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
const struct drm_framebuffer_funcs *funcs)
|
||||
{
|
||||
|
|
@ -243,7 +241,7 @@ drm_gem_fb_create_with_funcs(struct drm_device *dev, struct drm_file *file,
|
|||
if (!fb)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
ret = drm_gem_fb_init_with_funcs(dev, fb, file, mode_cmd, funcs);
|
||||
ret = drm_gem_fb_init_with_funcs(dev, fb, file, info, mode_cmd, funcs);
|
||||
if (ret) {
|
||||
kfree(fb);
|
||||
return ERR_PTR(ret);
|
||||
|
|
@ -263,6 +261,7 @@ static const struct drm_framebuffer_funcs drm_gem_fb_funcs = {
|
|||
* &drm_mode_config_funcs.fb_create callback
|
||||
* @dev: DRM device
|
||||
* @file: DRM file that holds the GEM handle(s) backing the framebuffer
|
||||
* @info: pixel format information
|
||||
* @mode_cmd: Metadata from the userspace framebuffer creation request
|
||||
*
|
||||
* This function creates a new framebuffer object described by
|
||||
|
|
@ -282,9 +281,10 @@ static const struct drm_framebuffer_funcs drm_gem_fb_funcs = {
|
|||
*/
|
||||
struct drm_framebuffer *
|
||||
drm_gem_fb_create(struct drm_device *dev, struct drm_file *file,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
return drm_gem_fb_create_with_funcs(dev, file, mode_cmd,
|
||||
return drm_gem_fb_create_with_funcs(dev, file, info, mode_cmd,
|
||||
&drm_gem_fb_funcs);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(drm_gem_fb_create);
|
||||
|
|
@ -300,6 +300,7 @@ static const struct drm_framebuffer_funcs drm_gem_fb_funcs_dirtyfb = {
|
|||
* &drm_mode_config_funcs.fb_create callback
|
||||
* @dev: DRM device
|
||||
* @file: DRM file that holds the GEM handle(s) backing the framebuffer
|
||||
* @info: pixel format information
|
||||
* @mode_cmd: Metadata from the userspace framebuffer creation request
|
||||
*
|
||||
* This function creates a new framebuffer object described by
|
||||
|
|
@ -320,9 +321,10 @@ static const struct drm_framebuffer_funcs drm_gem_fb_funcs_dirtyfb = {
|
|||
*/
|
||||
struct drm_framebuffer *
|
||||
drm_gem_fb_create_with_dirty(struct drm_device *dev, struct drm_file *file,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
return drm_gem_fb_create_with_funcs(dev, file, mode_cmd,
|
||||
return drm_gem_fb_create_with_funcs(dev, file, info, mode_cmd,
|
||||
&drm_gem_fb_funcs_dirtyfb);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(drm_gem_fb_create_with_dirty);
|
||||
|
|
@ -498,12 +500,9 @@ EXPORT_SYMBOL(drm_gem_fb_end_cpu_access);
|
|||
// TODO Drop this function and replace by drm_format_info_bpp() once all
|
||||
// DRM_FORMAT_* provide proper block info in drivers/gpu/drm/drm_fourcc.c
|
||||
static __u32 drm_gem_afbc_get_bpp(struct drm_device *dev,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
const struct drm_format_info *info;
|
||||
|
||||
info = drm_get_format_info(dev, mode_cmd);
|
||||
|
||||
switch (info->format) {
|
||||
case DRM_FORMAT_YUV420_8BIT:
|
||||
return 12;
|
||||
|
|
@ -517,6 +516,7 @@ static __u32 drm_gem_afbc_get_bpp(struct drm_device *dev,
|
|||
}
|
||||
|
||||
static int drm_gem_afbc_min_size(struct drm_device *dev,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_afbc_framebuffer *afbc_fb)
|
||||
{
|
||||
|
|
@ -557,7 +557,7 @@ static int drm_gem_afbc_min_size(struct drm_device *dev,
|
|||
afbc_fb->aligned_height = ALIGN(mode_cmd->height, h_alignment);
|
||||
afbc_fb->offset = mode_cmd->offsets[0];
|
||||
|
||||
bpp = drm_gem_afbc_get_bpp(dev, mode_cmd);
|
||||
bpp = drm_gem_afbc_get_bpp(dev, info, mode_cmd);
|
||||
if (!bpp) {
|
||||
drm_dbg_kms(dev, "Invalid AFBC bpp value: %d\n", bpp);
|
||||
return -EINVAL;
|
||||
|
|
@ -579,6 +579,7 @@ static int drm_gem_afbc_min_size(struct drm_device *dev,
|
|||
*
|
||||
* @dev: DRM device
|
||||
* @afbc_fb: afbc-specific framebuffer
|
||||
* @info: pixel format information
|
||||
* @mode_cmd: Metadata from the userspace framebuffer creation request
|
||||
* @afbc_fb: afbc framebuffer
|
||||
*
|
||||
|
|
@ -592,19 +593,16 @@ static int drm_gem_afbc_min_size(struct drm_device *dev,
|
|||
* Zero on success or a negative error value on failure.
|
||||
*/
|
||||
int drm_gem_fb_afbc_init(struct drm_device *dev,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_afbc_framebuffer *afbc_fb)
|
||||
{
|
||||
const struct drm_format_info *info;
|
||||
struct drm_gem_object **objs;
|
||||
int ret;
|
||||
|
||||
objs = afbc_fb->base.obj;
|
||||
info = drm_get_format_info(dev, mode_cmd);
|
||||
if (!info)
|
||||
return -EINVAL;
|
||||
|
||||
ret = drm_gem_afbc_min_size(dev, mode_cmd, afbc_fb);
|
||||
ret = drm_gem_afbc_min_size(dev, info, mode_cmd, afbc_fb);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
|
|
|||
|
|
@ -74,6 +74,7 @@ EXPORT_SYMBOL(drm_helper_move_panel_connectors_to_head);
|
|||
* drm_helper_mode_fill_fb_struct - fill out framebuffer metadata
|
||||
* @dev: DRM device
|
||||
* @fb: drm_framebuffer object to fill out
|
||||
* @info: pixel format information
|
||||
* @mode_cmd: metadata from the userspace fb creation request
|
||||
*
|
||||
* This helper can be used in a drivers fb_create callback to pre-fill the fb's
|
||||
|
|
@ -81,12 +82,13 @@ EXPORT_SYMBOL(drm_helper_move_panel_connectors_to_head);
|
|||
*/
|
||||
void drm_helper_mode_fill_fb_struct(struct drm_device *dev,
|
||||
struct drm_framebuffer *fb,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
int i;
|
||||
|
||||
fb->dev = dev;
|
||||
fb->format = drm_get_format_info(dev, mode_cmd);
|
||||
fb->format = info;
|
||||
fb->width = mode_cmd->width;
|
||||
fb->height = mode_cmd->height;
|
||||
for (i = 0; i < 4; i++) {
|
||||
|
|
|
|||
|
|
@ -40,11 +40,11 @@ static enum drm_gpu_sched_stat etnaviv_sched_timedout_job(struct drm_sched_job
|
|||
int change;
|
||||
|
||||
/*
|
||||
* If the GPU managed to complete this jobs fence, the timout is
|
||||
* spurious. Bail out.
|
||||
* If the GPU managed to complete this jobs fence, the timeout has
|
||||
* fired before free-job worker. The timeout is spurious, so bail out.
|
||||
*/
|
||||
if (dma_fence_is_signaled(submit->out_fence))
|
||||
goto out_no_timeout;
|
||||
return DRM_GPU_SCHED_STAT_NO_HANG;
|
||||
|
||||
/*
|
||||
* If the GPU is still making forward progress on the front-end (which
|
||||
|
|
@ -70,7 +70,7 @@ static enum drm_gpu_sched_stat etnaviv_sched_timedout_job(struct drm_sched_job
|
|||
gpu->hangcheck_dma_addr = dma_addr;
|
||||
gpu->hangcheck_primid = primid;
|
||||
gpu->hangcheck_fence = gpu->completed_fence;
|
||||
goto out_no_timeout;
|
||||
return DRM_GPU_SCHED_STAT_NO_HANG;
|
||||
}
|
||||
|
||||
/* block scheduler */
|
||||
|
|
@ -86,11 +86,7 @@ static enum drm_gpu_sched_stat etnaviv_sched_timedout_job(struct drm_sched_job
|
|||
drm_sched_resubmit_jobs(&gpu->sched);
|
||||
|
||||
drm_sched_start(&gpu->sched, 0);
|
||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
||||
|
||||
out_no_timeout:
|
||||
list_add(&sched_job->list, &sched_job->sched->pending_list);
|
||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
||||
return DRM_GPU_SCHED_STAT_RESET;
|
||||
}
|
||||
|
||||
static void etnaviv_sched_free_job(struct drm_sched_job *sched_job)
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@ static const struct drm_framebuffer_funcs exynos_drm_fb_funcs = {
|
|||
|
||||
struct drm_framebuffer *
|
||||
exynos_drm_framebuffer_init(struct drm_device *dev,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct exynos_drm_gem **exynos_gem,
|
||||
int count)
|
||||
|
|
@ -76,7 +77,7 @@ exynos_drm_framebuffer_init(struct drm_device *dev,
|
|||
fb->obj[i] = &exynos_gem[i]->base;
|
||||
}
|
||||
|
||||
drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
|
||||
drm_helper_mode_fill_fb_struct(dev, fb, info, mode_cmd);
|
||||
|
||||
ret = drm_framebuffer_init(dev, fb, &exynos_drm_fb_funcs);
|
||||
if (ret < 0) {
|
||||
|
|
@ -94,9 +95,9 @@ 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,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
const struct drm_format_info *info = drm_get_format_info(dev, mode_cmd);
|
||||
struct exynos_drm_gem *exynos_gem[MAX_FB_BUFFER];
|
||||
struct drm_framebuffer *fb;
|
||||
int i;
|
||||
|
|
@ -124,7 +125,7 @@ exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
|
|||
}
|
||||
}
|
||||
|
||||
fb = exynos_drm_framebuffer_init(dev, mode_cmd, exynos_gem, i);
|
||||
fb = exynos_drm_framebuffer_init(dev, info, mode_cmd, exynos_gem, i);
|
||||
if (IS_ERR(fb)) {
|
||||
ret = PTR_ERR(fb);
|
||||
goto err;
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
|
||||
struct drm_framebuffer *
|
||||
exynos_drm_framebuffer_init(struct drm_device *dev,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct exynos_drm_gem **exynos_gem,
|
||||
int count);
|
||||
|
|
|
|||
|
|
@ -116,7 +116,10 @@ int exynos_drm_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,
|
|||
return PTR_ERR(exynos_gem);
|
||||
|
||||
helper->fb =
|
||||
exynos_drm_framebuffer_init(dev, &mode_cmd, &exynos_gem, 1);
|
||||
exynos_drm_framebuffer_init(dev,
|
||||
drm_get_format_info(dev, mode_cmd.pixel_format,
|
||||
mode_cmd.modifier[0]),
|
||||
&mode_cmd, &exynos_gem, 1);
|
||||
if (IS_ERR(helper->fb)) {
|
||||
DRM_DEV_ERROR(dev->dev, "failed to create drm framebuffer.\n");
|
||||
ret = PTR_ERR(helper->fb);
|
||||
|
|
|
|||
|
|
@ -203,7 +203,10 @@ int psb_fbdev_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
|
|||
return PTR_ERR(backing);
|
||||
obj = &backing->base;
|
||||
|
||||
fb = psb_framebuffer_create(dev, &mode_cmd, obj);
|
||||
fb = psb_framebuffer_create(dev,
|
||||
drm_get_format_info(dev, mode_cmd.pixel_format,
|
||||
mode_cmd.modifier[0]),
|
||||
&mode_cmd, obj);
|
||||
if (IS_ERR(fb)) {
|
||||
ret = PTR_ERR(fb);
|
||||
goto err_drm_gem_object_put;
|
||||
|
|
|
|||
|
|
@ -29,24 +29,23 @@ static const struct drm_framebuffer_funcs psb_fb_funcs = {
|
|||
*/
|
||||
static int psb_framebuffer_init(struct drm_device *dev,
|
||||
struct drm_framebuffer *fb,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj)
|
||||
{
|
||||
const struct drm_format_info *info;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* Reject unknown formats, YUV formats, and formats with more than
|
||||
* 4 bytes per pixel.
|
||||
*/
|
||||
info = drm_get_format_info(dev, mode_cmd);
|
||||
if (!info || !info->depth || info->cpp[0] > 4)
|
||||
if (!info->depth || info->cpp[0] > 4)
|
||||
return -EINVAL;
|
||||
|
||||
if (mode_cmd->pitches[0] & 63)
|
||||
return -EINVAL;
|
||||
|
||||
drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
|
||||
drm_helper_mode_fill_fb_struct(dev, fb, info, mode_cmd);
|
||||
fb->obj[0] = obj;
|
||||
ret = drm_framebuffer_init(dev, fb, &psb_fb_funcs);
|
||||
if (ret) {
|
||||
|
|
@ -59,6 +58,7 @@ static int psb_framebuffer_init(struct drm_device *dev,
|
|||
/**
|
||||
* psb_framebuffer_create - create a framebuffer backed by gt
|
||||
* @dev: our DRM device
|
||||
* @info: pixel format information
|
||||
* @mode_cmd: the description of the requested mode
|
||||
* @obj: the backing object
|
||||
*
|
||||
|
|
@ -68,6 +68,7 @@ static int psb_framebuffer_init(struct drm_device *dev,
|
|||
* TODO: review object references
|
||||
*/
|
||||
struct drm_framebuffer *psb_framebuffer_create(struct drm_device *dev,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj)
|
||||
{
|
||||
|
|
@ -78,7 +79,7 @@ struct drm_framebuffer *psb_framebuffer_create(struct drm_device *dev,
|
|||
if (!fb)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
ret = psb_framebuffer_init(dev, fb, mode_cmd, obj);
|
||||
ret = psb_framebuffer_init(dev, fb, info, mode_cmd, obj);
|
||||
if (ret) {
|
||||
kfree(fb);
|
||||
return ERR_PTR(ret);
|
||||
|
|
@ -96,6 +97,7 @@ struct drm_framebuffer *psb_framebuffer_create(struct drm_device *dev,
|
|||
*/
|
||||
static struct drm_framebuffer *psb_user_framebuffer_create
|
||||
(struct drm_device *dev, struct drm_file *filp,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *cmd)
|
||||
{
|
||||
struct drm_gem_object *obj;
|
||||
|
|
@ -110,7 +112,7 @@ static struct drm_framebuffer *psb_user_framebuffer_create
|
|||
return ERR_PTR(-ENOENT);
|
||||
|
||||
/* Let the core code do all the work */
|
||||
fb = psb_framebuffer_create(dev, cmd, obj);
|
||||
fb = psb_framebuffer_create(dev, info, cmd, obj);
|
||||
if (IS_ERR(fb))
|
||||
drm_gem_object_put(obj);
|
||||
|
||||
|
|
|
|||
|
|
@ -594,6 +594,7 @@ extern void psb_modeset_cleanup(struct drm_device *dev);
|
|||
|
||||
/* framebuffer */
|
||||
struct drm_framebuffer *psb_framebuffer_create(struct drm_device *dev,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object *obj);
|
||||
|
||||
|
|
|
|||
|
|
@ -422,21 +422,22 @@ unsigned int intel_fb_modifier_to_tiling(u64 fb_modifier)
|
|||
|
||||
/**
|
||||
* intel_fb_get_format_info: Get a modifier specific format information
|
||||
* @cmd: FB add command structure
|
||||
* @pixel_format: pixel format
|
||||
* @modifier: modifier
|
||||
*
|
||||
* Returns:
|
||||
* Returns the format information for @cmd->pixel_format specific to @cmd->modifier[0],
|
||||
* Returns the format information for @pixel_format specific to @modifier,
|
||||
* or %NULL if the modifier doesn't override the format.
|
||||
*/
|
||||
const struct drm_format_info *
|
||||
intel_fb_get_format_info(const struct drm_mode_fb_cmd2 *cmd)
|
||||
intel_fb_get_format_info(u32 pixel_format, u64 modifier)
|
||||
{
|
||||
const struct intel_modifier_desc *md = lookup_modifier_or_null(cmd->modifier[0]);
|
||||
const struct intel_modifier_desc *md = lookup_modifier_or_null(modifier);
|
||||
|
||||
if (!md || !md->formats)
|
||||
return NULL;
|
||||
|
||||
return lookup_format_info(md->formats, md->format_count, cmd->pixel_format);
|
||||
return lookup_format_info(md->formats, md->format_count, pixel_format);
|
||||
}
|
||||
|
||||
static bool plane_caps_contain_any(u8 caps, u8 mask)
|
||||
|
|
@ -2206,6 +2207,7 @@ static const struct drm_framebuffer_funcs intel_fb_funcs = {
|
|||
|
||||
int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
|
||||
struct drm_gem_object *obj,
|
||||
const struct drm_format_info *info,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(obj->dev);
|
||||
|
|
@ -2253,7 +2255,7 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
|
|||
goto err_frontbuffer_put;
|
||||
}
|
||||
|
||||
drm_helper_mode_fill_fb_struct(display->drm, fb, mode_cmd);
|
||||
drm_helper_mode_fill_fb_struct(display->drm, fb, info, mode_cmd);
|
||||
|
||||
for (i = 0; i < fb->format->num_planes; i++) {
|
||||
unsigned int stride_alignment;
|
||||
|
|
@ -2323,6 +2325,7 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
|
|||
struct drm_framebuffer *
|
||||
intel_user_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *filp,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *user_mode_cmd)
|
||||
{
|
||||
struct drm_framebuffer *fb;
|
||||
|
|
@ -2333,7 +2336,7 @@ intel_user_framebuffer_create(struct drm_device *dev,
|
|||
if (IS_ERR(obj))
|
||||
return ERR_CAST(obj);
|
||||
|
||||
fb = intel_framebuffer_create(obj, &mode_cmd);
|
||||
fb = intel_framebuffer_create(obj, info, &mode_cmd);
|
||||
drm_gem_object_put(obj);
|
||||
|
||||
return fb;
|
||||
|
|
@ -2341,6 +2344,7 @@ intel_user_framebuffer_create(struct drm_device *dev,
|
|||
|
||||
struct drm_framebuffer *
|
||||
intel_framebuffer_create(struct drm_gem_object *obj,
|
||||
const struct drm_format_info *info,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct intel_framebuffer *intel_fb;
|
||||
|
|
@ -2350,7 +2354,7 @@ intel_framebuffer_create(struct drm_gem_object *obj,
|
|||
if (!intel_fb)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
ret = intel_framebuffer_init(intel_fb, obj, mode_cmd);
|
||||
ret = intel_framebuffer_init(intel_fb, obj, info, mode_cmd);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ u64 *intel_fb_plane_get_modifiers(struct intel_display *display,
|
|||
bool intel_fb_plane_supports_modifier(struct intel_plane *plane, u64 modifier);
|
||||
|
||||
const struct drm_format_info *
|
||||
intel_fb_get_format_info(const struct drm_mode_fb_cmd2 *cmd);
|
||||
intel_fb_get_format_info(u32 pixel_format, u64 modifier);
|
||||
|
||||
bool
|
||||
intel_format_info_is_yuv_semiplanar(const struct drm_format_info *info,
|
||||
|
|
@ -102,13 +102,16 @@ void intel_add_fb_offsets(int *x, int *y,
|
|||
|
||||
int intel_framebuffer_init(struct intel_framebuffer *ifb,
|
||||
struct drm_gem_object *obj,
|
||||
const struct drm_format_info *info,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
struct drm_framebuffer *
|
||||
intel_framebuffer_create(struct drm_gem_object *obj,
|
||||
const struct drm_format_info *info,
|
||||
struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
struct drm_framebuffer *
|
||||
intel_user_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *filp,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *user_mode_cmd);
|
||||
|
||||
bool intel_fb_modifier_uses_dpt(struct intel_display *display, u64 modifier);
|
||||
|
|
|
|||
|
|
@ -62,7 +62,11 @@ struct intel_framebuffer *intel_fbdev_fb_alloc(struct drm_fb_helper *helper,
|
|||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
fb = intel_framebuffer_create(intel_bo_to_drm_bo(obj), &mode_cmd);
|
||||
fb = intel_framebuffer_create(intel_bo_to_drm_bo(obj),
|
||||
drm_get_format_info(display->drm,
|
||||
mode_cmd.pixel_format,
|
||||
mode_cmd.modifier[0]),
|
||||
&mode_cmd);
|
||||
i915_gem_object_put(obj);
|
||||
|
||||
return to_intel_framebuffer(fb);
|
||||
|
|
|
|||
|
|
@ -289,7 +289,8 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc,
|
|||
mode_cmd.flags = DRM_MODE_FB_MODIFIERS;
|
||||
|
||||
if (intel_framebuffer_init(to_intel_framebuffer(fb),
|
||||
intel_bo_to_drm_bo(vma->obj), &mode_cmd)) {
|
||||
intel_bo_to_drm_bo(vma->obj),
|
||||
fb->format, &mode_cmd)) {
|
||||
drm_dbg_kms(display->drm, "intel fb init failed\n");
|
||||
goto err_vma;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -803,7 +803,7 @@ static void pvr_queue_start(struct pvr_queue *queue)
|
|||
* the scheduler, and re-assign parent fences in the middle.
|
||||
*
|
||||
* Return:
|
||||
* * DRM_GPU_SCHED_STAT_NOMINAL.
|
||||
* * DRM_GPU_SCHED_STAT_RESET.
|
||||
*/
|
||||
static enum drm_gpu_sched_stat
|
||||
pvr_queue_timedout_job(struct drm_sched_job *s_job)
|
||||
|
|
@ -854,7 +854,7 @@ pvr_queue_timedout_job(struct drm_sched_job *s_job)
|
|||
|
||||
drm_sched_start(sched, 0);
|
||||
|
||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
||||
return DRM_GPU_SCHED_STAT_RESET;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -901,14 +901,15 @@ static void ingenic_drm_disable_vblank(struct drm_crtc *crtc)
|
|||
|
||||
static struct drm_framebuffer *
|
||||
ingenic_drm_gem_fb_create(struct drm_device *drm, struct drm_file *file,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct ingenic_drm *priv = drm_device_get_priv(drm);
|
||||
|
||||
if (priv->soc_info->map_noncoherent)
|
||||
return drm_gem_fb_create_with_dirty(drm, file, mode_cmd);
|
||||
return drm_gem_fb_create_with_dirty(drm, file, info, mode_cmd);
|
||||
|
||||
return drm_gem_fb_create(drm, file, mode_cmd);
|
||||
return drm_gem_fb_create(drm, file, info, mode_cmd);
|
||||
}
|
||||
|
||||
static struct drm_gem_object *
|
||||
|
|
|
|||
|
|
@ -412,7 +412,7 @@ static enum drm_gpu_sched_stat lima_sched_timedout_job(struct drm_sched_job *job
|
|||
*/
|
||||
if (dma_fence_is_signaled(task->fence)) {
|
||||
DRM_WARN("%s spurious timeout\n", lima_ip_name(ip));
|
||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
||||
return DRM_GPU_SCHED_STAT_RESET;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -429,7 +429,7 @@ static enum drm_gpu_sched_stat lima_sched_timedout_job(struct drm_sched_job *job
|
|||
|
||||
if (dma_fence_is_signaled(task->fence)) {
|
||||
DRM_WARN("%s unexpectedly high interrupt latency\n", lima_ip_name(ip));
|
||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
||||
return DRM_GPU_SCHED_STAT_RESET;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -467,7 +467,7 @@ static enum drm_gpu_sched_stat lima_sched_timedout_job(struct drm_sched_job *job
|
|||
drm_sched_resubmit_jobs(&pipe->base);
|
||||
drm_sched_start(&pipe->base, 0);
|
||||
|
||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
||||
return DRM_GPU_SCHED_STAT_RESET;
|
||||
}
|
||||
|
||||
static void lima_sched_free_job(struct drm_sched_job *job)
|
||||
|
|
|
|||
|
|
@ -2118,7 +2118,8 @@ static void mtk_dp_update_plugged_status(struct mtk_dp *mtk_dp)
|
|||
mutex_unlock(&mtk_dp->update_plugged_status_lock);
|
||||
}
|
||||
|
||||
static enum drm_connector_status mtk_dp_bdg_detect(struct drm_bridge *bridge)
|
||||
static enum drm_connector_status
|
||||
mtk_dp_bdg_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct mtk_dp *mtk_dp = mtk_dp_from_bridge(bridge);
|
||||
enum drm_connector_status ret = connector_status_disconnected;
|
||||
|
|
|
|||
|
|
@ -43,14 +43,13 @@ static const struct drm_mode_config_helper_funcs mtk_drm_mode_config_helpers = {
|
|||
static struct drm_framebuffer *
|
||||
mtk_drm_mode_fb_create(struct drm_device *dev,
|
||||
struct drm_file *file,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *cmd)
|
||||
{
|
||||
const struct drm_format_info *info = drm_get_format_info(dev, cmd);
|
||||
|
||||
if (info->num_planes != 1)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
return drm_gem_fb_create(dev, file, cmd);
|
||||
return drm_gem_fb_create(dev, file, info, cmd);
|
||||
}
|
||||
|
||||
static const struct drm_mode_config_funcs mtk_drm_mode_config_funcs = {
|
||||
|
|
|
|||
|
|
@ -1174,7 +1174,8 @@ static void mtk_hdmi_hpd_event(bool hpd, struct device *dev)
|
|||
* Bridge callbacks
|
||||
*/
|
||||
|
||||
static enum drm_connector_status mtk_hdmi_bridge_detect(struct drm_bridge *bridge)
|
||||
static enum drm_connector_status
|
||||
mtk_hdmi_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct mtk_hdmi *hdmi = hdmi_ctx_from_bridge(bridge);
|
||||
|
||||
|
|
|
|||
|
|
@ -265,8 +265,8 @@ static struct msm_dp_audio_private *msm_dp_audio_get_data(struct msm_dp *msm_dp_
|
|||
return container_of(msm_dp_audio, struct msm_dp_audio_private, msm_dp_audio);
|
||||
}
|
||||
|
||||
int msm_dp_audio_prepare(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge,
|
||||
int msm_dp_audio_prepare(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector,
|
||||
struct hdmi_codec_daifmt *daifmt,
|
||||
struct hdmi_codec_params *params)
|
||||
{
|
||||
|
|
@ -308,8 +308,8 @@ int msm_dp_audio_prepare(struct drm_connector *connector,
|
|||
return rc;
|
||||
}
|
||||
|
||||
void msm_dp_audio_shutdown(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge)
|
||||
void msm_dp_audio_shutdown(struct drm_bridge *bridge,
|
||||
struct drm_connector *connecter)
|
||||
{
|
||||
struct msm_dp_audio_private *audio;
|
||||
struct msm_dp *msm_dp_display;
|
||||
|
|
|
|||
|
|
@ -45,12 +45,12 @@ struct msm_dp_audio *msm_dp_audio_get(struct platform_device *pdev,
|
|||
*/
|
||||
void msm_dp_audio_put(struct msm_dp_audio *msm_dp_audio);
|
||||
|
||||
int msm_dp_audio_prepare(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge,
|
||||
int msm_dp_audio_prepare(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector,
|
||||
struct hdmi_codec_daifmt *daifmt,
|
||||
struct hdmi_codec_params *params);
|
||||
void msm_dp_audio_shutdown(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge);
|
||||
void msm_dp_audio_shutdown(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector);
|
||||
|
||||
#endif /* _DP_AUDIO_H_ */
|
||||
|
||||
|
|
|
|||
|
|
@ -20,7 +20,8 @@
|
|||
* @bridge: Pointer to drm bridge structure
|
||||
* Returns: Bridge's 'is connected' status
|
||||
*/
|
||||
static enum drm_connector_status msm_dp_bridge_detect(struct drm_bridge *bridge)
|
||||
static enum drm_connector_status
|
||||
msm_dp_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct msm_dp *dp;
|
||||
|
||||
|
|
|
|||
|
|
@ -200,12 +200,12 @@ struct hdmi_codec_daifmt;
|
|||
struct hdmi_codec_params;
|
||||
|
||||
int msm_hdmi_audio_update(struct hdmi *hdmi);
|
||||
int msm_hdmi_bridge_audio_prepare(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge,
|
||||
int msm_hdmi_bridge_audio_prepare(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector,
|
||||
struct hdmi_codec_daifmt *daifmt,
|
||||
struct hdmi_codec_params *params);
|
||||
void msm_hdmi_bridge_audio_shutdown(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge);
|
||||
void msm_hdmi_bridge_audio_shutdown(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector);
|
||||
|
||||
/*
|
||||
* hdmi bridge:
|
||||
|
|
@ -215,7 +215,7 @@ int msm_hdmi_bridge_init(struct hdmi *hdmi);
|
|||
|
||||
void msm_hdmi_hpd_irq(struct drm_bridge *bridge);
|
||||
enum drm_connector_status msm_hdmi_bridge_detect(
|
||||
struct drm_bridge *bridge);
|
||||
struct drm_bridge *bridge, struct drm_connector *connector);
|
||||
void msm_hdmi_hpd_enable(struct drm_bridge *bridge);
|
||||
void msm_hdmi_hpd_disable(struct drm_bridge *bridge);
|
||||
|
||||
|
|
|
|||
|
|
@ -122,8 +122,8 @@ int msm_hdmi_audio_update(struct hdmi *hdmi)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int msm_hdmi_bridge_audio_prepare(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge,
|
||||
int msm_hdmi_bridge_audio_prepare(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector,
|
||||
struct hdmi_codec_daifmt *daifmt,
|
||||
struct hdmi_codec_params *params)
|
||||
{
|
||||
|
|
@ -163,8 +163,8 @@ int msm_hdmi_bridge_audio_prepare(struct drm_connector *connector,
|
|||
return msm_hdmi_audio_update(hdmi);
|
||||
}
|
||||
|
||||
void msm_hdmi_bridge_audio_shutdown(struct drm_connector *connector,
|
||||
struct drm_bridge *bridge)
|
||||
void msm_hdmi_bridge_audio_shutdown(struct drm_bridge *bridge,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge);
|
||||
struct hdmi *hdmi = hdmi_bridge->hdmi;
|
||||
|
|
|
|||
|
|
@ -475,7 +475,7 @@ msm_hdmi_hotplug_work(struct work_struct *work)
|
|||
container_of(work, struct hdmi_bridge, hpd_work);
|
||||
struct drm_bridge *bridge = &hdmi_bridge->base;
|
||||
|
||||
drm_bridge_hpd_notify(bridge, drm_bridge_detect(bridge));
|
||||
drm_bridge_hpd_notify(bridge, drm_bridge_detect(bridge, hdmi_bridge->hdmi->connector));
|
||||
}
|
||||
|
||||
/* initialize bridge */
|
||||
|
|
|
|||
|
|
@ -177,8 +177,8 @@ static enum drm_connector_status detect_gpio(struct hdmi *hdmi)
|
|||
connector_status_disconnected;
|
||||
}
|
||||
|
||||
enum drm_connector_status msm_hdmi_bridge_detect(
|
||||
struct drm_bridge *bridge)
|
||||
enum drm_connector_status
|
||||
msm_hdmi_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector)
|
||||
{
|
||||
struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge);
|
||||
struct hdmi *hdmi = hdmi_bridge->hdmi;
|
||||
|
|
|
|||
|
|
@ -260,7 +260,8 @@ uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb, 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_create(struct drm_device *dev,
|
||||
struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
struct drm_file *file, const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
struct drm_framebuffer * msm_alloc_stolen_fb(struct drm_device *dev,
|
||||
int w, int h, int p, uint32_t format);
|
||||
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ struct msm_framebuffer {
|
|||
#define to_msm_framebuffer(x) container_of(x, struct msm_framebuffer, base)
|
||||
|
||||
static struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
|
||||
|
||||
static int msm_framebuffer_dirtyfb(struct drm_framebuffer *fb,
|
||||
|
|
@ -139,10 +140,9 @@ 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, const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
struct drm_file *file, const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
const struct drm_format_info *info = drm_get_format_info(dev,
|
||||
mode_cmd);
|
||||
struct drm_gem_object *bos[4] = {0};
|
||||
struct drm_framebuffer *fb;
|
||||
int ret, i, n = info->num_planes;
|
||||
|
|
@ -155,7 +155,7 @@ struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
|
|||
}
|
||||
}
|
||||
|
||||
fb = msm_framebuffer_init(dev, mode_cmd, bos);
|
||||
fb = msm_framebuffer_init(dev, info, mode_cmd, bos);
|
||||
if (IS_ERR(fb)) {
|
||||
ret = PTR_ERR(fb);
|
||||
goto out_unref;
|
||||
|
|
@ -170,10 +170,9 @@ struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
|
|||
}
|
||||
|
||||
static struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
|
||||
{
|
||||
const struct drm_format_info *info = drm_get_format_info(dev,
|
||||
mode_cmd);
|
||||
struct msm_drm_private *priv = dev->dev_private;
|
||||
struct msm_kms *kms = priv->kms;
|
||||
struct msm_framebuffer *msm_fb = NULL;
|
||||
|
|
@ -227,7 +226,7 @@ static struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
|
|||
msm_fb->base.obj[i] = bos[i];
|
||||
}
|
||||
|
||||
drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
|
||||
drm_helper_mode_fill_fb_struct(dev, fb, info, mode_cmd);
|
||||
|
||||
ret = drm_framebuffer_init(dev, fb, &msm_framebuffer_funcs);
|
||||
if (ret) {
|
||||
|
|
@ -276,7 +275,10 @@ msm_alloc_stolen_fb(struct drm_device *dev, int w, int h, int p, uint32_t format
|
|||
|
||||
msm_gem_object_set_name(bo, "stolenfb");
|
||||
|
||||
fb = msm_framebuffer_init(dev, &mode_cmd, &bo);
|
||||
fb = msm_framebuffer_init(dev,
|
||||
drm_get_format_info(dev, mode_cmd.pixel_format,
|
||||
mode_cmd.modifier[0]),
|
||||
&mode_cmd, &bo);
|
||||
if (IS_ERR(fb)) {
|
||||
DRM_DEV_ERROR(dev->dev, "failed to allocate fb\n");
|
||||
/* note: if fb creation failed, we can't rely on fb destroy
|
||||
|
|
|
|||
|
|
@ -91,20 +91,15 @@ void mxsfb_disable_axi_clk(struct mxsfb_drm_private *mxsfb)
|
|||
|
||||
static struct drm_framebuffer *
|
||||
mxsfb_fb_create(struct drm_device *dev, struct drm_file *file_priv,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
const struct drm_format_info *info;
|
||||
|
||||
info = drm_get_format_info(dev, mode_cmd);
|
||||
if (!info)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
if (mode_cmd->width * info->cpp[0] != mode_cmd->pitches[0]) {
|
||||
dev_dbg(dev->dev, "Invalid pitch: fb width must match pitch\n");
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
return drm_gem_fb_create(dev, file_priv, mode_cmd);
|
||||
return drm_gem_fb_create(dev, file_priv, info, mode_cmd);
|
||||
}
|
||||
|
||||
static const struct drm_mode_config_funcs mxsfb_mode_config_funcs = {
|
||||
|
|
|
|||
|
|
@ -295,7 +295,8 @@ nouveau_framebuffer_new(struct drm_device *dev,
|
|||
kind = nvbo->kind;
|
||||
}
|
||||
|
||||
info = drm_get_format_info(dev, mode_cmd);
|
||||
info = drm_get_format_info(dev, mode_cmd->pixel_format,
|
||||
mode_cmd->modifier[0]);
|
||||
|
||||
for (i = 0; i < info->num_planes; i++) {
|
||||
height = drm_format_info_plane_height(info,
|
||||
|
|
@ -320,7 +321,7 @@ nouveau_framebuffer_new(struct drm_device *dev,
|
|||
if (!(fb = *pfb = kzalloc(sizeof(*fb), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
|
||||
drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
|
||||
drm_helper_mode_fill_fb_struct(dev, fb, NULL, mode_cmd);
|
||||
fb->obj[0] = gem;
|
||||
|
||||
ret = drm_framebuffer_init(dev, fb, &nouveau_framebuffer_funcs);
|
||||
|
|
@ -332,6 +333,7 @@ nouveau_framebuffer_new(struct drm_device *dev,
|
|||
struct drm_framebuffer *
|
||||
nouveau_user_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *file_priv,
|
||||
const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
struct drm_framebuffer *fb;
|
||||
|
|
|
|||
|
|
@ -67,5 +67,6 @@ nouveau_framebuffer_get_layout(struct drm_framebuffer *fb, uint32_t *tile_mode,
|
|||
|
||||
struct drm_framebuffer *
|
||||
nouveau_user_framebuffer_create(struct drm_device *, struct drm_file *,
|
||||
const struct drm_format_info *,
|
||||
const struct drm_mode_fb_cmd2 *);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -189,7 +189,7 @@ nouveau_exec_job_timeout(struct nouveau_job *job)
|
|||
NV_PRINTK(warn, job->cli, "job timeout, channel %d killed!\n",
|
||||
chan->chid);
|
||||
|
||||
return DRM_GPU_SCHED_STAT_NOMINAL;
|
||||
return DRM_GPU_SCHED_STAT_RESET;
|
||||
}
|
||||
|
||||
static const struct nouveau_job_ops nouveau_exec_job_ops = {
|
||||
|
|
|
|||
|
|
@ -38,12 +38,6 @@
|
|||
static const struct dma_fence_ops nouveau_fence_ops_uevent;
|
||||
static const struct dma_fence_ops nouveau_fence_ops_legacy;
|
||||
|
||||
static inline struct nouveau_fence *
|
||||
from_fence(struct dma_fence *fence)
|
||||
{
|
||||
return container_of(fence, struct nouveau_fence, base);
|
||||
}
|
||||
|
||||
static inline struct nouveau_fence_chan *
|
||||
nouveau_fctx(struct nouveau_fence *fence)
|
||||
{
|
||||
|
|
@ -77,7 +71,7 @@ nouveau_local_fence(struct dma_fence *fence, struct nouveau_drm *drm)
|
|||
fence->ops != &nouveau_fence_ops_uevent)
|
||||
return NULL;
|
||||
|
||||
return from_fence(fence);
|
||||
return to_nouveau_fence(fence);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -246,6 +240,21 @@ nouveau_fence_emit(struct nouveau_fence *fence)
|
|||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
nouveau_fence_cancel(struct nouveau_fence *fence)
|
||||
{
|
||||
struct nouveau_fence_chan *fctx = nouveau_fctx(fence);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&fctx->lock, flags);
|
||||
if (!dma_fence_is_signaled_locked(&fence->base)) {
|
||||
dma_fence_set_error(&fence->base, -ECANCELED);
|
||||
if (nouveau_fence_signal(fence))
|
||||
nvif_event_block(&fctx->event);
|
||||
}
|
||||
spin_unlock_irqrestore(&fctx->lock, flags);
|
||||
}
|
||||
|
||||
bool
|
||||
nouveau_fence_done(struct nouveau_fence *fence)
|
||||
{
|
||||
|
|
@ -268,7 +277,7 @@ nouveau_fence_done(struct nouveau_fence *fence)
|
|||
static long
|
||||
nouveau_fence_wait_legacy(struct dma_fence *f, bool intr, long wait)
|
||||
{
|
||||
struct nouveau_fence *fence = from_fence(f);
|
||||
struct nouveau_fence *fence = to_nouveau_fence(f);
|
||||
unsigned long sleep_time = NSEC_PER_MSEC / 1000;
|
||||
unsigned long t = jiffies, timeout = t + wait;
|
||||
|
||||
|
|
@ -448,7 +457,7 @@ static const char *nouveau_fence_get_get_driver_name(struct dma_fence *fence)
|
|||
|
||||
static const char *nouveau_fence_get_timeline_name(struct dma_fence *f)
|
||||
{
|
||||
struct nouveau_fence *fence = from_fence(f);
|
||||
struct nouveau_fence *fence = to_nouveau_fence(f);
|
||||
struct nouveau_fence_chan *fctx = nouveau_fctx(fence);
|
||||
|
||||
return !fctx->dead ? fctx->name : "dead channel";
|
||||
|
|
@ -462,7 +471,7 @@ static const char *nouveau_fence_get_timeline_name(struct dma_fence *f)
|
|||
*/
|
||||
static bool nouveau_fence_is_signaled(struct dma_fence *f)
|
||||
{
|
||||
struct nouveau_fence *fence = from_fence(f);
|
||||
struct nouveau_fence *fence = to_nouveau_fence(f);
|
||||
struct nouveau_fence_chan *fctx = nouveau_fctx(fence);
|
||||
struct nouveau_channel *chan;
|
||||
bool ret = false;
|
||||
|
|
@ -478,7 +487,7 @@ static bool nouveau_fence_is_signaled(struct dma_fence *f)
|
|||
|
||||
static bool nouveau_fence_no_signaling(struct dma_fence *f)
|
||||
{
|
||||
struct nouveau_fence *fence = from_fence(f);
|
||||
struct nouveau_fence *fence = to_nouveau_fence(f);
|
||||
|
||||
/*
|
||||
* caller should have a reference on the fence,
|
||||
|
|
@ -503,7 +512,7 @@ static bool nouveau_fence_no_signaling(struct dma_fence *f)
|
|||
|
||||
static void nouveau_fence_release(struct dma_fence *f)
|
||||
{
|
||||
struct nouveau_fence *fence = from_fence(f);
|
||||
struct nouveau_fence *fence = to_nouveau_fence(f);
|
||||
struct nouveau_fence_chan *fctx = nouveau_fctx(fence);
|
||||
|
||||
kref_put(&fctx->fence_ref, nouveau_fence_context_put);
|
||||
|
|
@ -521,7 +530,7 @@ static const struct dma_fence_ops nouveau_fence_ops_legacy = {
|
|||
|
||||
static bool nouveau_fence_enable_signaling(struct dma_fence *f)
|
||||
{
|
||||
struct nouveau_fence *fence = from_fence(f);
|
||||
struct nouveau_fence *fence = to_nouveau_fence(f);
|
||||
struct nouveau_fence_chan *fctx = nouveau_fctx(fence);
|
||||
bool ret;
|
||||
|
||||
|
|
|
|||
|
|
@ -17,12 +17,19 @@ struct nouveau_fence {
|
|||
unsigned long timeout;
|
||||
};
|
||||
|
||||
static inline struct nouveau_fence *
|
||||
to_nouveau_fence(struct dma_fence *fence)
|
||||
{
|
||||
return container_of(fence, struct nouveau_fence, base);
|
||||
}
|
||||
|
||||
int nouveau_fence_create(struct nouveau_fence **, struct nouveau_channel *);
|
||||
int nouveau_fence_new(struct nouveau_fence **, struct nouveau_channel *);
|
||||
void nouveau_fence_unref(struct nouveau_fence **);
|
||||
|
||||
int nouveau_fence_emit(struct nouveau_fence *);
|
||||
bool nouveau_fence_done(struct nouveau_fence *);
|
||||
void nouveau_fence_cancel(struct nouveau_fence *fence);
|
||||
int nouveau_fence_wait(struct nouveau_fence *, bool lazy, bool intr);
|
||||
int nouveau_fence_sync(struct nouveau_bo *, struct nouveau_channel *, bool exclusive, bool intr);
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
#include "nouveau_exec.h"
|
||||
#include "nouveau_abi16.h"
|
||||
#include "nouveau_sched.h"
|
||||
#include "nouveau_chan.h"
|
||||
|
||||
#define NOUVEAU_SCHED_JOB_TIMEOUT_MS 10000
|
||||
|
||||
|
|
@ -121,11 +122,9 @@ nouveau_job_done(struct nouveau_job *job)
|
|||
{
|
||||
struct nouveau_sched *sched = job->sched;
|
||||
|
||||
spin_lock(&sched->job.list.lock);
|
||||
spin_lock(&sched->job_list.lock);
|
||||
list_del(&job->entry);
|
||||
spin_unlock(&sched->job.list.lock);
|
||||
|
||||
wake_up(&sched->job.wq);
|
||||
spin_unlock(&sched->job_list.lock);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -306,9 +305,9 @@ nouveau_job_submit(struct nouveau_job *job)
|
|||
}
|
||||
|
||||
/* Submit was successful; add the job to the schedulers job list. */
|
||||
spin_lock(&sched->job.list.lock);
|
||||
list_add(&job->entry, &sched->job.list.head);
|
||||
spin_unlock(&sched->job.list.lock);
|
||||
spin_lock(&sched->job_list.lock);
|
||||
list_add(&job->entry, &sched->job_list.head);
|
||||
spin_unlock(&sched->job_list.lock);
|
||||
|
||||
drm_sched_job_arm(&job->base);
|
||||
job->done_fence = dma_fence_get(&job->base.s_fence->finished);
|
||||
|
|
@ -371,7 +370,7 @@ nouveau_sched_timedout_job(struct drm_sched_job *sched_job)
|
|||
{
|
||||
struct drm_gpu_scheduler *sched = sched_job->sched;
|
||||
struct nouveau_job *job = to_nouveau_job(sched_job);
|
||||
enum drm_gpu_sched_stat stat = DRM_GPU_SCHED_STAT_NOMINAL;
|
||||
enum drm_gpu_sched_stat stat = DRM_GPU_SCHED_STAT_RESET;
|
||||
|
||||
drm_sched_stop(sched, sched_job);
|
||||
|
||||
|
|
@ -393,10 +392,23 @@ nouveau_sched_free_job(struct drm_sched_job *sched_job)
|
|||
nouveau_job_fini(job);
|
||||
}
|
||||
|
||||
static void
|
||||
nouveau_sched_cancel_job(struct drm_sched_job *sched_job)
|
||||
{
|
||||
struct nouveau_fence *fence;
|
||||
struct nouveau_job *job;
|
||||
|
||||
job = to_nouveau_job(sched_job);
|
||||
fence = to_nouveau_fence(job->done_fence);
|
||||
|
||||
nouveau_fence_cancel(fence);
|
||||
}
|
||||
|
||||
static const struct drm_sched_backend_ops nouveau_sched_ops = {
|
||||
.run_job = nouveau_sched_run_job,
|
||||
.timedout_job = nouveau_sched_timedout_job,
|
||||
.free_job = nouveau_sched_free_job,
|
||||
.cancel_job = nouveau_sched_cancel_job,
|
||||
};
|
||||
|
||||
static int
|
||||
|
|
@ -446,9 +458,8 @@ nouveau_sched_init(struct nouveau_sched *sched, struct nouveau_drm *drm,
|
|||
goto fail_sched;
|
||||
|
||||
mutex_init(&sched->mutex);
|
||||
spin_lock_init(&sched->job.list.lock);
|
||||
INIT_LIST_HEAD(&sched->job.list.head);
|
||||
init_waitqueue_head(&sched->job.wq);
|
||||
spin_lock_init(&sched->job_list.lock);
|
||||
INIT_LIST_HEAD(&sched->job_list.head);
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
@ -482,16 +493,12 @@ nouveau_sched_create(struct nouveau_sched **psched, struct nouveau_drm *drm,
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
nouveau_sched_fini(struct nouveau_sched *sched)
|
||||
{
|
||||
struct drm_gpu_scheduler *drm_sched = &sched->base;
|
||||
struct drm_sched_entity *entity = &sched->entity;
|
||||
|
||||
rmb(); /* for list_empty to work without lock */
|
||||
wait_event(sched->job.wq, list_empty(&sched->job.list.head));
|
||||
|
||||
drm_sched_entity_fini(entity);
|
||||
drm_sched_fini(drm_sched);
|
||||
|
||||
|
|
|
|||
|
|
@ -103,12 +103,9 @@ struct nouveau_sched {
|
|||
struct mutex mutex;
|
||||
|
||||
struct {
|
||||
struct {
|
||||
struct list_head head;
|
||||
spinlock_t lock;
|
||||
} list;
|
||||
struct wait_queue_head wq;
|
||||
} job;
|
||||
struct list_head head;
|
||||
spinlock_t lock;
|
||||
} job_list;
|
||||
};
|
||||
|
||||
int nouveau_sched_create(struct nouveau_sched **psched, struct nouveau_drm *drm,
|
||||
|
|
|
|||
|
|
@ -1019,8 +1019,8 @@ bind_validate_map_sparse(struct nouveau_job *job, u64 addr, u64 range)
|
|||
u64 end = addr + range;
|
||||
|
||||
again:
|
||||
spin_lock(&sched->job.list.lock);
|
||||
list_for_each_entry(__job, &sched->job.list.head, entry) {
|
||||
spin_lock(&sched->job_list.lock);
|
||||
list_for_each_entry(__job, &sched->job_list.head, entry) {
|
||||
struct nouveau_uvmm_bind_job *bind_job = to_uvmm_bind_job(__job);
|
||||
|
||||
list_for_each_op(op, &bind_job->ops) {
|
||||
|
|
@ -1030,7 +1030,7 @@ bind_validate_map_sparse(struct nouveau_job *job, u64 addr, u64 range)
|
|||
|
||||
if (!(end <= op_addr || addr >= op_end)) {
|
||||
nouveau_uvmm_bind_job_get(bind_job);
|
||||
spin_unlock(&sched->job.list.lock);
|
||||
spin_unlock(&sched->job_list.lock);
|
||||
wait_for_completion(&bind_job->complete);
|
||||
nouveau_uvmm_bind_job_put(bind_job);
|
||||
goto again;
|
||||
|
|
@ -1038,7 +1038,7 @@ bind_validate_map_sparse(struct nouveau_job *job, u64 addr, u64 range)
|
|||
}
|
||||
}
|
||||
}
|
||||
spin_unlock(&sched->job.list.lock);
|
||||
spin_unlock(&sched->job_list.lock);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
|||
|
|
@ -335,10 +335,9 @@ 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, const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
struct drm_file *file, const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd)
|
||||
{
|
||||
const struct drm_format_info *info = drm_get_format_info(dev,
|
||||
mode_cmd);
|
||||
unsigned int num_planes = info->num_planes;
|
||||
struct drm_gem_object *bos[4];
|
||||
struct drm_framebuffer *fb;
|
||||
|
|
@ -378,7 +377,8 @@ struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
|
|||
dev, mode_cmd, mode_cmd->width, mode_cmd->height,
|
||||
(char *)&mode_cmd->pixel_format);
|
||||
|
||||
format = drm_get_format_info(dev, mode_cmd);
|
||||
format = drm_get_format_info(dev, mode_cmd->pixel_format,
|
||||
mode_cmd->modifier[0]);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(formats); i++) {
|
||||
if (formats[i] == mode_cmd->pixel_format)
|
||||
|
|
@ -440,7 +440,7 @@ struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
|
|||
plane->dma_addr = 0;
|
||||
}
|
||||
|
||||
drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
|
||||
drm_helper_mode_fill_fb_struct(dev, fb, NULL, mode_cmd);
|
||||
|
||||
ret = drm_framebuffer_init(dev, fb, &omap_framebuffer_funcs);
|
||||
if (ret) {
|
||||
|
|
|
|||
|
|
@ -20,7 +20,8 @@ struct omap_overlay_info;
|
|||
struct seq_file;
|
||||
|
||||
struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
struct drm_file *file, const struct drm_format_info *info,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd);
|
||||
struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
|
||||
const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
|
||||
int omap_framebuffer_pin(struct drm_framebuffer *fb);
|
||||
|
|
|
|||
|
|
@ -847,9 +847,6 @@ static int panel_add(struct panel_info *pinfo)
|
|||
"failed to get enable gpio\n");
|
||||
}
|
||||
|
||||
drm_panel_init(&pinfo->base, dev, &panel_funcs,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
ret = drm_panel_of_backlight(&pinfo->base);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
@ -865,9 +862,11 @@ static int panel_probe(struct mipi_dsi_device *dsi)
|
|||
const struct panel_desc *desc;
|
||||
int err;
|
||||
|
||||
pinfo = devm_kzalloc(&dsi->dev, sizeof(*pinfo), GFP_KERNEL);
|
||||
if (!pinfo)
|
||||
return -ENOMEM;
|
||||
pinfo = devm_drm_panel_alloc(&dsi->dev, __typeof(*pinfo), base,
|
||||
&panel_funcs, DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
if (IS_ERR(pinfo))
|
||||
return PTR_ERR(pinfo);
|
||||
|
||||
desc = of_device_get_match_data(&dsi->dev);
|
||||
dsi->mode_flags = desc->mode_flags;
|
||||
|
|
|
|||
|
|
@ -1720,8 +1720,6 @@ static int boe_panel_add(struct boe_panel *boe)
|
|||
|
||||
boe->base.prepare_prev_first = true;
|
||||
|
||||
drm_panel_init(&boe->base, dev, &boe_panel_funcs,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
err = of_drm_get_panel_orientation(dev->of_node, &boe->orientation);
|
||||
if (err < 0) {
|
||||
dev_err(dev, "%pOF: failed to get orientation %d\n", dev->of_node, err);
|
||||
|
|
@ -1746,9 +1744,11 @@ static int boe_panel_probe(struct mipi_dsi_device *dsi)
|
|||
int ret;
|
||||
const struct panel_desc *desc;
|
||||
|
||||
boe = devm_kzalloc(&dsi->dev, sizeof(*boe), GFP_KERNEL);
|
||||
if (!boe)
|
||||
return -ENOMEM;
|
||||
boe = devm_drm_panel_alloc(&dsi->dev, __typeof(*boe), base,
|
||||
&boe_panel_funcs, DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
if (IS_ERR(boe))
|
||||
return PTR_ERR(boe);
|
||||
|
||||
desc = of_device_get_match_data(&dsi->dev);
|
||||
dsi->lanes = desc->lanes;
|
||||
|
|
|
|||
|
|
@ -1939,6 +1939,7 @@ static const struct edp_panel_entry edp_panels[] = {
|
|||
EDP_PANEL_ENTRY('B', 'O', 'E', 0x0ac5, &delay_200_500_e50, "NV116WHM-N4C"),
|
||||
EDP_PANEL_ENTRY('B', 'O', 'E', 0x0ae8, &delay_200_500_e50_p2e80, "NV140WUM-N41"),
|
||||
EDP_PANEL_ENTRY('B', 'O', 'E', 0x0b09, &delay_200_500_e50_po2e200, "NV140FHM-NZ"),
|
||||
EDP_PANEL_ENTRY('B', 'O', 'E', 0x0b1e, &delay_200_500_e80, "NE140QDM-N6A"),
|
||||
EDP_PANEL_ENTRY('B', 'O', 'E', 0x0b34, &delay_200_500_e80, "NV122WUM-N41"),
|
||||
EDP_PANEL_ENTRY('B', 'O', 'E', 0x0b43, &delay_200_500_e200, "NV140FHM-T09"),
|
||||
EDP_PANEL_ENTRY('B', 'O', 'E', 0x0b56, &delay_200_500_e80, "NT140FHM-N47"),
|
||||
|
|
|
|||
|
|
@ -989,8 +989,6 @@ static int hx83102_panel_add(struct hx83102 *ctx)
|
|||
|
||||
ctx->base.prepare_prev_first = true;
|
||||
|
||||
drm_panel_init(&ctx->base, dev, &hx83102_drm_funcs,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
err = of_drm_get_panel_orientation(dev->of_node, &ctx->orientation);
|
||||
if (err < 0)
|
||||
return dev_err_probe(dev, err, "failed to get orientation\n");
|
||||
|
|
@ -1013,9 +1011,11 @@ static int hx83102_probe(struct mipi_dsi_device *dsi)
|
|||
int ret;
|
||||
const struct hx83102_panel_desc *desc;
|
||||
|
||||
ctx = devm_kzalloc(&dsi->dev, sizeof(*ctx), GFP_KERNEL);
|
||||
if (!ctx)
|
||||
return -ENOMEM;
|
||||
ctx = devm_drm_panel_alloc(&dsi->dev, __typeof(*ctx), base,
|
||||
&hx83102_drm_funcs, DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
if (IS_ERR(ctx))
|
||||
return PTR_ERR(ctx);
|
||||
|
||||
desc = of_device_get_match_data(&dsi->dev);
|
||||
dsi->lanes = 4;
|
||||
|
|
|
|||
|
|
@ -614,8 +614,6 @@ static int ili9882t_add(struct ili9882t *ili)
|
|||
|
||||
gpiod_set_value(ili->enable_gpio, 0);
|
||||
|
||||
drm_panel_init(&ili->base, dev, &ili9882t_funcs,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
err = of_drm_get_panel_orientation(dev->of_node, &ili->orientation);
|
||||
if (err < 0) {
|
||||
dev_err(dev, "%pOF: failed to get orientation %d\n", dev->of_node, err);
|
||||
|
|
@ -640,9 +638,11 @@ static int ili9882t_probe(struct mipi_dsi_device *dsi)
|
|||
int ret;
|
||||
const struct panel_desc *desc;
|
||||
|
||||
ili = devm_kzalloc(&dsi->dev, sizeof(*ili), GFP_KERNEL);
|
||||
if (!ili)
|
||||
return -ENOMEM;
|
||||
ili = devm_drm_panel_alloc(&dsi->dev, __typeof(*ili), base,
|
||||
&ili9882t_funcs, DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
if (IS_ERR(ili))
|
||||
return PTR_ERR(ili);
|
||||
|
||||
desc = of_device_get_match_data(&dsi->dev);
|
||||
dsi->lanes = desc->lanes;
|
||||
|
|
|
|||
|
|
@ -435,9 +435,6 @@ static int jdi_panel_add(struct jdi_panel *jdi)
|
|||
return dev_err_probe(dev, PTR_ERR(jdi->backlight),
|
||||
"failed to create backlight\n");
|
||||
|
||||
drm_panel_init(&jdi->base, &jdi->link1->dev, &jdi_panel_funcs,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
drm_panel_add(&jdi->base);
|
||||
|
||||
return 0;
|
||||
|
|
@ -475,10 +472,13 @@ static int jdi_panel_dsi_probe(struct mipi_dsi_device *dsi)
|
|||
|
||||
/* register a panel for only the DSI-LINK1 interface */
|
||||
if (secondary) {
|
||||
jdi = devm_kzalloc(&dsi->dev, sizeof(*jdi), GFP_KERNEL);
|
||||
if (!jdi) {
|
||||
jdi = devm_drm_panel_alloc(&dsi->dev, __typeof(*jdi),
|
||||
base, &jdi_panel_funcs,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
if (IS_ERR(jdi)) {
|
||||
put_device(&secondary->dev);
|
||||
return -ENOMEM;
|
||||
return PTR_ERR(jdi);
|
||||
}
|
||||
|
||||
mipi_dsi_set_drvdata(dsi, jdi);
|
||||
|
|
|
|||
|
|
@ -402,9 +402,6 @@ static int jdi_panel_add(struct jdi_panel *jdi)
|
|||
return dev_err_probe(dev, PTR_ERR(jdi->backlight),
|
||||
"failed to register backlight %d\n", ret);
|
||||
|
||||
drm_panel_init(&jdi->base, &jdi->dsi->dev, &jdi_panel_funcs,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
drm_panel_add(&jdi->base);
|
||||
|
||||
return 0;
|
||||
|
|
@ -426,9 +423,11 @@ static int jdi_panel_probe(struct mipi_dsi_device *dsi)
|
|||
dsi->mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO |
|
||||
MIPI_DSI_CLOCK_NON_CONTINUOUS;
|
||||
|
||||
jdi = devm_kzalloc(&dsi->dev, sizeof(*jdi), GFP_KERNEL);
|
||||
if (!jdi)
|
||||
return -ENOMEM;
|
||||
jdi = devm_drm_panel_alloc(&dsi->dev, __typeof(*jdi), base,
|
||||
&jdi_panel_funcs, DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
if (IS_ERR(jdi))
|
||||
return PTR_ERR(jdi);
|
||||
|
||||
mipi_dsi_set_drvdata(dsi, jdi);
|
||||
|
||||
|
|
|
|||
|
|
@ -821,9 +821,6 @@ static int khadas_ts050_panel_add(struct khadas_ts050_panel *khadas_ts050)
|
|||
return dev_err_probe(dev, PTR_ERR(khadas_ts050->enable_gpio),
|
||||
"failed to get enable gpio");
|
||||
|
||||
drm_panel_init(&khadas_ts050->base, &khadas_ts050->link->dev,
|
||||
&khadas_ts050_panel_funcs, DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
err = drm_panel_of_backlight(&khadas_ts050->base);
|
||||
if (err)
|
||||
return err;
|
||||
|
|
@ -850,10 +847,12 @@ static int khadas_ts050_panel_probe(struct mipi_dsi_device *dsi)
|
|||
dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
|
||||
MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_NO_EOT_PACKET;
|
||||
|
||||
khadas_ts050 = devm_kzalloc(&dsi->dev, sizeof(*khadas_ts050),
|
||||
GFP_KERNEL);
|
||||
if (!khadas_ts050)
|
||||
return -ENOMEM;
|
||||
khadas_ts050 = devm_drm_panel_alloc(&dsi->dev, __typeof(*khadas_ts050),
|
||||
base, &khadas_ts050_panel_funcs,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
if (IS_ERR(khadas_ts050))
|
||||
return PTR_ERR(khadas_ts050);
|
||||
|
||||
khadas_ts050->panel_data = (struct khadas_ts050_panel_data *)data;
|
||||
mipi_dsi_set_drvdata(dsi, khadas_ts050);
|
||||
|
|
|
|||
|
|
@ -337,9 +337,6 @@ static int kingdisplay_panel_add(struct kingdisplay_panel *kingdisplay)
|
|||
kingdisplay->enable_gpio = NULL;
|
||||
}
|
||||
|
||||
drm_panel_init(&kingdisplay->base, &kingdisplay->link->dev,
|
||||
&kingdisplay_panel_funcs, DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
err = drm_panel_of_backlight(&kingdisplay->base);
|
||||
if (err)
|
||||
return err;
|
||||
|
|
@ -364,9 +361,12 @@ static int kingdisplay_panel_probe(struct mipi_dsi_device *dsi)
|
|||
dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
|
||||
MIPI_DSI_MODE_LPM;
|
||||
|
||||
kingdisplay = devm_kzalloc(&dsi->dev, sizeof(*kingdisplay), GFP_KERNEL);
|
||||
if (!kingdisplay)
|
||||
return -ENOMEM;
|
||||
kingdisplay = devm_drm_panel_alloc(&dsi->dev, __typeof(*kingdisplay), base,
|
||||
&kingdisplay_panel_funcs,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
if (IS_ERR(kingdisplay))
|
||||
return PTR_ERR(kingdisplay);
|
||||
|
||||
mipi_dsi_set_drvdata(dsi, kingdisplay);
|
||||
kingdisplay->link = dsi;
|
||||
|
|
|
|||
|
|
@ -246,8 +246,6 @@ static int sw43408_add(struct sw43408_panel *ctx)
|
|||
|
||||
ctx->base.prepare_prev_first = true;
|
||||
|
||||
drm_panel_init(&ctx->base, dev, &sw43408_funcs, DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
drm_panel_add(&ctx->base);
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -257,9 +255,11 @@ static int sw43408_probe(struct mipi_dsi_device *dsi)
|
|||
struct sw43408_panel *ctx;
|
||||
int ret;
|
||||
|
||||
ctx = devm_kzalloc(&dsi->dev, sizeof(*ctx), GFP_KERNEL);
|
||||
if (!ctx)
|
||||
return -ENOMEM;
|
||||
ctx = devm_drm_panel_alloc(&dsi->dev, __typeof(*ctx), base,
|
||||
&sw43408_funcs, DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
if (IS_ERR(ctx))
|
||||
return PTR_ERR(ctx);
|
||||
|
||||
dsi->mode_flags = MIPI_DSI_MODE_LPM;
|
||||
dsi->format = MIPI_DSI_FMT_RGB888;
|
||||
|
|
|
|||
|
|
@ -608,8 +608,6 @@ static int nt36672a_panel_add(struct nt36672a_panel *pinfo)
|
|||
return dev_err_probe(dev, PTR_ERR(pinfo->reset_gpio),
|
||||
"failed to get reset gpio from DT\n");
|
||||
|
||||
drm_panel_init(&pinfo->base, dev, &panel_funcs, DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
ret = drm_panel_of_backlight(&pinfo->base);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Failed to get backlight\n");
|
||||
|
|
@ -625,9 +623,11 @@ static int nt36672a_panel_probe(struct mipi_dsi_device *dsi)
|
|||
const struct nt36672a_panel_desc *desc;
|
||||
int err;
|
||||
|
||||
pinfo = devm_kzalloc(&dsi->dev, sizeof(*pinfo), GFP_KERNEL);
|
||||
if (!pinfo)
|
||||
return -ENOMEM;
|
||||
pinfo = devm_drm_panel_alloc(&dsi->dev, __typeof(*pinfo), base,
|
||||
&panel_funcs, DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
if (IS_ERR(pinfo))
|
||||
return PTR_ERR(pinfo);
|
||||
|
||||
desc = of_device_get_match_data(&dsi->dev);
|
||||
dsi->mode_flags = desc->mode_flags;
|
||||
|
|
|
|||
|
|
@ -132,9 +132,6 @@ static int osd101t2587_panel_add(struct osd101t2587_panel *osd101t2587)
|
|||
if (IS_ERR(osd101t2587->supply))
|
||||
return PTR_ERR(osd101t2587->supply);
|
||||
|
||||
drm_panel_init(&osd101t2587->base, &osd101t2587->dsi->dev,
|
||||
&osd101t2587_panel_funcs, DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
ret = drm_panel_of_backlight(&osd101t2587->base);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
@ -161,9 +158,12 @@ static int osd101t2587_panel_probe(struct mipi_dsi_device *dsi)
|
|||
MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
|
||||
MIPI_DSI_MODE_NO_EOT_PACKET;
|
||||
|
||||
osd101t2587 = devm_kzalloc(&dsi->dev, sizeof(*osd101t2587), GFP_KERNEL);
|
||||
if (!osd101t2587)
|
||||
return -ENOMEM;
|
||||
osd101t2587 = devm_drm_panel_alloc(&dsi->dev, __typeof(*osd101t2587), base,
|
||||
&osd101t2587_panel_funcs,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
if (IS_ERR(osd101t2587))
|
||||
return PTR_ERR(osd101t2587);
|
||||
|
||||
mipi_dsi_set_drvdata(dsi, osd101t2587);
|
||||
|
||||
|
|
|
|||
|
|
@ -166,9 +166,6 @@ static int wuxga_nt_panel_add(struct wuxga_nt_panel *wuxga_nt)
|
|||
if (IS_ERR(wuxga_nt->supply))
|
||||
return PTR_ERR(wuxga_nt->supply);
|
||||
|
||||
drm_panel_init(&wuxga_nt->base, &wuxga_nt->dsi->dev,
|
||||
&wuxga_nt_panel_funcs, DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
ret = drm_panel_of_backlight(&wuxga_nt->base);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
@ -196,9 +193,12 @@ static int wuxga_nt_panel_probe(struct mipi_dsi_device *dsi)
|
|||
MIPI_DSI_CLOCK_NON_CONTINUOUS |
|
||||
MIPI_DSI_MODE_LPM;
|
||||
|
||||
wuxga_nt = devm_kzalloc(&dsi->dev, sizeof(*wuxga_nt), GFP_KERNEL);
|
||||
if (!wuxga_nt)
|
||||
return -ENOMEM;
|
||||
wuxga_nt = devm_drm_panel_alloc(&dsi->dev, __typeof(*wuxga_nt), base,
|
||||
&wuxga_nt_panel_funcs,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
|
||||
if (IS_ERR(wuxga_nt))
|
||||
return PTR_ERR(wuxga_nt);
|
||||
|
||||
mipi_dsi_set_drvdata(dsi, wuxga_nt);
|
||||
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user