blob: c74e88fd128e1c7da0c24a22816428c4a4ee60d2 [file] [log] [blame]
Martin Rothc7acf162020-05-28 00:44:50 -06001/* SPDX-License-Identifier: GPL-2.0-only */
2
3#include "psp_verstage.h"
4
5#include <amdblocks/acpimmio.h>
6#include <amdblocks/espi.h>
Kangheui Won32f43e02021-05-26 13:40:21 +10007#include <amdblocks/i2c.h>
Martin Rothe52edfc2020-07-08 10:54:07 -06008#include <amdblocks/spi.h>
Martin Rothc7acf162020-05-28 00:44:50 -06009#include <arch/exception.h>
10#include <arch/hlt.h>
11#include <arch/io.h>
12#include <bl_uapp/bl_errorcodes_public.h>
13#include <bl_uapp/bl_syscall_public.h>
14#include <console/console.h>
Martin Rothc7acf162020-05-28 00:44:50 -060015#include <soc/i2c.h>
16#include <soc/southbridge.h>
17#include <stdint.h>
Martin Rothc7acf162020-05-28 00:44:50 -060018
19static void i2c3_set_bar(void *bar)
20{
21 i2c_set_bar(3, (uintptr_t)bar);
22}
23
24static void i2c2_set_bar(void *bar)
25{
26 i2c_set_bar(2, (uintptr_t)bar);
27}
28
29static void espi_set_bar(void *bar)
30{
31 espi_update_static_bar((uintptr_t)bar);
32}
33
34static void iomux_set_bar(void *bar)
35{
36 acpimmio_iomux = bar;
37}
38
39static void misc_set_bar(void *bar)
40{
41 acpimmio_misc = bar;
42}
43
44static void gpio_set_bar(void *bar)
45{
46 acpimmio_gpio0 = bar;
47}
48
49static uintptr_t io_bar;
50
51static void io_set_bar(void *bar)
52{
53 io_bar = (uintptr_t)bar;
54}
55
56u8 io_read8(u16 reg)
57{
58 return read8((void *)(io_bar + reg));
59}
60
61void io_write8(u16 reg, u8 value)
62{
63 write8((void *)(io_bar + reg), value);
64}
65
Martin Roth853c6232020-07-09 15:55:15 -060066static void aoac_set_bar(void *bar)
67{
68 acpimmio_aoac = bar;
69}
70
Martin Rothc7acf162020-05-28 00:44:50 -060071static struct {
72 const char *name;
73 struct {
Jason Glenesk90f71912020-10-13 04:35:09 -070074 enum fch_io_device device;
Martin Rothc7acf162020-05-28 00:44:50 -060075 uint32_t arg0;
76 } args;
77 void (*set_bar)(void *bar);
78 void *_bar;
79} bar_map[] = {
80 {"IOMUX", {FCH_IO_DEVICE_IOMUX}, iomux_set_bar},
81 {"MISC", {FCH_IO_DEVICE_MISC}, misc_set_bar},
82 {"GPIO", {FCH_IO_DEVICE_GPIO}, gpio_set_bar},
83 {"IO", {FCH_IO_DEVICE_IOPORT}, io_set_bar},
84 {"eSPI", {FCH_IO_DEVICE_ESPI}, espi_set_bar},
85 {"I2C2", {FCH_IO_DEVICE_I2C, 2}, i2c2_set_bar},
86 {"I2C3", {FCH_IO_DEVICE_I2C, 3}, i2c3_set_bar},
Martin Rothe52edfc2020-07-08 10:54:07 -060087 {"SPI", {FCH_IO_DEVICE_SPI}, spi_set_base},
Martin Roth853c6232020-07-09 15:55:15 -060088 {"AOAC", {FCH_IO_DEVICE_AOAC}, aoac_set_bar},
Martin Rothc7acf162020-05-28 00:44:50 -060089};
90
91uintptr_t *map_spi_rom(void)
92{
93 uintptr_t *addr = NULL;
Jason Glenesk90f71912020-10-13 04:35:09 -070094 struct spirom_info spi = {0};
Martin Rothc7acf162020-05-28 00:44:50 -060095
96 if (svc_get_spi_rom_info(&spi))
97 printk(BIOS_DEBUG, "Error getting SPI ROM info.\n");
98
99 if (spi.SpiBiosSmnBase != 0)
100 if (svc_map_spi_rom(spi.SpiBiosSmnBase, CONFIG_ROM_SIZE, (void **)&addr))
101 printk(BIOS_DEBUG, "Error mapping SPI ROM to address.\n");
102
103 return addr;
104}
105
Martin Rothc7acf162020-05-28 00:44:50 -0600106static uint32_t map_fch_devices(void)
107{
108 void *bar;
109 uint32_t err;
110 unsigned int i;
111
112 for (i = 0; i < ARRAY_SIZE(bar_map); ++i) {
113 err = svc_map_fch_dev(bar_map[i].args.device, bar_map[i].args.arg0, 0, &bar);
114 if (err) {
115 printk(BIOS_ERR, "Failed to map %s: %u\n", bar_map[i].name, err);
116 return err;
117 }
118
119 bar_map[i]._bar = bar;
120 bar_map[i].set_bar(bar);
121 }
122
Martin Rothfdcbae02020-10-01 15:39:42 -0600123 return BL_OK;
Martin Rothc7acf162020-05-28 00:44:50 -0600124}
125
126uint32_t unmap_fch_devices(void)
127{
128 void *bar;
Martin Rothfdcbae02020-10-01 15:39:42 -0600129 uint32_t err, rtn = BL_OK;
Martin Rothc7acf162020-05-28 00:44:50 -0600130 unsigned int i;
131
132 for (i = 0; i < ARRAY_SIZE(bar_map); ++i) {
133 bar = bar_map[i]._bar;
134 if (!bar)
135 continue;
136
137 err = svc_unmap_fch_dev(bar_map[i].args.device, bar);
138 if (err) {
139 printk(BIOS_ERR, "Failed to unmap %s: %u\n", bar_map[i].name, err);
140 rtn = err;
141 } else {
142 bar_map[i]._bar = NULL;
143 bar_map[i].set_bar(NULL);
144 }
145 }
146
147 return rtn;
148}
149
150uint32_t verstage_soc_early_init(void)
151{
152 return map_fch_devices();
153}
154
155void verstage_soc_init(void)
156{
Raul E Rangel61ac1bc2021-04-02 10:55:27 -0600157 if (CONFIG(SOC_AMD_COMMON_BLOCK_USE_ESPI))
Martin Rothc7acf162020-05-28 00:44:50 -0600158 espi_setup();
Kangheui Won32f43e02021-05-26 13:40:21 +1000159
160 enable_aoac_devices();
161 printk(BIOS_DEBUG, "Setting up i2c\n");
162 i2c_soc_early_init();
163 printk(BIOS_DEBUG, "i2c setup\n");
Martin Rothc7acf162020-05-28 00:44:50 -0600164}