|
@@ -37,7 +37,7 @@
|
|
#if __OS_HAS_AGP
|
|
#if __OS_HAS_AGP
|
|
|
|
|
|
/**
|
|
/**
|
|
- * AGP information ioctl.
|
|
|
|
|
|
+ * Get AGP information.
|
|
*
|
|
*
|
|
* \param inode device inode.
|
|
* \param inode device inode.
|
|
* \param filp file pointer.
|
|
* \param filp file pointer.
|
|
@@ -48,51 +48,56 @@
|
|
* Verifies the AGP device has been initialized and acquired and fills in the
|
|
* Verifies the AGP device has been initialized and acquired and fills in the
|
|
* drm_agp_info structure with the information in drm_agp_head::agp_info.
|
|
* drm_agp_info structure with the information in drm_agp_head::agp_info.
|
|
*/
|
|
*/
|
|
-int drm_agp_info(struct inode *inode, struct file *filp,
|
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
|
|
|
+int drm_agp_info(drm_device_t *dev, drm_agp_info_t *info)
|
|
{
|
|
{
|
|
- drm_file_t *priv = filp->private_data;
|
|
|
|
- drm_device_t *dev = priv->head->dev;
|
|
|
|
DRM_AGP_KERN *kern;
|
|
DRM_AGP_KERN *kern;
|
|
- drm_agp_info_t info;
|
|
|
|
|
|
|
|
if (!dev->agp || !dev->agp->acquired)
|
|
if (!dev->agp || !dev->agp->acquired)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
kern = &dev->agp->agp_info;
|
|
kern = &dev->agp->agp_info;
|
|
- info.agp_version_major = kern->version.major;
|
|
|
|
- info.agp_version_minor = kern->version.minor;
|
|
|
|
- info.mode = kern->mode;
|
|
|
|
- info.aperture_base = kern->aper_base;
|
|
|
|
- info.aperture_size = kern->aper_size * 1024 * 1024;
|
|
|
|
- info.memory_allowed = kern->max_memory << PAGE_SHIFT;
|
|
|
|
- info.memory_used = kern->current_memory << PAGE_SHIFT;
|
|
|
|
- info.id_vendor = kern->device->vendor;
|
|
|
|
- info.id_device = kern->device->device;
|
|
|
|
-
|
|
|
|
- if (copy_to_user((drm_agp_info_t __user *)arg, &info, sizeof(info)))
|
|
|
|
|
|
+ info->agp_version_major = kern->version.major;
|
|
|
|
+ info->agp_version_minor = kern->version.minor;
|
|
|
|
+ info->mode = kern->mode;
|
|
|
|
+ info->aperture_base = kern->aper_base;
|
|
|
|
+ info->aperture_size = kern->aper_size * 1024 * 1024;
|
|
|
|
+ info->memory_allowed = kern->max_memory << PAGE_SHIFT;
|
|
|
|
+ info->memory_used = kern->current_memory << PAGE_SHIFT;
|
|
|
|
+ info->id_vendor = kern->device->vendor;
|
|
|
|
+ info->id_device = kern->device->device;
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(drm_agp_info);
|
|
|
|
+
|
|
|
|
+int drm_agp_info_ioctl(struct inode *inode, struct file *filp,
|
|
|
|
+ unsigned int cmd, unsigned long arg)
|
|
|
|
+{
|
|
|
|
+ drm_file_t *priv = filp->private_data;
|
|
|
|
+ drm_device_t *dev = priv->head->dev;
|
|
|
|
+ drm_agp_info_t info;
|
|
|
|
+ int err;
|
|
|
|
+
|
|
|
|
+ err = drm_agp_info(dev, &info);
|
|
|
|
+ if (err)
|
|
|
|
+ return err;
|
|
|
|
+
|
|
|
|
+ if (copy_to_user((drm_agp_info_t __user *) arg, &info, sizeof(info)))
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * Acquire the AGP device (ioctl).
|
|
|
|
|
|
+ * Acquire the AGP device.
|
|
*
|
|
*
|
|
- * \param inode device inode.
|
|
|
|
- * \param filp file pointer.
|
|
|
|
- * \param cmd command.
|
|
|
|
- * \param arg user argument.
|
|
|
|
|
|
+ * \param dev DRM device that is to acquire AGP
|
|
* \return zero on success or a negative number on failure.
|
|
* \return zero on success or a negative number on failure.
|
|
*
|
|
*
|
|
* Verifies the AGP device hasn't been acquired before and calls
|
|
* Verifies the AGP device hasn't been acquired before and calls
|
|
- * agp_acquire().
|
|
|
|
|
|
+ * \c agp_backend_acquire.
|
|
*/
|
|
*/
|
|
-int drm_agp_acquire(struct inode *inode, struct file *filp,
|
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
|
|
|
+int drm_agp_acquire(drm_device_t *dev)
|
|
{
|
|
{
|
|
- drm_file_t *priv = filp->private_data;
|
|
|
|
- drm_device_t *dev = priv->head->dev;
|
|
|
|
-
|
|
|
|
if (!dev->agp)
|
|
if (!dev->agp)
|
|
return -ENODEV;
|
|
return -ENODEV;
|
|
if (dev->agp->acquired)
|
|
if (dev->agp->acquired)
|
|
@@ -102,9 +107,10 @@ int drm_agp_acquire(struct inode *inode, struct file *filp,
|
|
dev->agp->acquired = 1;
|
|
dev->agp->acquired = 1;
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
+EXPORT_SYMBOL(drm_agp_acquire);
|
|
|
|
|
|
/**
|
|
/**
|
|
- * Release the AGP device (ioctl).
|
|
|
|
|
|
+ * Acquire the AGP device (ioctl).
|
|
*
|
|
*
|
|
* \param inode device inode.
|
|
* \param inode device inode.
|
|
* \param filp file pointer.
|
|
* \param filp file pointer.
|
|
@@ -112,63 +118,80 @@ int drm_agp_acquire(struct inode *inode, struct file *filp,
|
|
* \param arg user argument.
|
|
* \param arg user argument.
|
|
* \return zero on success or a negative number on failure.
|
|
* \return zero on success or a negative number on failure.
|
|
*
|
|
*
|
|
- * Verifies the AGP device has been acquired and calls agp_backend_release().
|
|
|
|
|
|
+ * Verifies the AGP device hasn't been acquired before and calls
|
|
|
|
+ * \c agp_backend_acquire.
|
|
*/
|
|
*/
|
|
-int drm_agp_release(struct inode *inode, struct file *filp,
|
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
|
|
|
+int drm_agp_acquire_ioctl(struct inode *inode, struct file *filp,
|
|
|
|
+ unsigned int cmd, unsigned long arg)
|
|
{
|
|
{
|
|
- drm_file_t *priv = filp->private_data;
|
|
|
|
- drm_device_t *dev = priv->head->dev;
|
|
|
|
|
|
+ drm_file_t *priv = filp->private_data;
|
|
|
|
+
|
|
|
|
+ return drm_agp_acquire( (drm_device_t *) priv->head->dev );
|
|
|
|
+}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Release the AGP device.
|
|
|
|
+ *
|
|
|
|
+ * \param dev DRM device that is to release AGP
|
|
|
|
+ * \return zero on success or a negative number on failure.
|
|
|
|
+ *
|
|
|
|
+ * Verifies the AGP device has been acquired and calls \c agp_backend_release.
|
|
|
|
+ */
|
|
|
|
+int drm_agp_release(drm_device_t *dev)
|
|
|
|
+{
|
|
if (!dev->agp || !dev->agp->acquired)
|
|
if (!dev->agp || !dev->agp->acquired)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
agp_backend_release(dev->agp->bridge);
|
|
agp_backend_release(dev->agp->bridge);
|
|
dev->agp->acquired = 0;
|
|
dev->agp->acquired = 0;
|
|
return 0;
|
|
return 0;
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
+EXPORT_SYMBOL(drm_agp_release);
|
|
|
|
|
|
-/**
|
|
|
|
- * Release the AGP device.
|
|
|
|
- *
|
|
|
|
- * Calls agp_backend_release().
|
|
|
|
- */
|
|
|
|
-void drm_agp_do_release(drm_device_t *dev)
|
|
|
|
|
|
+int drm_agp_release_ioctl(struct inode *inode, struct file *filp,
|
|
|
|
+ unsigned int cmd, unsigned long arg)
|
|
{
|
|
{
|
|
- agp_backend_release(dev->agp->bridge);
|
|
|
|
|
|
+ drm_file_t *priv = filp->private_data;
|
|
|
|
+ drm_device_t *dev = priv->head->dev;
|
|
|
|
+
|
|
|
|
+ return drm_agp_release(dev);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
* Enable the AGP bus.
|
|
* Enable the AGP bus.
|
|
*
|
|
*
|
|
- * \param inode device inode.
|
|
|
|
- * \param filp file pointer.
|
|
|
|
- * \param cmd command.
|
|
|
|
- * \param arg pointer to a drm_agp_mode structure.
|
|
|
|
|
|
+ * \param dev DRM device that has previously acquired AGP.
|
|
|
|
+ * \param mode Requested AGP mode.
|
|
* \return zero on success or a negative number on failure.
|
|
* \return zero on success or a negative number on failure.
|
|
*
|
|
*
|
|
* Verifies the AGP device has been acquired but not enabled, and calls
|
|
* Verifies the AGP device has been acquired but not enabled, and calls
|
|
- * agp_enable().
|
|
|
|
|
|
+ * \c agp_enable.
|
|
*/
|
|
*/
|
|
-int drm_agp_enable(struct inode *inode, struct file *filp,
|
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
|
|
|
+int drm_agp_enable(drm_device_t *dev, drm_agp_mode_t mode)
|
|
{
|
|
{
|
|
- drm_file_t *priv = filp->private_data;
|
|
|
|
- drm_device_t *dev = priv->head->dev;
|
|
|
|
- drm_agp_mode_t mode;
|
|
|
|
-
|
|
|
|
if (!dev->agp || !dev->agp->acquired)
|
|
if (!dev->agp || !dev->agp->acquired)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
- if (copy_from_user(&mode, (drm_agp_mode_t __user *)arg, sizeof(mode)))
|
|
|
|
- return -EFAULT;
|
|
|
|
-
|
|
|
|
dev->agp->mode = mode.mode;
|
|
dev->agp->mode = mode.mode;
|
|
agp_enable(dev->agp->bridge, mode.mode);
|
|
agp_enable(dev->agp->bridge, mode.mode);
|
|
dev->agp->base = dev->agp->agp_info.aper_base;
|
|
dev->agp->base = dev->agp->agp_info.aper_base;
|
|
dev->agp->enabled = 1;
|
|
dev->agp->enabled = 1;
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
+EXPORT_SYMBOL(drm_agp_enable);
|
|
|
|
+
|
|
|
|
+int drm_agp_enable_ioctl(struct inode *inode, struct file *filp,
|
|
|
|
+ unsigned int cmd, unsigned long arg)
|
|
|
|
+{
|
|
|
|
+ drm_file_t *priv = filp->private_data;
|
|
|
|
+ drm_device_t *dev = priv->head->dev;
|
|
|
|
+ drm_agp_mode_t mode;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ if (copy_from_user(&mode, (drm_agp_mode_t __user *) arg, sizeof(mode)))
|
|
|
|
+ return -EFAULT;
|
|
|
|
+
|
|
|
|
+ return drm_agp_enable(dev, mode);
|
|
|
|
+}
|
|
|
|
|
|
/**
|
|
/**
|
|
* Allocate AGP memory.
|
|
* Allocate AGP memory.
|