/*
 * Copyright (C) 2010, 2012-2016 ARM Limited. All rights reserved.
 * 
 * This program is free software and is provided to you under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
 * 
 * A copy of the licence is included with the program, and can also be obtained from Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

#ifndef _MALIGP2_CONROL_REGS_H_
#define _MALIGP2_CONROL_REGS_H_

/**
 * These are the different geometry processor control registers.
 * Their usage is to control and monitor the operation of the
 * Vertex Shader and the Polygon List Builder in the geometry processor.
 * Addresses are in 32-bit word relative sizes.
 * @see [P0081] "Geometry Processor Data Structures" for details
 */

typedef enum {
	MALIGP2_REG_ADDR_MGMT_VSCL_START_ADDR           = 0x00,
	MALIGP2_REG_ADDR_MGMT_VSCL_END_ADDR             = 0x04,
	MALIGP2_REG_ADDR_MGMT_PLBUCL_START_ADDR         = 0x08,
	MALIGP2_REG_ADDR_MGMT_PLBUCL_END_ADDR           = 0x0c,
	MALIGP2_REG_ADDR_MGMT_PLBU_ALLOC_START_ADDR     = 0x10,
	MALIGP2_REG_ADDR_MGMT_PLBU_ALLOC_END_ADDR       = 0x14,
	MALIGP2_REG_ADDR_MGMT_CMD                       = 0x20,
	MALIGP2_REG_ADDR_MGMT_INT_RAWSTAT               = 0x24,
	MALIGP2_REG_ADDR_MGMT_INT_CLEAR                 = 0x28,
	MALIGP2_REG_ADDR_MGMT_INT_MASK                  = 0x2C,
	MALIGP2_REG_ADDR_MGMT_INT_STAT                  = 0x30,
	MALIGP2_REG_ADDR_MGMT_PERF_CNT_0_ENABLE         = 0x3C,
	MALIGP2_REG_ADDR_MGMT_PERF_CNT_1_ENABLE         = 0x40,
	MALIGP2_REG_ADDR_MGMT_PERF_CNT_0_SRC            = 0x44,
	MALIGP2_REG_ADDR_MGMT_PERF_CNT_1_SRC            = 0x48,
	MALIGP2_REG_ADDR_MGMT_PERF_CNT_0_VALUE          = 0x4C,
	MALIGP2_REG_ADDR_MGMT_PERF_CNT_1_VALUE          = 0x50,
	MALIGP2_REG_ADDR_MGMT_PERF_CNT_0_LIMIT          = 0x54,
	MALIGP2_REG_ADDR_MGMT_STATUS                    = 0x68,
	MALIGP2_REG_ADDR_MGMT_VERSION                   = 0x6C,
	MALIGP2_REG_ADDR_MGMT_VSCL_START_ADDR_READ      = 0x80,
	MALIGP2_REG_ADDR_MGMT_PLBCL_START_ADDR_READ     = 0x84,
	MALIGP2_CONTR_AXI_BUS_ERROR_STAT                = 0x94,
	MALIGP2_REGISTER_ADDRESS_SPACE_SIZE             = 0x98,
} maligp_reg_addr_mgmt_addr;

#define MALIGP2_REG_VAL_PERF_CNT_ENABLE 1

/**
 * Commands to geometry processor.
 *  @see MALIGP2_CTRL_REG_CMD
 */
typedef enum {
	MALIGP2_REG_VAL_CMD_START_VS                    = (1 << 0),
	MALIGP2_REG_VAL_CMD_START_PLBU                  = (1 << 1),
	MALIGP2_REG_VAL_CMD_UPDATE_PLBU_ALLOC   = (1 << 4),
	MALIGP2_REG_VAL_CMD_RESET                               = (1 << 5),
	MALIGP2_REG_VAL_CMD_FORCE_HANG                  = (1 << 6),
	MALIGP2_REG_VAL_CMD_STOP_BUS                    = (1 << 9),
	MALI400GP_REG_VAL_CMD_SOFT_RESET                = (1 << 10), /* only valid for Mali-300 and later */
} mgp_contr_reg_val_cmd;


/**  @defgroup MALIGP2_IRQ
 * Interrupt status of geometry processor.
 *  @see MALIGP2_CTRL_REG_INT_RAWSTAT, MALIGP2_REG_ADDR_MGMT_INT_CLEAR,
 *       MALIGP2_REG_ADDR_MGMT_INT_MASK, MALIGP2_REG_ADDR_MGMT_INT_STAT
 * @{
 */
#define MALIGP2_REG_VAL_IRQ_VS_END_CMD_LST      (1 << 0)
#define MALIGP2_REG_VAL_IRQ_PLBU_END_CMD_LST    (1 << 1)
#define MALIGP2_REG_VAL_IRQ_PLBU_OUT_OF_MEM     (1 << 2)
#define MALIGP2_REG_VAL_IRQ_VS_SEM_IRQ          (1 << 3)
#define MALIGP2_REG_VAL_IRQ_PLBU_SEM_IRQ        (1 << 4)
#define MALIGP2_REG_VAL_IRQ_HANG                (1 << 5)
#define MALIGP2_REG_VAL_IRQ_FORCE_HANG          (1 << 6)
#define MALIGP2_REG_VAL_IRQ_PERF_CNT_0_LIMIT    (1 << 7)
#define MALIGP2_REG_VAL_IRQ_PERF_CNT_1_LIMIT    (1 << 8)
#define MALIGP2_REG_VAL_IRQ_WRITE_BOUND_ERR     (1 << 9)
#define MALIGP2_REG_VAL_IRQ_SYNC_ERROR          (1 << 10)
#define MALIGP2_REG_VAL_IRQ_AXI_BUS_ERROR       (1 << 11)
#define MALI400GP_REG_VAL_IRQ_AXI_BUS_STOPPED     (1 << 12)
#define MALI400GP_REG_VAL_IRQ_VS_INVALID_CMD      (1 << 13)
#define MALI400GP_REG_VAL_IRQ_PLB_INVALID_CMD     (1 << 14)
#define MALI400GP_REG_VAL_IRQ_RESET_COMPLETED     (1 << 19)
#define MALI400GP_REG_VAL_IRQ_SEMAPHORE_UNDERFLOW (1 << 20)
#define MALI400GP_REG_VAL_IRQ_SEMAPHORE_OVERFLOW  (1 << 21)
#define MALI400GP_REG_VAL_IRQ_PTR_ARRAY_OUT_OF_BOUNDS  (1 << 22)

/* Mask defining all IRQs in Mali GP */
#define MALIGP2_REG_VAL_IRQ_MASK_ALL \
	(\
	 MALIGP2_REG_VAL_IRQ_VS_END_CMD_LST      | \
	 MALIGP2_REG_VAL_IRQ_PLBU_END_CMD_LST    | \
	 MALIGP2_REG_VAL_IRQ_PLBU_OUT_OF_MEM     | \
	 MALIGP2_REG_VAL_IRQ_VS_SEM_IRQ          | \
	 MALIGP2_REG_VAL_IRQ_PLBU_SEM_IRQ        | \
	 MALIGP2_REG_VAL_IRQ_HANG                | \
	 MALIGP2_REG_VAL_IRQ_FORCE_HANG          | \
	 MALIGP2_REG_VAL_IRQ_PERF_CNT_0_LIMIT    | \
	 MALIGP2_REG_VAL_IRQ_PERF_CNT_1_LIMIT    | \
	 MALIGP2_REG_VAL_IRQ_WRITE_BOUND_ERR     | \
	 MALIGP2_REG_VAL_IRQ_SYNC_ERROR          | \
	 MALIGP2_REG_VAL_IRQ_AXI_BUS_ERROR       | \
	 MALI400GP_REG_VAL_IRQ_AXI_BUS_STOPPED     | \
	 MALI400GP_REG_VAL_IRQ_VS_INVALID_CMD      | \
	 MALI400GP_REG_VAL_IRQ_PLB_INVALID_CMD     | \
	 MALI400GP_REG_VAL_IRQ_RESET_COMPLETED     | \
	 MALI400GP_REG_VAL_IRQ_SEMAPHORE_UNDERFLOW | \
	 MALI400GP_REG_VAL_IRQ_SEMAPHORE_OVERFLOW  | \
	 MALI400GP_REG_VAL_IRQ_PTR_ARRAY_OUT_OF_BOUNDS)

/* Mask defining the IRQs in Mali GP which we use */
#define MALIGP2_REG_VAL_IRQ_MASK_USED \
	(\
	 MALIGP2_REG_VAL_IRQ_VS_END_CMD_LST      | \
	 MALIGP2_REG_VAL_IRQ_PLBU_END_CMD_LST    | \
	 MALIGP2_REG_VAL_IRQ_PLBU_OUT_OF_MEM     | \
	 MALIGP2_REG_VAL_IRQ_FORCE_HANG          | \
	 MALIGP2_REG_VAL_IRQ_WRITE_BOUND_ERR     | \
	 MALIGP2_REG_VAL_IRQ_SYNC_ERROR          | \
	 MALIGP2_REG_VAL_IRQ_AXI_BUS_ERROR       | \
	 MALI400GP_REG_VAL_IRQ_VS_INVALID_CMD      | \
	 MALI400GP_REG_VAL_IRQ_PLB_INVALID_CMD     | \
	 MALI400GP_REG_VAL_IRQ_SEMAPHORE_UNDERFLOW | \
	 MALI400GP_REG_VAL_IRQ_SEMAPHORE_OVERFLOW  | \
	 MALI400GP_REG_VAL_IRQ_PTR_ARRAY_OUT_OF_BOUNDS)

/* Mask defining non IRQs on MaliGP2*/
#define MALIGP2_REG_VAL_IRQ_MASK_NONE 0

/** }@ defgroup MALIGP2_IRQ*/

/** @defgroup MALIGP2_STATUS
 * The different Status values to the geometry processor.
 *  @see MALIGP2_CTRL_REG_STATUS
 * @{
 */
#define MALIGP2_REG_VAL_STATUS_VS_ACTIVE         0x0002
#define MALIGP2_REG_VAL_STATUS_BUS_STOPPED       0x0004
#define MALIGP2_REG_VAL_STATUS_PLBU_ACTIVE       0x0008
#define MALIGP2_REG_VAL_STATUS_BUS_ERROR         0x0040
#define MALIGP2_REG_VAL_STATUS_WRITE_BOUND_ERR   0x0100
/** }@ defgroup MALIGP2_STATUS*/

#define MALIGP2_REG_VAL_STATUS_MASK_ACTIVE (\
		MALIGP2_REG_VAL_STATUS_VS_ACTIVE|\
		MALIGP2_REG_VAL_STATUS_PLBU_ACTIVE)


#define MALIGP2_REG_VAL_STATUS_MASK_ERROR (\
		MALIGP2_REG_VAL_STATUS_BUS_ERROR |\
		MALIGP2_REG_VAL_STATUS_WRITE_BOUND_ERR )

/* This should be in the top 16 bit of the version register of gp.*/
#define MALI200_GP_PRODUCT_ID 0xA07
#define MALI300_GP_PRODUCT_ID 0xC07
#define MALI400_GP_PRODUCT_ID 0xB07
#define MALI450_GP_PRODUCT_ID 0xD07

/**
 * The different sources for instrumented on the geometry processor.
 *  @see MALIGP2_REG_ADDR_MGMT_PERF_CNT_0_SRC
 */

enum MALIGP2_cont_reg_perf_cnt_src {
	MALIGP2_REG_VAL_PERF_CNT1_SRC_NUMBER_OF_VERTICES_PROCESSED = 0x0a,
};

#endif
