/*
 * 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
