/*
 * Copyright 2017 NXP
 *
 * 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 _IMX8_PREFETCH_H_
#define _IMX8_PREFETCH_H_

#define PRG_HANDSHAKE_8LINES		8
#define PRG_HANDSHAKE_4LINES		4
#define AMPHION_STRIPE_WIDTH		8
#define AMPHION_STRIPE_HEIGHT		128
#define AMPHION_UV_STRIPE_HEIGHT	AMPHION_STRIPE_HEIGHT
#define AMPHION_Y_STRIPE_HEIGHT		(2 * AMPHION_STRIPE_HEIGHT)
#define VIVANTE_TILE_WIDTH		4
#define VIVANTE_TILE_HEIGHT		4
#define VIVANTE_SUPER_TILE_WIDTH	64
#define VIVANTE_SUPER_TILE_HEIGHT	64

struct prg;
struct prg *
prg_lookup_by_phandle(struct device *dev, const char *name, int index);
void prg_enable(struct prg *prg);
void prg_disable(struct prg *prg);
void prg_configure(struct prg *prg, unsigned int width, unsigned int height,
		   unsigned int x_offset, unsigned int y_offset,
		   unsigned int stride, unsigned int bits_per_pixel,
		   unsigned long baddr, u32 format, u64 modifier,
		   bool start);
void prg_reg_update(struct prg *prg);
void prg_shadow_enable(struct prg *prg);
bool prg_stride_supported(struct prg *prg, unsigned int stride);
bool prg_stride_double_check(struct prg *prg,
			     unsigned int stride, dma_addr_t baddr);
void prg_set_auxiliary(struct prg *prg);

struct dprc;
struct dprc *
dprc_lookup_by_phandle(struct device *dev, const char *name, int index);
void dprc_enable(struct dprc *dprc);
void dprc_disable(struct dprc *dprc);
void dprc_configure(struct dprc *dprc, unsigned int stream_id,
		    unsigned int width, unsigned int height,
		    unsigned int x_offset, unsigned int y_offset,
		    unsigned int stride, u32 format, u64 modifier,
		    unsigned long baddr, unsigned long uv_baddr,
		    bool start, bool aux_start);
void dprc_reg_update(struct dprc *dprc);
void dprc_irq_handle(struct dprc *dprc);
void dprc_enable_ctrl_done_irq(struct dprc *dprc);
bool dprc_format_supported(struct dprc *dprc, u32 format, u64 modifier);
bool dprc_stride_supported(struct dprc *dprc,
			   unsigned int stride, unsigned int uv_stride,
			   unsigned int width, u32 format);
bool dprc_crop_supported(struct dprc *dprc, u64 modifier, u32 y_offset);
bool dprc_stride_double_check(struct dprc *dprc,
			      unsigned int stride, unsigned int uv_stride,
			      unsigned int width, u32 format,
			      dma_addr_t baddr, dma_addr_t uv_baddr);

#endif
