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