blob: 195c4a5bceeb53dad2229a819a59e97f80be100e [file] [log] [blame]
/*
* Support for Intel Camera Imaging ISP subsystem.
* Copyright (c) 2015-2017, Intel Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*/
#ifndef __MEMORY_ACCESS_H_INCLUDED__
#define __MEMORY_ACCESS_H_INCLUDED__
/*!
* \brief
* Define the public interface for virtual memory
* access functions. Access types are limited to
* those defined in <stdint.h>
*
* The address representation is private to the system
* and represented as "hrt_vaddress" rather than a
* pointer, as the memory allocation cannot be accessed
* by dereferencing but reaquires load and store access
* functions
*
* The page table selection or virtual memory context;
* The page table base index; Is implicit. This page
* table base index must be set by the implementation
* of the access function
*
* "store" is a transfer to the system
* "load" is a transfer from the system
*
* Allocation properties can be specified by setting
* attributes (see below) in case of multiple physical
* memories the memory ID is encoded on the attribute
*
* Allocations in the same physical memory, but in a
* different (set of) page tables can be shared through
* a page table information mapping function
*/
#include <type_support.h>
#include "platform_support.h" /* for __func__ */
/*
* User provided file that defines the (sub)system address types:
* - hrt_vaddress a type that can hold the (sub)system virtual address range
*/
#include "system_types.h"
/*
* The MMU base address is a physical address, thus the same type is used
* as for the device base address
*/
#include "device_access.h"
#include "hmm/hmm.h"
/*!
* \brief
* Bit masks for specialised allocation functions
* the default is "uncached", "not contiguous",
* "not page aligned" and "not cleared"
*
* Forcing alignment (usually) returns a pointer
* at an alignment boundary that is offset from
* the allocated pointer. Without storing this
* pointer/offset, we cannot free it. The memory
* manager is responsible for the bookkeeping, e.g.
* the allocation function creates a sentinel
* within the allocation referencable from the
* returned pointer/address.
*/
#define MMGR_ATTRIBUTE_MASK 0x000f
#define MMGR_ATTRIBUTE_CACHED 0x0001
#define MMGR_ATTRIBUTE_CONTIGUOUS 0x0002
#define MMGR_ATTRIBUTE_PAGEALIGN 0x0004
#define MMGR_ATTRIBUTE_CLEARED 0x0008
#define MMGR_ATTRIBUTE_UNUSED 0xfff0
/* #define MMGR_ATTRIBUTE_DEFAULT (MMGR_ATTRIBUTE_CACHED) */
#define MMGR_ATTRIBUTE_DEFAULT 0
extern const hrt_vaddress mmgr_NULL;
extern const hrt_vaddress mmgr_EXCEPTION;
/*! Return the address of an allocation in memory
\param size[in] Size in bytes of the allocation
\param caller_func[in] Caller function name
\param caller_line[in] Caller function line number
\return vaddress
*/
extern hrt_vaddress mmgr_malloc(const size_t size);
/*! Return the address of a zero initialised allocation in memory
\param N[in] Horizontal dimension of array
\param size[in] Vertical dimension of array Total size is N*size
\return vaddress
*/
extern hrt_vaddress mmgr_calloc(const size_t N, const size_t size);
/*! Return the address of an allocation in memory
\param size[in] Size in bytes of the allocation
\param attribute[in] Bit vector specifying the properties
of the allocation including zero initialisation
\return vaddress
*/
extern hrt_vaddress mmgr_alloc_attr(const size_t size, const uint16_t attribute);
/*! Return the address of a mapped existing allocation in memory
\param ptr[in] Pointer to an allocation in a different
virtual memory page table, but the same
physical memory
\param size[in] Size of the memory of the pointer
\param attribute[in] Bit vector specifying the properties
of the allocation
\param context Pointer of a context provided by
client/driver for additonal parameters
needed by the implementation
\Note
This interface is tentative, limited to the desired function
the actual interface may require furhter parameters
\return vaddress
*/
extern hrt_vaddress mmgr_mmap(
const void *ptr,
const size_t size,
uint16_t attribute,
void *context);
/*! Zero initialise an allocation in memory
\param vaddr[in] Address of an allocation
\param size[in] Size in bytes of the area to be cleared
\return none
*/
extern void mmgr_clear(hrt_vaddress vaddr, const size_t size);
/*! Read an array of bytes from a virtual memory address
\param vaddr[in] Address of an allocation
\param data[out] pointer to the destination array
\param size[in] number of bytes to read
\return none
*/
extern void mmgr_load(const hrt_vaddress vaddr, void *data, const size_t size);
/*! Write an array of bytes to device registers or memory in the device
\param vaddr[in] Address of an allocation
\param data[in] pointer to the source array
\param size[in] number of bytes to write
\return none
*/
extern void mmgr_store(const hrt_vaddress vaddr, const void *data, const size_t size);
#endif /* __MEMORY_ACCESS_H_INCLUDED__ */