diff options
Diffstat (limited to 'target/linux/ubicom32/files/arch/ubicom32/include/asm/plio.h')
-rw-r--r-- | target/linux/ubicom32/files/arch/ubicom32/include/asm/plio.h | 313 |
1 files changed, 313 insertions, 0 deletions
diff --git a/target/linux/ubicom32/files/arch/ubicom32/include/asm/plio.h b/target/linux/ubicom32/files/arch/ubicom32/include/asm/plio.h new file mode 100644 index 000000000..ade78f246 --- /dev/null +++ b/target/linux/ubicom32/files/arch/ubicom32/include/asm/plio.h @@ -0,0 +1,313 @@ +/* + * plio.h + * PLIO defines. + * + * Copyright © 2009 Ubicom Inc. <www.ubicom.com>. All Rights Reserved. + * + * This file is part of the Ubicom32 Linux Kernel Port. + * + * The Ubicom32 Linux Kernel Port is free software: you can + * redistribute it and/or modify it under the terms of the GNU General + * Public License as published by the Free Software Foundation, either + * version 2 of the License, or (at your option) any later version. + * + * The Ubicom32 Linux Kernel Port is distributed in the hope that it + * will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Ubicom32 Linux Kernel Port. If not, + * see <http://www.gnu.org/licenses/>. + * This file contains confidential information of Ubicom, Inc. and your use of + * this file is subject to the Ubicom Software License Agreement distributed with + * this file. If you are uncertain whether you are an authorized user or to report + * any unauthorized use, please contact Ubicom, Inc. at +1-408-789-2200. + * Unauthorized reproduction or distribution of this file is subject to civil and + * criminal penalties. + */ + +#ifndef __PLIO__H__ +#define __PLIO__H__ + +#include <asm/ip5000.h> +#include <asm/thread.h> + +#define PLIO_PORT RD +#define PLIO_EXT_PORT RI + +#define TRANSMIT_FIFO_WATERMARK 8 + +/* + * PLIO non-blocking register definitions + */ +#define PLIO_FN 2 + +typedef struct { + unsigned : 10; + unsigned rxfifo_thread_enable: 1; /* allowed rxfifo thread enable */ + unsigned : 1; + unsigned rxfifo_thread: 4; /* allowed rxfifo thread access */ + unsigned : 4; + unsigned br_thread: 4; /* allowed blocking region thread access */ + unsigned fn_reset: 4; /* function reset bit vector */ + unsigned rxfifo_sel: 1; /* select between RXFIFO 0 and 1 */ + unsigned fn_sel: 3; /* select port function */ +} plio_io_function_t; + +typedef struct { + unsigned : 24; + unsigned pin:8; +} plio_gpio_t; + +typedef struct { + unsigned : 16; + unsigned txfifo_uf: 1; /* TXFIFO underflow */ + unsigned txfifo_wm: 1; /* TXFIFO watermark */ + unsigned rxfifo_of: 1; /* RXFIFO overflow */ + unsigned rxfifo_wm: 1; /* RXFIFO watermark */ + unsigned : 5; + unsigned lreg_int_addr_rd: 1; /* read from specified LREG address */ + unsigned lreg_int_addr_wr: 1; /* write to specified LREG address */ + unsigned extctl_int: 4; /* synchronized external interrupts */ + unsigned pfsm_int: 1; /* state machine */ +} plio_intstat_t; + +typedef struct { + unsigned txfifo_reset: 1; /* TXFIFO reset for int_set only */ + unsigned rxfifo_reset: 1; /* RXFIFO reset for int_set only */ + unsigned : 11; + unsigned idif_txfifo_flush: 1; /* flush TXFIFO and idif_txfifo */ + unsigned idif_rxfifo_flush: 1; /* flush RXFIFO and idif_rxfifo */ + unsigned pfsm_start: 1; /* input to fsm */ + unsigned txfifo_uf: 1; /* TXFIFO underflow */ + unsigned txfifo_wm: 1; /* TXFIFO watermark */ + unsigned rxfifo_of: 1; /* RXFIFO overflow */ + unsigned rxfifo_wm: 1; /* RXFIFO watermark */ + unsigned : 5; + unsigned lreg_int_addr_rd: 1; /* read from specified LREG address */ + unsigned lreg_int_addr_wr: 1; /* write to specified LREG address */ + unsigned extctl_int: 4; /* synchronized external interrupts */ + unsigned pfsm_int: 1; /* state machine */ +} plio_intset_t; + +typedef enum { + PLIO_PORT_MODE_D, + PLIO_PORT_MODE_DE, + PLIO_PORT_MODE_DI, + PLIO_PORT_MODE_DEI, + PLIO_PORT_MODE_DC, +} plio_port_mode_t; + +typedef enum { + PLIO_CLK_CORE, /* CORE CLK */ + PLIO_CLK_IO, /* IO CLK */ + PLIO_CLK_EXT, /* EXT CLK */ +} plio_clk_src_t; +typedef struct { + unsigned : 4; + unsigned edif_iaena_sel: 1; /* Input Address Enable Select */ + unsigned edif_iaclk_sel: 1; /* Input Address Clock Select */ + unsigned edif_iald_inv: 1; /* Input Address Strobe Invert */ + unsigned edif_idclk_sel: 1; /* Input Data Clock Select */ + unsigned edif_idld_inv: 1; /* Input Data Strobe Invert */ + unsigned edif_ds: 3; /* specify IDR and ODR data shift */ + unsigned edif_cmp_mode: 1; /* configure IDR comparator output */ + unsigned edif_idena_sel: 1; /* Input Data Enable Select */ + unsigned ecif_extclk_ena: 1; /* plio_extctl output select */ + unsigned idif_tx_fifo_cmd_sel: 1; /* select pfsm_cmd data word position */ + unsigned ptif_porti_cfg: 2; /* select port I pin configuration */ + unsigned ptif_portd_cfg: 3; /* select port D pin configuration */ + plio_port_mode_t ptif_port_mode: 3; /* select other plio ports */ + unsigned icif_clk_plio_ext_inv: 1; /* invert external plio clock when set */ + unsigned icif_rst_plio: 1; /* reset plio function and io fifos */ + plio_clk_src_t icif_clk_src_sel: 2; /* select plio clock source */ + unsigned pfsm_prog: 1; /* enable pfsm programming */ + unsigned pfsm_cmd: 3; /* software input to pfsm */ +} plio_fctl0_t; + +typedef struct { + unsigned : 2; + unsigned idif_byteswap_tx: 3; /* swap TXFIFO byte order */ + unsigned idif_byteswap_rx: 3; /* swap RXFIFO byte order */ + unsigned : 1; + unsigned lreg_ena: 1; /* enable local register map */ + unsigned lreg_addr_fifo_cmp_ena: 1; /* enable a specific LREG address from/to TX/RX fifos */ + unsigned lreg_addr_fifo_cmp: 5; /* LREG address routed from/to TX/RX fifos */ + unsigned : 1; + unsigned dcod_iald_idld_sel: 2; /* select address/data strobes */ + unsigned dcod_rw_src_sel: 1; /* select LREG strobe source */ + unsigned dcod_rd_sel: 5; /* select read strobe source */ + unsigned dcod_wr_sel: 5; /* select write strobe source */ + unsigned dcod_rd_lvl: 1; /* select active level of read strobe */ + unsigned dcod_wr_lvl: 1; /* select active level of read strobe */ +} plio_fctl1_t; + +typedef struct { + unsigned icif_eclk_div: 16; /* external plio clock divider */ + unsigned icif_iclk_div: 16; /* internal plio clock divider */ +} plio_fctl2_t; + +typedef struct { + unsigned : 27; + unsigned pfsm_state: 5; /* current pfsm state */ +} plio_stat_0_t; + +typedef struct { + unsigned : 3; + unsigned lreg_r_int_addr: 5; + unsigned : 11; + unsigned lreg_w_int_addr: 5; + unsigned lreg_w_int_data: 8; +} plio_stat_1_t; + +typedef struct { + unsigned : 32; +} plio_stat_2_t; + +typedef struct { + unsigned tx: 16; + unsigned rx: 16; +} plio_io_fifo_wm_t, plio_io_fifo_lvl_t; + + +/* plio blocking region register definitions + */ +typedef struct { + unsigned ns1: 5; + unsigned ic1: 7; + unsigned ec1: 4; + unsigned ns0: 5; + unsigned ic0: 7; + unsigned ec0: 4; +} plio_sram_t; + +typedef struct { + unsigned : 2; + unsigned s9: 3; + unsigned s8: 3; + unsigned s7: 3; + unsigned s6: 3; + unsigned s5: 3; + unsigned s4: 3; + unsigned s3: 3; + unsigned s2: 3; + unsigned s1: 3; + unsigned s0: 3; +} plio_grpsel_t; + +typedef struct { + unsigned s7: 4; + unsigned s6: 4; + unsigned s5: 4; + unsigned s4: 4; + unsigned s3: 4; + unsigned s2: 4; + unsigned s1: 4; + unsigned s0: 4; +} plio_cs_lut_t; + +typedef struct { + unsigned lut3: 8; + unsigned lut2: 8; + unsigned lut1: 8; + unsigned lut0: 8; +} plio_extctl_t; + +typedef struct { + plio_grpsel_t grpsel[4]; + u16_t cv[16]; + plio_cs_lut_t cs_lut[4]; + plio_extctl_t extctl_o_lut[8]; +} plio_pfsm_t; + +typedef struct { + u32_t odr_oe_sel; + u32_t odr_oe; + u32_t cmp; + u32_t ncmp; + u32_t cmp_mask; +} plio_edif_t; + +typedef enum { + PLIO_ECIF_CLK_OUT = 9, + PLIO_ECIF_IALD = 9, + PLIO_ECIF_CLK_IN = 8, + PLIO_ECIF_IDLD = 8, + PLIO_ECIF_INT = 2, +} plio_ecif_output_t; + +typedef struct { + u32_t bypass_sync; + u32_t ift; + u32_t output_type; + u32_t output_ena; + u32_t output_lvl; +} plio_ecif_t; + +typedef struct { + u32_t idr_addr_pos_mask; + u32_t reserved; + u32_t lreg_bar; +} plio_dcod_t; + +typedef struct { + u32_t addr_rd_ena; + u32_t addr_wr_ena; + u32_t addr_rd_int_ena; + u32_t addr_wr_int_ena; +} plio_lcfg_t; + + +/* + * PLIO configuration + */ +typedef struct { + plio_fctl0_t fctl0; + plio_fctl1_t fctl1; + plio_fctl2_t fctl2; +} plio_fctl_t; + +typedef struct { + plio_pfsm_t pfsm; + plio_edif_t edif; + plio_ecif_t ecif; + plio_dcod_t dcod; + plio_lcfg_t lcfg; +} plio_config_t; + +typedef struct { + plio_io_function_t function; + plio_gpio_t gpio_ctl; + plio_gpio_t gpio_out; + plio_gpio_t gpio_in; + plio_intstat_t intstat; + plio_intstat_t intmask; + plio_intset_t intset; + plio_intstat_t intclr; + unsigned tx_lo; + unsigned tx_hi; + unsigned rx_lo; + unsigned rx_hi; + plio_fctl0_t fctl0; + plio_fctl1_t fctl1; + plio_fctl2_t fctl2; + plio_stat_0_t stat0; + plio_stat_1_t stat1; + plio_stat_2_t stat2; + plio_io_fifo_wm_t fifo_wm; + plio_io_fifo_lvl_t fifo_lvl; +} plio_nbr_t; + +typedef struct { + u32_t pfsm_sram[256]; + plio_config_t config; +} plio_br_t; + +#define PLIO_NBR ((plio_nbr_t *)(PLIO_PORT)) +#define PLIO_BR ((plio_br_t *)((PLIO_PORT + IO_PORT_BR_OFFSET))) +#define PEXT_NBR ((plio_nbr_t *)(PLIO_EXT_PORT)) + +extern void plio_init(const plio_fctl_t *plio_fctl, const plio_config_t *plio_config, const plio_sram_t plio_sram_cfg[], int sram_cfg_size); + +#endif // __PLIO__H__ |