Home | History | Annotate | Line # | Download | only in dev
octeon_powvar.h revision 1.2.18.1
      1  1.2.18.1  pgoyette /*	$NetBSD: octeon_powvar.h,v 1.2.18.1 2018/04/22 07:20:18 pgoyette 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 #ifndef _OCTEON_POWVAR_H_
     30       1.1    hikaru #define _OCTEON_POWVAR_H_
     31       1.1    hikaru 
     32       1.1    hikaru #include <sys/cpu.h>
     33       1.1    hikaru 
     34       1.1    hikaru #define POW_TAG_TYPE_ORDERED	0
     35       1.1    hikaru #define POW_TAG_TYPE_ATOMIC	1
     36       1.1    hikaru #define POW_TAG_TYPE_NULL	2
     37       1.1    hikaru #define POW_TAG_TYPE_NULL_NULL	3
     38       1.1    hikaru 
     39       1.1    hikaru #define POW_TAG_OP_SWTAG		0
     40       1.1    hikaru #define POW_TAG_OP_SWTAG_FULL		1
     41       1.1    hikaru #define POW_TAG_OP_SWTAG_DESCHED	2
     42       1.1    hikaru #define POW_TAG_OP_DESCHED		3
     43       1.1    hikaru #define POW_TAG_OP_ADDWQ		4
     44       1.1    hikaru #define POW_TAG_OP_UPD_WQP_GRP		5
     45       1.1    hikaru #define POW_TAG_OP_CLR_NSCHED		7
     46       1.1    hikaru #define POW_TAG_OP_NOP			15
     47       1.1    hikaru 
     48       1.1    hikaru #define POW_WAIT	1
     49       1.1    hikaru #define POW_NO_WAIT	0
     50       1.1    hikaru 
     51       1.1    hikaru /* XXX */
     52       1.1    hikaru struct octeon_pow_softc {
     53       1.1    hikaru 	device_t		sc_dev;
     54       1.1    hikaru 	bus_space_tag_t		sc_regt;
     55       1.1    hikaru 	bus_space_handle_t	sc_regh;
     56       1.1    hikaru 	int			sc_port;
     57       1.1    hikaru 	int			sc_int_pc_base;
     58       1.1    hikaru #ifdef OCTEON_ETH_DEBUG
     59       1.1    hikaru 	struct evcnt		sc_ev_powecciopcsrpend;
     60       1.1    hikaru 	struct evcnt		sc_ev_powecciopdbgpend;
     61       1.1    hikaru 	struct evcnt		sc_ev_powecciopaddwork;
     62       1.1    hikaru 	struct evcnt		sc_ev_powecciopillop;
     63       1.1    hikaru 	struct evcnt		sc_ev_poweccioppend24;
     64       1.1    hikaru 	struct evcnt		sc_ev_poweccioppend23;
     65       1.1    hikaru 	struct evcnt		sc_ev_poweccioppend22;
     66       1.1    hikaru 	struct evcnt		sc_ev_poweccioppend21;
     67       1.1    hikaru 	struct evcnt		sc_ev_poweccioptagnull;
     68       1.1    hikaru 	struct evcnt		sc_ev_poweccioptagnullnull;
     69       1.1    hikaru 	struct evcnt		sc_ev_powecciopordatom;
     70       1.1    hikaru 	struct evcnt		sc_ev_powecciopnull;
     71       1.1    hikaru 	struct evcnt		sc_ev_powecciopnullnull;
     72       1.1    hikaru 	struct evcnt		sc_ev_poweccrpe;
     73       1.1    hikaru 	struct evcnt		sc_ev_poweccsyn;
     74       1.1    hikaru 	struct evcnt		sc_ev_poweccdbe;
     75       1.1    hikaru 	struct evcnt		sc_ev_poweccsbe;
     76       1.1    hikaru #endif
     77       1.1    hikaru };
     78       1.1    hikaru 
     79       1.1    hikaru /* XXX */
     80       1.1    hikaru struct octeon_pow_attach_args {
     81       1.1    hikaru 	int			aa_port;
     82       1.1    hikaru 	bus_space_tag_t		aa_regt;
     83       1.1    hikaru };
     84       1.1    hikaru 
     85       1.1    hikaru void			octeon_pow_config(struct octeon_pow_softc *, int);
     86       1.1    hikaru void			*octeon_pow_intr_establish(int, int,
     87       1.1    hikaru 			    void (*)(void *, uint64_t *),
     88       1.1    hikaru 			    void (*)(int *, int *, uint64_t, void *),
     89       1.1    hikaru 			    void *);
     90       1.1    hikaru void			octeon_pow_error_int_enable(void *, int);
     91       1.1    hikaru uint64_t		octeon_pow_error_int_summary(void *);
     92       1.1    hikaru int			octeon_pow_ring_reduce(void *);
     93       1.1    hikaru int			octeon_pow_ring_grow(void *);
     94       1.1    hikaru int			octeon_pow_ring_size(void);
     95       1.1    hikaru int			octeon_pow_ring_intr(void);
     96       1.1    hikaru 
     97       1.1    hikaru #define	_POW_RD8(sc, off) \
     98       1.1    hikaru 	bus_space_read_8((sc)->sc_regt, (sc)->sc_regh, (off))
     99       1.1    hikaru #define	_POW_WR8(sc, off, v) \
    100       1.1    hikaru 	bus_space_write_8((sc)->sc_regt, (sc)->sc_regh, (off), (v))
    101       1.1    hikaru #define	_POW_GROUP_RD8(sc, pi, off) \
    102       1.1    hikaru 	bus_space_read_8((sc)->sc_regt, (sc)->sc_regh, \
    103       1.1    hikaru 	    (off) + sizeof(uint64_t) * (pi)->pi_group)
    104       1.1    hikaru #define	_POW_GROUP_WR8(sc, pi, off, v) \
    105       1.1    hikaru 	bus_space_write_8((sc)->sc_regt, (sc)->sc_regh, \
    106       1.1    hikaru 	    (off) + sizeof(uint64_t) * (pi)->pi_group, (v))
    107       1.1    hikaru 
    108       1.1    hikaru extern struct octeon_pow_softc	octeon_pow_softc;
    109       1.1    hikaru 
    110       1.1    hikaru /* -------------------------------------------------------------------------- */
    111       1.1    hikaru 
    112       1.1    hikaru /* Load Operations */
    113       1.1    hikaru 
    114       1.1    hikaru /* GET_WORK Loads */
    115       1.1    hikaru 
    116  1.2.18.1  pgoyette static __inline uint64_t
    117       1.1    hikaru octeon_pow_ops_get_work_load(
    118       1.1    hikaru 	int wait)			/* 0-1 */
    119       1.1    hikaru {
    120       1.1    hikaru 	uint64_t ptr =
    121       1.1    hikaru 	    POW_OPERATION_BASE_IO_BIT |
    122       1.1    hikaru 	    __BITS64_SET(POW_OPERATION_BASE_MAJOR_DID, 0x0c) |
    123       1.1    hikaru 	    __BITS64_SET(POW_OPERATION_BASE_SUB_DID, 0x00) |
    124       1.1    hikaru 	    __BITS64_SET(POW_GET_WORK_LOAD_WAIT, wait);
    125       1.1    hikaru 
    126       1.1    hikaru 	return octeon_xkphys_read_8(ptr);
    127       1.1    hikaru }
    128       1.1    hikaru 
    129       1.1    hikaru /* POW Status Loads */
    130       1.1    hikaru 
    131       1.1    hikaru /*
    132       1.1    hikaru  * a) get_cur == 0, get_wqp == 0 (pend_tag)
    133       1.1    hikaru  * b) get_cur == 0, get_wqp == 1 (pend_wqp)
    134       1.1    hikaru  * c) get_cur == 1, get_wqp == 0, get_rev == 0 (cur_tag_next)
    135       1.1    hikaru  * d) get_cur == 1, get_wqp == 0, get_rev == 1 (cur_tag_prev)
    136       1.1    hikaru  * e) get_cur == 1, get_wqp == 1, get_rev == 0 (cur_wqp_next)
    137       1.1    hikaru  * f) get_cur == 1, get_wqp == 1, get_rev == 1 (cur_wqp_prev)
    138       1.1    hikaru  */
    139       1.1    hikaru 
    140  1.2.18.1  pgoyette static __inline uint64_t
    141       1.1    hikaru octeon_pow_ops_pow_status(
    142       1.1    hikaru 	int coreid,			/* 0-15 */
    143       1.1    hikaru 	int get_rev,			/* 0-1 */
    144       1.1    hikaru 	int get_cur,			/* 0-1 */
    145       1.1    hikaru 	int get_wqp)			/* 0-1 */
    146       1.1    hikaru {
    147       1.1    hikaru 	uint64_t ptr =
    148       1.1    hikaru 	    POW_OPERATION_BASE_IO_BIT |
    149       1.1    hikaru 	    __BITS64_SET(POW_OPERATION_BASE_MAJOR_DID, 0x0c) |
    150       1.1    hikaru 	    __BITS64_SET(POW_OPERATION_BASE_SUB_DID, 0x01) |
    151       1.1    hikaru 	    __BITS64_SET(POW_STATUS_LOAD_COREID, coreid) |
    152       1.1    hikaru 	    __BITS64_SET(POW_STATUS_LOAD_GET_REV, get_rev) |
    153       1.1    hikaru 	    __BITS64_SET(POW_STATUS_LOAD_GET_CUR, get_cur) |
    154       1.1    hikaru 	    __BITS64_SET(POW_STATUS_LOAD_GET_WQP, get_wqp);
    155       1.1    hikaru 
    156       1.1    hikaru 	return octeon_xkphys_read_8(ptr);
    157       1.1    hikaru }
    158       1.1    hikaru 
    159       1.1    hikaru /* POW Memory Loads */
    160       1.1    hikaru 
    161       1.1    hikaru /*
    162       1.1    hikaru  * a) get_des == 0, get_wqp == 0 (tag)
    163       1.1    hikaru  * b) get_des == 0, get_wqp == 1 (wqe)
    164       1.1    hikaru  * c) get_des == 1 (desched)
    165       1.1    hikaru  */
    166       1.1    hikaru 
    167  1.2.18.1  pgoyette static __inline uint64_t
    168       1.1    hikaru octeon_pow_ops_pow_memory(
    169       1.1    hikaru 	int index,			/* 0-2047 */
    170       1.1    hikaru 	int get_des,			/* 0-1 */
    171       1.1    hikaru 	int get_wqp)			/* 0-1 */
    172       1.1    hikaru {
    173       1.1    hikaru 	uint64_t ptr =
    174       1.1    hikaru 	    POW_OPERATION_BASE_IO_BIT |
    175       1.1    hikaru 	    __BITS64_SET(POW_OPERATION_BASE_MAJOR_DID, 0x0c) |
    176       1.1    hikaru 	    __BITS64_SET(POW_OPERATION_BASE_SUB_DID, 0x02) |
    177       1.1    hikaru 	    __BITS64_SET(POW_MEMORY_LOAD_INDEX, index) |
    178       1.1    hikaru 	    __BITS64_SET(POW_MEMORY_LOAD_GET_DES, get_des) |
    179       1.1    hikaru 	    __BITS64_SET(POW_MEMORY_LOAD_GET_WQP, get_wqp);
    180       1.1    hikaru 
    181       1.1    hikaru 	return octeon_xkphys_read_8(ptr);
    182       1.1    hikaru }
    183       1.1    hikaru 
    184       1.1    hikaru /* POW Index/Pointer Loads */
    185       1.1    hikaru 
    186       1.1    hikaru /*
    187       1.1    hikaru  * a) get_rmt == 0, get_des_get_tail == 0
    188       1.1    hikaru  * b) get_rmt == 0, get_des_get_tail == 1
    189       1.1    hikaru  * c) get_rmt == 1, get_des_get_tail == 0
    190       1.1    hikaru  * d) get_rmt == 1, get_des_get_tail == 1
    191       1.1    hikaru  */
    192       1.1    hikaru 
    193  1.2.18.1  pgoyette static __inline uint64_t
    194       1.1    hikaru octeon_pow_ops_pow_idxptr(
    195       1.1    hikaru 	int qosgrp,			/* 0-7 */
    196       1.1    hikaru 	int get_des_get_tail,		/* 0-1 */
    197       1.1    hikaru 	int get_rmt)			/* 0-1 */
    198       1.1    hikaru {
    199       1.1    hikaru 	uint64_t ptr =
    200       1.1    hikaru 	    POW_OPERATION_BASE_IO_BIT |
    201       1.1    hikaru 	    __BITS64_SET(POW_OPERATION_BASE_MAJOR_DID, 0x0c) |
    202       1.1    hikaru 	    __BITS64_SET(POW_OPERATION_BASE_SUB_DID, 0x03) |
    203       1.1    hikaru 	    __BITS64_SET(POW_IDXPTR_LOAD_QOSGRP, qosgrp) |
    204       1.1    hikaru 	    __BITS64_SET(POW_IDXPTR_LOAD_GET_DES_GET_TAIL, get_des_get_tail) |
    205       1.1    hikaru 	    __BITS64_SET(POW_IDXPTR_LOAD_GET_RMT, get_rmt);
    206       1.1    hikaru 
    207       1.1    hikaru 	return octeon_xkphys_read_8(ptr);
    208       1.1    hikaru }
    209       1.1    hikaru 
    210       1.1    hikaru /* NULL_RD Loads */
    211       1.1    hikaru 
    212  1.2.18.1  pgoyette static __inline uint64_t
    213       1.1    hikaru octeon_pow_ops_null_rd_load(void)
    214       1.1    hikaru {
    215       1.1    hikaru 	uint64_t ptr =
    216       1.1    hikaru 	    POW_OPERATION_BASE_IO_BIT |
    217       1.1    hikaru 	    __BITS64_SET(POW_OPERATION_BASE_MAJOR_DID, 0x0c) |
    218       1.1    hikaru 	    __BITS64_SET(POW_OPERATION_BASE_SUB_DID, 0x04);
    219       1.1    hikaru 
    220       1.1    hikaru 	return octeon_xkphys_read_8(ptr);
    221       1.1    hikaru }
    222       1.1    hikaru 
    223       1.1    hikaru /* IOBDMA Operations */
    224       1.1    hikaru 
    225       1.1    hikaru /* ``subdid'' values are inverted between ``get_work_addr'' and ``null_read_id'' */
    226       1.1    hikaru 
    227       1.1    hikaru /* The ``scraddr'' part is index in 8 byte words, not address. */
    228       1.1    hikaru 
    229       1.1    hikaru /* GET_WORK IOBDMAs */
    230       1.1    hikaru 
    231  1.2.18.1  pgoyette static __inline void
    232       1.1    hikaru octeon_pow_ops_get_work_iobdma(
    233       1.1    hikaru 	int scraddr,			/* 0-2047 */
    234       1.1    hikaru 	int wait)			/* 0-1 */
    235       1.1    hikaru {
    236       1.1    hikaru  	/* ``scraddr'' part is index in 64-bit words, not address */
    237       1.1    hikaru 	const int scrindex = scraddr / sizeof(uint64_t);
    238       1.1    hikaru 
    239       1.1    hikaru         uint64_t args =
    240       1.1    hikaru              __BITS64_SET(POW_IOBDMA_GET_WORK_WAIT, wait);
    241       1.1    hikaru         uint64_t value =
    242       1.1    hikaru             __BITS64_SET(POW_IOBDMA_BASE_SCRADDR, scrindex) |
    243       1.1    hikaru             __BITS64_SET(POW_IOBDMA_BASE_LEN, 0x01) |
    244       1.1    hikaru             __BITS64_SET(POW_IOBDMA_BASE_MAJOR_DID, 0x0c) |
    245       1.1    hikaru             __BITS64_SET(POW_IOBDMA_BASE_SUB_DID, 0x00) |
    246       1.1    hikaru             __BITS64_SET(POW_IOBDMA_BASE_39_0, args);
    247       1.1    hikaru 
    248       1.1    hikaru         octeon_iobdma_write_8(value);
    249       1.1    hikaru }
    250       1.1    hikaru 
    251       1.1    hikaru /* NULL_RD IOBDMAs */
    252       1.1    hikaru 
    253  1.2.18.1  pgoyette static __inline void
    254       1.1    hikaru octeon_pow_ops_null_rd_iobdma(
    255       1.1    hikaru 	int scraddr)			/* 0-2047 */
    256       1.1    hikaru {
    257       1.1    hikaru  	/* ``scraddr'' part is index in 64-bit words, not address */
    258       1.1    hikaru 	const int scrindex = scraddr / sizeof(uint64_t);
    259       1.1    hikaru 
    260       1.1    hikaru         uint64_t value =
    261       1.1    hikaru             __BITS64_SET(POW_IOBDMA_BASE_SCRADDR, scrindex) |
    262       1.1    hikaru             __BITS64_SET(POW_IOBDMA_BASE_LEN, 0x01) |
    263       1.1    hikaru             __BITS64_SET(POW_IOBDMA_BASE_MAJOR_DID, 0x0c) |
    264       1.1    hikaru             __BITS64_SET(POW_IOBDMA_BASE_SUB_DID, 0x04) |
    265       1.1    hikaru             __BITS64_SET(POW_IOBDMA_BASE_39_0, 0);
    266       1.1    hikaru 
    267       1.1    hikaru         octeon_iobdma_write_8(value);
    268       1.1    hikaru }
    269       1.1    hikaru 
    270       1.1    hikaru /* Store Operations */
    271       1.1    hikaru 
    272  1.2.18.1  pgoyette static __inline void
    273       1.1    hikaru octeon_pow_store(
    274       1.1    hikaru 	int subdid,			/* 0, 1, 3 */
    275       1.1    hikaru 	uint64_t addr,			/* 0-0x0000.000f.ffff.ffff */
    276       1.1    hikaru 	int no_sched,			/* 0, 1 */
    277       1.1    hikaru 	int index,			/* 0-8191 */
    278       1.1    hikaru 	int op,				/* 0-15 */
    279       1.1    hikaru 	int qos,			/* 0-7 */
    280       1.1    hikaru 	int grp,			/* 0-7 */
    281       1.1    hikaru 	int type,			/* 0-7 */
    282       1.1    hikaru 	uint32_t tag)			/* 0-0xffff.ffff */
    283       1.1    hikaru {
    284       1.1    hikaru 	/* Physical Address to Store to POW */
    285       1.1    hikaru 	uint64_t ptr =
    286       1.1    hikaru 	    POW_OPERATION_BASE_IO_BIT |
    287       1.1    hikaru 	    __BITS64_SET(POW_OPERATION_BASE_MAJOR_DID, 0x0c) |
    288       1.1    hikaru 	    __BITS64_SET(POW_OPERATION_BASE_SUB_DID, subdid) |
    289       1.1    hikaru 	    __BITS64_SET(POW_PHY_ADDR_STORE_ADDR, addr);
    290       1.1    hikaru 
    291       1.1    hikaru 	/* Store Data on Store to POW */
    292       1.1    hikaru 	uint64_t args =
    293       1.1    hikaru 	    __BITS64_SET(POW_STORE_DATA_NO_SCHED, no_sched) |
    294       1.1    hikaru 	    __BITS64_SET(POW_STORE_DATA_INDEX, index) |
    295       1.1    hikaru 	    __BITS64_SET(POW_STORE_DATA_OP, op) |
    296       1.1    hikaru 	    __BITS64_SET(POW_STORE_DATA_QOS, qos) |
    297       1.1    hikaru 	    __BITS64_SET(POW_STORE_DATA_GRP, grp) |
    298       1.1    hikaru 	    __BITS64_SET(POW_STORE_DATA_TYPE, type) |
    299       1.1    hikaru 	    __BITS64_SET(POW_STORE_DATA_TAG, tag);
    300       1.1    hikaru 
    301       1.1    hikaru 	octeon_xkphys_write_8(ptr, args);
    302       1.1    hikaru }
    303       1.1    hikaru 
    304       1.1    hikaru /* SWTAG */
    305       1.1    hikaru 
    306  1.2.18.1  pgoyette static __inline void
    307       1.1    hikaru octeon_pow_ops_swtag(int type, uint32_t tag)
    308       1.1    hikaru {
    309       1.1    hikaru 	octeon_pow_store(
    310       1.1    hikaru 		1,			/* subdid == 1 */
    311       1.1    hikaru 		0, 			/* addr (not used for SWTAG) */
    312       1.1    hikaru 		0,			/* no_sched (not used for SWTAG) */
    313       1.1    hikaru 		0,			/* index (not used for SWTAG) */
    314       1.1    hikaru 		POW_TAG_OP_SWTAG,	/* op == SWTAG */
    315       1.1    hikaru 		0,			/* qos (not used for SWTAG) */
    316       1.1    hikaru 		0,			/* grp (not used for SWTAG) */
    317       1.1    hikaru 		type,
    318       1.1    hikaru 		tag);
    319       1.1    hikaru 	/* switch to NULL completes immediately */
    320       1.1    hikaru }
    321       1.1    hikaru 
    322       1.1    hikaru /* SWTAG_FULL */
    323       1.1    hikaru 
    324  1.2.18.1  pgoyette static __inline void
    325       1.1    hikaru octeon_pow_ops_swtag_full(paddr_t addr, int grp, int type, uint32_t tag)
    326       1.1    hikaru {
    327       1.1    hikaru 	octeon_pow_store(
    328       1.1    hikaru 		0,			/* subdid == 0 */
    329       1.1    hikaru 		addr,
    330       1.1    hikaru 		0,			/* no_sched (not used for SWTAG_FULL) */
    331       1.1    hikaru 		0,			/* index (not used for SWTAG_FULL) */
    332       1.1    hikaru 		POW_TAG_OP_SWTAG_FULL,	/* op == SWTAG_FULL */
    333       1.1    hikaru 		0,			/* qos (not used for SWTAG_FULL) */
    334       1.1    hikaru 		grp,
    335       1.1    hikaru 		type,
    336       1.1    hikaru 		tag);
    337       1.1    hikaru }
    338       1.1    hikaru 
    339       1.1    hikaru /* SWTAG_DESCHED */
    340       1.1    hikaru 
    341  1.2.18.1  pgoyette static __inline void
    342       1.1    hikaru octeon_pow_ops_swtag_desched(int no_sched, int grp, int type, uint32_t tag)
    343       1.1    hikaru {
    344       1.1    hikaru 	octeon_pow_store(
    345       1.1    hikaru 		3,			/* subdid == 3 */
    346       1.1    hikaru 		0,			/* addr (not used for SWTAG_DESCHED) */
    347       1.1    hikaru 		no_sched,
    348       1.1    hikaru 		0,			/* index (not used for SWTAG_DESCHED) */
    349       1.1    hikaru 		POW_TAG_OP_SWTAG_DESCHED, /* op == SWTAG_DESCHED */
    350       1.1    hikaru 		0,			/* qos (not used for SWTAG_DESCHED) */
    351       1.1    hikaru 		grp,
    352       1.1    hikaru 		type,
    353       1.1    hikaru 		tag);
    354       1.1    hikaru }
    355       1.1    hikaru 
    356       1.1    hikaru /* DESCHED */
    357       1.1    hikaru 
    358  1.2.18.1  pgoyette static __inline void
    359       1.1    hikaru octeon_pow_ops_desched(int no_sched)
    360       1.1    hikaru {
    361       1.1    hikaru 	octeon_pow_store(
    362       1.1    hikaru 		3,			/* subdid == 3 */
    363       1.1    hikaru 		0,			/* addr (not used for DESCHED) */
    364       1.1    hikaru 		no_sched,
    365       1.1    hikaru 		0,			/* index (not used for DESCHED) */
    366       1.1    hikaru 		POW_TAG_OP_DESCHED,	/* op == DESCHED */
    367       1.1    hikaru 		0,			/* qos (not used for DESCHED) */
    368       1.1    hikaru 		0,			/* grp (not used for DESCHED) */
    369       1.1    hikaru 		0,			/* type (not used for DESCHED) */
    370       1.1    hikaru 		0);			/* tag (not used for DESCHED) */
    371       1.1    hikaru }
    372       1.1    hikaru 
    373       1.1    hikaru /* ADDWQ */
    374       1.1    hikaru 
    375  1.2.18.1  pgoyette static __inline void
    376       1.1    hikaru octeon_pow_ops_addwq(paddr_t addr, int qos, int grp, int type, uint32_t tag)
    377       1.1    hikaru {
    378       1.1    hikaru 	octeon_pow_store(
    379       1.1    hikaru 		1,			/* subdid == 1 */
    380       1.1    hikaru 		addr,
    381       1.1    hikaru 		0,			/* no_sched (not used for ADDWQ) */
    382       1.1    hikaru 		0,			/* index (not used for ADDWQ) */
    383       1.1    hikaru 		POW_TAG_OP_ADDWQ,	/* op == ADDWQ */
    384       1.1    hikaru 		qos,
    385       1.1    hikaru 		grp,
    386       1.1    hikaru 		type,
    387       1.1    hikaru 		tag);
    388       1.1    hikaru }
    389       1.1    hikaru 
    390       1.1    hikaru /* UPD_WQP_GRP */
    391       1.1    hikaru 
    392  1.2.18.1  pgoyette static __inline void
    393       1.1    hikaru octeon_pow_ops_upd_wqp_grp(paddr_t addr, int grp)
    394       1.1    hikaru {
    395       1.1    hikaru 	octeon_pow_store(
    396       1.1    hikaru 		1,			/* subdid == 1 */
    397       1.1    hikaru 		addr,
    398       1.1    hikaru 		0,			/* no_sched (not used for UPD_WQP_GRP) */
    399       1.1    hikaru 		0,			/* index (not used for UPD_WQP_GRP) */
    400       1.1    hikaru 		POW_TAG_OP_UPD_WQP_GRP,	/* op == UPD_WQP_GRP */
    401       1.1    hikaru 		0,			/* qos (not used for UPD_WQP_GRP) */
    402       1.1    hikaru 		grp,
    403       1.1    hikaru 		0,			/* type (not used for UPD_WQP_GRP) */
    404       1.1    hikaru 		0);			/* tag (not used for UPD_WQP_GRP) */
    405       1.1    hikaru }
    406       1.1    hikaru 
    407       1.1    hikaru /* CLR_NSCHED */
    408       1.1    hikaru 
    409  1.2.18.1  pgoyette static __inline void
    410       1.1    hikaru octeon_pow_ops_clr_nsched(paddr_t addr, int index)
    411       1.1    hikaru {
    412       1.1    hikaru 	octeon_pow_store(
    413       1.1    hikaru 		1,			/* subdid == 1 */
    414       1.1    hikaru 		addr,
    415       1.1    hikaru 		0,			/* no_sched (not used for CLR_NSCHED) */
    416       1.1    hikaru 		index,
    417       1.1    hikaru 		POW_TAG_OP_CLR_NSCHED,	/* op == CLR_NSCHED */
    418       1.1    hikaru 		0,			/* qos (not used for CLR_NSCHED) */
    419       1.1    hikaru 		0,			/* grp (not used for CLR_NSCHED) */
    420       1.1    hikaru 		0,			/* type (not used for CLR_NSCHED) */
    421       1.1    hikaru 		0);			/* tag (not used for CLR_NSCHED) */
    422       1.1    hikaru }
    423       1.1    hikaru 
    424       1.1    hikaru /* NOP */
    425       1.1    hikaru 
    426  1.2.18.1  pgoyette static __inline void
    427       1.1    hikaru octeon_pow_ops_nop(void)
    428       1.1    hikaru {
    429       1.1    hikaru 	octeon_pow_store(
    430       1.1    hikaru 		1,			/* subdid == 1 */
    431       1.1    hikaru 		0,			/* addr (not used for NOP) */
    432       1.1    hikaru 		0,			/* no_sched (not used for NOP) */
    433       1.1    hikaru 		0,			/* index (not used for NOP) */
    434       1.1    hikaru 		POW_TAG_OP_NOP,		/* op == NOP */
    435       1.1    hikaru 		0,			/* qos (not used for NOP) */
    436       1.1    hikaru 		0,			/* grp (not used for NOP) */
    437       1.1    hikaru 		0,			/* type (not used for NOP) */
    438       1.1    hikaru 		0);			/* tag (not used for NOP) */
    439       1.1    hikaru }
    440       1.1    hikaru 
    441       1.1    hikaru /* -------------------------------------------------------------------------- */
    442       1.1    hikaru 
    443       1.1    hikaru /*
    444       1.1    hikaru  * global functions
    445       1.1    hikaru  */
    446  1.2.18.1  pgoyette static __inline void
    447       1.1    hikaru octeon_pow_work_request_async(uint64_t scraddr, uint64_t wait)
    448       1.1    hikaru {
    449       1.1    hikaru         octeon_pow_ops_get_work_iobdma(scraddr, wait);
    450       1.1    hikaru }
    451       1.1    hikaru 
    452  1.2.18.1  pgoyette static __inline uint64_t *
    453       1.1    hikaru octeon_pow_work_response_async(uint64_t scraddr)
    454       1.1    hikaru {
    455       1.1    hikaru 	uint64_t result;
    456       1.1    hikaru 
    457       1.1    hikaru 	OCTEON_SYNCIOBDMA;
    458       1.1    hikaru 	result = octeon_cvmseg_read_8(scraddr);
    459       1.1    hikaru 
    460       1.2      matt 	paddr_t addr = result & POW_IOBDMA_GET_WORK_RESULT_ADDR;
    461       1.2      matt 
    462       1.2      matt 	if (result & POW_IOBDMA_GET_WORK_RESULT_NO_WORK)
    463       1.2      matt 	    return NULL;
    464       1.2      matt #ifdef __mips_n32
    465       1.2      matt 	KASSERT(addr < MIPS_PHYS_MASK);
    466       1.2      matt 	//if (addr < MIPS_PHYS_MASK)
    467       1.2      matt 		return (uint64_t *)MIPS_PHYS_TO_KSEG0(addr);
    468       1.2      matt #else
    469       1.2      matt 	return (uint64_t *)MIPS_PHYS_TO_XKPHYS_CACHED(addr);
    470       1.2      matt #endif
    471       1.1    hikaru }
    472       1.1    hikaru 
    473  1.2.18.1  pgoyette static __inline void
    474       1.1    hikaru octeon_pow_config_int_pc(struct octeon_pow_softc *sc, int unit)
    475       1.1    hikaru {
    476       1.1    hikaru 	uint64_t wq_int_pc;
    477       1.1    hikaru 	uint64_t pc_thr;
    478       1.1    hikaru 	static uint64_t cpu_clock_hz;
    479       1.1    hikaru 
    480       1.1    hikaru 	if (cpu_clock_hz == 0)
    481       1.1    hikaru 		cpu_clock_hz  = curcpu()->ci_cpu_freq;
    482       1.1    hikaru 
    483       1.1    hikaru 	/* from SDK */
    484       1.1    hikaru 	pc_thr = (cpu_clock_hz) / (unit * 16 * 256);
    485       1.1    hikaru 
    486       1.1    hikaru 	wq_int_pc = pc_thr << POW_WQ_INT_PC_PC_THR_SHIFT;
    487       1.1    hikaru 	_POW_WR8(sc, POW_WQ_INT_PC_OFFSET, wq_int_pc);
    488       1.1    hikaru }
    489       1.1    hikaru 
    490  1.2.18.1  pgoyette static __inline void
    491       1.1    hikaru octeon_pow_config_int_pc_rate(struct octeon_pow_softc *sc, int rate)
    492       1.1    hikaru {
    493       1.1    hikaru 	octeon_pow_config_int_pc(sc, sc->sc_int_pc_base / rate);
    494       1.1    hikaru }
    495       1.1    hikaru 
    496       1.1    hikaru /* wait until ready */
    497  1.2.18.1  pgoyette static __inline void
    498       1.1    hikaru octeon_pow_tag_sw_wait(void)
    499       1.1    hikaru {
    500       1.1    hikaru 	__asm __volatile (
    501       1.1    hikaru 		"	.set	push		\n"
    502       1.1    hikaru 		"	.set	noreorder	\n"
    503       1.1    hikaru 		"	.set	arch=octeon	\n"
    504       1.1    hikaru 		"1:	rdhwr	$2, $30		\n"
    505       1.1    hikaru 		"	beqz	$2, 1b		\n"
    506       1.1    hikaru 		"	 nop			\n"
    507       1.1    hikaru 		"	.set	pop		\n"
    508       1.1    hikaru 	);
    509       1.1    hikaru }
    510       1.1    hikaru 
    511       1.1    hikaru #endif /* _OCTEON_POWVAR_H_ */
    512