aboutsummaryrefslogtreecommitdiff
path: root/src/mainboard/scaleway/tagada/hsio.c
blob: 78599230d736548264cd1910161f0c7536ce5181 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/* SPDX-License-Identifier: GPL-2.0-only */

#include <arch/mmio.h>
#include <console/console.h>
#include <hsio.h>
#include <gpio_defs.h>
#include <soc/fiamux.h>

#ifdef __RAMSTAGE__
static void update_hsio_info_for_m2_slots(size_t num_of_entry, BL_HSIO_INFORMATION *config)
{
	uint32_t reg32;
	bool m2a_pcie, m2b_pcie;
	uint8_t entry;

	/* Detects modules type */
	// _GPIO_4 : LFFF: M2A_CFGn : M2A_SATAn : 0 SATA, 1 PCIe
	reg32 = read32((void *)PCH_PCR_ADDRESS(PID_GPIO_4, R_PAD_CFG_DW0_GPIO_4));
	m2a_pcie = (reg32 & B_PCH_GPIO_RX_STATE) ? 1 : 0;
	// _GPIO_5 : LFFF: M2A_CFGn : M2A_SATAn : 0 SATA, 1 PCIe
	reg32 = read32((void *)PCH_PCR_ADDRESS(PID_GPIO_5, R_PAD_CFG_DW0_GPIO_5));
	m2b_pcie = (reg32 & B_PCH_GPIO_RX_STATE) ? 1 : 0;

	printk(BIOS_DEBUG,
	       "GPIO values from M2 slots A:%d B:%d "
	       "(0=SATA, 1=PCIe or not populated)\n",
	       m2a_pcie, m2b_pcie);

	// HSIO default config is for PCIe, only update for SATA
	// (also secondary PCIe lines are already set depending on SKU)
	for (entry = 0; entry < num_of_entry; entry++) {
		BL_ME_FIA_MUX_CONFIG *mux_config = &(config[entry].FiaConfig.MuxConfiguration);
		BL_ME_FIA_SATA_CONFIG *sata_config =
			&(config[entry].FiaConfig.SataLaneConfiguration);
		if (!m2a_pcie) {
			// change Lane 14 config
			mux_config->BL_MeFiaMuxLaneMuxSel.Lane14MuxSel =
				BL_ME_FIA_MUX_LANE_SATA;
			sata_config->BL_MeFiaSataLaneSataSel.Lane14SataSel =
				BL_ME_FIA_SATA_CONTROLLER_LANE_ASSIGNED;
		}
		if (!m2b_pcie) {
			// change Lane 12 config
			mux_config->BL_MeFiaMuxLaneMuxSel.Lane12MuxSel =
				BL_ME_FIA_MUX_LANE_SATA;
			sata_config->BL_MeFiaSataLaneSataSel.Lane12SataSel =
				BL_ME_FIA_SATA_CONTROLLER_LANE_ASSIGNED;
		}
	}
}
#endif

size_t mainboard_get_hsio_config(BL_HSIO_INFORMATION **p_hsio_config)
{
	size_t num;
	num = ARRAY_SIZE(tagada_hsio_config);
#ifdef __RAMSTAGE__
	update_hsio_info_for_m2_slots(num, tagada_hsio_config);
#endif
	(*p_hsio_config) = (BL_HSIO_INFORMATION *)tagada_hsio_config;
	return num;
}