blob: 67b268aa4d90320cb6fed8bb4632a04d5bee3ed3 [file] [log] [blame]
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#ifndef __GDC_CONFIG_H__
#define __GDC_CONFIG_H__
#include <linux/interrupt.h>
#include <linux/types.h>
#include <linux/wait.h>
#include <linux/spinlock.h>
#include <linux/miscdevice.h>
#include <linux/highmem.h>
#ifdef CONFIG_AMLOGIC_TEE
#include <linux/amlogic/tee.h>
#endif
#include "system_gdc_io.h"
#include "gdc_api.h"
#include "gdc_dmabuf.h"
#include "system_log.h"
struct gdc_context_s;
enum {
CORE_AXI,
MUXGATE_MUXSEL_GATE,
GATE
};
enum {
CORE,
AXI,
MUX_GATE,
MUX_SEL,
CLK_GATE,
CLK_NAME_NUM
};
enum {
CORE_0,
CORE_1,
CORE_2,
CORE_NUM
};
struct gdc_device_data_s {
int dev_type;
int clk_type;
/* use independ reg to set 8g addr MSB */
int ext_msb_8g;
int bit_width_ext; /* 8/10/12/16bit support */
int gamma_support; /* gamma support */
int core_cnt; /* total core count */
};
struct meson_gdc_dev_t {
struct miscdevice misc_dev;
int irq;
int probed;
struct platform_device *pdev;
char *config_out_file;
int config_out_path_defined;
int trace_mode_enable;
int reg_store_mode_enable;
int clk_type;
union {
struct clk *clk_core[CORE_NUM];
struct clk *clk_gate[CORE_NUM];
};
struct clk *clk_axi[CORE_NUM]; /* not used for clk_gate only cases */
int ext_msb_8g;
int bit_width_ext;
int gamma_support;
int core_cnt;
struct gdc_pd pd[CORE_NUM];
u32 is_idle[CORE_NUM]; /* indicate the core status, 0:busy 1:idle */
ktime_t time_stamp[CORE_NUM]; /* start time stamp */
struct gdc_queue_item_s *current_item[CORE_NUM];
};
struct gdc_event_s {
struct completion d_com;
struct completion process_complete[CORE_NUM];
/* for queue switch and create destroy queue. */
spinlock_t sem_lock;
struct semaphore cmd_in_sem;
};
struct gdc_manager_s {
struct list_head process_queue;
struct gdc_context_s *current_wq;
struct gdc_context_s *last_wq;
struct task_struct *gdc_thread;
struct gdc_event_s event;
struct aml_dma_buffer *buffer;
int gdc_state;
int process_queue_state; //thread running flag
struct meson_gdc_dev_t *gdc_dev;
struct meson_gdc_dev_t *aml_gdc_dev;
};
struct gdc_irq_data_s {
u32 dev_type;
u32 core_id;
};
extern struct gdc_manager_s gdc_manager;
#define GDC_DEVICE(dev_type) ((dev_type) == ARM_GDC ? \
&gdc_manager.gdc_dev->pdev->dev : \
&gdc_manager.aml_gdc_dev->pdev->dev)
#define GDC_DEV_T(dev_type) ((dev_type) == ARM_GDC ? \
gdc_manager.gdc_dev : \
gdc_manager.aml_gdc_dev)
/* AML GDC registers */
#define ISP_DWAP_REG_MARK BIT(16)
#define ISP_DWAP_TOP_SRC_FSIZE ((0x00 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_TOP_CTRL0 ((0x02 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_TOP_COEF_CTRL0 ((0x03 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_TOP_COEF_CTRL1 ((0x04 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_TOP_CMD_CTRL0 ((0x05 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_TOP_CMD_CTRL1 ((0x06 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_TOP_SRC_Y_CTRL0 ((0x07 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_TOP_SRC_Y_CTRL1 ((0x08 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_TOP_SRC_U_CTRL0 ((0x09 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_TOP_SRC_U_CTRL1 ((0x0a << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_TOP_SRC_V_CTRL0 ((0x0b << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_TOP_SRC_V_CTRL1 ((0x0c << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_TOP_MESH_CTRL0 ((0x0d << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_TOP_DST_FSIZE ((0x10 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_TOP_DST_Y_CTRL0 ((0x13 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_TOP_DST_Y_CTRL1 ((0x14 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_TOP_DST_U_CTRL0 ((0x15 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_TOP_DST_U_CTRL1 ((0x16 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_TOP_DST_V_CTRL0 ((0x17 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_TOP_DST_V_CTRL1 ((0x18 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_GAMMA_CTRL ((0x60 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_GAMMA_OFST ((0x61 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_GAMMA_NUM ((0x62 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_GAMMA_STP ((0x63 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_GAMMA_LUT_ADDR ((0x64 << 2) | ISP_DWAP_REG_MARK)
#define ISP_DWAP_GAMMA_LUT_DATA ((0x65 << 2) | ISP_DWAP_REG_MARK)
#define DEWARP_STRIDE_ALIGN(x) (((x) + 15) / 16)
#define AML_GDC_COEF_SIZE 256
#define AML_GDC_CFG_STRIDE 4096
// ----------------------------------- //
// Instance 'gdc' of module 'gdc_ip_config'
// ----------------------------------- //
#define GDC_BASE_ADDR (0x00L)
#define GDC_SIZE (0x100)
// ----------------------------------- //
// Group: ID
// ----------------------------------- //
// ----------------------------------- //
// Register: API
// ----------------------------------- //
#define GDC_ID_API_DEFAULT (0x0)
#define GDC_ID_API_DATASIZE (32)
#define GDC_ID_API_OFFSET (0x0)
#define GDC_ID_API_MASK (0xffffffff)
// args: data (32-bit)
static inline u32 gdc_id_api_read(void)
{
return system_gdc_read_32(0x00L, 0);
}
// ----------------------------------- //
// Register: Product
// ----------------------------------- //
#define GDC_ID_PRODUCT_DEFAULT (0x0)
#define GDC_ID_PRODUCT_DATASIZE (32)
#define GDC_ID_PRODUCT_OFFSET (0x4)
#define GDC_ID_PRODUCT_MASK (0xffffffff)
// args: data (32-bit)
static inline u32 gdc_id_product_read(void)
{
return system_gdc_read_32(0x04L, 0);
}
// ----------------------------------- //
// Register: Version
// ----------------------------------- //
#define GDC_ID_VERSION_DEFAULT (0x0)
#define GDC_ID_VERSION_DATASIZE (32)
#define GDC_ID_VERSION_OFFSET (0x8)
#define GDC_ID_VERSION_MASK (0xffffffff)
// args: data (32-bit)
static inline u32 gdc_id_version_read(void)
{
return system_gdc_read_32(0x08L, 0);
}
// ----------------------------------- //
// Register: Revision
// ----------------------------------- //
#define GDC_ID_REVISION_DEFAULT (0x0)
#define GDC_ID_REVISION_DATASIZE (32)
#define GDC_ID_REVISION_OFFSET (0xc)
#define GDC_ID_REVISION_MASK (0xffffffff)
// args: data (32-bit)
static inline u32 gdc_id_revision_read(void)
{
return system_gdc_read_32(0x0cL, 0);
}
// ----------------------------------- //
// Group: GDC
// ----------------------------------- //
// ----------------------------------- //
// GDC controls
// ----------------------------------- //
// ----------------------------------- //
// Register: config addr
// ----------------------------------- //
// ----------------------------------- //
// Base address of configuration stream
// (in bytes, AXI word aligned)
// ----------------------------------- //
#define GDC_CONFIG_ADDR_DEFAULT (0x0)
#define GDC_CONFIG_ADDR_DATASIZE (32)
#define GDC_CONFIG_ADDR_OFFSET (0x10)
#define GDC_CONFIG_ADDR_MASK (0xffffffff)
static inline void gdc_coef_addr_write(ulong data, u32 core_id)
{
gdc_log(LOG_DEBUG, "coef paddr: 0x%lx\n", data);
system_gdc_write_32(ISP_DWAP_TOP_COEF_CTRL0, data >> 4, core_id);
system_gdc_write_32(ISP_DWAP_TOP_COEF_CTRL1, AML_GDC_COEF_SIZE,
core_id);
}
static inline void gdc_aml_cfg_addr_write(ulong data, u32 core_id)
{
u32 curr = system_gdc_read_32(ISP_DWAP_TOP_CMD_CTRL1, core_id);
gdc_log(LOG_DEBUG, " cfg paddr: 0x%lx\n", data);
system_gdc_write_32(ISP_DWAP_TOP_CMD_CTRL0, data >> 4, core_id);
system_gdc_write_32(ISP_DWAP_TOP_CMD_CTRL1, AML_GDC_CFG_STRIDE | curr,
core_id);
}
static inline void gdc_mesh_addr_write(ulong data, u32 core_id)
{
gdc_log(LOG_DEBUG, "mesh paddr: 0x%lx\n", data);
system_gdc_write_32(ISP_DWAP_TOP_MESH_CTRL0, data >> 4, core_id);
}
static inline void gdc_bit_width_write(u32 format, u32 core_id)
{
u32 curr = 0;
u32 in_bitw = 0;
u32 out_bitw = 0;
switch (format & FORMAT_IN_BITW_MASK) {
case IN_BITW_8:
in_bitw = 0;
break;
case IN_BITW_10:
in_bitw = 1;
break;
case IN_BITW_12:
in_bitw = 2;
break;
case IN_BITW_16:
in_bitw = 3;
break;
default:
gdc_log(LOG_ERR, "%s, format (0x%x) in_bitw is wrong\n",
__func__, format);
}
switch (format & FORMAT_OUT_BITW_MASK) {
case OUT_BITW_8:
out_bitw = 0;
break;
case OUT_BITW_10:
out_bitw = 1;
break;
case OUT_BITW_12:
out_bitw = 2;
break;
case OUT_BITW_16:
out_bitw = 3;
break;
default:
gdc_log(LOG_ERR, "%s, format (0x%x) out_bitw is wrong\n",
__func__, format);
}
gdc_log(LOG_DEBUG, "in bit width:%d\n", in_bitw);
gdc_log(LOG_DEBUG, "out bit width:%d\n", out_bitw);
curr = system_gdc_read_32(ISP_DWAP_TOP_CMD_CTRL1, core_id);
system_gdc_write_32(ISP_DWAP_TOP_CMD_CTRL1,
(curr & 0x3fffffff) | (in_bitw << 30), core_id);
curr = system_gdc_read_32(ISP_DWAP_GAMMA_CTRL, core_id);
system_gdc_write_32(ISP_DWAP_GAMMA_CTRL,
(curr & 0xfffffff3) | (out_bitw << 2), core_id);
}
// args: data (32-bit)
static inline void gdc_config_addr_write(u32 msb, u32 data, u32 dev_type,
u32 core_id)
{
if (dev_type == ARM_GDC) {
system_gdc_write_32(0x10L, data, core_id);
} else {
ulong fw_addr = ((u64)msb << 32) + data;
struct page *page = phys_to_page(fw_addr);
void *vaddr = kmap(page);
u32 coef_size = *(u32 *)vaddr;
u32 mesh_size = *((u32 *)vaddr + 1);
u32 fw_offset = *((u32 *)vaddr + 2);
fw_addr += fw_offset;
gdc_coef_addr_write(fw_addr, core_id);
gdc_mesh_addr_write(fw_addr + coef_size, core_id);
gdc_aml_cfg_addr_write(fw_addr + coef_size + mesh_size,
core_id);
kunmap(page);
gdc_log(LOG_DEBUG, " coef_size: 0x%x %u\n",
coef_size, coef_size);
gdc_log(LOG_DEBUG, " mesh_size: 0x%x %u\n",
mesh_size, mesh_size);
gdc_log(LOG_DEBUG, " fw offset: 0x%x %u\n",
fw_offset, fw_offset);
}
}
static inline u32 gdc_config_addr_read(void)
{
return system_gdc_read_32(0x10L, 0);
}
// ----------------------------------- //
// Register: config size
// ----------------------------------- //
// ----------------------------------- //
// Size of the configuration stream //
// (in bytes, 32 bit word granularity) //
// ----------------------------------- //
#define GDC_CONFIG_SIZE_DEFAULT (0x0)
#define GDC_CONFIG_SIZE_DATASIZE (32)
#define GDC_CONFIG_SIZE_OFFSET (0x14)
#define GDC_CONFIG_SIZE_MASK (0xffffffff)
// args: data (32-bit)
static inline void gdc_config_size_write(u32 data, u32 dev_type, u32 core_id)
{
if (dev_type == ARM_GDC)
system_gdc_write_32(0x14L, data, core_id);
}
static inline u32 gdc_config_size_read(void)
{
return system_gdc_read_32(0x14L, 0);
}
// ----------------------------------- //
// Register: datain width
// ----------------------------------- //
// ----------------------------------- //
// Width of the input image (in pixels)
// ----------------------------------- //
#define GDC_DATAIN_WIDTH_DEFAULT (0x0)
#define GDC_DATAIN_WIDTH_DATASIZE (16)
#define GDC_DATAIN_WIDTH_OFFSET (0x20)
#define GDC_DATAIN_WIDTH_MASK (0xffff)
// args: data (16-bit)
static inline void gdc_datain_width_write(u16 data, u32 dev_type, u32 core_id)
{
u32 curr;
if (dev_type == ARM_GDC) {
curr = system_gdc_read_32(0x20L, core_id);
system_gdc_write_32(0x20L, ((curr & 0xffff0000) | data),
core_id);
} else {
curr = system_gdc_read_32(ISP_DWAP_TOP_SRC_FSIZE, core_id);
system_gdc_write_32(ISP_DWAP_TOP_SRC_FSIZE,
((curr & 0x0000ffff) | (data << 16)),
core_id);
}
}
static inline uint16_t gdc_datain_width_read(void)
{
return (uint16_t)((system_gdc_read_32(0x20L, 0) & 0xffff) >> 0);
}
// ----------------------------------- //
// Register: datain_height
// ----------------------------------- //
// ----------------------------------- //
// Height of the input image (in pixels)
// ----------------------------------- //
#define GDC_DATAIN_HEIGHT_DEFAULT (0x0)
#define GDC_DATAIN_HEIGHT_DATASIZE (16)
#define GDC_DATAIN_HEIGHT_OFFSET (0x24)
#define GDC_DATAIN_HEIGHT_MASK (0xffff)
// args: data (16-bit)
static inline void gdc_datain_height_write(u16 data, u32 dev_type, u32 core_id)
{
u32 curr = 0;
if (dev_type == ARM_GDC) {
curr = system_gdc_read_32(0x24L, core_id);
system_gdc_write_32(0x24L, ((curr & 0xffff0000) | data),
core_id);
} else {
curr = system_gdc_read_32(ISP_DWAP_TOP_SRC_FSIZE, core_id);
system_gdc_write_32(ISP_DWAP_TOP_SRC_FSIZE,
((curr & 0xffff0000) | data),
core_id);
}
}
static inline uint16_t gdc_datain_height_read(void)
{
return (uint16_t)((system_gdc_read_32(0x24L, 0) & 0xffff) >> 0);
}
// ----------------------------------- //
// Register: data1in addr
// ----------------------------------- //
// ----------------------------------- //
// Base address of the 1st plane in the
// input frame buffer
// (in bytes, AXI word aligned)
// ----------------------------------- //
#define GDC_DATA1IN_ADDR_DEFAULT (0x0)
#define GDC_DATA1IN_ADDR_DATASIZE (32)
#define GDC_DATA1IN_ADDR_OFFSET (0x28)
#define GDC_DATA1IN_ADDR_MASK (0xffffffff)
// args: data (32-bit)
static inline void gdc_data1in_addr_write(u32 msb, u32 data, u32 dev_type,
u32 core_id)
{
if (dev_type == ARM_GDC)
system_gdc_write_32(0x28L, data, core_id);
else
system_gdc_write_32(ISP_DWAP_TOP_SRC_Y_CTRL0,
(((u64)msb << 32) + data) >> 4, core_id);
}
static inline u32 gdc_data1in_addr_read(void)
{
return system_gdc_read_32(0x28L, 0);
}
// ----------------------------------- //
// Register: data1in line offset
// ----------------------------------- //
// ----------------------------------- //
// Address difference between adjacent
// lines for the 1st plane in the input
// frame buffer (in bytes, AXI word aligned)
// ----------------------------------- //
#define GDC_DATA1IN_LINE_OFFSET_DEFAULT (0x0)
#define GDC_DATA1IN_LINE_OFFSET_DATASIZE (32)
#define GDC_DATA1IN_LINE_OFFSET_OFFSET (0x2c)
#define GDC_DATA1IN_LINE_OFFSET_MASK (0xffffffff)
// args: data (32-bit)
static inline void gdc_data1in_line_offset_write(u32 data, u32 dev_type,
u32 core_id)
{
if (dev_type == ARM_GDC) {
system_gdc_write_32(0x2cL, data, core_id);
} else {
data = DEWARP_STRIDE_ALIGN(data);
system_gdc_write_32(ISP_DWAP_TOP_SRC_Y_CTRL1, data, core_id);
}
}
static inline u32 gdc_data1in_line_offset_read(void)
{
return system_gdc_read_32(0x2cL, 0);
}
// ----------------------------------- //
// Register: data2in addr
// ----------------------------------- //
// ----------------------------------- //
// Address of the 2nd plane in the
// input frame buffer
// (in bytes, AXI word aligned)
// ----------------------------------- //
#define GDC_DATA2IN_ADDR_DEFAULT (0x0)
#define GDC_DATA2IN_ADDR_DATASIZE (32)
#define GDC_DATA2IN_ADDR_OFFSET (0x30)
#define GDC_DATA2IN_ADDR_MASK (0xffffffff)
// args: data (32-bit)
static inline void gdc_data2in_addr_write(u32 msb, u32 data, u32 dev_type,
u32 core_id)
{
if (dev_type == ARM_GDC)
system_gdc_write_32(0x30L, data, core_id);
else
system_gdc_write_32(ISP_DWAP_TOP_SRC_U_CTRL0,
(((u64)msb << 32) + data) >> 4, core_id);
}
static inline u32 gdc_data2in_addr_read(void)
{
return system_gdc_read_32(0x30L, 0);
}
// ----------------------------------- //
// Register: data2in line offset
// ----------------------------------- //
// ----------------------------------- //
// Address difference between adjacent
// lines for the 2nd plane in the input
// frame buffer (in bytes, AXI word aligned)
// ----------------------------------- //
#define GDC_DATA2IN_LINE_OFFSET_DEFAULT (0x0)
#define GDC_DATA2IN_LINE_OFFSET_DATASIZE (32)
#define GDC_DATA2IN_LINE_OFFSET_OFFSET (0x34)
#define GDC_DATA2IN_LINE_OFFSET_MASK (0xffffffff)
// args: data (32-bit)
static inline void gdc_data2in_line_offset_write(u32 data, u32 dev_type,
u32 core_id)
{
if (dev_type == ARM_GDC) {
system_gdc_write_32(0x34L, data, core_id);
} else {
data = DEWARP_STRIDE_ALIGN(data);
system_gdc_write_32(ISP_DWAP_TOP_SRC_U_CTRL1, data, core_id);
}
}
static inline u32 gdc_data2in_line_offset_read(void)
{
return system_gdc_read_32(0x34L, 0);
}
// ----------------------------------- //
// Register: data3in addr
// ----------------------------------- //
// ----------------------------------- //
// Base address of the 3rd plane in the
// input frame buffer
// (in bytes, AXI word aligned)
// ----------------------------------- //
#define GDC_DATA3IN_ADDR_DEFAULT (0x0)
#define GDC_DATA3IN_ADDR_DATASIZE (32)
#define GDC_DATA3IN_ADDR_OFFSET (0x38)
#define GDC_DATA3IN_ADDR_MASK (0xffffffff)
// args: data (32-bit)
static inline void gdc_data3in_addr_write(u32 msb, u32 data, u32 dev_type,
u32 core_id)
{
if (dev_type == ARM_GDC)
system_gdc_write_32(0x38L, data, core_id);
else
system_gdc_write_32(ISP_DWAP_TOP_SRC_V_CTRL0,
(((u64)msb << 32) + data) >> 4, core_id);
}
static inline u32 gdc_data3in_addr_read(void)
{
return system_gdc_read_32(0x38L, 0);
}
// ----------------------------------- //
// Register: data3in line offset
// ----------------------------------- //
// ----------------------------------- //
// Address difference between adjacent
// lines for the 3rd plane in the
// input frame buffer (in bytes,
// AXI word aligned)
// ----------------------------------- //
#define GDC_DATA3IN_LINE_OFFSET_DEFAULT (0x0)
#define GDC_DATA3IN_LINE_OFFSET_DATASIZE (32)
#define GDC_DATA3IN_LINE_OFFSET_OFFSET (0x3c)
#define GDC_DATA3IN_LINE_OFFSET_MASK (0xffffffff)
// args: data (32-bit)
static inline void gdc_data3in_line_offset_write(u32 data, u32 dev_type,
u32 core_id)
{
if (dev_type == ARM_GDC) {
system_gdc_write_32(0x3cL, data, core_id);
} else {
data = DEWARP_STRIDE_ALIGN(data);
system_gdc_write_32(ISP_DWAP_TOP_SRC_V_CTRL1, data, core_id);
}
}
static inline u32 gdc_data3in_line_offset_read(void)
{
return system_gdc_read_32(0x3cL, 0);
}
// ----------------------------------- //
// Register: dataout width
// ----------------------------------- //
// ----------------------------------- //
// Width of the output image (in pixels)
// ----------------------------------- //
#define GDC_DATAOUT_WIDTH_DEFAULT (0x0)
#define GDC_DATAOUT_WIDTH_DATASIZE (16)
#define GDC_DATAOUT_WIDTH_OFFSET (0x40)
#define GDC_DATAOUT_WIDTH_MASK (0xffff)
// args: data (16-bit)
static inline void gdc_dataout_width_write(u16 data, u32 dev_type, u32 core_id)
{
u32 curr;
if (dev_type == ARM_GDC) {
curr = system_gdc_read_32(0x40L, core_id);
system_gdc_write_32(0x40L, ((curr & 0xffff0000) | data),
core_id);
} else {
curr = system_gdc_read_32(ISP_DWAP_TOP_DST_FSIZE, core_id);
system_gdc_write_32(ISP_DWAP_TOP_DST_FSIZE,
((curr & 0x0000ffff) | (data << 16)),
core_id);
}
}
static inline uint16_t gdc_dataout_width_read(void)
{
return (uint16_t)((system_gdc_read_32(0x40L, 0) & 0xffff) >> 0);
}
// ----------------------------------- //
// Register: dataout height
// ----------------------------------- //
// ----------------------------------- //
// Height of the output image (in pixels)
// ----------------------------------- //
#define GDC_DATAOUT_HEIGHT_DEFAULT (0x0)
#define GDC_DATAOUT_HEIGHT_DATASIZE (16)
#define GDC_DATAOUT_HEIGHT_OFFSET (0x44)
#define GDC_DATAOUT_HEIGHT_MASK (0xffff)
// args: data (16-bit)
static inline void gdc_dataout_height_write(u16 data, u32 dev_type, u32 core_id)
{
u32 curr;
if (dev_type == ARM_GDC) {
curr = system_gdc_read_32(0x44L, core_id);
system_gdc_write_32(0x44L, ((curr & 0xffff0000) | data),
core_id);
} else {
curr = system_gdc_read_32(ISP_DWAP_TOP_DST_FSIZE, core_id);
system_gdc_write_32(ISP_DWAP_TOP_DST_FSIZE,
((curr & 0xffff0000) | data), core_id);
}
}
static inline uint16_t gdc_dataout_height_read(void)
{
return (uint16_t)((system_gdc_read_32(0x44L, 0) & 0xffff) >> 0);
}
// ----------------------------------- //
// Register: data1out addr
// ----------------------------------- //
// ----------------------------------- //
// Base address of the 1st plane in the
// output frame buffer
// (in bytes, AXI word aligned)
// ----------------------------------- //
#define GDC_DATA1OUT_ADDR_DEFAULT (0x0)
#define GDC_DATA1OUT_ADDR_DATASIZE (32)
#define GDC_DATA1OUT_ADDR_OFFSET (0x48)
#define GDC_DATA1OUT_ADDR_MASK (0xffffffff)
// args: data (32-bit)
static inline void gdc_data1out_addr_write(u32 msb, u32 data, u32 dev_type,
u32 core_id)
{
if (dev_type == ARM_GDC)
system_gdc_write_32(0x48L, data, core_id);
else
system_gdc_write_32(ISP_DWAP_TOP_DST_Y_CTRL0,
(((u64)msb << 32) + data) >> 4, core_id);
}
static inline u32 gdc_data1out_addr_read(void)
{
return system_gdc_read_32(0x48L, 0);
}
// ----------------------------------- //
// Register: data1out line offset
// ----------------------------------- //
// ----------------------------------- //
// Address difference between adjacent
// lines for the 1st plane in the
// output frame buffer (in bytes, AXI word aligned)
// ----------------------------------- //
#define GDC_DATA1OUT_LINE_OFFSET_DEFAULT (0x0)
#define GDC_DATA1OUT_LINE_OFFSET_DATASIZE (32)
#define GDC_DATA1OUT_LINE_OFFSET_OFFSET (0x4c)
#define GDC_DATA1OUT_LINE_OFFSET_MASK (0xffffffff)
// args: data (32-bit)
static inline void gdc_data1out_line_offset_write(u32 data, u32 dev_type,
u32 core_id)
{
if (dev_type == ARM_GDC) {
system_gdc_write_32(0x4cL, data, core_id);
} else {
data = DEWARP_STRIDE_ALIGN(data);
system_gdc_write_32(ISP_DWAP_TOP_DST_Y_CTRL1, data, core_id);
}
}
static inline u32 gdc_data1out_line_offset_read(void)
{
return system_gdc_read_32(0x4cL, 0);
}
// ----------------------------------- //
// Register: data2out addr
// ----------------------------------- //
// ----------------------------------- //
// Base address of the 2nd plane in the
// output frame buffer (in bytes, AXI word aligned)
// ----------------------------------- //
#define GDC_DATA2OUT_ADDR_DEFAULT (0x0)
#define GDC_DATA2OUT_ADDR_DATASIZE (32)
#define GDC_DATA2OUT_ADDR_OFFSET (0x50)
#define GDC_DATA2OUT_ADDR_MASK (0xffffffff)
// args: data (32-bit)
static inline void gdc_data2out_addr_write(u32 msb, u32 data, u32 dev_type,
u32 core_id)
{
if (dev_type == ARM_GDC)
system_gdc_write_32(0x50L, data, core_id);
else
system_gdc_write_32(ISP_DWAP_TOP_DST_U_CTRL0,
(((u64)msb << 32) + data) >> 4, core_id);
}
static inline u32 gdc_data2out_addr_read(void)
{
return system_gdc_read_32(0x50L, 0);
}
// ----------------------------------- //
// Register: data2out line offset
// ----------------------------------- //
// ----------------------------------- //
// Address difference between adjacent lines
// for the 2ndt plane in the
// output frame buffer (in bytes, AXI word aligned)
// ----------------------------------- //
#define GDC_DATA2OUT_LINE_OFFSET_DEFAULT (0x0)
#define GDC_DATA2OUT_LINE_OFFSET_DATASIZE (32)
#define GDC_DATA2OUT_LINE_OFFSET_OFFSET (0x54)
#define GDC_DATA2OUT_LINE_OFFSET_MASK (0xffffffff)
// args: data (32-bit)
static inline void gdc_data2out_line_offset_write(u32 data, u32 dev_type,
u32 core_id)
{
if (dev_type == ARM_GDC) {
system_gdc_write_32(0x54L, data, core_id);
} else {
data = DEWARP_STRIDE_ALIGN(data);
system_gdc_write_32(ISP_DWAP_TOP_DST_U_CTRL1, data, core_id);
}
}
static inline u32 gdc_data2out_line_offset_read(void)
{
return system_gdc_read_32(0x54L, 0);
}
// ----------------------------------- //
// Register: data3out addr
// ----------------------------------- //
// ----------------------------------- //
// Base address of the 3rd plane in the
// output frame buffer (in bytes, AXI word aligned)
// ----------------------------------- //
#define GDC_DATA3OUT_ADDR_DEFAULT (0x0)
#define GDC_DATA3OUT_ADDR_DATASIZE (32)
#define GDC_DATA3OUT_ADDR_OFFSET (0x58)
#define GDC_DATA3OUT_ADDR_MASK (0xffffffff)
// args: data (32-bit)
static inline void gdc_data3out_addr_write(u32 msb, u32 data, u32 dev_type,
u32 core_id)
{
if (dev_type == ARM_GDC)
system_gdc_write_32(0x58L, data, core_id);
else
system_gdc_write_32(ISP_DWAP_TOP_DST_V_CTRL0,
(((u64)msb << 32) + data) >> 4, core_id);
}
static inline u32 gdc_data3out_addr_read(void)
{
return system_gdc_read_32(0x58L, 0);
}
// ----------------------------------- //
// Register: data3out line offset
// ----------------------------------- //
// ----------------------------------- //
// Address difference between adjacent
// lines for the 3rd plane in the
// output frame buffer (in bytes, AXI word aligned)
// ----------------------------------- //
#define GDC_DATA3OUT_LINE_OFFSET_DEFAULT (0x0)
#define GDC_DATA3OUT_LINE_OFFSET_DATASIZE (32)
#define GDC_DATA3OUT_LINE_OFFSET_OFFSET (0x5c)
#define GDC_DATA3OUT_LINE_OFFSET_MASK (0xffffffff)
// args: data (32-bit)
static inline void gdc_data3out_line_offset_write(u32 data, u32 dev_type,
u32 core_id)
{
if (dev_type == ARM_GDC) {
system_gdc_write_32(0x5cL, data, core_id);
} else {
data = DEWARP_STRIDE_ALIGN(data);
system_gdc_write_32(ISP_DWAP_TOP_DST_V_CTRL1, data, core_id);
}
}
static inline u32 gdc_data3out_line_offset_read(void)
{
return system_gdc_read_32(0x5cL, 0);
}
// ----------------------------------- //
// Register: status
// ----------------------------------- //
// ----------------------------------- //
// word with status fields:
// ----------------------------------- //
#define GDC_STATUS_DEFAULT (0x0)
#define GDC_STATUS_DATASIZE (32)
#define GDC_STATUS_OFFSET (0x60)
#define GDC_STATUS_MASK (0xffffffff)
// args: data (32-bit)
static inline u32 gdc_status_read(void)
{
return system_gdc_read_32(0x60L, 0);
}
// ----------------------------------- //
// Register: busy
// ----------------------------------- //
// ----------------------------------- //
// Busy 1 = processing in progress,
// 0 = ready for next image
// ----------------------------------- //
#define GDC_BUSY_DEFAULT (0x0)
#define GDC_BUSY_DATASIZE (1)
#define GDC_BUSY_OFFSET (0x60)
#define GDC_BUSY_MASK (0x1)
// args: data (1-bit)
static inline void gdc_busy_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x60L, 0);
system_gdc_write_32(0x60L, ((data & 0x1) << 0) | (curr & 0xfffffffe),
0);
}
static inline uint8_t gdc_busy_read(void)
{
return (uint8_t)((system_gdc_read_32(0x60L, 0) & 0x1) >> 0);
}
// ----------------------------------- //
// Register: error
// ----------------------------------- //
// ----------------------------------- //
// Error flag: last operation was finished with error (see bits 15:8)
// ----------------------------------- //
#define GDC_ERROR_DEFAULT (0x0)
#define GDC_ERROR_DATASIZE (1)
#define GDC_ERROR_OFFSET (0x60)
#define GDC_ERROR_MASK (0x2)
// args: data (1-bit)
static inline void gdc_error_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x60L, 0);
u32 val = ((data & 0x1) << 1) | (curr & 0xfffffffd);
system_gdc_write_32(0x60L, val, 0);
}
static inline uint8_t gdc_error_read(void)
{
return (uint8_t)((system_gdc_read_32(0x60L, 0) & 0x2) >> 1);
}
// ----------------------------------- //
// Register: Reserved for future use 1
// ----------------------------------- //
#define GDC_RESERVED_FOR_FUTURE_USE_1_DEFAULT (0x0)
#define GDC_RESERVED_FOR_FUTURE_USE_1_DATASIZE (6)
#define GDC_RESERVED_FOR_FUTURE_USE_1_OFFSET (0x60)
#define GDC_RESERVED_FOR_FUTURE_USE_1_MASK (0xfc)
// args: data (6-bit)
static inline void gdc_reserved_for_future_use_1_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x60L, 0);
u32 val = ((data & 0x3f) << 2) | (curr & 0xffffff03);
system_gdc_write_32(0x60L, val, 0);
}
static inline uint8_t gdc_reserved_for_future_use_1_read(void)
{
return (uint8_t)((system_gdc_read_32(0x60L, 0) & 0xfc) >> 2);
}
// ----------------------------------- //
// Register: configuration error
// ----------------------------------- //
// ----------------------------------- //
// Configuration error (wrong configuration stream)
// ----------------------------------- //
#define GDC_CONFIGURATION_ERROR_DEFAULT (0x0)
#define GDC_CONFIGURATION_ERROR_DATASIZE (1)
#define GDC_CONFIGURATION_ERROR_OFFSET (0x60)
#define GDC_CONFIGURATION_ERROR_MASK (0x100)
// args: data (1-bit)
static inline void gdc_configuration_error_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x60L, 0);
u32 val = ((data & 0x1) << 8) | (curr & 0xfffffeff);
system_gdc_write_32(0x60L, val, 0);
}
static inline uint8_t gdc_configuration_error_read(void)
{
return (uint8_t)((system_gdc_read_32(0x60L, 0) & 0x100) >> 8);
}
// ----------------------------------- //
// Register: user abort
// ----------------------------------- //
// ----------------------------------- //
// User abort (stop/reset command)
// ----------------------------------- //
#define GDC_USER_ABORT_DEFAULT (0x0)
#define GDC_USER_ABORT_DATASIZE (1)
#define GDC_USER_ABORT_OFFSET (0x60)
#define GDC_USER_ABORT_MASK (0x200)
// args: data (1-bit)
static inline void gdc_user_abort_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x60L, 0);
u32 val = ((data & 0x1) << 9) | (curr & 0xfffffdff);
system_gdc_write_32(0x60L, val, 0);
}
static inline uint8_t gdc_user_abort_read(void)
{
return (uint8_t)((system_gdc_read_32(0x60L, 0) & 0x200) >> 9);
}
// ----------------------------------- //
// Register: AXI reader error
// ----------------------------------- //
// ----------------------------------- //
// AXI reader error (e.g. error code returned by fabric)
// ----------------------------------- //
#define GDC_AXI_READER_ERROR_DEFAULT (0x0)
#define GDC_AXI_READER_ERROR_DATASIZE (1)
#define GDC_AXI_READER_ERROR_OFFSET (0x60)
#define GDC_AXI_READER_ERROR_MASK (0x400)
// args: data (1-bit)
static inline void gdc_axi_reader_error_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x60L, 0);
u32 val = ((data & 0x1) << 10) | (curr & 0xfffffbff);
system_gdc_write_32(0x60L, val, 0);
}
static inline uint8_t gdc_axi_reader_error_read(void)
{
return (uint8_t)((system_gdc_read_32(0x60L, 0) & 0x400) >> 10);
}
// ----------------------------------- //
// Register: AXI writer error
// ----------------------------------- //
// ----------------------------------- //
// AXI writer error
// ----------------------------------- //
#define GDC_AXI_WRITER_ERROR_DEFAULT (0x0)
#define GDC_AXI_WRITER_ERROR_DATASIZE (1)
#define GDC_AXI_WRITER_ERROR_OFFSET (0x60)
#define GDC_AXI_WRITER_ERROR_MASK (0x800)
// args: data (1-bit)
static inline void gdc_axi_writer_error_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x60L, 0);
u32 val = ((data & 0x1) << 11) | (curr & 0xfffff7ff);
system_gdc_write_32(0x60L, val, 0);
}
static inline uint8_t gdc_axi_writer_error_read(void)
{
return (uint8_t)((system_gdc_read_32(0x60L, 0) & 0x800) >> 11);
}
// ----------------------------------- //
// Register: Unaligned access
// ----------------------------------- //
// ----------------------------------- //
// Unaligned access (address pointer is not aligned)
// ----------------------------------- //
#define GDC_UNALIGNED_ACCESS_DEFAULT (0x0)
#define GDC_UNALIGNED_ACCESS_DATASIZE (1)
#define GDC_UNALIGNED_ACCESS_OFFSET (0x60)
#define GDC_UNALIGNED_ACCESS_MASK (0x1000)
// args: data (1-bit)
static inline void gdc_unaligned_access_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x60L, 0);
u32 val = ((data & 0x1) << 12) | (curr & 0xffffefff);
system_gdc_write_32(0x60L, val, 0);
}
static inline uint8_t gdc_unaligned_access_read(void)
{
return (uint8_t)((system_gdc_read_32(0x60L, 0) & 0x1000) >> 12);
}
// ----------------------------------- //
// Register: Incompatible configuration
// ----------------------------------- //
// ----------------------------------- //
// Incompatible configuration (request
// of unimplemented mode of operation,
// e.g. unsupported image format,
// unsupported module mode in the configuration stream)
// ----------------------------------- //
#define GDC_INCOMPATIBLE_CONFIGURATION_DEFAULT (0x0)
#define GDC_INCOMPATIBLE_CONFIGURATION_DATASIZE (1)
#define GDC_INCOMPATIBLE_CONFIGURATION_OFFSET (0x60)
#define GDC_INCOMPATIBLE_CONFIGURATION_MASK (0x2000)
// args: data (1-bit)
static inline void gdc_incompatible_configuration_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x60L, 0);
u32 val = ((data & 0x1) << 13) | (curr & 0xffffdfff);
system_gdc_write_32(0x60L, val, 0);
}
static inline uint8_t gdc_incompatible_configuration_read(void)
{
return (uint8_t)((system_gdc_read_32(0x60L, 0) & 0x2000) >> 13);
}
// ----------------------------------- //
// Register: Reserved for future use 2
// ----------------------------------- //
#define GDC_RESERVED_FOR_FUTURE_USE_2_DEFAULT (0x0)
#define GDC_RESERVED_FOR_FUTURE_USE_2_DATASIZE (18)
#define GDC_RESERVED_FOR_FUTURE_USE_2_OFFSET (0x60)
#define GDC_RESERVED_FOR_FUTURE_USE_2_MASK (0xffffc000)
// args: data (18-bit)
static inline void gdc_reserved_for_future_use_2_write(u32 data)
{
u32 curr = system_gdc_read_32(0x60L, 0);
u32 val = ((data & 0x3ffff) << 14) | (curr & 0x3fff);
system_gdc_write_32(0x60L, val, 0);
}
static inline u32 gdc_reserved_for_future_use_2_read(void)
{
return (u32)((system_gdc_read_32(0x60L, 0) & 0xffffc000) >> 14);
}
// ----------------------------------- //
// Register: config
// ----------------------------------- //
#define GDC_CONFIG_DEFAULT (0x0)
#define GDC_CONFIG_DATASIZE (32)
#define GDC_CONFIG_OFFSET (0x64)
#define GDC_CONFIG_MASK (0xffffffff)
// args: data (32-bit)
static inline void gdc_config_write(u32 data)
{
system_gdc_write_32(0x64L, data, 0);
}
static inline u32 gdc_config_read(void)
{
return system_gdc_read_32(0x64L, 0);
}
// ----------------------------------- //
// Register: start flag
// ----------------------------------- //
// ----------------------------------- //
// Start flag: transition from 0 to 1
// latches the data on the configuration ports
// and starts the processing
// ----------------------------------- //
#define GDC_START_FLAG_DEFAULT (0x0)
#define GDC_START_FLAG_DATASIZE (1)
#define GDC_START_FLAG_OFFSET (0x64)
#define GDC_START_FLAG_MASK (0x1)
// args: data (1-bit)
static inline void gdc_start_flag_write(u8 data, u32 dev_type, u32 core_id)
{
if (dev_type == ARM_GDC) {
u32 curr = system_gdc_read_32(0x64L, core_id);
u32 val = ((data & 0x1) << 0) | (curr & 0xfffffffe);
system_gdc_write_32(0x64L, val, core_id);
} else {
if (data) {
/* secure mem access */
u32 sec_bit = system_gdc_read_32(ISP_DWAP_TOP_CTRL0,
core_id) & (1 << 5);
u32 val = 0;
val = sec_bit |
1 << 30 | /* reg_sw_rst */
0 << 16 | /* reg_stdly_num */
1 << 2 ; /* reg_hs_sel */
system_gdc_write_32(ISP_DWAP_TOP_CTRL0, val, core_id);
val = sec_bit | 1 << 31 | 1 << 2; /* reg_frm_rst */
system_gdc_write_32(ISP_DWAP_TOP_CTRL0, val, core_id);
}
}
}
static inline void gdc_secure_set(u8 data, u32 dev_type, u32 core_id)
{
if (dev_type == ARM_GDC) {
#ifdef CONFIG_AMLOGIC_TEE
tee_config_device_state(DMC_DEV_ID_GDC, data);
#endif
} else {
u32 val = system_gdc_read_32(ISP_DWAP_TOP_CTRL0, core_id);
if (data)
val |= 1 << 5;
else
val &= ~(1 << 5);
system_gdc_write_32(ISP_DWAP_TOP_CTRL0, val, core_id);
}
gdc_log(LOG_DEBUG, "secure mode:%d, dev_type:%d\n", data, dev_type);
}
static inline uint8_t gdc_start_flag_read(void)
{
return (uint8_t)((system_gdc_read_32(0x64L, 0) & 0x1) >> 0);
}
// ----------------------------------- //
// Register: stop flag
// ----------------------------------- //
// ----------------------------------- //
// Stop/reset flag: 0 - normal operation,
// 1 means to initiate internal cleanup procedure
// to abandon the current frame
// and prepare for processing of the next frame.
// The busy flag in status word should be
// cleared at the end of this process
// ----------------------------------- //
#define GDC_STOP_FLAG_DEFAULT (0x0)
#define GDC_STOP_FLAG_DATASIZE (1)
#define GDC_STOP_FLAG_OFFSET (0x64)
#define GDC_STOP_FLAG_MASK (0x2)
// args: data (1-bit)
static inline void gdc_stop_flag_write(u8 data, u32 dev_type, u32 core_id)
{
if (dev_type == ARM_GDC) {
u32 curr = system_gdc_read_32(0x64L, core_id);
u32 val = ((data & 0x1) << 1) | (curr & 0xfffffffd);
system_gdc_write_32(0x64L, val, core_id);
}
}
static inline uint8_t gdc_stop_flag_read(void)
{
return (uint8_t)((system_gdc_read_32(0x64L, 0) & 0x2) >> 1);
}
// ----------------------------------- //
// Register: Reserved for future use 3
// ----------------------------------- //
#define GDC_RESERVED_FOR_FUTURE_USE_3_DEFAULT (0x0)
#define GDC_RESERVED_FOR_FUTURE_USE_3_DATASIZE (30)
#define GDC_RESERVED_FOR_FUTURE_USE_3_OFFSET (0x64)
#define GDC_RESERVED_FOR_FUTURE_USE_3_MASK (0xfffffffc)
// args: data (30-bit)
static inline void gdc_reserved_for_future_use_3_write(u32 data)
{
u32 curr = system_gdc_read_32(0x64L, 0);
u32 val = ((data & 0x3fffffff) << 2) | (curr & 0x3);
system_gdc_write_32(0x64L, val, 0);
}
static inline u32 gdc_reserved_for_future_use_3_read(void)
{
return (u32)((system_gdc_read_32(0x64L, 0) & 0xfffffffc) >> 2);
}
// ----------------------------------- //
// Register: Capability mask
// ----------------------------------- //
#define GDC_CAPABILITY_MASK_DEFAULT (0x0)
#define GDC_CAPABILITY_MASK_DATASIZE (32)
#define GDC_CAPABILITY_MASK_OFFSET (0x68)
#define GDC_CAPABILITY_MASK_MASK (0xffffffff)
// args: data (32-bit)
static inline u32 gdc_capability_mask_read(void)
{
return system_gdc_read_32(0x68L, 0);
}
// ----------------------------------- //
// Register: Eight bit data suppoirted
// ----------------------------------- //
// ----------------------------------- //
// 8 bit data supported
// ----------------------------------- //
#define GDC_EIGHT_BIT_DATA_SUPPOIRTED_DEFAULT (0x0)
#define GDC_EIGHT_BIT_DATA_SUPPOIRTED_DATASIZE (1)
#define GDC_EIGHT_BIT_DATA_SUPPOIRTED_OFFSET (0x68)
#define GDC_EIGHT_BIT_DATA_SUPPOIRTED_MASK (0x1)
// args: data (1-bit)
static inline void gdc_eight_bit_data_suppoirted_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x68L, 0);
u32 val = ((data & 0x1) << 0) | (curr & 0xfffffffe);
system_gdc_write_32(0x68L, val, 0);
}
static inline uint8_t gdc_eight_bit_data_suppoirted_read(void)
{
return (uint8_t)((system_gdc_read_32(0x68L, 0) & 0x1) >> 0);
}
// ----------------------------------- //
// Register: Ten bit data supported
// ----------------------------------- //
// ----------------------------------- //
// 10 bit data supported
// ----------------------------------- //
#define GDC_TEN_BIT_DATA_SUPPORTED_DEFAULT (0x0)
#define GDC_TEN_BIT_DATA_SUPPORTED_DATASIZE (1)
#define GDC_TEN_BIT_DATA_SUPPORTED_OFFSET (0x68)
#define GDC_TEN_BIT_DATA_SUPPORTED_MASK (0x2)
// args: data (1-bit)
static inline void gdc_ten_bit_data_supported_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x68L, 0);
u32 val = ((data & 0x1) << 1) | (curr & 0xfffffffd);
system_gdc_write_32(0x68L, val, 0);
}
static inline uint8_t gdc_ten_bit_data_supported_read(void)
{
return (uint8_t)((system_gdc_read_32(0x68L, 0) & 0x2) >> 1);
}
// ----------------------------------- //
// Register: Grayscale supported
// ----------------------------------- //
// ----------------------------------- //
// grayscale supported
// ----------------------------------- //
#define GDC_GRAYSCALE_SUPPORTED_DEFAULT (0x0)
#define GDC_GRAYSCALE_SUPPORTED_DATASIZE (1)
#define GDC_GRAYSCALE_SUPPORTED_OFFSET (0x68)
#define GDC_GRAYSCALE_SUPPORTED_MASK (0x4)
// args: data (1-bit)
static inline void gdc_grayscale_supported_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x68L, 0);
u32 val = ((data & 0x1) << 2) | (curr & 0xfffffffb);
system_gdc_write_32(0x68L, val, 0);
}
static inline uint8_t gdc_grayscale_supported_read(void)
{
return (uint8_t)((system_gdc_read_32(0x68L, 0) & 0x4) >> 2);
}
// ----------------------------------- //
// Register: RGBA888 supported
// ----------------------------------- //
// ----------------------------------- //
// RGBA8:8:8/YUV4:4:4 mode supported
// ----------------------------------- //
#define GDC_RGBA888_SUPPORTED_DEFAULT (0x0)
#define GDC_RGBA888_SUPPORTED_DATASIZE (1)
#define GDC_RGBA888_SUPPORTED_OFFSET (0x68)
#define GDC_RGBA888_SUPPORTED_MASK (0x8)
// args: data (1-bit)
static inline void gdc_rgba888_supported_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x68L, 0);
u32 val = ((data & 0x1) << 3) | (curr & 0xfffffff7);
system_gdc_write_32(0x68L, val, 0);
}
static inline uint8_t gdc_rgba888_supported_read(void)
{
return (uint8_t)((system_gdc_read_32(0x68L, 0) & 0x8) >> 3);
}
// ----------------------------------- //
// Register: RGB YUV444 planar supported
// ----------------------------------- //
// ----------------------------------- //
// RGB/YUV444 planar modes supported
// ----------------------------------- //
#define GDC_RGB_YUV444_PLANAR_SUPPORTED_DEFAULT (0x0)
#define GDC_RGB_YUV444_PLANAR_SUPPORTED_DATASIZE (1)
#define GDC_RGB_YUV444_PLANAR_SUPPORTED_OFFSET (0x68)
#define GDC_RGB_YUV444_PLANAR_SUPPORTED_MASK (0x10)
// args: data (1-bit)
static inline void gdc_rgb_yuv444_planar_supported_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x68L, 0);
u32 val = ((data & 0x1) << 4) | (curr & 0xffffffef);
system_gdc_write_32(0x68L, val, 0);
}
static inline uint8_t gdc_rgb_yuv444_planar_supported_read(void)
{
return (uint8_t)((system_gdc_read_32(0x68L, 0) & 0x10) >> 4);
}
// ----------------------------------- //
// Register: YUV semiplanar supported
// ----------------------------------- //
// ----------------------------------- //
// YUV semiplanar modes supported
// ----------------------------------- //
#define GDC_YUV_SEMIPLANAR_SUPPORTED_DEFAULT (0x0)
#define GDC_YUV_SEMIPLANAR_SUPPORTED_DATASIZE (1)
#define GDC_YUV_SEMIPLANAR_SUPPORTED_OFFSET (0x68)
#define GDC_YUV_SEMIPLANAR_SUPPORTED_MASK (0x20)
// args: data (1-bit)
static inline void gdc_yuv_semiplanar_supported_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x68L, 0);
u32 val = ((data & 0x1) << 5) | (curr & 0xffffffdf);
system_gdc_write_32(0x68L, val, 0);
}
static inline uint8_t gdc_yuv_semiplanar_supported_read(void)
{
return (uint8_t)((system_gdc_read_32(0x68L, 0) & 0x20) >> 5);
}
// ----------------------------------- //
// Register: YUV422 linear mode supported
// ----------------------------------- //
// ----------------------------------- //
// YUV4:2:2 linear mode supported (16 bit/pixel)
// ----------------------------------- //
#define GDC_YUV422_LINEAR_MODE_SUPPORTED_DEFAULT (0x0)
#define GDC_YUV422_LINEAR_MODE_SUPPORTED_DATASIZE (1)
#define GDC_YUV422_LINEAR_MODE_SUPPORTED_OFFSET (0x68)
#define GDC_YUV422_LINEAR_MODE_SUPPORTED_MASK (0x40)
// args: data (1-bit)
static inline void gdc_yuv422_linear_mode_supported_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x68L, 0);
u32 val = ((data & 0x1) << 6) | (curr & 0xffffffbf);
system_gdc_write_32(0x68L, val, 0);
}
static inline uint8_t gdc_yuv422_linear_mode_supported_read(void)
{
return (uint8_t)((system_gdc_read_32(0x68L, 0) & 0x40) >> 6);
}
// ----------------------------------- //
// Register: RGB10_10_10 supported
// ----------------------------------- //
// ----------------------------------- //
// RGB10:10:10 mode supported
// ----------------------------------- //
#define GDC_RGB10_10_10_SUPPORTED_DEFAULT (0x0)
#define GDC_RGB10_10_10_SUPPORTED_DATASIZE (1)
#define GDC_RGB10_10_10_SUPPORTED_OFFSET (0x68)
#define GDC_RGB10_10_10_SUPPORTED_MASK (0x80)
// args: data (1-bit)
static inline void gdc_rgb10_10_10_supported_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x68L, 0);
u32 val = ((data & 0x1) << 7) | (curr & 0xffffff7f);
system_gdc_write_32(0x68L, val, 0);
}
static inline uint8_t gdc_rgb10_10_10_supported_read(void)
{
return (uint8_t)((system_gdc_read_32(0x68L, 0) & 0x80) >> 7);
}
// ----------------------------------- //
// Register: Bicubic interpolation supported
// ----------------------------------- //
// ----------------------------------- //
// 4 tap bicubic interpolation supported
// ----------------------------------- //
#define GDC_BICUBIC_INTERPOLATION_SUPPORTED_DEFAULT (0x0)
#define GDC_BICUBIC_INTERPOLATION_SUPPORTED_DATASIZE (1)
#define GDC_BICUBIC_INTERPOLATION_SUPPORTED_OFFSET (0x68)
#define GDC_BICUBIC_INTERPOLATION_SUPPORTED_MASK (0x100)
// args: data (1-bit)
static inline void gdc_bicubic_interpolation_supported_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x68L, 0);
u32 val = ((data & 0x1) << 8) | (curr & 0xfffffeff);
system_gdc_write_32(0x68L, val, 0);
}
static inline uint8_t gdc_bicubic_interpolation_supported_read(void)
{
return (uint8_t)((system_gdc_read_32(0x68L, 0) & 0x100) >> 8);
}
// ----------------------------------- //
// Register: Bilinear interpolation mode 1 supported
// ----------------------------------- //
// ----------------------------------- //
// bilinear interpolation mode 1 supported {for U,V components}
// ----------------------------------- //
#define GDC_BILINEAR_INTERPOLATION_MODE_1_SUPPORTED_DEFAULT (0x0)
#define GDC_BILINEAR_INTERPOLATION_MODE_1_SUPPORTED_DATASIZE (1)
#define GDC_BILINEAR_INTERPOLATION_MODE_1_SUPPORTED_OFFSET (0x68)
#define GDC_BILINEAR_INTERPOLATION_MODE_1_SUPPORTED_MASK (0x200)
// args: data (1-bit)
static inline void
gdc_bilinear_interpolation_mode_1_supported_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x68L, 0);
u32 val = ((data & 0x1) << 9) | (curr & 0xfffffdff);
system_gdc_write_32(0x68L, val, 0);
}
static inline uint8_t gdc_bilinear_interpolation_mode_1_supported_read(void)
{
return (uint8_t)((system_gdc_read_32(0x68L, 0) & 0x200) >> 9);
}
// ----------------------------------- //
// Register: Bilinear interpolation mode 2 supported
// ----------------------------------- //
// ----------------------------------- //
// bilinear interpolation mode 2 supported {for U,V components}
// ----------------------------------- //
#define GDC_BILINEAR_INTERPOLATION_MODE_2_SUPPORTED_DEFAULT (0x0)
#define GDC_BILINEAR_INTERPOLATION_MODE_2_SUPPORTED_DATASIZE (1)
#define GDC_BILINEAR_INTERPOLATION_MODE_2_SUPPORTED_OFFSET (0x68)
#define GDC_BILINEAR_INTERPOLATION_MODE_2_SUPPORTED_MASK (0x400)
// args: data (1-bit)
static inline void
gdc_bilinear_interpolation_mode_2_supported_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x68L, 0);
u32 val = ((data & 0x1) << 10) | (curr & 0xfffffbff);
system_gdc_write_32(0x68L, val, 0);
}
static inline uint8_t gdc_bilinear_interpolation_mode_2_supported_read(void)
{
return (uint8_t)((system_gdc_read_32(0x68L, 0) & 0x400) >> 10);
}
// ----------------------------------- //
// Register: Output of interpolation coordinates supported
// ----------------------------------- //
// ----------------------------------- //
// output of interpolation coordinates is supported
// ----------------------------------- //
#define GDC_OUTPUT_OF_INTERPOLATION_COORDINATES_SUPPORTED_DEFAULT (0x0)
#define GDC_OUTPUT_OF_INTERPOLATION_COORDINATES_SUPPORTED_DATASIZE (1)
#define GDC_OUTPUT_OF_INTERPOLATION_COORDINATES_SUPPORTED_OFFSET (0x68)
#define GDC_OUTPUT_OF_INTERPOLATION_COORDINATES_SUPPORTED_MASK (0x800)
// args: data (1-bit)
static inline void
gdc_output_of_interpolation_coordinates_supported_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x68L, 0);
u32 val = ((data & 0x1) << 11) | (curr & 0xfffff7ff);
system_gdc_write_32(0x68L, val, 0);
}
static inline uint8_t
gdc_output_of_interpolation_coordinates_supported_read(void)
{
return (uint8_t)((system_gdc_read_32(0x68L, 0) & 0x800) >> 11);
}
// ----------------------------------- //
// Register: Reserved for future use 4
// ----------------------------------- //
#define GDC_RESERVED_FOR_FUTURE_USE_4_DEFAULT (0x0)
#define GDC_RESERVED_FOR_FUTURE_USE_4_DATASIZE (4)
#define GDC_RESERVED_FOR_FUTURE_USE_4_OFFSET (0x68)
#define GDC_RESERVED_FOR_FUTURE_USE_4_MASK (0xf000)
// args: data (4-bit)
static inline void gdc_reserved_for_future_use_4_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x68L, 0);
u32 val = ((data & 0xf) << 12) | (curr & 0xffff0fff);
system_gdc_write_32(0x68L, val, 0);
}
static inline uint8_t gdc_reserved_for_future_use_4_read(void)
{
return (uint8_t)((system_gdc_read_32(0x68L, 0) & 0xf000) >> 12);
}
// ----------------------------------- //
// Register: Size of output cache
// ----------------------------------- //
// ----------------------------------- //
// log2(size of output cache in lines)-5 (0 - 32lines, 1 - 64 lines etc)
// ----------------------------------- //
#define GDC_SIZE_OF_OUTPUT_CACHE_DEFAULT (0x0)
#define GDC_SIZE_OF_OUTPUT_CACHE_DATASIZE (3)
#define GDC_SIZE_OF_OUTPUT_CACHE_OFFSET (0x68)
#define GDC_SIZE_OF_OUTPUT_CACHE_MASK (0x70000)
// args: data (3-bit)
static inline void gdc_size_of_output_cache_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x68L, 0);
u32 val = ((data & 0x7) << 16) | (curr & 0xfff8ffff);
system_gdc_write_32(0x68L, val, 0);
}
static inline uint8_t gdc_size_of_output_cache_read(void)
{
return (uint8_t)((system_gdc_read_32(0x68L, 0) & 0x70000) >> 16);
}
// ----------------------------------- //
// Register: Size of tile cache
// ----------------------------------- //
// ----------------------------------- //
// log2(size of tile cache in 16x16 clusters)
// ----------------------------------- //
#define GDC_SIZE_OF_TILE_CACHE_DEFAULT (0x0)
#define GDC_SIZE_OF_TILE_CACHE_DATASIZE (5)
#define GDC_SIZE_OF_TILE_CACHE_OFFSET (0x68)
#define GDC_SIZE_OF_TILE_CACHE_MASK (0xf80000)
// args: data (5-bit)
static inline void gdc_size_of_tile_cache_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x68L, 0);
u32 val = ((data & 0x1f) << 19) | (curr & 0xff07ffff);
system_gdc_write_32(0x68L, val, 0);
}
static inline uint8_t gdc_size_of_tile_cache_read(void)
{
return (uint8_t)((system_gdc_read_32(0x68L, 0) & 0xf80000) >> 19);
}
// ----------------------------------- //
// Register: Nuimber of polyphase filter banks
// ----------------------------------- //
// ----------------------------------- //
// log2(number of polyphase filter banks)
// ----------------------------------- //
#define GDC_NUIMBER_OF_POLYPHASE_FILTER_BANKS_DEFAULT (0x0)
#define GDC_NUIMBER_OF_POLYPHASE_FILTER_BANKS_DATASIZE (3)
#define GDC_NUIMBER_OF_POLYPHASE_FILTER_BANKS_OFFSET (0x68)
#define GDC_NUIMBER_OF_POLYPHASE_FILTER_BANKS_MASK (0x7000000)
// args: data (3-bit)
static inline void gdc_nuimber_of_polyphase_filter_banks_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x68L, 0);
u32 val = ((data & 0x7) << 24) | (curr & 0xf8ffffff);
system_gdc_write_32(0x68L, val, 0);
}
static inline uint8_t gdc_nuimber_of_polyphase_filter_banks_read(void)
{
return (uint8_t)((system_gdc_read_32(0x68L, 0) & 0x7000000) >> 24);
}
// ----------------------------------- //
// Register: AXI data width
// ----------------------------------- //
// ----------------------------------- //
// log2(AXI_DATA_WIDTH)-5
// ----------------------------------- //
#define GDC_AXI_DATA_WIDTH_DEFAULT (0x0)
#define GDC_AXI_DATA_WIDTH_DATASIZE (3)
#define GDC_AXI_DATA_WIDTH_OFFSET (0x68)
#define GDC_AXI_DATA_WIDTH_MASK (0x38000000)
// args: data (3-bit)
static inline void gdc_axi_data_width_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x68L, 0);
u32 val = ((data & 0x7) << 27) | (curr & 0xc7ffffff);
system_gdc_write_32(0x68L, val, 0);
}
static inline uint8_t gdc_axi_data_width_read(void)
{
return (uint8_t)((system_gdc_read_32(0x68L, 0) & 0x38000000) >> 27);
}
// ----------------------------------- //
// Register: Reserved for future use 5
// ----------------------------------- //
#define GDC_RESERVED_FOR_FUTURE_USE_5_DEFAULT (0x0)
#define GDC_RESERVED_FOR_FUTURE_USE_5_DATASIZE (2)
#define GDC_RESERVED_FOR_FUTURE_USE_5_OFFSET (0x68)
#define GDC_RESERVED_FOR_FUTURE_USE_5_MASK (0xc0000000)
// args: data (2-bit)
static inline void gdc_reserved_for_future_use_5_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0x68L, 0);
u32 val = ((data & 0x3) << 30) | (curr & 0x3fffffff);
system_gdc_write_32(0x68L, val, 0);
}
static inline uint8_t gdc_reserved_for_future_use_5_read(void)
{
return (uint8_t)((system_gdc_read_32(0x68L, 0) & 0xc0000000) >> 30);
}
// ----------------------------------- //
// Register: default ch1
// ----------------------------------- //
// ----------------------------------- //
// Default value for 1st data channel (Y/R color)
// to fill missing pixels (when coordinated
// are out of bound). LSB aligned
// ----------------------------------- //
#define GDC_DEFAULT_CH1_DEFAULT (0x0)
#define GDC_DEFAULT_CH1_DATASIZE (12)
#define GDC_DEFAULT_CH1_OFFSET (0x70)
#define GDC_DEFAULT_CH1_MASK (0xfff)
// args: data (12-bit)
static inline void gdc_default_ch1_write(uint16_t data)
{
u32 curr = system_gdc_read_32(0x70L, 0);
u32 val = ((data & 0xfff) << 0) | (curr & 0xfffff000);
system_gdc_write_32(0x70L, val, 0);
}
static inline uint16_t gdc_default_ch1_read(void)
{
return (uint16_t)((system_gdc_read_32(0x70L, 0) & 0xfff) >> 0);
}
// ----------------------------------- //
// Register: default ch2
// ----------------------------------- //
// ----------------------------------- //
// Default value for 2nd data channel
// (U/G color) to fill missing pixels
// (when coordinated are out of bound) LSB aligned
// ----------------------------------- //
#define GDC_DEFAULT_CH2_DEFAULT (0x0)
#define GDC_DEFAULT_CH2_DATASIZE (12)
#define GDC_DEFAULT_CH2_OFFSET (0x74)
#define GDC_DEFAULT_CH2_MASK (0xfff)
// args: data (12-bit)
static inline void gdc_default_ch2_write(uint16_t data)
{
u32 curr = system_gdc_read_32(0x74L, 0);
u32 val = ((data & 0xfff) << 0) | (curr & 0xfffff000);
system_gdc_write_32(0x74L, val, 0);
}
static inline uint16_t gdc_default_ch2_read(void)
{
return (uint16_t)((system_gdc_read_32(0x74L, 0) & 0xfff) >> 0);
}
// ----------------------------------- //
// Register: default ch3
// ----------------------------------- //
// ----------------------------------- //
// Default value for 3rd data channel
// (V/B color) to fill missing pixels
// (when coordinated are out of bound) LSB aligned
// ----------------------------------- //
#define GDC_DEFAULT_CH3_DEFAULT (0x0)
#define GDC_DEFAULT_CH3_DATASIZE (12)
#define GDC_DEFAULT_CH3_OFFSET (0x78)
#define GDC_DEFAULT_CH3_MASK (0xfff)
// args: data (12-bit)
static inline void gdc_default_ch3_write(uint16_t data)
{
u32 curr = system_gdc_read_32(0x78L, 0);
u32 val = ((data & 0xfff) << 0) | (curr & 0xfffff000);
system_gdc_write_32(0x78L, val, 0);
}
static inline uint16_t gdc_default_ch3_read(void)
{
return (uint16_t)((system_gdc_read_32(0x78L, 0) & 0xfff) >> 0);
}
// ----------------------------------- //
// Group: GDC diagnostics
// ----------------------------------- //
// ----------------------------------- //
// Register: cfg_stall_count0
// ----------------------------------- //
// ----------------------------------- //
// Cycles spent on stalls on configuration FIFO to tile reader
// ----------------------------------- //
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT0_DEFAULT (0x0)
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT0_DATASIZE (32)
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT0_OFFSET (0x80)
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT0_MASK (0xffffffff)
// args: data (32-bit)
static inline u32 gdc_diagnostics_cfg_stall_count0_read(void)
{
return system_gdc_read_32(0x80L, 0);
}
// ----------------------------------- //
// Register: cfg_stall_count1
// ----------------------------------- //
// ----------------------------------- //
// Cycles spent on stalls on configuration FIFO to CIM
// ----------------------------------- //
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT1_DEFAULT (0x0)
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT1_DATASIZE (32)
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT1_OFFSET (0x84)
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT1_MASK (0xffffffff)
// args: data (32-bit)
static inline u32 gdc_diagnostics_cfg_stall_count1_read(void)
{
return system_gdc_read_32(0x84L, 0);
}
// ----------------------------------- //
// Register: cfg_stall_count2
// ----------------------------------- //
// ----------------------------------- //
// Cycles spent on stalls on configuration FIFO to PIM
// ----------------------------------- //
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT2_DEFAULT (0x0)
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT2_DATASIZE (32)
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT2_OFFSET (0x88)
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT2_MASK (0xffffffff)
// args: data (32-bit)
static inline u32 gdc_diagnostics_cfg_stall_count2_read(void)
{
return system_gdc_read_32(0x88L, 0);
}
// ----------------------------------- //
// Register: cfg_stall_count3
// ----------------------------------- //
// ----------------------------------- //
// Cycles spent on stalls on configuration FIFO to write cache
// ----------------------------------- //
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT3_DEFAULT (0x0)
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT3_DATASIZE (32)
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT3_OFFSET (0x8c)
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT3_MASK (0xffffffff)
// args: data (32-bit)
static inline u32 gdc_diagnostics_cfg_stall_count3_read(void)
{
return system_gdc_read_32(0x8cL, 0);
}
// ----------------------------------- //
// Register: cfg_stall_count4
// ----------------------------------- //
// ----------------------------------- //
// Cycles spent on stalls on configuration FIFO to tile writer
// ----------------------------------- //
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT4_DEFAULT (0x0)
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT4_DATASIZE (32)
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT4_OFFSET (0x90)
#define GDC_DIAGNOSTICS_CFG_STALL_COUNT4_MASK (0xffffffff)
// args: data (32-bit)
static inline u32 gdc_diagnostics_cfg_stall_count4_read(void)
{
return system_gdc_read_32(0x90L, 0);
}
// ----------------------------------- //
// Register: int_read_stall_count
// ----------------------------------- //
// ----------------------------------- //
// Cycles spent on waiting on pixel interpolator read pixel stream
// ----------------------------------- //
#define GDC_DIAGNOSTICS_INT_READ_STALL_COUNT_DEFAULT (0x0)
#define GDC_DIAGNOSTICS_INT_READ_STALL_COUNT_DATASIZE (32)
#define GDC_DIAGNOSTICS_INT_READ_STALL_COUNT_OFFSET (0x94)
#define GDC_DIAGNOSTICS_INT_READ_STALL_COUNT_MASK (0xffffffff)
// args: data (32-bit)
static inline u32 gdc_diagnostics_int_read_stall_count_read(void)
{
return system_gdc_read_32(0x94L, 0);
}
// ----------------------------------- //
// Register: int_coord_stall_count
// ----------------------------------- //
// ----------------------------------- //
// Cycles spent on waiting on coordinate stream of pixel interpolator
// ----------------------------------- //
#define GDC_DIAGNOSTICS_INT_COORD_STALL_COUNT_DEFAULT (0x0)
#define GDC_DIAGNOSTICS_INT_COORD_STALL_COUNT_DATASIZE (32)
#define GDC_DIAGNOSTICS_INT_COORD_STALL_COUNT_OFFSET (0x98)
#define GDC_DIAGNOSTICS_INT_COORD_STALL_COUNT_MASK (0xffffffff)
// args: data (32-bit)
static inline u32 gdc_diagnostics_int_coord_stall_count_read(void)
{
return system_gdc_read_32(0x98L, 0);
}
// ----------------------------------- //
// Register: int_write_wait_count
// ----------------------------------- //
// ----------------------------------- //
// Cycles spent on waiting on pixel interpolator output pixel stream
// ----------------------------------- //
#define GDC_DIAGNOSTICS_INT_WRITE_WAIT_COUNT_DEFAULT (0x0)
#define GDC_DIAGNOSTICS_INT_WRITE_WAIT_COUNT_DATASIZE (32)
#define GDC_DIAGNOSTICS_INT_WRITE_WAIT_COUNT_OFFSET (0x9c)
#define GDC_DIAGNOSTICS_INT_WRITE_WAIT_COUNT_MASK (0xffffffff)
// args: data (32-bit)
static inline u32 gdc_diagnostics_int_write_wait_count_read(void)
{
return system_gdc_read_32(0x9cL, 0);
}
// ----------------------------------- //
// Register: wrt_write_wait_count
// ----------------------------------- //
// ----------------------------------- //
// Cycles spent on waiting on sending word from write cache to tile writer
// ----------------------------------- //
#define GDC_DIAGNOSTICS_WRT_WRITE_WAIT_COUNT_DEFAULT (0x0)
#define GDC_DIAGNOSTICS_WRT_WRITE_WAIT_COUNT_DATASIZE (32)
#define GDC_DIAGNOSTICS_WRT_WRITE_WAIT_COUNT_OFFSET (0xa0)
#define GDC_DIAGNOSTICS_WRT_WRITE_WAIT_COUNT_MASK (0xffffffff)
// args: data (32-bit)
static inline u32 gdc_diagnostics_wrt_write_wait_count_read(void)
{
return system_gdc_read_32(0xa0L, 0);
}
// ----------------------------------- //
// Register: int_dual_count
// ----------------------------------- //
// ----------------------------------- //
// Number of beats on output of tile writer
// interface where 2 pixels were interpolated.
// ----------------------------------- //
#define GDC_DIAGNOSTICS_INT_DUAL_COUNT_DEFAULT (0x0)
#define GDC_DIAGNOSTICS_INT_DUAL_COUNT_DATASIZE (32)
#define GDC_DIAGNOSTICS_INT_DUAL_COUNT_OFFSET (0xa4)
#define GDC_DIAGNOSTICS_INT_DUAL_COUNT_MASK (0xffffffff)
// args: data (32-bit)
static inline u32 gdc_diagnostics_int_dual_count_read(void)
{
return system_gdc_read_32(0xa4L, 0);
}
// ----------------------------------------------------//
// Group: AXI Settings
// ----------------------------------------------------//
// ----------------------------------------------------//
// Register: config reader max arlen
// ----------------------------------------------------//
// ----------------------------------------------------//
// Maximum value to use for arlen (axi burst length).
// "0000"= max 1 transfer/burst
// upto "1111"= max 16 transfers/burst
// ----------------------------------------------------//
#define GDC_AXI_SETTINGS_CONFIG_READER_MAX_ARLEN_DEFAULT (0xF)
#define GDC_AXI_SETTINGS_CONFIG_READER_MAX_ARLEN_DATASIZE (4)
#define GDC_AXI_SETTINGS_CONFIG_READER_MAX_ARLEN_OFFSET (0xa8)
#define GDC_AXI_SETTINGS_CONFIG_READER_MAX_ARLEN_MASK (0xf)
// args: data (4-bit)
static inline void gdc_axi_settings_config_reader_max_arlen_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0xa8L, 0);
u32 val = ((data & 0xf) << 0) | (curr & 0xfffffff0);
system_gdc_write_32(0xa8L, val, 0);
}
static inline uint8_t gdc_axi_settings_config_reader_max_arlen_read(void)
{
return (uint8_t)((system_gdc_read_32(0xa8L, 0) & 0xf) >> 0);
}
// ----------------------------------- //
// Register: config reader fifo watermark
// ----------------------------------- //
// ----------------------------------- //
// Number of words space in fifo before AXI read burst(s) start
// (legal values = max_burst_length(max_arlen+1)
// to 2**fifo_aw, but workable value
// for your system are probably less!).
// Allowing n back to back bursts to generated
// if watermark is set to n*burst length.
// Burst(s) continue while fifo has enough space for next burst.
// ----------------------------------- //
#define GDC_AXI_SETTINGS_CONFIG_READER_FIFO_WATERMARK_DEFAULT (0x10)
#define GDC_AXI_SETTINGS_CONFIG_READER_FIFO_WATERMARK_DATASIZE (8)
#define GDC_AXI_SETTINGS_CONFIG_READER_FIFO_WATERMARK_OFFSET (0xa8)
#define GDC_AXI_SETTINGS_CONFIG_READER_FIFO_WATERMARK_MASK (0xff00)
// args: data (8-bit)
static inline void
gdc_axi_settings_config_reader_fifo_watermark_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0xa8L, 0);
u32 val = ((data & 0xff) << 8) | (curr & 0xffff00ff);
system_gdc_write_32(0xa8L, val, 0);
}
static inline uint8_t gdc_axi_settings_config_reader_fifo_watermark_read(void)
{
return (uint8_t)((system_gdc_read_32(0xa8L, 0) & 0xff00) >> 8);
}
// ----------------------------------- //
// Register: config reader rxact maxostand
// ----------------------------------- //
// ----------------------------------- //
// Max outstanding read transactions (bursts) allowed.
// zero means no maximum(uses fifo size as max)
// ----------------------------------- //
#define GDC_AXI_SETTINGS_CONFIG_READER_RXACT_MAXOSTAND_DEFAULT (0x00)
#define GDC_AXI_SETTINGS_CONFIG_READER_RXACT_MAXOSTAND_DATASIZE (8)
#define GDC_AXI_SETTINGS_CONFIG_READER_RXACT_MAXOSTAND_OFFSET (0xa8)
#define GDC_AXI_SETTINGS_CONFIG_READER_RXACT_MAXOSTAND_MASK (0xff0000)
// args: data (8-bit)
static inline void
gdc_axi_settings_config_reader_rxact_maxostand_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0xa8L, 0);
u32 val = ((data & 0xff) << 16) | (curr & 0xff00ffff);
system_gdc_write_32(0xa8L, val, 0);
}
static inline uint8_t gdc_axi_settings_config_reader_rxact_maxostand_read(void)
{
return (uint8_t)((system_gdc_read_32(0xa8L, 0) & 0xff0000) >> 16);
}
// ----------------------------------- //
// Register: tile reader max arlen
// ----------------------------------- //
// ----------------------------------- //
// Maximum value to use for arlen (axi burst length).
// "0000"= max 1 transfer/burst , upto "1111"= max 16 transfers/burst
// ----------------------------------- //
#define GDC_AXI_SETTINGS_TILE_READER_MAX_ARLEN_DEFAULT (0xF)
#define GDC_AXI_SETTINGS_TILE_READER_MAX_ARLEN_DATASIZE (4)
#define GDC_AXI_SETTINGS_TILE_READER_MAX_ARLEN_OFFSET (0xac)
#define GDC_AXI_SETTINGS_TILE_READER_MAX_ARLEN_MASK (0xf)
// args: data (4-bit)
static inline void gdc_axi_settings_tile_reader_max_arlen_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0xacL, 0);
u32 val = ((data & 0xf) << 0) | (curr & 0xfffffff0);
system_gdc_write_32(0xacL, val, 0);
}
static inline uint8_t gdc_axi_settings_tile_reader_max_arlen_read(void)
{
return (uint8_t)((system_gdc_read_32(0xacL, 0) & 0xf) >> 0);
}
// ----------------------------------- //
// Register: tile reader fifo watermark
// ----------------------------------- //
// ----------------------------------- //
// Number of words space in fifo before AXI read burst(s) start
// (legal values = max_burst_length(max_arlen+1) to 2**fifo_aw,
// but workable value for your system are probably less!).
// Allowing n back to back bursts to generated
// if watermark is set to n*burst length.
// Burst(s) continue while fifo has enough space for next burst.
// ----------------------------------- //
#define GDC_AXI_SETTINGS_TILE_READER_FIFO_WATERMARK_DEFAULT (0x10)
#define GDC_AXI_SETTINGS_TILE_READER_FIFO_WATERMARK_DATASIZE (8)
#define GDC_AXI_SETTINGS_TILE_READER_FIFO_WATERMARK_OFFSET (0xac)
#define GDC_AXI_SETTINGS_TILE_READER_FIFO_WATERMARK_MASK (0xff00)
// args: data (8-bit)
static inline void
gdc_axi_settings_tile_reader_fifo_watermark_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0xacL, 0);
u32 val = ((data & 0xff) << 8) | (curr & 0xffff00ff);
system_gdc_write_32(0xacL, val, 0);
}
static inline uint8_t gdc_axi_settings_tile_reader_fifo_watermark_read(void)
{
return (uint8_t)((system_gdc_read_32(0xacL, 0) & 0xff00) >> 8);
}
// ----------------------------------- //
// Register: tile reader rxact maxostand
// ----------------------------------- //
// ----------------------------------- //
// Max outstanding read transactions
// (bursts) allowed. zero means no maximum(uses fifo size as max).
// ----------------------------------- //
#define GDC_AXI_SETTINGS_TILE_READER_RXACT_MAXOSTAND_DEFAULT (0x00)
#define GDC_AXI_SETTINGS_TILE_READER_RXACT_MAXOSTAND_DATASIZE (8)
#define GDC_AXI_SETTINGS_TILE_READER_RXACT_MAXOSTAND_OFFSET (0xac)
#define GDC_AXI_SETTINGS_TILE_READER_RXACT_MAXOSTAND_MASK (0xff0000)
// args: data (8-bit)
static inline void
gdc_axi_settings_tile_reader_rxact_maxostand_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0xacL, 0);
u32 val = ((data & 0xff) << 16) | (curr & 0xff00ffff);
system_gdc_write_32(0xacL, val, 0);
}
static inline uint8_t gdc_axi_settings_tile_reader_rxact_maxostand_read(void)
{
return (uint8_t)((system_gdc_read_32(0xacL, 0) & 0xff0000) >> 16);
}
// ----------------------------------- //
// Register: tile writer max awlen
// ----------------------------------- //
// ----------------------------------- //
// Maximum value to use for awlen (axi burst length).
// "0000"= max 1 transfer/burst , upto "1111"= max 16 transfers/burst
// ----------------------------------- //
#define GDC_AXI_SETTINGS_TILE_WRITER_MAX_AWLEN_DEFAULT (0xF)
#define GDC_AXI_SETTINGS_TILE_WRITER_MAX_AWLEN_DATASIZE (4)
#define GDC_AXI_SETTINGS_TILE_WRITER_MAX_AWLEN_OFFSET (0xb0)
#define GDC_AXI_SETTINGS_TILE_WRITER_MAX_AWLEN_MASK (0xf)
// args: data (4-bit)
static inline void gdc_axi_settings_tile_writer_max_awlen_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0xb0L, 0);
u32 val = ((data & 0xf) << 0) | (curr & 0xfffffff0);
system_gdc_write_32(0xb0L, val, 0);
}
static inline uint8_t gdc_axi_settings_tile_writer_max_awlen_read(void)
{
return (uint8_t)((system_gdc_read_32(0xb0L, 0) & 0xf) >> 0);
}
// ----------------------------------- //
// Register: tile writer fifo watermark
// ----------------------------------- //
// ----------------------------------- //
// Number of words in fifo before AXI write burst(s) start
// (legal values = max_burst_length(max_awlen+1) to 2**fifo_aw,
// but workable value for your system are probably less!).
// Allowing n back to back bursts to generated
// if watermark is set to n*burst length.
// Burst(s) continue while fifo has enough for next burst.
// ----------------------------------- //
#define GDC_AXI_SETTINGS_TILE_WRITER_FIFO_WATERMARK_DEFAULT (0x10)
#define GDC_AXI_SETTINGS_TILE_WRITER_FIFO_WATERMARK_DATASIZE (8)
#define GDC_AXI_SETTINGS_TILE_WRITER_FIFO_WATERMARK_OFFSET (0xb0)
#define GDC_AXI_SETTINGS_TILE_WRITER_FIFO_WATERMARK_MASK (0xff00)
// args: data (8-bit)
static inline void
gdc_axi_settings_tile_writer_fifo_watermark_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0xb0L, 0);
u32 val = ((data & 0xff) << 8) | (curr & 0xffff00ff);
system_gdc_write_32(0xb0L, val, 0);
}
static inline uint8_t
gdc_axi_settings_tile_writer_fifo_watermark_read(void)
{
return (uint8_t)((system_gdc_read_32(0xb0L, 0) & 0xff00) >> 8);
}
// ----------------------------------- //
// Register: tile writer wxact maxostand
// ----------------------------------- //
// ----------------------------------- //
// Max outstanding write transactions (bursts)
// allowed. zero means no maximum(uses internal limit of 2048)
// ----------------------------------- //
#define GDC_AXI_SETTINGS_TILE_WRITER_WXACT_MAXOSTAND_DEFAULT (0x00)
#define GDC_AXI_SETTINGS_TILE_WRITER_WXACT_MAXOSTAND_DATASIZE (8)
#define GDC_AXI_SETTINGS_TILE_WRITER_WXACT_MAXOSTAND_OFFSET (0xb0)
#define GDC_AXI_SETTINGS_TILE_WRITER_WXACT_MAXOSTAND_MASK (0xff0000)
// args: data (8-bit)
static inline void
gdc_axi_settings_tile_writer_wxact_maxostand_write(uint8_t data)
{
u32 curr = system_gdc_read_32(0xb0L, 0);
u32 val = ((data & 0xff) << 16) | (curr & 0xff00ffff);
system_gdc_write_32(0xb0L, val, 0);
}
static inline uint8_t gdc_axi_settings_tile_writer_wxact_maxostand_read(void)
{
return (uint8_t)((system_gdc_read_32(0xb0L, 0) & 0xff0000) >> 16);
}
// ----------------------------------- //
#endif //__GDC_CONFIG_H__