Merge branch 'drm-init-cleanup' of git://people.freedesktop.org/~danvet/drm into drm-next
Next pull request, this time more of the drm de-midlayering work. The big thing is that his patch series here removes everything from drm_bus except the set_busid callback. Thierry has a few more patches on top of this to make that one optional to. With that we can ditch all the non-pci drm_bus implementations, which Thierry has already done for the fake tegra host1x drm_bus. Reviewed by Thierry, Laurent and David and now also survived some testing on my intel boxes to make sure the irq fumble is fixed correctly ;-) The last minute rebase was just to add the r-b tags from Thierry for the 2 patches I've redone. * 'drm-init-cleanup' of git://people.freedesktop.org/~danvet/drm: drm/<drivers>: don't set driver->dev_priv_size to 0 drm: Remove dev->kdriver drm: remove drm_bus->get_name drm: rip out dev->devname drm: inline drm_pci_set_unique drm: remove bus->get_irq implementations drm: pass the irq explicitly to drm_irq_install drm/irq: Look up the pci irq directly in the drm_control ioctl drm/irq: track the irq installed in drm_irq_install in dev->irq drm: rename dev->count_lock to dev->buf_lock drm: Rip out totally bogus vga_switcheroo->can_switch locking drm: kill drm_bus->bus_type drm: remove drm_dev_to_irq from drivers drm/irq: remove cargo-culted locking from irq_install/uninstall drm/irq: drm_control is a legacy ioctl, so pci devices only drm/pci: fold in irq_by_busid support drm/irq: simplify irq checks in drm_wait_vblank
This commit is contained in:
commit
444c9a08bf
@ -341,14 +341,6 @@ char *date;</synopsis>
|
||||
</para>
|
||||
<sect4>
|
||||
<title>Managed IRQ Registration</title>
|
||||
<para>
|
||||
Both the <function>drm_irq_install</function> and
|
||||
<function>drm_irq_uninstall</function> functions get the device IRQ by
|
||||
calling <function>drm_dev_to_irq</function>. This inline function will
|
||||
call a bus-specific operation to retrieve the IRQ number. For platform
|
||||
devices, <function>platform_get_irq</function>(..., 0) is used to
|
||||
retrieve the IRQ number.
|
||||
</para>
|
||||
<para>
|
||||
<function>drm_irq_install</function> starts by calling the
|
||||
<methodname>irq_preinstall</methodname> driver operation. The operation
|
||||
@ -356,7 +348,7 @@ char *date;</synopsis>
|
||||
clearing all pending interrupt flags or disabling the interrupt.
|
||||
</para>
|
||||
<para>
|
||||
The IRQ will then be requested by a call to
|
||||
The passed-in IRQ will then be requested by a call to
|
||||
<function>request_irq</function>. If the DRIVER_IRQ_SHARED driver
|
||||
feature flag is set, a shared (IRQF_SHARED) IRQ handler will be
|
||||
requested.
|
||||
|
@ -173,7 +173,7 @@ static int armada_drm_load(struct drm_device *dev, unsigned long flags)
|
||||
if (ret)
|
||||
goto err_kms;
|
||||
|
||||
ret = drm_irq_install(dev);
|
||||
ret = drm_irq_install(dev, platform_get_irq(dev->platformdev, 0));
|
||||
if (ret)
|
||||
goto err_kms;
|
||||
|
||||
|
@ -198,7 +198,6 @@ static const struct file_operations ast_fops = {
|
||||
|
||||
static struct drm_driver driver = {
|
||||
.driver_features = DRIVER_MODESET | DRIVER_GEM,
|
||||
.dev_priv_size = 0,
|
||||
|
||||
.load = ast_driver_load,
|
||||
.unload = ast_driver_unload,
|
||||
|
@ -656,13 +656,13 @@ int drm_addbufs_agp(struct drm_device * dev, struct drm_buf_desc * request)
|
||||
DRM_DEBUG("zone invalid\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
spin_lock(&dev->count_lock);
|
||||
spin_lock(&dev->buf_lock);
|
||||
if (dev->buf_use) {
|
||||
spin_unlock(&dev->count_lock);
|
||||
spin_unlock(&dev->buf_lock);
|
||||
return -EBUSY;
|
||||
}
|
||||
atomic_inc(&dev->buf_alloc);
|
||||
spin_unlock(&dev->count_lock);
|
||||
spin_unlock(&dev->buf_lock);
|
||||
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
entry = &dma->bufs[order];
|
||||
@ -805,13 +805,13 @@ int drm_addbufs_pci(struct drm_device * dev, struct drm_buf_desc * request)
|
||||
page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0;
|
||||
total = PAGE_SIZE << page_order;
|
||||
|
||||
spin_lock(&dev->count_lock);
|
||||
spin_lock(&dev->buf_lock);
|
||||
if (dev->buf_use) {
|
||||
spin_unlock(&dev->count_lock);
|
||||
spin_unlock(&dev->buf_lock);
|
||||
return -EBUSY;
|
||||
}
|
||||
atomic_inc(&dev->buf_alloc);
|
||||
spin_unlock(&dev->count_lock);
|
||||
spin_unlock(&dev->buf_lock);
|
||||
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
entry = &dma->bufs[order];
|
||||
@ -1015,13 +1015,13 @@ static int drm_addbufs_sg(struct drm_device * dev, struct drm_buf_desc * request
|
||||
if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER)
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock(&dev->count_lock);
|
||||
spin_lock(&dev->buf_lock);
|
||||
if (dev->buf_use) {
|
||||
spin_unlock(&dev->count_lock);
|
||||
spin_unlock(&dev->buf_lock);
|
||||
return -EBUSY;
|
||||
}
|
||||
atomic_inc(&dev->buf_alloc);
|
||||
spin_unlock(&dev->count_lock);
|
||||
spin_unlock(&dev->buf_lock);
|
||||
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
entry = &dma->bufs[order];
|
||||
@ -1175,7 +1175,7 @@ int drm_addbufs(struct drm_device *dev, void *data,
|
||||
* \param arg pointer to a drm_buf_info structure.
|
||||
* \return zero on success or a negative number on failure.
|
||||
*
|
||||
* Increments drm_device::buf_use while holding the drm_device::count_lock
|
||||
* Increments drm_device::buf_use while holding the drm_device::buf_lock
|
||||
* lock, preventing of allocating more buffers after this call. Information
|
||||
* about each requested buffer is then copied into user space.
|
||||
*/
|
||||
@ -1196,13 +1196,13 @@ int drm_infobufs(struct drm_device *dev, void *data,
|
||||
if (!dma)
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock(&dev->count_lock);
|
||||
spin_lock(&dev->buf_lock);
|
||||
if (atomic_read(&dev->buf_alloc)) {
|
||||
spin_unlock(&dev->count_lock);
|
||||
spin_unlock(&dev->buf_lock);
|
||||
return -EBUSY;
|
||||
}
|
||||
++dev->buf_use; /* Can't allocate more after this call */
|
||||
spin_unlock(&dev->count_lock);
|
||||
spin_unlock(&dev->buf_lock);
|
||||
|
||||
for (i = 0, count = 0; i < DRM_MAX_ORDER + 1; i++) {
|
||||
if (dma->bufs[i].buf_count)
|
||||
@ -1381,13 +1381,13 @@ int drm_mapbufs(struct drm_device *dev, void *data,
|
||||
if (!dma)
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock(&dev->count_lock);
|
||||
spin_lock(&dev->buf_lock);
|
||||
if (atomic_read(&dev->buf_alloc)) {
|
||||
spin_unlock(&dev->count_lock);
|
||||
spin_unlock(&dev->buf_lock);
|
||||
return -EBUSY;
|
||||
}
|
||||
dev->buf_use++; /* Can't allocate more after this call */
|
||||
spin_unlock(&dev->count_lock);
|
||||
spin_unlock(&dev->buf_lock);
|
||||
|
||||
if (request->count >= dma->buf_count) {
|
||||
if ((dev->agp && (dma->flags & _DRM_DMA_USE_AGP))
|
||||
|
@ -47,18 +47,16 @@ int drm_name_info(struct seq_file *m, void *data)
|
||||
struct drm_minor *minor = node->minor;
|
||||
struct drm_device *dev = minor->dev;
|
||||
struct drm_master *master = minor->master;
|
||||
const char *bus_name;
|
||||
if (!master)
|
||||
return 0;
|
||||
|
||||
bus_name = dev->driver->bus->get_name(dev);
|
||||
if (master->unique) {
|
||||
seq_printf(m, "%s %s %s\n",
|
||||
bus_name,
|
||||
dev->driver->name,
|
||||
dev_name(dev->dev), master->unique);
|
||||
} else {
|
||||
seq_printf(m, "%s %s\n",
|
||||
bus_name, dev_name(dev->dev));
|
||||
dev->driver->name, dev_name(dev->dev));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -72,9 +72,6 @@ static void
|
||||
drm_unset_busid(struct drm_device *dev,
|
||||
struct drm_master *master)
|
||||
{
|
||||
kfree(dev->devname);
|
||||
dev->devname = NULL;
|
||||
|
||||
kfree(master->unique);
|
||||
master->unique = NULL;
|
||||
master->unique_len = 0;
|
||||
@ -93,7 +90,8 @@ drm_unset_busid(struct drm_device *dev,
|
||||
* Copies the bus id from userspace into drm_device::unique, and verifies that
|
||||
* it matches the device this DRM is attached to (EINVAL otherwise). Deprecated
|
||||
* in interface version 1.1 and will return EBUSY when setversion has requested
|
||||
* version 1.1 or greater.
|
||||
* version 1.1 or greater. Also note that KMS is all version 1.1 and later and
|
||||
* UMS was only ever supported on pci devices.
|
||||
*/
|
||||
int drm_setunique(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
@ -108,10 +106,13 @@ int drm_setunique(struct drm_device *dev, void *data,
|
||||
if (!u->unique_len || u->unique_len > 1024)
|
||||
return -EINVAL;
|
||||
|
||||
if (!dev->driver->bus->set_unique)
|
||||
if (drm_core_check_feature(dev, DRIVER_MODESET))
|
||||
return 0;
|
||||
|
||||
if (WARN_ON(!dev->pdev))
|
||||
return -EINVAL;
|
||||
|
||||
ret = dev->driver->bus->set_unique(dev, master, u);
|
||||
ret = drm_pci_set_unique(dev, master, u);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
|
@ -56,33 +56,6 @@
|
||||
*/
|
||||
#define DRM_REDUNDANT_VBLIRQ_THRESH_NS 1000000
|
||||
|
||||
/**
|
||||
* Get interrupt from bus id.
|
||||
*
|
||||
* \param inode device inode.
|
||||
* \param file_priv DRM file private.
|
||||
* \param cmd command.
|
||||
* \param arg user argument, pointing to a drm_irq_busid structure.
|
||||
* \return zero on success or a negative number on failure.
|
||||
*
|
||||
* Finds the PCI device with the specified bus id and gets its IRQ number.
|
||||
* This IOCTL is deprecated, and will now return EINVAL for any busid not equal
|
||||
* to that of the device that this DRM instance attached to.
|
||||
*/
|
||||
int drm_irq_by_busid(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_irq_busid *p = data;
|
||||
|
||||
if (!dev->driver->bus->irq_by_busid)
|
||||
return -EINVAL;
|
||||
|
||||
if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
|
||||
return -EINVAL;
|
||||
|
||||
return dev->driver->bus->irq_by_busid(dev, p);
|
||||
}
|
||||
|
||||
/*
|
||||
* Clear vblank timestamp buffer for a crtc.
|
||||
*/
|
||||
@ -269,34 +242,26 @@ static void drm_irq_vgaarb_nokms(void *cookie, bool state)
|
||||
* \c irq_preinstall() and \c irq_postinstall() functions
|
||||
* before and after the installation.
|
||||
*/
|
||||
int drm_irq_install(struct drm_device *dev)
|
||||
int drm_irq_install(struct drm_device *dev, int irq)
|
||||
{
|
||||
int ret;
|
||||
unsigned long sh_flags = 0;
|
||||
char *irqname;
|
||||
|
||||
if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
|
||||
return -EINVAL;
|
||||
|
||||
if (drm_dev_to_irq(dev) == 0)
|
||||
if (irq == 0)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
|
||||
/* Driver must have been initialized */
|
||||
if (!dev->dev_private) {
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
if (!dev->dev_private)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (dev->irq_enabled) {
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
if (dev->irq_enabled)
|
||||
return -EBUSY;
|
||||
}
|
||||
dev->irq_enabled = true;
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
||||
DRM_DEBUG("irq=%d\n", drm_dev_to_irq(dev));
|
||||
DRM_DEBUG("irq=%d\n", irq);
|
||||
|
||||
/* Before installing handler */
|
||||
if (dev->driver->irq_preinstall)
|
||||
@ -306,18 +271,11 @@ int drm_irq_install(struct drm_device *dev)
|
||||
if (drm_core_check_feature(dev, DRIVER_IRQ_SHARED))
|
||||
sh_flags = IRQF_SHARED;
|
||||
|
||||
if (dev->devname)
|
||||
irqname = dev->devname;
|
||||
else
|
||||
irqname = dev->driver->name;
|
||||
|
||||
ret = request_irq(drm_dev_to_irq(dev), dev->driver->irq_handler,
|
||||
sh_flags, irqname, dev);
|
||||
ret = request_irq(irq, dev->driver->irq_handler,
|
||||
sh_flags, dev->driver->name, dev);
|
||||
|
||||
if (ret < 0) {
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
dev->irq_enabled = false;
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -329,12 +287,12 @@ int drm_irq_install(struct drm_device *dev)
|
||||
ret = dev->driver->irq_postinstall(dev);
|
||||
|
||||
if (ret < 0) {
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
dev->irq_enabled = false;
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
if (!drm_core_check_feature(dev, DRIVER_MODESET))
|
||||
vga_client_register(dev->pdev, NULL, NULL, NULL);
|
||||
free_irq(drm_dev_to_irq(dev), dev);
|
||||
free_irq(irq, dev);
|
||||
} else {
|
||||
dev->irq = irq;
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -357,10 +315,8 @@ int drm_irq_uninstall(struct drm_device *dev)
|
||||
if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
irq_enabled = dev->irq_enabled;
|
||||
dev->irq_enabled = false;
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
||||
/*
|
||||
* Wake up any waiters so they don't hang.
|
||||
@ -379,7 +335,7 @@ int drm_irq_uninstall(struct drm_device *dev)
|
||||
if (!irq_enabled)
|
||||
return -EINVAL;
|
||||
|
||||
DRM_DEBUG("irq=%d\n", drm_dev_to_irq(dev));
|
||||
DRM_DEBUG("irq=%d\n", dev->irq);
|
||||
|
||||
if (!drm_core_check_feature(dev, DRIVER_MODESET))
|
||||
vga_client_register(dev->pdev, NULL, NULL, NULL);
|
||||
@ -387,7 +343,7 @@ int drm_irq_uninstall(struct drm_device *dev)
|
||||
if (dev->driver->irq_uninstall)
|
||||
dev->driver->irq_uninstall(dev);
|
||||
|
||||
free_irq(drm_dev_to_irq(dev), dev);
|
||||
free_irq(dev->irq, dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -408,28 +364,38 @@ int drm_control(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_control *ctl = data;
|
||||
int ret = 0, irq;
|
||||
|
||||
/* if we haven't irq we fallback for compatibility reasons -
|
||||
* this used to be a separate function in drm_dma.h
|
||||
*/
|
||||
|
||||
if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
|
||||
return 0;
|
||||
if (drm_core_check_feature(dev, DRIVER_MODESET))
|
||||
return 0;
|
||||
/* UMS was only ever support on pci devices. */
|
||||
if (WARN_ON(!dev->pdev))
|
||||
return -EINVAL;
|
||||
|
||||
switch (ctl->func) {
|
||||
case DRM_INST_HANDLER:
|
||||
if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
|
||||
return 0;
|
||||
if (drm_core_check_feature(dev, DRIVER_MODESET))
|
||||
return 0;
|
||||
irq = dev->pdev->irq;
|
||||
|
||||
if (dev->if_version < DRM_IF_VERSION(1, 2) &&
|
||||
ctl->irq != drm_dev_to_irq(dev))
|
||||
ctl->irq != irq)
|
||||
return -EINVAL;
|
||||
return drm_irq_install(dev);
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
ret = drm_irq_install(dev, irq);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
||||
return ret;
|
||||
case DRM_UNINST_HANDLER:
|
||||
if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
|
||||
return 0;
|
||||
if (drm_core_check_feature(dev, DRIVER_MODESET))
|
||||
return 0;
|
||||
return drm_irq_uninstall(dev);
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
ret = drm_irq_uninstall(dev);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
||||
return ret;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -1160,9 +1126,8 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
|
||||
int ret;
|
||||
unsigned int flags, seq, crtc, high_crtc;
|
||||
|
||||
if (drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
|
||||
if ((!drm_dev_to_irq(dev)) || (!dev->irq_enabled))
|
||||
return -EINVAL;
|
||||
if (!dev->irq_enabled)
|
||||
return -EINVAL;
|
||||
|
||||
if (vblwait->request.type & _DRM_VBLANK_SIGNAL)
|
||||
return -EINVAL;
|
||||
|
@ -137,21 +137,9 @@ static int drm_get_pci_domain(struct drm_device *dev)
|
||||
return pci_domain_nr(dev->pdev->bus);
|
||||
}
|
||||
|
||||
static int drm_pci_get_irq(struct drm_device *dev)
|
||||
{
|
||||
return dev->pdev->irq;
|
||||
}
|
||||
|
||||
static const char *drm_pci_get_name(struct drm_device *dev)
|
||||
{
|
||||
struct pci_driver *pdriver = dev->driver->kdriver.pci;
|
||||
return pdriver->name;
|
||||
}
|
||||
|
||||
static int drm_pci_set_busid(struct drm_device *dev, struct drm_master *master)
|
||||
{
|
||||
int len, ret;
|
||||
struct pci_driver *pdriver = dev->driver->kdriver.pci;
|
||||
master->unique_len = 40;
|
||||
master->unique_size = master->unique_len;
|
||||
master->unique = kmalloc(master->unique_size, GFP_KERNEL);
|
||||
@ -173,29 +161,16 @@ static int drm_pci_set_busid(struct drm_device *dev, struct drm_master *master)
|
||||
} else
|
||||
master->unique_len = len;
|
||||
|
||||
dev->devname =
|
||||
kmalloc(strlen(pdriver->name) +
|
||||
master->unique_len + 2, GFP_KERNEL);
|
||||
|
||||
if (dev->devname == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
sprintf(dev->devname, "%s@%s", pdriver->name,
|
||||
master->unique);
|
||||
|
||||
return 0;
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int drm_pci_set_unique(struct drm_device *dev,
|
||||
struct drm_master *master,
|
||||
struct drm_unique *u)
|
||||
int drm_pci_set_unique(struct drm_device *dev,
|
||||
struct drm_master *master,
|
||||
struct drm_unique *u)
|
||||
{
|
||||
int domain, bus, slot, func, ret;
|
||||
const char *bus_name;
|
||||
|
||||
master->unique_len = u->unique_len;
|
||||
master->unique_size = u->unique_len + 1;
|
||||
@ -212,17 +187,6 @@ static int drm_pci_set_unique(struct drm_device *dev,
|
||||
|
||||
master->unique[master->unique_len] = '\0';
|
||||
|
||||
bus_name = dev->driver->bus->get_name(dev);
|
||||
dev->devname = kmalloc(strlen(bus_name) +
|
||||
strlen(master->unique) + 2, GFP_KERNEL);
|
||||
if (!dev->devname) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
sprintf(dev->devname, "%s@%s", bus_name,
|
||||
master->unique);
|
||||
|
||||
/* Return error if the busid submitted doesn't match the device's actual
|
||||
* busid.
|
||||
*/
|
||||
@ -247,7 +211,6 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int drm_pci_irq_by_busid(struct drm_device *dev, struct drm_irq_busid *p)
|
||||
{
|
||||
if ((p->busnum >> 8) != drm_get_pci_domain(dev) ||
|
||||
@ -262,6 +225,37 @@ static int drm_pci_irq_by_busid(struct drm_device *dev, struct drm_irq_busid *p)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get interrupt from bus id.
|
||||
*
|
||||
* \param inode device inode.
|
||||
* \param file_priv DRM file private.
|
||||
* \param cmd command.
|
||||
* \param arg user argument, pointing to a drm_irq_busid structure.
|
||||
* \return zero on success or a negative number on failure.
|
||||
*
|
||||
* Finds the PCI device with the specified bus id and gets its IRQ number.
|
||||
* This IOCTL is deprecated, and will now return EINVAL for any busid not equal
|
||||
* to that of the device that this DRM instance attached to.
|
||||
*/
|
||||
int drm_irq_by_busid(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_irq_busid *p = data;
|
||||
|
||||
if (drm_core_check_feature(dev, DRIVER_MODESET))
|
||||
return -EINVAL;
|
||||
|
||||
/* UMS was only ever support on PCI devices. */
|
||||
if (WARN_ON(!dev->pdev))
|
||||
return -EINVAL;
|
||||
|
||||
if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
|
||||
return -EINVAL;
|
||||
|
||||
return drm_pci_irq_by_busid(dev, p);
|
||||
}
|
||||
|
||||
static void drm_pci_agp_init(struct drm_device *dev)
|
||||
{
|
||||
if (drm_core_check_feature(dev, DRIVER_USE_AGP)) {
|
||||
@ -287,12 +281,7 @@ void drm_pci_agp_destroy(struct drm_device *dev)
|
||||
}
|
||||
|
||||
static struct drm_bus drm_pci_bus = {
|
||||
.bus_type = DRIVER_BUS_PCI,
|
||||
.get_irq = drm_pci_get_irq,
|
||||
.get_name = drm_pci_get_name,
|
||||
.set_busid = drm_pci_set_busid,
|
||||
.set_unique = drm_pci_set_unique,
|
||||
.irq_by_busid = drm_pci_irq_by_busid,
|
||||
};
|
||||
|
||||
/**
|
||||
@ -375,7 +364,6 @@ int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver)
|
||||
|
||||
DRM_DEBUG("\n");
|
||||
|
||||
driver->kdriver.pci = pdriver;
|
||||
driver->bus = &drm_pci_bus;
|
||||
|
||||
if (driver->driver_features & DRIVER_MODESET)
|
||||
@ -453,6 +441,19 @@ int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver)
|
||||
}
|
||||
|
||||
void drm_pci_agp_destroy(struct drm_device *dev) {}
|
||||
|
||||
int drm_irq_by_busid(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
int drm_pci_set_unique(struct drm_device *dev,
|
||||
struct drm_master *master,
|
||||
struct drm_unique *u)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
EXPORT_SYMBOL(drm_pci_init);
|
||||
|
@ -68,16 +68,6 @@ err_free:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int drm_platform_get_irq(struct drm_device *dev)
|
||||
{
|
||||
return platform_get_irq(dev->platformdev, 0);
|
||||
}
|
||||
|
||||
static const char *drm_platform_get_name(struct drm_device *dev)
|
||||
{
|
||||
return dev->platformdev->name;
|
||||
}
|
||||
|
||||
static int drm_platform_set_busid(struct drm_device *dev, struct drm_master *master)
|
||||
{
|
||||
int len, ret, id;
|
||||
@ -106,26 +96,12 @@ static int drm_platform_set_busid(struct drm_device *dev, struct drm_master *mas
|
||||
goto err;
|
||||
}
|
||||
|
||||
dev->devname =
|
||||
kmalloc(strlen(dev->platformdev->name) +
|
||||
master->unique_len + 2, GFP_KERNEL);
|
||||
|
||||
if (dev->devname == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
sprintf(dev->devname, "%s@%s", dev->platformdev->name,
|
||||
master->unique);
|
||||
return 0;
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct drm_bus drm_platform_bus = {
|
||||
.bus_type = DRIVER_BUS_PLATFORM,
|
||||
.get_irq = drm_platform_get_irq,
|
||||
.get_name = drm_platform_get_name,
|
||||
.set_busid = drm_platform_set_busid,
|
||||
};
|
||||
|
||||
@ -145,7 +121,6 @@ int drm_platform_init(struct drm_driver *driver, struct platform_device *platfor
|
||||
{
|
||||
DRM_DEBUG("\n");
|
||||
|
||||
driver->kdriver.platform_device = platform_device;
|
||||
driver->bus = &drm_platform_bus;
|
||||
return drm_get_platform_dev(platform_device, driver);
|
||||
}
|
||||
|
@ -169,9 +169,6 @@ static void drm_master_destroy(struct kref *kref)
|
||||
master->unique_len = 0;
|
||||
}
|
||||
|
||||
kfree(dev->devname);
|
||||
dev->devname = NULL;
|
||||
|
||||
list_for_each_entry_safe(pt, next, &master->magicfree, head) {
|
||||
list_del(&pt->head);
|
||||
drm_ht_remove_item(&master->magiclist, &pt->hash_item);
|
||||
@ -572,7 +569,7 @@ struct drm_device *drm_dev_alloc(struct drm_driver *driver,
|
||||
INIT_LIST_HEAD(&dev->maplist);
|
||||
INIT_LIST_HEAD(&dev->vblank_event_list);
|
||||
|
||||
spin_lock_init(&dev->count_lock);
|
||||
spin_lock_init(&dev->buf_lock);
|
||||
spin_lock_init(&dev->event_lock);
|
||||
mutex_init(&dev->struct_mutex);
|
||||
mutex_init(&dev->ctxlist_mutex);
|
||||
@ -651,8 +648,6 @@ static void drm_dev_release(struct kref *ref)
|
||||
drm_minor_free(dev, DRM_MINOR_RENDER);
|
||||
drm_minor_free(dev, DRM_MINOR_CONTROL);
|
||||
|
||||
kfree(dev->devname);
|
||||
|
||||
mutex_destroy(&dev->master_mutex);
|
||||
kfree(dev);
|
||||
}
|
||||
|
@ -36,16 +36,6 @@ err_free:
|
||||
}
|
||||
EXPORT_SYMBOL(drm_get_usb_dev);
|
||||
|
||||
static int drm_usb_get_irq(struct drm_device *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char *drm_usb_get_name(struct drm_device *dev)
|
||||
{
|
||||
return "USB";
|
||||
}
|
||||
|
||||
static int drm_usb_set_busid(struct drm_device *dev,
|
||||
struct drm_master *master)
|
||||
{
|
||||
@ -53,9 +43,6 @@ static int drm_usb_set_busid(struct drm_device *dev,
|
||||
}
|
||||
|
||||
static struct drm_bus drm_usb_bus = {
|
||||
.bus_type = DRIVER_BUS_USB,
|
||||
.get_irq = drm_usb_get_irq,
|
||||
.get_name = drm_usb_get_name,
|
||||
.set_busid = drm_usb_set_busid,
|
||||
};
|
||||
|
||||
@ -64,7 +51,6 @@ int drm_usb_init(struct drm_driver *driver, struct usb_driver *udriver)
|
||||
int res;
|
||||
DRM_DEBUG("\n");
|
||||
|
||||
driver->kdriver.usb = udriver;
|
||||
driver->bus = &drm_usb_bus;
|
||||
|
||||
res = usb_register(udriver);
|
||||
|
@ -354,7 +354,7 @@ static int psb_driver_load(struct drm_device *dev, unsigned long flags)
|
||||
PSB_WVDC32(0xFFFFFFFF, PSB_INT_MASK_R);
|
||||
spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
|
||||
|
||||
drm_irq_install(dev);
|
||||
drm_irq_install(dev, dev->pdev->irq);
|
||||
|
||||
dev->vblank_disable_allowed = true;
|
||||
dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
|
||||
|
@ -1280,12 +1280,13 @@ static void i915_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_
|
||||
static bool i915_switcheroo_can_switch(struct pci_dev *pdev)
|
||||
{
|
||||
struct drm_device *dev = pci_get_drvdata(pdev);
|
||||
bool can_switch;
|
||||
|
||||
spin_lock(&dev->count_lock);
|
||||
can_switch = (dev->open_count == 0);
|
||||
spin_unlock(&dev->count_lock);
|
||||
return can_switch;
|
||||
/*
|
||||
* FIXME: open_count is protected by drm_global_mutex but that would lead to
|
||||
* locking inversion with the driver load path. And the access here is
|
||||
* completely racy anyway. So don't bother with locking for now.
|
||||
*/
|
||||
return dev->open_count == 0;
|
||||
}
|
||||
|
||||
static const struct vga_switcheroo_client_ops i915_switcheroo_ops = {
|
||||
@ -1329,7 +1330,7 @@ static int i915_load_modeset_init(struct drm_device *dev)
|
||||
|
||||
intel_power_domains_init_hw(dev_priv);
|
||||
|
||||
ret = drm_irq_install(dev);
|
||||
ret = drm_irq_install(dev, dev->pdev->irq);
|
||||
if (ret)
|
||||
goto cleanup_gem_stolen;
|
||||
|
||||
|
@ -574,7 +574,7 @@ static int __i915_drm_thaw(struct drm_device *dev, bool restore_gtt_mappings)
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
||||
/* We need working interrupts for modeset enabling ... */
|
||||
drm_irq_install(dev);
|
||||
drm_irq_install(dev, dev->pdev->irq);
|
||||
|
||||
intel_modeset_init_hw(dev);
|
||||
|
||||
@ -746,8 +746,13 @@ int i915_reset(struct drm_device *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME: This is horribly race against concurrent pageflip and
|
||||
* vblank wait ioctls since they can observe dev->irqs_disabled
|
||||
* being false when they shouldn't be able to.
|
||||
*/
|
||||
drm_irq_uninstall(dev);
|
||||
drm_irq_install(dev);
|
||||
drm_irq_install(dev, dev->pdev->irq);
|
||||
|
||||
/* rps/rc6 re-init is necessary to restore state lost after the
|
||||
* reset and the re-install of drm irq. Skip for ironlake per
|
||||
|
@ -4523,16 +4523,15 @@ i915_gem_entervt_ioctl(struct drm_device *dev, void *data,
|
||||
}
|
||||
|
||||
BUG_ON(!list_empty(&dev_priv->gtt.base.active_list));
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
||||
ret = drm_irq_install(dev);
|
||||
ret = drm_irq_install(dev, dev->pdev->irq);
|
||||
if (ret)
|
||||
goto cleanup_ringbuffer;
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
||||
return 0;
|
||||
|
||||
cleanup_ringbuffer:
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
i915_gem_cleanup_ringbuffer(dev);
|
||||
dev_priv->ums.mm_suspended = 1;
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
@ -4547,7 +4546,9 @@ i915_gem_leavevt_ioctl(struct drm_device *dev, void *data,
|
||||
if (drm_core_check_feature(dev, DRIVER_MODESET))
|
||||
return 0;
|
||||
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
drm_irq_uninstall(dev);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
||||
return i915_gem_suspend(dev);
|
||||
}
|
||||
|
@ -1020,7 +1020,7 @@ static int mga_getparam(struct drm_device *dev, void *data, struct drm_file *fil
|
||||
|
||||
switch (param->param) {
|
||||
case MGA_PARAM_IRQ_NR:
|
||||
value = drm_dev_to_irq(dev);
|
||||
value = dev->pdev->irq;
|
||||
break;
|
||||
case MGA_PARAM_CARD_TYPE:
|
||||
value = dev_priv->chipset;
|
||||
|
@ -288,7 +288,7 @@ static int msm_load(struct drm_device *dev, unsigned long flags)
|
||||
}
|
||||
|
||||
pm_runtime_get_sync(dev->dev);
|
||||
ret = drm_irq_install(dev);
|
||||
ret = drm_irq_install(dev, platform_get_irq(dev->platformdev, 0));
|
||||
pm_runtime_put_sync(dev->dev);
|
||||
if (ret < 0) {
|
||||
dev_err(dev->dev, "failed to install IRQ handler\n");
|
||||
|
@ -64,12 +64,13 @@ static bool
|
||||
nouveau_switcheroo_can_switch(struct pci_dev *pdev)
|
||||
{
|
||||
struct drm_device *dev = pci_get_drvdata(pdev);
|
||||
bool can_switch;
|
||||
|
||||
spin_lock(&dev->count_lock);
|
||||
can_switch = (dev->open_count == 0);
|
||||
spin_unlock(&dev->count_lock);
|
||||
return can_switch;
|
||||
/*
|
||||
* FIXME: open_count is protected by drm_global_mutex but that would lead to
|
||||
* locking inversion with the driver load path. And the access here is
|
||||
* completely racy anyway. So don't bother with locking for now.
|
||||
*/
|
||||
return dev->open_count == 0;
|
||||
}
|
||||
|
||||
static const struct vga_switcheroo_client_ops
|
||||
|
@ -214,7 +214,6 @@ static struct pci_driver qxl_pci_driver = {
|
||||
static struct drm_driver qxl_driver = {
|
||||
.driver_features = DRIVER_GEM | DRIVER_MODESET |
|
||||
DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED,
|
||||
.dev_priv_size = 0,
|
||||
.load = qxl_driver_load,
|
||||
.unload = qxl_driver_unload,
|
||||
|
||||
|
@ -87,7 +87,7 @@ int qxl_irq_init(struct qxl_device *qdev)
|
||||
atomic_set(&qdev->irq_received_cursor, 0);
|
||||
atomic_set(&qdev->irq_received_io_cmd, 0);
|
||||
qdev->irq_received_error = 0;
|
||||
ret = drm_irq_install(qdev->ddev);
|
||||
ret = drm_irq_install(qdev->ddev, qdev->ddev->pdev->irq);
|
||||
qdev->ram_header->int_mask = QXL_INTERRUPT_MASK;
|
||||
if (unlikely(ret != 0)) {
|
||||
DRM_ERROR("Failed installing irq: %d\n", ret);
|
||||
|
@ -1594,7 +1594,7 @@ static int r128_getparam(struct drm_device *dev, void *data, struct drm_file *fi
|
||||
|
||||
switch (param->param) {
|
||||
case R128_PARAM_IRQ_NR:
|
||||
value = drm_dev_to_irq(dev);
|
||||
value = dev->pdev->irq;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
@ -1125,12 +1125,13 @@ static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switchero
|
||||
static bool radeon_switcheroo_can_switch(struct pci_dev *pdev)
|
||||
{
|
||||
struct drm_device *dev = pci_get_drvdata(pdev);
|
||||
bool can_switch;
|
||||
|
||||
spin_lock(&dev->count_lock);
|
||||
can_switch = (dev->open_count == 0);
|
||||
spin_unlock(&dev->count_lock);
|
||||
return can_switch;
|
||||
/*
|
||||
* FIXME: open_count is protected by drm_global_mutex but that would lead to
|
||||
* locking inversion with the driver load path. And the access here is
|
||||
* completely racy anyway. So don't bother with locking for now.
|
||||
*/
|
||||
return dev->open_count == 0;
|
||||
}
|
||||
|
||||
static const struct vga_switcheroo_client_ops radeon_switcheroo_ops = {
|
||||
|
@ -519,7 +519,6 @@ static struct drm_driver kms_driver = {
|
||||
DRIVER_USE_AGP |
|
||||
DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | DRIVER_GEM |
|
||||
DRIVER_PRIME | DRIVER_RENDER,
|
||||
.dev_priv_size = 0,
|
||||
.load = radeon_driver_load_kms,
|
||||
.open = radeon_driver_open_kms,
|
||||
.preclose = radeon_driver_preclose_kms,
|
||||
|
@ -287,7 +287,7 @@ int radeon_irq_kms_init(struct radeon_device *rdev)
|
||||
INIT_WORK(&rdev->reset_work, radeon_irq_reset_work_func);
|
||||
|
||||
rdev->irq.installed = true;
|
||||
r = drm_irq_install(rdev->ddev);
|
||||
r = drm_irq_install(rdev->ddev, rdev->ddev->pdev->irq);
|
||||
if (r) {
|
||||
rdev->irq.installed = false;
|
||||
flush_work(&rdev->hotplug_work);
|
||||
|
@ -3054,7 +3054,7 @@ static int radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_fil
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
value = 0;
|
||||
else
|
||||
value = drm_dev_to_irq(dev);
|
||||
value = dev->pdev->irq;
|
||||
break;
|
||||
case RADEON_PARAM_GART_BASE:
|
||||
value = dev_priv->gart_vm_start;
|
||||
|
@ -185,7 +185,7 @@ static int shmob_drm_load(struct drm_device *dev, unsigned long flags)
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = drm_irq_install(dev);
|
||||
ret = drm_irq_install(dev, platform_get_irq(dev->platformdev, 0));
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "failed to install IRQ handler\n");
|
||||
goto done;
|
||||
|
@ -12,9 +12,7 @@ static int drm_host1x_set_busid(struct drm_device *dev,
|
||||
struct drm_master *master)
|
||||
{
|
||||
const char *device = dev_name(dev->dev);
|
||||
const char *driver = dev->driver->name;
|
||||
const char *bus = dev->dev->bus->name;
|
||||
int length;
|
||||
|
||||
master->unique_len = strlen(bus) + 1 + strlen(device);
|
||||
master->unique_size = master->unique_len;
|
||||
@ -25,19 +23,10 @@ static int drm_host1x_set_busid(struct drm_device *dev,
|
||||
|
||||
snprintf(master->unique, master->unique_len + 1, "%s:%s", bus, device);
|
||||
|
||||
length = strlen(driver) + 1 + master->unique_len;
|
||||
|
||||
dev->devname = kmalloc(length + 1, GFP_KERNEL);
|
||||
if (!dev->devname)
|
||||
return -ENOMEM;
|
||||
|
||||
snprintf(dev->devname, length + 1, "%s@%s", driver, master->unique);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct drm_bus drm_host1x_bus = {
|
||||
.bus_type = DRIVER_BUS_HOST1X,
|
||||
.set_busid = drm_host1x_set_busid,
|
||||
};
|
||||
|
||||
|
@ -268,7 +268,7 @@ static int tilcdc_load(struct drm_device *dev, unsigned long flags)
|
||||
}
|
||||
|
||||
pm_runtime_get_sync(dev->dev);
|
||||
ret = drm_irq_install(dev);
|
||||
ret = drm_irq_install(dev, platform_get_irq(dev->platformdev, 0));
|
||||
pm_runtime_put_sync(dev->dev);
|
||||
if (ret < 0) {
|
||||
dev_err(dev->dev, "failed to install IRQ handler\n");
|
||||
|
@ -806,7 +806,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
|
||||
}
|
||||
|
||||
if (dev_priv->capabilities & SVGA_CAP_IRQMASK) {
|
||||
ret = drm_irq_install(dev);
|
||||
ret = drm_irq_install(dev, dev->pdev->irq);
|
||||
if (ret != 0) {
|
||||
DRM_ERROR("Failed installing irq: %d\n", ret);
|
||||
goto out_no_irq;
|
||||
|
@ -143,11 +143,6 @@ int drm_err(const char *func, const char *format, ...);
|
||||
#define DRIVER_PRIME 0x4000
|
||||
#define DRIVER_RENDER 0x8000
|
||||
|
||||
#define DRIVER_BUS_PCI 0x1
|
||||
#define DRIVER_BUS_PLATFORM 0x2
|
||||
#define DRIVER_BUS_USB 0x3
|
||||
#define DRIVER_BUS_HOST1X 0x4
|
||||
|
||||
/***********************************************************************/
|
||||
/** \name Begin the DRM... */
|
||||
/*@{*/
|
||||
@ -731,13 +726,7 @@ struct drm_master {
|
||||
#define DRM_SCANOUTPOS_ACCURATE (1 << 2)
|
||||
|
||||
struct drm_bus {
|
||||
int bus_type;
|
||||
int (*get_irq)(struct drm_device *dev);
|
||||
const char *(*get_name)(struct drm_device *dev);
|
||||
int (*set_busid)(struct drm_device *dev, struct drm_master *master);
|
||||
int (*set_unique)(struct drm_device *dev, struct drm_master *master,
|
||||
struct drm_unique *unique);
|
||||
int (*irq_by_busid)(struct drm_device *dev, struct drm_irq_busid *p);
|
||||
};
|
||||
|
||||
/**
|
||||
@ -974,11 +963,6 @@ struct drm_driver {
|
||||
const struct drm_ioctl_desc *ioctls;
|
||||
int num_ioctls;
|
||||
const struct file_operations *fops;
|
||||
union {
|
||||
struct pci_driver *pci;
|
||||
struct platform_device *platform_device;
|
||||
struct usb_driver *usb;
|
||||
} kdriver;
|
||||
struct drm_bus *bus;
|
||||
|
||||
/* List of devices hanging off this driver with stealth attach. */
|
||||
@ -1058,7 +1042,6 @@ struct drm_vblank_crtc {
|
||||
*/
|
||||
struct drm_device {
|
||||
struct list_head legacy_dev_list;/**< list of devices per driver for stealth attach cleanup */
|
||||
char *devname; /**< For /proc/interrupts */
|
||||
int if_version; /**< Highest interface version set */
|
||||
|
||||
/** \name Lifetime Management */
|
||||
@ -1076,14 +1059,14 @@ struct drm_device {
|
||||
|
||||
/** \name Locks */
|
||||
/*@{ */
|
||||
spinlock_t count_lock; /**< For inuse, drm_device::open_count, drm_device::buf_use */
|
||||
struct mutex struct_mutex; /**< For others */
|
||||
struct mutex master_mutex; /**< For drm_minor::master and drm_file::is_master */
|
||||
/*@} */
|
||||
|
||||
/** \name Usage Counters */
|
||||
/*@{ */
|
||||
int open_count; /**< Outstanding files open */
|
||||
int open_count; /**< Outstanding files open, protected by drm_global_mutex. */
|
||||
spinlock_t buf_lock; /**< For drm_device::buf_use and a few other things. */
|
||||
int buf_use; /**< Buffers in use -- cannot alloc */
|
||||
atomic_t buf_alloc; /**< Buffer allocation in progress */
|
||||
/*@} */
|
||||
@ -1114,6 +1097,8 @@ struct drm_device {
|
||||
/** \name Context support */
|
||||
/*@{ */
|
||||
bool irq_enabled; /**< True if irq handler is enabled */
|
||||
int irq;
|
||||
|
||||
__volatile__ long context_flag; /**< Context swapping flag */
|
||||
int last_context; /**< Last current context */
|
||||
/*@} */
|
||||
@ -1186,11 +1171,6 @@ static __inline__ int drm_core_check_feature(struct drm_device *dev,
|
||||
return ((dev->driver->driver_features & feature) ? 1 : 0);
|
||||
}
|
||||
|
||||
static inline int drm_dev_to_irq(struct drm_device *dev)
|
||||
{
|
||||
return dev->driver->bus->get_irq(dev);
|
||||
}
|
||||
|
||||
static inline void drm_device_set_unplugged(struct drm_device *dev)
|
||||
{
|
||||
smp_wmb();
|
||||
@ -1363,7 +1343,7 @@ extern void drm_core_reclaim_buffers(struct drm_device *dev,
|
||||
/* IRQ support (drm_irq.h) */
|
||||
extern int drm_control(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv);
|
||||
extern int drm_irq_install(struct drm_device *dev);
|
||||
extern int drm_irq_install(struct drm_device *dev, int irq);
|
||||
extern int drm_irq_uninstall(struct drm_device *dev);
|
||||
|
||||
extern int drm_vblank_init(struct drm_device *dev, int num_crtcs);
|
||||
@ -1522,6 +1502,9 @@ extern drm_dma_handle_t *drm_pci_alloc(struct drm_device *dev, size_t size,
|
||||
size_t align);
|
||||
extern void __drm_pci_free(struct drm_device *dev, drm_dma_handle_t * dmah);
|
||||
extern void drm_pci_free(struct drm_device *dev, drm_dma_handle_t * dmah);
|
||||
extern int drm_pci_set_unique(struct drm_device *dev,
|
||||
struct drm_master *master,
|
||||
struct drm_unique *u);
|
||||
|
||||
/* sysfs support (drm_sysfs.c) */
|
||||
struct drm_sysfs_class;
|
||||
|
Loading…
Reference in New Issue
Block a user