blob: 57e51d5c02cb90b3673bd152ab3d23ff866aff15 [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"
Nikolai Vyssotskib6069532021-03-11 19:29:20 -060012#include <device/pci.h>
Aaron Durbin89e51e62020-04-09 14:16:55 -060013
Aaron Durbin806ea462020-04-11 10:06:37 -060014static void fsps_update_emmc_config(FSP_S_CONFIG *scfg,
15 const struct soc_amd_picasso_config *cfg)
16{
17 int val = SD_DISABLE;
18
Raul E Rangel7c79d832020-09-03 14:30:33 -060019 switch (cfg->emmc_config.timing) {
Aaron Durbin806ea462020-04-11 10:06:37 -060020 case SD_EMMC_DISABLE:
21 val = SD_DISABLE;
22 break;
23 case SD_EMMC_SD_LOW_SPEED:
24 val = SD_LOW_SPEED;
25 break;
26 case SD_EMMC_SD_HIGH_SPEED:
27 val = SD_HIGH_SPEED;
28 break;
29 case SD_EMMC_SD_UHS_I_SDR_50:
30 val = SD_UHS_I_SDR_50;
31 break;
32 case SD_EMMC_SD_UHS_I_DDR_50:
33 val = SD_UHS_I_DDR_50;
34 break;
35 case SD_EMMC_SD_UHS_I_SDR_104:
36 val = SD_UHS_I_SDR_104;
37 break;
38 case SD_EMMC_EMMC_SDR_26:
39 val = EMMC_SDR_26;
40 break;
41 case SD_EMMC_EMMC_SDR_52:
42 val = EMMC_SDR_52;
43 break;
Raul E Rangelf56b7842020-12-04 10:29:56 -070044 case SD_EMMC_EMMC_DDR_104:
45 val = EMMC_DDR_104;
Aaron Durbin806ea462020-04-11 10:06:37 -060046 break;
47 case SD_EMMC_EMMC_HS200:
48 val = EMMC_HS200;
49 break;
50 case SD_EMMC_EMMC_HS400:
51 val = EMMC_HS400;
52 break;
53 case SD_EMMC_EMMC_HS300:
54 val = EMMC_HS300;
55 break;
56 default:
57 break;
58 }
59
60 scfg->emmc0_mode = val;
Raul E Rangel96c704a2020-09-23 12:10:02 -060061 scfg->emmc0_sdr104_hs400_driver_strength =
62 cfg->emmc_config.sdr104_hs400_driver_strength;
63 scfg->emmc0_ddr50_driver_strength = cfg->emmc_config.ddr50_driver_strength;
64 scfg->emmc0_sdr50_driver_strength = cfg->emmc_config.sdr50_driver_strength;
65 scfg->emmc0_init_khz_preset = cfg->emmc_config.init_khz_preset;
Aaron Durbin806ea462020-04-11 10:06:37 -060066}
67
Felix Held86db2c72020-07-21 17:09:31 +020068static void fill_dxio_descriptors(FSP_S_CONFIG *scfg,
69 const fsp_dxio_descriptor *descs, size_t num)
Aaron Durbin89e51e62020-04-09 14:16:55 -060070{
71 size_t i;
Aaron Durbin89e51e62020-04-09 14:16:55 -060072
Felix Helda319ac32020-07-14 00:52:14 +020073 ASSERT_MSG(num <= FSPS_UPD_DXIO_DESCRIPTOR_COUNT,
74 "Too many DXIO descriptors provided.");
75
Aaron Durbin89e51e62020-04-09 14:16:55 -060076 for (i = 0; i < num; i++) {
Felix Heldf06d7d72020-07-14 00:23:11 +020077 memcpy(scfg->dxio_descriptor[i], &descs[i], sizeof(scfg->dxio_descriptor[0]));
Aaron Durbin89e51e62020-04-09 14:16:55 -060078 }
79}
80
81static void fill_ddi_descriptors(FSP_S_CONFIG *scfg,
Felix Heldca428c32020-06-10 19:05:45 +020082 const fsp_ddi_descriptor *descs, size_t num)
Aaron Durbin89e51e62020-04-09 14:16:55 -060083{
84 size_t i;
Aaron Durbin89e51e62020-04-09 14:16:55 -060085
Felix Helda319ac32020-07-14 00:52:14 +020086 ASSERT_MSG(num <= FSPS_UPD_DDI_DESCRIPTOR_COUNT,
87 "Too many DDI descriptors provided.");
88
Aaron Durbin89e51e62020-04-09 14:16:55 -060089 for (i = 0; i < num; i++) {
Felix Heldf06d7d72020-07-14 00:23:11 +020090 memcpy(&scfg->ddi_descriptor[i], &descs[i], sizeof(scfg->ddi_descriptor[0]));
Aaron Durbin89e51e62020-04-09 14:16:55 -060091 }
92}
Felix Held7f107b42020-07-23 19:23:17 +020093
Aaron Durbin89e51e62020-04-09 14:16:55 -060094static void fsp_fill_pcie_ddi_descriptors(FSP_S_CONFIG *scfg)
95{
Felix Held86db2c72020-07-21 17:09:31 +020096 const fsp_dxio_descriptor *fsp_dxio;
Felix Heldca428c32020-06-10 19:05:45 +020097 const fsp_ddi_descriptor *fsp_ddi;
Felix Held86db2c72020-07-21 17:09:31 +020098 size_t num_dxio;
Aaron Durbin89e51e62020-04-09 14:16:55 -060099 size_t num_ddi;
100
Felix Held86db2c72020-07-21 17:09:31 +0200101 mainboard_get_dxio_ddi_descriptors(&fsp_dxio, &num_dxio,
Aaron Durbin89e51e62020-04-09 14:16:55 -0600102 &fsp_ddi, &num_ddi);
Felix Held86db2c72020-07-21 17:09:31 +0200103 fill_dxio_descriptors(scfg, fsp_dxio, num_dxio);
Aaron Durbin89e51e62020-04-09 14:16:55 -0600104 fill_ddi_descriptors(scfg, fsp_ddi, num_ddi);
105}
106
Chris Wangab3947a2020-05-28 21:16:34 +0800107static void fsp_usb_oem_customization(FSP_S_CONFIG *scfg,
108 const struct soc_amd_picasso_config *cfg)
109{
Felix Heldbcb3d032020-07-24 19:10:03 +0200110 size_t i;
111
Felix Held3a7389e2020-07-23 18:22:30 +0200112 ASSERT(FSPS_UPD_USB2_PORT_COUNT == USB_PORT_COUNT);
Felix Heldbcb3d032020-07-24 19:10:03 +0200113 /* each OC mapping in xhci_oc_pin_select is 4 bit per USB port */
114 ASSERT(2 * sizeof(scfg->xhci_oc_pin_select) >= USB_PORT_COUNT);
Chris Wang04dfc262020-05-19 14:46:35 +0800115
Chris Wang3f929022020-09-14 17:03:06 +0800116 scfg->fch_usb_3_port_force_gen1 = cfg->usb3_port_force_gen1.usb3_port_force_gen1_en;
Chris Wang04dfc262020-05-19 14:46:35 +0800117
Felix Held1d0154c2020-07-23 19:37:42 +0200118 if (cfg->has_usb2_phy_tune_params) {
Felix Heldbcb3d032020-07-24 19:10:03 +0200119 for (i = 0; i < FSPS_UPD_USB2_PORT_COUNT; i++) {
Felix Held3a7389e2020-07-23 18:22:30 +0200120 memcpy(scfg->fch_usb_2_port_phy_tune[i],
121 &cfg->usb_2_port_tune_params[i],
122 sizeof(scfg->fch_usb_2_port_phy_tune[0]));
123 }
Felix Held1d0154c2020-07-23 19:37:42 +0200124 }
Felix Heldbcb3d032020-07-24 19:10:03 +0200125
126 /* lowest nibble of xhci_oc_pin_select corresponds to OC mapping of first USB port */
127 for (i = 0; i < USB_PORT_COUNT; i++) {
128 scfg->xhci_oc_pin_select &= ~(0xf << (i * 4));
129 scfg->xhci_oc_pin_select |=
130 (cfg->usb_port_overcurrent_pin[i] & 0xf) << (i * 4);
131 }
Chris Wang68d68f12021-02-03 04:32:06 +0800132
133 if ((get_silicon_type() == SILICON_RV2) && cfg->usb3_phy_override) {
134 scfg->usb_3_phy_enable = cfg->usb3_phy_override;
135 for (i = 0; i < FSPS_UPD_RV2_USB3_PORT_COUNT; i++) {
136 memcpy(scfg->usb_3_port_phy_tune[i],
137 &cfg->usb3_phy_tune_params[i],
138 sizeof(scfg->usb_3_port_phy_tune[0]));
139 }
140 scfg->usb_3_rx_vref_ctrl = cfg->usb3_rx_vref_ctrl;
141 scfg->usb_3_rx_vref_ctrl_en = cfg->usb3_rx_vref_ctrl_en;
142 scfg->usb_3_tx_vboost_lvl = cfg->usb_3_tx_vboost_lvl;
143 scfg->usb_3_tx_vboost_lvl_en = cfg->usb_3_tx_vboost_lvl_en;
144 scfg->usb_3_rx_vref_ctrl_x = cfg->usb_3_rx_vref_ctrl_x;
145 scfg->usb_3_rx_vref_ctrl_en_x = cfg->usb_3_rx_vref_ctrl_en_x;
146 scfg->usb_3_tx_vboost_lvl_x = cfg->usb_3_tx_vboost_lvl_x;
147 scfg->usb_3_tx_vboost_lvl_en_x = cfg->usb_3_tx_vboost_lvl_en_x;
148 }
Chris Wangab3947a2020-05-28 21:16:34 +0800149}
150
Marshall Dawson39c64b02020-09-04 12:07:27 -0600151static void fsp_assign_ioapic_upds(FSP_S_CONFIG *scfg)
152{
Marshall Dawson39c64b02020-09-04 12:07:27 -0600153 scfg->gnb_ioapic_base = GNB_IO_APIC_ADDR;
Felix Held604ffa62021-02-12 00:43:20 +0100154 scfg->gnb_ioapic_id = GNB_IOAPIC_ID;
155 scfg->fch_ioapic_id = FCH_IOAPIC_ID;
Marshall Dawson39c64b02020-09-04 12:07:27 -0600156}
157
Chris Wang4e66d932020-12-18 14:58:56 +0800158static void fsp_edp_tuning_upds(FSP_S_CONFIG *scfg,
159 const struct soc_amd_picasso_config *cfg)
160{
Chris Wang4c4a3602021-02-02 13:04:33 +0800161 if (cfg->edp_phy_override & ENABLE_EDP_TUNINGSET) {
162 scfg->edp_phy_override = cfg->edp_phy_override;
163 scfg->edp_physel = cfg->edp_physel;
164 scfg->edp_dp_vs_pemph_level = cfg->edp_tuningset.dp_vs_pemph_level;
165 scfg->edp_margin_deemph = cfg->edp_tuningset.margin_deemph;
166 scfg->edp_deemph_6db_4 = cfg->edp_tuningset.deemph_6db4;
167 scfg->edp_boost_adj = cfg->edp_tuningset.boostadj;
Chris Wang4e66d932020-12-18 14:58:56 +0800168 }
Chris Wang3ec3cb82020-12-23 04:29:57 +0800169 if (cfg->edp_pwr_adjust_enable) {
170 scfg->pwron_digon_to_de = cfg->pwron_digon_to_de;
171 scfg->pwron_de_to_varybl = cfg->pwron_de_to_varybl;
172 scfg->pwrdown_varybloff_to_de = cfg->pwrdown_varybloff_to_de;
173 scfg->pwrdown_de_to_digoff = cfg->pwrdown_de_to_digoff;
174 scfg->pwroff_delay = cfg->pwroff_delay;
175 scfg->pwron_varybl_to_blon = cfg->pwron_varybl_to_blon;
176 scfg->pwrdown_bloff_to_varybloff = cfg->pwrdown_bloff_to_varybloff;
177 scfg->min_allowed_bl_level = cfg->min_allowed_bl_level;
178 }
Nikolai Vyssotski2d241462021-02-11 20:08:22 -0600179}
Chris Wang3ec3cb82020-12-23 04:29:57 +0800180
Nikolai Vyssotski2d241462021-02-11 20:08:22 -0600181static void fsp_assign_vbios_upds(FSP_S_CONFIG *scfg)
182{
Nikolai Vyssotskib6069532021-03-11 19:29:20 -0600183 scfg->vbios_buffer_addr = CONFIG(RUN_FSP_GOP) ? PCI_VGA_RAM_IMAGE_START : 0;
Chris Wang4e66d932020-12-18 14:58:56 +0800184}
185
Aaron Durbin89e51e62020-04-09 14:16:55 -0600186void platform_fsp_silicon_init_params_cb(FSPS_UPD *supd)
187{
Aaron Durbin806ea462020-04-11 10:06:37 -0600188 const struct soc_amd_picasso_config *cfg;
Aaron Durbin89e51e62020-04-09 14:16:55 -0600189 FSP_S_CONFIG *scfg = &supd->FspsConfig;
190
Aaron Durbin806ea462020-04-11 10:06:37 -0600191 cfg = config_of_soc();
192 fsps_update_emmc_config(scfg, cfg);
Aaron Durbin89e51e62020-04-09 14:16:55 -0600193 fsp_fill_pcie_ddi_descriptors(scfg);
Marshall Dawson39c64b02020-09-04 12:07:27 -0600194 fsp_assign_ioapic_upds(scfg);
Chris Wangab3947a2020-05-28 21:16:34 +0800195 fsp_usb_oem_customization(scfg, cfg);
Chris Wang4e66d932020-12-18 14:58:56 +0800196 fsp_edp_tuning_upds(scfg, cfg);
Nikolai Vyssotski2d241462021-02-11 20:08:22 -0600197 fsp_assign_vbios_upds(scfg);
Aaron Durbin89e51e62020-04-09 14:16:55 -0600198}