Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
gpu
drm
nouveau
core
include
subdev
vm.h
Go to the documentation of this file.
1
/*
2
* Copyright 2010 Red Hat Inc.
3
*
4
* Permission is hereby granted, free of charge, to any person obtaining a
5
* copy of this software and associated documentation files (the "Software"),
6
* to deal in the Software without restriction, including without limitation
7
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
* and/or sell copies of the Software, and to permit persons to whom the
9
* Software is furnished to do so, subject to the following conditions:
10
*
11
* The above copyright notice and this permission notice shall be included in
12
* all copies or substantial portions of the Software.
13
*
14
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20
* OTHER DEALINGS IN THE SOFTWARE.
21
*
22
* Authors: Ben Skeggs
23
*/
24
25
#ifndef __NOUVEAU_VM_H__
26
#define __NOUVEAU_VM_H__
27
28
#include <
core/object.h
>
29
#include <
core/subdev.h
>
30
#include <
core/device.h
>
31
#include <
core/mm.h
>
32
33
struct
nouveau_vm_pgt
{
34
struct
nouveau_gpuobj
*
obj
[2];
35
u32
refcount
[2];
36
};
37
38
struct
nouveau_vm_pgd
{
39
struct
list_head
head
;
40
struct
nouveau_gpuobj
*
obj
;
41
};
42
43
struct
nouveau_gpuobj
;
44
struct
nouveau_mem
;
45
46
struct
nouveau_vma
{
47
struct
list_head
head
;
48
int
refcount
;
49
struct
nouveau_vm
*
vm
;
50
struct
nouveau_mm_node
*
node
;
51
u64
offset
;
52
u32
access
;
53
};
54
55
struct
nouveau_vm
{
56
struct
nouveau_vmmgr
*
vmm
;
57
struct
nouveau_mm
mm
;
58
int
refcount
;
59
60
struct
list_head
pgd_list
;
61
atomic_t
engref
[64];
//NVDEV_SUBDEV_NR];
62
63
struct
nouveau_vm_pgt
*
pgt
;
64
u32
fpde
;
65
u32
lpde
;
66
};
67
68
struct
nouveau_vmmgr
{
69
struct
nouveau_subdev
base
;
70
71
u64
limit
;
72
u8
dma_bits
;
73
u32
pgt_bits
;
74
u8
spg_shift
;
75
u8
lpg_shift
;
76
77
int
(*
create
)(
struct
nouveau_vmmgr
*,
u64
offset
,
u64
length
,
78
u64
mm_offset,
struct
nouveau_vm
**);
79
80
void
(*
map_pgt
)(
struct
nouveau_gpuobj
*pgd,
u32
pde,
81
struct
nouveau_gpuobj
*pgt[2]);
82
void
(*
map
)(
struct
nouveau_vma
*,
struct
nouveau_gpuobj
*,
83
struct
nouveau_mem
*,
u32
pte
,
u32
cnt
,
84
u64
phys
,
u64
delta
);
85
void
(*
map_sg
)(
struct
nouveau_vma
*,
struct
nouveau_gpuobj
*,
86
struct
nouveau_mem
*,
u32
pte
,
u32
cnt
,
dma_addr_t
*);
87
void
(*
unmap
)(
struct
nouveau_gpuobj
*pgt,
u32
pte
,
u32
cnt
);
88
void
(*
flush
)(
struct
nouveau_vm
*);
89
};
90
91
static
inline
struct
nouveau_vmmgr
*
92
nouveau_vmmgr
(
void
*obj)
93
{
94
return
(
void
*)nv_device(obj)->subdev[
NVDEV_SUBDEV_VM
];
95
}
96
97
#define nouveau_vmmgr_create(p,e,o,i,f,d) \
98
nouveau_subdev_create((p), (e), (o), 0, (i), (f), (d))
99
#define nouveau_vmmgr_destroy(p) \
100
nouveau_subdev_destroy(&(p)->base)
101
#define nouveau_vmmgr_init(p) \
102
nouveau_subdev_init(&(p)->base)
103
#define nouveau_vmmgr_fini(p,s) \
104
nouveau_subdev_fini(&(p)->base, (s))
105
106
#define _nouveau_vmmgr_dtor _nouveau_subdev_dtor
107
#define _nouveau_vmmgr_init _nouveau_subdev_init
108
#define _nouveau_vmmgr_fini _nouveau_subdev_fini
109
110
extern
struct
nouveau_oclass
nv04_vmmgr_oclass
;
111
extern
struct
nouveau_oclass
nv41_vmmgr_oclass
;
112
extern
struct
nouveau_oclass
nv44_vmmgr_oclass
;
113
extern
struct
nouveau_oclass
nv50_vmmgr_oclass
;
114
extern
struct
nouveau_oclass
nvc0_vmmgr_oclass
;
115
116
int
nv04_vm_create
(
struct
nouveau_vmmgr
*,
u64
,
u64
,
u64
,
117
struct
nouveau_vm
**);
118
void
nv04_vmmgr_dtor
(
struct
nouveau_object
*);
119
120
void
nv50_vm_flush_engine
(
struct
nouveau_subdev
*,
int
engine);
121
void
nvc0_vm_flush_engine
(
struct
nouveau_subdev
*,
u64
addr
,
int
type
);
122
123
/* nouveau_vm.c */
124
int
nouveau_vm_create
(
struct
nouveau_vmmgr
*,
u64
offset
,
u64
length
,
125
u64
mm_offset,
u32
block
,
struct
nouveau_vm
**);
126
int
nouveau_vm_new
(
struct
nouveau_device
*,
u64
offset
,
u64
length
,
127
u64
mm_offset,
struct
nouveau_vm
**);
128
int
nouveau_vm_ref
(
struct
nouveau_vm
*,
struct
nouveau_vm
**,
129
struct
nouveau_gpuobj
*pgd);
130
int
nouveau_vm_get
(
struct
nouveau_vm
*,
u64
size
,
u32
page_shift,
131
u32
access
,
struct
nouveau_vma
*);
132
void
nouveau_vm_put
(
struct
nouveau_vma
*);
133
void
nouveau_vm_map
(
struct
nouveau_vma
*,
struct
nouveau_mem
*);
134
void
nouveau_vm_map_at
(
struct
nouveau_vma
*,
u64
offset
,
struct
nouveau_mem
*);
135
void
nouveau_vm_unmap
(
struct
nouveau_vma
*);
136
void
nouveau_vm_unmap_at
(
struct
nouveau_vma
*,
u64
offset
,
u64
length
);
137
void
nouveau_vm_map_sg
(
struct
nouveau_vma
*,
u64
offset
,
u64
length
,
138
struct
nouveau_mem
*);
139
void
nouveau_vm_map_sg_table
(
struct
nouveau_vma
*vma,
u64
delta
,
u64
length
,
140
struct
nouveau_mem
*
mem
);
141
142
#endif
Generated on Thu Jan 10 2013 13:32:42 for Linux Kernel by
1.8.2