jing-pan

jing-pan

0个粉丝

2

问答

0

专栏

0

资料

jing-pan  发布于  2017-05-10 11:51:32
采纳率 0%
2个问答
7910

提示HI_MPI_VB_Init fail!

 
使用的历程是sample下的region文件里面的交叉变过的!其他的都正常。这个我主要是不知道是什么问题!求大神指导
HI_MPI_VB_Init fail! s32Ret:0xa001800c
SAMPLE_RGN_SYS_Init failed! s32Ret: 0xa001800c.
我来回答
回答24个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-05-10 14:59:32
认可0
0xa001800c分配内存失败

jing-pan

0个粉丝

2

问答

0

专栏

0

资料

jing-pan 2017-05-10 15:01:55
认可0
怎么处理呀!我没有动内存设置呀

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-05-10 15:12:44
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=49481&ptid=15134]jing-pan 发表于 2017-5-10 15:01[/url]
怎么处理呀!我没有动内存设置呀[/quote]

贴个/proc/media-mem看看

poya-lzh

0个粉丝

1

问答

0

专栏

0

资料

poya-lzh 2017-05-10 15:48:09
认可0
可能是sdk的mmz内存分配不正确导致的,修改mmz的内存大小,或者修改sample代码中使用的缓存块大小看下

jing-pan

0个粉丝

2

问答

0

专栏

0

资料

jing-pan 2017-05-10 16:05:09
认可0
/* media-mem.c
*
* Copyright (c) 2006 Hisilicon Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
*
*/

#include
#include

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#include
#include

#include
#include
#include

#include "media-mem.h"
#include "mmz-proc.h"


#define MMZ_DBG_LEVEL 0x0
#define mmz_trace(level, s, params...) do{ if(level & MMZ_DBG_LEVEL)\
                printk(KERN_INFO "[%s, %d]: " s "\n", __FUNCTION__, __LINE__, params);\
                }while(0)

#define mmz_trace_func() mmz_trace(0x02,"%s", __FILE__)



#define MMZ_GRAIN PAGE_SIZE
#define mmz_bitmap_size(p) (mmz_align2(mmz_length2grain((p)->nbytes),8)/8)

#define mmz_get_bit(p,n) (((p)->bitmap[(n)/8]>>((n)&0x7))&0x1)
#define mmz_set_bit(p,n) (p)->bitmap[(n)/8] |= 1<<((n)&0x7)
#define mmz_clr_bit(p,n) (p)->bitmap[(n)/8] &= ~(1<<((n)&0x7))

#define mmz_pos2phy_addr(p,n) ((p)->phys_start+(n)*MMZ_GRAIN)
#define mmz_phy_addr2pos(p,a) (((a)-(p)->phys_start)/MMZ_GRAIN)

#define mmz_align2low(x,g) (((x)/(g))*(g))
#define mmz_align2(x,g) ((((x)+(g)-1)/(g))*(g))
#define mmz_grain_align(x) mmz_align2(x,MMZ_GRAIN)
#define mmz_length2grain(len) (mmz_grain_align(len)/MMZ_GRAIN)

#define begin_list_for_each_mmz(p,gfp,mmz_name) list_for_each_entry(p,&mmz_list, list) {\
                if (gfp==0 ? 0:(p)->gfp!=(gfp))\
                            continue;\
        if ((mmz_name == NULL) || (*mmz_name == '\0')) {\
            if (anony == 1) {\
                if (strcmp("anonymous", p->name))\
                    continue;\
            } else\
                break;\
        } else {\
            if (strcmp(mmz_name, p->name))\
                continue;\
        }\
                mmz_trace(1, HIL_MMZ_FMT_S, hil_mmz_fmt_arg(p));
#define end_list_for_each_mmz() }


static unsigned long _strtoul_ex(const char *s, char **ep, unsigned int base)
{
        char *__end_p;
        unsigned long __value;
       
        __value = simple_strtoul(s,&__end_p,base);

        switch(*__end_p) {
        case 'm':
        case 'M':
                __value <<= 10;
        case 'k':
        case 'K':
                __value <<= 10;
                if(ep)
                        (*ep) = __end_p + 1;
        default:
                break;
        }

        return __value;
}


static LIST_HEAD(mmz_list);
static DEFINE_SEMAPHORE(mmz_lock);

static int anony = 0;
module_param(anony, int, S_IRUGO);
static int mmz_info_phys_start = -1;
int zone_number = 0;
int block_number = 0;
unsigned int mmb_number=0; /*for mmb id*/

hil_mmz_t *hil_mmz_create(const char *name, unsigned long gfp, unsigned long phys_start, unsigned long nbytes)
{
        hil_mmz_t *p;

        mmz_trace_func();

        if(name == NULL) {
                printk(KERN_ERR "%s: 'name' can not be zero!", __FUNCTION__);
                return NULL;
        }

        p = kmalloc(sizeof(hil_mmz_t)+1, GFP_KERNEL);
        if (p == NULL)        {
            return NULL;
        }

        memset(p, 0, sizeof(hil_mmz_t)+1);
        strlcpy(p->name, name, HIL_MMZ_NAME_LEN);
        p->gfp = gfp;
        p->phys_start = phys_start;
        p->nbytes = nbytes;

        INIT_LIST_HEAD(&p->list);
        INIT_LIST_HEAD(&p->mmb_list);

        p->destructor = kfree;

        return p;
}
EXPORT_SYMBOL(hil_mmz_create);

hil_mmz_t *hil_mmz_create_v2(const char *name, unsigned long gfp, unsigned long phys_start,
                unsigned long nbytes, unsigned int alloc_type, unsigned long block_align)
{
        hil_mmz_t *p;

        mmz_trace_func();

        if(name == NULL) {
                printk(KERN_ERR "%s: 'name' can not be zero!", __FUNCTION__);
                return NULL;
        }

        p = kmalloc(sizeof(hil_mmz_t), GFP_KERNEL);
        if (p == NULL) {
            return NULL;
        }

        memset(p, 0, sizeof(hil_mmz_t));
        strlcpy(p->name, name, HIL_MMZ_NAME_LEN);
        p->gfp = gfp;
        p->phys_start = phys_start;
        p->nbytes = nbytes;
        p->alloc_type = alloc_type;
        p->block_align = block_align;

        INIT_LIST_HEAD(&p->list);
        INIT_LIST_HEAD(&p->mmb_list);

        p->destructor = kfree;

        return p;
}

int hil_mmz_destroy(hil_mmz_t *zone)
{
        if(zone == NULL)
                return -1;
        if(zone->destructor)
                zone->destructor(zone);
        return 0;
}
EXPORT_SYMBOL(hil_mmz_destroy);

static int _check_mmz(hil_mmz_t *zone)
{
        hil_mmz_t *p;

        unsigned long new_start=zone->phys_start;
        unsigned long new_end=zone->phys_start+zone->nbytes;

        if (zone->nbytes == 0)
                return -1;

        if (!((new_start>=__pa(high_memory)) || (new_start                 printk(KERN_ERR "ERROR: Conflict MMZ:\n");
                printk(KERN_ERR HIL_MMZ_FMT_S "\n", hil_mmz_fmt_arg(zone));
                printk(KERN_ERR "MMZ conflict to kernel memory (0x%08lX, 0x%08lX)\n",
                                (long unsigned int)PHYS_OFFSET, __pa(high_memory) - 1);
                return -1;
        }

        list_for_each_entry(p,&mmz_list, list) {
                unsigned long start, end;
                start = p->phys_start;
                end   = p->phys_start + p->nbytes;

                if(new_start >= end)
                        continue;
                else if (new_start < start && new_end <= start)
                        continue;
                else
                        ;

                printk(KERN_ERR "ERROR: Conflict MMZ:\n");
                printk(KERN_ERR "MMZ new:   " HIL_MMZ_FMT_S "\n", hil_mmz_fmt_arg(zone));
                printk(KERN_ERR "MMZ exist: " HIL_MMZ_FMT_S "\n", hil_mmz_fmt_arg(p));
                printk(KERN_ERR "Add new MMZ failed!\n");
                return -1;
        }

        return 0;
}

int hil_mmz_register(hil_mmz_t *zone)
{
        int ret = 0;

        mmz_trace(1, HIL_MMZ_FMT_S, hil_mmz_fmt_arg(zone));

        if(zone == NULL)
                return -1;

        down(&mmz_lock);

        ret = _check_mmz(zone);
        if (ret) {
                up(&mmz_lock);
                return ret;
        }

        INIT_LIST_HEAD(&zone->mmb_list);

        list_add(&zone->list, &mmz_list);

        up(&mmz_lock);

        return 0;
}

int hil_mmz_unregister(hil_mmz_t *zone)
{
        int losts = 0;
        hil_mmb_t *p;

        if(zone == NULL)
                return -1;

        mmz_trace_func();

        down(&mmz_lock);
        list_for_each_entry(p,&zone->mmb_list, list) {
                printk(KERN_WARNING "          MB Lost: " HIL_MMB_FMT_S "\n", hil_mmb_fmt_arg(p));
                losts++;
        }

        if(losts) {
                printk(KERN_ERR "%d mmbs not free, mmz<%s> can not be deregistered!\n", losts, zone->name);
                up(&mmz_lock);
                return -1;
        }

        list_del(&zone->list);
        up(&mmz_lock);

        return 0;
}

static unsigned long _find_fixed_region(unsigned long *region_len, hil_mmz_t *mmz,
                unsigned long size, unsigned long align)
{
        unsigned long start;
        unsigned long fixed_start = 0;
        unsigned long fixed_len = -1;
        unsigned long len =0;
        unsigned long blank_len =0;
        hil_mmb_t *p = NULL;

        mmz_trace_func();
        align = mmz_grain_align(align);
        start = mmz_align2(mmz->phys_start, align);
        len = mmz_grain_align(size);

        list_for_each_entry(p,&mmz->mmb_list, list) {
                hil_mmb_t *next;
                mmz_trace(4,"p->phys_addr=0x%08lX p->length = %luKB \t",
                                p->phys_addr, p->length/SZ_1K);
                next = list_entry(p->list.next, typeof(*p), list);
                mmz_trace(4,",next = 0x%08lX\n\n", next->phys_addr);
                /*if p is the first entry or not*/
                if(list_first_entry(&mmz->mmb_list, typeof(*p), list) == p) {
                        blank_len = p->phys_addr - start;
                        if((blank_len < fixed_len) && (blank_len>=len)) {
                                fixed_len = blank_len;
                                fixed_start = start;
                                mmz_trace(4,"%d: fixed_region: start=0x%08lX, len=%luKB\n",
                                                __LINE__, fixed_start, fixed_len/SZ_1K);
                        }
                }
                start = mmz_align2((p->phys_addr + p->length),align);
                BUG_ON((start < mmz->phys_start) || (start > (mmz->phys_start + mmz->nbytes)));
                /*if we have to alloc after the last node*/
                if (list_is_last(&p->list, &mmz->mmb_list)) {
                        blank_len = mmz->phys_start + mmz->nbytes - start;
                        if ((blank_len < fixed_len) && (blank_len >= len)){
                                fixed_len = blank_len;
                                fixed_start = start;
                                mmz_trace(4,"%d: fixed_region: start=0x%08lX, len=%luKB\n",
                                                __LINE__, fixed_start, fixed_len/SZ_1K);
                                break;
                        } else {
                                if(fixed_len != -1)
                                        goto out;
                                fixed_start = 0;
                                mmz_trace(4,"%d: fixed_region: start=0x%08lX, len=%luKB\n",
                                                __LINE__, fixed_start, fixed_len/SZ_1K);
                                goto out;
                        }
                }
                /* blank is too little */
                if ((start + len) > next->phys_addr) {
                        mmz_trace(4,"start=0x%08lX ,len=%lu,next=0x%08lX\n",
                                        start,len,next->phys_addr);
                        continue;
                }
                blank_len = next->phys_addr - start;
                if((blank_len < fixed_len) && (blank_len >= len)) {
                        fixed_len = blank_len;
                        fixed_start = start;
                        mmz_trace(4,"%d: fixed_region: start=0x%08lX, len=%luKB\n",
                                        __LINE__, fixed_start, fixed_len/SZ_1K);
                }
        }

        if ((mmz_grain_align(start+len) <= (mmz->phys_start + mmz->nbytes))
                        && (start >= mmz->phys_start)
                        && (start < (mmz->phys_start + mmz->nbytes))) {
                fixed_len = len;
                fixed_start = start;
                mmz_trace(4,"%d: fixed_region: start=0x%08lX, len=%luKB\n",
                                __LINE__, fixed_start, fixed_len/SZ_1K);
        } else {
                fixed_start = 0;
                mmz_trace(4,"%d: fixed_region: start=0x%08lX, len=%luKB\n",
                                __LINE__, fixed_start, len/SZ_1K);
        }
out:
        *region_len = len;
        return fixed_start;
}

static unsigned long _find_fixed_region_from_highaddr(unsigned long *region_len, hil_mmz_t *mmz,
                unsigned long size, unsigned long align)
{
        int i, j;
        unsigned long fixed_start=0;
        unsigned long fixed_len=~1;

        mmz_trace_func();

        i = mmz_length2grain(mmz->nbytes);

        for(; i>0; i--) {
                unsigned long start;
                unsigned long len;
                unsigned long start_highaddr;
               
                if(mmz_get_bit(mmz,i))
                        continue;

                len = 0;
                start_highaddr = mmz_pos2phy_addr(mmz,i);
                for(; i>0; i--) {
                        if(mmz_get_bit(mmz,i)) {
                                break;
                        }

                        len += MMZ_GRAIN;
                }

                if(len>=size) {
                        j = mmz_phy_addr2pos(mmz, mmz_align2low(start_highaddr-size, align));
                        //align = mmz_grain_align(align)/MMZ_GRAIN;
                        //start = mmz_pos2phy_addr(mmz, j - align);
                        start = mmz_pos2phy_addr(mmz, j);
                        if((start_highaddr - len <= start) && (start <= start_highaddr - size)){
                                fixed_len = len;
                                fixed_start = start;
                                break;
                        }                               
                                               
                        mmz_trace(1,"fixed_region: start=0x%08lX, len=%luKB", fixed_start, fixed_len/SZ_1K);
                }
        }

        *region_len = fixed_len;

        return fixed_start;
}

static int _do_mmb_alloc(hil_mmb_t *mmb)
{
        hil_mmb_t *p=NULL;
        mmz_trace_func();

        /* add mmb sorted */
        list_for_each_entry(p,&mmb->zone->mmb_list, list) {
                if(mmb->phys_addr < p->phys_addr)
                        break;
                if(mmb->phys_addr == p->phys_addr){
                        printk(KERN_ERR "ERROR: media-mem allocator bad in %s! (%s, %d)",
                                        mmb->zone->name,  __FUNCTION__, __LINE__);
                }
        }
        list_add(&mmb->list, p->list.prev);

        mmz_trace(1,HIL_MMB_FMT_S,hil_mmb_fmt_arg(mmb));

        return 0;
}

static hil_mmb_t *__mmb_alloc(const char *name, unsigned long size, unsigned long align,
                unsigned long gfp, const char *mmz_name, hil_mmz_t *_user_mmz)
{
        hil_mmz_t *mmz;
        hil_mmb_t *mmb;

        unsigned long start;
        unsigned long region_len;

        unsigned long fixed_start=0;
        unsigned long fixed_len=~1;
        hil_mmz_t *fixed_mmz=NULL;

        mmz_trace_func();

        if(size == 0 || size > 0x40000000UL)
                return NULL;
        if(align == 0)
                align = MMZ_GRAIN;

        size = mmz_grain_align(size);

        mmz_trace(1,"size=%luKB, align=%lu", size/SZ_1K, align);

        begin_list_for_each_mmz(mmz, gfp, mmz_name)
                if(_user_mmz!=NULL && _user_mmz!=mmz)
                        continue;
                start = _find_fixed_region(®ion_len, mmz, size, align);
                if( (fixed_len > region_len) && (start!=0)) {
                        fixed_len = region_len;
                        fixed_start = start;
                        fixed_mmz = mmz;
                }
        end_list_for_each_mmz()

        if(fixed_mmz == NULL) {
                return NULL;
        }

        mmb = kmalloc(sizeof(hil_mmb_t), GFP_KERNEL);
        if (mmb == NULL){
                return NULL;
        }

        memset(mmb, 0, sizeof(hil_mmb_t));
        mmb->zone = fixed_mmz;
        mmb->phys_addr = fixed_start;
        mmb->length = size;
        mmb->id = ++mmb_number;
        if(name)
                strlcpy(mmb->name, name, HIL_MMB_NAME_LEN);
        else
                strncpy(mmb->name, "", HIL_MMB_NAME_LEN);

        if(_do_mmb_alloc(mmb)) {
                kfree(mmb);
                mmb = NULL;
        }

        return mmb;
}

static hil_mmb_t *__mmb_alloc_v2(const char *name, unsigned long size, unsigned long align, unsigned long gfp,
                        const char *mmz_name, hil_mmz_t *_user_mmz, unsigned int order)
{
        hil_mmz_t *mmz;
        hil_mmb_t *mmb;
        int i;

        unsigned long start = 0;
        unsigned long region_len = 0;

        unsigned long fixed_start=0;
        unsigned long fixed_len=~1;
        hil_mmz_t *fixed_mmz=NULL;

        mmz_trace_func();

        if(size == 0 || size > 0x40000000UL)
                return NULL;
        if(align == 0)
                align = 1;
               
        size = mmz_grain_align(size);

        mmz_trace(1,"size=%luKB, align=%lu", size/SZ_1K, align);

        begin_list_for_each_mmz(mmz, gfp, mmz_name)
                if(_user_mmz!=NULL && _user_mmz!=mmz)
                        continue;
                       
                if(mmz->alloc_type == SLAB_ALLOC){
                        if((size-1) & size){
                                for(i = 1; i <= 32; i++){
                                        if(!((size >> i) & ~0)){
                                                size = 1 << i;       
                                                break;
                                        }                                               
                                }       
                                       
                        }
                               
                }
                else if(mmz->alloc_type == EQ_BLOCK_ALLOC){
                        size = mmz_align2(size,mmz->block_align);
                }       
                       
                       
                if(order == LOW_TO_HIGH){                       
                        start = _find_fixed_region(®ion_len, mmz, size, align);
                }
                else if(order == HIGH_TO_LOW)
                        start = _find_fixed_region_from_highaddr(®ion_len, mmz, size, align);
                if( (fixed_len > region_len) && (start!=0)) {
                        fixed_len = region_len;
                        fixed_start = start;
                        fixed_mmz = mmz;
                }
        end_list_for_each_mmz()

        if(fixed_mmz == NULL) {
                return NULL;
        }

        mmb = kmalloc(sizeof(hil_mmb_t), GFP_KERNEL);
        if (mmb == NULL) {
            return NULL;
        }

        memset(mmb, 0, sizeof(hil_mmb_t));
        mmb->zone = fixed_mmz;
        mmb->phys_addr = fixed_start;
        mmb->length = size;
        mmb->order = order;
        if(name)
                strlcpy(mmb->name, name, HIL_MMB_NAME_LEN);
        else
                strncpy(mmb->name, "", HIL_MMB_NAME_LEN);

        if(_do_mmb_alloc(mmb)) {
                kfree(mmb);
                mmb = NULL;
        }

        return mmb;
}

hil_mmb_t *hil_mmb_alloc(const char *name, unsigned long size, unsigned long align,
                unsigned long gfp, const char *mmz_name)
{
        hil_mmb_t *mmb;

        down(&mmz_lock);
        mmb = __mmb_alloc(name, size, align, gfp, mmz_name, NULL);
        up(&mmz_lock);

        return mmb;
}
EXPORT_SYMBOL(hil_mmb_alloc);

hil_mmb_t *hil_mmb_alloc_v2(const char *name, unsigned long size, unsigned long align,
                unsigned long gfp, const char *mmz_name, unsigned int order)
{
        hil_mmb_t *mmb;

        down(&mmz_lock);
        mmb = __mmb_alloc_v2(name, size, align, gfp, mmz_name, NULL, order);
        up(&mmz_lock);

        return mmb;
}
EXPORT_SYMBOL(hil_mmb_alloc_v2);

hil_mmb_t *hil_mmb_alloc_in(const char *name, unsigned long size, unsigned long align,
                hil_mmz_t *_user_mmz)
{
        hil_mmb_t *mmb;

        if(_user_mmz==NULL)
                return NULL;

        down(&mmz_lock);
        mmb = __mmb_alloc(name, size, align, _user_mmz->gfp, _user_mmz->name, _user_mmz);
        up(&mmz_lock);

        return mmb;
}

hil_mmb_t *hil_mmb_alloc_in_v2(const char *name, unsigned long size, unsigned long align,
                hil_mmz_t *_user_mmz, unsigned int order)
{
        hil_mmb_t *mmb;

        if(_user_mmz==NULL)
                return NULL;

        down(&mmz_lock);
        mmb = __mmb_alloc_v2(name, size, align, _user_mmz->gfp, _user_mmz->name, _user_mmz, order);
        up(&mmz_lock);

        return mmb;
}

static void *_mmb_map2kern(hil_mmb_t *mmb, int cached)
{
        if(mmb->flags & HIL_MMB_MAP2KERN) {
                if((cached*HIL_MMB_MAP2KERN_CACHED) != (mmb->flags&HIL_MMB_MAP2KERN_CACHED)) {
                        printk(KERN_ERR "mmb<%s> already kernel-mapped %s, can not be re-mapped as %s.",
                                        mmb->name,
                                        (mmb->flags&HIL_MMB_MAP2KERN_CACHED) ? "cached" : "non-cached",
                                        (cached) ? "cached" : "non-cached" );
                        return NULL;
                }

                mmb->map_ref++;

                return mmb->kvirt;
        }

        if(cached) {
                mmb->flags |= HIL_MMB_MAP2KERN_CACHED;
                mmb->kvirt = ioremap_cached(mmb->phys_addr, mmb->length);
        } else {
                mmb->flags &= ~HIL_MMB_MAP2KERN_CACHED;
                mmb->kvirt = ioremap_nocache(mmb->phys_addr, mmb->length);
        }

        if(mmb->kvirt) {
                       mmb->flags |= HIL_MMB_MAP2KERN;
                mmb->map_ref++;
        }

        return mmb->kvirt;
}

void *hil_mmb_map2kern(hil_mmb_t *mmb)
{
        void *p;
         
        if(mmb == NULL)
                return NULL;

        down(&mmz_lock);
        p =  _mmb_map2kern(mmb, 0);
        up(&mmz_lock);

        return p;
}
EXPORT_SYMBOL(hil_mmb_map2kern);

void *hil_mmb_map2kern_cached(hil_mmb_t *mmb)
{
        void *p;

        if(mmb == NULL)
                return NULL;

        down(&mmz_lock);
        p = _mmb_map2kern(mmb, 1);
        up(&mmz_lock);

        return p;
}
EXPORT_SYMBOL(hil_mmb_map2kern_cached);

int hil_mmb_flush_dcache_byaddr(void *kvirt, unsigned long phys_addr, unsigned long length)
{
        if (NULL == kvirt)
                return -EINVAL;

        /*Use flush range to instead flush_cache_all, because flush_cache_all only flush
          local cpu. And on_each_cpu macro cannot used to flush all cpus with irq disabled.*/
          
    /* dmac_map_area is invalid in  hi3518ev200 kernel, arm9 is not supported yet */
#if (HICHIP==0x3516A100)
    /* flush without clean */
        dmac_map_area(kvirt, length, DMA_TO_DEVICE);
#else
        __cpuc_flush_dcache_area(kvirt, length);       
#endif

#if defined(CONFIG_CACHE_HIL2V200) || defined(CONFIG_CACHE_L2X0)
        /*flush l2 cache, use paddr*/
        /* if length > L2 cache size, then this interface will call */
        outer_flush_range(phys_addr, phys_addr + length);
#endif
       
        return 0;
}
EXPORT_SYMBOL(hil_mmb_flush_dcache_byaddr);

int hil_mmb_invalid_cache_byaddr(void *kvirt, unsigned long phys_addr, unsigned long length)
{
        if (NULL == kvirt)
                return -EINVAL;

    /* dmac_map_area is invalid in  hi3518ev200 kernel, arm9 is not supported yet */
#if (HICHIP==0x3516A100)
    /* flush without clean */
        dmac_map_area(kvirt, length, DMA_FROM_DEVICE);
#else
        __cpuc_flush_dcache_area(kvirt, length);       
#endif
               
        return 0;
}
EXPORT_SYMBOL(hil_mmb_invalid_cache_byaddr);

static int _mmb_free(hil_mmb_t *mmb);

int hil_mmb_unmap(hil_mmb_t *mmb)
{
        int ref;

        if(mmb == NULL)
                return -1;

        down(&mmz_lock);

        if (mmb->flags & HIL_MMB_MAP2KERN_CACHED) {
                __cpuc_flush_dcache_area((void *)mmb->kvirt, (size_t)mmb->length);
#if defined(CONFIG_CACHE_HIL2V200) || defined(CONFIG_CACHE_L2X0)
        /* flush without clean */
                //dmac_map_area(mmb->kvirt, mmb->length, DMA_TO_DEVICE);
                outer_flush_range(mmb->phys_addr, mmb->phys_addr + mmb->length);
#endif
        }

        if(mmb->flags & HIL_MMB_MAP2KERN) {
                ref = --mmb->map_ref;
                if(mmb->map_ref !=0) {
                        up(&mmz_lock);
                        return ref;
                }

                iounmap(mmb->kvirt);
        }

        mmb->kvirt = NULL;
        mmb->flags &= ~HIL_MMB_MAP2KERN;
        mmb->flags &= ~HIL_MMB_MAP2KERN_CACHED;

        if((mmb->flags & HIL_MMB_RELEASED) && mmb->phy_ref ==0) {
                _mmb_free(mmb);
        }

        up(&mmz_lock);

        return 0;
}
EXPORT_SYMBOL(hil_mmb_unmap);

int hil_mmb_get(hil_mmb_t *mmb)
{
        int ref;

        if(mmb == NULL)
                return -1;

        down(&mmz_lock);

        if(mmb->flags & HIL_MMB_RELEASED)
                printk(KERN_WARNING "hil_mmb_get: amazing, mmb<%s> is released!\n", mmb->name);
        ref = ++mmb->phy_ref;

        up(&mmz_lock);

        return ref;
}

static int _mmb_free(hil_mmb_t *mmb)
{
        if (mmb->flags & HIL_MMB_MAP2KERN_CACHED) {
                __cpuc_flush_dcache_area((void *)mmb->kvirt, (size_t)mmb->length);
#if defined(CONFIG_CACHE_HIL2V200) || defined(CONFIG_CACHE_L2X0)
        /* flush without clean */
                //dmac_map_area(mmb->kvirt, mmb->length, DMA_TO_DEVICE);
                outer_flush_range(mmb->phys_addr, mmb->phys_addr + mmb->length);
#endif
        }
        list_del(&mmb->list);
        kfree(mmb);

        return 0;
}

int hil_mmb_put(hil_mmb_t *mmb)
{
        int ref;

        if(mmb == NULL)
                return -1;

        down(&mmz_lock);

        if(mmb->flags & HIL_MMB_RELEASED)
                printk(KERN_WARNING "hil_mmb_put: amazing, mmb<%s> is released!\n", mmb->name);

        ref = --mmb->phy_ref;
       
        if((mmb->flags & HIL_MMB_RELEASED) && mmb->phy_ref ==0 && mmb->map_ref ==0) {
                _mmb_free(mmb);
        }

        up(&mmz_lock);

        return ref;
}

int hil_mmb_free(hil_mmb_t *mmb)
{
        mmz_trace_func();
        if(mmb == NULL)
                return -1;
        mmz_trace(1,HIL_MMB_FMT_S,hil_mmb_fmt_arg(mmb));
        down(&mmz_lock);

        if(mmb->flags & HIL_MMB_RELEASED) {
                printk(KERN_WARNING "hil_mmb_free: amazing, mmb<%s> is released before, but still used!\n", mmb->name);

                up(&mmz_lock);
                return 0;
        }

        if(mmb->phy_ref >0) {
                printk(KERN_WARNING "hil_mmb_free: free mmb<%s> delayed for which ref-count is %d!\n",
                                mmb->name, mmb->map_ref);
                mmb->flags |= HIL_MMB_RELEASED;
                up(&mmz_lock);
                return 0;
        }

        if(mmb->flags & HIL_MMB_MAP2KERN) {
                printk(KERN_WARNING "hil_mmb_free: free mmb<%s> delayed for which is kernel-mapped to 0x%p with map_ref %d!\n",
                                mmb->name, mmb->kvirt, mmb->map_ref);
                mmb->flags |= HIL_MMB_RELEASED;
                up(&mmz_lock);
                return 0;
        }
        _mmb_free(mmb);
        up(&mmz_lock);
        return 0;
}
EXPORT_SYMBOL(hil_mmb_free);

#define MACH_MMB(p, val, member) do{\
        hil_mmz_t *__mach_mmb_zone__; \
        (p) = NULL;\
        list_for_each_entry(__mach_mmb_zone__,&mmz_list, list) { \
                hil_mmb_t *__mach_mmb__;\
                list_for_each_entry(__mach_mmb__,&__mach_mmb_zone__->mmb_list, list) { \
                        if(__mach_mmb__->member == (val)){ \
                                (p) = __mach_mmb__; \
                                break;\
                        } \
                } \
                if(p)break;\
        } \
}while(0)

hil_mmb_t *hil_mmb_getby_phys(unsigned long addr)
{
        hil_mmb_t *p;
        down(&mmz_lock);
        MACH_MMB(p, addr, phys_addr);
        up(&mmz_lock);
        return p;
}
EXPORT_SYMBOL(hil_mmb_getby_phys);

hil_mmb_t *hil_mmb_getby_kvirt(void *virt)
{
        hil_mmb_t *p;

        if(virt == NULL)
                return NULL;

        down(&mmz_lock);
        MACH_MMB(p, virt, kvirt);
        up(&mmz_lock);

        return p;
}
EXPORT_SYMBOL(hil_mmb_getby_kvirt);

#define MACH_MMB_2(p, val, Outoffset) do{\
        hil_mmz_t *__mach_mmb_zone__; \
        (p) = NULL;\
        list_for_each_entry(__mach_mmb_zone__,&mmz_list, list) { \
                hil_mmb_t *__mach_mmb__;\
                list_for_each_entry(__mach_mmb__,&__mach_mmb_zone__->mmb_list, list) { \
                        if ((__mach_mmb__->phys_addr <= (val)) && ((__mach_mmb__->length + __mach_mmb__->phys_addr) > (val))){ \
                                (p) = __mach_mmb__; \
                                Outoffset = val - __mach_mmb__->phys_addr;\
                                break;\
                        }\
                } \
                if(p)break;\
        } \
}while(0)



hil_mmb_t *hil_mmb_getby_phys_2(unsigned long addr, unsigned long *Outoffset)
{
        hil_mmb_t *p;

        down(&mmz_lock);
        MACH_MMB_2(p, addr, *Outoffset);
        up(&mmz_lock);
        return p;
}

hil_mmz_t *hil_mmz_find(unsigned long gfp, const char *mmz_name)
{
        hil_mmz_t *p;

        down(&mmz_lock);
        begin_list_for_each_mmz(p, gfp, mmz_name)
                up(&mmz_lock);
                return p;
        end_list_for_each_mmz()
        up(&mmz_lock);

        return NULL;
}

/*
* name,gfp,phys_start,nbytes,alloc_type;...
* All param in hex mode, except name.
*/
static int media_mem_parse_cmdline(char *s)
{
        hil_mmz_t *zone = NULL;
        char *line;

        while( (line = strsep(&s,":")) !=NULL) {
                int i;
                char *argv[6];

                /*
                 * FIXME: We got 4 args in "line", formated "argv[0],argv[1],argv[2],argv[3],argv[4]".
                 * eg: ",,,,"
                 * For more convenient, "hard code" are used such as "arg[0]", i.e.
                 */
                for (i=0; (argv = strsep(&line, ",")) != NULL;)
                        if (++i == ARRAY_SIZE(argv)) break;
               
                if (i == 4) {
                        zone = hil_mmz_create("null",0,0,0);
                        if (zone == NULL)
                                continue;
                        strlcpy(zone->name, argv[0], HIL_MMZ_NAME_LEN);
                        zone->gfp = _strtoul_ex(argv[1], NULL, 0);
                        zone->phys_start = _strtoul_ex(argv[2], NULL, 0);
                        zone->nbytes = _strtoul_ex(argv[3], NULL, 0);
                } else if (i == 6) {
                        zone = hil_mmz_create_v2("null",0,0,0,0,0);
                        if (zone == NULL)
                                continue;
                        strlcpy(zone->name, argv[0], HIL_MMZ_NAME_LEN);
                        zone->gfp = _strtoul_ex(argv[1], NULL, 0);
                        zone->phys_start = _strtoul_ex(argv[2], NULL, 0);
                        zone->nbytes = _strtoul_ex(argv[3], NULL, 0);
                        zone->alloc_type = _strtoul_ex(argv[4], NULL, 0);
                        zone->block_align = _strtoul_ex(argv[5], NULL, 0);
                } else {
                        printk(KERN_ERR "MMZ: your parameter num is not correct!\n");       
                        continue;
                }
                mmz_info_phys_start = zone->phys_start + zone->nbytes - 0x2000;       
                if (hil_mmz_register(zone)) {
                        printk(KERN_WARNING "Add MMZ failed: " HIL_MMZ_FMT_S "\n", hil_mmz_fmt_arg(zone));
                        hil_mmz_destroy(zone);
                }
                zone = NULL;
        }

        return 0;
}


#define MEDIA_MEM_NAME  "media-mem"

#ifdef CONFIG_PROC_FS

int get_mmz_info_phys_start(void)
{
        return mmz_info_phys_start;
}

int mmz_read_proc(struct seq_file *sfile)
{
        hil_mmz_t *p;
        int len = 0;
        unsigned int zone_number = 0;
        unsigned int block_number = 0;
        unsigned int used_size = 0;
        unsigned int free_size = 0;
        unsigned int mmz_total_size = 0;

        mmz_trace_func();

        down(&mmz_lock);
        list_for_each_entry(p,&mmz_list, list) {
                hil_mmb_t *mmb;
                seq_printf(sfile, "+---ZONE: " HIL_MMZ_FMT_S "\n", hil_mmz_fmt_arg(p));
                mmz_total_size += p->nbytes / 1024;
                ++zone_number;

                list_for_each_entry(mmb,&p->mmb_list, list) {
                        seq_printf(sfile, "   |-MMB: " HIL_MMB_FMT_S "\n", hil_mmb_fmt_arg(mmb));
                        used_size += mmb->length / 1024;
                        ++block_number;
                }
        }

        if (0 != mmz_total_size) {
                free_size = mmz_total_size - used_size;
                seq_printf(sfile, "\n---MMZ_USE_INFO:\n total size=%dKB(%dMB),"
                                "used=%dKB(%dMB + %dKB),remain=%dKB(%dMB + %dKB),"
                                "zone_number=%d,block_number=%d\n",
                                mmz_total_size, mmz_total_size / 1024,
                                used_size, used_size / 1024, used_size % 1024,
                                free_size, free_size / 1024, free_size % 1024,
                                zone_number, block_number);
                mmz_total_size = 0;
                zone_number = 0;
                block_number = 0;
        }
        up(&mmz_lock);

        return len;
}

#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
static int mmz_write_proc(struct file *file, const char __user *buffer,
                                           unsigned long count, void *data)
#else
static ssize_t mmz_write_proc(struct file *file, const char __user *buffer,
                                           size_t count, loff_t *data)
#endif
                                                                  
{
        char buf[256];

        if(count >= sizeof(buf)) {
                printk(KERN_ERR "MMZ: your parameter string is too long!\n");
                return -EIO;
        }

        memset(buf, 0, sizeof(buf));
        if (copy_from_user(buf, buffer, count))
        {
        printk("\nmmz_userdev_ioctl: copy_from_user error.\n");
                return 0;
        }
        media_mem_parse_cmdline(buf);

        return count;
}

#define MMZ_PROC_ROOT  NULL

static const struct seq_operations mmz_seq_ops = {
        .start = mmz_seq_start,
        .next = mmz_seq_next,
        .stop = mmz_seq_stop,
        .show = mmz_seq_show
};

static int mmz_proc_open(struct inode *inode, struct file *file)
{
        return seq_open(file, &mmz_seq_ops);
}

#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
static struct file_operations mmz_proc_ops = {
        .owner = THIS_MODULE,
        .open = mmz_proc_open,
        .read = seq_read
};
static int __init media_mem_proc_init(void)
{
        struct proc_dir_entry *p;

        p = create_proc_entry(MEDIA_MEM_NAME, 0644, MMZ_PROC_ROOT);
        if(p == NULL)
                return -1;
        p->write_proc = mmz_write_proc;
        p->proc_fops = &mmz_proc_ops;

    return 0;
}
#else

static struct file_operations mmz_proc_ops = {
        .owner = THIS_MODULE,
        .open = mmz_proc_open,
        .read = seq_read,
        .write = mmz_write_proc,
};

static int __init media_mem_proc_init(void)
{
        struct proc_dir_entry *p;

    p = proc_create(MEDIA_MEM_NAME, 0, MMZ_PROC_ROOT, &mmz_proc_ops);
    if (!p){
        printk(KERN_ERR "Create mmz proc fail!\n");
        return -1;
    }
    return 0;
}
#endif

static void __exit media_mem_proc_exit(void)
{
        remove_proc_entry(MEDIA_MEM_NAME, MMZ_PROC_ROOT);
}

#else
static int __init media_mem_proc_init(void){ return 0; }
static void __exit media_mem_proc_exit(void){ }

#endif /* CONFIG_PROC_FS */

#define MMZ_SETUP_CMDLINE_LEN 256

#ifndef MODULE

static char __initdata setup_zones[MMZ_SETUP_CMDLINE_LEN] = CONFIG_HISILICON_MMZ_DEFAULT;
static int __init parse_kern_cmdline(char *line)
{
        strlcpy(setup_zones, line, sizeof(setup_zones));

        return 1;
}
__setup("mmz=", parse_kern_cmdline);

#else
static char setup_zones[MMZ_SETUP_CMDLINE_LEN]={'\0'};
module_param_string(mmz, setup_zones, MMZ_SETUP_CMDLINE_LEN, 0600);
MODULE_PARM_DESC(mmz,"mmz=name,0,start,size,type,eqsize:[others]");
#endif

static int __init media_mem_init(void)
{
        printk(KERN_INFO "Hisilicon Media Memory Zone Manager\n");

        media_mem_proc_init();

        media_mem_parse_cmdline(setup_zones);

        //kcom_mmz_register();

        mmz_userdev_init();

        return 0;
}

#ifdef MODULE

static void __exit mmz_exit_check(void)
{
    hil_mmz_t *pmmz;
    struct list_head *p, *n;

    mmz_trace_func();
   
    list_for_each_safe(p, n, &mmz_list) {
        pmmz = list_entry(p,hil_mmz_t,list);
        printk(KERN_WARNING "MMZ force removed: " HIL_MMZ_FMT_S "\n", hil_mmz_fmt_arg(pmmz));
        hil_mmz_unregister(pmmz);
    }
}

static void __exit media_mem_exit(void)
{
        mmz_userdev_exit();

        //kcom_mmz_unregister();

        mmz_exit_check();

        media_mem_proc_exit();
}

module_init(media_mem_init);
module_exit(media_mem_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Hisilicon");

#else

subsys_initcall(media_mem_init);

#endif

EXPORT_SYMBOL(hil_mmb_getby_phys_2);

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-05-10 16:08:57
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=49504&ptid=15134]jing-pan 发表于 2017-5-10 16:05[/url]
/* media-mem.c
*
* Copyright (c) 2006 Hisilicon Co., Ltd.
[/quote]

晕,我的意思是在板子上敲下面的命令并把输出log贴一下,不是要代码

cat /proc/media-mem

(做海思的一般就简称给个/proc/media-mem)

jing-pan

0个粉丝

2

问答

0

专栏

0

资料

jing-pan 2017-05-10 16:12:40
认可0
新手见谅哦!我是搞应用的海思的sdk接触时间不长呢
home/nfs/mpp-imx178-201511-128/mpp/sample/region # ./sample_region 0               
press sample command as follows!
index:
         0) VI->VPSS(COVER)->VO                             
         1) VI->VPSS(COVEREX)->VO                           
         2) VI->VPSS(OVERLAYEX)->VO                        
         3) VI->VPSS(OVERLAYEX)->VO/VENC(OVERLAY)->file     
         q) quit the whole sample
sample command:3
HI_MPI_VB_SetConf fail! s32Ret:0x0
HI_MPI_VB_Init fail! s32Ret:0xa001800c
SAMPLE_RGN_SYS_Init failed! s32Ret: 0xa001800c.
press sample command as follows!

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-05-10 16:18:03
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=49508&ptid=15134]jing-pan 发表于 2017-5-10 16:12[/url]
新手见谅哦!我是搞应用的海思的sdk接触时间不长呢
home/nfs/mpp-imx178-201511-128/mpp/sample/region #  ...[/quote]

:Q

在这里输入
home/nfs/mpp-imx178-201511-128/mpp/sample/region # cat /proc/media-mem
把显示出来的东西贴一下

jing-pan

0个粉丝

2

问答

0

专栏

0

资料

jing-pan 2017-05-10 16:25:18
认可0
你要看这个吗!好吧!:L
/home/nfs/mpp-imx178-201511-128/mpp/sample/region # cat /proc/media-mem
+---ZONE: PHYS(0x88000000, 0x8FFFFFFF), GFP=0, nBYTES=131072KB, NAME="anonymous"
   |-MMB: phys(0x88000000, 0x8800FFFF), kvirt=0x  (null), flags=0x00000000, length=64KB,     name="TDE_MEMPOOL_MMB"
   |-MMB: phys(0x88010000, 0x8804CFFF), kvirt=0x  (null), flags=0x00000000, length=244KB,    name="VGS_NodeBuf"
   |-MMB: phys(0x8804D000, 0x8804FFFF), kvirt=0x  (null), flags=0x00000000, length=12KB,     name="VGS_sclcoef"
   |-MMB: phys(0x88050000, 0x88052FFF), kvirt=0x  (null), flags=0x00000000, length=12KB,     name="VGS_DefliSclcoe"
   |-MMB: phys(0x88053000, 0x8805AFFF), kvirt=0x  (null), flags=0x00000000, length=32KB,     name="ACM LUTS"
   |-MMB: phys(0x8805B000, 0x8805BFFF), kvirt=0x  (null), flags=0x00000000, length=4KB,      name="ACM Coef"
   |-MMB: phys(0x8805C000, 0x8805DFFF), kvirt=0x  (null), flags=0x00000000, length=8KB,      name="sclcoeffset"
   |-MMB: phys(0x8805E000, 0x881F2FFF), kvirt=0x  (null), flags=0x00000000, length=1620KB,   name="hifb_layer0"
   |-MMB: phys(0x881F3000, 0x881FFFFF), kvirt=0x  (null), flags=0x00000000, length=52KB,     name="higo_log"
   |-MMB: phys(0x88200000, 0x88234FFF), kvirt=0x  (null), flags=0x00000000, length=212KB,    name="IVE_QUEUE"
   |-MMB: phys(0x88235000, 0x88235FFF), kvirt=0x  (null), flags=0x00000000, length=4KB,      name="IVE_TEMP_NODE"

---MMZ_USE_INFO:
total size=131072KB(128MB),used=2264KB(2MB + 216KB),remain=128808KB(125MB + 808KB),zone_number=1,block_number=11

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-05-10 16:37:48
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=49513&ptid=15134]jing-pan 发表于 2017-5-10 16:25[/url]
你要看这个吗!好吧!
/home/nfs/mpp-imx178-201511-128/mpp/sample/region # cat /proc/media-mem
+-- ...[/quote]

MMZ有125M 空余够多

HI_MPI_VB_SetConf()前面的类似下面的代码改改过吗?

    struVbConf.u32MaxPoolCnt             = 32;
    struVbConf.astCommPool[0].u32BlkSize = 1920*1088*2;
    struVbConf.astCommPool[0].u32BlkCnt  = 20;

jing-pan

0个粉丝

2

问答

0

专栏

0

资料

jing-pan 2017-05-10 16:49:59
认可0
改过又改回去了!就是改了一次这个才出现的这个问题!
你看看这个配置
    stVbConf.u32MaxPoolCnt             = 32;
    stVbConf.astCommPool[0].u32BlkSize = 2592*1944*2;
    stVbConf.astCommPool[0].u32BlkCnt  = 20;

    stVbConf.astCommPool[1].u32BlkSize = 768*576*2;
    stVbConf.astCommPool[1].u32BlkCnt  = 20;

    stVbConf.astCommPool[2].u32BlkSize = 768*576*2;
    stVbConf.astCommPool[2].u32BlkCnt  = 10;
    stVbConf.astCommPool[3].u32BlkSize = 768*576*2;
    stVbConf.astCommPool[3].u32BlkCnt  = 10;
    stVbConf.astCommPool[4].u32BlkSize = 768*576*2;
    stVbConf.astCommPool[4].u32BlkCnt  = 10;

hanfei69882

2个粉丝

26

问答

0

专栏

2

资料

hanfei69882 2017-05-10 16:52:03
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=49505&ptid=15134]zhuangweiye 发表于 2017-5-10 16:08[/url]
晕,我的意思是在板子上敲下面的命令并把输出log贴一下,不是要代码

cat /proc/media-mem
[/quote]

这个描述太海思了,俺也想贴代码;P;P

nomark

0个粉丝

1

问答

0

专栏

0

资料

nomark 2017-05-10 16:59:41
认可0
要分配的内存超过了MMZ的物理内存,此外,u32MaxPoolCnt设置的小了

jing-pan

0个粉丝

2

问答

0

专栏

0

资料

jing-pan 2017-05-10 17:05:54
认可0
这不对吧
    stVbConf.u32MaxPoolCnt             = 32;
    stVbConf.astCommPool[0].u32BlkSize = 2592*1944*2;
    stVbConf.astCommPool[0].u32BlkCnt  = 50;

    stVbConf.astCommPool[1].u32BlkSize = 768*576*2;
    stVbConf.astCommPool[1].u32BlkCnt  = 50;

    stVbConf.astCommPool[2].u32BlkSize = 768*576*2;
    stVbConf.astCommPool[2].u32BlkCnt  = 50;
    stVbConf.astCommPool[3].u32BlkSize = 768*576*2;
    stVbConf.astCommPool[3].u32BlkCnt  = 50;
    stVbConf.astCommPool[4].u32BlkSize = 768*576*2;
    stVbConf.astCommPool[4].u32BlkCnt  = 50;
都改这么大了
/home/nfs/mpp-imx178-201511-128/mpp/sample/region # ./sample_region 0               
press sample command as follows!
index:
         0) VI->VPSS(COVER)->VO                             
         1) VI->VPSS(COVEREX)->VO                           
         2) VI->VPSS(OVERLAYEX)->VO                        
         3) VI->VPSS(OVERLAYEX)->VO/VENC(OVERLAY)->file     
         q) quit the whole sample
sample command:3
HI_MPI_VB_Init fail! s32Ret:0xa001800c
SAMPLE_RGN_SYS_Init failed! s32Ret: 0xa001800c.
press sample command as follows!
index:
         0) VI->VPSS(COVER)->VO                             
         1) VI->VPSS(COVEREX)->VO                           
         2) VI->VPSS(OVERLAYEX)->VO                        
         3) VI->VPSS(OVERLAYEX)->VO/VENC(OVERLAY)->file     
         q) quit the whole sample
还是不行呀!

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-05-10 17:10:30
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=49521&ptid=15134]jing-pan 发表于 2017-5-10 17:05[/url]
这不对吧
    stVbConf.u32MaxPoolCnt             = 32;
    stVbConf.astCommPool[0].u32BlkSize = 259 ...[/quote]

自己算算这要多少内存(总的MMZ一共才128M,剩余的125M)

2592*1944*2 的VB 50个
768*576*2 的150个

总数超过 125M了,减少个数,让总数少点

jing-pan

0个粉丝

2

问答

0

专栏

0

资料

jing-pan 2017-05-10 17:31:19
认可0
对对!大神说的对!我理解错了!改出了!总数少就对了!

jing-pan

0个粉丝

2

问答

0

专栏

0

资料

jing-pan 2017-05-10 17:32:43
认可0
    memset(&stVbConf, 0, sizeof(VB_CONF_S));
   
    stVbConf.u32MaxPoolCnt             = 32;
    stVbConf.astCommPool[0].u32BlkSize = 2592*1944*2;
    stVbConf.astCommPool[0].u32BlkCnt  = 5;

    stVbConf.astCommPool[1].u32BlkSize = 768*576*2;
    stVbConf.astCommPool[1].u32BlkCnt  = 10;

    stVbConf.astCommPool[2].u32BlkSize = 768*576*2;
    stVbConf.astCommPool[2].u32BlkCnt  = 10;
    stVbConf.astCommPool[3].u32BlkSize = 768*576*2;
    stVbConf.astCommPool[3].u32BlkCnt  = 10;
    stVbConf.astCommPool[4].u32BlkSize = 768*576*2;
    stVbConf.astCommPool[4].u32BlkCnt  = 10;
这个可以的!主要是总量不能太大

hanfei69882

2个粉丝

26

问答

0

专栏

2

资料

hanfei69882 2017-05-22 20:20:31
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=49523&ptid=15134]zhuangweiye 发表于 2017-5-10 17:10[/url]
自己算算这要多少内存(总的MMZ一共才128M,剩余的125M)

2592*1944*2 的VB 50个
[/quote]

这个内存分配有个问题还要麻烦庄工指点一下:handshake

stVbConf.astCommPool[0].u32BlkSize,这个数组下标0指的是第一个通道么?

分配不同的下标跟把所有buf分配到0里面区别大不?而且楼主分配的不同pool分辨率还不一样。。。有点疑惑:lol

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-05-23 08:42:41
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=50153&ptid=15134]hanfei69882 发表于 2017-5-22 20:20[/url]
这个内存分配有个问题还要麻烦庄工指点一下

stVbConf.astCommPool[0].u32BlkSize,这个数 ...[/quote]

这个下标“0” 是指公共视频缓冲池的第0组,只是个index而已

不同“组”的大小可以相同也可以不同,个数可以是0个
比如:
PoolId       0       1       2       3       4       5       6       7       8       9      10      11      12      13      14      15
Size   3135488  624128    2832 3135488  624128    2832       0       0       0       0       0       0       0       0       0       0
Count       18      16      16      22      20      16       0       0       0       0       0       0       0       0       0       0

一般来说不同的pool的buffersize都会不同,但是要考虑到有些芯片的内存物理上就是分成两块的(比如Hi3531),所以会有不同pool,buffersize可能会是相同

一般来说不同的pool的buffersize不同的目的是节省内存, 有点“小狗走小洞,大狗走大洞”的意思
比如VI采集主属性为15fps大小为1080P,子属性为10fps大小为1/4的1080P,这时可以开两组分别对应两种图的大小,而不是开一组大的,可以有效降低内存使用量
再比如多路解码时,需要4个1080P的vdec+12个D1的vdec,在moduleVB模式下就可以开两组分别对应两组vdec,而不用开一组大的,从而降低内存使用量
多路编码时主子码流也是同样的道理

wahuqeir

0个粉丝

1

问答

0

专栏

1

资料

wahuqeir 2017-05-23 09:19:54
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=49521&ptid=15134]jing-pan 发表于 2017-5-10 17:05[/url]
这不对吧
    stVbConf.u32MaxPoolCnt             = 32;
    stVbConf.astCommPool[0].u32BlkSize = 259 ...[/quote]

你算一下,你分配vb已经超过总MMZ内存大小了, (2592*1944*2/1024/1024) * 50 这个都有几百兆,你的MMZ只有128M,把vb池数已经对应的块数减小
加载中···
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区