coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
sata.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <device/mmio.h>
4 #include <device/pci_ops.h>
5 #include <console/console.h>
6 #include <device/device.h>
7 #include <device/pci.h>
8 #include <device/pci_ids.h>
9 #include <delay.h>
10 #include <soc/rcba.h>
11 #include <soc/sata.h>
14 
15 static inline u32 sir_read(struct device *dev, int idx)
16 {
17  pci_write_config32(dev, SATA_SIRI, idx);
18  return pci_read_config32(dev, SATA_SIRD);
19 }
20 
21 static inline void sir_write(struct device *dev, int idx, u32 value)
22 {
23  pci_write_config32(dev, SATA_SIRI, idx);
25 }
26 
27 static void sata_init(struct device *dev)
28 {
29  const struct soc_intel_broadwell_pch_config *config = config_of(dev);
30  u32 reg32;
31  u8 *abar;
32  u16 reg16;
33  int port;
34 
35  printk(BIOS_DEBUG, "SATA: Initializing controller in AHCI mode.\n");
36 
37  /* Enable memory space decoding for ABAR */
39 
40  /* Set Interrupt Line */
41  /* Interrupt Pin is set by D31IP.PIP */
43 
44  /* Set timings */
47 
48  /* for AHCI, Port Enable is managed in memory mapped space */
49  reg16 = pci_read_config16(dev, 0x92);
50  reg16 &= ~0xf;
51  reg16 |= 0x8000 | config->sata_port_map;
52  pci_write_config16(dev, 0x92, reg16);
53  udelay(2);
54 
55  /* Setup register 98h */
56  reg32 = pci_read_config32(dev, 0x98);
57  reg32 &= ~((1 << 31) | (1 << 30));
58  reg32 |= 1 << 23;
59  reg32 |= 1 << 24; /* Enable MPHY Dynamic Power Gating */
60  pci_write_config32(dev, 0x98, reg32);
61 
62  /* Setup register 9Ch */
63  reg16 = (1 << 5); /* BWG step 12 */
64  pci_write_config16(dev, 0x9c, reg16);
65 
66  /* SATA Initialization register */
67  reg32 = 0x183;
68  reg32 |= (config->sata_port_map ^ 0xf) << 24;
69  reg32 |= (config->sata_devslp_mux & 1) << 15;
70  pci_write_config32(dev, 0x94, reg32);
71 
72  /* Initialize AHCI memory-mapped space */
73  abar = (u8 *)(pci_read_config32(dev, PCI_BASE_ADDRESS_5));
74  printk(BIOS_DEBUG, "ABAR: %p\n", abar);
75 
76  /* CAP (HBA Capabilities) : enable power management */
77  reg32 = read32(abar + 0x00);
78  reg32 |= 0x0c006000; /* set PSC+SSC+SALP+SSS */
79  reg32 &= ~0x00020060; /* clear SXS+EMS+PMS */
80  reg32 |= (1 << 18); /* SAM: SATA AHCI MODE ONLY */
81  write32(abar + 0x00, reg32);
82 
83  /* PI (Ports implemented) */
84  write32(abar + 0x0c, config->sata_port_map);
85  (void) read32(abar + 0x0c); /* Read back 1 */
86  (void) read32(abar + 0x0c); /* Read back 2 */
87 
88  /* CAP2 (HBA Capabilities Extended)*/
89  if (config->sata_devslp_disable) {
90  reg32 = read32(abar + 0x24);
91  reg32 &= ~(1 << 3);
92  write32(abar + 0x24, reg32);
93  } else {
94  /* Enable DEVSLP */
95  reg32 = read32(abar + 0x24);
96  reg32 |= (1 << 5)|(1 << 4)|(1 << 3)|(1 << 2);
97  write32(abar + 0x24, reg32);
98 
99  for (port = 0; port < 4; port++) {
100  if (!(config->sata_port_map & (1 << port)))
101  continue;
102  reg32 = read32(abar + 0x144 + (0x80 * port));
103  reg32 |= (1 << 1); /* DEVSLP DSP */
104  write32(abar + 0x144 + (0x80 * port), reg32);
105  }
106  }
107 
108  /*
109  * Static Power Gating for unused ports
110  */
111  reg32 = RCBA32(0x3a84);
112  /* Port 3 and 2 disabled */
113  if ((config->sata_port_map & ((1 << 3)|(1 << 2))) == 0)
114  reg32 |= (1 << 24) | (1 << 26);
115  /* Port 1 and 0 disabled */
116  if ((config->sata_port_map & ((1 << 1)|(1 << 0))) == 0)
117  reg32 |= (1 << 20) | (1 << 18);
118  RCBA32(0x3a84) = reg32;
119 
120  /* Set Gen3 Transmitter settings if needed */
121  if (config->sata_port0_gen3_tx)
125  (config->sata_port0_gen3_tx &
128 
129  if (config->sata_port1_gen3_tx)
133  (config->sata_port1_gen3_tx &
136 
137  if (config->sata_port2_gen3_tx)
141  (config->sata_port2_gen3_tx &
144 
145  if (config->sata_port3_gen3_tx)
149  (config->sata_port3_gen3_tx &
152 
153  /* Set Gen3 DTLE DATA / EDGE registers if needed */
154  if (config->sata_port0_gen3_dtle) {
157  (config->sata_port0_gen3_dtle & SATA_DTLE_MASK)
159 
162  (config->sata_port0_gen3_dtle & SATA_DTLE_MASK)
164  }
165 
166  if (config->sata_port1_gen3_dtle) {
169  (config->sata_port1_gen3_dtle & SATA_DTLE_MASK)
171 
174  (config->sata_port1_gen3_dtle & SATA_DTLE_MASK)
176  }
177 
178  if (config->sata_port2_gen3_dtle) {
181  (config->sata_port2_gen3_dtle & SATA_DTLE_MASK)
183 
186  (config->sata_port2_gen3_dtle & SATA_DTLE_MASK)
188  }
189  if (config->sata_port3_gen3_dtle) {
192  (config->sata_port3_gen3_dtle & SATA_DTLE_MASK)
194 
197  (config->sata_port3_gen3_dtle & SATA_DTLE_MASK)
199  }
200 
201  /*
202  * Additional Programming Requirements for Power Optimizer
203  */
204 
205  /* Step 1 */
206  sir_write(dev, 0x64, 0x883c9003);
207 
208  /* Step 2: SIR 68h[15:0] = 880Ah */
209  reg32 = sir_read(dev, 0x68);
210  reg32 &= 0xffff0000;
211  reg32 |= 0x880a;
212  sir_write(dev, 0x68, reg32);
213 
214  /* Step 3: SIR 60h[3] = 1 */
215  reg32 = sir_read(dev, 0x60);
216  reg32 |= (1 << 3);
217  sir_write(dev, 0x60, reg32);
218 
219  /* Step 4: SIR 60h[0] = 1 */
220  reg32 = sir_read(dev, 0x60);
221  reg32 |= (1 << 0);
222  sir_write(dev, 0x60, reg32);
223 
224  /* Step 5: SIR 60h[1] = 1 */
225  reg32 = sir_read(dev, 0x60);
226  reg32 |= (1 << 1);
227  sir_write(dev, 0x60, reg32);
228 
229  /* Clock Gating */
230  sir_write(dev, 0x70, 0x3f00bf1f);
231  sir_write(dev, 0x54, 0xcf000f0f);
232  sir_write(dev, 0x58, 0x00190000);
233  RCBA32_AND_OR(0x333c, 0xffcfffff, 0x00c00000);
234 
235  reg32 = pci_read_config32(dev, 0x300);
236  reg32 |= (1 << 17) | (1 << 16) | (1 << 19);
237  reg32 |= (1 << 31) | (1 << 30) | (1 << 29);
238  pci_write_config32(dev, 0x300, reg32);
239 
240  reg32 = pci_read_config32(dev, 0x98);
241  reg32 |= 1 << 29;
242  pci_write_config32(dev, 0x98, reg32);
243 
244  /* Register Lock */
245  reg32 = pci_read_config32(dev, 0x9c);
246  reg32 |= (1 << 31);
247  pci_write_config32(dev, 0x9c, reg32);
248 }
249 
250 /*
251  * Set SATA controller mode early so the resource allocator can
252  * properly assign IO/Memory resources for the controller.
253  */
254 static void sata_enable(struct device *dev)
255 {
256  /* Get the chip configuration */
257  const struct soc_intel_broadwell_pch_config *config = config_of(dev);
258  u16 map = 0x0060;
259 
260  map |= (config->sata_port_map ^ 0xf) << 8;
261 
262  pci_write_config16(dev, 0x90, map);
263 }
264 
265 static struct device_operations sata_ops = {
267  .set_resources = pci_dev_set_resources,
268  .enable_resources = pci_dev_enable_resources,
269  .init = sata_init,
270  .enable = sata_enable,
271  .ops_pci = &pci_dev_ops_pci,
272 };
273 
274 static const unsigned short pci_device_ids[] = {
275  0x9c03, 0x9c05, 0x9c07, 0x9c0f, /* LynxPoint-LP */
276  0x9c83, 0x9c85, 0x282a, 0x9c87, 0x282a, 0x9c8f, /* WildcatPoint */
277  0
278 };
279 
280 static const struct pci_driver pch_sata __pci_driver = {
281  .ops = &sata_ops,
282  .vendor = PCI_VID_INTEL,
283  .devices = pci_device_ids,
284 };
pte_t value
Definition: mmu.c:91
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
static uint32_t read32(const void *addr)
Definition: mmio.h:22
#define printk(level,...)
Definition: stdlib.h:16
port
Definition: i915.h:29
static DEVTREE_CONST void * config_of(const struct device *dev)
Definition: device.h:382
static __always_inline void pci_write_config32(const struct device *dev, u16 reg, u32 val)
Definition: pci_ops.h:76
static __always_inline void pci_or_config16(const struct device *dev, u16 reg, u16 ormask)
Definition: pci_ops.h:180
static __always_inline u16 pci_read_config16(const struct device *dev, u16 reg)
Definition: pci_ops.h:52
static __always_inline u32 pci_read_config32(const struct device *dev, u16 reg)
Definition: pci_ops.h:58
static __always_inline void pci_write_config16(const struct device *dev, u16 reg, u16 val)
Definition: pci_ops.h:70
static __always_inline void pci_write_config8(const struct device *dev, u16 reg, u8 val)
Definition: pci_ops.h:64
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
enum board_config config
Definition: memory.c:448
#define PCI_INTERRUPT_LINE
Definition: pci_def.h:94
#define PCI_COMMAND_IO
Definition: pci_def.h:11
#define PCI_COMMAND_MEMORY
Definition: pci_def.h:12
#define PCI_COMMAND
Definition: pci_def.h:10
#define PCI_BASE_ADDRESS_5
Definition: pci_def.h:68
void pci_dev_enable_resources(struct device *dev)
Definition: pci_device.c:721
void pci_dev_read_resources(struct device *dev)
Definition: pci_device.c:534
struct pci_operations pci_dev_ops_pci
Default device operation for PCI devices.
Definition: pci_device.c:911
void pci_dev_set_resources(struct device *dev)
Definition: pci_device.c:691
#define PCI_VID_INTEL
Definition: pci_ids.h:2157
#define SATA_SIRI
Definition: sata.h:6
#define SATA_SIRD
Definition: sata.h:7
#define IDE_TIM_PRI
Definition: sata.h:34
#define SATA_IOBP_SP0_SECRT88
Definition: sata.h:11
#define SATA_IOBP_SP1DTLE_EDGE
Definition: sata.h:22
#define SATA_IOBP_SP3DTLE_DATA
Definition: sata.h:25
#define SATA_DTLE_EDGE_SHIFT
Definition: sata.h:30
#define SATA_DTLE_MASK
Definition: sata.h:28
#define SATA_SECRT88_VADJ_SHIFT
Definition: sata.h:17
#define IDE_TIM_SEC
Definition: sata.h:52
#define SATA_IOBP_SP2DTLE_EDGE
Definition: sata.h:24
#define SATA_IOBP_SP3_SECRT88
Definition: sata.h:14
#define SATA_SECRT88_VADJ_MASK
Definition: sata.h:16
#define SATA_DTLE_DATA_SHIFT
Definition: sata.h:29
#define IDE_DECODE_ENABLE
Definition: sata.h:35
#define SATA_IOBP_SP1DTLE_DATA
Definition: sata.h:21
#define SATA_IOBP_SP2DTLE_DATA
Definition: sata.h:23
#define SATA_IOBP_SP0DTLE_EDGE
Definition: sata.h:20
#define SATA_IOBP_SP1_SECRT88
Definition: sata.h:12
#define SATA_IOBP_SP0DTLE_DATA
Definition: sata.h:19
#define SATA_IOBP_SP3DTLE_EDGE
Definition: sata.h:26
#define SATA_IOBP_SP2_SECRT88
Definition: sata.h:13
static void sata_enable(struct device *dev)
Definition: sata.c:254
static const struct pci_driver pch_sata __pci_driver
Definition: sata.c:280
static void sata_init(struct device *dev)
Definition: sata.c:27
static struct device_operations sata_ops
Definition: sata.c:265
static const unsigned short pci_device_ids[]
Definition: sata.c:274
static void sir_write(struct device *dev, int idx, u32 value)
Definition: sata.c:21
static u32 sir_read(struct device *dev, int idx)
Definition: sata.c:15
void pch_iobp_update(u32 address, u32 andvalue, u32 orvalue)
Definition: pch.c:86
#define RCBA32_AND_OR(x, and, or)
Definition: rcba.h:21
#define RCBA32(x)
Definition: rcba.h:14
uint32_t u32
Definition: stdint.h:51
uint16_t u16
Definition: stdint.h:48
uint8_t u8
Definition: stdint.h:45
void(* read_resources)(struct device *dev)
Definition: device.h:39
Definition: device.h:107
void udelay(uint32_t us)
Definition: udelay.c:15
typedef void(X86APIP X86EMU_intrFuncs)(int num)