drm: Split drm_map and drm_local_map
Once upon a time, the DRM made the distinction between the drm_map data structure exchanged with user space and the drm_local_map used in the kernel. For some reasons, while the BSD port still has that "feature", the linux part abused drm_map for kernel internal usage as the local map only existed as a typedef of the struct drm_map. This patch fixes it by declaring struct drm_local_map separately (though its content is currently identical to the userspace variant), and changing the kernel code to only use that, except when it's a user<->kernel interface (ie. ioctl). This allows subsequent changes to the in-kernel format I've also replaced the use of drm_local_map_t with struct drm_local_map in a couple of places. Mostly by accident but they are the same (the former is a typedef of the later) and I have some remote plans and half finished patch to completely kill the drm_local_map_t typedef so I left those bits in. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Acked-by: Eric Anholt <eric@anholt.net> Signed-off-by: Dave Airlie <airlied@linux.ie>
This commit is contained in:

committed by
Dave Airlie

parent
d883f7f1b7
commit
f77d390c97
@@ -50,7 +50,7 @@ resource_size_t drm_get_resource_len(struct drm_device *dev, unsigned int resour
|
||||
EXPORT_SYMBOL(drm_get_resource_len);
|
||||
|
||||
static struct drm_map_list *drm_find_matching_map(struct drm_device *dev,
|
||||
drm_local_map_t *map)
|
||||
struct drm_local_map *map)
|
||||
{
|
||||
struct drm_map_list *entry;
|
||||
list_for_each_entry(entry, &dev->maplist, head) {
|
||||
@@ -89,13 +89,8 @@ static int drm_map_handle(struct drm_device *dev, struct drm_hash_item *hash,
|
||||
}
|
||||
|
||||
/**
|
||||
* Ioctl to specify a range of memory that is available for mapping by a non-root process.
|
||||
*
|
||||
* \param inode device inode.
|
||||
* \param file_priv DRM file private.
|
||||
* \param cmd command.
|
||||
* \param arg pointer to a drm_map structure.
|
||||
* \return zero on success or a negative value on error.
|
||||
* Core function to create a range of memory available for mapping by a
|
||||
* non-root process.
|
||||
*
|
||||
* Adjusts the memory offset to its absolute value according to the mapping
|
||||
* type. Adds the map to the map list drm_device::maplist. Adds MTRR's where
|
||||
@@ -106,7 +101,7 @@ static int drm_addmap_core(struct drm_device * dev, unsigned int offset,
|
||||
enum drm_map_flags flags,
|
||||
struct drm_map_list ** maplist)
|
||||
{
|
||||
struct drm_map *map;
|
||||
struct drm_local_map *map;
|
||||
struct drm_map_list *list;
|
||||
drm_dma_handle_t *dmah;
|
||||
unsigned long user_token;
|
||||
@@ -329,7 +324,7 @@ static int drm_addmap_core(struct drm_device * dev, unsigned int offset,
|
||||
|
||||
int drm_addmap(struct drm_device * dev, unsigned int offset,
|
||||
unsigned int size, enum drm_map_type type,
|
||||
enum drm_map_flags flags, drm_local_map_t ** map_ptr)
|
||||
enum drm_map_flags flags, struct drm_local_map ** map_ptr)
|
||||
{
|
||||
struct drm_map_list *list;
|
||||
int rc;
|
||||
@@ -342,6 +337,17 @@ int drm_addmap(struct drm_device * dev, unsigned int offset,
|
||||
|
||||
EXPORT_SYMBOL(drm_addmap);
|
||||
|
||||
/**
|
||||
* Ioctl to specify a range of memory that is available for mapping by a
|
||||
* non-root process.
|
||||
*
|
||||
* \param inode device inode.
|
||||
* \param file_priv DRM file private.
|
||||
* \param cmd command.
|
||||
* \param arg pointer to a drm_map structure.
|
||||
* \return zero on success or a negative value on error.
|
||||
*
|
||||
*/
|
||||
int drm_addmap_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
@@ -367,19 +373,13 @@ int drm_addmap_ioctl(struct drm_device *dev, void *data,
|
||||
* Remove a map private from list and deallocate resources if the mapping
|
||||
* isn't in use.
|
||||
*
|
||||
* \param inode device inode.
|
||||
* \param file_priv DRM file private.
|
||||
* \param cmd command.
|
||||
* \param arg pointer to a struct drm_map structure.
|
||||
* \return zero on success or a negative value on error.
|
||||
*
|
||||
* Searches the map on drm_device::maplist, removes it from the list, see if
|
||||
* its being used, and free any associate resource (such as MTRR's) if it's not
|
||||
* being on use.
|
||||
*
|
||||
* \sa drm_addmap
|
||||
*/
|
||||
int drm_rmmap_locked(struct drm_device *dev, drm_local_map_t *map)
|
||||
int drm_rmmap_locked(struct drm_device *dev, struct drm_local_map *map)
|
||||
{
|
||||
struct drm_map_list *r_list = NULL, *list_t;
|
||||
drm_dma_handle_t dmah;
|
||||
@@ -442,7 +442,7 @@ int drm_rmmap_locked(struct drm_device *dev, drm_local_map_t *map)
|
||||
}
|
||||
EXPORT_SYMBOL(drm_rmmap_locked);
|
||||
|
||||
int drm_rmmap(struct drm_device *dev, drm_local_map_t *map)
|
||||
int drm_rmmap(struct drm_device *dev, struct drm_local_map *map)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@@ -462,12 +462,18 @@ EXPORT_SYMBOL(drm_rmmap);
|
||||
* One use case might be after addmap is allowed for normal users for SHM and
|
||||
* gets used by drivers that the server doesn't need to care about. This seems
|
||||
* unlikely.
|
||||
*
|
||||
* \param inode device inode.
|
||||
* \param file_priv DRM file private.
|
||||
* \param cmd command.
|
||||
* \param arg pointer to a struct drm_map structure.
|
||||
* \return zero on success or a negative value on error.
|
||||
*/
|
||||
int drm_rmmap_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_map *request = data;
|
||||
drm_local_map_t *map = NULL;
|
||||
struct drm_local_map *map = NULL;
|
||||
struct drm_map_list *r_list;
|
||||
int ret;
|
||||
|
||||
@@ -1534,7 +1540,7 @@ int drm_mapbufs(struct drm_device *dev, void *data,
|
||||
&& (dma->flags & _DRM_DMA_USE_SG))
|
||||
|| (drm_core_check_feature(dev, DRIVER_FB_DMA)
|
||||
&& (dma->flags & _DRM_DMA_USE_FB))) {
|
||||
struct drm_map *map = dev->agp_buffer_map;
|
||||
struct drm_local_map *map = dev->agp_buffer_map;
|
||||
unsigned long token = dev->agp_buffer_token;
|
||||
|
||||
if (!map) {
|
||||
|
Reference in New Issue
Block a user