coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
spi_internal.h
Go to the documentation of this file.
1
/* SPDX-License-Identifier: GPL-2.0-only */
2
#ifndef __SOC_SIFIVE_HIFIVE_U_SPI_INTERNAL_H__
3
#define __SOC_SIFIVE_HIFIVE_U_SPI_INTERNAL_H__
4
5
#include <
stdint.h
>
6
7
#define _ASSERT_SIZEOF(type, size) _Static_assert( \
8
sizeof(type) == (size), \
9
#type " must be "
#size " bytes wide")
10
11
#define FU540_SPI_CSMODE_AUTO 0
12
#define FU540_SPI_CSMODE_HOLD 2
13
#define FU540_SPI_CSMODE_OFF 3
14
15
typedef
union
{
16
struct
{
17
uint32_t
pha
: 1;
18
uint32_t
pol
: 1;
19
uint32_t
reserved
: 30;
20
};
21
uint32_t
raw_bits
;
22
}
spi_reg_sckmode
;
23
_ASSERT_SIZEOF
(
spi_reg_sckmode
, 4);
24
25
typedef
union
{
26
struct
{
27
uint32_t
mode
: 2;
28
uint32_t
reserved
: 30;
29
};
30
uint32_t
raw_bits
;
31
}
spi_reg_csmode
;
32
_ASSERT_SIZEOF
(
spi_reg_csmode
, 4);
33
34
typedef
union
{
35
struct
{
36
uint32_t
cssck
: 8;
37
uint32_t
reserved0
: 8;
38
uint32_t
sckcs
: 8;
39
uint32_t
reserved1
: 8;
40
};
41
uint32_t
raw_bits
;
42
}
spi_reg_delay0
;
43
_ASSERT_SIZEOF
(
spi_reg_delay0
, 4);
44
45
typedef
union
{
46
struct
{
47
uint32_t
intercs
: 8;
48
uint32_t
reserved0
: 8;
49
uint32_t
interxfr
: 8;
50
uint32_t
reserved1
: 8;
51
};
52
uint32_t
raw_bits
;
53
}
spi_reg_delay1
;
54
_ASSERT_SIZEOF
(
spi_reg_delay1
, 4);
55
56
typedef
union
{
57
struct
{
58
uint32_t
proto
: 2;
59
uint32_t
endian
: 1;
60
uint32_t
dir
: 1;
61
uint32_t
reserved0
: 12;
62
uint32_t
len
: 4;
63
uint32_t
reserved1
: 12;
64
};
65
uint32_t
raw_bits
;
66
}
spi_reg_fmt
;
67
_ASSERT_SIZEOF
(
spi_reg_fmt
, 4);
68
69
typedef
union
{
70
struct
{
71
uint32_t
data
: 8;
72
uint32_t
reserved
: 23;
73
uint32_t
full
: 1;
74
};
75
uint32_t
raw_bits
;
76
}
spi_reg_txdata
;
77
_ASSERT_SIZEOF
(
spi_reg_txdata
, 4);
78
79
typedef
union
{
80
struct
{
81
uint32_t
data
: 8;
82
uint32_t
reserved
: 23;
83
uint32_t
empty
: 1;
84
};
85
uint32_t
raw_bits
;
86
}
spi_reg_rxdata
;
87
_ASSERT_SIZEOF
(
spi_reg_rxdata
, 4);
88
89
typedef
union
{
90
struct
{
91
uint32_t
txmark
: 3;
92
uint32_t
reserved
: 29;
93
};
94
uint32_t
raw_bits
;
95
}
spi_reg_txmark
;
96
_ASSERT_SIZEOF
(
spi_reg_txmark
, 4);
97
98
typedef
union
{
99
struct
{
100
uint32_t
rxmark
: 3;
101
uint32_t
reserved
: 29;
102
};
103
uint32_t
raw_bits
;
104
}
spi_reg_rxmark
;
105
_ASSERT_SIZEOF
(
spi_reg_rxmark
, 4);
106
107
typedef
union
{
108
struct
{
109
uint32_t
en
: 1;
110
uint32_t
reserved
: 31;
111
};
112
uint32_t
raw_bits
;
113
}
spi_reg_fctrl
;
114
_ASSERT_SIZEOF
(
spi_reg_fctrl
, 4);
115
116
typedef
union
{
117
struct
{
118
uint32_t
cmd_en
: 1;
119
uint32_t
addr_len
: 3;
120
uint32_t
pad_cnt
: 4;
121
uint32_t
command_proto
: 2;
122
uint32_t
addr_proto
: 2;
123
uint32_t
data_proto
: 2;
124
uint32_t
reserved
: 2;
125
uint32_t
command_code
: 8;
126
uint32_t
pad_code
: 8;
127
};
128
uint32_t
raw_bits
;
129
}
spi_reg_ffmt
;
130
_ASSERT_SIZEOF
(
spi_reg_ffmt
, 4);
131
132
typedef
union
{
133
struct
{
134
uint32_t
txwm
: 1;
135
uint32_t
rxwm
: 1;
136
uint32_t
reserved
: 30;
137
};
138
uint32_t
raw_bits
;
139
}
spi_reg_ie
;
140
typedef
spi_reg_ie
spi_reg_ip
;
141
_ASSERT_SIZEOF
(
spi_reg_ie
, 4);
142
_ASSERT_SIZEOF
(
spi_reg_ip
, 4);
143
144
#undef _ASSERT_SIZEOF
145
146
/**
147
* SPI control register memory map.
148
*
149
* All functions take a pointer to a SPI device's control registers.
150
*/
151
struct
spi_ctrl
{
152
uint32_t
sckdiv
;
153
spi_reg_sckmode
sckmode
;
154
uint32_t
reserved08
;
155
uint32_t
reserved0c
;
156
157
uint32_t
csid
;
158
uint32_t
csdef
;
159
spi_reg_csmode
csmode
;
160
uint32_t
reserved1c
;
161
162
uint32_t
reserved20
;
163
uint32_t
reserved24
;
164
spi_reg_delay0
delay0
;
165
spi_reg_delay1
delay1
;
166
167
uint32_t
reserved30
;
168
uint32_t
reserved34
;
169
uint32_t
reserved38
;
170
uint32_t
reserved3c
;
171
172
spi_reg_fmt
fmt
;
173
uint32_t
reserved44
;
174
spi_reg_txdata
txdata
;
175
spi_reg_rxdata
rxdata
;
176
177
spi_reg_txmark
txmark
;
178
spi_reg_rxmark
rxmark
;
179
uint32_t
reserved58
;
180
uint32_t
reserved5c
;
181
182
spi_reg_fctrl
fctrl
;
183
spi_reg_ffmt
ffmt
;
184
uint32_t
reserved68
;
185
uint32_t
reserved6c
;
186
187
spi_reg_ie
ie
;
188
spi_reg_ip
ip
;
189
};
190
191
/**
192
* Get smallest clock divisor that divides input_khz to a quotient less than or
193
* equal to max_target_khz;
194
*/
195
static
inline
unsigned
int
196
spi_min_clk_divisor
(
unsigned
int
input_khz,
unsigned
int
max_target_khz)
197
{
198
// f_sck = f_in / (2 * (div + 1)) => div = (f_in / (2*f_sck)) - 1
199
//
200
// The nearest integer solution for div requires rounding up as to not
201
// exceed max_target_khz.
202
//
203
// div = ceil(f_in / (2*f_sck)) - 1
204
// = floor((f_in - 1 + 2*f_sck) / (2*f_sck)) - 1
205
//
206
// This should not overflow as long as (f_in - 1 + 2*f_sck) does not
207
// exceed 2^32 - 1, which is unlikely since we represent frequencies
208
// in kHz.
209
unsigned
int
quotient =
210
(input_khz + 2 * max_target_khz - 1) / (2 * max_target_khz);
211
// Avoid underflow
212
if
(quotient == 0)
213
return
0;
214
return
quotient - 1;
215
}
216
217
#endif
/* __SOC_SIFIVE_HIFIVE_U_SPI_INTERNAL_H__ */
spi_reg_ip
spi_reg_ie spi_reg_ip
Definition:
spi_internal.h:140
_ASSERT_SIZEOF
#define _ASSERT_SIZEOF(type, size)
Definition:
spi_internal.h:7
spi_min_clk_divisor
static unsigned int spi_min_clk_divisor(unsigned int input_khz, unsigned int max_target_khz)
Get smallest clock divisor that divides input_khz to a quotient less than or equal to max_target_khz;...
Definition:
spi_internal.h:196
stdint.h
uint32_t
unsigned int uint32_t
Definition:
stdint.h:14
spi_ctrl
SPI control register memory map.
Definition:
spi_internal.h:151
spi_ctrl::sckdiv
uint32_t sckdiv
Definition:
spi_internal.h:152
spi_ctrl::ip
spi_reg_ip ip
Definition:
spi_internal.h:188
spi_ctrl::ie
spi_reg_ie ie
Definition:
spi_internal.h:187
spi_ctrl::txmark
spi_reg_txmark txmark
Definition:
spi_internal.h:177
spi_ctrl::reserved3c
uint32_t reserved3c
Definition:
spi_internal.h:170
spi_ctrl::reserved34
uint32_t reserved34
Definition:
spi_internal.h:168
spi_ctrl::delay1
spi_reg_delay1 delay1
Definition:
spi_internal.h:165
spi_ctrl::reserved38
uint32_t reserved38
Definition:
spi_internal.h:169
spi_ctrl::ffmt
spi_reg_ffmt ffmt
Definition:
spi_internal.h:183
spi_ctrl::rxmark
spi_reg_rxmark rxmark
Definition:
spi_internal.h:178
spi_ctrl::reserved1c
uint32_t reserved1c
Definition:
spi_internal.h:160
spi_ctrl::rxdata
spi_reg_rxdata rxdata
Definition:
spi_internal.h:175
spi_ctrl::csdef
uint32_t csdef
Definition:
spi_internal.h:158
spi_ctrl::reserved08
uint32_t reserved08
Definition:
spi_internal.h:154
spi_ctrl::csid
uint32_t csid
Definition:
spi_internal.h:157
spi_ctrl::reserved30
uint32_t reserved30
Definition:
spi_internal.h:167
spi_ctrl::reserved24
uint32_t reserved24
Definition:
spi_internal.h:163
spi_ctrl::txdata
spi_reg_txdata txdata
Definition:
spi_internal.h:174
spi_ctrl::reserved68
uint32_t reserved68
Definition:
spi_internal.h:184
spi_ctrl::reserved44
uint32_t reserved44
Definition:
spi_internal.h:173
spi_ctrl::reserved58
uint32_t reserved58
Definition:
spi_internal.h:179
spi_ctrl::csmode
spi_reg_csmode csmode
Definition:
spi_internal.h:159
spi_ctrl::reserved0c
uint32_t reserved0c
Definition:
spi_internal.h:155
spi_ctrl::fmt
spi_reg_fmt fmt
Definition:
spi_internal.h:172
spi_ctrl::reserved20
uint32_t reserved20
Definition:
spi_internal.h:162
spi_ctrl::delay0
spi_reg_delay0 delay0
Definition:
spi_internal.h:164
spi_ctrl::fctrl
spi_reg_fctrl fctrl
Definition:
spi_internal.h:182
spi_ctrl::reserved6c
uint32_t reserved6c
Definition:
spi_internal.h:185
spi_ctrl::sckmode
spi_reg_sckmode sckmode
Definition:
spi_internal.h:153
spi_ctrl::reserved5c
uint32_t reserved5c
Definition:
spi_internal.h:180
spi_reg_csmode
Definition:
spi_internal.h:25
spi_reg_csmode::reserved
uint32_t reserved
Definition:
spi_internal.h:28
spi_reg_csmode::mode
uint32_t mode
Definition:
spi_internal.h:27
spi_reg_csmode::raw_bits
uint32_t raw_bits
Definition:
spi_internal.h:30
spi_reg_delay0
Definition:
spi_internal.h:34
spi_reg_delay0::sckcs
uint32_t sckcs
Definition:
spi_internal.h:38
spi_reg_delay0::cssck
uint32_t cssck
Definition:
spi_internal.h:36
spi_reg_delay0::reserved0
uint32_t reserved0
Definition:
spi_internal.h:37
spi_reg_delay0::reserved1
uint32_t reserved1
Definition:
spi_internal.h:39
spi_reg_delay0::raw_bits
uint32_t raw_bits
Definition:
spi_internal.h:41
spi_reg_delay1
Definition:
spi_internal.h:45
spi_reg_delay1::raw_bits
uint32_t raw_bits
Definition:
spi_internal.h:52
spi_reg_delay1::interxfr
uint32_t interxfr
Definition:
spi_internal.h:49
spi_reg_delay1::reserved1
uint32_t reserved1
Definition:
spi_internal.h:50
spi_reg_delay1::intercs
uint32_t intercs
Definition:
spi_internal.h:47
spi_reg_delay1::reserved0
uint32_t reserved0
Definition:
spi_internal.h:48
spi_reg_fctrl
Definition:
spi_internal.h:107
spi_reg_fctrl::en
uint32_t en
Definition:
spi_internal.h:109
spi_reg_fctrl::reserved
uint32_t reserved
Definition:
spi_internal.h:110
spi_reg_fctrl::raw_bits
uint32_t raw_bits
Definition:
spi_internal.h:112
spi_reg_ffmt
Definition:
spi_internal.h:116
spi_reg_ffmt::cmd_en
uint32_t cmd_en
Definition:
spi_internal.h:118
spi_reg_ffmt::raw_bits
uint32_t raw_bits
Definition:
spi_internal.h:128
spi_reg_ffmt::command_proto
uint32_t command_proto
Definition:
spi_internal.h:121
spi_reg_ffmt::pad_code
uint32_t pad_code
Definition:
spi_internal.h:126
spi_reg_ffmt::command_code
uint32_t command_code
Definition:
spi_internal.h:125
spi_reg_ffmt::reserved
uint32_t reserved
Definition:
spi_internal.h:124
spi_reg_ffmt::addr_len
uint32_t addr_len
Definition:
spi_internal.h:119
spi_reg_ffmt::addr_proto
uint32_t addr_proto
Definition:
spi_internal.h:122
spi_reg_ffmt::pad_cnt
uint32_t pad_cnt
Definition:
spi_internal.h:120
spi_reg_ffmt::data_proto
uint32_t data_proto
Definition:
spi_internal.h:123
spi_reg_fmt
Definition:
spi_internal.h:56
spi_reg_fmt::endian
uint32_t endian
Definition:
spi_internal.h:59
spi_reg_fmt::proto
uint32_t proto
Definition:
spi_internal.h:58
spi_reg_fmt::len
uint32_t len
Definition:
spi_internal.h:62
spi_reg_fmt::reserved1
uint32_t reserved1
Definition:
spi_internal.h:63
spi_reg_fmt::reserved0
uint32_t reserved0
Definition:
spi_internal.h:61
spi_reg_fmt::dir
uint32_t dir
Definition:
spi_internal.h:60
spi_reg_fmt::raw_bits
uint32_t raw_bits
Definition:
spi_internal.h:65
spi_reg_ie
Definition:
spi_internal.h:132
spi_reg_ie::txwm
uint32_t txwm
Definition:
spi_internal.h:134
spi_reg_ie::reserved
uint32_t reserved
Definition:
spi_internal.h:136
spi_reg_ie::raw_bits
uint32_t raw_bits
Definition:
spi_internal.h:138
spi_reg_ie::rxwm
uint32_t rxwm
Definition:
spi_internal.h:135
spi_reg_rxdata
Definition:
spi_internal.h:79
spi_reg_rxdata::raw_bits
uint32_t raw_bits
Definition:
spi_internal.h:85
spi_reg_rxdata::data
uint32_t data
Definition:
spi_internal.h:81
spi_reg_rxdata::empty
uint32_t empty
Definition:
spi_internal.h:83
spi_reg_rxdata::reserved
uint32_t reserved
Definition:
spi_internal.h:82
spi_reg_rxmark
Definition:
spi_internal.h:98
spi_reg_rxmark::rxmark
uint32_t rxmark
Definition:
spi_internal.h:100
spi_reg_rxmark::reserved
uint32_t reserved
Definition:
spi_internal.h:101
spi_reg_rxmark::raw_bits
uint32_t raw_bits
Definition:
spi_internal.h:103
spi_reg_sckmode
Definition:
spi_internal.h:15
spi_reg_sckmode::pha
uint32_t pha
Definition:
spi_internal.h:17
spi_reg_sckmode::reserved
uint32_t reserved
Definition:
spi_internal.h:19
spi_reg_sckmode::pol
uint32_t pol
Definition:
spi_internal.h:18
spi_reg_sckmode::raw_bits
uint32_t raw_bits
Definition:
spi_internal.h:21
spi_reg_txdata
Definition:
spi_internal.h:69
spi_reg_txdata::raw_bits
uint32_t raw_bits
Definition:
spi_internal.h:75
spi_reg_txdata::data
uint32_t data
Definition:
spi_internal.h:71
spi_reg_txdata::reserved
uint32_t reserved
Definition:
spi_internal.h:72
spi_reg_txdata::full
uint32_t full
Definition:
spi_internal.h:73
spi_reg_txmark
Definition:
spi_internal.h:89
spi_reg_txmark::raw_bits
uint32_t raw_bits
Definition:
spi_internal.h:94
spi_reg_txmark::reserved
uint32_t reserved
Definition:
spi_internal.h:92
spi_reg_txmark::txmark
uint32_t txmark
Definition:
spi_internal.h:91
src
soc
sifive
fu540
spi_internal.h
Generated by
1.9.1