Home | History | Annotate | Line # | Download | only in dev
octeon_pkovar.h revision 1.1.2.2
      1  1.1.2.2  skrll /*	$NetBSD: octeon_pkovar.h,v 1.1.2.2 2015/06/06 14:40:01 skrll Exp $	*/
      2  1.1.2.2  skrll 
      3  1.1.2.2  skrll /*
      4  1.1.2.2  skrll  * Copyright (c) 2007 Internet Initiative Japan, Inc.
      5  1.1.2.2  skrll  * All rights reserved.
      6  1.1.2.2  skrll  *
      7  1.1.2.2  skrll  * Redistribution and use in source and binary forms, with or without
      8  1.1.2.2  skrll  * modification, are permitted provided that the following conditions
      9  1.1.2.2  skrll  * are met:
     10  1.1.2.2  skrll  * 1. Redistributions of source code must retain the above copyright
     11  1.1.2.2  skrll  *    notice, this list of conditions and the following disclaimer.
     12  1.1.2.2  skrll  * 2. Redistributions in binary form must reproduce the above copyright
     13  1.1.2.2  skrll  *    notice, this list of conditions and the following disclaimer in the
     14  1.1.2.2  skrll  *    documentation and/or other materials provided with the distribution.
     15  1.1.2.2  skrll  *
     16  1.1.2.2  skrll  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     17  1.1.2.2  skrll  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     18  1.1.2.2  skrll  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     19  1.1.2.2  skrll  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     20  1.1.2.2  skrll  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     21  1.1.2.2  skrll  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     22  1.1.2.2  skrll  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     23  1.1.2.2  skrll  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     24  1.1.2.2  skrll  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     25  1.1.2.2  skrll  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  1.1.2.2  skrll  * SUCH DAMAGE.
     27  1.1.2.2  skrll  */
     28  1.1.2.2  skrll 
     29  1.1.2.2  skrll /*
     30  1.1.2.2  skrll  * PKO Registers
     31  1.1.2.2  skrll  */
     32  1.1.2.2  skrll 
     33  1.1.2.2  skrll #ifndef _OCTEON_PKOVAR_H_
     34  1.1.2.2  skrll #define _OCTEON_PKOVAR_H_
     35  1.1.2.2  skrll 
     36  1.1.2.2  skrll #include <mips/cavium/dev/octeon_fauvar.h>
     37  1.1.2.2  skrll #include <mips/cavium/dev/octeon_pkoreg.h>
     38  1.1.2.2  skrll 
     39  1.1.2.2  skrll #define FAU_OP_SIZE_8	0
     40  1.1.2.2  skrll #define FAU_OP_SIZE_16	1
     41  1.1.2.2  skrll #define FAU_OP_SIZE_32	2
     42  1.1.2.2  skrll #define FAU_OP_SIZE_64	3
     43  1.1.2.2  skrll 
     44  1.1.2.2  skrll #define PKO_OUTPUT_PORTS_NUM		5
     45  1.1.2.2  skrll #define PKO_OUTPUT_PORTS_PKTIF_NUM	3
     46  1.1.2.2  skrll #define PKO_OUTPUT_PORTS_PCIIF_NUM	2
     47  1.1.2.2  skrll #define	PKO_MEM_QUEUE_PTRS_ILLEGAL_PID	63
     48  1.1.2.2  skrll 
     49  1.1.2.2  skrll /* XXX */
     50  1.1.2.2  skrll struct octeon_pko_cmdptr_desc {
     51  1.1.2.2  skrll 	uint64_t	cmdptr;
     52  1.1.2.2  skrll 	uint64_t	cmdptr_idx;
     53  1.1.2.2  skrll };
     54  1.1.2.2  skrll 
     55  1.1.2.2  skrll /* XXX */
     56  1.1.2.2  skrll struct octeon_pko_softc {
     57  1.1.2.2  skrll 	int			sc_port;
     58  1.1.2.2  skrll 	bus_space_tag_t		sc_regt;
     59  1.1.2.2  skrll 	bus_space_handle_t	sc_regh;
     60  1.1.2.2  skrll 	struct octeon_pko_cmdptr_desc
     61  1.1.2.2  skrll 				*sc_cmdptr;
     62  1.1.2.2  skrll 	int			sc_cmd_buf_pool;
     63  1.1.2.2  skrll 	size_t			sc_cmd_buf_size;
     64  1.1.2.2  skrll 
     65  1.1.2.2  skrll #ifdef OCTEON_ETH_DEBUG
     66  1.1.2.2  skrll 	struct evcnt		sc_ev_pkoerrdbell;
     67  1.1.2.2  skrll 	struct evcnt		sc_ev_pkoerrparity;
     68  1.1.2.2  skrll #endif
     69  1.1.2.2  skrll };
     70  1.1.2.2  skrll 
     71  1.1.2.2  skrll /* XXX */
     72  1.1.2.2  skrll struct octeon_pko_attach_args {
     73  1.1.2.2  skrll 	int				aa_port;
     74  1.1.2.2  skrll 	bus_space_tag_t			aa_regt;
     75  1.1.2.2  skrll 	struct octeon_pko_cmdptr_desc	*aa_cmdptr;
     76  1.1.2.2  skrll 	int				aa_cmd_buf_pool;
     77  1.1.2.2  skrll 	size_t				aa_cmd_buf_size;
     78  1.1.2.2  skrll };
     79  1.1.2.2  skrll 
     80  1.1.2.2  skrll /* XXX */
     81  1.1.2.2  skrll void			octeon_pko_init(struct octeon_pko_attach_args *,
     82  1.1.2.2  skrll 			    struct octeon_pko_softc **);
     83  1.1.2.2  skrll int			octeon_pko_enable(struct octeon_pko_softc *);
     84  1.1.2.2  skrll int			octeon_pko_reset(struct octeon_pko_softc *);
     85  1.1.2.2  skrll void			octeon_pko_config(struct octeon_pko_softc *);
     86  1.1.2.2  skrll int			octeon_pko_port_enable(struct octeon_pko_softc *, int);
     87  1.1.2.2  skrll int			octeon_pko_port_config(struct octeon_pko_softc *);
     88  1.1.2.2  skrll void			octeon_pko_int_enable(struct octeon_pko_softc *, int);
     89  1.1.2.2  skrll uint64_t		octeon_pko_int_summary(struct octeon_pko_softc *);
     90  1.1.2.2  skrll static inline uint64_t	octeon_pko_cmd_word0(int, int, int, int, int, int,
     91  1.1.2.2  skrll 			    int, int, int, int, int, int, int, int, int, int);
     92  1.1.2.2  skrll static inline uint64_t	octeon_pko_cmd_word1(int, int, int, int, paddr_t);
     93  1.1.2.2  skrll 
     94  1.1.2.2  skrll 
     95  1.1.2.2  skrll static inline uint64_t
     96  1.1.2.2  skrll octeon_pko_cmd_word0(int sz1, int sz0, int s1, int reg1, int s0, int reg0,
     97  1.1.2.2  skrll     int le, int n2, int q, int r, int g, int ipoffp1, int ii, int df, int segs,
     98  1.1.2.2  skrll     int totalbytes)
     99  1.1.2.2  skrll {
    100  1.1.2.2  skrll 	uint64_t cmd = 0;
    101  1.1.2.2  skrll 
    102  1.1.2.2  skrll 	SET(cmd, (((uint64_t)sz1 << 62) & PKO_CMD_WORD0_SZ1)
    103  1.1.2.2  skrll  	    | (((uint64_t)sz0 << 60) & PKO_CMD_WORD0_SZ0)
    104  1.1.2.2  skrll 	    | (((uint64_t)s1 << 59) & PKO_CMD_WORD0_S1)
    105  1.1.2.2  skrll 	    | (((uint64_t)reg1 << 48) & PKO_CMD_WORD0_REG1)
    106  1.1.2.2  skrll 	    | (((uint64_t)s0 << 47) & PKO_CMD_WORD0_S0)
    107  1.1.2.2  skrll 	    | (((uint64_t)reg0 << 36) & PKO_CMD_WORD0_REG0)
    108  1.1.2.2  skrll 	    | (((uint64_t)le << 35) & PKO_CMD_WORD0_LE)
    109  1.1.2.2  skrll 	    | (((uint64_t)n2 << 34) & PKO_CMD_WORD0_N2)
    110  1.1.2.2  skrll 	    | (((uint64_t)q << 33) & PKO_CMD_WORD0_Q)
    111  1.1.2.2  skrll 	    | (((uint64_t)r << 32) & PKO_CMD_WORD0_R)
    112  1.1.2.2  skrll 	    | (((uint64_t)g << 31) & PKO_CMD_WORD0_G)
    113  1.1.2.2  skrll 	    | (((uint64_t)ipoffp1 << 24) & PKO_CMD_WORD0_IPOFFP1)
    114  1.1.2.2  skrll 	    | (((uint64_t)ii << 23) & PKO_CMD_WORD0_II)
    115  1.1.2.2  skrll 	    | (((uint64_t)df << 22) & PKO_CMD_WORD0_DF)
    116  1.1.2.2  skrll 	    | (((uint64_t)segs << 16) & PKO_CMD_WORD0_SEGS)
    117  1.1.2.2  skrll 	    | (((uint64_t)totalbytes << 0) & PKO_CMD_WORD0_TOTALBYTES));
    118  1.1.2.2  skrll 	return cmd;
    119  1.1.2.2  skrll }
    120  1.1.2.2  skrll 
    121  1.1.2.2  skrll static inline uint64_t
    122  1.1.2.2  skrll octeon_pko_cmd_word1(int i, int back, int pool, int size, paddr_t addr)
    123  1.1.2.2  skrll {
    124  1.1.2.2  skrll 	uint64_t cmd = 0;
    125  1.1.2.2  skrll 
    126  1.1.2.2  skrll 	SET(cmd, (((uint64_t)i << 63) & PKO_CMD_WORD1_I)
    127  1.1.2.2  skrll 	    | (((uint64_t)back << 59) & PKO_CMD_WORD1_BACK)
    128  1.1.2.2  skrll 	    | (((uint64_t)pool << 56) & PKO_CMD_WORD1_POOL)
    129  1.1.2.2  skrll 	    | (((uint64_t)size << 40) & PKO_CMD_WORD1_SIZE)
    130  1.1.2.2  skrll 	    | (((uint64_t)addr << 0) & PKO_CMD_WORD1_ADDR));
    131  1.1.2.2  skrll 	return cmd;
    132  1.1.2.2  skrll }
    133  1.1.2.2  skrll 
    134  1.1.2.2  skrll /* ---- operation primitives */
    135  1.1.2.2  skrll 
    136  1.1.2.2  skrll /* Store Operations */
    137  1.1.2.2  skrll 
    138  1.1.2.2  skrll static inline void
    139  1.1.2.2  skrll octeon_pko_op_store(uint64_t args, uint64_t value)
    140  1.1.2.2  skrll {
    141  1.1.2.2  skrll 	paddr_t addr;
    142  1.1.2.2  skrll 
    143  1.1.2.2  skrll 	addr =
    144  1.1.2.2  skrll 	    ((uint64_t)1 << 48) |
    145  1.1.2.2  skrll 	    ((uint64_t)(CN30XXPKO_MAJORDID & 0x1f) << 43) |
    146  1.1.2.2  skrll 	    ((uint64_t)(CN30XXPKO_SUBDID & 0x7) << 40) |
    147  1.1.2.2  skrll 	    ((uint64_t)args);
    148  1.1.2.2  skrll 	/* XXX */
    149  1.1.2.2  skrll 	OCTEON_SYNCW;
    150  1.1.2.2  skrll 	octeon_write_csr(addr, value);
    151  1.1.2.2  skrll }
    152  1.1.2.2  skrll 
    153  1.1.2.2  skrll static inline void
    154  1.1.2.2  skrll octeon_pko_op_doorbell_write(int pid, int qid, int wdc)
    155  1.1.2.2  skrll {
    156  1.1.2.2  skrll 	uint64_t args, value;
    157  1.1.2.2  skrll 
    158  1.1.2.2  skrll 	args =
    159  1.1.2.2  skrll 	    ((uint64_t)(pid & 0x3f) << 12) |
    160  1.1.2.2  skrll 	    ((uint64_t)(qid & 0x1ff) << 3);
    161  1.1.2.2  skrll 	value = wdc & 0xfffff;
    162  1.1.2.2  skrll 	octeon_pko_op_store(args, value);
    163  1.1.2.2  skrll }
    164  1.1.2.2  skrll 
    165  1.1.2.2  skrll #endif
    166