Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
d8762748
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 3 年多
通知
13
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
d8762748
编写于
11月 01, 2005
作者:
L
Linus Torvalds
浏览文件
操作
浏览文件
下载
差异文件
Merge master.kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6
Manual fixups for some clashes due to re-indenting.
上级
ce463370
a4e62fa0
变更
93
展开全部
隐藏空白更改
内联
并排
Showing
93 changed file
with
19273 addition
and
19144 deletion
+19273
-19144
drivers/char/drm/ati_pcigart.c
drivers/char/drm/ati_pcigart.c
+86
-66
drivers/char/drm/drm.h
drivers/char/drm/drm.h
+126
-169
drivers/char/drm/drmP.h
drivers/char/drm/drmP.h
+446
-440
drivers/char/drm/drm_agpsupport.c
drivers/char/drm/drm_agpsupport.c
+79
-71
drivers/char/drm/drm_auth.c
drivers/char/drm/drm_auth.c
+35
-33
drivers/char/drm/drm_bufs.c
drivers/char/drm/drm_bufs.c
+445
-446
drivers/char/drm/drm_context.c
drivers/char/drm/drm_context.c
+155
-153
drivers/char/drm/drm_dma.c
drivers/char/drm/drm_dma.c
+44
-43
drivers/char/drm/drm_drawable.c
drivers/char/drm/drm_drawable.c
+4
-4
drivers/char/drm/drm_drv.c
drivers/char/drm/drm_drv.c
+182
-179
drivers/char/drm/drm_fops.c
drivers/char/drm/drm_fops.c
+152
-144
drivers/char/drm/drm_init.c
drivers/char/drm/drm_init.c
+4
-3
drivers/char/drm/drm_ioc32.c
drivers/char/drm/drm_ioc32.c
+113
-112
drivers/char/drm/drm_ioctl.c
drivers/char/drm/drm_ioctl.c
+86
-82
drivers/char/drm/drm_irq.c
drivers/char/drm/drm_irq.c
+86
-83
drivers/char/drm/drm_lock.c
drivers/char/drm/drm_lock.c
+88
-89
drivers/char/drm/drm_memory.c
drivers/char/drm/drm_memory.c
+28
-26
drivers/char/drm/drm_memory.h
drivers/char/drm/drm_memory.h
+39
-34
drivers/char/drm/drm_memory_debug.h
drivers/char/drm/drm_memory_debug.h
+107
-117
drivers/char/drm/drm_os_linux.h
drivers/char/drm/drm_os_linux.h
+7
-10
drivers/char/drm/drm_pci.c
drivers/char/drm/drm_pci.c
+5
-5
drivers/char/drm/drm_pciids.h
drivers/char/drm/drm_pciids.h
+0
-1
drivers/char/drm/drm_proc.c
drivers/char/drm/drm_proc.c
+140
-132
drivers/char/drm/drm_sarea.h
drivers/char/drm/drm_sarea.h
+15
-15
drivers/char/drm/drm_scatter.c
drivers/char/drm/drm_scatter.c
+87
-96
drivers/char/drm/drm_stub.c
drivers/char/drm/drm_stub.c
+59
-53
drivers/char/drm/drm_vm.c
drivers/char/drm/drm_vm.c
+192
-173
drivers/char/drm/ffb_context.c
drivers/char/drm/ffb_context.c
+113
-117
drivers/char/drm/ffb_drv.c
drivers/char/drm/ffb_drv.c
+68
-71
drivers/char/drm/ffb_drv.h
drivers/char/drm/ffb_drv.h
+263
-170
drivers/char/drm/i810_dma.c
drivers/char/drm/i810_dma.c
+536
-551
drivers/char/drm/i810_drm.h
drivers/char/drm/i810_drm.h
+36
-39
drivers/char/drm/i810_drv.c
drivers/char/drm/i810_drv.c
+31
-32
drivers/char/drm/i810_drv.h
drivers/char/drm/i810_drv.h
+21
-20
drivers/char/drm/i830_dma.c
drivers/char/drm/i830_dma.c
+647
-668
drivers/char/drm/i830_drm.h
drivers/char/drm/i830_drm.h
+41
-49
drivers/char/drm/i830_drv.c
drivers/char/drm/i830_drv.c
+30
-32
drivers/char/drm/i830_drv.h
drivers/char/drm/i830_drv.h
+37
-46
drivers/char/drm/i830_irq.c
drivers/char/drm/i830_irq.c
+66
-71
drivers/char/drm/i915_dma.c
drivers/char/drm/i915_dma.c
+16
-16
drivers/char/drm/i915_drv.c
drivers/char/drm/i915_drv.c
+30
-34
drivers/char/drm/i915_drv.h
drivers/char/drm/i915_drv.h
+9
-7
drivers/char/drm/i915_ioc32.c
drivers/char/drm/i915_ioc32.c
+33
-31
drivers/char/drm/i915_mem.c
drivers/char/drm/i915_mem.c
+5
-3
drivers/char/drm/mga_dma.c
drivers/char/drm/mga_dma.c
+244
-267
drivers/char/drm/mga_drm.h
drivers/char/drm/mga_drm.h
+67
-75
drivers/char/drm/mga_drv.c
drivers/char/drm/mga_drv.c
+38
-42
drivers/char/drm/mga_drv.h
drivers/char/drm/mga_drv.h
+20
-25
drivers/char/drm/mga_ioc32.c
drivers/char/drm/mga_ioc32.c
+29
-31
drivers/char/drm/mga_irq.c
drivers/char/drm/mga_irq.c
+20
-22
drivers/char/drm/mga_state.c
drivers/char/drm/mga_state.c
+406
-450
drivers/char/drm/mga_ucode.h
drivers/char/drm/mga_ucode.h
+8035
-8035
drivers/char/drm/mga_warp.c
drivers/char/drm/mga_warp.c
+57
-63
drivers/char/drm/r128_cce.c
drivers/char/drm/r128_cce.c
+299
-297
drivers/char/drm/r128_drm.h
drivers/char/drm/r128_drm.h
+15
-17
drivers/char/drm/r128_drv.c
drivers/char/drm/r128_drv.c
+31
-32
drivers/char/drm/r128_drv.h
drivers/char/drm/r128_drv.h
+34
-39
drivers/char/drm/r128_ioc32.c
drivers/char/drm/r128_ioc32.c
+19
-16
drivers/char/drm/r128_irq.c
drivers/char/drm/r128_irq.c
+26
-27
drivers/char/drm/r128_state.c
drivers/char/drm/r128_state.c
+681
-705
drivers/char/drm/r300_cmdbuf.c
drivers/char/drm/r300_cmdbuf.c
+262
-240
drivers/char/drm/r300_reg.h
drivers/char/drm/r300_reg.h
+93
-99
drivers/char/drm/radeon_cp.c
drivers/char/drm/radeon_cp.c
+1280
-1203
drivers/char/drm/radeon_drm.h
drivers/char/drm/radeon_drm.h
+144
-142
drivers/char/drm/radeon_drv.c
drivers/char/drm/radeon_drv.c
+36
-33
drivers/char/drm/radeon_drv.h
drivers/char/drm/radeon_drv.h
+121
-79
drivers/char/drm/radeon_ioc32.c
drivers/char/drm/radeon_ioc32.c
+25
-26
drivers/char/drm/radeon_irq.c
drivers/char/drm/radeon_irq.c
+63
-64
drivers/char/drm/radeon_mem.c
drivers/char/drm/radeon_mem.c
+70
-78
drivers/char/drm/radeon_state.c
drivers/char/drm/radeon_state.c
+1257
-1216
drivers/char/drm/savage_bci.c
drivers/char/drm/savage_bci.c
+96
-93
drivers/char/drm/savage_drm.h
drivers/char/drm/savage_drm.h
+27
-26
drivers/char/drm/savage_drv.c
drivers/char/drm/savage_drv.c
+27
-32
drivers/char/drm/savage_drv.h
drivers/char/drm/savage_drv.h
+32
-29
drivers/char/drm/savage_state.c
drivers/char/drm/savage_state.c
+250
-235
drivers/char/drm/sis_drm.h
drivers/char/drm/sis_drm.h
+1
-1
drivers/char/drm/sis_drv.c
drivers/char/drm/sis_drv.c
+28
-33
drivers/char/drm/sis_drv.h
drivers/char/drm/sis_drv.h
+8
-5
drivers/char/drm/sis_ds.c
drivers/char/drm/sis_ds.c
+40
-42
drivers/char/drm/sis_ds.h
drivers/char/drm/sis_ds.h
+20
-20
drivers/char/drm/sis_mm.c
drivers/char/drm/sis_mm.c
+62
-65
drivers/char/drm/tdfx_drv.c
drivers/char/drm/tdfx_drv.c
+25
-27
drivers/char/drm/via_3d_reg.h
drivers/char/drm/via_3d_reg.h
+0
-1
drivers/char/drm/via_dma.c
drivers/char/drm/via_dma.c
+122
-137
drivers/char/drm/via_drm.h
drivers/char/drm/via_drm.h
+2
-2
drivers/char/drm/via_drv.c
drivers/char/drm/via_drv.c
+11
-11
drivers/char/drm/via_drv.h
drivers/char/drm/via_drv.h
+11
-11
drivers/char/drm/via_irq.c
drivers/char/drm/via_irq.c
+55
-51
drivers/char/drm/via_map.c
drivers/char/drm/via_map.c
+1
-3
drivers/char/drm/via_mm.c
drivers/char/drm/via_mm.c
+9
-8
drivers/char/drm/via_verifier.c
drivers/char/drm/via_verifier.c
+259
-224
drivers/char/drm/via_verifier.h
drivers/char/drm/via_verifier.h
+10
-12
drivers/char/drm/via_video.c
drivers/char/drm/via_video.c
+13
-17
未找到文件。
drivers/char/drm/ati_pcigart.c
浏览文件 @
d8762748
/**
* \file ati_pcigart.
h
* \file ati_pcigart.
c
* ATI PCI GART support
*
* \author Gareth Hughes <gareth@valinux.com>
...
...
@@ -52,85 +52,91 @@
# define ATI_MAX_PCIGART_PAGES 8192
/**< 32 MB aperture, 4K pages */
# 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
;
struct
page
*
page
;
int
i
;
DRM_DEBUG
(
"%s
\n
"
,
__FUNCTION__
);
DRM_DEBUG
(
"%s
\n
"
,
__FUNCTION__
);
address
=
__get_free_pages
(
GFP_KERNEL
,
ATI_PCIGART_TABLE_ORDER
);
if
(
address
==
0UL
)
{
address
=
__get_free_pages
(
GFP_KERNEL
,
ATI_PCIGART_TABLE_ORDER
);
if
(
address
==
0UL
)
{
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
);
SetPageReserved
(
page
);
SetPageReserved
(
page
);
}
DRM_DEBUG
(
"%s: returning 0x%08lx
\n
"
,
__FUNCTION__
,
address
);
DRM_DEBUG
(
"%s: returning 0x%08lx
\n
"
,
__FUNCTION__
,
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
;
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
);
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
,
unsigned
long
addr
,
dma_addr_t
bus_addr
)
int
drm_ati_pcigart_cleanup
(
drm_device_t
*
dev
,
drm_ati_pcigart_info
*
gart_info
)
{
drm_sg_mem_t
*
entry
=
dev
->
sg
;
unsigned
long
pages
;
int
i
;
/* we need to support large memory configurations */
if
(
!
entry
)
{
DRM_ERROR
(
"no scatter/gather memory!
\n
"
);
if
(
!
entry
)
{
DRM_ERROR
(
"no scatter/gather memory!
\n
"
);
return
0
;
}
if
(
bus_addr
)
{
pci_unmap_single
(
dev
->
pdev
,
bus_addr
,
ATI_PCIGART_TABLE_PAGES
*
PAGE_SIZE
,
PCI_DMA_TODEVICE
);
if
(
gart_info
->
bus_addr
)
{
if
(
gart_info
->
gart_table_location
==
DRM_ATI_GART_MAIN
)
{
pci_unmap_single
(
dev
->
pdev
,
gart_info
->
bus_addr
,
ATI_PCIGART_TABLE_PAGES
*
PAGE_SIZE
,
PCI_DMA_TODEVICE
);
}
pages
=
(
entry
->
pages
<=
ATI_MAX_PCIGART_PAGES
)
?
entry
->
pages
:
ATI_MAX_PCIGART_PAGES
;
pages
=
(
entry
->
pages
<=
ATI_MAX_PCIGART_PAGES
)
?
entry
->
pages
:
ATI_MAX_PCIGART_PAGES
;
for
(
i
=
0
;
i
<
pages
;
i
++
)
{
if
(
!
entry
->
busaddr
[
i
]
)
break
;
for
(
i
=
0
;
i
<
pages
;
i
++
)
{
if
(
!
entry
->
busaddr
[
i
])
break
;
pci_unmap_single
(
dev
->
pdev
,
entry
->
busaddr
[
i
],
PAGE_SIZE
,
PCI_DMA_TODEVICE
);
}
if
(
gart_info
->
gart_table_location
==
DRM_ATI_GART_MAIN
)
gart_info
->
bus_addr
=
0
;
}
if
(
addr
)
{
drm_ati_free_pcigart_table
(
addr
);
if
(
gart_info
->
gart_table_location
==
DRM_ATI_GART_MAIN
&&
gart_info
->
addr
)
{
drm_ati_free_pcigart_table
(
gart_info
->
addr
);
gart_info
->
addr
=
0
;
}
return
1
;
}
EXPORT_SYMBOL
(
drm_ati_pcigart_cleanup
);
int
drm_ati_pcigart_init
(
drm_device_t
*
dev
,
unsigned
long
*
addr
,
dma_addr_t
*
bus_addr
)
int
drm_ati_pcigart_init
(
drm_device_t
*
dev
,
drm_ati_pcigart_info
*
gart_info
)
{
drm_sg_mem_t
*
entry
=
dev
->
sg
;
unsigned
long
address
=
0
;
...
...
@@ -138,48 +144,57 @@ int drm_ati_pcigart_init( drm_device_t *dev,
u32
*
pci_gart
,
page_base
,
bus_address
=
0
;
int
i
,
j
,
ret
=
0
;
if
(
!
entry
)
{
DRM_ERROR
(
"no scatter/gather memory!
\n
"
);
if
(
!
entry
)
{
DRM_ERROR
(
"no scatter/gather memory!
\n
"
);
goto
done
;
}
address
=
drm_ati_alloc_pcigart_table
();
if
(
!
address
)
{
DRM_ERROR
(
"cannot allocate PCI GART page!
\n
"
);
goto
done
;
}
if
(
gart_info
->
gart_table_location
==
DRM_ATI_GART_MAIN
)
{
DRM_DEBUG
(
"PCI: no table in VRAM: using normal RAM
\n
"
);
if
(
!
dev
->
pdev
)
{
DRM_ERROR
(
"PCI device unknown!
\n
"
);
goto
done
;
}
address
=
drm_ati_alloc_pcigart_table
();
if
(
!
address
)
{
DRM_ERROR
(
"cannot allocate PCI GART page!
\n
"
);
goto
done
;
}
bus_address
=
pci_map_single
(
dev
->
pdev
,
(
void
*
)
address
,
ATI_PCIGART_TABLE_PAGES
*
PAGE_SIZE
,
PCI_DMA_TODEVICE
);
if
(
bus_address
==
0
)
{
DRM_ERROR
(
"unable to map PCIGART pages!
\n
"
);
drm_ati_free_pcigart_table
(
address
);
address
=
0
;
goto
done
;
if
(
!
dev
->
pdev
)
{
DRM_ERROR
(
"PCI device unknown!
\n
"
);
goto
done
;
}
bus_address
=
pci_map_single
(
dev
->
pdev
,
(
void
*
)
address
,
ATI_PCIGART_TABLE_PAGES
*
PAGE_SIZE
,
PCI_DMA_TODEVICE
);
if
(
bus_address
==
0
)
{
DRM_ERROR
(
"unable to map PCIGART pages!
\n
"
);
drm_ati_free_pcigart_table
(
address
);
address
=
0
;
goto
done
;
}
}
else
{
address
=
gart_info
->
addr
;
bus_address
=
gart_info
->
bus_addr
;
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
)
?
entry
->
pages
:
ATI_MAX_PCIGART_PAGES
;
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 */
entry
->
busaddr
[
i
]
=
pci_map_single
(
dev
->
pdev
,
page_address
(
entry
->
pagelist
[
i
]
),
PAGE_SIZE
,
PCI_DMA_TODEVICE
);
page_address
(
entry
->
pagelist
[
i
])
,
PAGE_SIZE
,
PCI_DMA_TODEVICE
);
if
(
entry
->
busaddr
[
i
]
==
0
)
{
DRM_ERROR
(
"unable to map PCIGART pages!
\n
"
);
drm_ati_pcigart_cleanup
(
dev
,
address
,
bus_address
);
DRM_ERROR
(
"unable to map PCIGART pages!
\n
"
);
drm_ati_pcigart_cleanup
(
dev
,
gart_info
);
address
=
0
;
bus_address
=
0
;
goto
done
;
...
...
@@ -187,7 +202,11 @@ int drm_ati_pcigart_init( drm_device_t *dev,
page_base
=
(
u32
)
entry
->
busaddr
[
i
];
for
(
j
=
0
;
j
<
(
PAGE_SIZE
/
ATI_PCIGART_PAGE_SIZE
);
j
++
)
{
*
pci_gart
++
=
cpu_to_le32
(
page_base
);
if
(
gart_info
->
is_pcie
)
*
pci_gart
=
(
cpu_to_le32
(
page_base
)
>>
8
)
|
0xc
;
else
*
pci_gart
=
cpu_to_le32
(
page_base
);
*
pci_gart
++
;
page_base
+=
ATI_PCIGART_PAGE_SIZE
;
}
}
...
...
@@ -200,9 +219,10 @@ int drm_ati_pcigart_init( drm_device_t *dev,
mb
();
#endif
done:
*
addr
=
address
;
*
bus_addr
=
bus_address
;
done:
gart_info
->
addr
=
address
;
gart_info
->
bus_addr
=
bus_address
;
return
ret
;
}
EXPORT_SYMBOL
(
drm_ati_pcigart_init
);
drivers/char/drm/drm.h
浏览文件 @
d8762748
/**
* \file drm.h
* \file drm.h
* Header for the Direct Rendering Manager
*
*
* \author Rickard E. (Rik) Faith <faith@valinux.com>
*
* \par Acknowledgments:
...
...
@@ -33,7 +33,6 @@
* OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef _DRM_H_
#define _DRM_H_
...
...
@@ -56,7 +55,7 @@
#define ioctl(a,b,c) xf86ioctl(a,b,c)
#else
#include <sys/ioccom.h>
#endif
/* __FreeBSD__ && xf86ioctl */
#endif
/* __FreeBSD__ && xf86ioctl */
#define DRM_IOCTL_NR(n) ((n) & 0xff)
#define DRM_IOC_VOID IOC_VOID
#define DRM_IOC_READ IOC_OUT
...
...
@@ -97,16 +96,14 @@
#define _DRM_LOCK_IS_CONT(lock) ((lock) & _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_context_t
;
typedef
unsigned
int
drm_drawable_t
;
typedef
unsigned
int
drm_magic_t
;
typedef
unsigned
int
drm_handle_t
;
typedef
unsigned
int
drm_context_t
;
typedef
unsigned
int
drm_drawable_t
;
typedef
unsigned
int
drm_magic_t
;
/**
* Cliprect.
*
*
* \warning: If you change this structure, make sure you change
* XF86DRIClipRectRec in the server as well
*
...
...
@@ -114,22 +111,21 @@ typedef unsigned int drm_magic_t;
* backwards-compatibility reasons.
*/
typedef
struct
drm_clip_rect
{
unsigned
short
x1
;
unsigned
short
y1
;
unsigned
short
x2
;
unsigned
short
y2
;
unsigned
short
x1
;
unsigned
short
y1
;
unsigned
short
x2
;
unsigned
short
y2
;
}
drm_clip_rect_t
;
/**
* Texture region,
*/
typedef
struct
drm_tex_region
{
unsigned
char
next
;
unsigned
char
prev
;
unsigned
char
in_use
;
unsigned
char
padding
;
unsigned
int
age
;
unsigned
char
next
;
unsigned
char
prev
;
unsigned
char
in_use
;
unsigned
char
padding
;
unsigned
int
age
;
}
drm_tex_region_t
;
/**
...
...
@@ -141,28 +137,26 @@ typedef struct drm_tex_region {
*/
typedef
struct
drm_hw_lock
{
__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_IOCTL_VERSION ioctl argument type.
*
*
* \sa drmGetVersion().
*/
typedef
struct
drm_version
{
int
version_major
;
/**< Major version */
int
version_minor
;
/**< Minor version */
int
version_patchlevel
;
/**< Patch level */
int
version_major
;
/**< Major version */
int
version_minor
;
/**< Minor version */
int
version_patchlevel
;
/**< Patch level */
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 */
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 */
char
__user
*
desc
;
/**< User-space buffer to hold desc */
char
__user
*
desc
;
/**< User-space buffer to hold desc */
}
drm_version_t
;
/**
* DRM_IOCTL_GET_UNIQUE ioctl argument type.
*
...
...
@@ -170,21 +164,18 @@ typedef struct drm_version {
*/
typedef
struct
drm_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
;
typedef
struct
drm_list
{
int
count
;
/**< Length of user-space structures */
drm_version_t
__user
*
version
;
int
count
;
/**< Length of user-space structures */
drm_version_t
__user
*
version
;
}
drm_list_t
;
typedef
struct
drm_block
{
int
unused
;
int
unused
;
}
drm_block_t
;
/**
* DRM_IOCTL_CONTROL ioctl argument type.
*
...
...
@@ -196,44 +187,40 @@ typedef struct drm_control {
DRM_RM_COMMAND
,
DRM_INST_HANDLER
,
DRM_UNINST_HANDLER
}
func
;
int
irq
;
}
func
;
int
irq
;
}
drm_control_t
;
/**
* Type of memory to map.
*/
typedef
enum
drm_map_type
{
_DRM_FRAME_BUFFER
=
0
,
/**< WC (no caching), no core dump */
_DRM_REGISTERS
=
1
,
/**< no caching, no core dump */
_DRM_SHM
=
2
,
/**< shared, cached */
_DRM_AGP
=
3
,
/**< AGP/GART */
_DRM_FRAME_BUFFER
=
0
,
/**< WC (no caching), no core dump */
_DRM_REGISTERS
=
1
,
/**< no caching, no core dump */
_DRM_SHM
=
2
,
/**< shared, cached */
_DRM_AGP
=
3
,
/**< AGP/GART */
_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
;
/**
* Memory mapping flags.
*/
typedef
enum
drm_map_flags
{
_DRM_RESTRICTED
=
0x01
,
/**< Cannot be mapped to user-virtual */
_DRM_READ_ONLY
=
0x02
,
_DRM_LOCKED
=
0x04
,
/**< shared, cached, locked */
_DRM_KERNEL
=
0x08
,
/**< kernel requires access */
_DRM_RESTRICTED
=
0x01
,
/**< Cannot be mapped to user-virtual */
_DRM_READ_ONLY
=
0x02
,
_DRM_LOCKED
=
0x04
,
/**< shared, cached, locked */
_DRM_KERNEL
=
0x08
,
/**< kernel requires access */
_DRM_WRITE_COMBINING
=
0x10
,
/**< use write-combining if available */
_DRM_CONTAINS_LOCK
=
0x20
,
/**< SHM page that contains lock */
_DRM_REMOVABLE
=
0x40
/**< Removable mapping */
_DRM_CONTAINS_LOCK
=
0x20
,
/**< SHM page that contains lock */
_DRM_REMOVABLE
=
0x40
/**< Removable mapping */
}
drm_map_flags_t
;
typedef
struct
drm_ctx_priv_map
{
unsigned
int
ctx_id
;
/**< Context requesting private mapping */
void
*
handle
;
/**< Handle of map */
unsigned
int
ctx_id
;
/**< Context requesting private mapping */
void
*
handle
;
/**< Handle of map */
}
drm_ctx_priv_map_t
;
/**
* DRM_IOCTL_GET_MAP, DRM_IOCTL_ADD_MAP and DRM_IOCTL_RM_MAP ioctls
* argument type.
...
...
@@ -241,30 +228,28 @@ typedef struct drm_ctx_priv_map {
* \sa drmAddMap().
*/
typedef
struct
drm_map
{
unsigned
long
offset
;
/**< Requested physical address (0 for SAREA)*/
unsigned
long
size
;
/**< Requested physical size (bytes) */
drm_map_type_t
type
;
/**< Type of memory to map */
unsigned
long
offset
;
/**< Requested physical address (0 for SAREA)*/
unsigned
long
size
;
/**< Requested physical size (bytes) */
drm_map_type_t
type
;
/**< Type of memory to map */
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 */
int
mtrr
;
/**< MTRR slot used */
/* Private data */
int
mtrr
;
/**< MTRR slot used */
/* Private data */
}
drm_map_t
;
/**
* DRM_IOCTL_GET_CLIENT ioctl argument type.
*/
typedef
struct
drm_client
{
int
idx
;
/**< Which client desired? */
int
auth
;
/**< Is client authenticated? */
unsigned
long
pid
;
/**< Process ID */
unsigned
long
uid
;
/**< User ID */
unsigned
long
magic
;
/**< Magic */
unsigned
long
iocs
;
/**< Ioctl count */
int
idx
;
/**< Which client desired? */
int
auth
;
/**< Is client authenticated? */
unsigned
long
pid
;
/**< Process ID */
unsigned
long
uid
;
/**< User ID */
unsigned
long
magic
;
/**< Magic */
unsigned
long
iocs
;
/**< Ioctl count */
}
drm_client_t
;
typedef
enum
{
_DRM_STAT_LOCK
,
_DRM_STAT_OPENS
,
...
...
@@ -282,63 +267,58 @@ typedef enum {
_DRM_STAT_DMA
,
/**< DMA */
_DRM_STAT_SPECIAL
,
/**< Special DMA (e.g., priority or polled) */
_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_IOCTL_GET_STATS ioctl argument type.
*/
typedef
struct
drm_stats
{
unsigned
long
count
;
struct
{
unsigned
long
value
;
unsigned
long
value
;
drm_stat_type_t
type
;
}
data
[
15
];
}
drm_stats_t
;
/**
* Hardware locking flags.
*/
typedef
enum
drm_lock_flags
{
_DRM_LOCK_READY
=
0x01
,
/**< Wait until hardware is ready for DMA */
_DRM_LOCK_QUIESCENT
=
0x02
,
/**< Wait until hardware quiescent */
_DRM_LOCK_FLUSH
=
0x04
,
/**< Flush this context's DMA queue first */
_DRM_LOCK_FLUSH_ALL
=
0x08
,
/**< Flush all DMA queues first */
/* These *HALT* flags aren't supported yet
-- they will be used to support the
full-screen DGA-like mode. */
_DRM_LOCK_READY
=
0x01
,
/**< Wait until hardware is ready for DMA */
_DRM_LOCK_QUIESCENT
=
0x02
,
/**< Wait until hardware quiescent */
_DRM_LOCK_FLUSH
=
0x04
,
/**< Flush this context's DMA queue first */
_DRM_LOCK_FLUSH_ALL
=
0x08
,
/**< Flush all DMA queues first */
/* These *HALT* flags aren't supported yet
-- they will be used to support the
full-screen DGA-like mode. */
_DRM_HALT_ALL_QUEUES
=
0x10
,
/**< Halt all current and future queues */
_DRM_HALT_CUR_QUEUES
=
0x20
/**< Halt all current queues */
}
drm_lock_flags_t
;
/**
* DRM_IOCTL_LOCK, DRM_IOCTL_UNLOCK and DRM_IOCTL_FINISH ioctl argument type.
*
*
* \sa drmGetLock() and drmUnlock().
*/
typedef
struct
drm_lock
{
int
context
;
int
context
;
drm_lock_flags_t
flags
;
}
drm_lock_t
;
/**
* DMA flags
*
* \warning
* \warning
* These values \e must match xf86drm.h.
*
* \sa drm_dma.
*/
typedef
enum
drm_dma_flags
{
/* Flags for DMA buffer dispatch */
_DRM_DMA_BLOCK
=
0x01
,
/**<
typedef
enum
drm_dma_flags
{
/* Flags for DMA buffer dispatch */
_DRM_DMA_BLOCK
=
0x01
,
/**<
* Block until buffer dispatched.
*
*
* \note The buffer may not yet have
* been processed by the hardware --
* getting a hardware lock with the
...
...
@@ -347,79 +327,73 @@ typedef enum drm_dma_flags {
* processed.
*/
_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 */
_DRM_DMA_WAIT
=
0x10
,
/**< Wait for free buffers */
_DRM_DMA_SMALLER_OK
=
0x20
,
/**< Smaller-than-requested buffers OK */
_DRM_DMA_LARGER_OK
=
0x40
/**< Larger-than-requested buffers OK */
/* Flags for DMA buffer request */
_DRM_DMA_WAIT
=
0x10
,
/**< Wait for free buffers */
_DRM_DMA_SMALLER_OK
=
0x20
,
/**< Smaller-than-requested buffers OK */
_DRM_DMA_LARGER_OK
=
0x40
/**< Larger-than-requested buffers OK */
}
drm_dma_flags_t
;
/**
* DRM_IOCTL_ADD_BUFS and DRM_IOCTL_MARK_BUFS ioctl argument type.
*
* \sa drmAddBufs().
*/
typedef
struct
drm_buf_desc
{
int
count
;
/**< Number of buffers of this size */
int
size
;
/**< Size in bytes */
int
low_mark
;
/**< Low water mark */
int
high_mark
;
/**< High water mark */
int
count
;
/**< Number of buffers of this size */
int
size
;
/**< Size in bytes */
int
low_mark
;
/**< Low water mark */
int
high_mark
;
/**< High water mark */
enum
{
_DRM_PAGE_ALIGN
=
0x01
,
/**< Align on page boundaries for DMA */
_DRM_AGP_BUFFER
=
0x02
,
/**< Buffer is in AGP space */
_DRM_SG_BUFFER
=
0x04
,
/**< Scatter/gather memory buffer */
_DRM_FB_BUFFER
=
0x08
/**< Buffer is in frame buffer */
}
flags
;
unsigned
long
agp_start
;
/**<
_DRM_PAGE_ALIGN
=
0x01
,
/**< Align on page boundaries for DMA */
_DRM_AGP_BUFFER
=
0x02
,
/**< Buffer is in AGP space */
_DRM_SG_BUFFER
=
0x04
,
/**< Scatter/gather memory buffer */
_DRM_FB_BUFFER
=
0x08
/**< Buffer is in frame buffer */
}
flags
;
unsigned
long
agp_start
;
/**<
* Start address of where the AGP buffers are
* in the AGP aperture
*/
}
drm_buf_desc_t
;
/**
* DRM_IOCTL_INFO_BUFS ioctl argument type.
*/
typedef
struct
drm_buf_info
{
int
count
;
/**< Entries in list */
int
count
;
/**< Entries in list */
drm_buf_desc_t
__user
*
list
;
}
drm_buf_info_t
;
/**
* DRM_IOCTL_FREE_BUFS ioctl argument type.
*/
typedef
struct
drm_buf_free
{
int
count
;
int
__user
*
list
;
int
count
;
int
__user
*
list
;
}
drm_buf_free_t
;
/**
* Buffer information
*
* \sa drm_buf_map.
*/
typedef
struct
drm_buf_pub
{
int
idx
;
/**< Index into the master buffer list */
int
total
;
/**< Buffer size */
int
used
;
/**< Amount of buffer in use (for DMA) */
void
__user
*
address
;
/**< Address of buffer */
int
idx
;
/**< Index into the master buffer list */
int
total
;
/**< Buffer size */
int
used
;
/**< Amount of buffer in use (for DMA) */
void
__user
*
address
;
/**< Address of buffer */
}
drm_buf_pub_t
;
/**
* DRM_IOCTL_MAP_BUFS ioctl argument type.
*/
typedef
struct
drm_buf_map
{
int
count
;
/**< Length of the buffer list */
void
__user
*
virtual
;
/**< Mmap'd area in user-virtual */
int
count
;
/**< Length of the buffer list */
void
__user
*
virtual
;
/**< Mmap'd area in user-virtual */
drm_buf_pub_t
__user
*
list
;
/**< Buffer information */
}
drm_buf_map_t
;
/**
* DRM_IOCTL_DMA ioctl argument type.
*
...
...
@@ -428,61 +402,55 @@ typedef struct drm_buf_map {
* \sa drmDMA().
*/
typedef
struct
drm_dma
{
int
context
;
/**< Context handle */
int
send_count
;
/**< Number of buffers to send */
int
__user
*
send_indices
;
/**< List of handles to buffers */
int
__user
*
send_sizes
;
/**< Lengths of data to send */
int
context
;
/**< Context handle */
int
send_count
;
/**< Number of buffers to send */
int
__user
*
send_indices
;
/**< List of handles to buffers */
int
__user
*
send_sizes
;
/**< Lengths of data to send */
drm_dma_flags_t
flags
;
/**< Flags */
int
request_count
;
/**< Number of buffers requested */
int
request_size
;
/**< Desired size for buffers */
int
__user
*
request_indices
;
/**< Buffer information */
int
__user
*
request_sizes
;
int
granted_count
;
/**< Number of buffers granted */
int
request_count
;
/**< Number of buffers requested */
int
request_size
;
/**< Desired size for buffers */
int
__user
*
request_indices
;
/**< Buffer information */
int
__user
*
request_sizes
;
int
granted_count
;
/**< Number of buffers granted */
}
drm_dma_t
;
typedef
enum
{
_DRM_CONTEXT_PRESERVED
=
0x01
,
_DRM_CONTEXT_2DONLY
=
0x02
_DRM_CONTEXT_2DONLY
=
0x02
}
drm_ctx_flags_t
;
/**
* DRM_IOCTL_ADD_CTX ioctl argument type.
*
* \sa drmCreateContext() and drmDestroyContext().
*/
typedef
struct
drm_ctx
{
drm_context_t
handle
;
drm_context_t
handle
;
drm_ctx_flags_t
flags
;
}
drm_ctx_t
;
/**
* DRM_IOCTL_RES_CTX ioctl argument type.
*/
typedef
struct
drm_ctx_res
{
int
count
;
drm_ctx_t
__user
*
contexts
;
int
count
;
drm_ctx_t
__user
*
contexts
;
}
drm_ctx_res_t
;
/**
* DRM_IOCTL_ADD_DRAW and DRM_IOCTL_RM_DRAW ioctl argument type.
*/
typedef
struct
drm_draw
{
drm_drawable_t
handle
;
drm_drawable_t
handle
;
}
drm_draw_t
;
/**
* DRM_IOCTL_GET_MAGIC and DRM_IOCTL_AUTH_MAGIC ioctl argument type.
*/
typedef
struct
drm_auth
{
drm_magic_t
magic
;
drm_magic_t
magic
;
}
drm_auth_t
;
/**
* DRM_IOCTL_IRQ_BUSID ioctl argument type.
*
...
...
@@ -495,24 +463,20 @@ typedef struct drm_irq_busid {
int
funcnum
;
/**< function number */
}
drm_irq_busid_t
;
typedef
enum
{
_DRM_VBLANK_ABSOLUTE
=
0x0
,
/**< Wait for specific vblank sequence number */
_DRM_VBLANK_RELATIVE
=
0x1
,
/**< Wait for given number of vblanks */
_DRM_VBLANK_SIGNAL
=
0x40000000
/**< Send signal instead of blocking */
_DRM_VBLANK_ABSOLUTE
=
0x0
,
/**< Wait for specific vblank sequence number */
_DRM_VBLANK_RELATIVE
=
0x1
,
/**< Wait for given number of vblanks */
_DRM_VBLANK_SIGNAL
=
0x40000000
/**< Send signal instead of blocking */
}
drm_vblank_seq_type_t
;
#define _DRM_VBLANK_FLAGS_MASK _DRM_VBLANK_SIGNAL
struct
drm_wait_vblank_request
{
drm_vblank_seq_type_t
type
;
unsigned
int
sequence
;
unsigned
long
signal
;
};
struct
drm_wait_vblank_reply
{
drm_vblank_seq_type_t
type
;
unsigned
int
sequence
;
...
...
@@ -520,7 +484,6 @@ struct drm_wait_vblank_reply {
long
tval_usec
;
};
/**
* DRM_IOCTL_WAIT_VBLANK ioctl argument type.
*
...
...
@@ -531,7 +494,6 @@ typedef union drm_wait_vblank {
struct
drm_wait_vblank_reply
reply
;
}
drm_wait_vblank_t
;
/**
* DRM_IOCTL_AGP_ENABLE ioctl argument type.
*
...
...
@@ -541,7 +503,6 @@ typedef struct drm_agp_mode {
unsigned
long
mode
;
/**< AGP mode */
}
drm_agp_mode_t
;
/**
* DRM_IOCTL_AGP_ALLOC and DRM_IOCTL_AGP_FREE ioctls argument type.
*
...
...
@@ -550,22 +511,20 @@ typedef struct drm_agp_mode {
typedef
struct
drm_agp_buffer
{
unsigned
long
size
;
/**< In bytes -- will round to page boundary */
unsigned
long
handle
;
/**< Used for binding / unbinding */
unsigned
long
type
;
/**< Type of memory to allocate */
unsigned
long
physical
;
/**< Physical used by i810 */
unsigned
long
type
;
/**< Type of memory to allocate */
unsigned
long
physical
;
/**< Physical used by i810 */
}
drm_agp_buffer_t
;
/**
* DRM_IOCTL_AGP_BIND and DRM_IOCTL_AGP_UNBIND ioctls argument type.
*
* \sa drmAgpBind() and drmAgpUnbind().
*/
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 */
}
drm_agp_binding_t
;
/**
* DRM_IOCTL_AGP_INFO ioctl argument type.
*
...
...
@@ -574,20 +533,19 @@ typedef struct drm_agp_binding {
* drmAgpVendorId() and drmAgpDeviceId().
*/
typedef
struct
drm_agp_info
{
int
agp_version_major
;
int
agp_version_minor
;
unsigned
long
mode
;
unsigned
long
aperture_base
;
/* physical address */
unsigned
long
aperture_size
;
/* bytes */
unsigned
long
memory_allowed
;
/* bytes */
unsigned
long
memory_used
;
/* PCI information */
int
agp_version_major
;
int
agp_version_minor
;
unsigned
long
mode
;
unsigned
long
aperture_base
;
/* physical address */
unsigned
long
aperture_size
;
/* bytes */
unsigned
long
memory_allowed
;
/* bytes */
unsigned
long
memory_used
;
/* PCI information */
unsigned
short
id_vendor
;
unsigned
short
id_device
;
}
drm_agp_info_t
;
/**
* DRM_IOCTL_SG_ALLOC ioctl argument type.
*/
...
...
@@ -606,7 +564,6 @@ typedef struct drm_set_version {
int
drm_dd_minor
;
}
drm_set_version_t
;
#define DRM_IOCTL_BASE 'd'
#define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr)
#define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type)
...
...
drivers/char/drm/drmP.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/drm_agpsupport.c
浏览文件 @
d8762748
/**
* \file drm_agpsupport.h
* \file drm_agpsupport.h
* DRM support for AGP/GART backend
*
*
* \author Rickard E. (Rik) Faith <faith@valinux.com>
* \author Gareth Hughes <gareth@valinux.com>
*/
...
...
@@ -48,30 +48,31 @@
* 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.
*/
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
)
return
-
EINVAL
;
kern
=
&
dev
->
agp
->
agp_info
;
kern
=
&
dev
->
agp
->
agp_info
;
info
->
agp_version_major
=
kern
->
version
.
major
;
info
->
agp_version_minor
=
kern
->
version
.
minor
;
info
->
mode
=
kern
->
mode
;
info
->
aperture_base
=
kern
->
aper_base
;
info
->
aperture_size
=
kern
->
aper_size
*
1024
*
1024
;
info
->
memory_allowed
=
kern
->
max_memory
<<
PAGE_SHIFT
;
info
->
memory_used
=
kern
->
current_memory
<<
PAGE_SHIFT
;
info
->
id_vendor
=
kern
->
device
->
vendor
;
info
->
id_device
=
kern
->
device
->
device
;
info
->
mode
=
kern
->
mode
;
info
->
aperture_base
=
kern
->
aper_base
;
info
->
aperture_size
=
kern
->
aper_size
*
1024
*
1024
;
info
->
memory_allowed
=
kern
->
max_memory
<<
PAGE_SHIFT
;
info
->
memory_used
=
kern
->
current_memory
<<
PAGE_SHIFT
;
info
->
id_vendor
=
kern
->
device
->
vendor
;
info
->
id_device
=
kern
->
device
->
device
;
return
0
;
}
EXPORT_SYMBOL
(
drm_agp_info
);
int
drm_agp_info_ioctl
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm_file_t
*
priv
=
filp
->
private_data
;
drm_device_t
*
dev
=
priv
->
head
->
dev
;
...
...
@@ -81,7 +82,7 @@ int drm_agp_info_ioctl(struct inode *inode, struct file *filp,
err
=
drm_agp_info
(
dev
,
&
info
);
if
(
err
)
return
err
;
if
(
copy_to_user
((
drm_agp_info_t
__user
*
)
arg
,
&
info
,
sizeof
(
info
)))
return
-
EFAULT
;
return
0
;
...
...
@@ -91,12 +92,12 @@ int drm_agp_info_ioctl(struct inode *inode, struct file *filp,
* Acquire the AGP device.
*
* \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
* \c agp_backend_acquire.
*/
int
drm_agp_acquire
(
drm_device_t
*
dev
)
int
drm_agp_acquire
(
drm_device_t
*
dev
)
{
if
(
!
dev
->
agp
)
return
-
ENODEV
;
...
...
@@ -107,6 +108,7 @@ int drm_agp_acquire(drm_device_t *dev)
dev
->
agp
->
acquired
=
1
;
return
0
;
}
EXPORT_SYMBOL
(
drm_agp_acquire
);
/**
...
...
@@ -125,8 +127,8 @@ int drm_agp_acquire_ioctl(struct inode *inode, struct file *filp,
unsigned
int
cmd
,
unsigned
long
arg
)
{
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,
*
* 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
)
return
-
EINVAL
;
...
...
@@ -145,6 +147,7 @@ int drm_agp_release(drm_device_t *dev)
dev
->
agp
->
acquired
=
0
;
return
0
;
}
EXPORT_SYMBOL
(
drm_agp_release
);
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_device_t
*
dev
=
priv
->
head
->
dev
;
return
drm_agp_release
(
dev
);
}
/**
* Enable the AGP bus.
*
*
* \param dev DRM device that has previously acquired AGP.
* \param mode Requested AGP mode.
* \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,
* Verifies the AGP device has been acquired but not enabled, and calls
* \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
)
return
-
EINVAL
;
dev
->
agp
->
mode
=
mode
.
mode
;
dev
->
agp
->
mode
=
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
;
return
0
;
}
EXPORT_SYMBOL
(
drm_agp_enable
);
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_device_t
*
dev
=
priv
->
head
->
dev
;
drm_agp_mode_t
mode
;
if
(
copy_from_user
(
&
mode
,
(
drm_agp_mode_t
__user
*
)
arg
,
sizeof
(
mode
)))
return
-
EFAULT
;
...
...
@@ -201,20 +204,20 @@ int drm_agp_enable_ioctl(struct inode *inode, struct file *filp,
* \param cmd command.
* \param arg pointer to a drm_agp_buffer structure.
* \return zero on success or a negative number on failure.
*
*
* 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.
*/
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_device_t
*
dev
=
priv
->
head
->
dev
;
drm_file_t
*
priv
=
filp
->
private_data
;
drm_device_t
*
dev
=
priv
->
head
->
dev
;
drm_agp_buffer_t
request
;
drm_agp_mem_t
*
entry
;
DRM_AGP_MEM
*
memory
;
unsigned
long
pages
;
u32
type
;
drm_agp_mem_t
*
entry
;
DRM_AGP_MEM
*
memory
;
unsigned
long
pages
;
u32
type
;
drm_agp_buffer_t
__user
*
argp
=
(
void
__user
*
)
arg
;
if
(
!
dev
->
agp
||
!
dev
->
agp
->
acquired
)
...
...
@@ -224,7 +227,7 @@ int drm_agp_alloc(struct inode *inode, struct file *filp,
if
(
!
(
entry
=
drm_alloc
(
sizeof
(
*
entry
),
DRM_MEM_AGPLISTS
)))
return
-
ENOMEM
;
memset
(
entry
,
0
,
sizeof
(
*
entry
));
memset
(
entry
,
0
,
sizeof
(
*
entry
));
pages
=
(
request
.
size
+
PAGE_SIZE
-
1
)
/
PAGE_SIZE
;
type
=
(
u32
)
request
.
type
;
...
...
@@ -234,21 +237,21 @@ int drm_agp_alloc(struct inode *inode, struct file *filp,
return
-
ENOMEM
;
}
entry
->
handle
=
(
unsigned
long
)
memory
->
key
+
1
;
entry
->
memory
=
memory
;
entry
->
bound
=
0
;
entry
->
pages
=
pages
;
entry
->
prev
=
NULL
;
entry
->
next
=
dev
->
agp
->
memory
;
entry
->
handle
=
(
unsigned
long
)
memory
->
key
+
1
;
entry
->
memory
=
memory
;
entry
->
bound
=
0
;
entry
->
pages
=
pages
;
entry
->
prev
=
NULL
;
entry
->
next
=
dev
->
agp
->
memory
;
if
(
dev
->
agp
->
memory
)
dev
->
agp
->
memory
->
prev
=
entry
;
dev
->
agp
->
memory
=
entry
;
request
.
handle
=
entry
->
handle
;
request
.
handle
=
entry
->
handle
;
request
.
physical
=
memory
->
physical
;
if
(
copy_to_user
(
argp
,
&
request
,
sizeof
(
request
)))
{
dev
->
agp
->
memory
=
entry
->
next
;
dev
->
agp
->
memory
=
entry
->
next
;
dev
->
agp
->
memory
->
prev
=
NULL
;
drm_free_agp
(
memory
,
pages
);
drm_free
(
entry
,
sizeof
(
*
entry
),
DRM_MEM_AGPLISTS
);
...
...
@@ -263,11 +266,11 @@ int drm_agp_alloc(struct inode *inode, struct file *filp,
* \param dev DRM device structure.
* \param handle AGP memory handle.
* \return pointer to the drm_agp_mem structure associated with \p 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
,
unsigned
long
handle
)
static
drm_agp_mem_t
*
drm_agp_lookup_entry
(
drm_device_t
*
dev
,
unsigned
long
handle
)
{
drm_agp_mem_t
*
entry
;
...
...
@@ -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.
*/
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_device_t
*
dev
=
priv
->
head
->
dev
;
drm_file_t
*
priv
=
filp
->
private_data
;
drm_device_t
*
dev
=
priv
->
head
->
dev
;
drm_agp_binding_t
request
;
drm_agp_mem_t
*
entry
;
drm_agp_mem_t
*
entry
;
int
ret
;
if
(
!
dev
->
agp
||
!
dev
->
agp
->
acquired
)
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
;
if
(
!
(
entry
=
drm_agp_lookup_entry
(
dev
,
request
.
handle
)))
return
-
EINVAL
;
...
...
@@ -309,7 +313,7 @@ int drm_agp_unbind(struct inode *inode, struct file *filp,
return
-
EINVAL
;
ret
=
drm_unbind_agp
(
entry
->
memory
);
if
(
ret
==
0
)
entry
->
bound
=
0
;
entry
->
bound
=
0
;
return
ret
;
}
...
...
@@ -327,18 +331,19 @@ int drm_agp_unbind(struct inode *inode, struct file *filp,
* it to bind_agp() function.
*/
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_device_t
*
dev
=
priv
->
head
->
dev
;
drm_file_t
*
priv
=
filp
->
private_data
;
drm_device_t
*
dev
=
priv
->
head
->
dev
;
drm_agp_binding_t
request
;
drm_agp_mem_t
*
entry
;
int
retcode
;
int
page
;
drm_agp_mem_t
*
entry
;
int
retcode
;
int
page
;
if
(
!
dev
->
agp
||
!
dev
->
agp
->
acquired
)
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
;
if
(
!
(
entry
=
drm_agp_lookup_entry
(
dev
,
request
.
handle
)))
return
-
EINVAL
;
...
...
@@ -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.
*/
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_device_t
*
dev
=
priv
->
head
->
dev
;
drm_file_t
*
priv
=
filp
->
private_data
;
drm_device_t
*
dev
=
priv
->
head
->
dev
;
drm_agp_buffer_t
request
;
drm_agp_mem_t
*
entry
;
drm_agp_mem_t
*
entry
;
if
(
!
dev
->
agp
||
!
dev
->
agp
->
acquired
)
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
;
if
(
!
(
entry
=
drm_agp_lookup_entry
(
dev
,
request
.
handle
)))
return
-
EINVAL
;
...
...
@@ -403,9 +409,9 @@ int drm_agp_free(struct inode *inode, struct file *filp,
* \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
)))
return
NULL
;
...
...
@@ -433,13 +439,14 @@ drm_agp_head_t *drm_agp_init(drm_device_t *dev)
}
/** 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
);
}
/** Calls agp_free_memory() */
int
drm_agp_free_memory
(
DRM_AGP_MEM
*
handle
)
int
drm_agp_free_memory
(
DRM_AGP_MEM
*
handle
)
{
if
(
!
handle
)
return
0
;
...
...
@@ -448,20 +455,21 @@ int drm_agp_free_memory(DRM_AGP_MEM *handle)
}
/** 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
)
return
-
EINVAL
;
return
agp_bind_memory
(
handle
,
start
);
}
EXPORT_SYMBOL
(
drm_agp_bind_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
)
return
-
EINVAL
;
return
agp_unbind_memory
(
handle
);
}
#endif
/* __OS_HAS_AGP */
#endif
/* __OS_HAS_AGP */
drivers/char/drm/drm_auth.c
浏览文件 @
d8762748
/**
* \file drm_auth.
h
* \file drm_auth.
c
* IOCTLs for authentication
*
* \author Rickard E. (Rik) Faith <faith@valinux.com>
...
...
@@ -46,7 +46,7 @@
*/
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)
* the one with matching magic number, while holding the drm_device::struct_sem
* 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
;
int
hash
=
drm_hash_magic
(
magic
);
int
hash
=
drm_hash_magic
(
magic
);
down
(
&
dev
->
struct_sem
);
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)
/**
* Adds a magic number.
*
*
* \param dev DRM device.
* \param priv file private data.
* \param magic magic number.
...
...
@@ -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
* 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_DEBUG
(
"%d
\n
"
,
magic
);
hash
=
drm_hash_magic
(
magic
);
entry
=
drm_alloc
(
sizeof
(
*
entry
),
DRM_MEM_MAGIC
);
if
(
!
entry
)
return
-
ENOMEM
;
hash
=
drm_hash_magic
(
magic
);
entry
=
drm_alloc
(
sizeof
(
*
entry
),
DRM_MEM_MAGIC
);
if
(
!
entry
)
return
-
ENOMEM
;
memset
(
entry
,
0
,
sizeof
(
*
entry
));
entry
->
magic
=
magic
;
entry
->
priv
=
priv
;
entry
->
next
=
NULL
;
entry
->
priv
=
priv
;
entry
->
next
=
NULL
;
down
(
&
dev
->
struct_sem
);
if
(
dev
->
magiclist
[
hash
].
tail
)
{
dev
->
magiclist
[
hash
].
tail
->
next
=
entry
;
dev
->
magiclist
[
hash
].
tail
=
entry
;
dev
->
magiclist
[
hash
].
tail
=
entry
;
}
else
{
dev
->
magiclist
[
hash
].
head
=
entry
;
dev
->
magiclist
[
hash
].
tail
=
entry
;
dev
->
magiclist
[
hash
].
head
=
entry
;
dev
->
magiclist
[
hash
].
tail
=
entry
;
}
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)
/**
* Remove a magic number.
*
*
* \param dev DRM device.
* \param magic magic number.
*
* Searches and unlinks the entry in drm_device::magiclist with the magic
* 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
*
pt
;
int
hash
;
int
hash
;
DRM_DEBUG
(
"%d
\n
"
,
magic
);
hash
=
drm_hash_magic
(
magic
);
...
...
@@ -171,21 +172,22 @@ static int drm_remove_magic(drm_device_t *dev, drm_magic_t magic)
* 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
DEFINE_SPINLOCK
(
lock
);
drm_file_t
*
priv
=
filp
->
private_data
;
drm_device_t
*
dev
=
priv
->
head
->
dev
;
drm_auth_t
auth
;
drm_file_t
*
priv
=
filp
->
private_data
;
drm_device_t
*
dev
=
priv
->
head
->
dev
;
drm_auth_t
auth
;
/* Find unique magic */
/* Find unique magic */
if
(
priv
->
magic
)
{
auth
.
magic
=
priv
->
magic
;
}
else
{
do
{
spin_lock
(
&
lock
);
if
(
!
sequence
)
++
sequence
;
/* reserve 0 */
if
(
!
sequence
)
++
sequence
;
/* reserve 0 */
auth
.
magic
=
sequence
++
;
spin_unlock
(
&
lock
);
}
while
(
drm_find_file
(
dev
,
auth
.
magic
));
...
...
@@ -194,7 +196,7 @@ int drm_getmagic(struct inode *inode, struct file *filp,
}
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
0
;
}
...
...
@@ -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.
*/
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_device_t
*
dev
=
priv
->
head
->
dev
;
drm_auth_t
auth
;
drm_file_t
*
file
;
drm_file_t
*
priv
=
filp
->
private_data
;
drm_device_t
*
dev
=
priv
->
head
->
dev
;
drm_auth_t
auth
;
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
;
DRM_DEBUG
(
"%u
\n
"
,
auth
.
magic
);
if
((
file
=
drm_find_file
(
dev
,
auth
.
magic
)))
{
...
...
drivers/char/drm/drm_bufs.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/drm_context.c
浏览文件 @
d8762748
/**
* \file drm_context.
h
* \file drm_context.
c
* IOCTLs for generic contexts
*
*
* \author Rickard E. (Rik) Faith <faith@valinux.com>
* \author Gareth Hughes <gareth@valinux.com>
*/
...
...
@@ -56,25 +56,26 @@
* in drm_device::context_sareas, while holding the drm_device::struct_sem
* 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
(
!
dev
->
ctx_bitmap
)
goto
failed
;
if
(
ctx_handle
<
0
)
goto
failed
;
if
(
!
dev
->
ctx_bitmap
)
goto
failed
;
if
(
ctx_handle
<
DRM_MAX_CTXBITMAP
)
{
if
(
ctx_handle
<
DRM_MAX_CTXBITMAP
)
{
down
(
&
dev
->
struct_sem
);
clear_bit
(
ctx_handle
,
dev
->
ctx_bitmap
);
clear_bit
(
ctx_handle
,
dev
->
ctx_bitmap
);
dev
->
context_sareas
[
ctx_handle
]
=
NULL
;
up
(
&
dev
->
struct_sem
);
return
;
}
failed:
DRM_ERROR
(
"Attempt to free invalid context handle: %d
\n
"
,
ctx_handle
);
return
;
failed:
DRM_ERROR
(
"Attempt to free invalid context handle: %d
\n
"
,
ctx_handle
);
return
;
}
/**
/**
* Context bitmap allocation.
*
* \param dev DRM device.
...
...
@@ -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::struct_sem lock.
*/
static
int
drm_ctxbitmap_next
(
drm_device_t
*
dev
)
static
int
drm_ctxbitmap_next
(
drm_device_t
*
dev
)
{
int
bit
;
if
(
!
dev
->
ctx_bitmap
)
return
-
1
;
if
(
!
dev
->
ctx_bitmap
)
return
-
1
;
down
(
&
dev
->
struct_sem
);
bit
=
find_first_zero_bit
(
dev
->
ctx_bitmap
,
DRM_MAX_CTXBITMAP
);
if
(
bit
<
DRM_MAX_CTXBITMAP
)
{
set_bit
(
bit
,
dev
->
ctx_bitmap
);
DRM_DEBUG
(
"drm_ctxbitmap_next bit : %d
\n
"
,
bit
);
if
((
bit
+
1
)
>
dev
->
max_context
)
{
dev
->
max_context
=
(
bit
+
1
);
if
(
dev
->
context_sareas
)
{
bit
=
find_first_zero_bit
(
dev
->
ctx_bitmap
,
DRM_MAX_CTXBITMAP
);
if
(
bit
<
DRM_MAX_CTXBITMAP
)
{
set_bit
(
bit
,
dev
->
ctx_bitmap
);
DRM_DEBUG
(
"drm_ctxbitmap_next bit : %d
\n
"
,
bit
);
if
((
bit
+
1
)
>
dev
->
max_context
)
{
dev
->
max_context
=
(
bit
+
1
);
if
(
dev
->
context_sareas
)
{
drm_map_t
**
ctx_sareas
;
ctx_sareas
=
drm_realloc
(
dev
->
context_sareas
,
(
dev
->
max_context
-
1
)
*
sizeof
(
*
dev
->
context_sareas
),
dev
->
max_context
*
sizeof
(
*
dev
->
context_sareas
),
DRM_MEM_MAPS
);
if
(
!
ctx_sareas
)
{
(
dev
->
max_context
-
1
)
*
sizeof
(
*
dev
->
context_sareas
),
dev
->
max_context
*
sizeof
(
*
dev
->
context_sareas
),
DRM_MEM_MAPS
);
if
(
!
ctx_sareas
)
{
clear_bit
(
bit
,
dev
->
ctx_bitmap
);
up
(
&
dev
->
struct_sem
);
return
-
1
;
...
...
@@ -115,11 +120,11 @@ static int drm_ctxbitmap_next( drm_device_t *dev )
dev
->
context_sareas
[
bit
]
=
NULL
;
}
else
{
/* max_context == 1 at this point */
dev
->
context_sareas
=
drm_alloc
(
dev
->
max_context
*
sizeof
(
*
dev
->
context_sareas
),
DRM_MEM_MAPS
);
if
(
!
dev
->
context_sareas
)
{
dev
->
context_sareas
=
drm_alloc
(
dev
->
max_context
*
sizeof
(
*
dev
->
context_sareas
),
DRM_MEM_MAPS
);
if
(
!
dev
->
context_sareas
)
{
clear_bit
(
bit
,
dev
->
ctx_bitmap
);
up
(
&
dev
->
struct_sem
);
return
-
1
;
...
...
@@ -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
* 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
temp
;
int
temp
;
down
(
&
dev
->
struct_sem
);
dev
->
ctx_bitmap
=
(
unsigned
long
*
)
drm_alloc
(
PAGE_SIZE
,
DRM_MEM_CTXBITMAP
);
if
(
dev
->
ctx_bitmap
==
NULL
)
{
dev
->
ctx_bitmap
=
(
unsigned
long
*
)
drm_alloc
(
PAGE_SIZE
,
DRM_MEM_CTXBITMAP
);
if
(
dev
->
ctx_bitmap
==
NULL
)
{
up
(
&
dev
->
struct_sem
);
return
-
ENOMEM
;
}
memset
(
(
void
*
)
dev
->
ctx_bitmap
,
0
,
PAGE_SIZE
);
memset
(
(
void
*
)
dev
->
ctx_bitmap
,
0
,
PAGE_SIZE
);
dev
->
context_sareas
=
NULL
;
dev
->
max_context
=
-
1
;
up
(
&
dev
->
struct_sem
);
for
(
i
=
0
;
i
<
DRM_RESERVED_CONTEXTS
;
i
++
)
{
temp
=
drm_ctxbitmap_next
(
dev
);
DRM_DEBUG
(
"drm_ctxbitmap_init : %d
\n
"
,
temp
);
for
(
i
=
0
;
i
<
DRM_RESERVED_CONTEXTS
;
i
++
)
{
temp
=
drm_ctxbitmap_next
(
dev
);
DRM_DEBUG
(
"drm_ctxbitmap_init : %d
\n
"
,
temp
);
}
return
0
;
...
...
@@ -175,14 +180,14 @@ int drm_ctxbitmap_init( drm_device_t *dev )
* Frees drm_device::ctx_bitmap and drm_device::context_sareas, while holding
* 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
);
if
(
dev
->
context_sareas
)
drm_free
(
dev
->
context_sareas
,
sizeof
(
*
dev
->
context_sareas
)
*
dev
->
max_context
,
DRM_MEM_MAPS
);
drm_free
(
(
void
*
)
dev
->
ctx_bitmap
,
PAGE_SIZE
,
DRM_MEM_CTXBITMAP
);
if
(
dev
->
context_sareas
)
drm_free
(
dev
->
context_sareas
,
sizeof
(
*
dev
->
context_sareas
)
*
dev
->
max_context
,
DRM_MEM_MAPS
);
drm_free
(
(
void
*
)
dev
->
ctx_bitmap
,
PAGE_SIZE
,
DRM_MEM_CTXBITMAP
);
up
(
&
dev
->
struct_sem
);
}
...
...
@@ -194,7 +199,7 @@ void drm_ctxbitmap_cleanup( drm_device_t *dev )
/**
* Get per-context SAREA.
*
*
* \param inode device inode.
* \param filp file pointer.
* \param cmd command.
...
...
@@ -205,10 +210,10 @@ void drm_ctxbitmap_cleanup( drm_device_t *dev )
* returns its handle.
*/
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_device_t
*
dev
=
priv
->
head
->
dev
;
drm_file_t
*
priv
=
filp
->
private_data
;
drm_device_t
*
dev
=
priv
->
head
->
dev
;
drm_ctx_priv_map_t
__user
*
argp
=
(
void
__user
*
)
arg
;
drm_ctx_priv_map_t
request
;
drm_map_t
*
map
;
...
...
@@ -218,7 +223,8 @@ int drm_getsareactx(struct inode *inode, struct file *filp,
return
-
EFAULT
;
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
);
return
-
EINVAL
;
}
...
...
@@ -226,17 +232,17 @@ int drm_getsareactx(struct inode *inode, struct file *filp,
map
=
dev
->
context_sareas
[
request
.
ctx_id
];
up
(
&
dev
->
struct_sem
);
request
.
handle
=
0
;
list_for_each_entry
(
_entry
,
&
dev
->
maplist
->
head
,
head
)
{
request
.
handle
=
NULL
;
list_for_each_entry
(
_entry
,
&
dev
->
maplist
->
head
,
head
)
{
if
(
_entry
->
map
==
map
)
{
request
.
handle
=
(
void
*
)(
unsigned
long
)
_entry
->
user_token
;
request
.
handle
=
(
void
*
)(
unsigned
long
)
_entry
->
user_token
;
break
;
}
}
if
(
request
.
handle
==
0
)
if
(
request
.
handle
==
NULL
)
return
-
EINVAL
;
if
(
copy_to_user
(
argp
,
&
request
,
sizeof
(
request
)))
return
-
EFAULT
;
return
0
;
...
...
@@ -244,7 +250,7 @@ int drm_getsareactx(struct inode *inode, struct file *filp,
/**
* Set per-context SAREA.
*
*
* \param inode device inode.
* \param filp file pointer.
* \param cmd command.
...
...
@@ -255,37 +261,37 @@ int drm_getsareactx(struct inode *inode, struct file *filp,
* drm_device::context_sareas with it.
*/
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_device_t
*
dev
=
priv
->
head
->
dev
;
drm_file_t
*
priv
=
filp
->
private_data
;
drm_device_t
*
dev
=
priv
->
head
->
dev
;
drm_ctx_priv_map_t
request
;
drm_map_t
*
map
=
NULL
;
drm_map_list_t
*
r_list
=
NULL
;
struct
list_head
*
list
;
if
(
copy_from_user
(
&
request
,
(
drm_ctx_priv_map_t
__user
*
)
arg
,
sizeof
(
request
)))
(
drm_ctx_priv_map_t
__user
*
)
arg
,
sizeof
(
request
)))
return
-
EFAULT
;
down
(
&
dev
->
struct_sem
);
list_for_each
(
list
,
&
dev
->
maplist
->
head
)
{
r_list
=
list_entry
(
list
,
drm_map_list_t
,
head
);
if
(
r_list
->
map
&&
r_list
->
user_token
==
(
unsigned
long
)
request
.
handle
)
&&
r_list
->
user_token
==
(
unsigned
long
)
request
.
handle
)
goto
found
;
}
bad:
bad:
up
(
&
dev
->
struct_sem
);
return
-
EINVAL
;
found:
found:
map
=
r_list
->
map
;
if
(
!
map
)
goto
bad
;
if
(
!
map
)
goto
bad
;
if
(
dev
->
max_context
<
0
)
goto
bad
;
if
(
request
.
ctx_id
>=
(
unsigned
)
dev
->
max_context
)
if
(
request
.
ctx_id
>=
(
unsigned
)
dev
->
max_context
)
goto
bad
;
dev
->
context_sareas
[
request
.
ctx_id
]
=
map
;
up
(
&
dev
->
struct_sem
);
...
...
@@ -308,22 +314,21 @@ int drm_setsareactx(struct inode *inode, struct file *filp,
*
* 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
)
)
{
DRM_ERROR
(
"Reentering -- FIXME
\n
"
);
return
-
EBUSY
;
}
if
(
test_and_set_bit
(
0
,
&
dev
->
context_flag
))
{
DRM_ERROR
(
"Reentering -- FIXME
\n
"
);
return
-
EBUSY
;
}
DRM_DEBUG
(
"Context switch from %d to %d
\n
"
,
old
,
new
);
DRM_DEBUG
(
"Context switch from %d to %d
\n
"
,
old
,
new
);
if
(
new
==
dev
->
last_context
)
{
clear_bit
(
0
,
&
dev
->
context_flag
);
return
0
;
}
if
(
new
==
dev
->
last_context
)
{
clear_bit
(
0
,
&
dev
->
context_flag
);
return
0
;
}
return
0
;
return
0
;
}
/**
...
...
@@ -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
* 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_switch
=
jiffies
;
dev
->
last_context
=
new
;
/* PRE/POST: This is the _only_ writer. */
dev
->
last_switch
=
jiffies
;
if
(
!
_DRM_LOCK_IS_HELD
(
dev
->
lock
.
hw_lock
->
lock
)
)
{
DRM_ERROR
(
"Lock isn't held after context switch
\n
"
);
}
if
(
!
_DRM_LOCK_IS_HELD
(
dev
->
lock
.
hw_lock
->
lock
)
)
{
DRM_ERROR
(
"Lock isn't held after context switch
\n
"
);
}
/* If a context switch is ever initiated
when the kernel holds the lock, release
that lock here. */
clear_bit
(
0
,
&
dev
->
context_flag
);
wake_up
(
&
dev
->
context_wait
);
/* If a context switch is ever initiated
when the kernel holds the lock, release
that lock here. */
clear_bit
(
0
,
&
dev
->
context_flag
);
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 )
* \param arg user argument pointing to a drm_ctx_res structure.
* \return zero on success or a negative number on failure.
*/
int
drm_resctx
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
int
drm_resctx
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm_ctx_res_t
res
;
drm_ctx_t
__user
*
argp
=
(
void
__user
*
)
arg
;
drm_ctx_t
ctx
;
int
i
;
if
(
copy_from_user
(
&
res
,
argp
,
sizeof
(
res
)
)
)
if
(
copy_from_user
(
&
res
,
argp
,
sizeof
(
res
))
)
return
-
EFAULT
;
if
(
res
.
count
>=
DRM_RESERVED_CONTEXTS
)
{
memset
(
&
ctx
,
0
,
sizeof
(
ctx
)
);
for
(
i
=
0
;
i
<
DRM_RESERVED_CONTEXTS
;
i
++
)
{
if
(
res
.
count
>=
DRM_RESERVED_CONTEXTS
)
{
memset
(
&
ctx
,
0
,
sizeof
(
ctx
)
);
for
(
i
=
0
;
i
<
DRM_RESERVED_CONTEXTS
;
i
++
)
{
ctx
.
handle
=
i
;
if
(
copy_to_user
(
&
res
.
contexts
[
i
],
&
ctx
,
sizeof
(
ctx
)
)
)
if
(
copy_to_user
(
&
res
.
contexts
[
i
],
&
ctx
,
sizeof
(
ctx
)))
return
-
EFAULT
;
}
}
res
.
count
=
DRM_RESERVED_CONTEXTS
;
if
(
copy_to_user
(
argp
,
&
res
,
sizeof
(
res
)
)
)
if
(
copy_to_user
(
argp
,
&
res
,
sizeof
(
res
))
)
return
-
EFAULT
;
return
0
;
}
...
...
@@ -402,58 +406,57 @@ int drm_resctx( struct inode *inode, struct file *filp,
*
* Get a new handle for the context and copy to userspace.
*/
int
drm_addctx
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
int
drm_addctx
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm_file_t
*
priv
=
filp
->
private_data
;
drm_device_t
*
dev
=
priv
->
head
->
dev
;
drm_ctx_list_t
*
ctx_entry
;
drm_ctx_list_t
*
ctx_entry
;
drm_ctx_t
__user
*
argp
=
(
void
__user
*
)
arg
;
drm_ctx_t
ctx
;
if
(
copy_from_user
(
&
ctx
,
argp
,
sizeof
(
ctx
)
)
)
if
(
copy_from_user
(
&
ctx
,
argp
,
sizeof
(
ctx
))
)
return
-
EFAULT
;
ctx
.
handle
=
drm_ctxbitmap_next
(
dev
);
if
(
ctx
.
handle
==
DRM_KERNEL_CONTEXT
)
{
/* Skip kernel's context and get a new one. */
ctx
.
handle
=
drm_ctxbitmap_next
(
dev
);
ctx
.
handle
=
drm_ctxbitmap_next
(
dev
);
if
(
ctx
.
handle
==
DRM_KERNEL_CONTEXT
)
{
/* Skip kernel's context and get a new one. */
ctx
.
handle
=
drm_ctxbitmap_next
(
dev
);
}
DRM_DEBUG
(
"%d
\n
"
,
ctx
.
handle
);
if
(
ctx
.
handle
==
-
1
)
{
DRM_DEBUG
(
"Not enough free contexts.
\n
"
);
/* Should this return -EBUSY instead? */
DRM_DEBUG
(
"%d
\n
"
,
ctx
.
handle
);
if
(
ctx
.
handle
==
-
1
)
{
DRM_DEBUG
(
"Not enough free contexts.
\n
"
);
/* Should this return -EBUSY instead? */
return
-
ENOMEM
;
}
if
(
ctx
.
handle
!=
DRM_KERNEL_CONTEXT
)
{
if
(
ctx
.
handle
!=
DRM_KERNEL_CONTEXT
)
{
if
(
dev
->
driver
->
context_ctor
)
dev
->
driver
->
context_ctor
(
dev
,
ctx
.
handle
);
}
ctx_entry
=
drm_alloc
(
sizeof
(
*
ctx_entry
),
DRM_MEM_CTXLIST
);
if
(
!
ctx_entry
)
{
ctx_entry
=
drm_alloc
(
sizeof
(
*
ctx_entry
),
DRM_MEM_CTXLIST
);
if
(
!
ctx_entry
)
{
DRM_DEBUG
(
"out of memory
\n
"
);
return
-
ENOMEM
;
}
INIT_LIST_HEAD
(
&
ctx_entry
->
head
);
INIT_LIST_HEAD
(
&
ctx_entry
->
head
);
ctx_entry
->
handle
=
ctx
.
handle
;
ctx_entry
->
tag
=
priv
;
down
(
&
dev
->
ctxlist_sem
);
list_add
(
&
ctx_entry
->
head
,
&
dev
->
ctxlist
->
head
);
down
(
&
dev
->
ctxlist_sem
);
list_add
(
&
ctx_entry
->
head
,
&
dev
->
ctxlist
->
head
);
++
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
0
;
}
int
drm_modctx
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
int
drm_modctx
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
/* This does nothing */
return
0
;
...
...
@@ -468,19 +471,19 @@ int drm_modctx( struct inode *inode, struct file *filp,
* \param arg user argument pointing to a drm_ctx structure.
* \return zero on success or a negative number on failure.
*/
int
drm_getctx
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
int
drm_getctx
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm_ctx_t
__user
*
argp
=
(
void
__user
*
)
arg
;
drm_ctx_t
ctx
;
if
(
copy_from_user
(
&
ctx
,
argp
,
sizeof
(
ctx
)
)
)
if
(
copy_from_user
(
&
ctx
,
argp
,
sizeof
(
ctx
))
)
return
-
EFAULT
;
/* This is 0, because we don't handle any context flags */
ctx
.
flags
=
0
;
if
(
copy_to_user
(
argp
,
&
ctx
,
sizeof
(
ctx
)
)
)
if
(
copy_to_user
(
argp
,
&
ctx
,
sizeof
(
ctx
))
)
return
-
EFAULT
;
return
0
;
}
...
...
@@ -496,18 +499,18 @@ int drm_getctx( struct inode *inode, struct file *filp,
*
* Calls context_switch().
*/
int
drm_switchctx
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
int
drm_switchctx
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm_file_t
*
priv
=
filp
->
private_data
;
drm_device_t
*
dev
=
priv
->
head
->
dev
;
drm_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
;
DRM_DEBUG
(
"%d
\n
"
,
ctx
.
handle
);
return
drm_context_switch
(
dev
,
dev
->
last_context
,
ctx
.
handle
);
DRM_DEBUG
(
"%d
\n
"
,
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,
*
* Calls context_switch_complete().
*/
int
drm_newctx
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
int
drm_newctx
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm_file_t
*
priv
=
filp
->
private_data
;
drm_device_t
*
dev
=
priv
->
head
->
dev
;
drm_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
;
DRM_DEBUG
(
"%d
\n
"
,
ctx
.
handle
);
drm_context_switch_complete
(
dev
,
ctx
.
handle
);
DRM_DEBUG
(
"%d
\n
"
,
ctx
.
handle
);
drm_context_switch_complete
(
dev
,
ctx
.
handle
);
return
0
;
}
...
...
@@ -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.
*/
int
drm_rmctx
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
int
drm_rmctx
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm_file_t
*
priv
=
filp
->
private_data
;
drm_device_t
*
dev
=
priv
->
head
->
dev
;
drm_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
;
DRM_DEBUG
(
"%d
\n
"
,
ctx
.
handle
);
if
(
ctx
.
handle
==
DRM_KERNEL_CONTEXT
+
1
)
{
DRM_DEBUG
(
"%d
\n
"
,
ctx
.
handle
);
if
(
ctx
.
handle
==
DRM_KERNEL_CONTEXT
+
1
)
{
priv
->
remove_auth_on_close
=
1
;
}
if
(
ctx
.
handle
!=
DRM_KERNEL_CONTEXT
)
{
if
(
ctx
.
handle
!=
DRM_KERNEL_CONTEXT
)
{
if
(
dev
->
driver
->
context_dtor
)
dev
->
driver
->
context_dtor
(
dev
,
ctx
.
handle
);
drm_ctxbitmap_free
(
dev
,
ctx
.
handle
);
drm_ctxbitmap_free
(
dev
,
ctx
.
handle
);
}
down
(
&
dev
->
ctxlist_sem
);
if
(
!
list_empty
(
&
dev
->
ctxlist
->
head
)
)
{
down
(
&
dev
->
ctxlist_sem
);
if
(
!
list_empty
(
&
dev
->
ctxlist
->
head
)
)
{
drm_ctx_list_t
*
pos
,
*
n
;
list_for_each_entry_safe
(
pos
,
n
,
&
dev
->
ctxlist
->
head
,
head
)
{
if
(
pos
->
handle
==
ctx
.
handle
)
{
list_del
(
&
pos
->
head
);
drm_free
(
pos
,
sizeof
(
*
pos
),
DRM_MEM_CTXLIST
);
list_for_each_entry_safe
(
pos
,
n
,
&
dev
->
ctxlist
->
head
,
head
)
{
if
(
pos
->
handle
==
ctx
.
handle
)
{
list_del
(
&
pos
->
head
);
drm_free
(
pos
,
sizeof
(
*
pos
),
DRM_MEM_CTXLIST
);
--
dev
->
ctx_count
;
}
}
}
up
(
&
dev
->
ctxlist_sem
);
up
(
&
dev
->
ctxlist_sem
);
return
0
;
}
/*@}*/
drivers/char/drm/drm_dma.c
浏览文件 @
d8762748
/**
* \file drm_dma.
h
* \file drm_dma.
c
* DMA IOCTL and function support
*
* \author Rickard E. (Rik) Faith <faith@valinux.com>
...
...
@@ -37,23 +37,23 @@
/**
* Initialize the DMA data.
*
*
* \param dev DRM device.
* \return zero on success or a negative value on failure.
*
* 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
;
dev
->
dma
=
drm_alloc
(
sizeof
(
*
dev
->
dma
),
DRM_MEM_DRIVER
);
if
(
!
dev
->
dma
)
dev
->
dma
=
drm_alloc
(
sizeof
(
*
dev
->
dma
),
DRM_MEM_DRIVER
);
if
(
!
dev
->
dma
)
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
]));
return
0
;
...
...
@@ -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
* 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
;
int
i
,
j
;
drm_device_dma_t
*
dma
=
dev
->
dma
;
int
i
,
j
;
if
(
!
dma
)
return
;
if
(
!
dma
)
return
;
/* Clear dma buffers */
/* Clear dma buffers */
for
(
i
=
0
;
i
<=
DRM_MAX_ORDER
;
i
++
)
{
if
(
dma
->
bufs
[
i
].
seg_count
)
{
DRM_DEBUG
(
"order %d: buf_count = %d,"
...
...
@@ -85,64 +86,63 @@ void drm_dma_takedown(drm_device_t *dev)
for
(
j
=
0
;
j
<
dma
->
bufs
[
i
].
seg_count
;
j
++
)
{
if
(
dma
->
bufs
[
i
].
seglist
[
j
])
{
drm_free_pages
(
dma
->
bufs
[
i
].
seglist
[
j
],
dma
->
bufs
[
i
].
page_order
,
DRM_MEM_DMA
);
dma
->
bufs
[
i
].
page_order
,
DRM_MEM_DMA
);
}
}
drm_free
(
dma
->
bufs
[
i
].
seglist
,
dma
->
bufs
[
i
].
seg_count
*
sizeof
(
*
dma
->
bufs
[
0
].
seglist
),
DRM_MEM_SEGS
);
dma
->
bufs
[
i
].
seg_count
*
sizeof
(
*
dma
->
bufs
[
0
].
seglist
),
DRM_MEM_SEGS
);
}
if
(
dma
->
bufs
[
i
].
buf_count
)
{
for
(
j
=
0
;
j
<
dma
->
bufs
[
i
].
buf_count
;
j
++
)
{
if
(
dma
->
bufs
[
i
].
buf_count
)
{
for
(
j
=
0
;
j
<
dma
->
bufs
[
i
].
buf_count
;
j
++
)
{
if
(
dma
->
bufs
[
i
].
buflist
[
j
].
dev_private
)
{
drm_free
(
dma
->
bufs
[
i
].
buflist
[
j
].
dev_private
,
dma
->
bufs
[
i
].
buflist
[
j
].
dev_priv_size
,
DRM_MEM_BUFS
);
drm_free
(
dma
->
bufs
[
i
].
buflist
[
j
].
dev_private
,
dma
->
bufs
[
i
].
buflist
[
j
].
dev_priv_size
,
DRM_MEM_BUFS
);
}
}
drm_free
(
dma
->
bufs
[
i
].
buflist
,
dma
->
bufs
[
i
].
buf_count
*
sizeof
(
*
dma
->
bufs
[
0
].
buflist
),
DRM_MEM_BUFS
);
drm_free
(
dma
->
bufs
[
i
].
buflist
,
dma
->
bufs
[
i
].
buf_count
*
sizeof
(
*
dma
->
bufs
[
0
].
buflist
),
DRM_MEM_BUFS
);
}
}
if
(
dma
->
buflist
)
{
drm_free
(
dma
->
buflist
,
dma
->
buf_count
*
sizeof
(
*
dma
->
buflist
),
DRM_MEM_BUFS
);
dma
->
buf_count
*
sizeof
(
*
dma
->
buflist
),
DRM_MEM_BUFS
);
}
if
(
dma
->
pagelist
)
{
drm_free
(
dma
->
pagelist
,
dma
->
page_count
*
sizeof
(
*
dma
->
pagelist
),
DRM_MEM_PAGES
);
dma
->
page_count
*
sizeof
(
*
dma
->
pagelist
),
DRM_MEM_PAGES
);
}
drm_free
(
dev
->
dma
,
sizeof
(
*
dev
->
dma
),
DRM_MEM_DRIVER
);
dev
->
dma
=
NULL
;
}
/**
* Free a buffer.
*
* \param dev DRM device.
* \param buf buffer to free.
*
*
* 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
->
pending
=
0
;
buf
->
filp
=
NULL
;
buf
->
used
=
0
;
buf
->
waiting
=
0
;
buf
->
pending
=
0
;
buf
->
filp
=
NULL
;
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
);
}
}
...
...
@@ -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.
*/
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
;
int
i
;
int
i
;
if
(
!
dma
)
return
;
if
(
!
dma
)
return
;
for
(
i
=
0
;
i
<
dma
->
buf_count
;
i
++
)
{
if
(
dma
->
buflist
[
i
]
->
filp
==
filp
)
{
switch
(
dma
->
buflist
[
i
]
->
list
)
{
...
...
@@ -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
);
drivers/char/drm/drm_drawable.c
浏览文件 @
d8762748
/**
* \file drm_drawable.
h
* \file drm_drawable.
c
* IOCTLs for drawables
*
* \author Rickard E. (Rik) Faith <faith@valinux.com>
...
...
@@ -37,20 +37,20 @@
/** No-op. */
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
;
draw
.
handle
=
0
;
/* NOOP */
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
0
;
}
/** No-op. */
int
drm_rmdraw
(
struct
inode
*
inode
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
unsigned
int
cmd
,
unsigned
long
arg
)
{
return
0
;
/* NOOP */
}
drivers/char/drm/drm_drv.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/drm_fops.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/drm_init.c
浏览文件 @
d8762748
/**
* \file drm_init.
h
* \file drm_init.
c
* Setup/Cleanup for DRM
*
* \author Rickard E. (Rik) Faith <faith@valinux.com>
...
...
@@ -43,10 +43,11 @@
int
drm_cpu_valid
(
void
)
{
#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
#if defined(__sparc__) && !defined(__sparc_v9__)
return
0
;
/* No cmpxchg before v9 sparc. */
return
0
;
/* No cmpxchg before v9 sparc. */
#endif
return
1
;
}
drivers/char/drm/drm_ioc32.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/drm_ioctl.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/drm_irq.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/drm_lock.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/drm_memory.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/drm_memory.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/drm_memory_debug.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/drm_os_linux.h
浏览文件 @
d8762748
...
...
@@ -3,7 +3,6 @@
* OS abstraction macros.
*/
#include <linux/interrupt.h>
/* For task queue support */
#include <linux/delay.h>
...
...
@@ -47,25 +46,25 @@
#else
/* define some dummy types for non AGP supporting kernels */
struct
no_agp_kern
{
unsigned
long
aper_base
;
unsigned
long
aper_size
;
unsigned
long
aper_base
;
unsigned
long
aper_size
;
};
#define DRM_AGP_MEM int
#define DRM_AGP_KERN struct no_agp_kern
#endif
#if !(__OS_HAS_MTRR)
static
__inline__
int
mtrr_add
(
unsigned
long
base
,
unsigned
long
size
,
unsigned
int
type
,
char
increment
)
static
__inline__
int
mtrr_add
(
unsigned
long
base
,
unsigned
long
size
,
unsigned
int
type
,
char
increment
)
{
return
-
ENODEV
;
}
static
__inline__
int
mtrr_del
(
int
reg
,
unsigned
long
base
,
unsigned
long
size
)
static
__inline__
int
mtrr_del
(
int
reg
,
unsigned
long
base
,
unsigned
long
size
)
{
return
-
ENODEV
;
}
#define MTRR_TYPE_WRCOMB 1
#endif
...
...
@@ -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
/**
/**
* Get the pointer to the SAREA.
*
* Searches the SAREA on the mapping lists and points drm_device::sarea to it.
...
...
@@ -143,7 +142,5 @@ do { \
remove_wait_queue(&(queue), &entry); \
} while (0)
#define DRM_WAKEUP( queue ) wake_up_interruptible( queue )
#define DRM_INIT_WAITQUEUE( queue ) init_waitqueue_head( queue )
drivers/char/drm/drm_pci.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/drm_pciids.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/drm_proc.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/drm_sarea.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/drm_scatter.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/drm_stub.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/drm_vm.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/ffb_context.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/ffb_drv.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/ffb_drv.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/i810_dma.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/i810_drm.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/i810_drv.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/i810_drv.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/i830_dma.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/i830_drm.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/i830_drv.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/i830_drv.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/i830_irq.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/i915_dma.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/i915_drv.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/i915_drv.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/i915_ioc32.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/i915_mem.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/mga_dma.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/mga_drm.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/mga_drv.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/mga_drv.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/mga_ioc32.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/mga_irq.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/mga_state.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/mga_ucode.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/mga_warp.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/r128_cce.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/r128_drm.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/r128_drv.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/r128_drv.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/r128_ioc32.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/r128_irq.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/r128_state.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/r300_cmdbuf.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/r300_reg.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/radeon_cp.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/radeon_drm.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/radeon_drv.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/radeon_drv.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/radeon_ioc32.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/radeon_irq.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/radeon_mem.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/radeon_state.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/savage_bci.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/savage_drm.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/savage_drv.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/savage_drv.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/savage_state.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/sis_drm.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/sis_drv.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/sis_drv.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/sis_ds.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/sis_ds.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/sis_mm.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/tdfx_drv.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/via_3d_reg.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/via_dma.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/via_drm.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/via_drv.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/via_drv.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/via_irq.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/via_map.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/via_mm.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/via_verifier.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/via_verifier.h
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
drivers/char/drm/via_video.c
浏览文件 @
d8762748
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录