/*
 * drivers/amlogic/amports/decoder/decoder_bmmu_box.h
 *
 * Copyright (C) 2015 Amlogic, Inc. All rights reserved.
 *
 * 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.
 *
 */

#ifndef DECODER_BLOCK_BUFFER_BOX
#define DECODER_BLOCK_BUFFER_BOX

void *decoder_bmmu_box_alloc_box(const char *name,
								 int channel_id,
								 int max_num,
								 int aligned,
								 int mem_flags);

int decoder_bmmu_box_alloc_idx(
	void *handle, int idx, int size,
	int aligned_2n, int mem_flags);

int decoder_bmmu_box_free_idx(void *handle, int idx);
int decoder_bmmu_box_free(void *handle);
void *decoder_bmmu_box_get_mem_handle(
	void *box_handle, int idx);

unsigned long decoder_bmmu_box_get_phy_addr(
	void *box_handle, int idx);

void *decoder_bmmu_box_get_virt_addr(
	void *box_handle, int idx);

/*flags: &0x1 for wait,*/
int decoder_bmmu_box_check_and_wait_size(
	int size, int flags, int mem_flags);

int decoder_bmmu_box_alloc_buf_phy(
	void *handle, int idx,
	int size, unsigned char *driver_name,
	unsigned long *buf_phy_addr);

int decoder_bmmu_box_add_callback_func(
	void *handle, int idx,
	void *cb);

#define BMMU_ALLOC_FLAGS_WAIT (1 << 0)
#define BMMU_ALLOC_FLAGS_CAN_CLEAR_KEEPER (1 << 1)
#define BMMU_ALLOC_FLAGS_WAITCLEAR \
		(BMMU_ALLOC_FLAGS_WAIT |\
		BMMU_ALLOC_FLAGS_CAN_CLEAR_KEEPER)

int decoder_bmmu_box_alloc_idx_wait(
	void *handle, int idx,
	int size, int aligned_2n,
	int mem_flags,
	int wait_flags);

bool decoder_bmmu_box_valide_check(void *box);
void decoder_bmmu_try_to_release_box(void *handle);

int decoder_bmmu_box_init(void);
void decoder_bmmu_box_exit(void);

#endif

