coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
spi.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #ifndef AMD_BLOCK_SPI_H
4 #define AMD_BLOCK_SPI_H
5 
6 #include <thread.h>
7 #include <types.h>
8 
9 #define SPI_CNTRL0 0x00
10 #define SPI_BUSY BIT(31)
11 
14  /* 1 is reserved. */
21 };
22 /*
23  * SPI read mode is split into bits 18, 29, 30 such that [30:29:18] correspond to bits [2:0] for
24  * SpiReadMode.
25  */
26 #define SPI_READ_MODE_MASK (BIT(30) | BIT(29) | BIT(18))
27 #define SPI_READ_MODE_UPPER_BITS(x) ((((x) >> 1) & 0x3) << 29)
28 #define SPI_READ_MODE_LOWER_BITS(x) (((x) & 0x1) << 18)
29 #define SPI_READ_MODE(x) (SPI_READ_MODE_UPPER_BITS(x) | \
30  SPI_READ_MODE_LOWER_BITS(x))
31 #define SPI_ACCESS_MAC_ROM_EN BIT(22)
32 
33 #define SPI100_ENABLE 0x20
34 #define SPI_USE_SPI100 BIT(0)
35 
36 #define DECODE_SPI_MODE_BITS(x) ((x) & SPI_READ_MODE_MASK)
37 #define DECODE_SPI_MODE_UPPER_BITS(x) ((DECODE_SPI_MODE_BITS(x) >> 28) & 0x06)
38 #define DECODE_SPI_MODE_LOWER_BITS(x) ((DECODE_SPI_MODE_BITS(x) >> 18) & 0x01)
39 #define DECODE_SPI_READ_MODE(x) (DECODE_SPI_MODE_UPPER_BITS(x) | \
40  DECODE_SPI_MODE_LOWER_BITS(x))
41 
42 /* Use SPI_SPEED_16M-SPI_SPEED_66M below for the southbridge */
43 #define SPI100_SPEED_CONFIG 0x22
51 };
52 
53 #define SPI_SPEED_MASK 0xf
54 #define SPI_SPEED_MODE(x, shift) (((x) & SPI_SPEED_MASK) << shift)
55 #define SPI_NORM_SPEED(x) SPI_SPEED_MODE(x, 12)
56 #define SPI_FAST_SPEED(x) SPI_SPEED_MODE(x, 8)
57 #define SPI_ALT_SPEED(x) SPI_SPEED_MODE(x, 4)
58 #define SPI_TPM_SPEED(x) SPI_SPEED_MODE(x, 0)
59 
60 #define SPI_SPEED_CFG(n, f, a, t) (SPI_NORM_SPEED(n) | SPI_FAST_SPEED(f) | \
61  SPI_ALT_SPEED(a) | SPI_TPM_SPEED(t))
62 
63 #define DECODE_SPEED_MASK 0x07
64 #define DECODE_SPEED_MODE(x, shift) (((x) >> shift) & DECODE_SPEED_MASK)
65 #define DECODE_SPI_NORMAL_SPEED(x) DECODE_SPEED_MODE(x, 12)
66 #define DECODE_SPI_FAST_SPEED(x) DECODE_SPEED_MODE(x, 8)
67 #define DECODE_SPI_ALT_SPEED(x) DECODE_SPEED_MODE(x, 4)
68 #define DECODE_SPI_TPM_SPEED(x) DECODE_SPEED_MODE(x, 0)
69 
70 #define SPI100_HOST_PREF_CONFIG 0x2c
71 #define SPI_RD4DW_EN_HOST BIT(15)
72 
73 #define SPI_FIFO 0x80
74 #define SPI_FIFO_LAST_BYTE 0xc6 /* 0xc7 for Cezanne */
75 #define SPI_FIFO_DEPTH (SPI_FIFO_LAST_BYTE - SPI_FIFO + 1)
76 
77 struct spi_config {
78  /*
79  * Default values if not overridden by mainboard:
80  * Read mode - Normal 33MHz
81  * Normal speed - 66MHz
82  * Fast speed - 66MHz
83  * Alt speed - 66MHz
84  * TPM speed - 66MHz
85  */
91 };
92 
93 /*
94  * Perform early SPI initialization:
95  * 1. Sets SPI ROM base and enables SPI ROM
96  * 2. Enables SPI ROM prefetching
97  * 3. Disables 4 DWORD burst if !SOC_AMD_COMMON_BLOCK_SPI_4DW_BURST
98  * 4. Configures SPI speed and read mode.
99  *
100  * This function expects SoC to include soc_amd_common_config in chip SoC config and uses
101  * settings from mainboard devicetree to configure speed and read mode.
102  */
103 void fch_spi_early_init(void);
104 
105 /* Set the SPI base address variable */
106 void spi_set_base(void *base);
107 
108 /* Show the SPI settings */
109 void show_spi_speeds_and_modes(void);
110 
111 /* Get the SPI base address variable's value */
112 uintptr_t spi_get_bar(void);
116 void spi_write8(uint8_t reg, uint8_t val);
117 void spi_write16(uint8_t reg, uint16_t val);
118 void spi_write32(uint8_t reg, uint32_t val);
119 
120 void fch_spi_config_modes(void);
122 
123 /* Ensure you hold the mutex when performing SPI transactions */
124 extern struct thread_mutex spi_hw_mutex;
125 
126 #endif /* AMD_BLOCK_SPI_H */
uintptr_t base
Definition: uart.c:17
void mainboard_spi_fast_speed_override(uint8_t *fast_speed)
Definition: spi_speeds.c:7
void fch_spi_config_modes(void)
Definition: fch_spi.c:99
uint16_t spi_read16(uint8_t reg)
Definition: fch_spi_util.c:33
void spi_write32(uint8_t reg, uint32_t val)
Definition: fch_spi_util.c:53
void fch_spi_early_init(void)
Definition: fch_spi.c:122
void spi_set_base(void *base)
Definition: fch_spi_util.c:14
struct thread_mutex spi_hw_mutex
Definition: fch_spi_util.c:10
spi100_speed
Definition: spi.h:44
@ SPI_SPEED_22M
Definition: spi.h:47
@ SPI_SPEED_800K
Definition: spi.h:50
@ SPI_SPEED_33M
Definition: spi.h:46
@ SPI_SPEED_16M
Definition: spi.h:48
@ SPI_SPEED_66M
Definition: spi.h:45
@ SPI_SPEED_100M
Definition: spi.h:49
uint32_t spi_read32(uint8_t reg)
Definition: fch_spi_util.c:38
void spi_write8(uint8_t reg, uint8_t val)
Definition: fch_spi_util.c:43
void show_spi_speeds_and_modes(void)
Definition: fch_spi.c:35
uint8_t spi_read8(uint8_t reg)
Definition: fch_spi_util.c:28
void spi_write16(uint8_t reg, uint16_t val)
Definition: fch_spi_util.c:48
uintptr_t spi_get_bar(void)
Definition: fch_spi_util.c:19
spi_read_mode
Definition: spi.h:12
@ SPI_READ_MODE_DUAL112
Definition: spi.h:15
@ SPI_READ_MODE_DUAL122
Definition: spi.h:17
@ SPI_READ_MODE_NORMAL33M
Definition: spi.h:13
@ SPI_READ_MODE_QUAD144
Definition: spi.h:18
@ SPI_READ_MODE_NORMAL66M
Definition: spi.h:19
@ SPI_READ_MODE_FAST_READ
Definition: spi.h:20
@ SPI_READ_MODE_QUAD114
Definition: spi.h:16
unsigned short uint16_t
Definition: stdint.h:11
unsigned int uint32_t
Definition: stdint.h:14
unsigned long uintptr_t
Definition: stdint.h:21
unsigned char uint8_t
Definition: stdint.h:8
Definition: spi.h:77
enum spi100_speed tpm_speed
Definition: spi.h:90
enum spi100_speed altio_speed
Definition: spi.h:89
enum spi100_speed normal_speed
Definition: spi.h:87
enum spi_read_mode read_mode
Definition: spi.h:86
enum spi100_speed fast_speed
Definition: spi.h:88
u8 val
Definition: sys.c:300