提交 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);
/** /**
* \file drm.h * \file drm.h
* Header for the Direct Rendering Manager * Header for the Direct Rendering Manager
* *
* \author Rickard E. (Rik) Faith <faith@valinux.com> * \author Rickard E. (Rik) Faith <faith@valinux.com>
* *
* \par Acknowledgments: * \par Acknowledgments:
...@@ -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_
...@@ -56,7 +55,7 @@ ...@@ -56,7 +55,7 @@
#define ioctl(a,b,c) xf86ioctl(a,b,c) #define ioctl(a,b,c) xf86ioctl(a,b,c)
#else #else
#include <sys/ioccom.h> #include <sys/ioccom.h>
#endif /* __FreeBSD__ && xf86ioctl */ #endif /* __FreeBSD__ && xf86ioctl */
#define DRM_IOCTL_NR(n) ((n) & 0xff) #define DRM_IOCTL_NR(n) ((n) & 0xff)
#define DRM_IOC_VOID IOC_VOID #define DRM_IOC_VOID IOC_VOID
#define DRM_IOC_READ IOC_OUT #define DRM_IOC_READ IOC_OUT
...@@ -97,16 +96,14 @@ ...@@ -97,16 +96,14 @@
#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.
* *
* \warning: If you change this structure, make sure you change * \warning: If you change this structure, make sure you change
* XF86DRIClipRectRec in the server as well * XF86DRIClipRectRec in the server as well
* *
...@@ -114,22 +111,21 @@ typedef unsigned int drm_magic_t; ...@@ -114,22 +111,21 @@ typedef unsigned int drm_magic_t;
* backwards-compatibility reasons. * backwards-compatibility reasons.
*/ */
typedef struct drm_clip_rect { typedef struct drm_clip_rect {
unsigned short x1; unsigned short x1;
unsigned short y1; unsigned short y1;
unsigned short x2; unsigned short x2;
unsigned short y2; unsigned short y2;
} drm_clip_rect_t; } drm_clip_rect_t;
/** /**
* Texture region, * Texture region,
*/ */
typedef struct drm_tex_region { typedef struct drm_tex_region {
unsigned char next; unsigned char next;
unsigned char prev; unsigned char prev;
unsigned char in_use; unsigned char in_use;
unsigned char padding; unsigned char padding;
unsigned int age; unsigned int age;
} drm_tex_region_t; } drm_tex_region_t;
/** /**
...@@ -141,28 +137,26 @@ typedef struct drm_tex_region { ...@@ -141,28 +137,26 @@ typedef struct drm_tex_region {
*/ */
typedef struct drm_hw_lock { typedef struct drm_hw_lock {
__volatile__ unsigned int lock; /**< lock variable */ __volatile__ unsigned int lock; /**< lock variable */
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.
* *
* \sa drmGetVersion(). * \sa drmGetVersion().
*/ */
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 */
char __user *date; /**< User-space buffer to hold date */ char __user *date; /**< User-space buffer to hold date */
size_t desc_len; /**< Length of desc buffer */ size_t desc_len; /**< Length of desc buffer */
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.
* *
...@@ -170,21 +164,18 @@ typedef struct drm_version { ...@@ -170,21 +164,18 @@ typedef struct drm_version {
*/ */
typedef struct drm_unique { typedef struct drm_unique {
size_t unique_len; /**< Length of unique */ size_t unique_len; /**< Length of 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.
* *
...@@ -196,44 +187,40 @@ typedef struct drm_control { ...@@ -196,44 +187,40 @@ typedef struct drm_control {
DRM_RM_COMMAND, DRM_RM_COMMAND,
DRM_INST_HANDLER, DRM_INST_HANDLER,
DRM_UNINST_HANDLER DRM_UNINST_HANDLER
} func; } func;
int irq; int irq;
} drm_control_t; } drm_control_t;
/** /**
* Type of memory to map. * Type of memory to map.
*/ */
typedef enum drm_map_type { typedef enum drm_map_type {
_DRM_FRAME_BUFFER = 0, /**< WC (no caching), no core dump */ _DRM_FRAME_BUFFER = 0, /**< WC (no caching), no core dump */
_DRM_REGISTERS = 1, /**< no caching, no core dump */ _DRM_REGISTERS = 1, /**< no caching, no core dump */
_DRM_SHM = 2, /**< shared, cached */ _DRM_SHM = 2, /**< shared, cached */
_DRM_AGP = 3, /**< AGP/GART */ _DRM_AGP = 3, /**< AGP/GART */
_DRM_SCATTER_GATHER = 4, /**< Scatter/gather memory for PCI DMA */ _DRM_SCATTER_GATHER = 4, /**< Scatter/gather memory for PCI DMA */
_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.
*/ */
typedef enum drm_map_flags { typedef enum drm_map_flags {
_DRM_RESTRICTED = 0x01, /**< Cannot be mapped to user-virtual */ _DRM_RESTRICTED = 0x01, /**< Cannot be mapped to user-virtual */
_DRM_READ_ONLY = 0x02, _DRM_READ_ONLY = 0x02,
_DRM_LOCKED = 0x04, /**< shared, cached, locked */ _DRM_LOCKED = 0x04, /**< shared, cached, locked */
_DRM_KERNEL = 0x08, /**< kernel requires access */ _DRM_KERNEL = 0x08, /**< kernel requires access */
_DRM_WRITE_COMBINING = 0x10, /**< use write-combining if available */ _DRM_WRITE_COMBINING = 0x10, /**< use write-combining if available */
_DRM_CONTAINS_LOCK = 0x20, /**< SHM page that contains lock */ _DRM_CONTAINS_LOCK = 0x20, /**< SHM page that contains lock */
_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.
...@@ -241,30 +228,28 @@ typedef struct drm_ctx_priv_map { ...@@ -241,30 +228,28 @@ typedef struct drm_ctx_priv_map {
* \sa drmAddMap(). * \sa drmAddMap().
*/ */
typedef struct drm_map { typedef struct drm_map {
unsigned long offset; /**< Requested physical address (0 for SAREA)*/ unsigned long offset; /**< Requested physical address (0 for SAREA)*/
unsigned long size; /**< Requested physical size (bytes) */ unsigned long size; /**< Requested physical size (bytes) */
drm_map_type_t type; /**< Type of memory to map */ drm_map_type_t type; /**< Type of memory to map */
drm_map_flags_t flags; /**< Flags */ drm_map_flags_t flags; /**< Flags */
void *handle; /**< User-space: "Handle" to pass to mmap() */ void *handle; /**< User-space: "Handle" to pass to mmap() */
/**< Kernel-space: kernel-virtual address */ /**< Kernel-space: kernel-virtual address */
int mtrr; /**< MTRR slot used */ int mtrr; /**< MTRR slot used */
/* Private data */ /* Private data */
} drm_map_t; } drm_map_t;
/** /**
* DRM_IOCTL_GET_CLIENT ioctl argument type. * DRM_IOCTL_GET_CLIENT ioctl argument type.
*/ */
typedef struct drm_client { typedef struct drm_client {
int idx; /**< Which client desired? */ int idx; /**< Which client desired? */
int auth; /**< Is client authenticated? */ int auth; /**< Is client authenticated? */
unsigned long pid; /**< Process ID */ unsigned long pid; /**< Process ID */
unsigned long uid; /**< User ID */ unsigned long uid; /**< User ID */
unsigned long magic; /**< Magic */ unsigned long magic; /**< Magic */
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,63 +267,58 @@ typedef enum { ...@@ -282,63 +267,58 @@ 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.
*/ */
typedef struct drm_stats { typedef struct drm_stats {
unsigned long count; unsigned long count;
struct { struct {
unsigned long value; unsigned long value;
drm_stat_type_t type; drm_stat_type_t type;
} data[15]; } data[15];
} drm_stats_t; } drm_stats_t;
/** /**
* Hardware locking flags. * Hardware locking flags.
*/ */
typedef enum drm_lock_flags { typedef enum drm_lock_flags {
_DRM_LOCK_READY = 0x01, /**< Wait until hardware is ready for DMA */ _DRM_LOCK_READY = 0x01, /**< Wait until hardware is ready for DMA */
_DRM_LOCK_QUIESCENT = 0x02, /**< Wait until hardware quiescent */ _DRM_LOCK_QUIESCENT = 0x02, /**< Wait until hardware quiescent */
_DRM_LOCK_FLUSH = 0x04, /**< Flush this context's DMA queue first */ _DRM_LOCK_FLUSH = 0x04, /**< Flush this context's DMA queue first */
_DRM_LOCK_FLUSH_ALL = 0x08, /**< Flush all DMA queues first */ _DRM_LOCK_FLUSH_ALL = 0x08, /**< Flush all DMA queues first */
/* These *HALT* flags aren't supported yet /* These *HALT* flags aren't supported yet
-- they will be used to support the -- they will be used to support the
full-screen DGA-like mode. */ full-screen DGA-like mode. */
_DRM_HALT_ALL_QUEUES = 0x10, /**< Halt all current and future queues */ _DRM_HALT_ALL_QUEUES = 0x10, /**< Halt all current and future queues */
_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.
* *
* \sa drmGetLock() and drmUnlock(). * \sa drmGetLock() and drmUnlock().
*/ */
typedef struct drm_lock { typedef struct drm_lock {
int context; int context;
drm_lock_flags_t flags; drm_lock_flags_t flags;
} drm_lock_t; } drm_lock_t;
/** /**
* DMA flags * DMA flags
* *
* \warning * \warning
* These values \e must match xf86drm.h. * These values \e must match xf86drm.h.
* *
* \sa drm_dma. * \sa drm_dma.
*/ */
typedef enum drm_dma_flags { typedef enum drm_dma_flags {
/* Flags for DMA buffer dispatch */ /* Flags for DMA buffer dispatch */
_DRM_DMA_BLOCK = 0x01, /**< _DRM_DMA_BLOCK = 0x01, /**<
* Block until buffer dispatched. * Block until buffer dispatched.
* *
* \note The buffer may not yet have * \note The buffer may not yet have
* been processed by the hardware -- * been processed by the hardware --
* getting a hardware lock with the * getting a hardware lock with the
...@@ -347,79 +327,73 @@ typedef enum drm_dma_flags { ...@@ -347,79 +327,73 @@ typedef enum drm_dma_flags {
* processed. * processed.
*/ */
_DRM_DMA_WHILE_LOCKED = 0x02, /**< Dispatch while lock held */ _DRM_DMA_WHILE_LOCKED = 0x02, /**< Dispatch while lock held */
_DRM_DMA_PRIORITY = 0x04, /**< High priority dispatch */ _DRM_DMA_PRIORITY = 0x04, /**< High priority dispatch */
/* Flags for DMA buffer request */ /* Flags for DMA buffer request */
_DRM_DMA_WAIT = 0x10, /**< Wait for free buffers */ _DRM_DMA_WAIT = 0x10, /**< Wait for free buffers */
_DRM_DMA_SMALLER_OK = 0x20, /**< Smaller-than-requested buffers OK */ _DRM_DMA_SMALLER_OK = 0x20, /**< Smaller-than-requested buffers OK */
_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.
* *
* \sa drmAddBufs(). * \sa drmAddBufs().
*/ */
typedef struct drm_buf_desc { typedef struct drm_buf_desc {
int count; /**< Number of buffers of this size */ int count; /**< Number of buffers of this size */
int size; /**< Size in bytes */ int size; /**< Size in bytes */
int low_mark; /**< Low water mark */ int low_mark; /**< Low water mark */
int high_mark; /**< High water mark */ int high_mark; /**< High water mark */
enum { enum {
_DRM_PAGE_ALIGN = 0x01, /**< Align on page boundaries for DMA */ _DRM_PAGE_ALIGN = 0x01, /**< Align on page boundaries for DMA */
_DRM_AGP_BUFFER = 0x02, /**< Buffer is in AGP space */ _DRM_AGP_BUFFER = 0x02, /**< Buffer is in AGP space */
_DRM_SG_BUFFER = 0x04, /**< Scatter/gather memory buffer */ _DRM_SG_BUFFER = 0x04, /**< Scatter/gather memory buffer */
_DRM_FB_BUFFER = 0x08 /**< Buffer is in frame buffer */ _DRM_FB_BUFFER = 0x08 /**< Buffer is in frame buffer */
} flags; } flags;
unsigned long agp_start; /**< unsigned long agp_start; /**<
* Start address of where the AGP buffers are * Start address of where the AGP buffers are
* in the AGP aperture * in the AGP aperture
*/ */
} drm_buf_desc_t; } drm_buf_desc_t;
/** /**
* DRM_IOCTL_INFO_BUFS ioctl argument type. * DRM_IOCTL_INFO_BUFS ioctl argument type.
*/ */
typedef struct drm_buf_info { typedef struct drm_buf_info {
int count; /**< Entries in list */ int count; /**< Entries in list */
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.
*/ */
typedef struct drm_buf_free { typedef struct drm_buf_free {
int count; int count;
int __user *list; int __user *list;
} drm_buf_free_t; } drm_buf_free_t;
/** /**
* Buffer information * Buffer information
* *
* \sa drm_buf_map. * \sa drm_buf_map.
*/ */
typedef struct drm_buf_pub { typedef struct drm_buf_pub {
int idx; /**< Index into the master buffer list */ int idx; /**< Index into the master buffer list */
int total; /**< Buffer size */ int total; /**< Buffer size */
int used; /**< Amount of buffer in use (for DMA) */ int used; /**< Amount of buffer in use (for DMA) */
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.
*/ */
typedef struct drm_buf_map { typedef struct drm_buf_map {
int count; /**< Length of the buffer list */ int count; /**< Length of the buffer list */
void __user *virtual; /**< Mmap'd area in user-virtual */ void __user *virtual; /**< Mmap'd area in user-virtual */
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.
* *
...@@ -428,61 +402,55 @@ typedef struct drm_buf_map { ...@@ -428,61 +402,55 @@ typedef struct drm_buf_map {
* \sa drmDMA(). * \sa drmDMA().
*/ */
typedef struct drm_dma { typedef struct drm_dma {
int context; /**< Context handle */ int context; /**< Context handle */
int send_count; /**< Number of buffers to send */ int send_count; /**< Number of buffers to send */
int __user *send_indices; /**< List of handles to buffers */ int __user *send_indices; /**< List of handles to buffers */
int __user *send_sizes; /**< Lengths of data to send */ int __user *send_sizes; /**< Lengths of data to send */
drm_dma_flags_t flags; /**< Flags */ drm_dma_flags_t flags; /**< Flags */
int request_count; /**< Number of buffers requested */ int request_count; /**< Number of buffers requested */
int request_size; /**< Desired size for buffers */ int request_size; /**< Desired size for buffers */
int __user *request_indices; /**< Buffer information */ int __user *request_indices; /**< Buffer information */
int __user *request_sizes; int __user *request_sizes;
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.
* *
* \sa drmCreateContext() and drmDestroyContext(). * \sa drmCreateContext() and drmDestroyContext().
*/ */
typedef struct drm_ctx { typedef struct drm_ctx {
drm_context_t handle; drm_context_t handle;
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.
*/ */
typedef struct drm_ctx_res { typedef struct drm_ctx_res {
int count; int count;
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.
*/ */
typedef struct drm_draw { 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.
*/ */
typedef struct drm_auth { 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.
* *
...@@ -550,22 +511,20 @@ typedef struct drm_agp_mode { ...@@ -550,22 +511,20 @@ typedef struct drm_agp_mode {
typedef struct drm_agp_buffer { typedef struct drm_agp_buffer {
unsigned long size; /**< In bytes -- will round to page boundary */ unsigned long size; /**< In bytes -- will round to page boundary */
unsigned long handle; /**< Used for binding / unbinding */ unsigned long handle; /**< Used for binding / unbinding */
unsigned long type; /**< Type of memory to allocate */ unsigned long type; /**< Type of memory to allocate */
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.
* *
* \sa drmAgpBind() and drmAgpUnbind(). * \sa drmAgpBind() and drmAgpUnbind().
*/ */
typedef struct drm_agp_binding { typedef struct drm_agp_binding {
unsigned long handle; /**< From drm_agp_buffer */ unsigned long handle; /**< From drm_agp_buffer */
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.
* *
...@@ -574,20 +533,19 @@ typedef struct drm_agp_binding { ...@@ -574,20 +533,19 @@ typedef struct drm_agp_binding {
* drmAgpVendorId() and drmAgpDeviceId(). * drmAgpVendorId() and drmAgpDeviceId().
*/ */
typedef struct drm_agp_info { typedef struct drm_agp_info {
int agp_version_major; int agp_version_major;
int agp_version_minor; int agp_version_minor;
unsigned long mode; unsigned long mode;
unsigned long aperture_base; /* physical address */ unsigned long aperture_base; /* physical address */
unsigned long aperture_size; /* bytes */ unsigned long aperture_size; /* bytes */
unsigned long memory_allowed; /* bytes */ unsigned long memory_allowed; /* bytes */
unsigned long memory_used; unsigned long memory_used;
/* PCI information */ /* PCI information */
unsigned short id_vendor; unsigned short id_vendor;
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)
......
此差异已折叠。
/** /**
* \file drm_agpsupport.h * \file drm_agpsupport.h
* DRM support for AGP/GART backend * DRM support for AGP/GART backend
* *
* \author Rickard E. (Rik) Faith <faith@valinux.com> * \author Rickard E. (Rik) Faith <faith@valinux.com>
* \author Gareth Hughes <gareth@valinux.com> * \author Gareth Hughes <gareth@valinux.com>
*/ */
...@@ -48,30 +48,31 @@ ...@@ -48,30 +48,31 @@
* 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;
if (!dev->agp || !dev->agp->acquired) if (!dev->agp || !dev->agp->acquired)
return -EINVAL; return -EINVAL;
kern = &dev->agp->agp_info; kern = &dev->agp->agp_info;
info->agp_version_major = kern->version.major; info->agp_version_major = kern->version.major;
info->agp_version_minor = kern->version.minor; info->agp_version_minor = kern->version.minor;
info->mode = kern->mode; info->mode = kern->mode;
info->aperture_base = kern->aper_base; info->aperture_base = kern->aper_base;
info->aperture_size = kern->aper_size * 1024 * 1024; info->aperture_size = kern->aper_size * 1024 * 1024;
info->memory_allowed = kern->max_memory << PAGE_SHIFT; info->memory_allowed = kern->max_memory << PAGE_SHIFT;
info->memory_used = kern->current_memory << PAGE_SHIFT; info->memory_used = kern->current_memory << PAGE_SHIFT;
info->id_vendor = kern->device->vendor; info->id_vendor = kern->device->vendor;
info->id_device = kern->device->device; info->id_device = kern->device->device;
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,
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;
...@@ -81,7 +82,7 @@ int drm_agp_info_ioctl(struct inode *inode, struct file *filp, ...@@ -81,7 +82,7 @@ int drm_agp_info_ioctl(struct inode *inode, struct file *filp,
err = drm_agp_info(dev, &info); err = drm_agp_info(dev, &info);
if (err) if (err)
return err; return err;
if (copy_to_user((drm_agp_info_t __user *) arg, &info, sizeof(info))) if (copy_to_user((drm_agp_info_t __user *) arg, &info, sizeof(info)))
return -EFAULT; return -EFAULT;
return 0; return 0;
...@@ -91,12 +92,12 @@ int drm_agp_info_ioctl(struct inode *inode, struct file *filp, ...@@ -91,12 +92,12 @@ int drm_agp_info_ioctl(struct inode *inode, struct file *filp,
* Acquire the AGP device. * Acquire the AGP device.
* *
* \param dev DRM device that is to acquire AGP * \param dev DRM device that is to acquire AGP
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
* *
* Verifies the AGP device hasn't been acquired before and calls * Verifies the AGP device hasn't been acquired before and calls
* \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);
/** /**
...@@ -125,8 +127,8 @@ int drm_agp_acquire_ioctl(struct inode *inode, struct file *filp, ...@@ -125,8 +127,8 @@ int drm_agp_acquire_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;
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,
...@@ -152,13 +155,13 @@ int drm_agp_release_ioctl(struct inode *inode, struct file *filp, ...@@ -152,13 +155,13 @@ int drm_agp_release_ioctl(struct inode *inode, struct file *filp,
{ {
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;
return drm_agp_release(dev); return drm_agp_release(dev);
} }
/** /**
* Enable the AGP bus. * Enable the AGP bus.
* *
* \param dev DRM device that has previously acquired AGP. * \param dev DRM device that has previously acquired AGP.
* \param mode Requested AGP mode. * \param mode Requested AGP mode.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
...@@ -166,27 +169,27 @@ int drm_agp_release_ioctl(struct inode *inode, struct file *filp, ...@@ -166,27 +169,27 @@ 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;
dev->agp->mode = mode.mode; dev->agp->mode = mode.mode;
agp_enable(dev->agp->bridge, mode.mode); agp_enable(dev->agp->bridge, mode.mode);
dev->agp->base = dev->agp->agp_info.aper_base; dev->agp->base = dev->agp->agp_info.aper_base;
dev->agp->enabled = 1; dev->agp->enabled = 1;
return 0; return 0;
} }
EXPORT_SYMBOL(drm_agp_enable); 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,
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_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;
...@@ -201,20 +204,20 @@ int drm_agp_enable_ioctl(struct inode *inode, struct file *filp, ...@@ -201,20 +204,20 @@ int drm_agp_enable_ioctl(struct inode *inode, struct file *filp,
* \param cmd command. * \param cmd command.
* \param arg pointer to a drm_agp_buffer structure. * \param arg pointer to a drm_agp_buffer structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
* *
* Verifies the AGP device is present and has been acquired, allocates the * Verifies the AGP device is present and has been acquired, allocates the
* memory via alloc_agp() and creates a drm_agp_mem entry for it. * memory via alloc_agp() and creates a drm_agp_mem entry for it.
*/ */
int drm_agp_alloc(struct inode *inode, struct file *filp, int drm_agp_alloc(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_agp_buffer_t request; drm_agp_buffer_t request;
drm_agp_mem_t *entry; drm_agp_mem_t *entry;
DRM_AGP_MEM *memory; DRM_AGP_MEM *memory;
unsigned long pages; unsigned long pages;
u32 type; u32 type;
drm_agp_buffer_t __user *argp = (void __user *)arg; drm_agp_buffer_t __user *argp = (void __user *)arg;
if (!dev->agp || !dev->agp->acquired) if (!dev->agp || !dev->agp->acquired)
...@@ -224,7 +227,7 @@ int drm_agp_alloc(struct inode *inode, struct file *filp, ...@@ -224,7 +227,7 @@ int drm_agp_alloc(struct inode *inode, struct file *filp,
if (!(entry = drm_alloc(sizeof(*entry), DRM_MEM_AGPLISTS))) if (!(entry = drm_alloc(sizeof(*entry), DRM_MEM_AGPLISTS)))
return -ENOMEM; return -ENOMEM;
memset(entry, 0, sizeof(*entry)); memset(entry, 0, sizeof(*entry));
pages = (request.size + PAGE_SIZE - 1) / PAGE_SIZE; pages = (request.size + PAGE_SIZE - 1) / PAGE_SIZE;
type = (u32) request.type; type = (u32) request.type;
...@@ -234,21 +237,21 @@ int drm_agp_alloc(struct inode *inode, struct file *filp, ...@@ -234,21 +237,21 @@ int drm_agp_alloc(struct inode *inode, struct file *filp,
return -ENOMEM; return -ENOMEM;
} }
entry->handle = (unsigned long)memory->key + 1; entry->handle = (unsigned long)memory->key + 1;
entry->memory = memory; entry->memory = memory;
entry->bound = 0; entry->bound = 0;
entry->pages = pages; entry->pages = pages;
entry->prev = NULL; entry->prev = NULL;
entry->next = dev->agp->memory; entry->next = dev->agp->memory;
if (dev->agp->memory) if (dev->agp->memory)
dev->agp->memory->prev = entry; dev->agp->memory->prev = entry;
dev->agp->memory = entry; dev->agp->memory = entry;
request.handle = entry->handle; request.handle = entry->handle;
request.physical = memory->physical; request.physical = memory->physical;
if (copy_to_user(argp, &request, sizeof(request))) { if (copy_to_user(argp, &request, sizeof(request))) {
dev->agp->memory = entry->next; dev->agp->memory = entry->next;
dev->agp->memory->prev = NULL; dev->agp->memory->prev = NULL;
drm_free_agp(memory, pages); drm_free_agp(memory, pages);
drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS); drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS);
...@@ -263,11 +266,11 @@ int drm_agp_alloc(struct inode *inode, struct file *filp, ...@@ -263,11 +266,11 @@ int drm_agp_alloc(struct inode *inode, struct file *filp,
* \param dev DRM device structure. * \param dev DRM device structure.
* \param handle AGP memory handle. * \param handle AGP memory handle.
* \return pointer to the drm_agp_mem structure associated with \p handle. * \return pointer to the drm_agp_mem structure associated with \p handle.
* *
* 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;
...@@ -291,17 +294,18 @@ static drm_agp_mem_t *drm_agp_lookup_entry(drm_device_t *dev, ...@@ -291,17 +294,18 @@ static drm_agp_mem_t *drm_agp_lookup_entry(drm_device_t *dev,
* entry and passes it to the unbind_agp() function. * entry and passes it to the unbind_agp() function.
*/ */
int drm_agp_unbind(struct inode *inode, struct file *filp, int drm_agp_unbind(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_agp_binding_t request; drm_agp_binding_t request;
drm_agp_mem_t *entry; drm_agp_mem_t *entry;
int ret; int ret;
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;
...@@ -309,7 +313,7 @@ int drm_agp_unbind(struct inode *inode, struct file *filp, ...@@ -309,7 +313,7 @@ int drm_agp_unbind(struct inode *inode, struct file *filp,
return -EINVAL; return -EINVAL;
ret = drm_unbind_agp(entry->memory); ret = drm_unbind_agp(entry->memory);
if (ret == 0) if (ret == 0)
entry->bound = 0; entry->bound = 0;
return ret; return ret;
} }
...@@ -327,18 +331,19 @@ int drm_agp_unbind(struct inode *inode, struct file *filp, ...@@ -327,18 +331,19 @@ int drm_agp_unbind(struct inode *inode, struct file *filp,
* it to bind_agp() function. * it to bind_agp() function.
*/ */
int drm_agp_bind(struct inode *inode, struct file *filp, int drm_agp_bind(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_agp_binding_t request; drm_agp_binding_t request;
drm_agp_mem_t *entry; drm_agp_mem_t *entry;
int retcode; int retcode;
int page; int page;
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;
...@@ -368,16 +373,17 @@ int drm_agp_bind(struct inode *inode, struct file *filp, ...@@ -368,16 +373,17 @@ int drm_agp_bind(struct inode *inode, struct file *filp,
* and unlinks from the doubly linked list it's inserted in. * and unlinks from the doubly linked list it's inserted in.
*/ */
int drm_agp_free(struct inode *inode, struct file *filp, int drm_agp_free(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_agp_buffer_t request; drm_agp_buffer_t request;
drm_agp_mem_t *entry; drm_agp_mem_t *entry;
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,9 +409,9 @@ int drm_agp_free(struct inode *inode, struct file *filp, ...@@ -403,9 +409,9 @@ 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;
if (!(head = drm_alloc(sizeof(*head), DRM_MEM_AGPLISTS))) if (!(head = drm_alloc(sizeof(*head), DRM_MEM_AGPLISTS)))
return NULL; return 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,20 +455,21 @@ int drm_agp_free_memory(DRM_AGP_MEM *handle) ...@@ -448,20 +455,21 @@ 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;
return agp_unbind_memory(handle); return agp_unbind_memory(handle);
} }
#endif /* __OS_HAS_AGP */ #endif /* __OS_HAS_AGP */
/** /**
* \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,11 +59,11 @@ static int drm_hash_magic(drm_magic_t magic) ...@@ -59,11 +59,11 @@ 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;
int hash = drm_hash_magic(magic); int hash = drm_hash_magic(magic);
down(&dev->struct_sem); down(&dev->struct_sem);
for (pt = dev->magiclist[hash].head; pt; pt = pt->next) { for (pt = dev->magiclist[hash].head; pt; pt = pt->next) {
...@@ -78,7 +78,7 @@ static drm_file_t *drm_find_file(drm_device_t *dev, drm_magic_t magic) ...@@ -78,7 +78,7 @@ static drm_file_t *drm_find_file(drm_device_t *dev, drm_magic_t magic)
/** /**
* Adds a magic number. * Adds a magic number.
* *
* \param dev DRM device. * \param dev DRM device.
* \param priv file private data. * \param priv file private data.
* \param magic magic number. * \param magic magic number.
...@@ -87,28 +87,30 @@ static drm_file_t *drm_find_file(drm_device_t *dev, drm_magic_t magic) ...@@ -87,28 +87,30 @@ 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;
DRM_DEBUG("%d\n", magic); DRM_DEBUG("%d\n", 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;
entry->next = NULL; entry->next = NULL;
down(&dev->struct_sem); down(&dev->struct_sem);
if (dev->magiclist[hash].tail) { if (dev->magiclist[hash].tail) {
dev->magiclist[hash].tail->next = entry; dev->magiclist[hash].tail->next = entry;
dev->magiclist[hash].tail = entry; dev->magiclist[hash].tail = entry;
} else { } else {
dev->magiclist[hash].head = entry; dev->magiclist[hash].head = entry;
dev->magiclist[hash].tail = entry; dev->magiclist[hash].tail = entry;
} }
up(&dev->struct_sem); up(&dev->struct_sem);
...@@ -117,19 +119,18 @@ static int drm_add_magic(drm_device_t *dev, drm_file_t *priv, drm_magic_t magic) ...@@ -117,19 +119,18 @@ static int drm_add_magic(drm_device_t *dev, drm_file_t *priv, drm_magic_t magic)
/** /**
* Remove a magic number. * Remove a magic number.
* *
* \param dev DRM device. * \param dev DRM device.
* \param magic magic number. * \param magic magic number.
* *
* 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);
...@@ -171,21 +172,22 @@ static int drm_remove_magic(drm_device_t *dev, drm_magic_t magic) ...@@ -171,21 +172,22 @@ static int drm_remove_magic(drm_device_t *dev, drm_magic_t magic)
* filp. * filp.
*/ */
int drm_getmagic(struct inode *inode, struct file *filp, int drm_getmagic(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
static drm_magic_t sequence = 0; static drm_magic_t sequence = 0;
static DEFINE_SPINLOCK(lock); static DEFINE_SPINLOCK(lock);
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_auth_t auth; drm_auth_t auth;
/* Find unique magic */ /* Find unique magic */
if (priv->magic) { if (priv->magic) {
auth.magic = priv->magic; auth.magic = priv->magic;
} 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;
} }
...@@ -211,14 +213,14 @@ int drm_getmagic(struct inode *inode, struct file *filp, ...@@ -211,14 +213,14 @@ int drm_getmagic(struct inode *inode, struct file *filp,
* Checks if \p filp is associated with the magic number passed in \arg. * Checks if \p filp is associated with the magic number passed in \arg.
*/ */
int drm_authmagic(struct inode *inode, struct file *filp, int drm_authmagic(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_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>
* \author Gareth Hughes <gareth@valinux.com> * \author Gareth Hughes <gareth@valinux.com>
*/ */
...@@ -56,25 +56,26 @@ ...@@ -56,25 +56,26 @@
* 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;
} }
/** /**
* Context bitmap allocation. * Context bitmap allocation.
* *
* \param dev DRM device. * \param dev DRM device.
...@@ -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) *
dev->max_context * sizeof(*dev->
sizeof(*dev->context_sareas), context_sareas),
DRM_MEM_MAPS); dev->max_context *
if(!ctx_sareas) { sizeof(*dev->
context_sareas),
DRM_MEM_MAPS);
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)
sizeof(*dev->context_sareas) * drm_free(dev->context_sareas,
dev->max_context, sizeof(*dev->context_sareas) *
DRM_MEM_MAPS ); dev->max_context, 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);
} }
...@@ -194,7 +199,7 @@ void drm_ctxbitmap_cleanup( drm_device_t *dev ) ...@@ -194,7 +199,7 @@ void drm_ctxbitmap_cleanup( drm_device_t *dev )
/** /**
* Get per-context SAREA. * Get per-context SAREA.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param filp file pointer.
* \param cmd command. * \param cmd command.
...@@ -205,10 +210,10 @@ void drm_ctxbitmap_cleanup( drm_device_t *dev ) ...@@ -205,10 +210,10 @@ void drm_ctxbitmap_cleanup( drm_device_t *dev )
* returns its handle. * returns its handle.
*/ */
int drm_getsareactx(struct inode *inode, struct file *filp, int drm_getsareactx(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_priv_map_t __user *argp = (void __user *)arg; drm_ctx_priv_map_t __user *argp = (void __user *)arg;
drm_ctx_priv_map_t request; drm_ctx_priv_map_t request;
drm_map_t *map; drm_map_t *map;
...@@ -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;
...@@ -244,7 +250,7 @@ int drm_getsareactx(struct inode *inode, struct file *filp, ...@@ -244,7 +250,7 @@ int drm_getsareactx(struct inode *inode, struct file *filp,
/** /**
* Set per-context SAREA. * Set per-context SAREA.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param filp file pointer.
* \param cmd command. * \param cmd command.
...@@ -255,37 +261,37 @@ int drm_getsareactx(struct inode *inode, struct file *filp, ...@@ -255,37 +261,37 @@ int drm_getsareactx(struct inode *inode, struct file *filp,
* drm_device::context_sareas with it. * drm_device::context_sareas with it.
*/ */
int drm_setsareactx(struct inode *inode, struct file *filp, int drm_setsareactx(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_priv_map_t request; drm_ctx_priv_map_t request;
drm_map_t *map = NULL; drm_map_t *map = NULL;
drm_map_list_t *r_list = NULL; drm_map_list_t *r_list = NULL;
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,22 +314,21 @@ int drm_setsareactx(struct inode *inode, struct file *filp, ...@@ -308,22 +314,21 @@ 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 ) { if (new == dev->last_context) {
clear_bit( 0, &dev->context_flag ); clear_bit(0, &dev->context_flag);
return 0; return 0;
} }
return 0; return 0;
} }
/** /**
...@@ -337,22 +342,22 @@ static int drm_context_switch( drm_device_t *dev, int old, int new ) ...@@ -337,22 +342,22 @@ 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>
...@@ -37,23 +37,23 @@ ...@@ -37,23 +37,23 @@
/** /**
* Initialize the DMA data. * Initialize the DMA data.
* *
* \param dev DRM device. * \param dev DRM device.
* \return zero on success or a negative value on failure. * \return zero on success or a negative value on failure.
* *
* 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,14 +67,15 @@ int drm_dma_setup( drm_device_t *dev ) ...@@ -67,14 +67,15 @@ 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++) {
if (dma->bufs[i].seg_count) { if (dma->bufs[i].seg_count) {
DRM_DEBUG("order %d: buf_count = %d," DRM_DEBUG("order %d: buf_count = %d,"
...@@ -85,64 +86,63 @@ void drm_dma_takedown(drm_device_t *dev) ...@@ -85,64 +86,63 @@ void drm_dma_takedown(drm_device_t *dev)
for (j = 0; j < dma->bufs[i].seg_count; j++) { for (j = 0; j < dma->bufs[i].seg_count; j++) {
if (dma->bufs[i].seglist[j]) { if (dma->bufs[i].seglist[j]) {
drm_free_pages(dma->bufs[i].seglist[j], drm_free_pages(dma->bufs[i].seglist[j],
dma->bufs[i].page_order, dma->bufs[i].page_order,
DRM_MEM_DMA); DRM_MEM_DMA);
} }
} }
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) {
drm_free(dma->pagelist, drm_free(dma->pagelist,
dma->page_count * sizeof(*dma->pagelist), dma->page_count * sizeof(*dma->pagelist),
DRM_MEM_PAGES); DRM_MEM_PAGES);
} }
drm_free(dev->dma, sizeof(*dev->dma), DRM_MEM_DRIVER); drm_free(dev->dma, sizeof(*dev->dma), DRM_MEM_DRIVER);
dev->dma = NULL; dev->dma = NULL;
} }
/** /**
* Free a buffer. * Free a buffer.
* *
* \param dev DRM device. * \param dev DRM device.
* \param buf buffer to free. * \param buf buffer to free.
* *
* 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>
...@@ -37,20 +37,20 @@ ...@@ -37,20 +37,20 @@
/** No-op. */ /** No-op. */
int drm_adddraw(struct inode *inode, struct file *filp, int drm_adddraw(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
drm_draw_t draw; drm_draw_t draw;
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;
} }
/** No-op. */ /** No-op. */
int drm_rmdraw(struct inode *inode, struct file *filp, int drm_rmdraw(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
return 0; /* NOOP */ return 0; /* NOOP */
} }
此差异已折叠。
此差异已折叠。
/** /**
* \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,10 +43,11 @@ ...@@ -43,10 +43,11 @@
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. */
#endif #endif
return 1; return 1;
} }
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
...@@ -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>
...@@ -47,25 +46,25 @@ ...@@ -47,25 +46,25 @@
#else #else
/* define some dummy types for non AGP supporting kernels */ /* define some dummy types for non AGP supporting kernels */
struct no_agp_kern { struct no_agp_kern {
unsigned long aper_base; unsigned long aper_base;
unsigned long aper_size; unsigned long aper_size;
}; };
#define DRM_AGP_MEM int #define DRM_AGP_MEM int
#define DRM_AGP_KERN struct no_agp_kern #define DRM_AGP_KERN 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
...@@ -99,7 +98,7 @@ static __inline__ int mtrr_del (int reg, unsigned long base, ...@@ -99,7 +98,7 @@ static __inline__ int mtrr_del (int reg, unsigned long base,
#define DRM_GET_PRIV_WITH_RETURN(_priv, _filp) _priv = _filp->private_data #define DRM_GET_PRIV_WITH_RETURN(_priv, _filp) _priv = _filp->private_data
/** /**
* Get the pointer to the SAREA. * Get the pointer to the SAREA.
* *
* Searches the SAREA on the mapping lists and points drm_device::sarea to it. * Searches the SAREA on the mapping lists and points drm_device::sarea to it.
...@@ -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 )
...@@ -77,7 +77,7 @@ drm_dma_handle_t *drm_pci_alloc(drm_device_t * dev, size_t size, size_t align, ...@@ -77,7 +77,7 @@ drm_dma_handle_t *drm_pci_alloc(drm_device_t * dev, size_t size, size_t align,
dmah = kmalloc(sizeof(drm_dma_handle_t), GFP_KERNEL); dmah = kmalloc(sizeof(drm_dma_handle_t), GFP_KERNEL);
if (!dmah) if (!dmah)
return NULL; return NULL;
dmah->size = size; dmah->size = size;
dmah->vaddr = pci_alloc_consistent(dev->pdev, size, &dmah->busaddr); dmah->vaddr = pci_alloc_consistent(dev->pdev, size, &dmah->busaddr);
...@@ -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);
/*@}*/ /*@}*/
...@@ -234,4 +234,3 @@ ...@@ -234,4 +234,3 @@
{0x8086, 0x2592, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ {0x8086, 0x2592, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
{0x8086, 0x2772, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ {0x8086, 0x2772, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
{0, 0, 0} {0, 0, 0}
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
...@@ -39,4 +39,4 @@ typedef struct { ...@@ -39,4 +39,4 @@ typedef struct {
unsigned int offset, size; unsigned int offset, size;
} drm_sis_fb_t; } drm_sis_fb_t;
#endif /* __SIS_DRM_H__ */ #endif /* __SIS_DRM_H__ */
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册