blob: ac8c7e98763f79acbcbcbd09d19292f3ad31d2d5 [file] [log] [blame]
/*
* Copyright (C) 2020 Intel Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __CPU_MEM_SUPPORT_H
#define __CPU_MEM_SUPPORT_H
#include "storage_class.h"
#include "assert_support.h"
#include "type_support.h"
STORAGE_CLASS_INLINE void*
ia_css_cpu_mem_copy(void *dst, const void *src, unsigned int size)
{
/* memcpy cannot be used in in Windows (function is not allowed),
* and the safer function memcpy_s is not available on other platforms.
* Because usage of ia_css_cpu_mem_copy is minimal, we implement it here in an easy,
* but sub-optimal way.
*/
unsigned int i;
assert(dst != NULL && src != NULL);
if (!(dst != NULL && src != NULL)) {
return NULL;
}
for (i = 0; i < size; i++) {
((char *)dst)[i] = ((char *)src)[i];
}
return dst;
}
#if defined(__KERNEL__)
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/types.h>
#include <asm/cacheflush.h>
/* TODO: remove, workaround for issue in hrt file ibuf_ctrl_2600_config.c
* error checking code added to SDK that uses calls to exit function
*/
#define exit(a) return
STORAGE_CLASS_INLINE void*
ia_css_cpu_mem_alloc(unsigned int size)
{
return kmalloc(size, GFP_KERNEL);
}
STORAGE_CLASS_INLINE void*
ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
{
return ia_css_cpu_mem_alloc(size); /* todo: align to page size */
}
STORAGE_CLASS_INLINE void
ia_css_cpu_mem_protect(void *ptr, unsigned int size, int prot)
{
/* nothing here yet */
}
STORAGE_CLASS_INLINE void*
ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
{
return memset(dst, 0, size); /* available in kernel in linux/string.h */
}
STORAGE_CLASS_INLINE void
ia_css_cpu_mem_free(void *ptr)
{
kfree(ptr);
}
STORAGE_CLASS_INLINE void
ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
{
/* parameter check here */
if (ptr == NULL)
return;
clflush_cache_range(ptr, size);
}
STORAGE_CLASS_INLINE void
ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
{
/* for now same as flush */
ia_css_cpu_mem_cache_flush(ptr, size);
}
#elif defined(_MSC_VER)
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
extern void *hrt_malloc(size_t bytes, int zero_mem);
extern void *hrt_free(void *ptr);
extern void hrt_mem_cache_flush(void *ptr, unsigned int size);
extern void hrt_mem_cache_invalidate(void *ptr, unsigned int size);
#define malloc(a) hrt_malloc(a, 1)
#define free(a) hrt_free(a)
#define CSS_PAGE_SIZE (1<<12)
STORAGE_CLASS_INLINE void*
ia_css_cpu_mem_alloc(unsigned int size)
{
return malloc(size);
}
STORAGE_CLASS_INLINE void*
ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
{
unsigned int buffer_size = size;
/* Currently hrt_malloc calls Windows ExAllocatePoolWithTag() routine
* to request system memory. If the number of bytes is equal or bigger
* than the page size, then the returned address is page aligned,
* but if it's smaller it's not necessarily page-aligned We agreed
* with Windows team that we allocate a full page
* if it's less than page size
*/
if (buffer_size < CSS_PAGE_SIZE)
buffer_size = CSS_PAGE_SIZE;
return ia_css_cpu_mem_alloc(buffer_size);
}
STORAGE_CLASS_INLINE void*
ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
{
return memset(dst, 0, size);
}
STORAGE_CLASS_INLINE void
ia_css_cpu_mem_free(void *ptr)
{
free(ptr);
}
STORAGE_CLASS_INLINE void
ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
{
#ifdef _KERNEL_MODE
hrt_mem_cache_flush(ptr, size);
#else
(void)ptr;
(void)size;
#endif
}
STORAGE_CLASS_INLINE void
ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
{
#ifdef _KERNEL_MODE
hrt_mem_cache_invalidate(ptr, size);
#else
(void)ptr;
(void)size;
#endif
}
#else
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
/* Needed for the MPROTECT */
#include <unistd.h>
#include <sys/types.h>
/* For host only, not fw */
#ifndef __XTENSA_FW__
#include <sys/mman.h>
#include <malloc.h>
#endif
STORAGE_CLASS_INLINE void*
ia_css_cpu_mem_alloc(unsigned int size)
{
return malloc(size);
}
#ifdef _SC_PAGE_SIZE
STORAGE_CLASS_INLINE void*
ia_css_cpu_mem_alloc_page_aligned(unsigned int size)
{
int pagesize;
pagesize = sysconf(_SC_PAGE_SIZE);
return memalign(pagesize, size);
}
#endif /*_SC_PAGE_SIZE*/
STORAGE_CLASS_INLINE void*
ia_css_cpu_mem_set_zero(void *dst, unsigned int size)
{
return memset(dst, 0, size);
}
STORAGE_CLASS_INLINE void
ia_css_cpu_mem_free(void *ptr)
{
free(ptr);
}
STORAGE_CLASS_INLINE void
ia_css_cpu_mem_cache_flush(void *ptr, unsigned int size)
{
/* not needed in simulation */
(void)ptr;
(void)size;
}
STORAGE_CLASS_INLINE void
ia_css_cpu_mem_cache_invalidate(void *ptr, unsigned int size)
{
/* not needed in simulation */
(void)ptr;
(void)size;
}
#endif
#endif /* __CPU_MEM_SUPPORT_H */