On Fri, 2008-11-07 at 15:31 -0800, Jesse Barnes wrote: > [Justify this massive code drop here.]
Don't forget this bit :)
Looks pretty good. The only real problem is the licensing notes towards the
end.
> +/**
> + * drm_idr_get - allocate a new identifier
> + * @dev: DRM device
> + * @ptr: object pointer, used to generate unique ID
> + *
> + * LOCKING:
> + * Caller must hold DRM mode_config lock.
> + *
> + * Create a unique identifier based on @ptr in @dev's identifier space. Used
> + * for tracking modes, CRTCs and connectors.
> + *
> + * RETURNS:
> + * New unique (relative to other objects in @dev) integer identifier for the
> + * object.
> + */
> +static int drm_mode_object_get(struct drm_device *dev,
> + struct drm_mode_object *obj, uint32_t obj_type)
> +{
Disagreement between function name and doc. Might want to assert the
lock.
> +/**
> + * drm_mode_create - create a new display mode
> + * @dev: DRM device
> + *
> + * LOCKING:
> + * None.
> + *
> + * Create a new drm_display_mode, give it an ID, and return it.
> + *
> + * RETURNS:
> + * Pointer to new mode on success, NULL on error.
> + */
> +struct drm_display_mode *drm_mode_create(struct drm_device *dev)
> +{
> + struct drm_display_mode *nmode;
> +
> + nmode = kzalloc(sizeof(struct drm_display_mode), GFP_KERNEL);
> + if (!nmode)
> + return NULL;
> +
> + drm_mode_object_get(dev, &nmode->base, DRM_MODE_OBJECT_MODE);
doc claims no locking but calling drm_mode_object_get with lock unheld.
> +/**
> + * drm_mode_create_dvi_i_properties - create DVI-I specific connector
> properties
> + * @dev: DRM device
> + *
> + * Called by a driver the first time a DVI-I connector is made.
> + */
> +int drm_mode_create_dvi_i_properties(struct drm_device *dev)
> +{
> + int i;
> +
> + if (dev->mode_config.dvi_i_select_subconnector_property)
> + return 0;
> +
> + dev->mode_config.dvi_i_select_subconnector_property =
> drm_property_create(dev, DRM_MODE_PROP_ENUM,
> + "select subconnector", 3);
> + /* add enum element 0-2 */
> + for (i = 0; i < 3; i++)
> +
> drm_property_add_enum(dev->mode_config.dvi_i_select_subconnector_property, i,
> drm_select_subconnector_enum_list[i].type,
> + drm_select_subconnector_enum_list[i].name);
> +
> + /* This is a property which indicates the most likely thing to be
> connected. */
> + dev->mode_config.dvi_i_subconnector_property = drm_property_create(dev,
> DRM_MODE_PROP_ENUM | DRM_MODE_PROP_IMMUTABLE,
> + "subconnector", 3);
> + /* add enum element 0-2 */
> + for (i = 0; i < 3; i++)
> +
> drm_property_add_enum(dev->mode_config.dvi_i_subconnector_property, i,
> drm_subconnector_enum_list[i].type,
> + drm_subconnector_enum_list[i].name);
Hardcoded array indices so far from the definitions of the array are a
little scary. Perhaps separate arrays for dvi-i/tv, and ARRAY_SIZE()?
> +/**
> + * drm_crtc_convert_to_umode - convert a modeinfo into a drm_display_mode
> + * @out: drm_display_mode to return to the user
> + * @in: drm_mode_modeinfo to use
> + *
> + * LOCKING:
> + * None.
> + *
> + * Convert a drmo_mode_modeinfo into a drm_display_mode structure to return
> to
> + * the caller.
typo: drmo_mode_modeinfo
> +/**
> + * drm_mode_getresources - get graphics configuration
> + * @inode: inode from the ioctl
> + * @filp: file * from the ioctl
> + * @cmd: cmd from ioctl
> + * @arg: arg from ioctl
> + *
> + * LOCKING:
> + * Takes mode config lock.
> + *
> + * Construct a set of configuration description structures and return
> + * them to the user, including CRTC, connector and framebuffer configuration.
> + *
> + * Called by the user via ioctl.
> + *
> + * RETURNS:
> + * Zero on success, errno on failure.
> + */
> +int drm_mode_getresources(struct drm_device *dev,
> + void *data, struct drm_file *file_priv)
> +{
> + struct drm_mode_card_res *card_res = data;
> + struct list_head *lh;
> + struct drm_framebuffer *fb;
> + struct drm_connector *connector;
> + struct drm_crtc *crtc;
> + struct drm_encoder *encoder;
> + int ret = 0;
> + int connector_count = 0;
> + int crtc_count = 0;
> + int fb_count = 0;
> + int encoder_count = 0;
> + int copied = 0, i;
> + uint32_t __user *fb_id;
> + uint32_t __user *crtc_id;
> + uint32_t __user *connector_id;
> + uint32_t __user *encoder_id;
> + struct drm_mode_group *mode_group;
> +
> + mutex_lock(&dev->mode_config.mutex);
> +
> + /* for the non-control nodes we need to limit the list of resources by
> IDs in the
> + group list for this node */
> + list_for_each(lh, &file_priv->fbs)
> + fb_count++;
> +
> + mode_group = &file_priv->master->minor->mode_group;
> + if (file_priv->master->minor->type == DRM_MINOR_CONTROL) {
> +
> + list_for_each(lh, &dev->mode_config.crtc_list)
> + crtc_count++;
> +
> + list_for_each(lh, &dev->mode_config.connector_list)
> + connector_count++;
> +
> + list_for_each(lh, &dev->mode_config.encoder_list)
> + encoder_count++;
> + } else {
> +
> + crtc_count = mode_group->num_crtcs;
> + connector_count = mode_group->num_connectors;
> + encoder_count = mode_group->num_encoders;
> + }
> +
> + card_res->max_height = dev->mode_config.max_height;
> + card_res->min_height = dev->mode_config.min_height;
> + card_res->max_width = dev->mode_config.max_width;
> + card_res->min_width = dev->mode_config.min_width;
> +
> + /* handle this in 4 parts */
> + /* FBs */
> + if (card_res->count_fbs >= fb_count) {
> + copied = 0;
> + fb_id = (uint32_t *)(unsigned long)card_res->fb_id_ptr;
(uint32_t __user *) to appease sparse
> +int drm_mode_cursor_ioctl(struct drm_device *dev,
> + void *data, struct drm_file *file_priv)
> +{
> + struct drm_mode_cursor *req = data;
> + struct drm_mode_object *obj;
> + struct drm_crtc *crtc;
> + int ret = 0;
> +
> + DRM_DEBUG("\n");
> +
> + if (!req->flags) {
> + DRM_ERROR("no operation set\n");
> + return -EINVAL;
> + }
> +
> + mutex_lock(&dev->mode_config.mutex);
> + obj = drm_mode_object_find(dev, req->crtc, DRM_MODE_OBJECT_CRTC);
> + if (!obj) {
> + DRM_DEBUG("Unknown CRTC ID %d\n", req->crtc);
> + ret = -EINVAL;
> + goto out;
> + }
> + crtc = obj_to_crtc(obj);
> +
> + if (req->flags & DRM_MODE_CURSOR_BO) {
> + /* Turn of the cursor if handle is 0 */
s/of/off/
> + if (crtc->funcs->cursor_set) {
> + ret = crtc->funcs->cursor_set(crtc, file_priv,
> req->handle, req->width, req->height);
> + } else {
> + DRM_ERROR("crtc does not support cursor\n");
> + ret = -EFAULT;
these should be -EINVAL or -ENXIO or something not -EFAULT. (user
didn't hand you a bad pointer)
> + goto out;
> + }
> + }
> +
> + if (req->flags & DRM_MODE_CURSOR_MOVE) {
> + if (crtc->funcs->cursor_move) {
> + ret = crtc->funcs->cursor_move(crtc, req->x, req->y);
> + } else {
> + DRM_ERROR("crtc does not support cursor\n");
> + ret = -EFAULT;
> + goto out;
> + }
> + }
> +out:
> + mutex_unlock(&dev->mode_config.mutex);
> + return ret;
> +}
This ioctl seems to be a 1:1 mapping of cursors to crtcs. As far as I
understand, we have a many:1 mapping of cursors to crtcs possible on
Intel, and it seems relevant for MPX. I guess that could be a future
ioctl, though.
> +/*
> + *
> + */
/* Least informative comment ever. */
> +static int drm_mode_attachmode(struct drm_device *dev,
> + struct drm_connector *connector,
> + struct drm_display_mode *mode)
> +{
> + int ret = 0;
> +
> + list_add_tail(&mode->head, &connector->user_modes);
> + return ret;
> +}
> diff --git a/drivers/gpu/drm/drm_crtc_helper.c
> b/drivers/gpu/drm/drm_crtc_helper.c
> new file mode 100644
> index 0000000..a0f3ffe
> --- /dev/null
> +++ b/drivers/gpu/drm/drm_crtc_helper.c
> + /* XXX free adjustedmode */
> + drm_mode_destroy(dev, adjusted_mode);
> + /* TODO */
> +// if (scrn->pScreen)
> +// drm_crtc_set_screen_sub_pixel_order(dev);
// comments
> +bool drm_helper_plugged_event(struct drm_device *dev)
> +{
> + DRM_DEBUG("\n");
> +
> + drm_helper_probe_connector_modes(dev, dev->mode_config.max_width,
> + dev->mode_config.max_height);
> +
> + drm_setup_crtcs(dev);
> +
> + /* alert the driver fb layer */
> + dev->mode_config.funcs->fb_changed(dev);
> +
> +// drm_helper_disable_unused_functions(dev);
> +
> +// drm_sysfs_hotplug_event(dev);
// comments
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> new file mode 100644
> index 0000000..b75483f
> --- /dev/null
> +++ b/drivers/gpu/drm/drm_edid.c
> +/**
> + * drm_mode_std - convert standard mode info (width, height, refresh) into
> mode
> + * @t: standard timing params
> + *
> + * Take the standard timing params (in this case width, aspect, and refresh)
> + * and convert them into a real mode using CVT.
> + *
> + * Punts for now, but should eventually use the FB layer's CVT based mode
> + * generation code.
> + */
> +struct drm_display_mode *drm_mode_std(struct drm_device *dev,
> + struct std_timing *t)
> +{
> +// struct fb_videomode mode;
> +
> +// fb_find_mode_cvt(&mode, 0, 0);
// comments
> diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
> new file mode 100644
> index 0000000..4e05e80
> --- /dev/null
> +++ b/drivers/gpu/drm/drm_modes.c
> @@ -0,0 +1,570 @@
> +/*
> + * Copyright © 1997-2003 by The XFree86 Project, Inc.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> + * OTHER DEALINGS IN THE SOFTWARE.
> + *
> + * Except as contained in this notice, the name of the copyright holder(s)
> + * and author(s) shall not be used in advertising or otherwise to promote
> + * the sale, use or other dealings in this Software without prior written
> + * authorization from the copyright holder(s) and author(s).
> + */
> +/*
> + * Copyright © 2007 Dave Airlie
> + */
Is there a license associated with this copyright?
> +/* FIXME: what we don't have a list sort function? */
> +/* list sort from Mark J Roberts ([EMAIL PROTECTED]) */
From what I could see, this would be GPL-licensed, but the header on
this file says XF86.
> +void list_sort(struct list_head *head, int (*cmp)(struct list_head *a,
> struct list_head *b))
> +{
> + struct list_head *p, *q, *e, *list, *tail, *oldhead;
> + int insize, nmerges, psize, qsize, i;
> +
> + list = head->next;
> + list_del(head);
> + insize = 1;
> + for (;;) {
> + p = oldhead = list;
> + list = tail = NULL;
> + nmerges = 0;
> +
> + while (p) {
> + nmerges++;
> + q = p;
> + psize = 0;
> + for (i = 0; i < insize; i++) {
> + psize++;
> + q = q->next == oldhead ? NULL : q->next;
> + if (!q)
> + break;
> + }
> +
> + qsize = insize;
> + while (psize > 0 || (qsize > 0 && q)) {
> + if (!psize) {
> + e = q;
> + q = q->next;
> + qsize--;
> + if (q == oldhead)
> + q = NULL;
> + } else if (!qsize || !q) {
> + e = p;
> + p = p->next;
> + psize--;
> + if (p == oldhead)
> + p = NULL;
> + } else if (cmp(p, q) <= 0) {
> + e = p;
> + p = p->next;
> + psize--;
> + if (p == oldhead)
> + p = NULL;
> + } else {
> + e = q;
> + q = q->next;
> + qsize--;
> + if (q == oldhead)
> + q = NULL;
> + }
> + if (tail)
> + tail->next = e;
> + else
> + list = e;
> + e->prev = tail;
> + tail = e;
> + }
> + p = q;
> + }
> +
> + tail->next = list;
> + list->prev = tail;
> +
> + if (nmerges <= 1)
> + break;
> +
> + insize *= 2;
> + }
> +
> + head->next = list;
> + head->prev = list->prev;
> + list->prev->next = head;
> + list->prev = head;
> +}
> --- /dev/null
> +++ b/include/drm/drm_crtc.h
> @@ -0,0 +1,716 @@
> +/*
> + * Copyright © 2006 Keith Packard
> + * Copyright © 2007 Intel Corporation
> + * Jesse Barnes <[EMAIL PROTECTED]>
> + */
Copyright with no license?
> diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h
> new file mode 100644
> index 0000000..e770205
> --- /dev/null
> +++ b/include/drm/drm_crtc_helper.h
> @@ -0,0 +1,96 @@
> +/*
> + * Copyright © 2006 Keith Packard
> + * Copyright © 2007 Intel Corporation
> + * Jesse Barnes <[EMAIL PROTECTED]>
> + */
License?
> diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
> new file mode 100644
> index 0000000..dccfba9
> --- /dev/null
> +++ b/include/drm/drm_edid.h
> @@ -0,0 +1,178 @@
> +#ifndef __DRM_EDID_H__
> +#define __DRM_EDID_H__
> +
> +#include <linux/types.h>
Copyright?
--
Eric Anholt
[EMAIL PROTECTED] [EMAIL PROTECTED]
signature.asc
Description: This is a digitally signed message part
------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/
-- _______________________________________________ Dri-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/dri-devel
