提交 b5e89ed5 编写于 作者: D Dave Airlie 提交者: Dave Airlie

drm: lindent the drm directory.

I've been threatening this for a while, so no point hanging around.
This lindents the DRM code which was always really bad in tabbing department.
I've also fixed some misnamed files in comments and removed some trailing
whitespace.
Signed-off-by: NDave Airlie <airlied@linux.ie>
上级 99a2657a
/** /**
* \file ati_pcigart.h * \file ati_pcigart.c
* ATI PCI GART support * ATI PCI GART support
* *
* \author Gareth Hughes <gareth@valinux.com> * \author Gareth Hughes <gareth@valinux.com>
...@@ -52,87 +52,91 @@ ...@@ -52,87 +52,91 @@
# define ATI_MAX_PCIGART_PAGES 8192 /**< 32 MB aperture, 4K pages */ # define ATI_MAX_PCIGART_PAGES 8192 /**< 32 MB aperture, 4K pages */
# define ATI_PCIGART_PAGE_SIZE 4096 /**< PCI GART page size */ # define ATI_PCIGART_PAGE_SIZE 4096 /**< PCI GART page size */
static unsigned long drm_ati_alloc_pcigart_table( void ) static unsigned long drm_ati_alloc_pcigart_table(void)
{ {
unsigned long address; unsigned long address;
struct page *page; struct page *page;
int i; int i;
DRM_DEBUG( "%s\n", __FUNCTION__ ); DRM_DEBUG("%s\n", __FUNCTION__);
address = __get_free_pages( GFP_KERNEL, ATI_PCIGART_TABLE_ORDER ); address = __get_free_pages(GFP_KERNEL, ATI_PCIGART_TABLE_ORDER);
if ( address == 0UL ) { if (address == 0UL) {
return 0; return 0;
} }
page = virt_to_page( address ); page = virt_to_page(address);
for ( i = 0 ; i < ATI_PCIGART_TABLE_PAGES ; i++, page++ ) { for (i = 0; i < ATI_PCIGART_TABLE_PAGES; i++, page++) {
get_page(page); get_page(page);
SetPageReserved( page ); SetPageReserved(page);
} }
DRM_DEBUG( "%s: returning 0x%08lx\n", __FUNCTION__, address ); DRM_DEBUG("%s: returning 0x%08lx\n", __FUNCTION__, address);
return address; return address;
} }
static void drm_ati_free_pcigart_table( unsigned long address ) static void drm_ati_free_pcigart_table(unsigned long address)
{ {
struct page *page; struct page *page;
int i; int i;
DRM_DEBUG( "%s\n", __FUNCTION__ ); DRM_DEBUG("%s\n", __FUNCTION__);
page = virt_to_page( address ); page = virt_to_page(address);
for ( i = 0 ; i < ATI_PCIGART_TABLE_PAGES ; i++, page++ ) { for (i = 0; i < ATI_PCIGART_TABLE_PAGES; i++, page++) {
__put_page(page); __put_page(page);
ClearPageReserved( page ); ClearPageReserved(page);
} }
free_pages( address, ATI_PCIGART_TABLE_ORDER ); free_pages(address, ATI_PCIGART_TABLE_ORDER);
} }
int drm_ati_pcigart_cleanup(drm_device_t *dev, drm_ati_pcigart_info *gart_info) int drm_ati_pcigart_cleanup(drm_device_t * dev,
drm_ati_pcigart_info * gart_info)
{ {
drm_sg_mem_t *entry = dev->sg; drm_sg_mem_t *entry = dev->sg;
unsigned long pages; unsigned long pages;
int i; int i;
/* we need to support large memory configurations */ /* we need to support large memory configurations */
if ( !entry ) { if (!entry) {
DRM_ERROR( "no scatter/gather memory!\n" ); DRM_ERROR("no scatter/gather memory!\n");
return 0; return 0;
} }
if (gart_info->bus_addr) { if (gart_info->bus_addr) {
if (gart_info->gart_table_location==DRM_ATI_GART_MAIN) { if (gart_info->gart_table_location == DRM_ATI_GART_MAIN) {
pci_unmap_single(dev->pdev, gart_info->bus_addr, pci_unmap_single(dev->pdev, gart_info->bus_addr,
ATI_PCIGART_TABLE_PAGES * PAGE_SIZE, ATI_PCIGART_TABLE_PAGES * PAGE_SIZE,
PCI_DMA_TODEVICE); PCI_DMA_TODEVICE);
} }
pages = ( entry->pages <= ATI_MAX_PCIGART_PAGES ) pages = (entry->pages <= ATI_MAX_PCIGART_PAGES)
? entry->pages : ATI_MAX_PCIGART_PAGES; ? entry->pages : ATI_MAX_PCIGART_PAGES;
for ( i = 0 ; i < pages ; i++ ) { for (i = 0; i < pages; i++) {
if ( !entry->busaddr[i] ) break; if (!entry->busaddr[i])
break;
pci_unmap_single(dev->pdev, entry->busaddr[i], pci_unmap_single(dev->pdev, entry->busaddr[i],
PAGE_SIZE, PCI_DMA_TODEVICE); PAGE_SIZE, PCI_DMA_TODEVICE);
} }
if (gart_info->gart_table_location==DRM_ATI_GART_MAIN) if (gart_info->gart_table_location == DRM_ATI_GART_MAIN)
gart_info->bus_addr=0; gart_info->bus_addr = 0;
} }
if (gart_info->gart_table_location==DRM_ATI_GART_MAIN && gart_info->addr) { if (gart_info->gart_table_location == DRM_ATI_GART_MAIN
&& gart_info->addr) {
drm_ati_free_pcigart_table(gart_info->addr); drm_ati_free_pcigart_table(gart_info->addr);
gart_info->addr=0; gart_info->addr = 0;
} }
return 1; return 1;
} }
EXPORT_SYMBOL(drm_ati_pcigart_cleanup); EXPORT_SYMBOL(drm_ati_pcigart_cleanup);
int drm_ati_pcigart_init(drm_device_t *dev, drm_ati_pcigart_info *gart_info) int drm_ati_pcigart_init(drm_device_t * dev, drm_ati_pcigart_info * gart_info)
{ {
drm_sg_mem_t *entry = dev->sg; drm_sg_mem_t *entry = dev->sg;
unsigned long address = 0; unsigned long address = 0;
...@@ -140,58 +144,56 @@ int drm_ati_pcigart_init(drm_device_t *dev, drm_ati_pcigart_info *gart_info) ...@@ -140,58 +144,56 @@ int drm_ati_pcigart_init(drm_device_t *dev, drm_ati_pcigart_info *gart_info)
u32 *pci_gart, page_base, bus_address = 0; u32 *pci_gart, page_base, bus_address = 0;
int i, j, ret = 0; int i, j, ret = 0;
if ( !entry ) { if (!entry) {
DRM_ERROR( "no scatter/gather memory!\n" ); DRM_ERROR("no scatter/gather memory!\n");
goto done; goto done;
} }
if (gart_info->gart_table_location == DRM_ATI_GART_MAIN) if (gart_info->gart_table_location == DRM_ATI_GART_MAIN) {
{
DRM_DEBUG("PCI: no table in VRAM: using normal RAM\n"); DRM_DEBUG("PCI: no table in VRAM: using normal RAM\n");
address = drm_ati_alloc_pcigart_table(); address = drm_ati_alloc_pcigart_table();
if ( !address ) { if (!address) {
DRM_ERROR( "cannot allocate PCI GART page!\n" ); DRM_ERROR("cannot allocate PCI GART page!\n");
goto done; goto done;
} }
if ( !dev->pdev ) { if (!dev->pdev) {
DRM_ERROR( "PCI device unknown!\n" ); DRM_ERROR("PCI device unknown!\n");
goto done; goto done;
} }
bus_address = pci_map_single(dev->pdev, (void *)address, bus_address = pci_map_single(dev->pdev, (void *)address,
ATI_PCIGART_TABLE_PAGES * PAGE_SIZE, ATI_PCIGART_TABLE_PAGES *
PCI_DMA_TODEVICE); PAGE_SIZE, PCI_DMA_TODEVICE);
if (bus_address == 0) { if (bus_address == 0) {
DRM_ERROR( "unable to map PCIGART pages!\n" ); DRM_ERROR("unable to map PCIGART pages!\n");
drm_ati_free_pcigart_table( address ); drm_ati_free_pcigart_table(address);
address = 0; address = 0;
goto done; goto done;
} }
} } else {
else
{
address = gart_info->addr; address = gart_info->addr;
bus_address = gart_info->bus_addr; bus_address = gart_info->bus_addr;
DRM_DEBUG("PCI: Gart Table: VRAM %08X mapped at %08lX\n", bus_address, address); DRM_DEBUG("PCI: Gart Table: VRAM %08X mapped at %08lX\n",
bus_address, address);
} }
pci_gart = (u32 *)address; pci_gart = (u32 *) address;
pages = ( entry->pages <= ATI_MAX_PCIGART_PAGES ) pages = (entry->pages <= ATI_MAX_PCIGART_PAGES)
? entry->pages : ATI_MAX_PCIGART_PAGES; ? entry->pages : ATI_MAX_PCIGART_PAGES;
memset( pci_gart, 0, ATI_MAX_PCIGART_PAGES * sizeof(u32) ); memset(pci_gart, 0, ATI_MAX_PCIGART_PAGES * sizeof(u32));
for ( i = 0 ; i < pages ; i++ ) { for (i = 0; i < pages; i++) {
/* we need to support large memory configurations */ /* we need to support large memory configurations */
entry->busaddr[i] = pci_map_single(dev->pdev, entry->busaddr[i] = pci_map_single(dev->pdev,
page_address( entry->pagelist[i] ), page_address(entry->
PAGE_SIZE, pagelist[i]),
PCI_DMA_TODEVICE); PAGE_SIZE, PCI_DMA_TODEVICE);
if (entry->busaddr[i] == 0) { if (entry->busaddr[i] == 0) {
DRM_ERROR( "unable to map PCIGART pages!\n" ); DRM_ERROR("unable to map PCIGART pages!\n");
drm_ati_pcigart_cleanup(dev, gart_info); drm_ati_pcigart_cleanup(dev, gart_info);
address = 0; address = 0;
bus_address = 0; bus_address = 0;
...@@ -201,9 +203,9 @@ int drm_ati_pcigart_init(drm_device_t *dev, drm_ati_pcigart_info *gart_info) ...@@ -201,9 +203,9 @@ int drm_ati_pcigart_init(drm_device_t *dev, drm_ati_pcigart_info *gart_info)
for (j = 0; j < (PAGE_SIZE / ATI_PCIGART_PAGE_SIZE); j++) { for (j = 0; j < (PAGE_SIZE / ATI_PCIGART_PAGE_SIZE); j++) {
if (gart_info->is_pcie) if (gart_info->is_pcie)
*pci_gart = (cpu_to_le32(page_base)>>8) | 0xc; *pci_gart = (cpu_to_le32(page_base) >> 8) | 0xc;
else else
*pci_gart++ = cpu_to_le32( page_base ); *pci_gart++ = cpu_to_le32(page_base);
page_base += ATI_PCIGART_PAGE_SIZE; page_base += ATI_PCIGART_PAGE_SIZE;
} }
} }
...@@ -216,9 +218,10 @@ int drm_ati_pcigart_init(drm_device_t *dev, drm_ati_pcigart_info *gart_info) ...@@ -216,9 +218,10 @@ int drm_ati_pcigart_init(drm_device_t *dev, drm_ati_pcigart_info *gart_info)
mb(); mb();
#endif #endif
done: done:
gart_info->addr = address; gart_info->addr = address;
gart_info->bus_addr = bus_address; gart_info->bus_addr = bus_address;
return ret; return ret;
} }
EXPORT_SYMBOL(drm_ati_pcigart_init); EXPORT_SYMBOL(drm_ati_pcigart_init);
...@@ -33,7 +33,6 @@ ...@@ -33,7 +33,6 @@
* OTHER DEALINGS IN THE SOFTWARE. * OTHER DEALINGS IN THE SOFTWARE.
*/ */
#ifndef _DRM_H_ #ifndef _DRM_H_
#define _DRM_H_ #define _DRM_H_
...@@ -97,13 +96,11 @@ ...@@ -97,13 +96,11 @@
#define _DRM_LOCK_IS_CONT(lock) ((lock) & _DRM_LOCK_CONT) #define _DRM_LOCK_IS_CONT(lock) ((lock) & _DRM_LOCK_CONT)
#define _DRM_LOCKING_CONTEXT(lock) ((lock) & ~(_DRM_LOCK_HELD|_DRM_LOCK_CONT)) #define _DRM_LOCKING_CONTEXT(lock) ((lock) & ~(_DRM_LOCK_HELD|_DRM_LOCK_CONT))
typedef unsigned int drm_handle_t; typedef unsigned int drm_handle_t;
typedef unsigned int drm_context_t; typedef unsigned int drm_context_t;
typedef unsigned int drm_drawable_t; typedef unsigned int drm_drawable_t;
typedef unsigned int drm_magic_t; typedef unsigned int drm_magic_t;
/** /**
* Cliprect. * Cliprect.
* *
...@@ -120,7 +117,6 @@ typedef struct drm_clip_rect { ...@@ -120,7 +117,6 @@ typedef struct drm_clip_rect {
unsigned short y2; unsigned short y2;
} drm_clip_rect_t; } drm_clip_rect_t;
/** /**
* Texture region, * Texture region,
*/ */
...@@ -144,7 +140,6 @@ typedef struct drm_hw_lock { ...@@ -144,7 +140,6 @@ typedef struct drm_hw_lock {
char padding[60]; /**< Pad to cache line */ char padding[60]; /**< Pad to cache line */
} drm_hw_lock_t; } drm_hw_lock_t;
/** /**
* DRM_IOCTL_VERSION ioctl argument type. * DRM_IOCTL_VERSION ioctl argument type.
* *
...@@ -153,7 +148,7 @@ typedef struct drm_hw_lock { ...@@ -153,7 +148,7 @@ typedef struct drm_hw_lock {
typedef struct drm_version { typedef struct drm_version {
int version_major; /**< Major version */ int version_major; /**< Major version */
int version_minor; /**< Minor version */ int version_minor; /**< Minor version */
int version_patchlevel;/**< Patch level */ int version_patchlevel; /**< Patch level */
size_t name_len; /**< Length of name buffer */ size_t name_len; /**< Length of name buffer */
char __user *name; /**< Name of driver */ char __user *name; /**< Name of driver */
size_t date_len; /**< Length of date buffer */ size_t date_len; /**< Length of date buffer */
...@@ -162,7 +157,6 @@ typedef struct drm_version { ...@@ -162,7 +157,6 @@ typedef struct drm_version {
char __user *desc; /**< User-space buffer to hold desc */ char __user *desc; /**< User-space buffer to hold desc */
} drm_version_t; } drm_version_t;
/** /**
* DRM_IOCTL_GET_UNIQUE ioctl argument type. * DRM_IOCTL_GET_UNIQUE ioctl argument type.
* *
...@@ -173,18 +167,15 @@ typedef struct drm_unique { ...@@ -173,18 +167,15 @@ typedef struct drm_unique {
char __user *unique; /**< Unique name for driver instantiation */ char __user *unique; /**< Unique name for driver instantiation */
} drm_unique_t; } drm_unique_t;
typedef struct drm_list { typedef struct drm_list {
int count; /**< Length of user-space structures */ int count; /**< Length of user-space structures */
drm_version_t __user *version; drm_version_t __user *version;
} drm_list_t; } drm_list_t;
typedef struct drm_block { typedef struct drm_block {
int unused; int unused;
} drm_block_t; } drm_block_t;
/** /**
* DRM_IOCTL_CONTROL ioctl argument type. * DRM_IOCTL_CONTROL ioctl argument type.
* *
...@@ -200,7 +191,6 @@ typedef struct drm_control { ...@@ -200,7 +191,6 @@ typedef struct drm_control {
int irq; int irq;
} drm_control_t; } drm_control_t;
/** /**
* Type of memory to map. * Type of memory to map.
*/ */
...@@ -213,7 +203,6 @@ typedef enum drm_map_type { ...@@ -213,7 +203,6 @@ typedef enum drm_map_type {
_DRM_CONSISTENT = 5, /**< Consistent memory for PCI DMA */ _DRM_CONSISTENT = 5, /**< Consistent memory for PCI DMA */
} drm_map_type_t; } drm_map_type_t;
/** /**
* Memory mapping flags. * Memory mapping flags.
*/ */
...@@ -227,13 +216,11 @@ typedef enum drm_map_flags { ...@@ -227,13 +216,11 @@ typedef enum drm_map_flags {
_DRM_REMOVABLE = 0x40 /**< Removable mapping */ _DRM_REMOVABLE = 0x40 /**< Removable mapping */
} drm_map_flags_t; } drm_map_flags_t;
typedef struct drm_ctx_priv_map { typedef struct drm_ctx_priv_map {
unsigned int ctx_id; /**< Context requesting private mapping */ unsigned int ctx_id; /**< Context requesting private mapping */
void *handle; /**< Handle of map */ void *handle; /**< Handle of map */
} drm_ctx_priv_map_t; } drm_ctx_priv_map_t;
/** /**
* DRM_IOCTL_GET_MAP, DRM_IOCTL_ADD_MAP and DRM_IOCTL_RM_MAP ioctls * DRM_IOCTL_GET_MAP, DRM_IOCTL_ADD_MAP and DRM_IOCTL_RM_MAP ioctls
* argument type. * argument type.
...@@ -251,7 +238,6 @@ typedef struct drm_map { ...@@ -251,7 +238,6 @@ typedef struct drm_map {
/* Private data */ /* Private data */
} drm_map_t; } drm_map_t;
/** /**
* DRM_IOCTL_GET_CLIENT ioctl argument type. * DRM_IOCTL_GET_CLIENT ioctl argument type.
*/ */
...@@ -264,7 +250,6 @@ typedef struct drm_client { ...@@ -264,7 +250,6 @@ typedef struct drm_client {
unsigned long iocs; /**< Ioctl count */ unsigned long iocs; /**< Ioctl count */
} drm_client_t; } drm_client_t;
typedef enum { typedef enum {
_DRM_STAT_LOCK, _DRM_STAT_LOCK,
_DRM_STAT_OPENS, _DRM_STAT_OPENS,
...@@ -282,11 +267,9 @@ typedef enum { ...@@ -282,11 +267,9 @@ typedef enum {
_DRM_STAT_DMA, /**< DMA */ _DRM_STAT_DMA, /**< DMA */
_DRM_STAT_SPECIAL, /**< Special DMA (e.g., priority or polled) */ _DRM_STAT_SPECIAL, /**< Special DMA (e.g., priority or polled) */
_DRM_STAT_MISSED /**< Missed DMA opportunity */ _DRM_STAT_MISSED /**< Missed DMA opportunity */
/* Add to the *END* of the list */ /* Add to the *END* of the list */
} drm_stat_type_t; } drm_stat_type_t;
/** /**
* DRM_IOCTL_GET_STATS ioctl argument type. * DRM_IOCTL_GET_STATS ioctl argument type.
*/ */
...@@ -298,7 +281,6 @@ typedef struct drm_stats { ...@@ -298,7 +281,6 @@ typedef struct drm_stats {
} data[15]; } data[15];
} drm_stats_t; } drm_stats_t;
/** /**
* Hardware locking flags. * Hardware locking flags.
*/ */
...@@ -314,7 +296,6 @@ typedef enum drm_lock_flags { ...@@ -314,7 +296,6 @@ typedef enum drm_lock_flags {
_DRM_HALT_CUR_QUEUES = 0x20 /**< Halt all current queues */ _DRM_HALT_CUR_QUEUES = 0x20 /**< Halt all current queues */
} drm_lock_flags_t; } drm_lock_flags_t;
/** /**
* DRM_IOCTL_LOCK, DRM_IOCTL_UNLOCK and DRM_IOCTL_FINISH ioctl argument type. * DRM_IOCTL_LOCK, DRM_IOCTL_UNLOCK and DRM_IOCTL_FINISH ioctl argument type.
* *
...@@ -325,7 +306,6 @@ typedef struct drm_lock { ...@@ -325,7 +306,6 @@ typedef struct drm_lock {
drm_lock_flags_t flags; drm_lock_flags_t flags;
} drm_lock_t; } drm_lock_t;
/** /**
* DMA flags * DMA flags
* *
...@@ -355,7 +335,6 @@ typedef enum drm_dma_flags { ...@@ -355,7 +335,6 @@ typedef enum drm_dma_flags {
_DRM_DMA_LARGER_OK = 0x40 /**< Larger-than-requested buffers OK */ _DRM_DMA_LARGER_OK = 0x40 /**< Larger-than-requested buffers OK */
} drm_dma_flags_t; } drm_dma_flags_t;
/** /**
* DRM_IOCTL_ADD_BUFS and DRM_IOCTL_MARK_BUFS ioctl argument type. * DRM_IOCTL_ADD_BUFS and DRM_IOCTL_MARK_BUFS ioctl argument type.
* *
...@@ -378,7 +357,6 @@ typedef struct drm_buf_desc { ...@@ -378,7 +357,6 @@ typedef struct drm_buf_desc {
*/ */
} drm_buf_desc_t; } drm_buf_desc_t;
/** /**
* DRM_IOCTL_INFO_BUFS ioctl argument type. * DRM_IOCTL_INFO_BUFS ioctl argument type.
*/ */
...@@ -387,7 +365,6 @@ typedef struct drm_buf_info { ...@@ -387,7 +365,6 @@ typedef struct drm_buf_info {
drm_buf_desc_t __user *list; drm_buf_desc_t __user *list;
} drm_buf_info_t; } drm_buf_info_t;
/** /**
* DRM_IOCTL_FREE_BUFS ioctl argument type. * DRM_IOCTL_FREE_BUFS ioctl argument type.
*/ */
...@@ -396,7 +373,6 @@ typedef struct drm_buf_free { ...@@ -396,7 +373,6 @@ typedef struct drm_buf_free {
int __user *list; int __user *list;
} drm_buf_free_t; } drm_buf_free_t;
/** /**
* Buffer information * Buffer information
* *
...@@ -409,7 +385,6 @@ typedef struct drm_buf_pub { ...@@ -409,7 +385,6 @@ typedef struct drm_buf_pub {
void __user *address; /**< Address of buffer */ void __user *address; /**< Address of buffer */
} drm_buf_pub_t; } drm_buf_pub_t;
/** /**
* DRM_IOCTL_MAP_BUFS ioctl argument type. * DRM_IOCTL_MAP_BUFS ioctl argument type.
*/ */
...@@ -419,7 +394,6 @@ typedef struct drm_buf_map { ...@@ -419,7 +394,6 @@ typedef struct drm_buf_map {
drm_buf_pub_t __user *list; /**< Buffer information */ drm_buf_pub_t __user *list; /**< Buffer information */
} drm_buf_map_t; } drm_buf_map_t;
/** /**
* DRM_IOCTL_DMA ioctl argument type. * DRM_IOCTL_DMA ioctl argument type.
* *
...@@ -440,13 +414,11 @@ typedef struct drm_dma { ...@@ -440,13 +414,11 @@ typedef struct drm_dma {
int granted_count; /**< Number of buffers granted */ int granted_count; /**< Number of buffers granted */
} drm_dma_t; } drm_dma_t;
typedef enum { typedef enum {
_DRM_CONTEXT_PRESERVED = 0x01, _DRM_CONTEXT_PRESERVED = 0x01,
_DRM_CONTEXT_2DONLY = 0x02 _DRM_CONTEXT_2DONLY = 0x02
} drm_ctx_flags_t; } drm_ctx_flags_t;
/** /**
* DRM_IOCTL_ADD_CTX ioctl argument type. * DRM_IOCTL_ADD_CTX ioctl argument type.
* *
...@@ -457,7 +429,6 @@ typedef struct drm_ctx { ...@@ -457,7 +429,6 @@ typedef struct drm_ctx {
drm_ctx_flags_t flags; drm_ctx_flags_t flags;
} drm_ctx_t; } drm_ctx_t;
/** /**
* DRM_IOCTL_RES_CTX ioctl argument type. * DRM_IOCTL_RES_CTX ioctl argument type.
*/ */
...@@ -466,7 +437,6 @@ typedef struct drm_ctx_res { ...@@ -466,7 +437,6 @@ typedef struct drm_ctx_res {
drm_ctx_t __user *contexts; drm_ctx_t __user *contexts;
} drm_ctx_res_t; } drm_ctx_res_t;
/** /**
* DRM_IOCTL_ADD_DRAW and DRM_IOCTL_RM_DRAW ioctl argument type. * DRM_IOCTL_ADD_DRAW and DRM_IOCTL_RM_DRAW ioctl argument type.
*/ */
...@@ -474,7 +444,6 @@ typedef struct drm_draw { ...@@ -474,7 +444,6 @@ typedef struct drm_draw {
drm_drawable_t handle; drm_drawable_t handle;
} drm_draw_t; } drm_draw_t;
/** /**
* DRM_IOCTL_GET_MAGIC and DRM_IOCTL_AUTH_MAGIC ioctl argument type. * DRM_IOCTL_GET_MAGIC and DRM_IOCTL_AUTH_MAGIC ioctl argument type.
*/ */
...@@ -482,7 +451,6 @@ typedef struct drm_auth { ...@@ -482,7 +451,6 @@ typedef struct drm_auth {
drm_magic_t magic; drm_magic_t magic;
} drm_auth_t; } drm_auth_t;
/** /**
* DRM_IOCTL_IRQ_BUSID ioctl argument type. * DRM_IOCTL_IRQ_BUSID ioctl argument type.
* *
...@@ -495,24 +463,20 @@ typedef struct drm_irq_busid { ...@@ -495,24 +463,20 @@ typedef struct drm_irq_busid {
int funcnum; /**< function number */ int funcnum; /**< function number */
} drm_irq_busid_t; } drm_irq_busid_t;
typedef enum { typedef enum {
_DRM_VBLANK_ABSOLUTE = 0x0, /**< Wait for specific vblank sequence number */ _DRM_VBLANK_ABSOLUTE = 0x0, /**< Wait for specific vblank sequence number */
_DRM_VBLANK_RELATIVE = 0x1, /**< Wait for given number of vblanks */ _DRM_VBLANK_RELATIVE = 0x1, /**< Wait for given number of vblanks */
_DRM_VBLANK_SIGNAL = 0x40000000 /**< Send signal instead of blocking */ _DRM_VBLANK_SIGNAL = 0x40000000 /**< Send signal instead of blocking */
} drm_vblank_seq_type_t; } drm_vblank_seq_type_t;
#define _DRM_VBLANK_FLAGS_MASK _DRM_VBLANK_SIGNAL #define _DRM_VBLANK_FLAGS_MASK _DRM_VBLANK_SIGNAL
struct drm_wait_vblank_request { struct drm_wait_vblank_request {
drm_vblank_seq_type_t type; drm_vblank_seq_type_t type;
unsigned int sequence; unsigned int sequence;
unsigned long signal; unsigned long signal;
}; };
struct drm_wait_vblank_reply { struct drm_wait_vblank_reply {
drm_vblank_seq_type_t type; drm_vblank_seq_type_t type;
unsigned int sequence; unsigned int sequence;
...@@ -520,7 +484,6 @@ struct drm_wait_vblank_reply { ...@@ -520,7 +484,6 @@ struct drm_wait_vblank_reply {
long tval_usec; long tval_usec;
}; };
/** /**
* DRM_IOCTL_WAIT_VBLANK ioctl argument type. * DRM_IOCTL_WAIT_VBLANK ioctl argument type.
* *
...@@ -531,7 +494,6 @@ typedef union drm_wait_vblank { ...@@ -531,7 +494,6 @@ typedef union drm_wait_vblank {
struct drm_wait_vblank_reply reply; struct drm_wait_vblank_reply reply;
} drm_wait_vblank_t; } drm_wait_vblank_t;
/** /**
* DRM_IOCTL_AGP_ENABLE ioctl argument type. * DRM_IOCTL_AGP_ENABLE ioctl argument type.
* *
...@@ -541,7 +503,6 @@ typedef struct drm_agp_mode { ...@@ -541,7 +503,6 @@ typedef struct drm_agp_mode {
unsigned long mode; /**< AGP mode */ unsigned long mode; /**< AGP mode */
} drm_agp_mode_t; } drm_agp_mode_t;
/** /**
* DRM_IOCTL_AGP_ALLOC and DRM_IOCTL_AGP_FREE ioctls argument type. * DRM_IOCTL_AGP_ALLOC and DRM_IOCTL_AGP_FREE ioctls argument type.
* *
...@@ -554,7 +515,6 @@ typedef struct drm_agp_buffer { ...@@ -554,7 +515,6 @@ typedef struct drm_agp_buffer {
unsigned long physical; /**< Physical used by i810 */ unsigned long physical; /**< Physical used by i810 */
} drm_agp_buffer_t; } drm_agp_buffer_t;
/** /**
* DRM_IOCTL_AGP_BIND and DRM_IOCTL_AGP_UNBIND ioctls argument type. * DRM_IOCTL_AGP_BIND and DRM_IOCTL_AGP_UNBIND ioctls argument type.
* *
...@@ -565,7 +525,6 @@ typedef struct drm_agp_binding { ...@@ -565,7 +525,6 @@ typedef struct drm_agp_binding {
unsigned long offset; /**< In bytes -- will round to page boundary */ unsigned long offset; /**< In bytes -- will round to page boundary */
} drm_agp_binding_t; } drm_agp_binding_t;
/** /**
* DRM_IOCTL_AGP_INFO ioctl argument type. * DRM_IOCTL_AGP_INFO ioctl argument type.
* *
...@@ -587,7 +546,6 @@ typedef struct drm_agp_info { ...@@ -587,7 +546,6 @@ typedef struct drm_agp_info {
unsigned short id_device; unsigned short id_device;
} drm_agp_info_t; } drm_agp_info_t;
/** /**
* DRM_IOCTL_SG_ALLOC ioctl argument type. * DRM_IOCTL_SG_ALLOC ioctl argument type.
*/ */
...@@ -606,7 +564,6 @@ typedef struct drm_set_version { ...@@ -606,7 +564,6 @@ typedef struct drm_set_version {
int drm_dd_minor; int drm_dd_minor;
} drm_set_version_t; } drm_set_version_t;
#define DRM_IOCTL_BASE 'd' #define DRM_IOCTL_BASE 'd'
#define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr) #define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr)
#define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type) #define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type)
......
此差异已折叠。
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
* Verifies the AGP device has been initialized and acquired and fills in the * Verifies the AGP device has been initialized and acquired and fills in the
* drm_agp_info structure with the information in drm_agp_head::agp_info. * drm_agp_info structure with the information in drm_agp_head::agp_info.
*/ */
int drm_agp_info(drm_device_t *dev, drm_agp_info_t *info) int drm_agp_info(drm_device_t * dev, drm_agp_info_t * info)
{ {
DRM_AGP_KERN *kern; DRM_AGP_KERN *kern;
...@@ -68,6 +68,7 @@ int drm_agp_info(drm_device_t *dev, drm_agp_info_t *info) ...@@ -68,6 +68,7 @@ int drm_agp_info(drm_device_t *dev, drm_agp_info_t *info)
return 0; return 0;
} }
EXPORT_SYMBOL(drm_agp_info); EXPORT_SYMBOL(drm_agp_info);
int drm_agp_info_ioctl(struct inode *inode, struct file *filp, int drm_agp_info_ioctl(struct inode *inode, struct file *filp,
...@@ -96,7 +97,7 @@ int drm_agp_info_ioctl(struct inode *inode, struct file *filp, ...@@ -96,7 +97,7 @@ int drm_agp_info_ioctl(struct inode *inode, struct file *filp,
* Verifies the AGP device hasn't been acquired before and calls * Verifies the AGP device hasn't been acquired before and calls
* \c agp_backend_acquire. * \c agp_backend_acquire.
*/ */
int drm_agp_acquire(drm_device_t *dev) int drm_agp_acquire(drm_device_t * dev)
{ {
if (!dev->agp) if (!dev->agp)
return -ENODEV; return -ENODEV;
...@@ -107,6 +108,7 @@ int drm_agp_acquire(drm_device_t *dev) ...@@ -107,6 +108,7 @@ int drm_agp_acquire(drm_device_t *dev)
dev->agp->acquired = 1; dev->agp->acquired = 1;
return 0; return 0;
} }
EXPORT_SYMBOL(drm_agp_acquire); EXPORT_SYMBOL(drm_agp_acquire);
/** /**
...@@ -126,7 +128,7 @@ int drm_agp_acquire_ioctl(struct inode *inode, struct file *filp, ...@@ -126,7 +128,7 @@ int drm_agp_acquire_ioctl(struct inode *inode, struct file *filp,
{ {
drm_file_t *priv = filp->private_data; drm_file_t *priv = filp->private_data;
return drm_agp_acquire( (drm_device_t *) priv->head->dev ); return drm_agp_acquire((drm_device_t *) priv->head->dev);
} }
/** /**
...@@ -137,7 +139,7 @@ int drm_agp_acquire_ioctl(struct inode *inode, struct file *filp, ...@@ -137,7 +139,7 @@ int drm_agp_acquire_ioctl(struct inode *inode, struct file *filp,
* *
* Verifies the AGP device has been acquired and calls \c agp_backend_release. * Verifies the AGP device has been acquired and calls \c agp_backend_release.
*/ */
int drm_agp_release(drm_device_t *dev) int drm_agp_release(drm_device_t * dev)
{ {
if (!dev->agp || !dev->agp->acquired) if (!dev->agp || !dev->agp->acquired)
return -EINVAL; return -EINVAL;
...@@ -145,6 +147,7 @@ int drm_agp_release(drm_device_t *dev) ...@@ -145,6 +147,7 @@ int drm_agp_release(drm_device_t *dev)
dev->agp->acquired = 0; dev->agp->acquired = 0;
return 0; return 0;
} }
EXPORT_SYMBOL(drm_agp_release); EXPORT_SYMBOL(drm_agp_release);
int drm_agp_release_ioctl(struct inode *inode, struct file *filp, int drm_agp_release_ioctl(struct inode *inode, struct file *filp,
...@@ -166,7 +169,7 @@ int drm_agp_release_ioctl(struct inode *inode, struct file *filp, ...@@ -166,7 +169,7 @@ int drm_agp_release_ioctl(struct inode *inode, struct file *filp,
* Verifies the AGP device has been acquired but not enabled, and calls * Verifies the AGP device has been acquired but not enabled, and calls
* \c agp_enable. * \c agp_enable.
*/ */
int drm_agp_enable(drm_device_t *dev, drm_agp_mode_t mode) int drm_agp_enable(drm_device_t * dev, drm_agp_mode_t mode)
{ {
if (!dev->agp || !dev->agp->acquired) if (!dev->agp || !dev->agp->acquired)
return -EINVAL; return -EINVAL;
...@@ -177,6 +180,7 @@ int drm_agp_enable(drm_device_t *dev, drm_agp_mode_t mode) ...@@ -177,6 +180,7 @@ int drm_agp_enable(drm_device_t *dev, drm_agp_mode_t mode)
dev->agp->enabled = 1; dev->agp->enabled = 1;
return 0; return 0;
} }
EXPORT_SYMBOL(drm_agp_enable); EXPORT_SYMBOL(drm_agp_enable);
int drm_agp_enable_ioctl(struct inode *inode, struct file *filp, int drm_agp_enable_ioctl(struct inode *inode, struct file *filp,
...@@ -186,7 +190,6 @@ int drm_agp_enable_ioctl(struct inode *inode, struct file *filp, ...@@ -186,7 +190,6 @@ int drm_agp_enable_ioctl(struct inode *inode, struct file *filp,
drm_device_t *dev = priv->head->dev; drm_device_t *dev = priv->head->dev;
drm_agp_mode_t mode; drm_agp_mode_t mode;
if (copy_from_user(&mode, (drm_agp_mode_t __user *) arg, sizeof(mode))) if (copy_from_user(&mode, (drm_agp_mode_t __user *) arg, sizeof(mode)))
return -EFAULT; return -EFAULT;
...@@ -266,7 +269,7 @@ int drm_agp_alloc(struct inode *inode, struct file *filp, ...@@ -266,7 +269,7 @@ int drm_agp_alloc(struct inode *inode, struct file *filp,
* *
* Walks through drm_agp_head::memory until finding a matching handle. * Walks through drm_agp_head::memory until finding a matching handle.
*/ */
static drm_agp_mem_t *drm_agp_lookup_entry(drm_device_t *dev, static drm_agp_mem_t *drm_agp_lookup_entry(drm_device_t * dev,
unsigned long handle) unsigned long handle)
{ {
drm_agp_mem_t *entry; drm_agp_mem_t *entry;
...@@ -301,7 +304,8 @@ int drm_agp_unbind(struct inode *inode, struct file *filp, ...@@ -301,7 +304,8 @@ int drm_agp_unbind(struct inode *inode, struct file *filp,
if (!dev->agp || !dev->agp->acquired) if (!dev->agp || !dev->agp->acquired)
return -EINVAL; return -EINVAL;
if (copy_from_user(&request, (drm_agp_binding_t __user *)arg, sizeof(request))) if (copy_from_user
(&request, (drm_agp_binding_t __user *) arg, sizeof(request)))
return -EFAULT; return -EFAULT;
if (!(entry = drm_agp_lookup_entry(dev, request.handle))) if (!(entry = drm_agp_lookup_entry(dev, request.handle)))
return -EINVAL; return -EINVAL;
...@@ -338,7 +342,8 @@ int drm_agp_bind(struct inode *inode, struct file *filp, ...@@ -338,7 +342,8 @@ int drm_agp_bind(struct inode *inode, struct file *filp,
if (!dev->agp || !dev->agp->acquired) if (!dev->agp || !dev->agp->acquired)
return -EINVAL; return -EINVAL;
if (copy_from_user(&request, (drm_agp_binding_t __user *)arg, sizeof(request))) if (copy_from_user
(&request, (drm_agp_binding_t __user *) arg, sizeof(request)))
return -EFAULT; return -EFAULT;
if (!(entry = drm_agp_lookup_entry(dev, request.handle))) if (!(entry = drm_agp_lookup_entry(dev, request.handle)))
return -EINVAL; return -EINVAL;
...@@ -377,7 +382,8 @@ int drm_agp_free(struct inode *inode, struct file *filp, ...@@ -377,7 +382,8 @@ int drm_agp_free(struct inode *inode, struct file *filp,
if (!dev->agp || !dev->agp->acquired) if (!dev->agp || !dev->agp->acquired)
return -EINVAL; return -EINVAL;
if (copy_from_user(&request, (drm_agp_buffer_t __user *)arg, sizeof(request))) if (copy_from_user
(&request, (drm_agp_buffer_t __user *) arg, sizeof(request)))
return -EFAULT; return -EFAULT;
if (!(entry = drm_agp_lookup_entry(dev, request.handle))) if (!(entry = drm_agp_lookup_entry(dev, request.handle)))
return -EINVAL; return -EINVAL;
...@@ -403,7 +409,7 @@ int drm_agp_free(struct inode *inode, struct file *filp, ...@@ -403,7 +409,7 @@ int drm_agp_free(struct inode *inode, struct file *filp,
* \return pointer to a drm_agp_head structure. * \return pointer to a drm_agp_head structure.
* *
*/ */
drm_agp_head_t *drm_agp_init(drm_device_t *dev) drm_agp_head_t *drm_agp_init(drm_device_t * dev)
{ {
drm_agp_head_t *head = NULL; drm_agp_head_t *head = NULL;
...@@ -433,13 +439,14 @@ drm_agp_head_t *drm_agp_init(drm_device_t *dev) ...@@ -433,13 +439,14 @@ drm_agp_head_t *drm_agp_init(drm_device_t *dev)
} }
/** Calls agp_allocate_memory() */ /** Calls agp_allocate_memory() */
DRM_AGP_MEM *drm_agp_allocate_memory(struct agp_bridge_data *bridge, size_t pages, u32 type) DRM_AGP_MEM *drm_agp_allocate_memory(struct agp_bridge_data * bridge,
size_t pages, u32 type)
{ {
return agp_allocate_memory(bridge, pages, type); return agp_allocate_memory(bridge, pages, type);
} }
/** Calls agp_free_memory() */ /** Calls agp_free_memory() */
int drm_agp_free_memory(DRM_AGP_MEM *handle) int drm_agp_free_memory(DRM_AGP_MEM * handle)
{ {
if (!handle) if (!handle)
return 0; return 0;
...@@ -448,16 +455,17 @@ int drm_agp_free_memory(DRM_AGP_MEM *handle) ...@@ -448,16 +455,17 @@ int drm_agp_free_memory(DRM_AGP_MEM *handle)
} }
/** Calls agp_bind_memory() */ /** Calls agp_bind_memory() */
int drm_agp_bind_memory(DRM_AGP_MEM *handle, off_t start) int drm_agp_bind_memory(DRM_AGP_MEM * handle, off_t start)
{ {
if (!handle) if (!handle)
return -EINVAL; return -EINVAL;
return agp_bind_memory(handle, start); return agp_bind_memory(handle, start);
} }
EXPORT_SYMBOL(drm_agp_bind_memory); EXPORT_SYMBOL(drm_agp_bind_memory);
/** Calls agp_unbind_memory() */ /** Calls agp_unbind_memory() */
int drm_agp_unbind_memory(DRM_AGP_MEM *handle) int drm_agp_unbind_memory(DRM_AGP_MEM * handle)
{ {
if (!handle) if (!handle)
return -EINVAL; return -EINVAL;
......
/** /**
* \file drm_auth.h * \file drm_auth.c
* IOCTLs for authentication * IOCTLs for authentication
* *
* \author Rickard E. (Rik) Faith <faith@valinux.com> * \author Rickard E. (Rik) Faith <faith@valinux.com>
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
*/ */
static int drm_hash_magic(drm_magic_t magic) static int drm_hash_magic(drm_magic_t magic)
{ {
return magic & (DRM_HASH_SIZE-1); return magic & (DRM_HASH_SIZE - 1);
} }
/** /**
...@@ -59,7 +59,7 @@ static int drm_hash_magic(drm_magic_t magic) ...@@ -59,7 +59,7 @@ static int drm_hash_magic(drm_magic_t magic)
* the one with matching magic number, while holding the drm_device::struct_sem * the one with matching magic number, while holding the drm_device::struct_sem
* lock. * lock.
*/ */
static drm_file_t *drm_find_file(drm_device_t *dev, drm_magic_t magic) static drm_file_t *drm_find_file(drm_device_t * dev, drm_magic_t magic)
{ {
drm_file_t *retval = NULL; drm_file_t *retval = NULL;
drm_magic_entry_t *pt; drm_magic_entry_t *pt;
...@@ -87,7 +87,8 @@ static drm_file_t *drm_find_file(drm_device_t *dev, drm_magic_t magic) ...@@ -87,7 +87,8 @@ static drm_file_t *drm_find_file(drm_device_t *dev, drm_magic_t magic)
* associated the magic number hash key in drm_device::magiclist, while holding * associated the magic number hash key in drm_device::magiclist, while holding
* the drm_device::struct_sem lock. * the drm_device::struct_sem lock.
*/ */
static int drm_add_magic(drm_device_t *dev, drm_file_t *priv, drm_magic_t magic) static int drm_add_magic(drm_device_t * dev, drm_file_t * priv,
drm_magic_t magic)
{ {
int hash; int hash;
drm_magic_entry_t *entry; drm_magic_entry_t *entry;
...@@ -96,7 +97,8 @@ static int drm_add_magic(drm_device_t *dev, drm_file_t *priv, drm_magic_t magic) ...@@ -96,7 +97,8 @@ static int drm_add_magic(drm_device_t *dev, drm_file_t *priv, drm_magic_t magic)
hash = drm_hash_magic(magic); hash = drm_hash_magic(magic);
entry = drm_alloc(sizeof(*entry), DRM_MEM_MAGIC); entry = drm_alloc(sizeof(*entry), DRM_MEM_MAGIC);
if (!entry) return -ENOMEM; if (!entry)
return -ENOMEM;
memset(entry, 0, sizeof(*entry)); memset(entry, 0, sizeof(*entry));
entry->magic = magic; entry->magic = magic;
entry->priv = priv; entry->priv = priv;
...@@ -124,13 +126,12 @@ static int drm_add_magic(drm_device_t *dev, drm_file_t *priv, drm_magic_t magic) ...@@ -124,13 +126,12 @@ static int drm_add_magic(drm_device_t *dev, drm_file_t *priv, drm_magic_t magic)
* Searches and unlinks the entry in drm_device::magiclist with the magic * Searches and unlinks the entry in drm_device::magiclist with the magic
* number hash key, while holding the drm_device::struct_sem lock. * number hash key, while holding the drm_device::struct_sem lock.
*/ */
static int drm_remove_magic(drm_device_t *dev, drm_magic_t magic) static int drm_remove_magic(drm_device_t * dev, drm_magic_t magic)
{ {
drm_magic_entry_t *prev = NULL; drm_magic_entry_t *prev = NULL;
drm_magic_entry_t *pt; drm_magic_entry_t *pt;
int hash; int hash;
DRM_DEBUG("%d\n", magic); DRM_DEBUG("%d\n", magic);
hash = drm_hash_magic(magic); hash = drm_hash_magic(magic);
...@@ -185,7 +186,8 @@ int drm_getmagic(struct inode *inode, struct file *filp, ...@@ -185,7 +186,8 @@ int drm_getmagic(struct inode *inode, struct file *filp,
} else { } else {
do { do {
spin_lock(&lock); spin_lock(&lock);
if (!sequence) ++sequence; /* reserve 0 */ if (!sequence)
++sequence; /* reserve 0 */
auth.magic = sequence++; auth.magic = sequence++;
spin_unlock(&lock); spin_unlock(&lock);
} while (drm_find_file(dev, auth.magic)); } while (drm_find_file(dev, auth.magic));
...@@ -194,7 +196,7 @@ int drm_getmagic(struct inode *inode, struct file *filp, ...@@ -194,7 +196,7 @@ int drm_getmagic(struct inode *inode, struct file *filp,
} }
DRM_DEBUG("%u\n", auth.magic); DRM_DEBUG("%u\n", auth.magic);
if (copy_to_user((drm_auth_t __user *)arg, &auth, sizeof(auth))) if (copy_to_user((drm_auth_t __user *) arg, &auth, sizeof(auth)))
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
...@@ -218,7 +220,7 @@ int drm_authmagic(struct inode *inode, struct file *filp, ...@@ -218,7 +220,7 @@ int drm_authmagic(struct inode *inode, struct file *filp,
drm_auth_t auth; drm_auth_t auth;
drm_file_t *file; drm_file_t *file;
if (copy_from_user(&auth, (drm_auth_t __user *)arg, sizeof(auth))) if (copy_from_user(&auth, (drm_auth_t __user *) arg, sizeof(auth)))
return -EFAULT; return -EFAULT;
DRM_DEBUG("%u\n", auth.magic); DRM_DEBUG("%u\n", auth.magic);
if ((file = drm_find_file(dev, auth.magic))) { if ((file = drm_find_file(dev, auth.magic))) {
......
此差异已折叠。
/** /**
* \file drm_context.h * \file drm_context.c
* IOCTLs for generic contexts * IOCTLs for generic contexts
* *
* \author Rickard E. (Rik) Faith <faith@valinux.com> * \author Rickard E. (Rik) Faith <faith@valinux.com>
...@@ -56,21 +56,22 @@ ...@@ -56,21 +56,22 @@
* in drm_device::context_sareas, while holding the drm_device::struct_sem * in drm_device::context_sareas, while holding the drm_device::struct_sem
* lock. * lock.
*/ */
void drm_ctxbitmap_free( drm_device_t *dev, int ctx_handle ) void drm_ctxbitmap_free(drm_device_t * dev, int ctx_handle)
{ {
if ( ctx_handle < 0 ) goto failed; if (ctx_handle < 0)
if ( !dev->ctx_bitmap ) goto failed; goto failed;
if (!dev->ctx_bitmap)
goto failed;
if ( ctx_handle < DRM_MAX_CTXBITMAP ) { if (ctx_handle < DRM_MAX_CTXBITMAP) {
down(&dev->struct_sem); down(&dev->struct_sem);
clear_bit( ctx_handle, dev->ctx_bitmap ); clear_bit(ctx_handle, dev->ctx_bitmap);
dev->context_sareas[ctx_handle] = NULL; dev->context_sareas[ctx_handle] = NULL;
up(&dev->struct_sem); up(&dev->struct_sem);
return; return;
} }
failed: failed:
DRM_ERROR( "Attempt to free invalid context handle: %d\n", DRM_ERROR("Attempt to free invalid context handle: %d\n", ctx_handle);
ctx_handle );
return; return;
} }
...@@ -84,29 +85,33 @@ void drm_ctxbitmap_free( drm_device_t *dev, int ctx_handle ) ...@@ -84,29 +85,33 @@ void drm_ctxbitmap_free( drm_device_t *dev, int ctx_handle )
* drm_device::context_sareas to accommodate the new entry while holding the * drm_device::context_sareas to accommodate the new entry while holding the
* drm_device::struct_sem lock. * drm_device::struct_sem lock.
*/ */
static int drm_ctxbitmap_next( drm_device_t *dev ) static int drm_ctxbitmap_next(drm_device_t * dev)
{ {
int bit; int bit;
if(!dev->ctx_bitmap) return -1; if (!dev->ctx_bitmap)
return -1;
down(&dev->struct_sem); down(&dev->struct_sem);
bit = find_first_zero_bit( dev->ctx_bitmap, DRM_MAX_CTXBITMAP ); bit = find_first_zero_bit(dev->ctx_bitmap, DRM_MAX_CTXBITMAP);
if ( bit < DRM_MAX_CTXBITMAP ) { if (bit < DRM_MAX_CTXBITMAP) {
set_bit( bit, dev->ctx_bitmap ); set_bit(bit, dev->ctx_bitmap);
DRM_DEBUG( "drm_ctxbitmap_next bit : %d\n", bit ); DRM_DEBUG("drm_ctxbitmap_next bit : %d\n", bit);
if((bit+1) > dev->max_context) { if ((bit + 1) > dev->max_context) {
dev->max_context = (bit+1); dev->max_context = (bit + 1);
if(dev->context_sareas) { if (dev->context_sareas) {
drm_map_t **ctx_sareas; drm_map_t **ctx_sareas;
ctx_sareas = drm_realloc(dev->context_sareas, ctx_sareas = drm_realloc(dev->context_sareas,
(dev->max_context - 1) * (dev->max_context -
sizeof(*dev->context_sareas), 1) *
sizeof(*dev->
context_sareas),
dev->max_context * dev->max_context *
sizeof(*dev->context_sareas), sizeof(*dev->
context_sareas),
DRM_MEM_MAPS); DRM_MEM_MAPS);
if(!ctx_sareas) { if (!ctx_sareas) {
clear_bit(bit, dev->ctx_bitmap); clear_bit(bit, dev->ctx_bitmap);
up(&dev->struct_sem); up(&dev->struct_sem);
return -1; return -1;
...@@ -115,11 +120,11 @@ static int drm_ctxbitmap_next( drm_device_t *dev ) ...@@ -115,11 +120,11 @@ static int drm_ctxbitmap_next( drm_device_t *dev )
dev->context_sareas[bit] = NULL; dev->context_sareas[bit] = NULL;
} else { } else {
/* max_context == 1 at this point */ /* max_context == 1 at this point */
dev->context_sareas = drm_alloc( dev->context_sareas =
dev->max_context * drm_alloc(dev->max_context *
sizeof(*dev->context_sareas), sizeof(*dev->context_sareas),
DRM_MEM_MAPS); DRM_MEM_MAPS);
if(!dev->context_sareas) { if (!dev->context_sareas) {
clear_bit(bit, dev->ctx_bitmap); clear_bit(bit, dev->ctx_bitmap);
up(&dev->struct_sem); up(&dev->struct_sem);
return -1; return -1;
...@@ -142,26 +147,26 @@ static int drm_ctxbitmap_next( drm_device_t *dev ) ...@@ -142,26 +147,26 @@ static int drm_ctxbitmap_next( drm_device_t *dev )
* Allocates and initialize drm_device::ctx_bitmap and drm_device::context_sareas, while holding * Allocates and initialize drm_device::ctx_bitmap and drm_device::context_sareas, while holding
* the drm_device::struct_sem lock. * the drm_device::struct_sem lock.
*/ */
int drm_ctxbitmap_init( drm_device_t *dev ) int drm_ctxbitmap_init(drm_device_t * dev)
{ {
int i; int i;
int temp; int temp;
down(&dev->struct_sem); down(&dev->struct_sem);
dev->ctx_bitmap = (unsigned long *) drm_alloc( PAGE_SIZE, dev->ctx_bitmap = (unsigned long *)drm_alloc(PAGE_SIZE,
DRM_MEM_CTXBITMAP ); DRM_MEM_CTXBITMAP);
if ( dev->ctx_bitmap == NULL ) { if (dev->ctx_bitmap == NULL) {
up(&dev->struct_sem); up(&dev->struct_sem);
return -ENOMEM; return -ENOMEM;
} }
memset( (void *)dev->ctx_bitmap, 0, PAGE_SIZE ); memset((void *)dev->ctx_bitmap, 0, PAGE_SIZE);
dev->context_sareas = NULL; dev->context_sareas = NULL;
dev->max_context = -1; dev->max_context = -1;
up(&dev->struct_sem); up(&dev->struct_sem);
for ( i = 0 ; i < DRM_RESERVED_CONTEXTS ; i++ ) { for (i = 0; i < DRM_RESERVED_CONTEXTS; i++) {
temp = drm_ctxbitmap_next( dev ); temp = drm_ctxbitmap_next(dev);
DRM_DEBUG( "drm_ctxbitmap_init : %d\n", temp ); DRM_DEBUG("drm_ctxbitmap_init : %d\n", temp);
} }
return 0; return 0;
...@@ -175,14 +180,14 @@ int drm_ctxbitmap_init( drm_device_t *dev ) ...@@ -175,14 +180,14 @@ int drm_ctxbitmap_init( drm_device_t *dev )
* Frees drm_device::ctx_bitmap and drm_device::context_sareas, while holding * Frees drm_device::ctx_bitmap and drm_device::context_sareas, while holding
* the drm_device::struct_sem lock. * the drm_device::struct_sem lock.
*/ */
void drm_ctxbitmap_cleanup( drm_device_t *dev ) void drm_ctxbitmap_cleanup(drm_device_t * dev)
{ {
down(&dev->struct_sem); down(&dev->struct_sem);
if( dev->context_sareas ) drm_free( dev->context_sareas, if (dev->context_sareas)
drm_free(dev->context_sareas,
sizeof(*dev->context_sareas) * sizeof(*dev->context_sareas) *
dev->max_context, dev->max_context, DRM_MEM_MAPS);
DRM_MEM_MAPS ); drm_free((void *)dev->ctx_bitmap, PAGE_SIZE, DRM_MEM_CTXBITMAP);
drm_free( (void *)dev->ctx_bitmap, PAGE_SIZE, DRM_MEM_CTXBITMAP );
up(&dev->struct_sem); up(&dev->struct_sem);
} }
...@@ -218,7 +223,8 @@ int drm_getsareactx(struct inode *inode, struct file *filp, ...@@ -218,7 +223,8 @@ int drm_getsareactx(struct inode *inode, struct file *filp,
return -EFAULT; return -EFAULT;
down(&dev->struct_sem); down(&dev->struct_sem);
if (dev->max_context < 0 || request.ctx_id >= (unsigned) dev->max_context) { if (dev->max_context < 0
|| request.ctx_id >= (unsigned)dev->max_context) {
up(&dev->struct_sem); up(&dev->struct_sem);
return -EINVAL; return -EINVAL;
} }
...@@ -227,16 +233,16 @@ int drm_getsareactx(struct inode *inode, struct file *filp, ...@@ -227,16 +233,16 @@ int drm_getsareactx(struct inode *inode, struct file *filp,
up(&dev->struct_sem); up(&dev->struct_sem);
request.handle = 0; request.handle = 0;
list_for_each_entry(_entry, &dev->maplist->head,head) { list_for_each_entry(_entry, &dev->maplist->head, head) {
if (_entry->map == map) { if (_entry->map == map) {
request.handle = (void *)(unsigned long)_entry->user_token; request.handle =
(void *)(unsigned long)_entry->user_token;
break; break;
} }
} }
if (request.handle == 0) if (request.handle == 0)
return -EINVAL; return -EINVAL;
if (copy_to_user(argp, &request, sizeof(request))) if (copy_to_user(argp, &request, sizeof(request)))
return -EFAULT; return -EFAULT;
return 0; return 0;
...@@ -265,27 +271,27 @@ int drm_setsareactx(struct inode *inode, struct file *filp, ...@@ -265,27 +271,27 @@ int drm_setsareactx(struct inode *inode, struct file *filp,
struct list_head *list; struct list_head *list;
if (copy_from_user(&request, if (copy_from_user(&request,
(drm_ctx_priv_map_t __user *)arg, (drm_ctx_priv_map_t __user *) arg, sizeof(request)))
sizeof(request)))
return -EFAULT; return -EFAULT;
down(&dev->struct_sem); down(&dev->struct_sem);
list_for_each(list, &dev->maplist->head) { list_for_each(list, &dev->maplist->head) {
r_list = list_entry(list, drm_map_list_t, head); r_list = list_entry(list, drm_map_list_t, head);
if (r_list->map if (r_list->map
&& r_list->user_token == (unsigned long) request.handle) && r_list->user_token == (unsigned long)request.handle)
goto found; goto found;
} }
bad: bad:
up(&dev->struct_sem); up(&dev->struct_sem);
return -EINVAL; return -EINVAL;
found: found:
map = r_list->map; map = r_list->map;
if (!map) goto bad; if (!map)
goto bad;
if (dev->max_context < 0) if (dev->max_context < 0)
goto bad; goto bad;
if (request.ctx_id >= (unsigned) dev->max_context) if (request.ctx_id >= (unsigned)dev->max_context)
goto bad; goto bad;
dev->context_sareas[request.ctx_id] = map; dev->context_sareas[request.ctx_id] = map;
up(&dev->struct_sem); up(&dev->struct_sem);
...@@ -308,18 +314,17 @@ int drm_setsareactx(struct inode *inode, struct file *filp, ...@@ -308,18 +314,17 @@ int drm_setsareactx(struct inode *inode, struct file *filp,
* *
* Attempt to set drm_device::context_flag. * Attempt to set drm_device::context_flag.
*/ */
static int drm_context_switch( drm_device_t *dev, int old, int new ) static int drm_context_switch(drm_device_t * dev, int old, int new)
{ {
if ( test_and_set_bit( 0, &dev->context_flag ) ) { if (test_and_set_bit(0, &dev->context_flag)) {
DRM_ERROR( "Reentering -- FIXME\n" ); DRM_ERROR("Reentering -- FIXME\n");
return -EBUSY; return -EBUSY;
} }
DRM_DEBUG("Context switch from %d to %d\n", old, new);
DRM_DEBUG( "Context switch from %d to %d\n", old, new ); if (new == dev->last_context) {
clear_bit(0, &dev->context_flag);
if ( new == dev->last_context ) {
clear_bit( 0, &dev->context_flag );
return 0; return 0;
} }
...@@ -337,20 +342,20 @@ static int drm_context_switch( drm_device_t *dev, int old, int new ) ...@@ -337,20 +342,20 @@ static int drm_context_switch( drm_device_t *dev, int old, int new )
* hardware lock is held, clears the drm_device::context_flag and wakes up * hardware lock is held, clears the drm_device::context_flag and wakes up
* drm_device::context_wait. * drm_device::context_wait.
*/ */
static int drm_context_switch_complete( drm_device_t *dev, int new ) static int drm_context_switch_complete(drm_device_t * dev, int new)
{ {
dev->last_context = new; /* PRE/POST: This is the _only_ writer. */ dev->last_context = new; /* PRE/POST: This is the _only_ writer. */
dev->last_switch = jiffies; dev->last_switch = jiffies;
if ( !_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) ) { if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) {
DRM_ERROR( "Lock isn't held after context switch\n" ); DRM_ERROR("Lock isn't held after context switch\n");
} }
/* If a context switch is ever initiated /* If a context switch is ever initiated
when the kernel holds the lock, release when the kernel holds the lock, release
that lock here. */ that lock here. */
clear_bit( 0, &dev->context_flag ); clear_bit(0, &dev->context_flag);
wake_up( &dev->context_wait ); wake_up(&dev->context_wait);
return 0; return 0;
} }
...@@ -364,29 +369,28 @@ static int drm_context_switch_complete( drm_device_t *dev, int new ) ...@@ -364,29 +369,28 @@ static int drm_context_switch_complete( drm_device_t *dev, int new )
* \param arg user argument pointing to a drm_ctx_res structure. * \param arg user argument pointing to a drm_ctx_res structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
*/ */
int drm_resctx( struct inode *inode, struct file *filp, int drm_resctx(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg ) unsigned int cmd, unsigned long arg)
{ {
drm_ctx_res_t res; drm_ctx_res_t res;
drm_ctx_t __user *argp = (void __user *)arg; drm_ctx_t __user *argp = (void __user *)arg;
drm_ctx_t ctx; drm_ctx_t ctx;
int i; int i;
if ( copy_from_user( &res, argp, sizeof(res) ) ) if (copy_from_user(&res, argp, sizeof(res)))
return -EFAULT; return -EFAULT;
if ( res.count >= DRM_RESERVED_CONTEXTS ) { if (res.count >= DRM_RESERVED_CONTEXTS) {
memset( &ctx, 0, sizeof(ctx) ); memset(&ctx, 0, sizeof(ctx));
for ( i = 0 ; i < DRM_RESERVED_CONTEXTS ; i++ ) { for (i = 0; i < DRM_RESERVED_CONTEXTS; i++) {
ctx.handle = i; ctx.handle = i;
if ( copy_to_user( &res.contexts[i], if (copy_to_user(&res.contexts[i], &ctx, sizeof(ctx)))
&ctx, sizeof(ctx) ) )
return -EFAULT; return -EFAULT;
} }
} }
res.count = DRM_RESERVED_CONTEXTS; res.count = DRM_RESERVED_CONTEXTS;
if ( copy_to_user( argp, &res, sizeof(res) ) ) if (copy_to_user(argp, &res, sizeof(res)))
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
...@@ -402,58 +406,57 @@ int drm_resctx( struct inode *inode, struct file *filp, ...@@ -402,58 +406,57 @@ int drm_resctx( struct inode *inode, struct file *filp,
* *
* Get a new handle for the context and copy to userspace. * Get a new handle for the context and copy to userspace.
*/ */
int drm_addctx( struct inode *inode, struct file *filp, int drm_addctx(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg ) unsigned int cmd, unsigned long arg)
{ {
drm_file_t *priv = filp->private_data; drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->head->dev; drm_device_t *dev = priv->head->dev;
drm_ctx_list_t * ctx_entry; drm_ctx_list_t *ctx_entry;
drm_ctx_t __user *argp = (void __user *)arg; drm_ctx_t __user *argp = (void __user *)arg;
drm_ctx_t ctx; drm_ctx_t ctx;
if ( copy_from_user( &ctx, argp, sizeof(ctx) ) ) if (copy_from_user(&ctx, argp, sizeof(ctx)))
return -EFAULT; return -EFAULT;
ctx.handle = drm_ctxbitmap_next( dev ); ctx.handle = drm_ctxbitmap_next(dev);
if ( ctx.handle == DRM_KERNEL_CONTEXT ) { if (ctx.handle == DRM_KERNEL_CONTEXT) {
/* Skip kernel's context and get a new one. */ /* Skip kernel's context and get a new one. */
ctx.handle = drm_ctxbitmap_next( dev ); ctx.handle = drm_ctxbitmap_next(dev);
} }
DRM_DEBUG( "%d\n", ctx.handle ); DRM_DEBUG("%d\n", ctx.handle);
if ( ctx.handle == -1 ) { if (ctx.handle == -1) {
DRM_DEBUG( "Not enough free contexts.\n" ); DRM_DEBUG("Not enough free contexts.\n");
/* Should this return -EBUSY instead? */ /* Should this return -EBUSY instead? */
return -ENOMEM; return -ENOMEM;
} }
if ( ctx.handle != DRM_KERNEL_CONTEXT ) if (ctx.handle != DRM_KERNEL_CONTEXT) {
{
if (dev->driver->context_ctor) if (dev->driver->context_ctor)
dev->driver->context_ctor(dev, ctx.handle); dev->driver->context_ctor(dev, ctx.handle);
} }
ctx_entry = drm_alloc( sizeof(*ctx_entry), DRM_MEM_CTXLIST ); ctx_entry = drm_alloc(sizeof(*ctx_entry), DRM_MEM_CTXLIST);
if ( !ctx_entry ) { if (!ctx_entry) {
DRM_DEBUG("out of memory\n"); DRM_DEBUG("out of memory\n");
return -ENOMEM; return -ENOMEM;
} }
INIT_LIST_HEAD( &ctx_entry->head ); INIT_LIST_HEAD(&ctx_entry->head);
ctx_entry->handle = ctx.handle; ctx_entry->handle = ctx.handle;
ctx_entry->tag = priv; ctx_entry->tag = priv;
down( &dev->ctxlist_sem ); down(&dev->ctxlist_sem);
list_add( &ctx_entry->head, &dev->ctxlist->head ); list_add(&ctx_entry->head, &dev->ctxlist->head);
++dev->ctx_count; ++dev->ctx_count;
up( &dev->ctxlist_sem ); up(&dev->ctxlist_sem);
if ( copy_to_user( argp, &ctx, sizeof(ctx) ) ) if (copy_to_user(argp, &ctx, sizeof(ctx)))
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
int drm_modctx( struct inode *inode, struct file *filp, int drm_modctx(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg ) unsigned int cmd, unsigned long arg)
{ {
/* This does nothing */ /* This does nothing */
return 0; return 0;
...@@ -468,19 +471,19 @@ int drm_modctx( struct inode *inode, struct file *filp, ...@@ -468,19 +471,19 @@ int drm_modctx( struct inode *inode, struct file *filp,
* \param arg user argument pointing to a drm_ctx structure. * \param arg user argument pointing to a drm_ctx structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
*/ */
int drm_getctx( struct inode *inode, struct file *filp, int drm_getctx(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg ) unsigned int cmd, unsigned long arg)
{ {
drm_ctx_t __user *argp = (void __user *)arg; drm_ctx_t __user *argp = (void __user *)arg;
drm_ctx_t ctx; drm_ctx_t ctx;
if ( copy_from_user( &ctx, argp, sizeof(ctx) ) ) if (copy_from_user(&ctx, argp, sizeof(ctx)))
return -EFAULT; return -EFAULT;
/* This is 0, because we don't handle any context flags */ /* This is 0, because we don't handle any context flags */
ctx.flags = 0; ctx.flags = 0;
if ( copy_to_user( argp, &ctx, sizeof(ctx) ) ) if (copy_to_user(argp, &ctx, sizeof(ctx)))
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
...@@ -496,18 +499,18 @@ int drm_getctx( struct inode *inode, struct file *filp, ...@@ -496,18 +499,18 @@ int drm_getctx( struct inode *inode, struct file *filp,
* *
* Calls context_switch(). * Calls context_switch().
*/ */
int drm_switchctx( struct inode *inode, struct file *filp, int drm_switchctx(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg ) unsigned int cmd, unsigned long arg)
{ {
drm_file_t *priv = filp->private_data; drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->head->dev; drm_device_t *dev = priv->head->dev;
drm_ctx_t ctx; drm_ctx_t ctx;
if ( copy_from_user( &ctx, (drm_ctx_t __user *)arg, sizeof(ctx) ) ) if (copy_from_user(&ctx, (drm_ctx_t __user *) arg, sizeof(ctx)))
return -EFAULT; return -EFAULT;
DRM_DEBUG( "%d\n", ctx.handle ); DRM_DEBUG("%d\n", ctx.handle);
return drm_context_switch( dev, dev->last_context, ctx.handle ); return drm_context_switch(dev, dev->last_context, ctx.handle);
} }
/** /**
...@@ -521,18 +524,18 @@ int drm_switchctx( struct inode *inode, struct file *filp, ...@@ -521,18 +524,18 @@ int drm_switchctx( struct inode *inode, struct file *filp,
* *
* Calls context_switch_complete(). * Calls context_switch_complete().
*/ */
int drm_newctx( struct inode *inode, struct file *filp, int drm_newctx(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg ) unsigned int cmd, unsigned long arg)
{ {
drm_file_t *priv = filp->private_data; drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->head->dev; drm_device_t *dev = priv->head->dev;
drm_ctx_t ctx; drm_ctx_t ctx;
if ( copy_from_user( &ctx, (drm_ctx_t __user *)arg, sizeof(ctx) ) ) if (copy_from_user(&ctx, (drm_ctx_t __user *) arg, sizeof(ctx)))
return -EFAULT; return -EFAULT;
DRM_DEBUG( "%d\n", ctx.handle ); DRM_DEBUG("%d\n", ctx.handle);
drm_context_switch_complete( dev, ctx.handle ); drm_context_switch_complete(dev, ctx.handle);
return 0; return 0;
} }
...@@ -548,42 +551,41 @@ int drm_newctx( struct inode *inode, struct file *filp, ...@@ -548,42 +551,41 @@ int drm_newctx( struct inode *inode, struct file *filp,
* *
* If not the special kernel context, calls ctxbitmap_free() to free the specified context. * If not the special kernel context, calls ctxbitmap_free() to free the specified context.
*/ */
int drm_rmctx( struct inode *inode, struct file *filp, int drm_rmctx(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg ) unsigned int cmd, unsigned long arg)
{ {
drm_file_t *priv = filp->private_data; drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->head->dev; drm_device_t *dev = priv->head->dev;
drm_ctx_t ctx; drm_ctx_t ctx;
if ( copy_from_user( &ctx, (drm_ctx_t __user *)arg, sizeof(ctx) ) ) if (copy_from_user(&ctx, (drm_ctx_t __user *) arg, sizeof(ctx)))
return -EFAULT; return -EFAULT;
DRM_DEBUG( "%d\n", ctx.handle ); DRM_DEBUG("%d\n", ctx.handle);
if ( ctx.handle == DRM_KERNEL_CONTEXT + 1 ) { if (ctx.handle == DRM_KERNEL_CONTEXT + 1) {
priv->remove_auth_on_close = 1; priv->remove_auth_on_close = 1;
} }
if ( ctx.handle != DRM_KERNEL_CONTEXT ) { if (ctx.handle != DRM_KERNEL_CONTEXT) {
if (dev->driver->context_dtor) if (dev->driver->context_dtor)
dev->driver->context_dtor(dev, ctx.handle); dev->driver->context_dtor(dev, ctx.handle);
drm_ctxbitmap_free( dev, ctx.handle ); drm_ctxbitmap_free(dev, ctx.handle);
} }
down( &dev->ctxlist_sem ); down(&dev->ctxlist_sem);
if ( !list_empty( &dev->ctxlist->head ) ) { if (!list_empty(&dev->ctxlist->head)) {
drm_ctx_list_t *pos, *n; drm_ctx_list_t *pos, *n;
list_for_each_entry_safe( pos, n, &dev->ctxlist->head, head ) { list_for_each_entry_safe(pos, n, &dev->ctxlist->head, head) {
if ( pos->handle == ctx.handle ) { if (pos->handle == ctx.handle) {
list_del( &pos->head ); list_del(&pos->head);
drm_free( pos, sizeof(*pos), DRM_MEM_CTXLIST ); drm_free(pos, sizeof(*pos), DRM_MEM_CTXLIST);
--dev->ctx_count; --dev->ctx_count;
} }
} }
} }
up( &dev->ctxlist_sem ); up(&dev->ctxlist_sem);
return 0; return 0;
} }
/*@}*/ /*@}*/
/** /**
* \file drm_dma.h * \file drm_dma.c
* DMA IOCTL and function support * DMA IOCTL and function support
* *
* \author Rickard E. (Rik) Faith <faith@valinux.com> * \author Rickard E. (Rik) Faith <faith@valinux.com>
...@@ -43,17 +43,17 @@ ...@@ -43,17 +43,17 @@
* *
* Allocate and initialize a drm_device_dma structure. * Allocate and initialize a drm_device_dma structure.
*/ */
int drm_dma_setup( drm_device_t *dev ) int drm_dma_setup(drm_device_t * dev)
{ {
int i; int i;
dev->dma = drm_alloc( sizeof(*dev->dma), DRM_MEM_DRIVER ); dev->dma = drm_alloc(sizeof(*dev->dma), DRM_MEM_DRIVER);
if ( !dev->dma ) if (!dev->dma)
return -ENOMEM; return -ENOMEM;
memset( dev->dma, 0, sizeof(*dev->dma) ); memset(dev->dma, 0, sizeof(*dev->dma));
for ( i = 0 ; i <= DRM_MAX_ORDER ; i++ ) for (i = 0; i <= DRM_MAX_ORDER; i++)
memset(&dev->dma->bufs[i], 0, sizeof(dev->dma->bufs[0])); memset(&dev->dma->bufs[i], 0, sizeof(dev->dma->bufs[0]));
return 0; return 0;
...@@ -67,12 +67,13 @@ int drm_dma_setup( drm_device_t *dev ) ...@@ -67,12 +67,13 @@ int drm_dma_setup( drm_device_t *dev )
* Free all pages associated with DMA buffers, the buffers and pages lists, and * Free all pages associated with DMA buffers, the buffers and pages lists, and
* finally the the drm_device::dma structure itself. * finally the the drm_device::dma structure itself.
*/ */
void drm_dma_takedown(drm_device_t *dev) void drm_dma_takedown(drm_device_t * dev)
{ {
drm_device_dma_t *dma = dev->dma; drm_device_dma_t *dma = dev->dma;
int i, j; int i, j;
if (!dma) return; if (!dma)
return;
/* Clear dma buffers */ /* Clear dma buffers */
for (i = 0; i <= DRM_MAX_ORDER; i++) { for (i = 0; i <= DRM_MAX_ORDER; i++) {
...@@ -91,28 +92,26 @@ void drm_dma_takedown(drm_device_t *dev) ...@@ -91,28 +92,26 @@ void drm_dma_takedown(drm_device_t *dev)
} }
drm_free(dma->bufs[i].seglist, drm_free(dma->bufs[i].seglist,
dma->bufs[i].seg_count dma->bufs[i].seg_count
* sizeof(*dma->bufs[0].seglist), * sizeof(*dma->bufs[0].seglist), DRM_MEM_SEGS);
DRM_MEM_SEGS);
} }
if (dma->bufs[i].buf_count) { if (dma->bufs[i].buf_count) {
for (j = 0; j < dma->bufs[i].buf_count; j++) { for (j = 0; j < dma->bufs[i].buf_count; j++) {
if (dma->bufs[i].buflist[j].dev_private) { if (dma->bufs[i].buflist[j].dev_private) {
drm_free(dma->bufs[i].buflist[j].dev_private, drm_free(dma->bufs[i].buflist[j].
dma->bufs[i].buflist[j].dev_priv_size, dev_private,
DRM_MEM_BUFS); dma->bufs[i].buflist[j].
dev_priv_size, DRM_MEM_BUFS);
} }
} }
drm_free(dma->bufs[i].buflist, drm_free(dma->bufs[i].buflist,
dma->bufs[i].buf_count * dma->bufs[i].buf_count *
sizeof(*dma->bufs[0].buflist), sizeof(*dma->bufs[0].buflist), DRM_MEM_BUFS);
DRM_MEM_BUFS);
} }
} }
if (dma->buflist) { if (dma->buflist) {
drm_free(dma->buflist, drm_free(dma->buflist,
dma->buf_count * sizeof(*dma->buflist), dma->buf_count * sizeof(*dma->buflist), DRM_MEM_BUFS);
DRM_MEM_BUFS);
} }
if (dma->pagelist) { if (dma->pagelist) {
...@@ -124,7 +123,6 @@ void drm_dma_takedown(drm_device_t *dev) ...@@ -124,7 +123,6 @@ void drm_dma_takedown(drm_device_t *dev)
dev->dma = NULL; dev->dma = NULL;
} }
/** /**
* Free a buffer. * Free a buffer.
* *
...@@ -133,16 +131,18 @@ void drm_dma_takedown(drm_device_t *dev) ...@@ -133,16 +131,18 @@ void drm_dma_takedown(drm_device_t *dev)
* *
* Resets the fields of \p buf. * Resets the fields of \p buf.
*/ */
void drm_free_buffer(drm_device_t *dev, drm_buf_t *buf) void drm_free_buffer(drm_device_t * dev, drm_buf_t * buf)
{ {
if (!buf) return; if (!buf)
return;
buf->waiting = 0; buf->waiting = 0;
buf->pending = 0; buf->pending = 0;
buf->filp = NULL; buf->filp = NULL;
buf->used = 0; buf->used = 0;
if (drm_core_check_feature(dev, DRIVER_DMA_QUEUE) && waitqueue_active(&buf->dma_wait)) { if (drm_core_check_feature(dev, DRIVER_DMA_QUEUE)
&& waitqueue_active(&buf->dma_wait)) {
wake_up_interruptible(&buf->dma_wait); wake_up_interruptible(&buf->dma_wait);
} }
} }
...@@ -154,12 +154,13 @@ void drm_free_buffer(drm_device_t *dev, drm_buf_t *buf) ...@@ -154,12 +154,13 @@ void drm_free_buffer(drm_device_t *dev, drm_buf_t *buf)
* *
* Frees each buffer associated with \p filp not already on the hardware. * Frees each buffer associated with \p filp not already on the hardware.
*/ */
void drm_core_reclaim_buffers(drm_device_t *dev, struct file *filp) void drm_core_reclaim_buffers(drm_device_t * dev, struct file *filp)
{ {
drm_device_dma_t *dma = dev->dma; drm_device_dma_t *dma = dev->dma;
int i; int i;
if (!dma) return; if (!dma)
return;
for (i = 0; i < dma->buf_count; i++) { for (i = 0; i < dma->buf_count; i++) {
if (dma->buflist[i]->filp == filp) { if (dma->buflist[i]->filp == filp) {
switch (dma->buflist[i]->list) { switch (dma->buflist[i]->list) {
...@@ -176,5 +177,5 @@ void drm_core_reclaim_buffers(drm_device_t *dev, struct file *filp) ...@@ -176,5 +177,5 @@ void drm_core_reclaim_buffers(drm_device_t *dev, struct file *filp)
} }
} }
} }
EXPORT_SYMBOL(drm_core_reclaim_buffers);
EXPORT_SYMBOL(drm_core_reclaim_buffers);
/** /**
* \file drm_drawable.h * \file drm_drawable.c
* IOCTLs for drawables * IOCTLs for drawables
* *
* \author Rickard E. (Rik) Faith <faith@valinux.com> * \author Rickard E. (Rik) Faith <faith@valinux.com>
...@@ -43,7 +43,7 @@ int drm_adddraw(struct inode *inode, struct file *filp, ...@@ -43,7 +43,7 @@ int drm_adddraw(struct inode *inode, struct file *filp,
draw.handle = 0; /* NOOP */ draw.handle = 0; /* NOOP */
DRM_DEBUG("%d\n", draw.handle); DRM_DEBUG("%d\n", draw.handle);
if (copy_to_user((drm_draw_t __user *)arg, &draw, sizeof(draw))) if (copy_to_user((drm_draw_t __user *) arg, &draw, sizeof(draw)))
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
......
/** /**
* \file drm_drv.h * \file drm_drv.c
* Generic driver template * Generic driver template
* *
* \author Rickard E. (Rik) Faith <faith@valinux.com> * \author Rickard E. (Rik) Faith <faith@valinux.com>
...@@ -56,66 +56,66 @@ static int drm_version(struct inode *inode, struct file *filp, ...@@ -56,66 +56,66 @@ static int drm_version(struct inode *inode, struct file *filp,
/** Ioctl table */ /** Ioctl table */
static drm_ioctl_desc_t drm_ioctls[] = { static drm_ioctl_desc_t drm_ioctls[] = {
[DRM_IOCTL_NR(DRM_IOCTL_VERSION)] = { drm_version, 0, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_VERSION)] = {drm_version, 0, 0},
[DRM_IOCTL_NR(DRM_IOCTL_GET_UNIQUE)] = { drm_getunique, 0, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_GET_UNIQUE)] = {drm_getunique, 0, 0},
[DRM_IOCTL_NR(DRM_IOCTL_GET_MAGIC)] = { drm_getmagic, 0, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_GET_MAGIC)] = {drm_getmagic, 0, 0},
[DRM_IOCTL_NR(DRM_IOCTL_IRQ_BUSID)] = { drm_irq_by_busid, 0, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_IRQ_BUSID)] = {drm_irq_by_busid, 0, 1},
[DRM_IOCTL_NR(DRM_IOCTL_GET_MAP)] = { drm_getmap, 0, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_GET_MAP)] = {drm_getmap, 0, 0},
[DRM_IOCTL_NR(DRM_IOCTL_GET_CLIENT)] = { drm_getclient, 0, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_GET_CLIENT)] = {drm_getclient, 0, 0},
[DRM_IOCTL_NR(DRM_IOCTL_GET_STATS)] = { drm_getstats, 0, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_GET_STATS)] = {drm_getstats, 0, 0},
[DRM_IOCTL_NR(DRM_IOCTL_SET_VERSION)] = { drm_setversion, 0, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_SET_VERSION)] = {drm_setversion, 0, 1},
[DRM_IOCTL_NR(DRM_IOCTL_SET_UNIQUE)] = { drm_setunique, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_SET_UNIQUE)] = {drm_setunique, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_BLOCK)] = { drm_noop, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_BLOCK)] = {drm_noop, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_UNBLOCK)] = { drm_noop, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_UNBLOCK)] = {drm_noop, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_AUTH_MAGIC)] = { drm_authmagic, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_AUTH_MAGIC)] = {drm_authmagic, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_ADD_MAP)] = { drm_addmap_ioctl,1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_ADD_MAP)] = {drm_addmap_ioctl, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_RM_MAP)] = { drm_rmmap_ioctl, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_RM_MAP)] = {drm_rmmap_ioctl, 1, 0},
[DRM_IOCTL_NR(DRM_IOCTL_SET_SAREA_CTX)] = { drm_setsareactx, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_SET_SAREA_CTX)] = {drm_setsareactx, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_GET_SAREA_CTX)] = { drm_getsareactx, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_GET_SAREA_CTX)] = {drm_getsareactx, 1, 0},
[DRM_IOCTL_NR(DRM_IOCTL_ADD_CTX)] = { drm_addctx, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_ADD_CTX)] = {drm_addctx, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_RM_CTX)] = { drm_rmctx, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_RM_CTX)] = {drm_rmctx, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_MOD_CTX)] = { drm_modctx, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_MOD_CTX)] = {drm_modctx, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_GET_CTX)] = { drm_getctx, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_GET_CTX)] = {drm_getctx, 1, 0},
[DRM_IOCTL_NR(DRM_IOCTL_SWITCH_CTX)] = { drm_switchctx, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_SWITCH_CTX)] = {drm_switchctx, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_NEW_CTX)] = { drm_newctx, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_NEW_CTX)] = {drm_newctx, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_RES_CTX)] = { drm_resctx, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_RES_CTX)] = {drm_resctx, 1, 0},
[DRM_IOCTL_NR(DRM_IOCTL_ADD_DRAW)] = { drm_adddraw, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_ADD_DRAW)] = {drm_adddraw, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_RM_DRAW)] = { drm_rmdraw, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_RM_DRAW)] = {drm_rmdraw, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_LOCK)] = { drm_lock, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_LOCK)] = {drm_lock, 1, 0},
[DRM_IOCTL_NR(DRM_IOCTL_UNLOCK)] = { drm_unlock, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_UNLOCK)] = {drm_unlock, 1, 0},
[DRM_IOCTL_NR(DRM_IOCTL_FINISH)] = { drm_noop, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_FINISH)] = {drm_noop, 1, 0},
[DRM_IOCTL_NR(DRM_IOCTL_ADD_BUFS)] = { drm_addbufs, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_ADD_BUFS)] = {drm_addbufs, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_MARK_BUFS)] = { drm_markbufs, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_MARK_BUFS)] = {drm_markbufs, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_INFO_BUFS)] = { drm_infobufs, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_INFO_BUFS)] = {drm_infobufs, 1, 0},
[DRM_IOCTL_NR(DRM_IOCTL_MAP_BUFS)] = { drm_mapbufs, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_MAP_BUFS)] = {drm_mapbufs, 1, 0},
[DRM_IOCTL_NR(DRM_IOCTL_FREE_BUFS)] = { drm_freebufs, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_FREE_BUFS)] = {drm_freebufs, 1, 0},
/* The DRM_IOCTL_DMA ioctl should be defined by the driver. */ /* The DRM_IOCTL_DMA ioctl should be defined by the driver. */
[DRM_IOCTL_NR(DRM_IOCTL_CONTROL)] = { drm_control, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_CONTROL)] = {drm_control, 1, 1},
#if __OS_HAS_AGP #if __OS_HAS_AGP
[DRM_IOCTL_NR(DRM_IOCTL_AGP_ACQUIRE)] = { drm_agp_acquire_ioctl, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_AGP_ACQUIRE)] = {drm_agp_acquire_ioctl, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_AGP_RELEASE)] = { drm_agp_release_ioctl, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_AGP_RELEASE)] = {drm_agp_release_ioctl, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_AGP_ENABLE)] = { drm_agp_enable_ioctl, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_AGP_ENABLE)] = {drm_agp_enable_ioctl, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_AGP_INFO)] = { drm_agp_info_ioctl, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_AGP_INFO)] = {drm_agp_info_ioctl, 1, 0},
[DRM_IOCTL_NR(DRM_IOCTL_AGP_ALLOC)] = { drm_agp_alloc, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_AGP_ALLOC)] = {drm_agp_alloc, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_AGP_FREE)] = { drm_agp_free, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_AGP_FREE)] = {drm_agp_free, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_AGP_BIND)] = { drm_agp_bind, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_AGP_BIND)] = {drm_agp_bind, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_AGP_UNBIND)] = { drm_agp_unbind, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_AGP_UNBIND)] = {drm_agp_unbind, 1, 1},
#endif #endif
[DRM_IOCTL_NR(DRM_IOCTL_SG_ALLOC)] = { drm_sg_alloc, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_SG_ALLOC)] = {drm_sg_alloc, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_SG_FREE)] = { drm_sg_free, 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_SG_FREE)] = {drm_sg_free, 1, 1},
[DRM_IOCTL_NR(DRM_IOCTL_WAIT_VBLANK)] = { drm_wait_vblank, 0, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_WAIT_VBLANK)] = {drm_wait_vblank, 0, 0},
}; };
#define DRIVER_IOCTL_COUNT DRM_ARRAY_SIZE( drm_ioctls ) #define DRIVER_IOCTL_COUNT DRM_ARRAY_SIZE( drm_ioctls )
...@@ -129,14 +129,14 @@ static drm_ioctl_desc_t drm_ioctls[] = { ...@@ -129,14 +129,14 @@ static drm_ioctl_desc_t drm_ioctls[] = {
* *
* \sa drm_device * \sa drm_device
*/ */
int drm_takedown( drm_device_t *dev ) int drm_takedown(drm_device_t * dev)
{ {
drm_magic_entry_t *pt, *next; drm_magic_entry_t *pt, *next;
drm_map_list_t *r_list; drm_map_list_t *r_list;
drm_vma_entry_t *vma, *vma_next; drm_vma_entry_t *vma, *vma_next;
int i; int i;
DRM_DEBUG( "\n" ); DRM_DEBUG("\n");
if (dev->driver->pretakedown) if (dev->driver->pretakedown)
dev->driver->pretakedown(dev); dev->driver->pretakedown(dev);
...@@ -148,16 +148,17 @@ int drm_takedown( drm_device_t *dev ) ...@@ -148,16 +148,17 @@ int drm_takedown( drm_device_t *dev )
dev->unique_len = 0; dev->unique_len = 0;
} }
if ( dev->irq_enabled ) drm_irq_uninstall( dev ); if (dev->irq_enabled)
drm_irq_uninstall(dev);
down( &dev->struct_sem ); down(&dev->struct_sem);
del_timer( &dev->timer ); del_timer(&dev->timer);
/* Clear pid list */ /* Clear pid list */
for ( i = 0 ; i < DRM_HASH_SIZE ; i++ ) { for (i = 0; i < DRM_HASH_SIZE; i++) {
for ( pt = dev->magiclist[i].head ; pt ; pt = next ) { for (pt = dev->magiclist[i].head; pt; pt = next) {
next = pt->next; next = pt->next;
drm_free( pt, sizeof(*pt), DRM_MEM_MAGIC ); drm_free(pt, sizeof(*pt), DRM_MEM_MAGIC);
} }
dev->magiclist[i].head = dev->magiclist[i].tail = NULL; dev->magiclist[i].head = dev->magiclist[i].tail = NULL;
} }
...@@ -169,11 +170,12 @@ int drm_takedown( drm_device_t *dev ) ...@@ -169,11 +170,12 @@ int drm_takedown( drm_device_t *dev )
/* Remove AGP resources, but leave dev->agp /* Remove AGP resources, but leave dev->agp
intact until drv_cleanup is called. */ intact until drv_cleanup is called. */
for ( entry = dev->agp->memory ; entry ; entry = nexte ) { for (entry = dev->agp->memory; entry; entry = nexte) {
nexte = entry->next; nexte = entry->next;
if ( entry->bound ) drm_unbind_agp( entry->memory ); if (entry->bound)
drm_free_agp( entry->memory, entry->pages ); drm_unbind_agp(entry->memory);
drm_free( entry, sizeof(*entry), DRM_MEM_AGPLISTS ); drm_free_agp(entry->memory, entry->pages);
drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS);
} }
dev->agp->memory = NULL; dev->agp->memory = NULL;
...@@ -189,15 +191,15 @@ int drm_takedown( drm_device_t *dev ) ...@@ -189,15 +191,15 @@ int drm_takedown( drm_device_t *dev )
} }
/* Clear vma list (only built for debugging) */ /* Clear vma list (only built for debugging) */
if ( dev->vmalist ) { if (dev->vmalist) {
for ( vma = dev->vmalist ; vma ; vma = vma_next ) { for (vma = dev->vmalist; vma; vma = vma_next) {
vma_next = vma->next; vma_next = vma->next;
drm_free( vma, sizeof(*vma), DRM_MEM_VMAS ); drm_free(vma, sizeof(*vma), DRM_MEM_VMAS);
} }
dev->vmalist = NULL; dev->vmalist = NULL;
} }
if( dev->maplist ) { if (dev->maplist) {
while (!list_empty(&dev->maplist->head)) { while (!list_empty(&dev->maplist->head)) {
struct list_head *list = dev->maplist->head.next; struct list_head *list = dev->maplist->head.next;
r_list = list_entry(list, drm_map_list_t, head); r_list = list_entry(list, drm_map_list_t, head);
...@@ -205,38 +207,36 @@ int drm_takedown( drm_device_t *dev ) ...@@ -205,38 +207,36 @@ int drm_takedown( drm_device_t *dev )
} }
} }
if (drm_core_check_feature(dev, DRIVER_DMA_QUEUE) && dev->queuelist ) { if (drm_core_check_feature(dev, DRIVER_DMA_QUEUE) && dev->queuelist) {
for ( i = 0 ; i < dev->queue_count ; i++ ) { for (i = 0; i < dev->queue_count; i++) {
if ( dev->queuelist[i] ) { if (dev->queuelist[i]) {
drm_free( dev->queuelist[i], drm_free(dev->queuelist[i],
sizeof(*dev->queuelist[0]), sizeof(*dev->queuelist[0]),
DRM_MEM_QUEUES ); DRM_MEM_QUEUES);
dev->queuelist[i] = NULL; dev->queuelist[i] = NULL;
} }
} }
drm_free( dev->queuelist, drm_free(dev->queuelist,
dev->queue_slots * sizeof(*dev->queuelist), dev->queue_slots * sizeof(*dev->queuelist),
DRM_MEM_QUEUES ); DRM_MEM_QUEUES);
dev->queuelist = NULL; dev->queuelist = NULL;
} }
dev->queue_count = 0; dev->queue_count = 0;
if (drm_core_check_feature(dev, DRIVER_HAVE_DMA)) if (drm_core_check_feature(dev, DRIVER_HAVE_DMA))
drm_dma_takedown( dev ); drm_dma_takedown(dev);
if ( dev->lock.hw_lock ) { if (dev->lock.hw_lock) {
dev->sigdata.lock = dev->lock.hw_lock = NULL; /* SHM removed */ dev->sigdata.lock = dev->lock.hw_lock = NULL; /* SHM removed */
dev->lock.filp = NULL; dev->lock.filp = NULL;
wake_up_interruptible( &dev->lock.lock_queue ); wake_up_interruptible(&dev->lock.lock_queue);
} }
up( &dev->struct_sem ); up(&dev->struct_sem);
DRM_DEBUG("takedown completed\n"); DRM_DEBUG("takedown completed\n");
return 0; return 0;
} }
/** /**
* Module initialization. Called via init_module at module load time, or via * Module initialization. Called via init_module at module load time, or via
* linux/init/main.c (this is not currently supported). * linux/init/main.c (this is not currently supported).
...@@ -250,22 +250,24 @@ int drm_takedown( drm_device_t *dev ) ...@@ -250,22 +250,24 @@ int drm_takedown( drm_device_t *dev )
* 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; struct pci_dev *pdev = NULL;
struct pci_device_id *pid; struct pci_device_id *pid;
int i; int i;
DRM_DEBUG( "\n" ); DRM_DEBUG("\n");
drm_mem_init(); drm_mem_init();
for (i=0; driver->pci_driver.id_table[i].vendor != 0; i++) { for (i = 0; driver->pci_driver.id_table[i].vendor != 0; i++) {
pid = (struct pci_device_id *)&driver->pci_driver.id_table[i]; pid = (struct pci_device_id *)&driver->pci_driver.id_table[i];
pdev=NULL; pdev = NULL;
/* pass back in pdev to account for multiple identical cards */ /* pass back in pdev to account for multiple identical cards */
while ((pdev = pci_get_subsys(pid->vendor, pid->device, pid->subvendor, pid->subdevice, pdev)) != NULL) { while ((pdev =
pci_get_subsys(pid->vendor, pid->device, pid->subvendor,
pid->subdevice, pdev)) != NULL) {
/* stealth mode requires a manual probe */ /* stealth mode requires a manual probe */
pci_dev_get(pdev); pci_dev_get(pdev);
drm_get_dev(pdev, pid, driver); drm_get_dev(pdev, pid, driver);
...@@ -273,6 +275,7 @@ int drm_init( struct drm_driver *driver ) ...@@ -273,6 +275,7 @@ int drm_init( struct drm_driver *driver )
} }
return 0; return 0;
} }
EXPORT_SYMBOL(drm_init); EXPORT_SYMBOL(drm_init);
/** /**
...@@ -282,35 +285,35 @@ EXPORT_SYMBOL(drm_init); ...@@ -282,35 +285,35 @@ EXPORT_SYMBOL(drm_init);
* *
* \sa drm_init * \sa drm_init
*/ */
static void drm_cleanup( drm_device_t *dev ) static void drm_cleanup(drm_device_t * dev)
{ {
DRM_DEBUG( "\n" ); DRM_DEBUG("\n");
if (!dev) { if (!dev) {
DRM_ERROR("cleanup called no dev\n"); DRM_ERROR("cleanup called no dev\n");
return; return;
} }
drm_takedown( dev ); drm_takedown(dev);
if (dev->maplist) { if (dev->maplist) {
drm_free(dev->maplist, sizeof(*dev->maplist), DRM_MEM_MAPS); drm_free(dev->maplist, sizeof(*dev->maplist), DRM_MEM_MAPS);
dev->maplist = NULL; dev->maplist = NULL;
} }
drm_ctxbitmap_cleanup( dev ); drm_ctxbitmap_cleanup(dev);
if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) && if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) &&
dev->agp && dev->agp->agp_mtrr >= 0) { dev->agp && dev->agp->agp_mtrr >= 0) {
int retval; int retval;
retval = mtrr_del( dev->agp->agp_mtrr, retval = mtrr_del(dev->agp->agp_mtrr,
dev->agp->agp_info.aper_base, dev->agp->agp_info.aper_base,
dev->agp->agp_info.aper_size*1024*1024 ); dev->agp->agp_info.aper_size * 1024 * 1024);
DRM_DEBUG( "mtrr_del=%d\n", retval ); DRM_DEBUG("mtrr_del=%d\n", retval);
} }
if (drm_core_has_AGP(dev) && dev->agp ) { if (drm_core_has_AGP(dev) && dev->agp) {
drm_free( dev->agp, sizeof(*dev->agp), DRM_MEM_AGPLISTS ); drm_free(dev->agp, sizeof(*dev->agp), DRM_MEM_AGPLISTS);
dev->agp = NULL; dev->agp = NULL;
} }
...@@ -318,17 +321,17 @@ static void drm_cleanup( drm_device_t *dev ) ...@@ -318,17 +321,17 @@ static void drm_cleanup( drm_device_t *dev )
dev->driver->postcleanup(dev); dev->driver->postcleanup(dev);
drm_put_head(&dev->primary); drm_put_head(&dev->primary);
if ( drm_put_dev(dev) ) if (drm_put_dev(dev))
DRM_ERROR( "Cannot unload module\n" ); DRM_ERROR("Cannot unload module\n");
} }
void drm_exit (struct drm_driver *driver) void drm_exit(struct drm_driver *driver)
{ {
int i; int i;
drm_device_t *dev = NULL; drm_device_t *dev = NULL;
drm_head_t *head; drm_head_t *head;
DRM_DEBUG( "\n" ); DRM_DEBUG("\n");
for (i = 0; i < drm_cards_limit; i++) { for (i = 0; i < drm_cards_limit; i++) {
head = drm_heads[i]; head = drm_heads[i];
...@@ -336,9 +339,9 @@ void drm_exit (struct drm_driver *driver) ...@@ -336,9 +339,9 @@ void drm_exit (struct drm_driver *driver)
continue; continue;
if (!head->dev) if (!head->dev)
continue; continue;
if (head->dev->driver!=driver) if (head->dev->driver != driver)
continue; continue;
dev=head->dev; dev = head->dev;
} }
if (dev) { if (dev) {
/* release the pci driver */ /* release the pci driver */
...@@ -346,8 +349,9 @@ void drm_exit (struct drm_driver *driver) ...@@ -346,8 +349,9 @@ void drm_exit (struct drm_driver *driver)
pci_dev_put(dev->pdev); pci_dev_put(dev->pdev);
drm_cleanup(dev); drm_cleanup(dev);
} }
DRM_INFO( "Module unloaded\n" ); DRM_INFO("Module unloaded\n");
} }
EXPORT_SYMBOL(drm_exit); EXPORT_SYMBOL(drm_exit);
/** File operations structure */ /** File operations structure */
...@@ -360,10 +364,12 @@ static int __init drm_core_init(void) ...@@ -360,10 +364,12 @@ static int __init drm_core_init(void)
{ {
int ret = -ENOMEM; int ret = -ENOMEM;
drm_cards_limit = (drm_cards_limit < DRM_MAX_MINOR + 1 ? drm_cards_limit : DRM_MAX_MINOR + 1); drm_cards_limit =
drm_heads = drm_calloc(drm_cards_limit, (drm_cards_limit <
sizeof(*drm_heads), DRM_MEM_STUB); DRM_MAX_MINOR + 1 ? drm_cards_limit : DRM_MAX_MINOR + 1);
if(!drm_heads) drm_heads =
drm_calloc(drm_cards_limit, sizeof(*drm_heads), DRM_MEM_STUB);
if (!drm_heads)
goto err_p1; goto err_p1;
if (register_chrdev(DRM_MAJOR, "drm", &drm_stub_fops)) if (register_chrdev(DRM_MAJOR, "drm", &drm_stub_fops))
...@@ -371,7 +377,7 @@ static int __init drm_core_init(void) ...@@ -371,7 +377,7 @@ static int __init drm_core_init(void)
drm_class = drm_sysfs_create(THIS_MODULE, "drm"); drm_class = drm_sysfs_create(THIS_MODULE, "drm");
if (IS_ERR(drm_class)) { if (IS_ERR(drm_class)) {
printk (KERN_ERR "DRM: Error creating drm class.\n"); printk(KERN_ERR "DRM: Error creating drm class.\n");
ret = PTR_ERR(drm_class); ret = PTR_ERR(drm_class);
goto err_p2; goto err_p2;
} }
...@@ -383,34 +389,30 @@ static int __init drm_core_init(void) ...@@ -383,34 +389,30 @@ static int __init drm_core_init(void)
goto err_p3; goto err_p3;
} }
DRM_INFO( "Initialized %s %d.%d.%d %s\n", DRM_INFO("Initialized %s %d.%d.%d %s\n",
CORE_NAME, CORE_MAJOR, CORE_MINOR, CORE_PATCHLEVEL, CORE_NAME, CORE_MAJOR, CORE_MINOR, CORE_PATCHLEVEL, CORE_DATE);
CORE_DATE);
return 0; return 0;
err_p3: err_p3:
drm_sysfs_destroy(drm_class); drm_sysfs_destroy(drm_class);
err_p2: err_p2:
unregister_chrdev(DRM_MAJOR, "drm"); unregister_chrdev(DRM_MAJOR, "drm");
drm_free(drm_heads, sizeof(*drm_heads) * drm_cards_limit, DRM_MEM_STUB); drm_free(drm_heads, sizeof(*drm_heads) * drm_cards_limit, DRM_MEM_STUB);
err_p1: err_p1:
return ret; return ret;
} }
static void __exit drm_core_exit (void) static void __exit drm_core_exit(void)
{ {
remove_proc_entry("dri", NULL); remove_proc_entry("dri", NULL);
drm_sysfs_destroy(drm_class); drm_sysfs_destroy(drm_class);
unregister_chrdev(DRM_MAJOR, "drm"); unregister_chrdev(DRM_MAJOR, "drm");
drm_free(drm_heads, sizeof(*drm_heads) * drm_free(drm_heads, sizeof(*drm_heads) * drm_cards_limit, DRM_MEM_STUB);
drm_cards_limit, DRM_MEM_STUB);
} }
module_init(drm_core_init);
module_init( drm_core_init ); module_exit(drm_core_exit);
module_exit( drm_core_exit );
/** /**
* Get version information * Get version information
...@@ -423,8 +425,8 @@ module_exit( drm_core_exit ); ...@@ -423,8 +425,8 @@ module_exit( drm_core_exit );
* *
* Fills in the version information in \p arg. * Fills in the version information in \p arg.
*/ */
static int drm_version( struct inode *inode, struct file *filp, static int drm_version(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg ) unsigned int cmd, unsigned long arg)
{ {
drm_file_t *priv = filp->private_data; drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->head->dev; drm_device_t *dev = priv->head->dev;
...@@ -432,20 +434,18 @@ static int drm_version( struct inode *inode, struct file *filp, ...@@ -432,20 +434,18 @@ static int drm_version( struct inode *inode, struct file *filp,
drm_version_t version; drm_version_t version;
int ret; int ret;
if ( copy_from_user( &version, argp, sizeof(version) ) ) if (copy_from_user(&version, argp, sizeof(version)))
return -EFAULT; return -EFAULT;
/* version is a required function to return the personality module version */ /* version is a required function to return the personality module version */
if ((ret = dev->driver->version(&version))) if ((ret = dev->driver->version(&version)))
return ret; return ret;
if ( copy_to_user( argp, &version, sizeof(version) ) ) if (copy_to_user(argp, &version, sizeof(version)))
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
/** /**
* Called whenever a process performs an ioctl on /dev/drm. * Called whenever a process performs an ioctl on /dev/drm.
* *
...@@ -458,8 +458,8 @@ static int drm_version( struct inode *inode, struct file *filp, ...@@ -458,8 +458,8 @@ static int drm_version( struct inode *inode, struct file *filp,
* Looks up the ioctl function in the ::ioctls table, checking for root * Looks up the ioctl function in the ::ioctls table, checking for root
* previleges if so required, and dispatches to the respective function. * previleges if so required, and dispatches to the respective function.
*/ */
int drm_ioctl( struct inode *inode, struct file *filp, int drm_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg ) unsigned int cmd, unsigned long arg)
{ {
drm_file_t *priv = filp->private_data; drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->head->dev; drm_device_t *dev = priv->head->dev;
...@@ -468,17 +468,19 @@ int drm_ioctl( struct inode *inode, struct file *filp, ...@@ -468,17 +468,19 @@ int drm_ioctl( struct inode *inode, struct file *filp,
unsigned int nr = DRM_IOCTL_NR(cmd); unsigned int nr = DRM_IOCTL_NR(cmd);
int retcode = -EINVAL; int retcode = -EINVAL;
atomic_inc( &dev->ioctl_count ); atomic_inc(&dev->ioctl_count);
atomic_inc( &dev->counts[_DRM_STAT_IOCTLS] ); atomic_inc(&dev->counts[_DRM_STAT_IOCTLS]);
++priv->ioctl_count; ++priv->ioctl_count;
DRM_DEBUG( "pid=%d, cmd=0x%02x, nr=0x%02x, dev 0x%lx, auth=%d\n", DRM_DEBUG("pid=%d, cmd=0x%02x, nr=0x%02x, dev 0x%lx, auth=%d\n",
current->pid, cmd, nr, (long)old_encode_dev(priv->head->device), current->pid, cmd, nr,
priv->authenticated ); (long)old_encode_dev(priv->head->device),
priv->authenticated);
if (nr < DRIVER_IOCTL_COUNT) if (nr < DRIVER_IOCTL_COUNT)
ioctl = &drm_ioctls[nr]; ioctl = &drm_ioctls[nr];
else if ((nr >= DRM_COMMAND_BASE) && (nr < DRM_COMMAND_BASE + dev->driver->num_ioctls)) else if ((nr >= DRM_COMMAND_BASE)
&& (nr < DRM_COMMAND_BASE + dev->driver->num_ioctls))
ioctl = &dev->driver->ioctls[nr - DRM_COMMAND_BASE]; ioctl = &dev->driver->ioctls[nr - DRM_COMMAND_BASE];
else else
goto err_i1; goto err_i1;
...@@ -488,20 +490,21 @@ int drm_ioctl( struct inode *inode, struct file *filp, ...@@ -488,20 +490,21 @@ int drm_ioctl( struct inode *inode, struct file *filp,
if ((nr == DRM_IOCTL_NR(DRM_IOCTL_DMA)) && dev->driver->dma_ioctl) if ((nr == DRM_IOCTL_NR(DRM_IOCTL_DMA)) && dev->driver->dma_ioctl)
func = dev->driver->dma_ioctl; func = dev->driver->dma_ioctl;
if ( !func ) { if (!func) {
DRM_DEBUG( "no function\n" ); DRM_DEBUG("no function\n");
retcode = -EINVAL; retcode = -EINVAL;
} else if ( ( ioctl->root_only && !capable( CAP_SYS_ADMIN ) )|| } else if ((ioctl->root_only && !capable(CAP_SYS_ADMIN)) ||
( ioctl->auth_needed && !priv->authenticated ) ) { (ioctl->auth_needed && !priv->authenticated)) {
retcode = -EACCES; retcode = -EACCES;
} else { } else {
retcode = func( inode, filp, cmd, arg ); retcode = func(inode, filp, cmd, arg);
} }
err_i1: err_i1:
atomic_dec( &dev->ioctl_count ); atomic_dec(&dev->ioctl_count);
if (retcode) DRM_DEBUG( "ret = %x\n", retcode); if (retcode)
DRM_DEBUG("ret = %x\n", retcode);
return retcode; return retcode;
} }
EXPORT_SYMBOL(drm_ioctl);
EXPORT_SYMBOL(drm_ioctl);
/** /**
* \file drm_fops.h * \file drm_fops.c
* File operations for DRM * File operations for DRM
* *
* \author Rickard E. (Rik) Faith <faith@valinux.com> * \author Rickard E. (Rik) Faith <faith@valinux.com>
...@@ -37,49 +37,48 @@ ...@@ -37,49 +37,48 @@
#include "drmP.h" #include "drmP.h"
#include <linux/poll.h> #include <linux/poll.h>
static int drm_open_helper(struct inode *inode, struct file *filp, drm_device_t *dev); static int drm_open_helper(struct inode *inode, struct file *filp,
drm_device_t * dev);
static int drm_setup( drm_device_t *dev ) static int drm_setup(drm_device_t * dev)
{ {
int i; int i;
int ret; int ret;
if (dev->driver->presetup) if (dev->driver->presetup) {
{ ret = dev->driver->presetup(dev);
ret=dev->driver->presetup(dev); if (ret != 0)
if (ret!=0)
return ret; return ret;
} }
atomic_set( &dev->ioctl_count, 0 ); atomic_set(&dev->ioctl_count, 0);
atomic_set( &dev->vma_count, 0 ); atomic_set(&dev->vma_count, 0);
dev->buf_use = 0; dev->buf_use = 0;
atomic_set( &dev->buf_alloc, 0 ); atomic_set(&dev->buf_alloc, 0);
if (drm_core_check_feature(dev, DRIVER_HAVE_DMA)) if (drm_core_check_feature(dev, DRIVER_HAVE_DMA)) {
{ i = drm_dma_setup(dev);
i = drm_dma_setup( dev ); if (i < 0)
if ( i < 0 )
return i; return i;
} }
for ( i = 0 ; i < DRM_ARRAY_SIZE(dev->counts) ; i++ ) for (i = 0; i < DRM_ARRAY_SIZE(dev->counts); i++)
atomic_set( &dev->counts[i], 0 ); atomic_set(&dev->counts[i], 0);
for ( i = 0 ; i < DRM_HASH_SIZE ; i++ ) { for (i = 0; i < DRM_HASH_SIZE; i++) {
dev->magiclist[i].head = NULL; dev->magiclist[i].head = NULL;
dev->magiclist[i].tail = NULL; dev->magiclist[i].tail = NULL;
} }
dev->ctxlist = drm_alloc(sizeof(*dev->ctxlist), dev->ctxlist = drm_alloc(sizeof(*dev->ctxlist), DRM_MEM_CTXLIST);
DRM_MEM_CTXLIST); if (dev->ctxlist == NULL)
if(dev->ctxlist == NULL) return -ENOMEM; return -ENOMEM;
memset(dev->ctxlist, 0, sizeof(*dev->ctxlist)); memset(dev->ctxlist, 0, sizeof(*dev->ctxlist));
INIT_LIST_HEAD(&dev->ctxlist->head); INIT_LIST_HEAD(&dev->ctxlist->head);
dev->vmalist = NULL; dev->vmalist = NULL;
dev->sigdata.lock = dev->lock.hw_lock = NULL; dev->sigdata.lock = dev->lock.hw_lock = NULL;
init_waitqueue_head( &dev->lock.lock_queue ); init_waitqueue_head(&dev->lock.lock_queue);
dev->queue_count = 0; dev->queue_count = 0;
dev->queue_reserved = 0; dev->queue_reserved = 0;
dev->queue_slots = 0; dev->queue_slots = 0;
...@@ -91,7 +90,7 @@ static int drm_setup( drm_device_t *dev ) ...@@ -91,7 +90,7 @@ static int drm_setup( drm_device_t *dev )
dev->last_context = 0; dev->last_context = 0;
dev->last_switch = 0; dev->last_switch = 0;
dev->last_checked = 0; dev->last_checked = 0;
init_waitqueue_head( &dev->context_wait ); init_waitqueue_head(&dev->context_wait);
dev->if_version = 0; dev->if_version = 0;
dev->ctx_start = 0; dev->ctx_start = 0;
...@@ -101,10 +100,10 @@ static int drm_setup( drm_device_t *dev ) ...@@ -101,10 +100,10 @@ static int drm_setup( drm_device_t *dev )
dev->buf_wp = dev->buf; dev->buf_wp = dev->buf;
dev->buf_end = dev->buf + DRM_BSZ; dev->buf_end = dev->buf + DRM_BSZ;
dev->buf_async = NULL; dev->buf_async = NULL;
init_waitqueue_head( &dev->buf_readers ); init_waitqueue_head(&dev->buf_readers);
init_waitqueue_head( &dev->buf_writers ); init_waitqueue_head(&dev->buf_writers);
DRM_DEBUG( "\n" ); DRM_DEBUG("\n");
/* /*
* The kernel's context could be created here, but is now created * The kernel's context could be created here, but is now created
...@@ -130,7 +129,7 @@ static int drm_setup( drm_device_t *dev ) ...@@ -130,7 +129,7 @@ static int drm_setup( drm_device_t *dev )
* increments the device open count. If the open count was previous at zero, * increments the device open count. If the open count was previous at zero,
* i.e., it's the first that the device is open, then calls setup(). * i.e., it's the first that the device is open, then calls setup().
*/ */
int drm_open( struct inode *inode, struct file *filp ) int drm_open(struct inode *inode, struct file *filp)
{ {
drm_device_t *dev = NULL; drm_device_t *dev = NULL;
int minor = iminor(inode); int minor = iminor(inode);
...@@ -145,19 +144,20 @@ int drm_open( struct inode *inode, struct file *filp ) ...@@ -145,19 +144,20 @@ int drm_open( struct inode *inode, struct file *filp )
if (!(dev = drm_heads[minor]->dev)) if (!(dev = drm_heads[minor]->dev))
return -ENODEV; return -ENODEV;
retcode = drm_open_helper( inode, filp, dev ); retcode = drm_open_helper(inode, filp, dev);
if ( !retcode ) { if (!retcode) {
atomic_inc( &dev->counts[_DRM_STAT_OPENS] ); atomic_inc(&dev->counts[_DRM_STAT_OPENS]);
spin_lock( &dev->count_lock ); spin_lock(&dev->count_lock);
if ( !dev->open_count++ ) { if (!dev->open_count++) {
spin_unlock( &dev->count_lock ); spin_unlock(&dev->count_lock);
return drm_setup( dev ); return drm_setup(dev);
} }
spin_unlock( &dev->count_lock ); spin_unlock(&dev->count_lock);
} }
return retcode; return retcode;
} }
EXPORT_SYMBOL(drm_open); EXPORT_SYMBOL(drm_open);
/** /**
...@@ -172,7 +172,7 @@ EXPORT_SYMBOL(drm_open); ...@@ -172,7 +172,7 @@ EXPORT_SYMBOL(drm_open);
* data from its list and free it. Decreases the open count and if it reaches * data from its list and free it. Decreases the open count and if it reaches
* zero calls takedown(). * zero calls takedown().
*/ */
int drm_release( struct inode *inode, struct file *filp ) int drm_release(struct inode *inode, struct file *filp)
{ {
drm_file_t *priv = filp->private_data; drm_file_t *priv = filp->private_data;
drm_device_t *dev; drm_device_t *dev;
...@@ -181,7 +181,7 @@ int drm_release( struct inode *inode, struct file *filp ) ...@@ -181,7 +181,7 @@ int drm_release( struct inode *inode, struct file *filp )
lock_kernel(); lock_kernel();
dev = priv->head->dev; dev = priv->head->dev;
DRM_DEBUG( "open_count = %d\n", dev->open_count ); DRM_DEBUG("open_count = %d\n", dev->open_count);
if (dev->driver->prerelease) if (dev->driver->prerelease)
dev->driver->prerelease(dev, filp); dev->driver->prerelease(dev, filp);
...@@ -190,140 +190,141 @@ int drm_release( struct inode *inode, struct file *filp ) ...@@ -190,140 +190,141 @@ int drm_release( struct inode *inode, struct file *filp )
* Begin inline drm_release * Begin inline drm_release
*/ */
DRM_DEBUG( "pid = %d, device = 0x%lx, open_count = %d\n", DRM_DEBUG("pid = %d, device = 0x%lx, open_count = %d\n",
current->pid, (long)old_encode_dev(priv->head->device), dev->open_count ); current->pid, (long)old_encode_dev(priv->head->device),
dev->open_count);
if ( priv->lock_count && dev->lock.hw_lock && if (priv->lock_count && dev->lock.hw_lock &&
_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) && _DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) &&
dev->lock.filp == filp ) { dev->lock.filp == filp) {
DRM_DEBUG( "File %p released, freeing lock for context %d\n", DRM_DEBUG("File %p released, freeing lock for context %d\n",
filp, filp, _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock));
_DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock) );
if (dev->driver->release) if (dev->driver->release)
dev->driver->release(dev, filp); dev->driver->release(dev, filp);
drm_lock_free( dev, &dev->lock.hw_lock->lock, drm_lock_free(dev, &dev->lock.hw_lock->lock,
_DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock) ); _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock));
/* FIXME: may require heavy-handed reset of /* FIXME: may require heavy-handed reset of
hardware at this point, possibly hardware at this point, possibly
processed via a callback to the X processed via a callback to the X
server. */ server. */
} } else if (dev->driver->release && priv->lock_count
else if ( dev->driver->release && priv->lock_count && dev->lock.hw_lock ) { && dev->lock.hw_lock) {
/* The lock is required to reclaim buffers */ /* The lock is required to reclaim buffers */
DECLARE_WAITQUEUE( entry, current ); DECLARE_WAITQUEUE(entry, current);
add_wait_queue( &dev->lock.lock_queue, &entry ); add_wait_queue(&dev->lock.lock_queue, &entry);
for (;;) { for (;;) {
__set_current_state(TASK_INTERRUPTIBLE); __set_current_state(TASK_INTERRUPTIBLE);
if ( !dev->lock.hw_lock ) { if (!dev->lock.hw_lock) {
/* Device has been unregistered */ /* Device has been unregistered */
retcode = -EINTR; retcode = -EINTR;
break; break;
} }
if ( drm_lock_take( &dev->lock.hw_lock->lock, if (drm_lock_take(&dev->lock.hw_lock->lock,
DRM_KERNEL_CONTEXT ) ) { DRM_KERNEL_CONTEXT)) {
dev->lock.filp = filp; dev->lock.filp = filp;
dev->lock.lock_time = jiffies; dev->lock.lock_time = jiffies;
atomic_inc( &dev->counts[_DRM_STAT_LOCKS] ); atomic_inc(&dev->counts[_DRM_STAT_LOCKS]);
break; /* Got lock */ break; /* Got lock */
} }
/* Contention */ /* Contention */
schedule(); schedule();
if ( signal_pending( current ) ) { if (signal_pending(current)) {
retcode = -ERESTARTSYS; retcode = -ERESTARTSYS;
break; break;
} }
} }
__set_current_state(TASK_RUNNING); __set_current_state(TASK_RUNNING);
remove_wait_queue( &dev->lock.lock_queue, &entry ); remove_wait_queue(&dev->lock.lock_queue, &entry);
if( !retcode ) { if (!retcode) {
if (dev->driver->release) if (dev->driver->release)
dev->driver->release(dev, filp); dev->driver->release(dev, filp);
drm_lock_free( dev, &dev->lock.hw_lock->lock, drm_lock_free(dev, &dev->lock.hw_lock->lock,
DRM_KERNEL_CONTEXT ); DRM_KERNEL_CONTEXT);
} }
} }
if (drm_core_check_feature(dev, DRIVER_HAVE_DMA) && !dev->driver->release) if (drm_core_check_feature(dev, DRIVER_HAVE_DMA)
{ && !dev->driver->release) {
dev->driver->reclaim_buffers(dev, filp); dev->driver->reclaim_buffers(dev, filp);
} }
drm_fasync( -1, filp, 0 ); drm_fasync(-1, filp, 0);
down( &dev->ctxlist_sem ); down(&dev->ctxlist_sem);
if ( dev->ctxlist && (!list_empty(&dev->ctxlist->head))) { if (dev->ctxlist && (!list_empty(&dev->ctxlist->head))) {
drm_ctx_list_t *pos, *n; drm_ctx_list_t *pos, *n;
list_for_each_entry_safe( pos, n, &dev->ctxlist->head, head ) { list_for_each_entry_safe(pos, n, &dev->ctxlist->head, head) {
if ( pos->tag == priv && if (pos->tag == priv &&
pos->handle != DRM_KERNEL_CONTEXT ) { pos->handle != DRM_KERNEL_CONTEXT) {
if (dev->driver->context_dtor) if (dev->driver->context_dtor)
dev->driver->context_dtor(dev, pos->handle); dev->driver->context_dtor(dev,
pos->handle);
drm_ctxbitmap_free( dev, pos->handle ); drm_ctxbitmap_free(dev, pos->handle);
list_del( &pos->head ); list_del(&pos->head);
drm_free( pos, sizeof(*pos), DRM_MEM_CTXLIST ); drm_free(pos, sizeof(*pos), DRM_MEM_CTXLIST);
--dev->ctx_count; --dev->ctx_count;
} }
} }
} }
up( &dev->ctxlist_sem ); up(&dev->ctxlist_sem);
down( &dev->struct_sem ); down(&dev->struct_sem);
if ( priv->remove_auth_on_close == 1 ) { if (priv->remove_auth_on_close == 1) {
drm_file_t *temp = dev->file_first; drm_file_t *temp = dev->file_first;
while ( temp ) { while (temp) {
temp->authenticated = 0; temp->authenticated = 0;
temp = temp->next; temp = temp->next;
} }
} }
if ( priv->prev ) { if (priv->prev) {
priv->prev->next = priv->next; priv->prev->next = priv->next;
} else { } else {
dev->file_first = priv->next; dev->file_first = priv->next;
} }
if ( priv->next ) { if (priv->next) {
priv->next->prev = priv->prev; priv->next->prev = priv->prev;
} else { } else {
dev->file_last = priv->prev; dev->file_last = priv->prev;
} }
up( &dev->struct_sem ); up(&dev->struct_sem);
if (dev->driver->free_filp_priv) if (dev->driver->free_filp_priv)
dev->driver->free_filp_priv(dev, priv); dev->driver->free_filp_priv(dev, priv);
drm_free( priv, sizeof(*priv), DRM_MEM_FILES ); drm_free(priv, sizeof(*priv), DRM_MEM_FILES);
/* ======================================================== /* ========================================================
* End inline drm_release * End inline drm_release
*/ */
atomic_inc( &dev->counts[_DRM_STAT_CLOSES] ); atomic_inc(&dev->counts[_DRM_STAT_CLOSES]);
spin_lock( &dev->count_lock ); spin_lock(&dev->count_lock);
if ( !--dev->open_count ) { if (!--dev->open_count) {
if ( atomic_read( &dev->ioctl_count ) || dev->blocked ) { if (atomic_read(&dev->ioctl_count) || dev->blocked) {
DRM_ERROR( "Device busy: %d %d\n", DRM_ERROR("Device busy: %d %d\n",
atomic_read( &dev->ioctl_count ), atomic_read(&dev->ioctl_count), dev->blocked);
dev->blocked ); spin_unlock(&dev->count_lock);
spin_unlock( &dev->count_lock );
unlock_kernel(); unlock_kernel();
return -EBUSY; return -EBUSY;
} }
spin_unlock( &dev->count_lock ); spin_unlock(&dev->count_lock);
unlock_kernel(); unlock_kernel();
return drm_takedown( dev ); return drm_takedown(dev);
} }
spin_unlock( &dev->count_lock ); spin_unlock(&dev->count_lock);
unlock_kernel(); unlock_kernel();
return retcode; return retcode;
} }
EXPORT_SYMBOL(drm_release); EXPORT_SYMBOL(drm_release);
/** /**
...@@ -337,19 +338,23 @@ EXPORT_SYMBOL(drm_release); ...@@ -337,19 +338,23 @@ EXPORT_SYMBOL(drm_release);
* Creates and initializes a drm_file structure for the file private data in \p * Creates and initializes a drm_file structure for the file private data in \p
* filp and add it into the double linked list in \p dev. * filp and add it into the double linked list in \p dev.
*/ */
static int drm_open_helper(struct inode *inode, struct file *filp, drm_device_t *dev) static int drm_open_helper(struct inode *inode, struct file *filp,
drm_device_t * dev)
{ {
int minor = iminor(inode); int minor = iminor(inode);
drm_file_t *priv; drm_file_t *priv;
int ret; int ret;
if (filp->f_flags & O_EXCL) return -EBUSY; /* No exclusive opens */ if (filp->f_flags & O_EXCL)
if (!drm_cpu_valid()) return -EINVAL; return -EBUSY; /* No exclusive opens */
if (!drm_cpu_valid())
return -EINVAL;
DRM_DEBUG("pid = %d, minor = %d\n", current->pid, minor); DRM_DEBUG("pid = %d, minor = %d\n", current->pid, minor);
priv = drm_alloc(sizeof(*priv), DRM_MEM_FILES); priv = drm_alloc(sizeof(*priv), DRM_MEM_FILES);
if(!priv) return -ENOMEM; if (!priv)
return -ENOMEM;
memset(priv, 0, sizeof(*priv)); memset(priv, 0, sizeof(*priv));
filp->private_data = priv; filp->private_data = priv;
...@@ -362,7 +367,7 @@ static int drm_open_helper(struct inode *inode, struct file *filp, drm_device_t ...@@ -362,7 +367,7 @@ static int drm_open_helper(struct inode *inode, struct file *filp, drm_device_t
priv->lock_count = 0; priv->lock_count = 0;
if (dev->driver->open_helper) { if (dev->driver->open_helper) {
ret=dev->driver->open_helper(dev, priv); ret = dev->driver->open_helper(dev, priv);
if (ret < 0) if (ret < 0)
goto out_free; goto out_free;
} }
...@@ -394,15 +399,16 @@ static int drm_open_helper(struct inode *inode, struct file *filp, drm_device_t ...@@ -394,15 +399,16 @@ static int drm_open_helper(struct inode *inode, struct file *filp, drm_device_t
} }
if (!dev->hose) { if (!dev->hose) {
struct pci_bus *b = pci_bus_b(pci_root_buses.next); struct pci_bus *b = pci_bus_b(pci_root_buses.next);
if (b) dev->hose = b->sysdata; if (b)
dev->hose = b->sysdata;
} }
} }
#endif #endif
return 0; return 0;
out_free: out_free:
drm_free(priv, sizeof(*priv), DRM_MEM_FILES); drm_free(priv, sizeof(*priv), DRM_MEM_FILES);
filp->private_data=NULL; filp->private_data = NULL;
return ret; return ret;
} }
...@@ -413,9 +419,11 @@ int drm_flush(struct file *filp) ...@@ -413,9 +419,11 @@ int drm_flush(struct file *filp)
drm_device_t *dev = priv->head->dev; drm_device_t *dev = priv->head->dev;
DRM_DEBUG("pid = %d, device = 0x%lx, open_count = %d\n", DRM_DEBUG("pid = %d, device = 0x%lx, open_count = %d\n",
current->pid, (long)old_encode_dev(priv->head->device), dev->open_count); current->pid, (long)old_encode_dev(priv->head->device),
dev->open_count);
return 0; return 0;
} }
EXPORT_SYMBOL(drm_flush); EXPORT_SYMBOL(drm_flush);
/** No-op. */ /** No-op. */
...@@ -425,11 +433,14 @@ int drm_fasync(int fd, struct file *filp, int on) ...@@ -425,11 +433,14 @@ int drm_fasync(int fd, struct file *filp, int on)
drm_device_t *dev = priv->head->dev; drm_device_t *dev = priv->head->dev;
int retcode; int retcode;
DRM_DEBUG("fd = %d, device = 0x%lx\n", fd, (long)old_encode_dev(priv->head->device)); DRM_DEBUG("fd = %d, device = 0x%lx\n", fd,
(long)old_encode_dev(priv->head->device));
retcode = fasync_helper(fd, filp, on, &dev->buf_async); retcode = fasync_helper(fd, filp, on, &dev->buf_async);
if (retcode < 0) return retcode; if (retcode < 0)
return retcode;
return 0; return 0;
} }
EXPORT_SYMBOL(drm_fasync); EXPORT_SYMBOL(drm_fasync);
/** No-op. */ /** No-op. */
...@@ -437,5 +448,5 @@ unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait) ...@@ -437,5 +448,5 @@ unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait)
{ {
return 0; return 0;
} }
EXPORT_SYMBOL(drm_poll);
EXPORT_SYMBOL(drm_poll);
/** /**
* \file drm_init.h * \file drm_init.c
* Setup/Cleanup for DRM * Setup/Cleanup for DRM
* *
* \author Rickard E. (Rik) Faith <faith@valinux.com> * \author Rickard E. (Rik) Faith <faith@valinux.com>
...@@ -43,7 +43,8 @@ ...@@ -43,7 +43,8 @@
int drm_cpu_valid(void) int drm_cpu_valid(void)
{ {
#if defined(__i386__) #if defined(__i386__)
if (boot_cpu_data.x86 == 3) return 0; /* No cmpxchg on a 386 */ if (boot_cpu_data.x86 == 3)
return 0; /* No cmpxchg on a 386 */
#endif #endif
#if defined(__sparc__) && !defined(__sparc_v9__) #if defined(__sparc__) && !defined(__sparc_v9__)
return 0; /* No cmpxchg before v9 sparc. */ return 0; /* No cmpxchg before v9 sparc. */
......
...@@ -70,7 +70,7 @@ ...@@ -70,7 +70,7 @@
typedef struct drm_version_32 { typedef struct drm_version_32 {
int version_major; /**< Major version */ int version_major; /**< Major version */
int version_minor; /**< Minor version */ int version_minor; /**< Minor version */
int version_patchlevel;/**< Patch level */ int version_patchlevel; /**< Patch level */
u32 name_len; /**< Length of name buffer */ u32 name_len; /**< Length of name buffer */
u32 name; /**< Name of driver */ u32 name; /**< Name of driver */
u32 date_len; /**< Length of date buffer */ u32 date_len; /**< Length of date buffer */
...@@ -86,7 +86,7 @@ static int compat_drm_version(struct file *file, unsigned int cmd, ...@@ -86,7 +86,7 @@ static int compat_drm_version(struct file *file, unsigned int cmd,
drm_version_t __user *version; drm_version_t __user *version;
int err; int err;
if (copy_from_user(&v32, (void __user *) arg, sizeof(v32))) if (copy_from_user(&v32, (void __user *)arg, sizeof(v32)))
return -EFAULT; return -EFAULT;
version = compat_alloc_user_space(sizeof(*version)); version = compat_alloc_user_space(sizeof(*version));
...@@ -104,7 +104,7 @@ static int compat_drm_version(struct file *file, unsigned int cmd, ...@@ -104,7 +104,7 @@ static int compat_drm_version(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
err = drm_ioctl(file->f_dentry->d_inode, file, err = drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_VERSION, (unsigned long) version); DRM_IOCTL_VERSION, (unsigned long)version);
if (err) if (err)
return err; return err;
...@@ -116,7 +116,7 @@ static int compat_drm_version(struct file *file, unsigned int cmd, ...@@ -116,7 +116,7 @@ static int compat_drm_version(struct file *file, unsigned int cmd,
|| __get_user(v32.desc_len, &version->desc_len)) || __get_user(v32.desc_len, &version->desc_len))
return -EFAULT; return -EFAULT;
if (copy_to_user((void __user *) arg, &v32, sizeof(v32))) if (copy_to_user((void __user *)arg, &v32, sizeof(v32)))
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
...@@ -133,25 +133,25 @@ static int compat_drm_getunique(struct file *file, unsigned int cmd, ...@@ -133,25 +133,25 @@ static int compat_drm_getunique(struct file *file, unsigned int cmd,
drm_unique_t __user *u; drm_unique_t __user *u;
int err; int err;
if (copy_from_user(&uq32, (void __user *) arg, sizeof(uq32))) if (copy_from_user(&uq32, (void __user *)arg, sizeof(uq32)))
return -EFAULT; return -EFAULT;
u = compat_alloc_user_space(sizeof(*u)); u = compat_alloc_user_space(sizeof(*u));
if (!access_ok(VERIFY_WRITE, u, sizeof(*u))) if (!access_ok(VERIFY_WRITE, u, sizeof(*u)))
return -EFAULT; return -EFAULT;
if (__put_user(uq32.unique_len, &u->unique_len) if (__put_user(uq32.unique_len, &u->unique_len)
|| __put_user((void __user *)(unsigned long) uq32.unique, || __put_user((void __user *)(unsigned long)uq32.unique,
&u->unique)) &u->unique))
return -EFAULT; return -EFAULT;
err = drm_ioctl(file->f_dentry->d_inode, file, err = drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_GET_UNIQUE, (unsigned long) u); DRM_IOCTL_GET_UNIQUE, (unsigned long)u);
if (err) if (err)
return err; return err;
if (__get_user(uq32.unique_len, &u->unique_len)) if (__get_user(uq32.unique_len, &u->unique_len))
return -EFAULT; return -EFAULT;
if (copy_to_user((void __user *) arg, &uq32, sizeof(uq32))) if (copy_to_user((void __user *)arg, &uq32, sizeof(uq32)))
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
...@@ -162,19 +162,19 @@ static int compat_drm_setunique(struct file *file, unsigned int cmd, ...@@ -162,19 +162,19 @@ static int compat_drm_setunique(struct file *file, unsigned int cmd,
drm_unique32_t uq32; drm_unique32_t uq32;
drm_unique_t __user *u; drm_unique_t __user *u;
if (copy_from_user(&uq32, (void __user *) arg, sizeof(uq32))) if (copy_from_user(&uq32, (void __user *)arg, sizeof(uq32)))
return -EFAULT; return -EFAULT;
u = compat_alloc_user_space(sizeof(*u)); u = compat_alloc_user_space(sizeof(*u));
if (!access_ok(VERIFY_WRITE, u, sizeof(*u))) if (!access_ok(VERIFY_WRITE, u, sizeof(*u)))
return -EFAULT; return -EFAULT;
if (__put_user(uq32.unique_len, &u->unique_len) if (__put_user(uq32.unique_len, &u->unique_len)
|| __put_user((void __user *)(unsigned long) uq32.unique, || __put_user((void __user *)(unsigned long)uq32.unique,
&u->unique)) &u->unique))
return -EFAULT; return -EFAULT;
return drm_ioctl(file->f_dentry->d_inode, file, return drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_SET_UNIQUE, (unsigned long) u); DRM_IOCTL_SET_UNIQUE, (unsigned long)u);
} }
typedef struct drm_map32 { typedef struct drm_map32 {
...@@ -205,7 +205,7 @@ static int compat_drm_getmap(struct file *file, unsigned int cmd, ...@@ -205,7 +205,7 @@ static int compat_drm_getmap(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
err = drm_ioctl(file->f_dentry->d_inode, file, err = drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_GET_MAP, (unsigned long) map); DRM_IOCTL_GET_MAP, (unsigned long)map);
if (err) if (err)
return err; return err;
...@@ -217,7 +217,7 @@ static int compat_drm_getmap(struct file *file, unsigned int cmd, ...@@ -217,7 +217,7 @@ static int compat_drm_getmap(struct file *file, unsigned int cmd,
|| __get_user(m32.mtrr, &map->mtrr)) || __get_user(m32.mtrr, &map->mtrr))
return -EFAULT; return -EFAULT;
m32.handle = (unsigned long) handle; m32.handle = (unsigned long)handle;
if (copy_to_user(argp, &m32, sizeof(m32))) if (copy_to_user(argp, &m32, sizeof(m32)))
return -EFAULT; return -EFAULT;
return 0; return 0;
...@@ -246,7 +246,7 @@ static int compat_drm_addmap(struct file *file, unsigned int cmd, ...@@ -246,7 +246,7 @@ static int compat_drm_addmap(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
err = drm_ioctl(file->f_dentry->d_inode, file, err = drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_ADD_MAP, (unsigned long) map); DRM_IOCTL_ADD_MAP, (unsigned long)map);
if (err) if (err)
return err; return err;
...@@ -255,8 +255,8 @@ static int compat_drm_addmap(struct file *file, unsigned int cmd, ...@@ -255,8 +255,8 @@ static int compat_drm_addmap(struct file *file, unsigned int cmd,
|| __get_user(handle, &map->handle)) || __get_user(handle, &map->handle))
return -EFAULT; return -EFAULT;
m32.handle = (unsigned long) handle; m32.handle = (unsigned long)handle;
if (m32.handle != (unsigned long) handle && printk_ratelimit()) if (m32.handle != (unsigned long)handle && printk_ratelimit())
printk(KERN_ERR "compat_drm_addmap truncated handle" printk(KERN_ERR "compat_drm_addmap truncated handle"
" %p for type %d offset %x\n", " %p for type %d offset %x\n",
handle, m32.type, m32.offset); handle, m32.type, m32.offset);
...@@ -280,11 +280,11 @@ static int compat_drm_rmmap(struct file *file, unsigned int cmd, ...@@ -280,11 +280,11 @@ static int compat_drm_rmmap(struct file *file, unsigned int cmd,
map = compat_alloc_user_space(sizeof(*map)); map = compat_alloc_user_space(sizeof(*map));
if (!access_ok(VERIFY_WRITE, map, sizeof(*map))) if (!access_ok(VERIFY_WRITE, map, sizeof(*map)))
return -EFAULT; return -EFAULT;
if (__put_user((void *)(unsigned long) handle, &map->handle)) if (__put_user((void *)(unsigned long)handle, &map->handle))
return -EFAULT; return -EFAULT;
return drm_ioctl(file->f_dentry->d_inode, file, return drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_RM_MAP, (unsigned long) map); DRM_IOCTL_RM_MAP, (unsigned long)map);
} }
typedef struct drm_client32 { typedef struct drm_client32 {
...@@ -314,7 +314,7 @@ static int compat_drm_getclient(struct file *file, unsigned int cmd, ...@@ -314,7 +314,7 @@ static int compat_drm_getclient(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
err = drm_ioctl(file->f_dentry->d_inode, file, err = drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_GET_CLIENT, (unsigned long) client); DRM_IOCTL_GET_CLIENT, (unsigned long)client);
if (err) if (err)
return err; return err;
...@@ -351,7 +351,7 @@ static int compat_drm_getstats(struct file *file, unsigned int cmd, ...@@ -351,7 +351,7 @@ static int compat_drm_getstats(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
err = drm_ioctl(file->f_dentry->d_inode, file, err = drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_GET_STATS, (unsigned long) stats); DRM_IOCTL_GET_STATS, (unsigned long)stats);
if (err) if (err)
return err; return err;
...@@ -395,7 +395,7 @@ static int compat_drm_addbufs(struct file *file, unsigned int cmd, ...@@ -395,7 +395,7 @@ static int compat_drm_addbufs(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
err = drm_ioctl(file->f_dentry->d_inode, file, err = drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_ADD_BUFS, (unsigned long) buf); DRM_IOCTL_ADD_BUFS, (unsigned long)buf);
if (err) if (err)
return err; return err;
...@@ -427,7 +427,7 @@ static int compat_drm_markbufs(struct file *file, unsigned int cmd, ...@@ -427,7 +427,7 @@ static int compat_drm_markbufs(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
return drm_ioctl(file->f_dentry->d_inode, file, return drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_MARK_BUFS, (unsigned long) buf); DRM_IOCTL_MARK_BUFS, (unsigned long)buf);
} }
typedef struct drm_buf_info32 { typedef struct drm_buf_info32 {
...@@ -451,7 +451,7 @@ static int compat_drm_infobufs(struct file *file, unsigned int cmd, ...@@ -451,7 +451,7 @@ static int compat_drm_infobufs(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
count = req32.count; count = req32.count;
to = (drm_buf_desc32_t __user *)(unsigned long) req32.list; to = (drm_buf_desc32_t __user *) (unsigned long)req32.list;
if (count < 0) if (count < 0)
count = 0; count = 0;
if (count > 0 if (count > 0
...@@ -469,7 +469,7 @@ static int compat_drm_infobufs(struct file *file, unsigned int cmd, ...@@ -469,7 +469,7 @@ static int compat_drm_infobufs(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
err = drm_ioctl(file->f_dentry->d_inode, file, err = drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_INFO_BUFS, (unsigned long) request); DRM_IOCTL_INFO_BUFS, (unsigned long)request);
if (err) if (err)
return err; return err;
...@@ -531,7 +531,7 @@ static int compat_drm_mapbufs(struct file *file, unsigned int cmd, ...@@ -531,7 +531,7 @@ static int compat_drm_mapbufs(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
err = drm_ioctl(file->f_dentry->d_inode, file, err = drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_MAP_BUFS, (unsigned long) request); DRM_IOCTL_MAP_BUFS, (unsigned long)request);
if (err) if (err)
return err; return err;
...@@ -542,13 +542,13 @@ static int compat_drm_mapbufs(struct file *file, unsigned int cmd, ...@@ -542,13 +542,13 @@ static int compat_drm_mapbufs(struct file *file, unsigned int cmd,
if (__copy_in_user(&list32[i], &list[i], if (__copy_in_user(&list32[i], &list[i],
offsetof(drm_buf_pub_t, address)) offsetof(drm_buf_pub_t, address))
|| __get_user(addr, &list[i].address) || __get_user(addr, &list[i].address)
|| __put_user((unsigned long) addr, || __put_user((unsigned long)addr,
&list32[i].address)) &list32[i].address))
return -EFAULT; return -EFAULT;
if (__put_user(actual, &argp->count) if (__put_user(actual, &argp->count)
|| __get_user(addr, &request->virtual) || __get_user(addr, &request->virtual)
|| __put_user((unsigned long) addr, &argp->virtual)) || __put_user((unsigned long)addr, &argp->virtual))
return -EFAULT; return -EFAULT;
return 0; return 0;
...@@ -573,12 +573,12 @@ static int compat_drm_freebufs(struct file *file, unsigned int cmd, ...@@ -573,12 +573,12 @@ static int compat_drm_freebufs(struct file *file, unsigned int cmd,
if (!access_ok(VERIFY_WRITE, request, sizeof(*request))) if (!access_ok(VERIFY_WRITE, request, sizeof(*request)))
return -EFAULT; return -EFAULT;
if (__put_user(req32.count, &request->count) if (__put_user(req32.count, &request->count)
|| __put_user((int __user *)(unsigned long) req32.list, || __put_user((int __user *)(unsigned long)req32.list,
&request->list)) &request->list))
return -EFAULT; return -EFAULT;
return drm_ioctl(file->f_dentry->d_inode, file, return drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_FREE_BUFS, (unsigned long) request); DRM_IOCTL_FREE_BUFS, (unsigned long)request);
} }
typedef struct drm_ctx_priv_map32 { typedef struct drm_ctx_priv_map32 {
...@@ -600,12 +600,12 @@ static int compat_drm_setsareactx(struct file *file, unsigned int cmd, ...@@ -600,12 +600,12 @@ static int compat_drm_setsareactx(struct file *file, unsigned int cmd,
if (!access_ok(VERIFY_WRITE, request, sizeof(*request))) if (!access_ok(VERIFY_WRITE, request, sizeof(*request)))
return -EFAULT; return -EFAULT;
if (__put_user(req32.ctx_id, &request->ctx_id) if (__put_user(req32.ctx_id, &request->ctx_id)
|| __put_user((void *)(unsigned long) req32.handle, || __put_user((void *)(unsigned long)req32.handle,
&request->handle)) &request->handle))
return -EFAULT; return -EFAULT;
return drm_ioctl(file->f_dentry->d_inode, file, return drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_SET_SAREA_CTX, (unsigned long) request); DRM_IOCTL_SET_SAREA_CTX, (unsigned long)request);
} }
static int compat_drm_getsareactx(struct file *file, unsigned int cmd, static int compat_drm_getsareactx(struct file *file, unsigned int cmd,
...@@ -628,12 +628,12 @@ static int compat_drm_getsareactx(struct file *file, unsigned int cmd, ...@@ -628,12 +628,12 @@ static int compat_drm_getsareactx(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
err = drm_ioctl(file->f_dentry->d_inode, file, err = drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_GET_SAREA_CTX, (unsigned long) request); DRM_IOCTL_GET_SAREA_CTX, (unsigned long)request);
if (err) if (err)
return err; return err;
if (__get_user(handle, &request->handle) if (__get_user(handle, &request->handle)
|| __put_user((unsigned long) handle, &argp->handle)) || __put_user((unsigned long)handle, &argp->handle))
return -EFAULT; return -EFAULT;
return 0; return 0;
...@@ -659,12 +659,12 @@ static int compat_drm_resctx(struct file *file, unsigned int cmd, ...@@ -659,12 +659,12 @@ static int compat_drm_resctx(struct file *file, unsigned int cmd,
if (!access_ok(VERIFY_WRITE, res, sizeof(*res))) if (!access_ok(VERIFY_WRITE, res, sizeof(*res)))
return -EFAULT; return -EFAULT;
if (__put_user(res32.count, &res->count) if (__put_user(res32.count, &res->count)
|| __put_user((drm_ctx_t __user *)(unsigned long) res32.contexts, || __put_user((drm_ctx_t __user *) (unsigned long)res32.contexts,
&res->contexts)) &res->contexts))
return -EFAULT; return -EFAULT;
err = drm_ioctl(file->f_dentry->d_inode, file, err = drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_RES_CTX, (unsigned long) res); DRM_IOCTL_RES_CTX, (unsigned long)res);
if (err) if (err)
return err; return err;
...@@ -692,7 +692,7 @@ static int compat_drm_dma(struct file *file, unsigned int cmd, ...@@ -692,7 +692,7 @@ static int compat_drm_dma(struct file *file, unsigned int cmd,
unsigned long arg) unsigned long arg)
{ {
drm_dma32_t d32; drm_dma32_t d32;
drm_dma32_t __user *argp = (void __user *) arg; drm_dma32_t __user *argp = (void __user *)arg;
drm_dma_t __user *d; drm_dma_t __user *d;
int err; int err;
...@@ -705,20 +705,20 @@ static int compat_drm_dma(struct file *file, unsigned int cmd, ...@@ -705,20 +705,20 @@ static int compat_drm_dma(struct file *file, unsigned int cmd,
if (__put_user(d32.context, &d->context) if (__put_user(d32.context, &d->context)
|| __put_user(d32.send_count, &d->send_count) || __put_user(d32.send_count, &d->send_count)
|| __put_user((int __user *)(unsigned long) d32.send_indices, || __put_user((int __user *)(unsigned long)d32.send_indices,
&d->send_indices) &d->send_indices)
|| __put_user((int __user *)(unsigned long) d32.send_sizes, || __put_user((int __user *)(unsigned long)d32.send_sizes,
&d->send_sizes) &d->send_sizes)
|| __put_user(d32.flags, &d->flags) || __put_user(d32.flags, &d->flags)
|| __put_user(d32.request_count, &d->request_count) || __put_user(d32.request_count, &d->request_count)
|| __put_user((int __user *)(unsigned long) d32.request_indices, || __put_user((int __user *)(unsigned long)d32.request_indices,
&d->request_indices) &d->request_indices)
|| __put_user((int __user *)(unsigned long) d32.request_sizes, || __put_user((int __user *)(unsigned long)d32.request_sizes,
&d->request_sizes)) &d->request_sizes))
return -EFAULT; return -EFAULT;
err = drm_ioctl(file->f_dentry->d_inode, file, err = drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_DMA, (unsigned long) d); DRM_IOCTL_DMA, (unsigned long)d);
if (err) if (err)
return err; return err;
...@@ -751,7 +751,7 @@ static int compat_drm_agp_enable(struct file *file, unsigned int cmd, ...@@ -751,7 +751,7 @@ static int compat_drm_agp_enable(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
return drm_ioctl(file->f_dentry->d_inode, file, return drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_AGP_ENABLE, (unsigned long) mode); DRM_IOCTL_AGP_ENABLE, (unsigned long)mode);
} }
typedef struct drm_agp_info32 { typedef struct drm_agp_info32 {
...@@ -781,7 +781,7 @@ static int compat_drm_agp_info(struct file *file, unsigned int cmd, ...@@ -781,7 +781,7 @@ static int compat_drm_agp_info(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
err = drm_ioctl(file->f_dentry->d_inode, file, err = drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_AGP_INFO, (unsigned long) info); DRM_IOCTL_AGP_INFO, (unsigned long)info);
if (err) if (err)
return err; return err;
...@@ -827,7 +827,7 @@ static int compat_drm_agp_alloc(struct file *file, unsigned int cmd, ...@@ -827,7 +827,7 @@ static int compat_drm_agp_alloc(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
err = drm_ioctl(file->f_dentry->d_inode, file, err = drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_AGP_ALLOC, (unsigned long) request); DRM_IOCTL_AGP_ALLOC, (unsigned long)request);
if (err) if (err)
return err; return err;
...@@ -835,7 +835,7 @@ static int compat_drm_agp_alloc(struct file *file, unsigned int cmd, ...@@ -835,7 +835,7 @@ static int compat_drm_agp_alloc(struct file *file, unsigned int cmd,
|| __get_user(req32.physical, &request->physical) || __get_user(req32.physical, &request->physical)
|| copy_to_user(argp, &req32, sizeof(req32))) { || copy_to_user(argp, &req32, sizeof(req32))) {
drm_ioctl(file->f_dentry->d_inode, file, drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_AGP_FREE, (unsigned long) request); DRM_IOCTL_AGP_FREE, (unsigned long)request);
return -EFAULT; return -EFAULT;
} }
...@@ -856,7 +856,7 @@ static int compat_drm_agp_free(struct file *file, unsigned int cmd, ...@@ -856,7 +856,7 @@ static int compat_drm_agp_free(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
return drm_ioctl(file->f_dentry->d_inode, file, return drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_AGP_FREE, (unsigned long) request); DRM_IOCTL_AGP_FREE, (unsigned long)request);
} }
typedef struct drm_agp_binding32 { typedef struct drm_agp_binding32 {
...@@ -881,7 +881,7 @@ static int compat_drm_agp_bind(struct file *file, unsigned int cmd, ...@@ -881,7 +881,7 @@ static int compat_drm_agp_bind(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
return drm_ioctl(file->f_dentry->d_inode, file, return drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_AGP_BIND, (unsigned long) request); DRM_IOCTL_AGP_BIND, (unsigned long)request);
} }
static int compat_drm_agp_unbind(struct file *file, unsigned int cmd, static int compat_drm_agp_unbind(struct file *file, unsigned int cmd,
...@@ -898,7 +898,7 @@ static int compat_drm_agp_unbind(struct file *file, unsigned int cmd, ...@@ -898,7 +898,7 @@ static int compat_drm_agp_unbind(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
return drm_ioctl(file->f_dentry->d_inode, file, return drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_AGP_UNBIND, (unsigned long) request); DRM_IOCTL_AGP_UNBIND, (unsigned long)request);
} }
#endif /* __OS_HAS_AGP */ #endif /* __OS_HAS_AGP */
...@@ -923,7 +923,7 @@ static int compat_drm_sg_alloc(struct file *file, unsigned int cmd, ...@@ -923,7 +923,7 @@ static int compat_drm_sg_alloc(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
err = drm_ioctl(file->f_dentry->d_inode, file, err = drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_SG_ALLOC, (unsigned long) request); DRM_IOCTL_SG_ALLOC, (unsigned long)request);
if (err) if (err)
return err; return err;
...@@ -950,7 +950,7 @@ static int compat_drm_sg_free(struct file *file, unsigned int cmd, ...@@ -950,7 +950,7 @@ static int compat_drm_sg_free(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
return drm_ioctl(file->f_dentry->d_inode, file, return drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_SG_FREE, (unsigned long) request); DRM_IOCTL_SG_FREE, (unsigned long)request);
} }
struct drm_wait_vblank_request32 { struct drm_wait_vblank_request32 {
...@@ -990,7 +990,7 @@ static int compat_drm_wait_vblank(struct file *file, unsigned int cmd, ...@@ -990,7 +990,7 @@ static int compat_drm_wait_vblank(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
err = drm_ioctl(file->f_dentry->d_inode, file, err = drm_ioctl(file->f_dentry->d_inode, file,
DRM_IOCTL_WAIT_VBLANK, (unsigned long) request); DRM_IOCTL_WAIT_VBLANK, (unsigned long)request);
if (err) if (err)
return err; return err;
...@@ -1059,11 +1059,12 @@ long drm_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) ...@@ -1059,11 +1059,12 @@ long drm_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
lock_kernel(); /* XXX for now */ lock_kernel(); /* XXX for now */
if (fn != NULL) if (fn != NULL)
ret = (*fn)(filp, cmd, arg); ret = (*fn) (filp, cmd, arg);
else else
ret = drm_ioctl(filp->f_dentry->d_inode, filp, cmd, arg); ret = drm_ioctl(filp->f_dentry->d_inode, filp, cmd, arg);
unlock_kernel(); unlock_kernel();
return ret; return ret;
} }
EXPORT_SYMBOL(drm_compat_ioctl); EXPORT_SYMBOL(drm_compat_ioctl);
/** /**
* \file drm_ioctl.h * \file drm_ioctl.c
* IOCTL processing for DRM * IOCTL processing for DRM
* *
* \author Rickard E. (Rik) Faith <faith@valinux.com> * \author Rickard E. (Rik) Faith <faith@valinux.com>
...@@ -91,27 +91,32 @@ int drm_setunique(struct inode *inode, struct file *filp, ...@@ -91,27 +91,32 @@ int drm_setunique(struct inode *inode, struct file *filp,
drm_unique_t u; drm_unique_t u;
int domain, bus, slot, func, ret; int domain, bus, slot, func, ret;
if (dev->unique_len || dev->unique) return -EBUSY; if (dev->unique_len || dev->unique)
return -EBUSY;
if (copy_from_user(&u, (drm_unique_t __user *)arg, sizeof(u))) if (copy_from_user(&u, (drm_unique_t __user *) arg, sizeof(u)))
return -EFAULT; return -EFAULT;
if (!u.unique_len || u.unique_len > 1024) return -EINVAL; if (!u.unique_len || u.unique_len > 1024)
return -EINVAL;
dev->unique_len = u.unique_len; dev->unique_len = u.unique_len;
dev->unique = drm_alloc(u.unique_len + 1, DRM_MEM_DRIVER); dev->unique = drm_alloc(u.unique_len + 1, DRM_MEM_DRIVER);
if(!dev->unique) return -ENOMEM; if (!dev->unique)
return -ENOMEM;
if (copy_from_user(dev->unique, u.unique, dev->unique_len)) if (copy_from_user(dev->unique, u.unique, dev->unique_len))
return -EFAULT; return -EFAULT;
dev->unique[dev->unique_len] = '\0'; dev->unique[dev->unique_len] = '\0';
dev->devname = drm_alloc(strlen(dev->driver->pci_driver.name) + strlen(dev->unique) + 2, dev->devname =
DRM_MEM_DRIVER); drm_alloc(strlen(dev->driver->pci_driver.name) +
strlen(dev->unique) + 2, DRM_MEM_DRIVER);
if (!dev->devname) if (!dev->devname)
return -ENOMEM; return -ENOMEM;
sprintf(dev->devname, "%s@%s", dev->driver->pci_driver.name, dev->unique); sprintf(dev->devname, "%s@%s", dev->driver->pci_driver.name,
dev->unique);
/* Return error if the busid submitted doesn't match the device's actual /* Return error if the busid submitted doesn't match the device's actual
* busid. * busid.
...@@ -124,15 +129,13 @@ int drm_setunique(struct inode *inode, struct file *filp, ...@@ -124,15 +129,13 @@ int drm_setunique(struct inode *inode, struct file *filp,
if ((domain != dev->pci_domain) || if ((domain != dev->pci_domain) ||
(bus != dev->pci_bus) || (bus != dev->pci_bus) ||
(slot != dev->pci_slot) || (slot != dev->pci_slot) || (func != dev->pci_func))
(func != dev->pci_func))
return -EINVAL; return -EINVAL;
return 0; return 0;
} }
static int static int drm_set_busid(drm_device_t * dev)
drm_set_busid(drm_device_t *dev)
{ {
if (dev->unique != NULL) if (dev->unique != NULL)
return EBUSY; return EBUSY;
...@@ -145,17 +148,18 @@ drm_set_busid(drm_device_t *dev) ...@@ -145,17 +148,18 @@ drm_set_busid(drm_device_t *dev)
snprintf(dev->unique, dev->unique_len, "pci:%04x:%02x:%02x.%d", snprintf(dev->unique, dev->unique_len, "pci:%04x:%02x:%02x.%d",
dev->pci_domain, dev->pci_bus, dev->pci_slot, dev->pci_func); dev->pci_domain, dev->pci_bus, dev->pci_slot, dev->pci_func);
dev->devname = drm_alloc(strlen(dev->driver->pci_driver.name) + dev->unique_len + 2, dev->devname =
DRM_MEM_DRIVER); drm_alloc(strlen(dev->driver->pci_driver.name) + dev->unique_len +
2, DRM_MEM_DRIVER);
if (dev->devname == NULL) if (dev->devname == NULL)
return ENOMEM; return ENOMEM;
sprintf(dev->devname, "%s@%s", dev->driver->pci_driver.name, dev->unique); sprintf(dev->devname, "%s@%s", dev->driver->pci_driver.name,
dev->unique);
return 0; return 0;
} }
/** /**
* Get a mapping information. * Get a mapping information.
* *
...@@ -169,8 +173,8 @@ drm_set_busid(drm_device_t *dev) ...@@ -169,8 +173,8 @@ drm_set_busid(drm_device_t *dev)
* Searches for the mapping with the specified offset and copies its information * Searches for the mapping with the specified offset and copies its information
* into userspace * into userspace
*/ */
int drm_getmap( struct inode *inode, struct file *filp, int drm_getmap(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg ) unsigned int cmd, unsigned long arg)
{ {
drm_file_t *priv = filp->private_data; drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->head->dev; drm_device_t *dev = priv->head->dev;
...@@ -193,13 +197,13 @@ int drm_getmap( struct inode *inode, struct file *filp, ...@@ -193,13 +197,13 @@ int drm_getmap( struct inode *inode, struct file *filp,
i = 0; i = 0;
list_for_each(list, &dev->maplist->head) { list_for_each(list, &dev->maplist->head) {
if(i == idx) { if (i == idx) {
r_list = list_entry(list, drm_map_list_t, head); r_list = list_entry(list, drm_map_list_t, head);
break; break;
} }
i++; i++;
} }
if(!r_list || !r_list->map) { if (!r_list || !r_list->map) {
up(&dev->struct_sem); up(&dev->struct_sem);
return -EINVAL; return -EINVAL;
} }
...@@ -208,11 +212,12 @@ int drm_getmap( struct inode *inode, struct file *filp, ...@@ -208,11 +212,12 @@ int drm_getmap( struct inode *inode, struct file *filp,
map.size = r_list->map->size; map.size = r_list->map->size;
map.type = r_list->map->type; map.type = r_list->map->type;
map.flags = r_list->map->flags; map.flags = r_list->map->flags;
map.handle = (void *)(unsigned long) r_list->user_token; map.handle = (void *)(unsigned long)r_list->user_token;
map.mtrr = r_list->map->mtrr; map.mtrr = r_list->map->mtrr;
up(&dev->struct_sem); up(&dev->struct_sem);
if (copy_to_user(argp, &map, sizeof(map))) return -EFAULT; if (copy_to_user(argp, &map, sizeof(map)))
return -EFAULT;
return 0; return 0;
} }
...@@ -229,8 +234,8 @@ int drm_getmap( struct inode *inode, struct file *filp, ...@@ -229,8 +234,8 @@ int drm_getmap( struct inode *inode, struct file *filp,
* Searches for the client with the specified index and copies its information * Searches for the client with the specified index and copies its information
* into userspace * into userspace
*/ */
int drm_getclient( struct inode *inode, struct file *filp, int drm_getclient(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg ) unsigned int cmd, unsigned long arg)
{ {
drm_file_t *priv = filp->private_data; drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->head->dev; drm_device_t *dev = priv->head->dev;
...@@ -244,8 +249,7 @@ int drm_getclient( struct inode *inode, struct file *filp, ...@@ -244,8 +249,7 @@ int drm_getclient( struct inode *inode, struct file *filp,
return -EFAULT; return -EFAULT;
idx = client.idx; idx = client.idx;
down(&dev->struct_sem); down(&dev->struct_sem);
for (i = 0, pt = dev->file_first; i < idx && pt; i++, pt = pt->next) for (i = 0, pt = dev->file_first; i < idx && pt; i++, pt = pt->next) ;
;
if (!pt) { if (!pt) {
up(&dev->struct_sem); up(&dev->struct_sem);
...@@ -258,7 +262,7 @@ int drm_getclient( struct inode *inode, struct file *filp, ...@@ -258,7 +262,7 @@ int drm_getclient( struct inode *inode, struct file *filp,
client.iocs = pt->ioctl_count; client.iocs = pt->ioctl_count;
up(&dev->struct_sem); up(&dev->struct_sem);
if (copy_to_user((drm_client_t __user *)arg, &client, sizeof(client))) if (copy_to_user((drm_client_t __user *) arg, &client, sizeof(client)))
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
...@@ -273,8 +277,8 @@ int drm_getclient( struct inode *inode, struct file *filp, ...@@ -273,8 +277,8 @@ int drm_getclient( struct inode *inode, struct file *filp,
* *
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
*/ */
int drm_getstats( struct inode *inode, struct file *filp, int drm_getstats(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg ) unsigned int cmd, unsigned long arg)
{ {
drm_file_t *priv = filp->private_data; drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->head->dev; drm_device_t *dev = priv->head->dev;
...@@ -288,8 +292,7 @@ int drm_getstats( struct inode *inode, struct file *filp, ...@@ -288,8 +292,7 @@ int drm_getstats( struct inode *inode, struct file *filp,
for (i = 0; i < dev->counters; i++) { for (i = 0; i < dev->counters; i++) {
if (dev->types[i] == _DRM_STAT_LOCK) if (dev->types[i] == _DRM_STAT_LOCK)
stats.data[i].value stats.data[i].value
= (dev->lock.hw_lock = (dev->lock.hw_lock ? dev->lock.hw_lock->lock : 0);
? dev->lock.hw_lock->lock : 0);
else else
stats.data[i].value = atomic_read(&dev->counts[i]); stats.data[i].value = atomic_read(&dev->counts[i]);
stats.data[i].type = dev->types[i]; stats.data[i].type = dev->types[i];
...@@ -299,7 +302,7 @@ int drm_getstats( struct inode *inode, struct file *filp, ...@@ -299,7 +302,7 @@ int drm_getstats( struct inode *inode, struct file *filp,
up(&dev->struct_sem); up(&dev->struct_sem);
if (copy_to_user((drm_stats_t __user *)arg, &stats, sizeof(stats))) if (copy_to_user((drm_stats_t __user *) arg, &stats, sizeof(stats)))
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
...@@ -352,7 +355,8 @@ int drm_setversion(DRM_IOCTL_ARGS) ...@@ -352,7 +355,8 @@ int drm_setversion(DRM_IOCTL_ARGS)
if (sv.drm_dd_major != -1) { if (sv.drm_dd_major != -1) {
if (sv.drm_dd_major != version.version_major || if (sv.drm_dd_major != version.version_major ||
sv.drm_dd_minor < 0 || sv.drm_dd_minor > version.version_minor) sv.drm_dd_minor < 0
|| sv.drm_dd_minor > version.version_minor)
return EINVAL; return EINVAL;
if (dev->driver->set_version) if (dev->driver->set_version)
......
此差异已折叠。
此差异已折叠。
/** /**
* \file drm_memory.h * \file drm_memory.c
* Memory management wrappers for DRM * Memory management wrappers for DRM
* *
* \author Rickard E. (Rik) Faith <faith@valinux.com> * \author Rickard E. (Rik) Faith <faith@valinux.com>
...@@ -70,7 +70,8 @@ void *drm_realloc(void *oldpt, size_t oldsize, size_t size, int area) ...@@ -70,7 +70,8 @@ void *drm_realloc(void *oldpt, size_t oldsize, size_t size, int area)
{ {
void *pt; void *pt;
if (!(pt = kmalloc(size, GFP_KERNEL))) return NULL; if (!(pt = kmalloc(size, GFP_KERNEL)))
return NULL;
if (oldpt && oldsize) { if (oldpt && oldsize) {
memcpy(pt, oldpt, oldsize); memcpy(pt, oldpt, oldsize);
kfree(oldpt); kfree(oldpt);
...@@ -103,8 +104,7 @@ unsigned long drm_alloc_pages(int order, int area) ...@@ -103,8 +104,7 @@ unsigned long drm_alloc_pages(int order, int area)
/* Reserve */ /* Reserve */
for (addr = address, sz = bytes; for (addr = address, sz = bytes;
sz > 0; sz > 0; addr += PAGE_SIZE, sz -= PAGE_SIZE) {
addr += PAGE_SIZE, sz -= PAGE_SIZE) {
SetPageReserved(virt_to_page(addr)); SetPageReserved(virt_to_page(addr));
} }
...@@ -131,42 +131,44 @@ void drm_free_pages(unsigned long address, int order, int area) ...@@ -131,42 +131,44 @@ void drm_free_pages(unsigned long address, int order, int area)
/* Unreserve */ /* Unreserve */
for (addr = address, sz = bytes; for (addr = address, sz = bytes;
sz > 0; sz > 0; addr += PAGE_SIZE, sz -= PAGE_SIZE) {
addr += PAGE_SIZE, sz -= PAGE_SIZE) {
ClearPageReserved(virt_to_page(addr)); ClearPageReserved(virt_to_page(addr));
} }
free_pages(address, order); free_pages(address, order);
} }
#if __OS_HAS_AGP #if __OS_HAS_AGP
/** Wrapper around agp_allocate_memory() */ /** Wrapper around agp_allocate_memory() */
DRM_AGP_MEM *drm_alloc_agp(drm_device_t *dev, int pages, u32 type) DRM_AGP_MEM *drm_alloc_agp(drm_device_t * dev, int pages, u32 type)
{ {
return drm_agp_allocate_memory(dev->agp->bridge, pages, type); return drm_agp_allocate_memory(dev->agp->bridge, pages, type);
} }
EXPORT_SYMBOL(drm_alloc_agp); EXPORT_SYMBOL(drm_alloc_agp);
/** Wrapper around agp_free_memory() */ /** Wrapper around agp_free_memory() */
int drm_free_agp(DRM_AGP_MEM *handle, int pages) int drm_free_agp(DRM_AGP_MEM * handle, int pages)
{ {
return drm_agp_free_memory(handle) ? 0 : -EINVAL; return drm_agp_free_memory(handle) ? 0 : -EINVAL;
} }
EXPORT_SYMBOL(drm_free_agp); EXPORT_SYMBOL(drm_free_agp);
/** Wrapper around agp_bind_memory() */ /** Wrapper around agp_bind_memory() */
int drm_bind_agp(DRM_AGP_MEM *handle, unsigned int start) int drm_bind_agp(DRM_AGP_MEM * handle, unsigned int start)
{ {
return drm_agp_bind_memory(handle, start); return drm_agp_bind_memory(handle, start);
} }
EXPORT_SYMBOL(drm_bind_agp); EXPORT_SYMBOL(drm_bind_agp);
/** Wrapper around agp_unbind_memory() */ /** Wrapper around agp_unbind_memory() */
int drm_unbind_agp(DRM_AGP_MEM *handle) int drm_unbind_agp(DRM_AGP_MEM * handle)
{ {
return drm_agp_unbind_memory(handle); return drm_agp_unbind_memory(handle);
} }
EXPORT_SYMBOL(drm_unbind_agp); EXPORT_SYMBOL(drm_unbind_agp);
#endif /* agp */ #endif /* agp */
#endif /* debug_memory */ #endif /* debug_memory */
此差异已折叠。
此差异已折叠。
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
* OS abstraction macros. * OS abstraction macros.
*/ */
#include <linux/interrupt.h> /* For task queue support */ #include <linux/interrupt.h> /* For task queue support */
#include <linux/delay.h> #include <linux/delay.h>
...@@ -55,17 +54,17 @@ struct no_agp_kern { ...@@ -55,17 +54,17 @@ struct no_agp_kern {
#endif #endif
#if !(__OS_HAS_MTRR) #if !(__OS_HAS_MTRR)
static __inline__ int mtrr_add (unsigned long base, unsigned long size, static __inline__ int mtrr_add(unsigned long base, unsigned long size,
unsigned int type, char increment) unsigned int type, char increment)
{ {
return -ENODEV; return -ENODEV;
} }
static __inline__ int mtrr_del (int reg, unsigned long base, static __inline__ int mtrr_del(int reg, unsigned long base, unsigned long size)
unsigned long size)
{ {
return -ENODEV; return -ENODEV;
} }
#define MTRR_TYPE_WRCOMB 1 #define MTRR_TYPE_WRCOMB 1
#endif #endif
...@@ -143,7 +142,5 @@ do { \ ...@@ -143,7 +142,5 @@ do { \
remove_wait_queue(&(queue), &entry); \ remove_wait_queue(&(queue), &entry); \
} while (0) } while (0)
#define DRM_WAKEUP( queue ) wake_up_interruptible( queue ) #define DRM_WAKEUP( queue ) wake_up_interruptible( queue )
#define DRM_INIT_WAITQUEUE( queue ) init_waitqueue_head( queue ) #define DRM_INIT_WAITQUEUE( queue ) init_waitqueue_head( queue )
...@@ -106,6 +106,7 @@ drm_dma_handle_t *drm_pci_alloc(drm_device_t * dev, size_t size, size_t align, ...@@ -106,6 +106,7 @@ drm_dma_handle_t *drm_pci_alloc(drm_device_t * dev, size_t size, size_t align,
return dmah; return dmah;
} }
EXPORT_SYMBOL(drm_pci_alloc); EXPORT_SYMBOL(drm_pci_alloc);
/** /**
...@@ -113,8 +114,7 @@ EXPORT_SYMBOL(drm_pci_alloc); ...@@ -113,8 +114,7 @@ EXPORT_SYMBOL(drm_pci_alloc);
* *
* This function is for internal use in the Linux-specific DRM core code. * This function is for internal use in the Linux-specific DRM core code.
*/ */
void void __drm_pci_free(drm_device_t * dev, drm_dma_handle_t * dmah)
__drm_pci_free(drm_device_t * dev, drm_dma_handle_t *dmah)
{ {
#ifdef DRM_DEBUG_MEMORY #ifdef DRM_DEBUG_MEMORY
int area = DRM_MEM_DMA; int area = DRM_MEM_DMA;
...@@ -150,12 +150,12 @@ __drm_pci_free(drm_device_t * dev, drm_dma_handle_t *dmah) ...@@ -150,12 +150,12 @@ __drm_pci_free(drm_device_t * dev, drm_dma_handle_t *dmah)
/** /**
* \brief Free a PCI consistent memory block * \brief Free a PCI consistent memory block
*/ */
void void drm_pci_free(drm_device_t * dev, drm_dma_handle_t * dmah)
drm_pci_free(drm_device_t *dev, drm_dma_handle_t *dmah)
{ {
__drm_pci_free(dev, dmah); __drm_pci_free(dev, dmah);
kfree(dmah); kfree(dmah);
} }
EXPORT_SYMBOL(drm_pci_free); EXPORT_SYMBOL(drm_pci_free);
/*@}*/ /*@}*/
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册