kolibrios-gitea/drivers/include/drm/drm_mem_util.h
Sergey Semyonov (Serge) a3e5776171 ddk: v3.10
git-svn-id: svn://kolibrios.org@3763 a494cfbc-eb01-0410-851d-a64ba20cac60
2013-07-05 07:41:18 +00:00

68 lines
2.1 KiB
C

/*
* Copyright © 2008 Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*
* Authors:
* Jesse Barnes <jbarnes@virtuousgeek.org>
*
*/
#ifndef _DRM_MEM_UTIL_H_
#define _DRM_MEM_UTIL_H_
static __inline__ void *drm_calloc_large(size_t nmemb, size_t size)
{
void *p;
if (size != 0 && nmemb > SIZE_MAX / size)
return NULL;
if (size * nmemb <= PAGE_SIZE)
return calloc(nmemb, size);
p = (void*)KernelAlloc(size * nmemb);
if ( p != NULL )
memset(p, 0,size * nmemb);
return p;
}
/* Modeled after cairo's malloc_ab, it's like calloc but without the zeroing. */
static __inline__ void *drm_malloc_ab(size_t nmemb, size_t size)
{
if (size != 0 && nmemb > SIZE_MAX / size)
return NULL;
if (size * nmemb <= PAGE_SIZE)
return kmalloc(nmemb * size, GFP_KERNEL);
return (void*)KernelAlloc(size * nmemb);
}
static __inline void drm_free_large(void *ptr)
{
if( ((addr_t)ptr & 0xFFF) == 0 ) // !!!
KernelFree(ptr);
else
kfree(ptr);
}
#endif