root/drivers/staging/media/ipu3/ipu3-css-pool.h
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (C) 2018 Intel Corporation */

#ifndef __IPU3_UTIL_H
#define __IPU3_UTIL_H

struct device;
struct imgu_device;

#define IPU3_CSS_POOL_SIZE              4

/**
 * struct imgu_css_map - store DMA mapping info for buffer
 *
 * @size:               size of the buffer in bytes.
 * @vaddr:              kernel virtual address.
 * @daddr:              iova dma address to access IPU3.
 * @pages:              pages mapped to this buffer
 */
struct imgu_css_map {
        size_t size;
        void *vaddr;
        dma_addr_t daddr;
        struct page **pages;
};

/**
 * struct imgu_css_pool - circular buffer pool definition
 *
 * @entry:              array with IPU3_CSS_POOL_SIZE elements.
 * @entry.param:        a &struct imgu_css_map for storing the mem mapping.
 * @entry.valid:        used to mark if the entry has valid data.
 * @last:               write pointer, initialized to IPU3_CSS_POOL_SIZE.
 */
struct imgu_css_pool {
        struct {
                struct imgu_css_map param;
                bool valid;
        } entry[IPU3_CSS_POOL_SIZE];
        u32 last;
};

int imgu_css_dma_buffer_resize(struct imgu_device *imgu,
                               struct imgu_css_map *map, size_t size);
void imgu_css_pool_cleanup(struct imgu_device *imgu,
                           struct imgu_css_pool *pool);
int imgu_css_pool_init(struct imgu_device *imgu, struct imgu_css_pool *pool,
                       size_t size);
void imgu_css_pool_get(struct imgu_css_pool *pool);
void imgu_css_pool_put(struct imgu_css_pool *pool);
const struct imgu_css_map *imgu_css_pool_last(struct imgu_css_pool *pool,
                                              u32 last);

#endif