]> CyberLeo.Net >> Repos - FreeBSD/releng/8.2.git/blob - sys/contrib/octeon-sdk/cvmx-rng.h
Copy stable/8 to releng/8.2 in preparation for FreeBSD-8.2 release.
[FreeBSD/releng/8.2.git] / sys / contrib / octeon-sdk / cvmx-rng.h
1 /***********************license start***************
2  *  Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights
3  *  reserved.
4  *
5  *
6  *  Redistribution and use in source and binary forms, with or without
7  *  modification, are permitted provided that the following conditions are
8  *  met:
9  *
10  *      * Redistributions of source code must retain the above copyright
11  *        notice, this list of conditions and the following disclaimer.
12  *
13  *      * Redistributions in binary form must reproduce the above
14  *        copyright notice, this list of conditions and the following
15  *        disclaimer in the documentation and/or other materials provided
16  *        with the distribution.
17  *
18  *      * Neither the name of Cavium Networks nor the names of
19  *        its contributors may be used to endorse or promote products
20  *        derived from this software without specific prior written
21  *        permission.
22  *
23  *  TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
24  *  AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS
25  *  OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH
26  *  RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY
27  *  REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT
28  *  DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES
29  *  OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR
30  *  PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET
31  *  POSSESSION OR CORRESPONDENCE TO DESCRIPTION.  THE ENTIRE RISK ARISING OUT
32  *  OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU.
33  *
34  *
35  *  For any questions regarding licensing please contact marketing@caviumnetworks.com
36  *
37  ***********************license end**************************************/
38
39
40
41
42
43
44 /**
45  * @file
46  *
47  * Function and structure definitions for random number generator hardware
48  *
49  * <hr>$Revision: 41586 $<hr>
50  */
51
52
53 #ifndef __CMVX_RNG_H__
54 #define __CMVX_RNG_H__
55
56 #ifdef  __cplusplus
57 extern "C" {
58 #endif
59
60 #define CVMX_RNG_LOAD_ADDRESS   CVMX_ADD_IO_SEG(cvmx_build_io_address(CVMX_OCT_DID_RNG, 0))
61
62 /**
63  * Structure describing the data format used for IOBDMA stores to the RNG.
64  */
65 typedef union
66 {
67     uint64_t        u64;
68     struct {
69         uint64_t    scraddr : 8;    /**< the (64-bit word) location in scratchpad to write to (if len != 0) */
70         uint64_t    len     : 8;    /**< the number of words in the response (0 => no response) */
71         uint64_t    did     : 5;    /**< the ID of the device on the non-coherent bus */
72         uint64_t    subdid  : 3;    /**< the sub ID of the device on the non-coherent bus */
73         uint64_t    addr    :40;    /**< the address that will appear in the first tick on the NCB bus */
74     } s;
75 } cvmx_rng_iobdma_data_t;
76
77 /**
78  * Enables the random number generator. Must be called before RNG is used
79  */
80 static inline void cvmx_rng_enable(void)
81 {
82     cvmx_rnm_ctl_status_t rnm_ctl_status;
83     rnm_ctl_status.u64 = 0;
84     rnm_ctl_status.s.ent_en = 1;
85     rnm_ctl_status.s.rng_en = 1;
86     cvmx_write_csr(CVMX_RNM_CTL_STATUS, rnm_ctl_status.u64);
87 }
88 /**
89  * Reads 8 bits of random data from Random number generator
90  *
91  * @return random data
92  */
93 static inline uint8_t cvmx_rng_get_random8(void)
94 {
95     return cvmx_read64_uint8(CVMX_RNG_LOAD_ADDRESS);
96 }
97
98 /**
99  * Reads 16 bits of random data from Random number generator
100  *
101  * @return random data
102  */
103 static inline uint16_t cvmx_rng_get_random16(void)
104 {
105     return cvmx_read64_uint16(CVMX_RNG_LOAD_ADDRESS);
106 }
107
108 /**
109  * Reads 32 bits of random data from Random number generator
110  *
111  * @return random data
112  */
113 static inline uint32_t cvmx_rng_get_random32(void)
114 {
115     return cvmx_read64_uint32(CVMX_RNG_LOAD_ADDRESS);
116 }
117
118 /**
119  * Reads 64 bits of random data from Random number generator
120  *
121  * @return random data
122  */
123 static inline uint64_t cvmx_rng_get_random64(void)
124 {
125     return cvmx_read64_uint64(CVMX_RNG_LOAD_ADDRESS);
126 }
127
128 /**
129  * Requests random data from the RNG block asynchronously using and IOBDMA operation.
130  * The random data will be written into the cores
131  * local memory at the specified address.  A SYNCIOBDMA
132  * operation should be issued to stall for completion of the write.
133  *
134  * @param scr_addr  Address in scratch memory to put the result
135  *                  MUST be a multiple of 8 bytes
136  * @param num_bytes Number of bytes of random data to write at
137  *                  scr_addr
138  *                  MUST be a multiple of 8 bytes
139  *
140  * @return 0 on success
141  *         1 on error
142  */
143 static inline int cvmx_rng_request_random_async(uint64_t scr_addr, uint64_t num_bytes)
144 {
145     cvmx_rng_iobdma_data_t data;
146
147     if (num_bytes & 0x7 || scr_addr & 0x7)
148         return(1);
149
150     /* scr_addr must be 8 byte aligned */
151     data.s.scraddr = scr_addr >> 3;
152     data.s.len = num_bytes >> 3;
153     data.s.did = CVMX_OCT_DID_RNG;
154     cvmx_send_single(data.u64);
155     return(0);
156 }
157
158 #ifdef  __cplusplus
159 }
160 #endif
161
162 #endif /*  __CMVX_RNG_H__  */