105 lines
2.4 KiB
C
105 lines
2.4 KiB
C
/*
|
|
* Copyright (c) XMEDIA. All rights reserved.
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/printk.h>
|
|
#include <linux/semaphore.h>
|
|
#include <linux/slab.h>
|
|
#include "osal.h"
|
|
#include "osal_mmz.h"
|
|
#define MMZ_NAME "anonymous"
|
|
|
|
unsigned long long mmz_alloc(const char *mmz_name, const char *buf_name, unsigned long size)
|
|
{
|
|
mmz_mmb_t *pmmb = NULL;
|
|
|
|
pmmb = mmz_mmb_alloc(buf_name, size, 0, 0, mmz_name);
|
|
if (pmmb == NULL) {
|
|
osal_printk("Mmz malloc failed!\n");
|
|
return 0UL;
|
|
}
|
|
|
|
return mmz_mmb_phys(pmmb);
|
|
}
|
|
EXPORT_SYMBOL(mmz_alloc);
|
|
|
|
void mmz_free(unsigned long long phy_addr)
|
|
{
|
|
mmz_mmb_freeby_phys(phy_addr);
|
|
}
|
|
EXPORT_SYMBOL(mmz_free);
|
|
|
|
void *mmz_map(unsigned long long phy_addr, unsigned long size, bool cached)
|
|
{
|
|
mmz_mmb_t *pmmb = NULL;
|
|
void *vir_addr = NULL;
|
|
unsigned long offset;
|
|
|
|
pmmb = mmz_mmb_getby_phys_2(phy_addr, &offset);
|
|
if ( pmmb == NULL ) {
|
|
osal_printk("mmz remap cache get mmz_mmb failed\n");
|
|
return NULL;
|
|
}
|
|
|
|
if (size == 0 || size + offset > pmmb->length) {
|
|
osal_printk("mmz remap size(0x%lx) is zero or bigger than mmb size(0x%lx)", size, pmmb->length);
|
|
return NULL;
|
|
}
|
|
|
|
if ( cached == 1 ) {
|
|
vir_addr = mmz_mmb_map2kern_cached(pmmb);
|
|
} else {
|
|
vir_addr = mmz_mmb_map2kern(pmmb);
|
|
}
|
|
if (vir_addr == NULL) {
|
|
osal_printk("mmz remap failed!\n");
|
|
return NULL;
|
|
}
|
|
|
|
return vir_addr + offset;
|
|
}
|
|
EXPORT_SYMBOL(mmz_map);
|
|
|
|
void mmz_unmap(void *vir_addr)
|
|
{
|
|
if (vir_addr != NULL) {
|
|
mmz_mmb_t *pmmb = mmz_mmb_getby_kvirt(vir_addr);
|
|
|
|
if (pmmb != NULL) {
|
|
mmz_mmb_unmap(pmmb);
|
|
}
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(mmz_unmap);
|
|
|
|
int mmz_check_phyaddr(unsigned long long phy_addr, unsigned long len)
|
|
{
|
|
/* if address in mmz of current system */
|
|
if (mmz_is_phys_in_mmz(phy_addr, len))
|
|
return -1;
|
|
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL(mmz_check_phyaddr);
|
|
|
|
int mmz_flush_cache(unsigned long phy_addr, void *kvirt, unsigned long length)
|
|
{
|
|
mmz_mmb_t *pmmb = NULL;
|
|
unsigned long offset;
|
|
|
|
/*err address flush maybe panic so judge input parameter*/
|
|
pmmb = mmz_mmb_getby_phys_2(phy_addr, &offset);
|
|
if ( pmmb == NULL ) {
|
|
osal_printk("mmz flush cache get mmz_mmb failed\n");
|
|
return -1;
|
|
}
|
|
|
|
if ( mmz_mmb_flush_dcache_byaddr(kvirt, phy_addr, length) != 0 )
|
|
return -1;
|
|
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL(mmz_flush_cache);
|