blob: af7de3705794229397f0cec5f7e4f22b7249d572 [file] [log] [blame]
Aaron Durbin89e51e62020-04-09 14:16:55 -06001/* SPDX-License-Identifier: GPL-2.0-only */
Aaron Durbin89e51e62020-04-09 14:16:55 -06002
Felix Helda319ac32020-07-14 00:52:14 +02003#include <assert.h>
Felix Held604ffa62021-02-12 00:43:20 +01004#include <amdblocks/ioapic.h>
Aaron Durbin89e51e62020-04-09 14:16:55 -06005#include <device/pci.h>
Marshall Dawson39c64b02020-09-04 12:07:27 -06006#include <soc/iomap.h>
Aaron Durbin89e51e62020-04-09 14:16:55 -06007#include <soc/pci_devs.h>
8#include <soc/platform_descriptors.h>
Chris Wang68d68f12021-02-03 04:32:06 +08009#include <soc/soc_util.h>
Aaron Durbin89e51e62020-04-09 14:16:55 -060010#include <fsp/api.h>
11#include "chip.h"
12
Aaron Durbin806ea462020-04-11 10:06:37 -060013static void fsps_update_emmc_config(FSP_S_CONFIG *scfg,
14 const struct soc_amd_picasso_config *cfg)
15{
16 int val = SD_DISABLE;
17
Raul E Rangel7c79d832020-09-03 14:30:33 -060018 switch (cfg->emmc_config.timing) {
Aaron Durbin806ea462020-04-11 10:06:37 -060019 case SD_EMMC_DISABLE:
20 val = SD_DISABLE;
21 break;
22 case SD_EMMC_SD_LOW_SPEED:
23 val = SD_LOW_SPEED;
24 break;
25 case SD_EMMC_SD_HIGH_SPEED:
26 val = SD_HIGH_SPEED;
27 break;
28 case SD_EMMC_SD_UHS_I_SDR_50:
29 val = SD_UHS_I_SDR_50;
30 break;
31 case SD_EMMC_SD_UHS_I_DDR_50:
32 val = SD_UHS_I_DDR_50;
33 break;
34 case SD_EMMC_SD_UHS_I_SDR_104:
35 val = SD_UHS_I_SDR_104;
36 break;
37 case SD_EMMC_EMMC_SDR_26:
38 val = EMMC_SDR_26;
39 break;
40 case SD_EMMC_EMMC_SDR_52:
41 val = EMMC_SDR_52;
42 break;
Raul E Rangelf56b7842020-12-04 10:29:56 -070043 case SD_EMMC_EMMC_DDR_104:
44 val = EMMC_DDR_104;
Aaron Durbin806ea462020-04-11 10:06:37 -060045 break;
46 case SD_EMMC_EMMC_HS200:
47 val = EMMC_HS200;
48 break;
49 case SD_EMMC_EMMC_HS400:
50 val = EMMC_HS400;
51 break;
52 case SD_EMMC_EMMC_HS300:
53 val = EMMC_HS300;
54 break;
55 default:
56 break;
57 }
58
59 scfg->emmc0_mode = val;
Raul E Rangel96c704a2020-09-23 12:10:02 -060060 scfg->emmc0_sdr104_hs400_driver_strength =
61 cfg->emmc_config.sdr104_hs400_driver_strength;
62 scfg->emmc0_ddr50_driver_strength = cfg->emmc_config.ddr50_driver_strength;
63 scfg->emmc0_sdr50_driver_strength = cfg->emmc_config.sdr50_driver_strength;
64 scfg->emmc0_init_khz_preset = cfg->emmc_config.init_khz_preset;
Aaron Durbin806ea462020-04-11 10:06:37 -060065}
66
Felix Held86db2c72020-07-21 17:09:31 +020067static void fill_dxio_descriptors(FSP_S_CONFIG *scfg,
68 const fsp_dxio_descriptor *descs, size_t num)
Aaron Durbin89e51e62020-04-09 14:16:55 -060069{
70 size_t i;
Aaron Durbin89e51e62020-04-09 14:16:55 -060071
Felix Helda319ac32020-07-14 00:52:14 +020072 ASSERT_MSG(num <= FSPS_UPD_DXIO_DESCRIPTOR_COUNT,
73 "Too many DXIO descriptors provided.");
74
Aaron Durbin89e51e62020-04-09 14:16:55 -060075 for (i = 0; i < num; i++) {
Felix Heldf06d7d72020-07-14 00:23:11 +020076 memcpy(scfg->dxio_descriptor[i], &descs[i], sizeof(scfg->dxio_descriptor[0]));
Aaron Durbin89e51e62020-04-09 14:16:55 -060077 }
78}
79
80static void fill_ddi_descriptors(FSP_S_CONFIG *scfg,
Felix Heldca428c32020-06-10 19:05:45 +020081 const fsp_ddi_descriptor *descs, size_t num)
Aaron Durbin89e51e62020-04-09 14:16:55 -060082{
83 size_t i;
Aaron Durbin89e51e62020-04-09 14:16:55 -060084
Felix Helda319ac32020-07-14 00:52:14 +020085 ASSERT_MSG(num <= FSPS_UPD_DDI_DESCRIPTOR_COUNT,
86 "Too many DDI descriptors provided.");
87
Aaron Durbin89e51e62020-04-09 14:16:55 -060088 for (i = 0; i < num; i++) {
Felix Heldf06d7d72020-07-14 00:23:11 +020089 memcpy(&scfg->ddi_descriptor[i], &descs[i], sizeof(scfg->ddi_descriptor[0]));
Aaron Durbin89e51e62020-04-09 14:16:55 -060090 }
91}
Felix Held7f107b42020-07-23 19:23:17 +020092
Aaron Durbin89e51e62020-04-09 14:16:55 -060093static void fsp_fill_pcie_ddi_descriptors(FSP_S_CONFIG *scfg)
94{
Felix Held86db2c72020-07-21 17:09:31 +020095 const fsp_dxio_descriptor *fsp_dxio;
Felix Heldca428c32020-06-10 19:05:45 +020096 const fsp_ddi_descriptor *fsp_ddi;
Felix Held86db2c72020-07-21 17:09:31 +020097 size_t num_dxio;
Aaron Durbin89e51e62020-04-09 14:16:55 -060098 size_t num_ddi;
99
Felix Held86db2c72020-07-21 17:09:31 +0200100 mainboard_get_dxio_ddi_descriptors(&fsp_dxio, &num_dxio,
Aaron Durbin89e51e62020-04-09 14:16:55 -0600101 &fsp_ddi, &num_ddi);
Felix Held86db2c72020-07-21 17:09:31 +0200102 fill_dxio_descriptors(scfg, fsp_dxio, num_dxio);
Aaron Durbin89e51e62020-04-09 14:16:55 -0600103 fill_ddi_descriptors(scfg, fsp_ddi, num_ddi);
104}
105
Chris Wangab3947a2020-05-28 21:16:34 +0800106static void fsp_usb_oem_customization(FSP_S_CONFIG *scfg,
107 const struct soc_amd_picasso_config *cfg)
108{
Felix Heldbcb3d032020-07-24 19:10:03 +0200109 size_t i;
110
Felix Held3a7389e2020-07-23 18:22:30 +0200111 ASSERT(FSPS_UPD_USB2_PORT_COUNT == USB_PORT_COUNT);
Felix Heldbcb3d032020-07-24 19:10:03 +0200112 /* each OC mapping in xhci_oc_pin_select is 4 bit per USB port */
113 ASSERT(2 * sizeof(scfg->xhci_oc_pin_select) >= USB_PORT_COUNT);
Chris Wang04dfc262020-05-19 14:46:35 +0800114
Chris Wang3f929022020-09-14 17:03:06 +0800115 scfg->fch_usb_3_port_force_gen1 = cfg->usb3_port_force_gen1.usb3_port_force_gen1_en;
Chris Wang04dfc262020-05-19 14:46:35 +0800116
Felix Held1d0154c2020-07-23 19:37:42 +0200117 if (cfg->has_usb2_phy_tune_params) {
Felix Heldbcb3d032020-07-24 19:10:03 +0200118 for (i = 0; i < FSPS_UPD_USB2_PORT_COUNT; i++) {
Felix Held3a7389e2020-07-23 18:22:30 +0200119 memcpy(scfg->fch_usb_2_port_phy_tune[i],
120 &cfg->usb_2_port_tune_params[i],
121 sizeof(scfg->fch_usb_2_port_phy_tune[0]));
122 }
Felix Held1d0154c2020-07-23 19:37:42 +0200123 }
Felix Heldbcb3d032020-07-24 19:10:03 +0200124
125 /* lowest nibble of xhci_oc_pin_select corresponds to OC mapping of first USB port */
126 for (i = 0; i < USB_PORT_COUNT; i++) {
127 scfg->xhci_oc_pin_select &= ~(0xf << (i * 4));
128 scfg->xhci_oc_pin_select |=
129 (cfg->usb_port_overcurrent_pin[i] & 0xf) << (i * 4);
130 }
Chris Wang68d68f12021-02-03 04:32:06 +0800131
132 if ((get_silicon_type() == SILICON_RV2) && cfg->usb3_phy_override) {
133 scfg->usb_3_phy_enable = cfg->usb3_phy_override;
134 for (i = 0; i < FSPS_UPD_RV2_USB3_PORT_COUNT; i++) {
135 memcpy(scfg->usb_3_port_phy_tune[i],
136 &cfg->usb3_phy_tune_params[i],
137 sizeof(scfg->usb_3_port_phy_tune[0]));
138 }
139 scfg->usb_3_rx_vref_ctrl = cfg->usb3_rx_vref_ctrl;
140 scfg->usb_3_rx_vref_ctrl_en = cfg->usb3_rx_vref_ctrl_en;
141 scfg->usb_3_tx_vboost_lvl = cfg->usb_3_tx_vboost_lvl;
142 scfg->usb_3_tx_vboost_lvl_en = cfg->usb_3_tx_vboost_lvl_en;
143 scfg->usb_3_rx_vref_ctrl_x = cfg->usb_3_rx_vref_ctrl_x;
144 scfg->usb_3_rx_vref_ctrl_en_x = cfg->usb_3_rx_vref_ctrl_en_x;
145 scfg->usb_3_tx_vboost_lvl_x = cfg->usb_3_tx_vboost_lvl_x;
146 scfg->usb_3_tx_vboost_lvl_en_x = cfg->usb_3_tx_vboost_lvl_en_x;
147 }
Chris Wangab3947a2020-05-28 21:16:34 +0800148}
149
Marshall Dawson39c64b02020-09-04 12:07:27 -0600150static void fsp_assign_ioapic_upds(FSP_S_CONFIG *scfg)
151{
Marshall Dawson39c64b02020-09-04 12:07:27 -0600152 scfg->gnb_ioapic_base = GNB_IO_APIC_ADDR;
Felix Held604ffa62021-02-12 00:43:20 +0100153 scfg->gnb_ioapic_id = GNB_IOAPIC_ID;
154 scfg->fch_ioapic_id = FCH_IOAPIC_ID;
Marshall Dawson39c64b02020-09-04 12:07:27 -0600155}
156
Chris Wang4e66d932020-12-18 14:58:56 +0800157static void fsp_edp_tuning_upds(FSP_S_CONFIG *scfg,
158 const struct soc_amd_picasso_config *cfg)
159{
Chris Wang4c4a3602021-02-02 13:04:33 +0800160 if (cfg->edp_phy_override & ENABLE_EDP_TUNINGSET) {
161 scfg->edp_phy_override = cfg->edp_phy_override;
162 scfg->edp_physel = cfg->edp_physel;
163 scfg->edp_dp_vs_pemph_level = cfg->edp_tuningset.dp_vs_pemph_level;
164 scfg->edp_margin_deemph = cfg->edp_tuningset.margin_deemph;
165 scfg->edp_deemph_6db_4 = cfg->edp_tuningset.deemph_6db4;
166 scfg->edp_boost_adj = cfg->edp_tuningset.boostadj;
Chris Wang4e66d932020-12-18 14:58:56 +0800167 }
Chris Wang3ec3cb82020-12-23 04:29:57 +0800168 if (cfg->edp_pwr_adjust_enable) {
169 scfg->pwron_digon_to_de = cfg->pwron_digon_to_de;
170 scfg->pwron_de_to_varybl = cfg->pwron_de_to_varybl;
171 scfg->pwrdown_varybloff_to_de = cfg->pwrdown_varybloff_to_de;
172 scfg->pwrdown_de_to_digoff = cfg->pwrdown_de_to_digoff;
173 scfg->pwroff_delay = cfg->pwroff_delay;
174 scfg->pwron_varybl_to_blon = cfg->pwron_varybl_to_blon;
175 scfg->pwrdown_bloff_to_varybloff = cfg->pwrdown_bloff_to_varybloff;
176 scfg->min_allowed_bl_level = cfg->min_allowed_bl_level;
177 }
Nikolai Vyssotski2d241462021-02-11 20:08:22 -0600178}
Chris Wang3ec3cb82020-12-23 04:29:57 +0800179
Nikolai Vyssotski2d241462021-02-11 20:08:22 -0600180static void fsp_assign_vbios_upds(FSP_S_CONFIG *scfg)
181{
Nikolai Vyssotskib6069532021-03-11 19:29:20 -0600182 scfg->vbios_buffer_addr = CONFIG(RUN_FSP_GOP) ? PCI_VGA_RAM_IMAGE_START : 0;
Chris Wang4e66d932020-12-18 14:58:56 +0800183}
184
Aaron Durbin89e51e62020-04-09 14:16:55 -0600185void platform_fsp_silicon_init_params_cb(FSPS_UPD *supd)
186{
Aaron Durbin806ea462020-04-11 10:06:37 -0600187 const struct soc_amd_picasso_config *cfg;
Aaron Durbin89e51e62020-04-09 14:16:55 -0600188 FSP_S_CONFIG *scfg = &supd->FspsConfig;
189
Aaron Durbin806ea462020-04-11 10:06:37 -0600190 cfg = config_of_soc();
191 fsps_update_emmc_config(scfg, cfg);
Aaron Durbin89e51e62020-04-09 14:16:55 -0600192 fsp_fill_pcie_ddi_descriptors(scfg);
Marshall Dawson39c64b02020-09-04 12:07:27 -0600193 fsp_assign_ioapic_upds(scfg);
Chris Wangab3947a2020-05-28 21:16:34 +0800194 fsp_usb_oem_customization(scfg, cfg);
Chris Wang4e66d932020-12-18 14:58:56 +0800195 fsp_edp_tuning_upds(scfg, cfg);
Nikolai Vyssotski2d241462021-02-11 20:08:22 -0600196 fsp_assign_vbios_upds(scfg);
Aaron Durbin89e51e62020-04-09 14:16:55 -0600197}