Commit db8cc27b authored by Dave Airlie's avatar Dave Airlie

Merge branch 'drm-platform' into drm-testing

* drm-platform:
  drm: Make sure the DRM offset matches the CPU
  drm: Add __arm defines to DRM
  drm: Add support for platform devices to register as DRM devices
  drm: Remove drm_resource wrappers
parents 6dbe7465 05269a3a
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
# #
menuconfig DRM menuconfig DRM
tristate "Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)" tristate "Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)"
depends on (AGP || AGP=n) && PCI && !EMULATED_CMPXCHG && MMU depends on (AGP || AGP=n) && !EMULATED_CMPXCHG && MMU
select I2C select I2C
select I2C_ALGOBIT select I2C_ALGOBIT
select SLOW_WORK select SLOW_WORK
...@@ -17,7 +17,7 @@ menuconfig DRM ...@@ -17,7 +17,7 @@ menuconfig DRM
These modules provide support for synchronization, security, and These modules provide support for synchronization, security, and
DMA transfers. Please see <http://dri.sourceforge.net/> for more DMA transfers. Please see <http://dri.sourceforge.net/> for more
details. You should also select and configure AGP details. You should also select and configure AGP
(/dev/agpgart) support. (/dev/agpgart) support if it is available for your platform.
config DRM_KMS_HELPER config DRM_KMS_HELPER
tristate tristate
......
...@@ -9,7 +9,7 @@ drm-y := drm_auth.o drm_buffer.o drm_bufs.o drm_cache.o \ ...@@ -9,7 +9,7 @@ drm-y := drm_auth.o drm_buffer.o drm_bufs.o drm_cache.o \
drm_drv.o drm_fops.o drm_gem.o drm_ioctl.o drm_irq.o \ drm_drv.o drm_fops.o drm_gem.o drm_ioctl.o drm_irq.o \
drm_lock.o drm_memory.o drm_proc.o drm_stub.o drm_vm.o \ drm_lock.o drm_memory.o drm_proc.o drm_stub.o drm_vm.o \
drm_agpsupport.o drm_scatter.o ati_pcigart.o drm_pci.o \ drm_agpsupport.o drm_scatter.o ati_pcigart.o drm_pci.o \
drm_sysfs.o drm_hashtab.o drm_sman.o drm_mm.o \ drm_platform.o drm_sysfs.o drm_hashtab.o drm_sman.o drm_mm.o \
drm_crtc.o drm_modes.o drm_edid.o \ drm_crtc.o drm_modes.o drm_edid.o \
drm_info.o drm_debugfs.o drm_encoder_slave.o drm_info.o drm_debugfs.o drm_encoder_slave.o
......
...@@ -39,19 +39,6 @@ ...@@ -39,19 +39,6 @@
#include <asm/shmparam.h> #include <asm/shmparam.h>
#include "drmP.h" #include "drmP.h"
resource_size_t drm_get_resource_start(struct drm_device *dev, unsigned int resource)
{
return pci_resource_start(dev->pdev, resource);
}
EXPORT_SYMBOL(drm_get_resource_start);
resource_size_t drm_get_resource_len(struct drm_device *dev, unsigned int resource)
{
return pci_resource_len(dev->pdev, resource);
}
EXPORT_SYMBOL(drm_get_resource_len);
static struct drm_map_list *drm_find_matching_map(struct drm_device *dev, static struct drm_map_list *drm_find_matching_map(struct drm_device *dev,
struct drm_local_map *map) struct drm_local_map *map)
{ {
...@@ -189,7 +176,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset, ...@@ -189,7 +176,7 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
switch (map->type) { switch (map->type) {
case _DRM_REGISTERS: case _DRM_REGISTERS:
case _DRM_FRAME_BUFFER: case _DRM_FRAME_BUFFER:
#if !defined(__sparc__) && !defined(__alpha__) && !defined(__ia64__) && !defined(__powerpc64__) && !defined(__x86_64__) #if !defined(__sparc__) && !defined(__alpha__) && !defined(__ia64__) && !defined(__powerpc64__) && !defined(__x86_64__) && !defined(__arm__)
if (map->offset + (map->size-1) < map->offset || if (map->offset + (map->size-1) < map->offset ||
map->offset < virt_to_phys(high_memory)) { map->offset < virt_to_phys(high_memory)) {
kfree(map); kfree(map);
......
...@@ -243,47 +243,20 @@ int drm_lastclose(struct drm_device * dev) ...@@ -243,47 +243,20 @@ int drm_lastclose(struct drm_device * dev)
* *
* Initializes an array of drm_device structures, and attempts to * Initializes an array of drm_device structures, and attempts to
* initialize all available devices, using consecutive minors, registering the * initialize all available devices, using consecutive minors, registering the
* stubs and initializing the AGP device. * stubs and initializing the device.
* *
* Expands the \c DRIVER_PREINIT and \c DRIVER_POST_INIT macros before and * Expands the \c DRIVER_PREINIT and \c DRIVER_POST_INIT macros before and
* after the initialization for driver customization. * after the initialization for driver customization.
*/ */
int drm_init(struct drm_driver *driver) int drm_init(struct drm_driver *driver)
{ {
struct pci_dev *pdev = NULL;
const struct pci_device_id *pid;
int i;
DRM_DEBUG("\n"); DRM_DEBUG("\n");
INIT_LIST_HEAD(&driver->device_list); INIT_LIST_HEAD(&driver->device_list);
if (driver->driver_features & DRIVER_MODESET) if (driver->driver_features & DRIVER_USE_PLATFORM_DEVICE)
return pci_register_driver(&driver->pci_driver); return drm_platform_init(driver);
else
/* If not using KMS, fall back to stealth mode manual scanning. */ return drm_pci_init(driver);
for (i = 0; driver->pci_driver.id_table[i].vendor != 0; i++) {
pid = &driver->pci_driver.id_table[i];
/* Loop around setting up a DRM device for each PCI device
* matching our ID and device class. If we had the internal
* function that pci_get_subsys and pci_get_class used, we'd
* be able to just pass pid in instead of doing a two-stage
* thing.
*/
pdev = NULL;
while ((pdev =
pci_get_subsys(pid->vendor, pid->device, pid->subvendor,
pid->subdevice, pdev)) != NULL) {
if ((pdev->class & pid->class_mask) != pid->class)
continue;
/* stealth mode requires a manual probe */
pci_dev_get(pdev);
drm_get_dev(pdev, pid, driver);
}
}
return 0;
} }
EXPORT_SYMBOL(drm_init); EXPORT_SYMBOL(drm_init);
......
...@@ -282,7 +282,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) ...@@ -282,7 +282,7 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
return block; return block;
carp: carp:
dev_warn(&connector->dev->pdev->dev, "%s: EDID block %d invalid.\n", dev_warn(connector->dev->dev, "%s: EDID block %d invalid.\n",
drm_get_connector_name(connector), j); drm_get_connector_name(connector), j);
out: out:
...@@ -1626,7 +1626,7 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) ...@@ -1626,7 +1626,7 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
return 0; return 0;
} }
if (!drm_edid_is_valid(edid)) { if (!drm_edid_is_valid(edid)) {
dev_warn(&connector->dev->pdev->dev, "%s: EDID invalid.\n", dev_warn(connector->dev->dev, "%s: EDID invalid.\n",
drm_get_connector_name(connector)); drm_get_connector_name(connector));
return 0; return 0;
} }
......
...@@ -68,8 +68,18 @@ ...@@ -68,8 +68,18 @@
* We make up offsets for buffer objects so we can recognize them at * We make up offsets for buffer objects so we can recognize them at
* mmap time. * mmap time.
*/ */
/* pgoff in mmap is an unsigned long, so we need to make sure that
* the faked up offset will fit
*/
#if BITS_PER_LONG == 64
#define DRM_FILE_PAGE_OFFSET_START ((0xFFFFFFFFUL >> PAGE_SHIFT) + 1) #define DRM_FILE_PAGE_OFFSET_START ((0xFFFFFFFFUL >> PAGE_SHIFT) + 1)
#define DRM_FILE_PAGE_OFFSET_SIZE ((0xFFFFFFFFUL >> PAGE_SHIFT) * 16) #define DRM_FILE_PAGE_OFFSET_SIZE ((0xFFFFFFFFUL >> PAGE_SHIFT) * 16)
#else
#define DRM_FILE_PAGE_OFFSET_START ((0xFFFFFFFUL >> PAGE_SHIFT) + 1)
#define DRM_FILE_PAGE_OFFSET_SIZE ((0xFFFFFFFUL >> PAGE_SHIFT) * 16)
#endif
/** /**
* Initialize the GEM device fields * Initialize the GEM device fields
......
...@@ -51,13 +51,24 @@ int drm_name_info(struct seq_file *m, void *data) ...@@ -51,13 +51,24 @@ int drm_name_info(struct seq_file *m, void *data)
if (!master) if (!master)
return 0; return 0;
if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) {
if (master->unique) {
seq_printf(m, "%s %s %s\n",
dev->driver->platform_device->name,
dev_name(dev->dev), master->unique);
} else {
seq_printf(m, "%s\n",
dev->driver->platform_device->name);
}
} else {
if (master->unique) { if (master->unique) {
seq_printf(m, "%s %s %s\n", seq_printf(m, "%s %s %s\n",
dev->driver->pci_driver.name, dev->driver->pci_driver.name,
pci_name(dev->pdev), master->unique); dev_name(dev->dev), master->unique);
} else { } else {
seq_printf(m, "%s %s\n", dev->driver->pci_driver.name, seq_printf(m, "%s %s\n", dev->driver->pci_driver.name,
pci_name(dev->pdev)); dev_name(dev->dev));
}
} }
return 0; return 0;
......
...@@ -132,16 +132,38 @@ static int drm_set_busid(struct drm_device *dev, struct drm_file *file_priv) ...@@ -132,16 +132,38 @@ static int drm_set_busid(struct drm_device *dev, struct drm_file *file_priv)
struct drm_master *master = file_priv->master; struct drm_master *master = file_priv->master;
int len; int len;
if (master->unique != NULL) if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) {
return -EBUSY; master->unique_len = 10 + strlen(dev->platformdev->name);
master->unique = kmalloc(master->unique_len + 1, GFP_KERNEL);
if (master->unique == NULL)
return -ENOMEM;
len = snprintf(master->unique, master->unique_len,
"platform:%s", dev->platformdev->name);
if (len > master->unique_len)
DRM_ERROR("Unique buffer overflowed\n");
dev->devname =
kmalloc(strlen(dev->platformdev->name) +
master->unique_len + 2, GFP_KERNEL);
if (dev->devname == NULL)
return -ENOMEM;
sprintf(dev->devname, "%s@%s", dev->platformdev->name,
master->unique);
} else {
master->unique_len = 40; master->unique_len = 40;
master->unique_size = master->unique_len; master->unique_size = master->unique_len;
master->unique = kmalloc(master->unique_size, GFP_KERNEL); master->unique = kmalloc(master->unique_size, GFP_KERNEL);
if (master->unique == NULL) if (master->unique == NULL)
return -ENOMEM; return -ENOMEM;
len = snprintf(master->unique, master->unique_len, "pci:%04x:%02x:%02x.%d", len = snprintf(master->unique, master->unique_len,
"pci:%04x:%02x:%02x.%d",
drm_get_pci_domain(dev), drm_get_pci_domain(dev),
dev->pdev->bus->number, dev->pdev->bus->number,
PCI_SLOT(dev->pdev->devfn), PCI_SLOT(dev->pdev->devfn),
...@@ -151,13 +173,16 @@ static int drm_set_busid(struct drm_device *dev, struct drm_file *file_priv) ...@@ -151,13 +173,16 @@ static int drm_set_busid(struct drm_device *dev, struct drm_file *file_priv)
else else
master->unique_len = len; master->unique_len = len;
dev->devname = kmalloc(strlen(dev->driver->pci_driver.name) + dev->devname =
kmalloc(strlen(dev->driver->pci_driver.name) +
master->unique_len + 2, GFP_KERNEL); master->unique_len + 2, GFP_KERNEL);
if (dev->devname == NULL) if (dev->devname == NULL)
return -ENOMEM; return -ENOMEM;
sprintf(dev->devname, "%s@%s", dev->driver->pci_driver.name, sprintf(dev->devname, "%s@%s", dev->driver->pci_driver.name,
master->unique); master->unique);
}
return 0; return 0;
} }
......
...@@ -57,6 +57,9 @@ int drm_irq_by_busid(struct drm_device *dev, void *data, ...@@ -57,6 +57,9 @@ int drm_irq_by_busid(struct drm_device *dev, void *data,
{ {
struct drm_irq_busid *p = data; struct drm_irq_busid *p = data;
if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE))
return -EINVAL;
if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
return -EINVAL; return -EINVAL;
...@@ -211,7 +214,7 @@ int drm_irq_install(struct drm_device *dev) ...@@ -211,7 +214,7 @@ int drm_irq_install(struct drm_device *dev)
if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
return -EINVAL; return -EINVAL;
if (dev->pdev->irq == 0) if (drm_dev_to_irq(dev) == 0)
return -EINVAL; return -EINVAL;
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
...@@ -229,7 +232,7 @@ int drm_irq_install(struct drm_device *dev) ...@@ -229,7 +232,7 @@ int drm_irq_install(struct drm_device *dev)
dev->irq_enabled = 1; dev->irq_enabled = 1;
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
DRM_DEBUG("irq=%d\n", dev->pdev->irq); DRM_DEBUG("irq=%d\n", drm_dev_to_irq(dev));
/* Before installing handler */ /* Before installing handler */
dev->driver->irq_preinstall(dev); dev->driver->irq_preinstall(dev);
...@@ -302,14 +305,14 @@ int drm_irq_uninstall(struct drm_device * dev) ...@@ -302,14 +305,14 @@ int drm_irq_uninstall(struct drm_device * dev)
if (!irq_enabled) if (!irq_enabled)
return -EINVAL; return -EINVAL;
DRM_DEBUG("irq=%d\n", dev->pdev->irq); DRM_DEBUG("irq=%d\n", drm_dev_to_irq(dev));
if (!drm_core_check_feature(dev, DRIVER_MODESET)) if (!drm_core_check_feature(dev, DRIVER_MODESET))
vga_client_register(dev->pdev, NULL, NULL, NULL); vga_client_register(dev->pdev, NULL, NULL, NULL);
dev->driver->irq_uninstall(dev); dev->driver->irq_uninstall(dev);
free_irq(dev->pdev->irq, dev); free_irq(drm_dev_to_irq(dev), dev);
return 0; return 0;
} }
...@@ -341,7 +344,7 @@ int drm_control(struct drm_device *dev, void *data, ...@@ -341,7 +344,7 @@ int drm_control(struct drm_device *dev, void *data,
if (drm_core_check_feature(dev, DRIVER_MODESET)) if (drm_core_check_feature(dev, DRIVER_MODESET))
return 0; return 0;
if (dev->if_version < DRM_IF_VERSION(1, 2) && if (dev->if_version < DRM_IF_VERSION(1, 2) &&
ctl->irq != dev->pdev->irq) ctl->irq != drm_dev_to_irq(dev))
return -EINVAL; return -EINVAL;
return drm_irq_install(dev); return drm_irq_install(dev);
case DRM_UNINST_HANDLER: case DRM_UNINST_HANDLER:
...@@ -651,7 +654,7 @@ int drm_wait_vblank(struct drm_device *dev, void *data, ...@@ -651,7 +654,7 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
int ret = 0; int ret = 0;
unsigned int flags, seq, crtc; unsigned int flags, seq, crtc;
if ((!dev->pdev->irq) || (!dev->irq_enabled)) if ((!drm_dev_to_irq(dev)) || (!dev->irq_enabled))
return -EINVAL; return -EINVAL;
if (vblwait->request.type & _DRM_VBLANK_SIGNAL) if (vblwait->request.type & _DRM_VBLANK_SIGNAL)
......
...@@ -124,4 +124,147 @@ void drm_pci_free(struct drm_device * dev, drm_dma_handle_t * dmah) ...@@ -124,4 +124,147 @@ void drm_pci_free(struct drm_device * dev, drm_dma_handle_t * dmah)
EXPORT_SYMBOL(drm_pci_free); EXPORT_SYMBOL(drm_pci_free);
#ifdef CONFIG_PCI
/**
* Register.
*
* \param pdev - PCI device structure
* \param ent entry from the PCI ID table with device type flags
* \return zero on success or a negative number on failure.
*
* Attempt to gets inter module "drm" information. If we are first
* then register the character device and inter module information.
* Try and register, if we fail to register, backout previous work.
*/
int drm_get_pci_dev(struct pci_dev *pdev, const struct pci_device_id *ent,
struct drm_driver *driver)
{
struct drm_device *dev;
int ret;
DRM_DEBUG("\n");
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (!dev)
return -ENOMEM;
ret = pci_enable_device(pdev);
if (ret)
goto err_g1;
pci_set_master(pdev);
dev->pdev = pdev;
dev->dev = &pdev->dev;
dev->pci_device = pdev->device;
dev->pci_vendor = pdev->vendor;
#ifdef __alpha__
dev->hose = pdev->sysdata;
#endif
if ((ret = drm_fill_in_dev(dev, ent, driver))) {
printk(KERN_ERR "DRM: Fill_in_dev failed.\n");
goto err_g2;
}
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
pci_set_drvdata(pdev, dev);
ret = drm_get_minor(dev, &dev->control, DRM_MINOR_CONTROL);
if (ret)
goto err_g2;
}
if ((ret = drm_get_minor(dev, &dev->primary, DRM_MINOR_LEGACY)))
goto err_g3;
if (dev->driver->load) {
ret = dev->driver->load(dev, ent->driver_data);
if (ret)
goto err_g4;
}
/* setup the grouping for the legacy output */
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
ret = drm_mode_group_init_legacy_group(dev,
&dev->primary->mode_group);
if (ret)
goto err_g4;
}
list_add_tail(&dev->driver_item, &driver->device_list);
DRM_INFO("Initialized %s %d.%d.%d %s for %s on minor %d\n",
driver->name, driver->major, driver->minor, driver->patchlevel,
driver->date, pci_name(pdev), dev->primary->index);
return 0;
err_g4:
drm_put_minor(&dev->primary);
err_g3:
if (drm_core_check_feature(dev, DRIVER_MODESET))
drm_put_minor(&dev->control);
err_g2:
pci_disable_device(pdev);
err_g1:
kfree(dev);
return ret;
}
EXPORT_SYMBOL(drm_get_pci_dev);
/**
* PCI device initialization. Called via drm_init at module load time,
*
* \return zero on success or a negative number on failure.
*
* Initializes a drm_device structures,registering the
* stubs and initializing the AGP device.
*
* Expands the \c DRIVER_PREINIT and \c DRIVER_POST_INIT macros before and
* after the initialization for driver customization.
*/
int drm_pci_init(struct drm_driver *driver)
{
struct pci_dev *pdev = NULL;
const struct pci_device_id *pid;
int i;
if (driver->driver_features & DRIVER_MODESET)
return pci_register_driver(&driver->pci_driver);
/* If not using KMS, fall back to stealth mode manual scanning. */
for (i = 0; driver->pci_driver.id_table[i].vendor != 0; i++) {
pid = &driver->pci_driver.id_table[i];
/* Loop around setting up a DRM device for each PCI device
* matching our ID and device class. If we had the internal
* function that pci_get_subsys and pci_get_class used, we'd
* be able to just pass pid in instead of doing a two-stage
* thing.
*/
pdev = NULL;
while ((pdev =
pci_get_subsys(pid->vendor, pid->device, pid->subvendor,
pid->subdevice, pdev)) != NULL) {
if ((pdev->class & pid->class_mask) != pid->class)
continue;
/* stealth mode requires a manual probe */
pci_dev_get(pdev);
drm_get_pci_dev(pdev, pid, driver);
}
}
return 0;
}
#else
int drm_pci_init(struct drm_driver *driver)
{
return -1;
}
#endif
/*@}*/ /*@}*/
/*
* Derived from drm_pci.c
*
* Copyright 2003 José Fonseca.
* Copyright 2003 Leif Delgass.
* Copyright (c) 2009, Code Aurora Forum.
* All Rights Reserved.
*
* 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 (including the next
* paragraph) 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
* AUTHORS 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.
*/
#include "drmP.h"
/**
* Register.
*
* \param platdev - Platform device struture
* \return zero on success or a negative number on failure.
*
* Attempt to gets inter module "drm" information. If we are first
* then register the character device and inter module information.
* Try and register, if we fail to register, backout previous work.
*/
int drm_get_platform_dev(struct platform_device *platdev,
struct drm_driver *driver)
{
struct drm_device *dev;
int ret;
DRM_DEBUG("\n");
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (!dev)
return -ENOMEM;
dev->platformdev = platdev;
dev->dev = &platdev->dev;
ret = drm_fill_in_dev(dev, NULL, driver);
if (ret) {
printk(KERN_ERR "DRM: Fill_in_dev failed.\n");
goto err_g1;
}
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
dev_set_drvdata(&platdev->dev, dev);
ret = drm_get_minor(dev, &dev->control, DRM_MINOR_CONTROL);
if (ret)
goto err_g1;
}
ret = drm_get_minor(dev, &dev->primary, DRM_MINOR_LEGACY);
if (ret)
goto err_g2;
if (dev->driver->load) {
ret = dev->driver->load(dev, 0);
if (ret)
goto err_g3;
}
/* setup the grouping for the legacy output */
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
ret = drm_mode_group_init_legacy_group(dev,
&dev->primary->mode_group);
if (ret)
goto err_g3;
}
list_add_tail(&dev->driver_item, &driver->device_list);
DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n",
driver->name, driver->major, driver->minor, driver->patchlevel,
driver->date, dev->primary->index);
return 0;
err_g3:
drm_put_minor(&dev->primary);
err_g2:
if (drm_core_check_feature(dev, DRIVER_MODESET))
drm_put_minor(&dev->control);
err_g1:
kfree(dev);
return ret;
}
EXPORT_SYMBOL(drm_get_platform_dev);
/**
* Platform device initialization. Called via drm_init at module load time,
*
* \return zero on success or a negative number on failure.
*
* Initializes a drm_device structures,registering the
* stubs
*
* Expands the \c DRIVER_PREINIT and \c DRIVER_POST_INIT macros before and
* after the initialization for driver customization.
*/
int drm_platform_init(struct drm_driver *driver)
{
return drm_get_platform_dev(driver->platform_device, driver);
}
...@@ -224,7 +224,7 @@ int drm_dropmaster_ioctl(struct drm_device *dev, void *data, ...@@ -224,7 +224,7 @@ int drm_dropmaster_ioctl(struct drm_device *dev, void *data,
return 0; return 0;
} }
static int drm_fill_in_dev(struct drm_device * dev, struct pci_dev *pdev, int drm_fill_in_dev(struct drm_device *dev,
const struct pci_device_id *ent, const struct pci_device_id *ent,
struct drm_driver *driver) struct drm_driver *driver)
{ {
...@@ -245,14 +245,6 @@ static int drm_fill_in_dev(struct drm_device * dev, struct pci_dev *pdev, ...@@ -245,14 +245,6 @@ static int drm_fill_in_dev(struct drm_device * dev, struct pci_dev *pdev,
idr_init(&dev->drw_idr); idr_init(&dev->drw_idr);
dev->pdev = pdev;
dev->pci_device = pdev->device;
dev->pci_vendor = pdev->vendor;
#ifdef __alpha__
dev->hose = pdev->sysdata;
#endif
if (drm_ht_create(&dev->map_hash, 12)) { if (drm_ht_create(&dev->map_hash, 12)) {
return -ENOMEM; return -ENOMEM;
} }
...@@ -321,7 +313,7 @@ static int drm_fill_in_dev(struct drm_device * dev, struct pci_dev *pdev, ...@@ -321,7 +313,7 @@ static int drm_fill_in_dev(struct drm_device * dev, struct pci_dev *pdev,
* create the proc init entry via proc_init(). This routines assigns * create the proc init entry via proc_init(). This routines assigns
* minor numbers to secondary heads of multi-headed cards * minor numbers to secondary heads of multi-headed cards
*/ */
static int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int type) int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int type)
{ {
struct drm_minor *new_minor; struct drm_minor *new_minor;
int ret; int ret;
...@@ -387,83 +379,6 @@ static int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int t ...@@ -387,83 +379,6 @@ static int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int t
return ret; return ret;
} }
/**
* Register.
*
* \param pdev - PCI device structure
* \param ent entry from the PCI ID table with device type flags
* \return zero on success or a negative number on failure.
*
* Attempt to gets inter module "drm" information. If we are first
* then register the character device and inter module information.
* Try and register, if we fail to register, backout previous work.
*/
int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent,
struct drm_driver *driver)
{
struct drm_device *dev;
int ret;
DRM_DEBUG("\n");
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (!dev)
return -ENOMEM;
ret = pci_enable_device(pdev);
if (ret)
goto err_g1;
pci_set_master(pdev);
if ((ret = drm_fill_in_dev(dev, pdev, ent, driver))) {
printk(KERN_ERR "DRM: Fill_in_dev failed.\n");
goto err_g2;
}
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
pci_set_drvdata(pdev, dev);
ret = drm_get_minor(dev, &dev->control, DRM_MINOR_CONTROL);
if (ret)
goto err_g2;
}
if ((ret = drm_get_minor(dev, &dev->primary, DRM_MINOR_LEGACY)))
goto err_g3;
if (dev->driver->load) {
ret = dev->driver->load(dev, ent->driver_data);
if (ret)
goto err_g4;
}
/* setup the grouping for the legacy output */
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
ret = drm_mode_group_init_legacy_group(dev, &dev->primary->mode_group);
if (ret)
goto err_g4;
}
list_add_tail(&dev->driver_item, &driver->device_list);
DRM_INFO("Initialized %s %d.%d.%d %s for %s on minor %d\n",
driver->name, driver->major, driver->minor, driver->patchlevel,
driver->date, pci_name(pdev), dev->primary->index);
return 0;
err_g4:
drm_put_minor(&dev->primary);
err_g3:
if (drm_core_check_feature(dev, DRIVER_MODESET))
drm_put_minor(&dev->control);
err_g2:
pci_disable_device(pdev);
err_g1:
kfree(dev);
return ret;
}
EXPORT_SYMBOL(drm_get_dev);
/** /**
* Put a secondary minor number. * Put a secondary minor number.
* *
......
...@@ -489,7 +489,8 @@ int drm_sysfs_device_add(struct drm_minor *minor) ...@@ -489,7 +489,8 @@ int drm_sysfs_device_add(struct drm_minor *minor)
int err; int err;
char *minor_str; char *minor_str;
minor->kdev.parent = &minor->dev->pdev->dev; minor->kdev.parent = minor->dev->dev;
minor->kdev.class = drm_class; minor->kdev.class = drm_class;
minor->kdev.release = drm_sysfs_device_release; minor->kdev.release = drm_sysfs_device_release;
minor->kdev.devt = minor->device; minor->kdev.devt = minor->device;
......
...@@ -61,7 +61,7 @@ static pgprot_t drm_io_prot(uint32_t map_type, struct vm_area_struct *vma) ...@@ -61,7 +61,7 @@ static pgprot_t drm_io_prot(uint32_t map_type, struct vm_area_struct *vma)
tmp = pgprot_writecombine(tmp); tmp = pgprot_writecombine(tmp);
else else
tmp = pgprot_noncached(tmp); tmp = pgprot_noncached(tmp);
#elif defined(__sparc__) #elif defined(__sparc__) || defined(__arm__)
tmp = pgprot_noncached(tmp); tmp = pgprot_noncached(tmp);
#endif #endif
return tmp; return tmp;
...@@ -601,6 +601,7 @@ int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma) ...@@ -601,6 +601,7 @@ int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma)
} }
switch (map->type) { switch (map->type) {
#if !defined(__arm__)
case _DRM_AGP: case _DRM_AGP:
if (drm_core_has_AGP(dev) && dev->agp->cant_use_aperture) { if (drm_core_has_AGP(dev) && dev->agp->cant_use_aperture) {
/* /*
...@@ -615,20 +616,31 @@ int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma) ...@@ -615,20 +616,31 @@ int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma)
break; break;
} }
/* fall through to _DRM_FRAME_BUFFER... */ /* fall through to _DRM_FRAME_BUFFER... */
#endif
case _DRM_FRAME_BUFFER: case _DRM_FRAME_BUFFER:
case _DRM_REGISTERS: case _DRM_REGISTERS:
offset = dev->driver->get_reg_ofs(dev); offset = dev->driver->get_reg_ofs(dev);
vma->vm_flags |= VM_IO; /* not in core dump */ vma->vm_flags |= VM_IO; /* not in core dump */
vma->vm_page_prot = drm_io_prot(map->type, vma); vma->vm_page_prot = drm_io_prot(map->type, vma);
#if !defined(__arm__)
if (io_remap_pfn_range(vma, vma->vm_start, if (io_remap_pfn_range(vma, vma->vm_start,
(map->offset + offset) >> PAGE_SHIFT, (map->offset + offset) >> PAGE_SHIFT,
vma->vm_end - vma->vm_start, vma->vm_end - vma->vm_start,
vma->vm_page_prot)) vma->vm_page_prot))
return -EAGAIN; return -EAGAIN;
#else
if (remap_pfn_range(vma, vma->vm_start,
(map->offset + offset) >> PAGE_SHIFT,
vma->vm_end - vma->vm_start,
vma->vm_page_prot))
return -EAGAIN;
#endif
DRM_DEBUG(" Type = %d; start = 0x%lx, end = 0x%lx," DRM_DEBUG(" Type = %d; start = 0x%lx, end = 0x%lx,"
" offset = 0x%llx\n", " offset = 0x%llx\n",
map->type, map->type,
vma->vm_start, vma->vm_end, (unsigned long long)(map->offset + offset)); vma->vm_start, vma->vm_end, (unsigned long long)(map->offset + offset));
vma->vm_ops = &drm_vm_ops; vma->vm_ops = &drm_vm_ops;
break; break;
case _DRM_CONSISTENT: case _DRM_CONSISTENT:
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include "i915_drm.h" #include "i915_drm.h"
#include "i915_drv.h" #include "i915_drv.h"
#include "i915_trace.h" #include "i915_trace.h"
#include <linux/pci.h>
#include <linux/vgaarb.h> #include <linux/vgaarb.h>
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/pnp.h> #include <linux/pnp.h>
...@@ -1354,7 +1355,7 @@ static int i915_load_modeset_init(struct drm_device *dev, ...@@ -1354,7 +1355,7 @@ static int i915_load_modeset_init(struct drm_device *dev,
int fb_bar = IS_I9XX(dev) ? 2 : 0; int fb_bar = IS_I9XX(dev) ? 2 : 0;
int ret = 0; int ret = 0;
dev->mode_config.fb_base = drm_get_resource_start(dev, fb_bar) & dev->mode_config.fb_base = pci_resource_start(dev->pdev, fb_bar) &
0xff000000; 0xff000000;
/* Basic memrange allocator for stolen space (aka vram) */ /* Basic memrange allocator for stolen space (aka vram) */
...@@ -2063,8 +2064,8 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) ...@@ -2063,8 +2064,8 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
/* Add register map (needed for suspend/resume) */ /* Add register map (needed for suspend/resume) */
mmio_bar = IS_I9XX(dev) ? 0 : 1; mmio_bar = IS_I9XX(dev) ? 0 : 1;
base = drm_get_resource_start(dev, mmio_bar); base = pci_resource_start(dev->pdev, mmio_bar);
size = drm_get_resource_len(dev, mmio_bar); size = pci_resource_len(dev->pdev, mmio_bar);
if (i915_get_bridge_dev(dev)) { if (i915_get_bridge_dev(dev)) {
ret = -EIO; ret = -EIO;
......
...@@ -413,7 +413,7 @@ int i965_reset(struct drm_device *dev, u8 flags) ...@@ -413,7 +413,7 @@ int i965_reset(struct drm_device *dev, u8 flags)
static int __devinit static int __devinit
i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{ {
return drm_get_dev(pdev, ent, &driver); return drm_get_pci_dev(pdev, ent, &driver);
} }
static void static void
......
...@@ -405,8 +405,8 @@ int mga_driver_load(struct drm_device * dev, unsigned long flags) ...@@ -405,8 +405,8 @@ int mga_driver_load(struct drm_device * dev, unsigned long flags)
dev_priv->usec_timeout = MGA_DEFAULT_USEC_TIMEOUT; dev_priv->usec_timeout = MGA_DEFAULT_USEC_TIMEOUT;
dev_priv->chipset = flags; dev_priv->chipset = flags;
dev_priv->mmio_base = drm_get_resource_start(dev, 1); dev_priv->mmio_base = pci_resource_start(dev->pdev, 1);
dev_priv->mmio_size = drm_get_resource_len(dev, 1); dev_priv->mmio_size = pci_resource_len(dev->pdev, 1);
dev->counters += 3; dev->counters += 3;
dev->types[6] = _DRM_STAT_IRQ; dev->types[6] = _DRM_STAT_IRQ;
......
...@@ -783,7 +783,7 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) ...@@ -783,7 +783,7 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
break; break;
case TTM_PL_VRAM: case TTM_PL_VRAM:
mem->bus.offset = mem->mm_node->start << PAGE_SHIFT; mem->bus.offset = mem->mm_node->start << PAGE_SHIFT;
mem->bus.base = drm_get_resource_start(dev, 1); mem->bus.base = pci_resource_start(dev->pdev, 1);
mem->bus.is_iomem = true; mem->bus.is_iomem = true;
break; break;
default: default:
......
...@@ -62,7 +62,8 @@ nouveau_channel_pushbuf_ctxdma_init(struct nouveau_channel *chan) ...@@ -62,7 +62,8 @@ nouveau_channel_pushbuf_ctxdma_init(struct nouveau_channel *chan)
* VRAM. * VRAM.
*/ */
ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY, ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY,
drm_get_resource_start(dev, 1), pci_resource_start(dev->pdev,
1),
dev_priv->fb_available_size, dev_priv->fb_available_size,
NV_DMA_ACCESS_RO, NV_DMA_ACCESS_RO,
NV_DMA_TARGET_PCI, &pushbuf); NV_DMA_TARGET_PCI, &pushbuf);
......
...@@ -132,7 +132,7 @@ static struct drm_driver driver; ...@@ -132,7 +132,7 @@ static struct drm_driver driver;
static int __devinit static int __devinit
nouveau_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) nouveau_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{ {
return drm_get_dev(pdev, ent, &driver); return drm_get_pci_dev(pdev, ent, &driver);
} }
static void static void
......
...@@ -471,8 +471,9 @@ void nouveau_mem_close(struct drm_device *dev) ...@@ -471,8 +471,9 @@ void nouveau_mem_close(struct drm_device *dev)
} }
if (dev_priv->fb_mtrr) { if (dev_priv->fb_mtrr) {
drm_mtrr_del(dev_priv->fb_mtrr, drm_get_resource_start(dev, 1), drm_mtrr_del(dev_priv->fb_mtrr,
drm_get_resource_len(dev, 1), DRM_MTRR_WC); pci_resource_start(dev->pdev, 1),
pci_resource_len(dev->pdev, 1), DRM_MTRR_WC);
dev_priv->fb_mtrr = 0; dev_priv->fb_mtrr = 0;
} }
} }
...@@ -633,7 +634,7 @@ nouveau_mem_init(struct drm_device *dev) ...@@ -633,7 +634,7 @@ nouveau_mem_init(struct drm_device *dev)
struct ttm_bo_device *bdev = &dev_priv->ttm.bdev; struct ttm_bo_device *bdev = &dev_priv->ttm.bdev;
int ret, dma_bits = 32; int ret, dma_bits = 32;
dev_priv->fb_phys = drm_get_resource_start(dev, 1); dev_priv->fb_phys = pci_resource_start(dev->pdev, 1);
dev_priv->gart_info.type = NOUVEAU_GART_NONE; dev_priv->gart_info.type = NOUVEAU_GART_NONE;
if (dev_priv->card_type >= NV_50 && if (dev_priv->card_type >= NV_50 &&
...@@ -665,8 +666,9 @@ nouveau_mem_init(struct drm_device *dev) ...@@ -665,8 +666,9 @@ nouveau_mem_init(struct drm_device *dev)
dev_priv->fb_available_size = dev_priv->vram_size; dev_priv->fb_available_size = dev_priv->vram_size;
dev_priv->fb_mappable_pages = dev_priv->fb_available_size; dev_priv->fb_mappable_pages = dev_priv->fb_available_size;
if (dev_priv->fb_mappable_pages > drm_get_resource_len(dev, 1)) if (dev_priv->fb_mappable_pages > pci_resource_len(dev->pdev, 1))
dev_priv->fb_mappable_pages = drm_get_resource_len(dev, 1); dev_priv->fb_mappable_pages =
pci_resource_len(dev->pdev, 1);
dev_priv->fb_mappable_pages >>= PAGE_SHIFT; dev_priv->fb_mappable_pages >>= PAGE_SHIFT;
/* remove reserved space at end of vram from available amount */ /* remove reserved space at end of vram from available amount */
...@@ -718,8 +720,8 @@ nouveau_mem_init(struct drm_device *dev) ...@@ -718,8 +720,8 @@ nouveau_mem_init(struct drm_device *dev)
return ret; return ret;
} }
dev_priv->fb_mtrr = drm_mtrr_add(drm_get_resource_start(dev, 1), dev_priv->fb_mtrr = drm_mtrr_add(pci_resource_start(dev->pdev, 1),
drm_get_resource_len(dev, 1), pci_resource_len(dev->pdev, 1),
DRM_MTRR_WC); DRM_MTRR_WC);
return 0; return 0;
......
...@@ -616,7 +616,7 @@ nv20_graph_init(struct drm_device *dev) ...@@ -616,7 +616,7 @@ nv20_graph_init(struct drm_device *dev)
nv_wr32(dev, NV10_PGRAPH_SURFACE, tmp); nv_wr32(dev, NV10_PGRAPH_SURFACE, tmp);
/* begin RAM config */ /* begin RAM config */
vramsz = drm_get_resource_len(dev, 0) - 1; vramsz = pci_resource_len(dev->pdev, 0) - 1;
nv_wr32(dev, 0x4009A4, nv_rd32(dev, NV04_PFB_CFG0)); nv_wr32(dev, 0x4009A4, nv_rd32(dev, NV04_PFB_CFG0));
nv_wr32(dev, 0x4009A8, nv_rd32(dev, NV04_PFB_CFG1)); nv_wr32(dev, 0x4009A8, nv_rd32(dev, NV04_PFB_CFG1));
nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0000); nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0000);
...@@ -717,7 +717,7 @@ nv30_graph_init(struct drm_device *dev) ...@@ -717,7 +717,7 @@ nv30_graph_init(struct drm_device *dev)
nv_wr32(dev, 0x0040075c , 0x00000001); nv_wr32(dev, 0x0040075c , 0x00000001);
/* begin RAM config */ /* begin RAM config */
/* vramsz = drm_get_resource_len(dev, 0) - 1; */ /* vramsz = pci_resource_len(dev->pdev, 0) - 1; */
nv_wr32(dev, 0x4009A4, nv_rd32(dev, NV04_PFB_CFG0)); nv_wr32(dev, 0x4009A4, nv_rd32(dev, NV04_PFB_CFG0));
nv_wr32(dev, 0x4009A8, nv_rd32(dev, NV04_PFB_CFG1)); nv_wr32(dev, 0x4009A8, nv_rd32(dev, NV04_PFB_CFG1));
if (dev_priv->chipset != 0x34) { if (dev_priv->chipset != 0x34) {
......
...@@ -367,7 +367,7 @@ nv40_graph_init(struct drm_device *dev) ...@@ -367,7 +367,7 @@ nv40_graph_init(struct drm_device *dev)
nv40_graph_set_region_tiling(dev, i, 0, 0, 0); nv40_graph_set_region_tiling(dev, i, 0, 0, 0);
/* begin RAM config */ /* begin RAM config */
vramsz = drm_get_resource_len(dev, 0) - 1; vramsz = pci_resource_len(dev->pdev, 0) - 1;
switch (dev_priv->chipset) { switch (dev_priv->chipset) {
case 0x40: case 0x40:
nv_wr32(dev, 0x4009A4, nv_rd32(dev, NV04_PFB_CFG0)); nv_wr32(dev, 0x4009A4, nv_rd32(dev, NV04_PFB_CFG0));
......
...@@ -241,7 +241,7 @@ nv50_instmem_init(struct drm_device *dev) ...@@ -241,7 +241,7 @@ nv50_instmem_init(struct drm_device *dev)
return ret; return ret;
BAR0_WI32(priv->fb_bar->gpuobj, 0x00, 0x7fc00000); BAR0_WI32(priv->fb_bar->gpuobj, 0x00, 0x7fc00000);
BAR0_WI32(priv->fb_bar->gpuobj, 0x04, 0x40000000 + BAR0_WI32(priv->fb_bar->gpuobj, 0x04, 0x40000000 +
drm_get_resource_len(dev, 1) - 1); pci_resource_len(dev->pdev, 1) - 1);
BAR0_WI32(priv->fb_bar->gpuobj, 0x08, 0x40000000); BAR0_WI32(priv->fb_bar->gpuobj, 0x08, 0x40000000);
BAR0_WI32(priv->fb_bar->gpuobj, 0x0c, 0x00000000); BAR0_WI32(priv->fb_bar->gpuobj, 0x0c, 0x00000000);
BAR0_WI32(priv->fb_bar->gpuobj, 0x10, 0x00000000); BAR0_WI32(priv->fb_bar->gpuobj, 0x10, 0x00000000);
......
...@@ -1334,8 +1334,8 @@ int evergreen_mc_init(struct radeon_device *rdev) ...@@ -1334,8 +1334,8 @@ int evergreen_mc_init(struct radeon_device *rdev)
} }
rdev->mc.vram_width = numchan * chansize; rdev->mc.vram_width = numchan * chansize;
/* Could aper size report 0 ? */ /* Could aper size report 0 ? */
rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
/* Setup GPU memory space */ /* Setup GPU memory space */
/* size in MB on evergreen */ /* size in MB on evergreen */
rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
......
...@@ -2297,8 +2297,8 @@ void r100_vram_init_sizes(struct radeon_device *rdev) ...@@ -2297,8 +2297,8 @@ void r100_vram_init_sizes(struct radeon_device *rdev)
u64 config_aper_size; u64 config_aper_size;
/* work out accessible VRAM */ /* work out accessible VRAM */
rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
rdev->mc.visible_vram_size = r100_get_accessible_vram(rdev); rdev->mc.visible_vram_size = r100_get_accessible_vram(rdev);
/* FIXME we don't use the second aperture yet when we could use it */ /* FIXME we don't use the second aperture yet when we could use it */
if (rdev->mc.visible_vram_size > rdev->mc.aper_size) if (rdev->mc.visible_vram_size > rdev->mc.aper_size)
......
...@@ -1216,8 +1216,8 @@ int r600_mc_init(struct radeon_device *rdev) ...@@ -1216,8 +1216,8 @@ int r600_mc_init(struct radeon_device *rdev)
} }
rdev->mc.vram_width = numchan * chansize; rdev->mc.vram_width = numchan * chansize;
/* Could aper size report 0 ? */ /* Could aper size report 0 ? */
rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
/* Setup GPU memory space */ /* Setup GPU memory space */
rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
......
...@@ -53,7 +53,7 @@ static bool igp_read_bios_from_vram(struct radeon_device *rdev) ...@@ -53,7 +53,7 @@ static bool igp_read_bios_from_vram(struct radeon_device *rdev)
return false; return false;
rdev->bios = NULL; rdev->bios = NULL;
vram_base = drm_get_resource_start(rdev->ddev, 0); vram_base = pci_resource_start(rdev->pdev, 0);
bios = ioremap(vram_base, size); bios = ioremap(vram_base, size);
if (!bios) { if (!bios) {
return false; return false;
......
...@@ -2120,8 +2120,8 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags) ...@@ -2120,8 +2120,8 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
else else
dev_priv->flags |= RADEON_IS_PCI; dev_priv->flags |= RADEON_IS_PCI;
ret = drm_addmap(dev, drm_get_resource_start(dev, 2), ret = drm_addmap(dev, pci_resource_start(dev->pdev, 2),
drm_get_resource_len(dev, 2), _DRM_REGISTERS, pci_resource_len(dev->pdev, 2), _DRM_REGISTERS,
_DRM_READ_ONLY | _DRM_DRIVER, &dev_priv->mmio); _DRM_READ_ONLY | _DRM_DRIVER, &dev_priv->mmio);
if (ret != 0) if (ret != 0)
return ret; return ret;
...@@ -2194,9 +2194,9 @@ int radeon_driver_firstopen(struct drm_device *dev) ...@@ -2194,9 +2194,9 @@ int radeon_driver_firstopen(struct drm_device *dev)
dev_priv->gart_info.table_size = RADEON_PCIGART_TABLE_SIZE; dev_priv->gart_info.table_size = RADEON_PCIGART_TABLE_SIZE;
dev_priv->fb_aper_offset = drm_get_resource_start(dev, 0); dev_priv->fb_aper_offset = pci_resource_start(dev->pdev, 0);
ret = drm_addmap(dev, dev_priv->fb_aper_offset, ret = drm_addmap(dev, dev_priv->fb_aper_offset,
drm_get_resource_len(dev, 0), _DRM_FRAME_BUFFER, pci_resource_len(dev->pdev, 0), _DRM_FRAME_BUFFER,
_DRM_WRITE_COMBINING, &map); _DRM_WRITE_COMBINING, &map);
if (ret != 0) if (ret != 0)
return ret; return ret;
......
...@@ -650,8 +650,8 @@ int radeon_device_init(struct radeon_device *rdev, ...@@ -650,8 +650,8 @@ int radeon_device_init(struct radeon_device *rdev,
/* Registers mapping */ /* Registers mapping */
/* TODO: block userspace mapping of io register */ /* TODO: block userspace mapping of io register */
rdev->rmmio_base = drm_get_resource_start(rdev->ddev, 2); rdev->rmmio_base = pci_resource_start(rdev->pdev, 2);
rdev->rmmio_size = drm_get_resource_len(rdev->ddev, 2); rdev->rmmio_size = pci_resource_len(rdev->pdev, 2);
rdev->rmmio = ioremap(rdev->rmmio_base, rdev->rmmio_size); rdev->rmmio = ioremap(rdev->rmmio_base, rdev->rmmio_size);
if (rdev->rmmio == NULL) { if (rdev->rmmio == NULL) {
return -ENOMEM; return -ENOMEM;
......
...@@ -238,7 +238,7 @@ static struct drm_driver kms_driver; ...@@ -238,7 +238,7 @@ static struct drm_driver kms_driver;
static int __devinit static int __devinit
radeon_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) radeon_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{ {
return drm_get_dev(pdev, ent, &kms_driver); return drm_get_pci_dev(pdev, ent, &kms_driver);
} }
static void static void
......
...@@ -686,8 +686,8 @@ void rs600_mc_init(struct radeon_device *rdev) ...@@ -686,8 +686,8 @@ void rs600_mc_init(struct radeon_device *rdev)
{ {
u64 base; u64 base;
rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
rdev->mc.vram_is_ddr = true; rdev->mc.vram_is_ddr = true;
rdev->mc.vram_width = 128; rdev->mc.vram_width = 128;
rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE); rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE);
......
...@@ -154,8 +154,8 @@ void rs690_mc_init(struct radeon_device *rdev) ...@@ -154,8 +154,8 @@ void rs690_mc_init(struct radeon_device *rdev)
rdev->mc.vram_width = 128; rdev->mc.vram_width = 128;
rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE); rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE);
rdev->mc.mc_vram_size = rdev->mc.real_vram_size; rdev->mc.mc_vram_size = rdev->mc.real_vram_size;
rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
rdev->mc.visible_vram_size = rdev->mc.aper_size; rdev->mc.visible_vram_size = rdev->mc.aper_size;
base = RREG32_MC(R_000100_MCCFG_FB_LOCATION); base = RREG32_MC(R_000100_MCCFG_FB_LOCATION);
base = G_000100_MC_FB_START(base) << 16; base = G_000100_MC_FB_START(base) << 16;
......
...@@ -919,8 +919,8 @@ int rv770_mc_init(struct radeon_device *rdev) ...@@ -919,8 +919,8 @@ int rv770_mc_init(struct radeon_device *rdev)
} }
rdev->mc.vram_width = numchan * chansize; rdev->mc.vram_width = numchan * chansize;
/* Could aper size report 0 ? */ /* Could aper size report 0 ? */
rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
/* Setup GPU memory space */ /* Setup GPU memory space */
rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
......
...@@ -573,13 +573,13 @@ int savage_driver_firstopen(struct drm_device *dev) ...@@ -573,13 +573,13 @@ int savage_driver_firstopen(struct drm_device *dev)
dev_priv->mtrr[2].handle = -1; dev_priv->mtrr[2].handle = -1;
if (S3_SAVAGE3D_SERIES(dev_priv->chipset)) { if (S3_SAVAGE3D_SERIES(dev_priv->chipset)) {
fb_rsrc = 0; fb_rsrc = 0;
fb_base = drm_get_resource_start(dev, 0); fb_base = pci_resource_start(dev->pdev, 0);
fb_size = SAVAGE_FB_SIZE_S3; fb_size = SAVAGE_FB_SIZE_S3;
mmio_base = fb_base + SAVAGE_FB_SIZE_S3; mmio_base = fb_base + SAVAGE_FB_SIZE_S3;
aper_rsrc = 0; aper_rsrc = 0;
aperture_base = fb_base + SAVAGE_APERTURE_OFFSET; aperture_base = fb_base + SAVAGE_APERTURE_OFFSET;
/* this should always be true */ /* this should always be true */
if (drm_get_resource_len(dev, 0) == 0x08000000) { if (pci_resource_len(dev->pdev, 0) == 0x08000000) {
/* Don't make MMIO write-cobining! We need 3 /* Don't make MMIO write-cobining! We need 3
* MTRRs. */ * MTRRs. */
dev_priv->mtrr[0].base = fb_base; dev_priv->mtrr[0].base = fb_base;
...@@ -599,18 +599,19 @@ int savage_driver_firstopen(struct drm_device *dev) ...@@ -599,18 +599,19 @@ int savage_driver_firstopen(struct drm_device *dev)
dev_priv->mtrr[2].size, DRM_MTRR_WC); dev_priv->mtrr[2].size, DRM_MTRR_WC);
} else { } else {
DRM_ERROR("strange pci_resource_len %08llx\n", DRM_ERROR("strange pci_resource_len %08llx\n",
(unsigned long long)drm_get_resource_len(dev, 0)); (unsigned long long)
pci_resource_len(dev->pdev, 0));
} }
} else if (dev_priv->chipset != S3_SUPERSAVAGE && } else if (dev_priv->chipset != S3_SUPERSAVAGE &&
dev_priv->chipset != S3_SAVAGE2000) { dev_priv->chipset != S3_SAVAGE2000) {
mmio_base = drm_get_resource_start(dev, 0); mmio_base = pci_resource_start(dev->pdev, 0);
fb_rsrc = 1; fb_rsrc = 1;
fb_base = drm_get_resource_start(dev, 1); fb_base = pci_resource_start(dev->pdev, 1);
fb_size = SAVAGE_FB_SIZE_S4; fb_size = SAVAGE_FB_SIZE_S4;
aper_rsrc = 1; aper_rsrc = 1;
aperture_base = fb_base + SAVAGE_APERTURE_OFFSET; aperture_base = fb_base + SAVAGE_APERTURE_OFFSET;
/* this should always be true */ /* this should always be true */
if (drm_get_resource_len(dev, 1) == 0x08000000) { if (pci_resource_len(dev->pdev, 1) == 0x08000000) {
/* Can use one MTRR to cover both fb and /* Can use one MTRR to cover both fb and
* aperture. */ * aperture. */
dev_priv->mtrr[0].base = fb_base; dev_priv->mtrr[0].base = fb_base;
...@@ -620,15 +621,16 @@ int savage_driver_firstopen(struct drm_device *dev) ...@@ -620,15 +621,16 @@ int savage_driver_firstopen(struct drm_device *dev)
dev_priv->mtrr[0].size, DRM_MTRR_WC); dev_priv->mtrr[0].size, DRM_MTRR_WC);
} else { } else {
DRM_ERROR("strange pci_resource_len %08llx\n", DRM_ERROR("strange pci_resource_len %08llx\n",
(unsigned long long)drm_get_resource_len(dev, 1)); (unsigned long long)
pci_resource_len(dev->pdev, 1));
} }
} else { } else {
mmio_base = drm_get_resource_start(dev, 0); mmio_base = pci_resource_start(dev->pdev, 0);
fb_rsrc = 1; fb_rsrc = 1;
fb_base = drm_get_resource_start(dev, 1); fb_base = pci_resource_start(dev->pdev, 1);
fb_size = drm_get_resource_len(dev, 1); fb_size = pci_resource_len(dev->pdev, 1);
aper_rsrc = 2; aper_rsrc = 2;
aperture_base = drm_get_resource_start(dev, 2); aperture_base = pci_resource_start(dev->pdev, 2);
/* Automatic MTRR setup will do the right thing. */ /* Automatic MTRR setup will do the right thing. */
} }
......
...@@ -764,7 +764,7 @@ static struct drm_driver driver = { ...@@ -764,7 +764,7 @@ static struct drm_driver driver = {
static int vmw_probe(struct pci_dev *pdev, const struct pci_device_id *ent) static int vmw_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{ {
return drm_get_dev(pdev, ent, &driver); return drm_get_pci_dev(pdev, ent, &driver);
} }
static int __init vmwgfx_init(void) static int __init vmwgfx_init(void)
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
/* /*
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
* Copyright (c) 2009-2010, Code Aurora Forum.
* All rights reserved. * All rights reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a * Permission is hereby granted, free of charge, to any person obtaining a
...@@ -48,6 +49,7 @@ ...@@ -48,6 +49,7 @@
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/file.h> #include <linux/file.h>
#include <linux/platform_device.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/jiffies.h> #include <linux/jiffies.h>
#include <linux/smp_lock.h> /* For (un)lock_kernel */ #include <linux/smp_lock.h> /* For (un)lock_kernel */
...@@ -144,6 +146,7 @@ extern void drm_ut_debug_printk(unsigned int request_level, ...@@ -144,6 +146,7 @@ extern void drm_ut_debug_printk(unsigned int request_level,
#define DRIVER_IRQ_VBL2 0x800 #define DRIVER_IRQ_VBL2 0x800
#define DRIVER_GEM 0x1000 #define DRIVER_GEM 0x1000
#define DRIVER_MODESET 0x2000 #define DRIVER_MODESET 0x2000
#define DRIVER_USE_PLATFORM_DEVICE 0x4000
/***********************************************************************/ /***********************************************************************/
/** \name Begin the DRM... */ /** \name Begin the DRM... */
...@@ -823,6 +826,7 @@ struct drm_driver { ...@@ -823,6 +826,7 @@ struct drm_driver {
int num_ioctls; int num_ioctls;
struct file_operations fops; struct file_operations fops;
struct pci_driver pci_driver; struct pci_driver pci_driver;
struct platform_device *platform_device;
/* List of devices hanging off this driver */ /* List of devices hanging off this driver */
struct list_head device_list; struct list_head device_list;
}; };
...@@ -1015,12 +1019,16 @@ struct drm_device { ...@@ -1015,12 +1019,16 @@ struct drm_device {
struct drm_agp_head *agp; /**< AGP data */ struct drm_agp_head *agp; /**< AGP data */
struct device *dev; /**< Device structure */
struct pci_dev *pdev; /**< PCI device structure */ struct pci_dev *pdev; /**< PCI device structure */
int pci_vendor; /**< PCI vendor id */ int pci_vendor; /**< PCI vendor id */
int pci_device; /**< PCI device id */ int pci_device; /**< PCI device id */
#ifdef __alpha__ #ifdef __alpha__
struct pci_controller *hose; struct pci_controller *hose;
#endif #endif
struct platform_device *platformdev; /**< Platform device struture */
struct drm_sg_mem *sg; /**< Scatter gather memory */ struct drm_sg_mem *sg; /**< Scatter gather memory */
int num_crtcs; /**< Number of CRTCs on this device */ int num_crtcs; /**< Number of CRTCs on this device */
void *dev_private; /**< device private data */ void *dev_private; /**< device private data */
...@@ -1060,17 +1068,21 @@ struct drm_device { ...@@ -1060,17 +1068,21 @@ struct drm_device {
}; };
static inline int drm_dev_to_irq(struct drm_device *dev)
{
return dev->pdev->irq;
}
static __inline__ int drm_core_check_feature(struct drm_device *dev, static __inline__ int drm_core_check_feature(struct drm_device *dev,
int feature) int feature)
{ {
return ((dev->driver->driver_features & feature) ? 1 : 0); return ((dev->driver->driver_features & feature) ? 1 : 0);
} }
static inline int drm_dev_to_irq(struct drm_device *dev)
{
if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE))
return platform_get_irq(dev->platformdev, 0);
else
return dev->pdev->irq;
}
#ifdef __alpha__ #ifdef __alpha__
#define drm_get_pci_domain(dev) dev->hose->index #define drm_get_pci_domain(dev) dev->hose->index
#else #else
...@@ -1273,10 +1285,6 @@ extern int drm_freebufs(struct drm_device *dev, void *data, ...@@ -1273,10 +1285,6 @@ extern int drm_freebufs(struct drm_device *dev, void *data,
extern int drm_mapbufs(struct drm_device *dev, void *data, extern int drm_mapbufs(struct drm_device *dev, void *data,
struct drm_file *file_priv); struct drm_file *file_priv);
extern int drm_order(unsigned long size); extern int drm_order(unsigned long size);
extern resource_size_t drm_get_resource_start(struct drm_device *dev,
unsigned int resource);
extern resource_size_t drm_get_resource_len(struct drm_device *dev,
unsigned int resource);
/* DMA support (drm_dma.h) */ /* DMA support (drm_dma.h) */
extern int drm_dma_setup(struct drm_device *dev); extern int drm_dma_setup(struct drm_device *dev);
...@@ -1351,7 +1359,10 @@ extern int drm_dropmaster_ioctl(struct drm_device *dev, void *data, ...@@ -1351,7 +1359,10 @@ extern int drm_dropmaster_ioctl(struct drm_device *dev, void *data,
struct drm_master *drm_master_create(struct drm_minor *minor); struct drm_master *drm_master_create(struct drm_minor *minor);
extern struct drm_master *drm_master_get(struct drm_master *master); extern struct drm_master *drm_master_get(struct drm_master *master);
extern void drm_master_put(struct drm_master **master); extern void drm_master_put(struct drm_master **master);
extern int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent, extern int drm_get_pci_dev(struct pci_dev *pdev,
const struct pci_device_id *ent,
struct drm_driver *driver);
extern int drm_get_platform_dev(struct platform_device *pdev,
struct drm_driver *driver); struct drm_driver *driver);
extern void drm_put_dev(struct drm_device *dev); extern void drm_put_dev(struct drm_device *dev);
extern int drm_put_minor(struct drm_minor **minor); extern int drm_put_minor(struct drm_minor **minor);
...@@ -1529,6 +1540,9 @@ static __inline__ struct drm_local_map *drm_core_findmap(struct drm_device *dev, ...@@ -1529,6 +1540,9 @@ static __inline__ struct drm_local_map *drm_core_findmap(struct drm_device *dev,
static __inline__ int drm_device_is_agp(struct drm_device *dev) static __inline__ int drm_device_is_agp(struct drm_device *dev)
{ {
if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE))
return 0;
if (dev->driver->device_is_agp != NULL) { if (dev->driver->device_is_agp != NULL) {
int err = (*dev->driver->device_is_agp) (dev); int err = (*dev->driver->device_is_agp) (dev);
...@@ -1542,6 +1556,9 @@ static __inline__ int drm_device_is_agp(struct drm_device *dev) ...@@ -1542,6 +1556,9 @@ static __inline__ int drm_device_is_agp(struct drm_device *dev)
static __inline__ int drm_device_is_pcie(struct drm_device *dev) static __inline__ int drm_device_is_pcie(struct drm_device *dev)
{ {
if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE))
return 0;
else
return pci_find_capability(dev->pdev, PCI_CAP_ID_EXP); return pci_find_capability(dev->pdev, PCI_CAP_ID_EXP);
} }
...@@ -1550,6 +1567,21 @@ static __inline__ void drm_core_dropmap(struct drm_local_map *map) ...@@ -1550,6 +1567,21 @@ static __inline__ void drm_core_dropmap(struct drm_local_map *map)
} }
#include "drm_mem_util.h" #include "drm_mem_util.h"
static inline void *drm_get_device(struct drm_device *dev)
{
if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE))
return dev->platformdev;
else
return dev->pdev;
}
extern int drm_platform_init(struct drm_driver *driver);
extern int drm_pci_init(struct drm_driver *driver);
extern int drm_fill_in_dev(struct drm_device *dev,
const struct pci_device_id *ent,
struct drm_driver *driver);
int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int type);
/*@}*/ /*@}*/
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment