blob: 3260021d0885876836231b2c37a56f9f53688e8e [file] [log] [blame]
Angel Pons182dbde2020-04-02 23:49:05 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Stefan Reinauer8e073822012-04-04 00:07:22 +02002
Kyösti Mälkkide640782019-12-03 07:30:26 +02003#include <arch/bootblock.h>
Kyösti Mälkkif1b58b72019-03-01 13:43:02 +02004#include <device/pci_ops.h>
Angel Ponsc9ee2c02020-06-21 17:58:59 +02005#include <southbridge/intel/common/early_spi.h>
Stefan Reinauer8e073822012-04-04 00:07:22 +02006#include "pch.h"
7
Keith Hui885e8cb2023-11-27 00:15:59 -05008static void setup_port80(void)
Stefan Reinauer8e073822012-04-04 00:07:22 +02009{
Keith Hui885e8cb2023-11-27 00:15:59 -050010 /* Enable port 80 POST */
11 if (CONFIG(POST_DEVICE_PCI_PCIE))
12 RCBA32(GCS) |= 0x04; /* ... on PCI(e) */
13 else
14 RCBA32(GCS) &= (~0x04); /* ... on LPC */
Stefan Reinauer8e073822012-04-04 00:07:22 +020015}
16
Duncan Laurie2a700ec2012-10-08 15:26:54 -070017static void set_spi_speed(void)
18{
19 u32 fdod;
20 u8 ssfc;
21
22 /* Observe SPI Descriptor Component Section 0 */
23 RCBA32(0x38b0) = 0x1000;
24
25 /* Extract the Write/Erase SPI Frequency from descriptor */
26 fdod = RCBA32(0x38b4);
27 fdod >>= 24;
28 fdod &= 7;
29
30 /* Set Software Sequence frequency to match */
31 ssfc = RCBA8(0x3893);
32 ssfc &= ~7;
33 ssfc |= fdod;
34 RCBA8(0x3893) = ssfc;
35}
36
Arthur Heymans360d9472019-11-12 18:11:03 +010037void bootblock_early_southbridge_init(void)
Stefan Reinauer8e073822012-04-04 00:07:22 +020038{
Angel Ponsc9ee2c02020-06-21 17:58:59 +020039 enable_spi_prefetching_and_caching();
Arthur Heymans360d9472019-11-12 18:11:03 +010040
41 early_pch_init();
42
Keith Hui885e8cb2023-11-27 00:15:59 -050043 setup_port80();
Duncan Laurie2a700ec2012-10-08 15:26:54 -070044 set_spi_speed();
Duncan Laurie8e515d32012-06-23 15:43:41 -070045
46 /* Enable upper 128bytes of CMOS */
47 RCBA32(RC) = (1 << 2);
Stefan Reinauer8e073822012-04-04 00:07:22 +020048}