| /* |
| * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| * |
| * Register definitions for the ARC pixel graphics unit. |
| */ |
| |
| #ifndef _ASM_ARC_PGU_H |
| #define _ASM_ARC_PGU_H |
| |
| #include <linux/fb.h> |
| |
| |
| #define DMT_75_VSYNC 0x031201f3 |
| #define DMT_75_HSYNC 0x40b70347 |
| |
| /* Ioctl selectors FIXME - make sure these are unique within the fb subsystem */ |
| #define ARCPGUFB_GETYUV 0xffff0001 |
| #define ARCPGUFB_SETYUV 0xffff0002 |
| #define ARCPGUFB_FILLYUV 0xffff0003 |
| #define ARCPGUFB_SWITCH_YUV 0xffff0004 |
| #define ARCPGUFB_BKLGHT_OFF 0xffff0005 |
| #define ARCPGUFB_BKLGHT_ON 0xffff0006 |
| #define ARCPGUFB_START_DISPLAY 0xffff0007 |
| #define ARCPGUFB_STOP_DISPLAY 0xffff0008 |
| #define ARCPGUFB_GET_PGU_STATE 0xffff0009 |
| #define ARCPGUFB_SET_PGU_STATE 0xffff000a |
| #define ARCPGUFB_GET_MAIN_MODE 0xffff000b |
| #define ARCPGUFB_SET_MAIN_MODE 0xffff000c |
| #define ARCPGUFB_SET_RGB_BUF 0xffff000d |
| #define ARCPGUFB_GET_RGB_BUF 0xffff000e |
| #define ARCPGUFB_GET_FB_MAIN 0xffff000f |
| #define ARCPGUFB_CHECKPOINT 0xffff0010 |
| #define ARCPGUFB_RESTORE 0xffff0011 |
| #define ARCPGUFB_RESET 0xffff0012 |
| #define ARCPGUFB_SET_YUV_RES 0xffff0013 |
| #define ARCPGUFB_GET_FB_INFO 0xffff0014 |
| #define ARCPGUFB_SET_OL_MODE 0xffff0015 |
| #define ARCPGUFB_GET_OL_MODE 0xffff0016 |
| #define ARCPGUFB_GET_OL_COLKEY 0xffff0017 |
| #define ARCPGUFB_SET_OL_COLKEY 0xffff0018 |
| #define ARCPGUFB_GET_OL_START 0xffff0019 |
| #define ARCPGUFB_SET_OL_START 0xffff001a |
| #define ARCPGUFB_GET_OL_END 0xffff001b |
| #define ARCPGUFB_SET_OL_END 0xffff001c |
| #define ARCPGUFB_SET_OL_OFFSET 0xffff001d |
| #define ARCPGUFB_SET_VCLK 0xffff001e |
| #define ARCPGUFB_GET_VCLK 0xffff001f |
| #define ARCPGU_GET_VPLL 0xffff0030 |
| #define ARCPGU_SET_VPLL 0xffff0031 |
| #define ARCPGUFB_GET_YUV_BASE 0xffff002c /* return address of yuv buffer n */ |
| |
| #define ARCPGUFB_GET_ORIGIN 0xffff002e |
| #define ARCPGUFB_SET_ORIGIN 0xffff002f |
| |
| #define ARCPGUFB_ALLOC 0xffff0020 |
| #define ARCPGUFB_FREE 0xffff0021 |
| #define ARCPGUFB_SEND 0xffff0022 |
| #define ARCPGUFB_FRAMERATE_SET 0xffff0023 |
| #define ARCPGUFB_QUEUE_LEN_GET 0xffff0024 |
| #define ARCPGUFB_FLUSH 0xffff0025 |
| #define ARCPGUFB_FRAME_DROP 0xffff0026 |
| #define ARCPGUFB_PAUSE 0xffff0027 |
| #define ARCPGUFB_RESUME 0xffff0028 |
| #define ARCPGUFB_RESET_SYNC 0xffff0029 |
| #define ARCPGUFB_NUM_FREE_BUFS 0xffff002a |
| #define ARCPGUFB_PAUSE_MS 0xffff002b |
| #define ARCPGUFB_PEEK 0xffff002c |
| |
| #define ARCPGUFB_GET_STATCTRL 0xffff00fe |
| #define ARCPGUFB_SET_STATCTRL 0xffff00ff |
| |
| /*--------------------------------------------------------------------------------------------*/ |
| |
| /* YUV buffer layout - all sizes and offsets in bytes. Note that base addresses tend to be |
| passed around as unsigned longs, in which case you'll need to typecast before applying |
| any offsets. */ |
| |
| struct yuv_info { |
| unsigned int displayed_buffer; |
| unsigned long phys_base; |
| unsigned long virt_base; |
| unsigned long yuv_size; |
| unsigned long alignment; |
| unsigned long num_buffers; |
| unsigned long start_offset; |
| unsigned long width; |
| unsigned long height; |
| unsigned long u_offset; |
| unsigned long v_offset; |
| unsigned long y_stride; |
| unsigned long u_stride; |
| unsigned long v_stride; |
| #ifdef CONFIG_ARC_PGU_CROPPING |
| unsigned long cropped_width; |
| unsigned long cropped_height; |
| unsigned long x_offset; |
| unsigned long y_offset; |
| #endif |
| }; |
| |
| /*--------------------------------------------------------------------------------------------*/ |
| |
| /* Register definitions */ |
| |
| /* Base+0x00 PGU_MODULE_ID Register containing read only module ID and |
| * Revision numbers */ |
| #define PGU_MODULE_ID_OFFSET 0x0 |
| #define PGU_DISPLAY_TYPE_MASK 0x1000000 |
| #define PGU_VERSION_MASK 0xff0000 |
| #define PGU_VERSION_SHIFT 16 |
| |
| /* Base+0x08 CLK_CFG_REG Clock Configuration register. It is used to |
| * Define the clock divider value, and the |
| * pulse width (high cycle) in clock cycles: |
| * [ 7: 0] CLK_DIV : clock divider value - 1 |
| * [23:16] CLK_HIGH : High pulse width - 1 */ |
| #define CLK_CFG_REG_OFFSET 0x8 |
| #define CLK_CFG_REG_CLK_DIV_MASK 0xff |
| #define CLK_CFG_REG_CLK_HIGH_MASK 0xff0000 |
| #define GET_CLK_CFG_REG_CLK_HIGH_VAL(x) (x & CLK_CFG_REG_CLK_HIGH_MASK) >> 16 |
| #define SET_CLK_CFG_REG_CLK_HIGH_VAL(x, y) (x & !CLK_CFG_REG_CLK_HIGH_MASK) | ((y << 16) & CLK_CFG_REG_CLK_HIGH_MASK) |
| |
| /* Base+0x10 DISP_DIM_REG Display Dimensions register. This specify |
| * the dimensions of the actual display. |
| * [10: 0] PGU_X_RES : X dimension - 1 |
| * [26:16] PGU_Y_RES : Y dimension - 1 */ |
| |
| #define DISP_DIM_REG_OFFSET 0x10 |
| #define DISP_DIM_REG_PGU_X_RES_MASK 0x3ff |
| #define DISP_DIM_REG_PGU_Y_RES_MASK 0x3ff0000 |
| #define DISP_DIM_Y_SHIFT 16 |
| #define ENCODE_PGU_DIMS(x,y) ((x & DISP_DIM_REG_PGU_X_RES_MASK) | ((y & DISP_DIM_REG_PGU_X_RES_MASK) * 0x10000)) |
| |
| /* Base+0x18 HSYNC_CFG_REG Hsync Configuration register. This is used |
| * to specify various hsync related timings in |
| * clock cycles: |
| * [11: 0] HSYNC_CYC : Hsync period - 1 |
| * [23:16] H_BCK_PORTH : Back porth width - 1 |
| * [31:23] HSYNC_WIDTH : Hsync low width - 1 */ |
| |
| #define PGU_SYNC_REGS_CYC_MASK 0xfff |
| #define PGU_SYNC_REGS_PORCH_MASK 0xff0000 |
| #define PGU_SYNC_REGS_WIDTH_MASK 0xff000000 |
| #define PGU_SYNC_REGS_PORCH_OFFSET 16 |
| #define PGU_SYNC_REGS_WIDTH_OFFSET 24 |
| |
| #define HSYNC_CFG_REG_OFFSET 0x18 |
| |
| /* Base+0x20 VSYNC_CFG_REG Vsync Configuration register. This is used |
| * to specify various Vsync related timings in |
| * Hsync cycles: |
| * [11: 0] VSYNC_CYC : Vsync period - 1 |
| * [23:16] V_BCK_PORTH : Back porth width - 1 |
| * [31:23] VSYNC_WIDTH : Hsync low width */ |
| |
| #define VSYNC_CFG_REG_OFFSET 0x20 |
| |
| /* Base+0x28 FRMSTART_REG Frame Start Address. This 32 bit address |
| * specifies the start of the display frame |
| * in memory. Must be at least 2 byte aligned |
| * for 16 bit per pixel format. */ |
| |
| #define FRMSTART_REG_OFFSET 0x28 |
| |
| /* Base+0x30 STRIDE_REG Line Stride Address. This 32 bit address |
| * specifies the different in address between |
| * the first pixels of adjecent display lines |
| * in memory. Must be at least 2 byte aligned |
| * for 16 bit per pixel format. */ |
| |
| #define STRIDE_REG_OFFSET 0x30 |
| |
| /* Base+0x38 FRM_DIM_REG Frame Dimension register. This register |
| * defines the frame size of the display in |
| * memory and can be smaller than the display. |
| * [10:0] FRM_WTH : frame line width in |
| * pixels. Must be <= |
| * PGU_X_RES without x2 mode |
| * or <= PGU_X_RES/2 in x2 |
| * mode. |
| * [26:16] FRM_LNS : frame number of lines |
| * Must be <= PGU_X_RES |
| * without x2 mode or <= |
| * PGU_X_RES/2 in x2 mode. */ |
| |
| #define FRM_DIM_REG_OFFSET 0x38 |
| #define FRM_DIM_REG_FRM_WTH_MASK 0x7ff |
| #define FRM_DIM_REG_FRM_LNS_MASK 0x7ff |
| |
| /* |
| * Base+0x40 STATCTRL_REG Status and Control register. This register |
| * is used to control the display module and |
| * monitor its status: */ |
| #define STATCTRL_REG_OFFSET 0x40 |
| /* [0] DISP_EN : Display enable bit. When |
| * set to high, starts the |
| * display. It then clears |
| * after a few cycles, if |
| * the CONT bit is not set, |
| * hence allowing the display |
| * to do the frame once. */ |
| #define STATCTRL_REG_DISP_EN_MASK 1 |
| /* [1] INTR_EN : Interrupt Enable. Active |
| * high. */ |
| #define STATCTRL_INTR_EN_MASK 2 |
| /* [2] INTR_CLR : Interrupt Clear. Set to |
| * high to clear the interrupt |
| * flag/request. Always reads |
| * as zeros */ |
| #define STATCTRL_INTR_CLR_MASK 4 |
| /* [3] CONT : Continuous mode. When set, |
| * will not allow the DISP_EN |
| * bit to be cleared by itself |
| * and as long as DISP_EN is |
| * not cleared manually, the |
| * Dispaly will drive the PGU |
| * continuously, frame after |
| * frame. */ |
| #define STATCTRL_CONT_B_MASK 8 |
| /* [5:4] PIX_FMT Pixel Format. Select the |
| * pixel format: |
| * "00" - RGB555 |
| * "01" - YUV420 (aka YV12) |
| * "10" - reserved |
| * "11" - reserved */ |
| #define STATCTRL_PIX_FMT_MASK 0x30 |
| #define STATCTRL_PIX_FMT_OFFSET 4 |
| #define STATCTRL_PIX_FMT_RGB555 0 |
| #define STATCTRL_PIX_FMT_YUV420 0x10 |
| /* [6] BACKLIGHT Active high backlight |
| * enable. When set to high, |
| * sets the back light control |
| * signal to high to turn on |
| * the backlight of the PGU. */ |
| #define STATCTRL_BACKLIGHT_MASK 0x40 |
| /* [7] X2 Zoom 2 mode. when set, |
| * every pixel in the frame is |
| * display twice in a line & |
| * the line is displayed twice |
| * therefore enlarging the |
| * picture. */ |
| #define STATCTRL_X2_MASK 0x80 |
| /* [8] REV_LN_SCAN Reverse line scan. When set |
| * the display displays the |
| * last line first, back |
| * towards the first */ |
| #define STATCTRL_REV_LN_SCAN_MASK 0x100 |
| /* [9] HPOL HSync signal polarity */ |
| #define STATCTRL_HPOL_MASK 0x200 |
| /* [10] VPOL VSync signal polarity */ |
| #define STATCTRL_VPOL_MASK 0x400 |
| /* [11] DPOL Data enable signal polarity */ |
| #define STATCTRL_DPOL_MASK 0x800 |
| /* [12] OL_EN Overlay enable */ |
| #define STATCTRL_OL_EN_MASK 0x1000 |
| /* [13-15] OL_FMT Overlay format: |
| * "00" - RGBA4444 |
| * "01" - RGBA5551 |
| * "10" - RGB555 with colour keying */ |
| #define STATCTRL_OL_FMT_MASK 0x6000 |
| #define STATCTRL_OL_FMT_OFFSET 13 |
| #define STATCTRL_OL_FMT_RGBA4444 0 |
| #define STATCTRL_OL_FMT_RGBA5551 0x2000 |
| #define STATCTRL_OL_FMT_RGB555 0x4000 |
| /* [16] DISP_BUSY Display Busy status. Active |
| * High. When set indicates |
| * that the display is |
| * currently scanning out |
| * pixel data, or generating |
| * syncs for the current |
| * display */ |
| #define STATCTRL_DISP_BUSY_MASK 0x10000 |
| /* [17] BU_BUSY Burst Unit busy. Active |
| * high. When set indicates |
| * that the burst unit is |
| * busy fetching pixel data. */ |
| #define STATCTRL_BU_BUSY_MASK 0x20000 |
| /* [18] INTR_FLG Interrupt flag. Refelects |
| * the interrupt signal. |
| * Active low level interrupt. */ |
| #define STATCTRL_INTR_FLAG 0x40000 |
| /* [19-20] IL_MD Interface mode select |
| * "00" - Non-interlaced |
| * "01" - Frame mode interlace |
| * "10" - Even field interlace |
| * "11" - Odd field interlace */ |
| #define STATCTRL_IL_MODE_MASK 0x180000 |
| #define STATCTRL_IL_NONE 0 |
| #define STATCTRL_IL_FRAME 0x80000 |
| #define STATCTRL_IL_EVEN 0x100000 |
| #define STATCTRL_IL_ODD 0x180000 |
| |
| /*--------------------------------------------------------------------------------------------*/ |
| |
| typedef volatile struct { |
| volatile unsigned long pgu_id; /* Identity register */ |
| volatile unsigned long padding1; |
| volatile unsigned long clk_cfg; /* Clock control */ |
| volatile unsigned long padding2; |
| volatile unsigned long disp_dim; /* Display dimension */ |
| volatile unsigned long padding3; |
| volatile unsigned long hsync_cfg; /* HSYNC */ |
| volatile unsigned long padding4; |
| volatile unsigned long vsync_cfg; /* VSYNC */ |
| volatile unsigned long padding5; |
| volatile unsigned long frm_start; /* Frame start */ |
| volatile unsigned long padding6; |
| volatile unsigned long stride; /* Frame stride */ |
| volatile unsigned long padding7; |
| volatile unsigned long frm_dim; /* Frame dimension */ |
| volatile unsigned long padding8; |
| volatile unsigned long statctrl; /* Status and control */ |
| volatile unsigned long padding9; |
| volatile unsigned long cru_frm_st; /* Chroma U frame start */ |
| volatile unsigned long padding10; |
| volatile unsigned long cru_stride; /* Chroma U stride */ |
| volatile unsigned long padding11; |
| volatile unsigned long crv_frm_st; /* Chroma V frame start */ |
| volatile unsigned long padding12; |
| volatile unsigned long crv_stride; /* Chroma V stride */ |
| |
| volatile unsigned long padding13; |
| volatile unsigned long ol_frm_st; /* Overlay frame start */ |
| volatile unsigned long padding14; |
| volatile unsigned long ol_stride; /* Overlay stride */ |
| volatile unsigned long padding15; |
| volatile unsigned long ol_scn_line; /* Overlay start and end line numbers */ |
| volatile unsigned long padding16; |
| volatile unsigned long ol_col_key; /* Overlay transparency colour key - RGB 555 */ |
| |
| volatile unsigned long padding17; |
| volatile unsigned long centreoffsets; /* X, Y offsets for centering */ |
| } arc_pgu; |
| |
| struct known_displays |
| { |
| unsigned long xres; |
| unsigned long yres; |
| unsigned long bpp; |
| unsigned char display_name[256]; |
| unsigned long control; |
| unsigned long clkcontrol; |
| unsigned long hsync; |
| unsigned long vsync; |
| unsigned char bl_active_high; |
| unsigned long max_freq; |
| }; |
| |
| struct arc_pgu_par { |
| int line_length; |
| int cmap_len; |
| unsigned long main_mode; |
| unsigned long overlay_mode; |
| int num_rgbbufs; |
| int rgb_bufno; |
| int main_is_fb; |
| }; |
| |
| #endif /* _ASM_ARC_PGU_H */ |