Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
6de8a748
Commit
6de8a748
authored
Oct 25, 2011
by
Daniel Vetter
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
drm/sis: track user->memblock mapping with idr
Signed-off-by:
Daniel Vetter
<
daniel.vetter@ffwll.ch
>
parent
77ee8f38
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
51 additions
and
14 deletions
+51
-14
drivers/gpu/drm/sis/sis_drv.c
drivers/gpu/drm/sis/sis_drv.c
+4
-0
drivers/gpu/drm/sis/sis_drv.h
drivers/gpu/drm/sis/sis_drv.h
+2
-0
drivers/gpu/drm/sis/sis_mm.c
drivers/gpu/drm/sis/sis_mm.c
+43
-14
drivers/gpu/drm/via/via_map.c
drivers/gpu/drm/via/via_map.c
+2
-0
No files found.
drivers/gpu/drm/sis/sis_drv.c
View file @
6de8a748
...
...
@@ -48,6 +48,7 @@ static int sis_driver_load(struct drm_device *dev, unsigned long chipset)
dev
->
dev_private
=
(
void
*
)
dev_priv
;
dev_priv
->
chipset
=
chipset
;
idr_init
(
&
dev
->
object_name_idr
);
ret
=
drm_sman_init
(
&
dev_priv
->
sman
,
2
,
12
,
8
);
if
(
ret
)
kfree
(
dev_priv
);
...
...
@@ -60,6 +61,9 @@ static int sis_driver_unload(struct drm_device *dev)
drm_sis_private_t
*
dev_priv
=
dev
->
dev_private
;
drm_sman_takedown
(
&
dev_priv
->
sman
);
idr_remove_all
(
&
dev_priv
->
object_idr
);
idr_destroy
(
&
dev_priv
->
object_idr
);
kfree
(
dev_priv
);
return
0
;
...
...
drivers/gpu/drm/sis/sis_drv.h
View file @
6de8a748
...
...
@@ -60,6 +60,8 @@ typedef struct drm_sis_private {
int
agp_initialized
;
unsigned
long
vram_offset
;
unsigned
long
agp_offset
;
/** Mapping of userspace keys to mm objects */
struct
idr
object_idr
;
}
drm_sis_private_t
;
extern
int
sis_idle
(
struct
drm_device
*
dev
);
...
...
drivers/gpu/drm/sis/sis_mm.c
View file @
6de8a748
...
...
@@ -125,7 +125,7 @@ static int sis_drm_alloc(struct drm_device *dev, struct drm_file *file,
{
drm_sis_private_t
*
dev_priv
=
dev
->
dev_private
;
drm_sis_mem_t
*
mem
=
data
;
int
retval
=
0
;
int
retval
=
0
,
user_key
;
struct
drm_memblock_item
*
item
;
struct
sis_file_private
*
file_priv
=
file
->
driver_priv
;
...
...
@@ -141,23 +141,44 @@ static int sis_drm_alloc(struct drm_device *dev, struct drm_file *file,
mem
->
size
=
(
mem
->
size
+
SIS_MM_ALIGN_MASK
)
>>
SIS_MM_ALIGN_SHIFT
;
item
=
drm_sman_alloc
(
&
dev_priv
->
sman
,
pool
,
mem
->
size
,
0
,
0
);
if
(
!
item
)
{
retval
=
-
ENOMEM
;
goto
fail_alloc
;
}
if
(
item
)
{
list_add
(
&
item
->
owner_list
,
&
file_priv
->
obj_list
);
mem
->
offset
=
((
pool
==
0
)
?
dev_priv
->
vram_offset
:
dev_priv
->
agp_offset
)
+
(
item
->
mm
->
offset
(
item
->
mm
,
item
->
mm_info
)
<<
SIS_MM_ALIGN_SHIFT
);
mem
->
free
=
item
->
user_hash
.
key
;
mem
->
size
=
mem
->
size
<<
SIS_MM_ALIGN_SHIFT
;
}
else
{
mem
->
offset
=
0
;
mem
->
size
=
0
;
mem
->
free
=
0
;
again:
if
(
idr_pre_get
(
&
dev_priv
->
object_idr
,
GFP_KERNEL
)
==
0
)
{
retval
=
-
ENOMEM
;
goto
fail_idr
;
}
retval
=
idr_get_new_above
(
&
dev_priv
->
object_idr
,
item
,
1
,
&
user_key
);
if
(
retval
==
-
EAGAIN
)
goto
again
;
if
(
retval
)
goto
fail_idr
;
list_add
(
&
item
->
owner_list
,
&
file_priv
->
obj_list
);
mutex_unlock
(
&
dev
->
struct_mutex
);
mem
->
offset
=
((
pool
==
0
)
?
dev_priv
->
vram_offset
:
dev_priv
->
agp_offset
)
+
(
item
->
mm
->
offset
(
item
->
mm
,
item
->
mm_info
)
<<
SIS_MM_ALIGN_SHIFT
);
mem
->
free
=
user_key
;
mem
->
size
=
mem
->
size
<<
SIS_MM_ALIGN_SHIFT
;
return
0
;
fail_idr:
drm_sman_free
(
item
);
fail_alloc:
mutex_unlock
(
&
dev
->
struct_mutex
);
mem
->
offset
=
0
;
mem
->
size
=
0
;
mem
->
free
=
0
;
DRM_DEBUG
(
"alloc %d, size = %d, offset = %d
\n
"
,
pool
,
mem
->
size
,
mem
->
offset
);
...
...
@@ -168,10 +189,18 @@ static int sis_drm_free(struct drm_device *dev, void *data, struct drm_file *fil
{
drm_sis_private_t
*
dev_priv
=
dev
->
dev_private
;
drm_sis_mem_t
*
mem
=
data
;
struct
drm_memblock_item
*
obj
;
int
ret
;
mutex_lock
(
&
dev
->
struct_mutex
);
ret
=
drm_sman_free_key
(
&
dev_priv
->
sman
,
mem
->
free
);
obj
=
idr_find
(
&
dev_priv
->
object_idr
,
mem
->
free
);
if
(
obj
==
NULL
)
{
mutex_unlock
(
&
dev
->
struct_mutex
);
return
-
EINVAL
;
}
idr_remove
(
&
dev_priv
->
object_idr
,
mem
->
free
);
drm_sman_free
(
obj
);
mutex_unlock
(
&
dev
->
struct_mutex
);
DRM_DEBUG
(
"free = 0x%lx
\n
"
,
mem
->
free
);
...
...
drivers/gpu/drm/via/via_map.c
View file @
6de8a748
...
...
@@ -126,6 +126,8 @@ int via_driver_unload(struct drm_device *dev)
drm_via_private_t
*
dev_priv
=
dev
->
dev_private
;
drm_sman_takedown
(
&
dev_priv
->
sman
);
idr_remove_all
(
&
dev_priv
->
object_idr
);
idr_destroy
(
&
dev_priv
->
object_idr
);
kfree
(
dev_priv
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment