This repository has been archived by the owner on Oct 3, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 95
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
drm/fb-helper: Remove drm_fb_helper_crtc
struct drm_fb_helper_crtc is now just a wrapper around drm_mode_set so use that directly instead and attach it as a modeset array onto drm_client_dev. drm_fb_helper will use this array to store its modesets which means it will always initialize a drm_client, but it will not register the client (callbacks) unless it's the generic fbdev emulation. Code will later be moved to drm_client, so add code there in a new file drm_client_modeset.c with MIT license to match drm_fb_helper.c. The modeset connector array size is hardcoded for the cloned case to avoid having to pass in a value from the driver. A value of 8 is chosen to err on the safe side. This means that the max connector argument for drm_fb_helper_init() and drm_fb_helper_fbdev_setup() isn't used anymore, a todo entry for this is added. In pan_display_atomic() restore_fbdev_mode_force() is used instead of restore_fbdev_mode_atomic() because that one will later become internal to drm_client_modeset. Locking order: 1. drm_fb_helper->lock 2. drm_master_internal_acquire 3. drm_client_dev->modeset_mutex v6: Improve commit message (Sam Ravnborg) v3: - Use full drm_client_init/release for the modesets (Daniel Vetter) - drm_client_for_each_modeset: use lockdep_assert_held (Daniel Vetter) - Hook up to Documentation/gpu/drm-client.rst (Daniel Vetter) v2: - Add modesets array to drm_client (Daniel Vetter) - Use a new file for the modeset code (Daniel Vetter) - File has to be MIT licensed (Emmanuel Vadot) - Add copyrights from drm_fb_helper.c Signed-off-by: Noralf Trønnes <noralf@tronnes.org> Reviewed-by: Sam Ravnborg <sam@ravnborg.org> Link: https://patchwork.freedesktop.org/patch/msgid/20190531140117.37751-3-noralf@tronnes.org
- Loading branch information
Showing
8 changed files
with
273 additions
and
186 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
// SPDX-License-Identifier: MIT | ||
/* | ||
* Copyright 2018 Noralf Trønnes | ||
* Copyright (c) 2006-2009 Red Hat Inc. | ||
* Copyright (c) 2006-2008 Intel Corporation | ||
* Jesse Barnes <jesse.barnes@intel.com> | ||
* Copyright (c) 2007 Dave Airlie <airlied@linux.ie> | ||
*/ | ||
|
||
#include <linux/module.h> | ||
#include <linux/mutex.h> | ||
#include <linux/slab.h> | ||
|
||
#include <drm/drm_client.h> | ||
#include <drm/drm_crtc.h> | ||
#include <drm/drm_device.h> | ||
|
||
int drm_client_modeset_create(struct drm_client_dev *client) | ||
{ | ||
struct drm_device *dev = client->dev; | ||
unsigned int num_crtc = dev->mode_config.num_crtc; | ||
unsigned int max_connector_count = 1; | ||
struct drm_mode_set *modeset; | ||
struct drm_crtc *crtc; | ||
unsigned int i = 0; | ||
|
||
/* Add terminating zero entry to enable index less iteration */ | ||
client->modesets = kcalloc(num_crtc + 1, sizeof(*client->modesets), GFP_KERNEL); | ||
if (!client->modesets) | ||
return -ENOMEM; | ||
|
||
mutex_init(&client->modeset_mutex); | ||
|
||
drm_for_each_crtc(crtc, dev) | ||
client->modesets[i++].crtc = crtc; | ||
|
||
/* Cloning is only supported in the single crtc case. */ | ||
if (num_crtc == 1) | ||
max_connector_count = DRM_CLIENT_MAX_CLONED_CONNECTORS; | ||
|
||
for (modeset = client->modesets; modeset->crtc; modeset++) { | ||
modeset->connectors = kcalloc(max_connector_count, | ||
sizeof(*modeset->connectors), GFP_KERNEL); | ||
if (!modeset->connectors) | ||
goto err_free; | ||
} | ||
|
||
return 0; | ||
|
||
err_free: | ||
drm_client_modeset_free(client); | ||
|
||
return -ENOMEM; | ||
} | ||
|
||
void drm_client_modeset_release(struct drm_client_dev *client) | ||
{ | ||
struct drm_mode_set *modeset; | ||
unsigned int i; | ||
|
||
drm_client_for_each_modeset(modeset, client) { | ||
drm_mode_destroy(client->dev, modeset->mode); | ||
modeset->mode = NULL; | ||
modeset->fb = NULL; | ||
|
||
for (i = 0; i < modeset->num_connectors; i++) { | ||
drm_connector_put(modeset->connectors[i]); | ||
modeset->connectors[i] = NULL; | ||
} | ||
modeset->num_connectors = 0; | ||
} | ||
} | ||
/* TODO: Remove export when modeset code has been moved over */ | ||
EXPORT_SYMBOL(drm_client_modeset_release); | ||
|
||
void drm_client_modeset_free(struct drm_client_dev *client) | ||
{ | ||
struct drm_mode_set *modeset; | ||
|
||
mutex_lock(&client->modeset_mutex); | ||
|
||
drm_client_modeset_release(client); | ||
|
||
drm_client_for_each_modeset(modeset, client) | ||
kfree(modeset->connectors); | ||
|
||
mutex_unlock(&client->modeset_mutex); | ||
|
||
mutex_destroy(&client->modeset_mutex); | ||
kfree(client->modesets); | ||
} | ||
|
||
struct drm_mode_set *drm_client_find_modeset(struct drm_client_dev *client, struct drm_crtc *crtc) | ||
{ | ||
struct drm_mode_set *modeset; | ||
|
||
drm_client_for_each_modeset(modeset, client) | ||
if (modeset->crtc == crtc) | ||
return modeset; | ||
|
||
return NULL; | ||
} | ||
/* TODO: Remove export when modeset code has been moved over */ | ||
EXPORT_SYMBOL(drm_client_find_modeset); |
Oops, something went wrong.