On Sat, May 8, 2010 at 1:18 AM, Jerome Glisse <jglisse at redhat.com> wrote: > Userspace need to know the hw crtc id (0, 1, 2, ...) from the drm > crtc id. Bump the minor version so userspace can enable conditionaly > features depend on this. > > Signed-off-by: Jerome Glisse <jglisse at redhat.com> > --- > ?drivers/gpu/drm/radeon/radeon_drv.c | ? ?3 ++- > ?drivers/gpu/drm/radeon/radeon_kms.c | ? 18 ++++++++++++++++++ > ?include/drm/radeon_drm.h ? ? ? ? ? ?| ? ?1 + > ?3 files changed, 21 insertions(+), 1 deletions(-) > > diff --git a/drivers/gpu/drm/radeon/radeon_drv.c > b/drivers/gpu/drm/radeon/radeon_drv.c > index b3749d4..df96ace 100644 > --- a/drivers/gpu/drm/radeon/radeon_drv.c > +++ b/drivers/gpu/drm/radeon/radeon_drv.c > @@ -44,9 +44,10 @@ > ?* - 2.1.0 - add square tiling interface > ?* - 2.2.0 - add r6xx/r7xx const buffer support > ?* - 2.3.0 - add MSPOS + 3D texture + r500 VAP regs > + * - 2.4.0 - add crtc id query > ?*/ > ?#define KMS_DRIVER_MAJOR ? ? ? 2 > -#define KMS_DRIVER_MINOR ? ? ? 3 > +#define KMS_DRIVER_MINOR ? ? ? 4 > ?#define KMS_DRIVER_PATCHLEVEL ?0 > ?int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); > ?int radeon_driver_unload_kms(struct drm_device *dev); > diff --git a/drivers/gpu/drm/radeon/radeon_kms.c > b/drivers/gpu/drm/radeon/radeon_kms.c > index d3657dc..04ad452 100644 > --- a/drivers/gpu/drm/radeon/radeon_kms.c > +++ b/drivers/gpu/drm/radeon/radeon_kms.c > @@ -98,11 +98,15 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, > struct drm_file *filp) > ?{ > ? ? ? ?struct radeon_device *rdev = dev->dev_private; > ? ? ? ?struct drm_radeon_info *info; > + ? ? ? struct radeon_mode_info *minfo = &rdev->mode_info; > ? ? ? ?uint32_t *value_ptr; > ? ? ? ?uint32_t value; > + ? ? ? struct drm_crtc *crtc; > + ? ? ? int i, found; > > ? ? ? ?info = data; > ? ? ? ?value_ptr = (uint32_t *)((unsigned long)info->value); > + ? ? ? value = *value_ptr; > ? ? ? ?switch (info->request) { > ? ? ? ?case RADEON_INFO_DEVICE_ID: > ? ? ? ? ? ? ? ?value = dev->pci_device; > @@ -116,6 +120,20 @@ int radeon_info_ioctl(struct drm_device *dev, void > *data, struct drm_file *filp) > ? ? ? ?case RADEON_INFO_ACCEL_WORKING: > ? ? ? ? ? ? ? ?value = rdev->accel_working; > ? ? ? ? ? ? ? ?break; > + ? ? ? case RADEON_INFO_CRTC_FROM_ID: > + ? ? ? ? ? ? ? for (i = 0, found = 0; i < 6; i++) { > + ? ? ? ? ? ? ? ? ? ? ? crtc = (struct drm_crtc *)minfo->crtcs[i]; > + ? ? ? ? ? ? ? ? ? ? ? if (crtc && crtc->base.id == value) { > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? value = i; > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? found = 1; > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break; > + ? ? ? ? ? ? ? ? ? ? ? } > + ? ? ? ? ? ? ? } > + ? ? ? ? ? ? ? if (!found) { > + ? ? ? ? ? ? ? ? ? ? ? DRM_ERROR("unknown crtc id %d\n", value);
Don't drm error or hardcode 6 here. we have rdev->num_crtc and DRM erroring from a path triggerable directly from a user doing something bad is generally a bad idea. Dave.