Skip to content

Commit 61d7686

Browse files
committed
initial commit for SSD/GPU support
Signed-off-by: Kieran Levin <[email protected]>
0 parents  commit 61d7686

8 files changed

+770
-0
lines changed

Makefile

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
gpu_cfg_generator.o : gpu_cfg_generator.c gpu_cfg_generator.h
2+
../cosmopolitan/bin/cosmocc -o gpu_cfg_gen gpu_cfg_generator.c
3+
4+
5+
clean :
6+
rm gpu_cfg_gen gpu_cfg_gen.aarch64.elf gpu_cfg_gen.com.dbg

config_definition.h

+230
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
2+
/*
3+
* The Framework bay descriptor consists of a header and a series of blocks
4+
* after the header that describe the function of the card.
5+
*
6+
* Each block starts with a block header which is 4 bytes, and then block
7+
* data.
8+
*
9+
* -------------
10+
* HEADER
11+
* -------------
12+
* BLOCK1 Header
13+
* -------------
14+
* BLOCK1 Data
15+
* -------------
16+
* BLOCK2 Header
17+
* -------------
18+
* Block2 Data
19+
* -------------
20+
*/
21+
#include <stddef.h>
22+
#define GPU_MAX_BLOCK_LEN (256)
23+
#define GPU_SERIAL_LEN 20
24+
#define BUILD_ASSERT(dummy)
25+
26+
#define __packed __attribute__((packed))
27+
28+
struct gpu_cfg_descriptor {
29+
/* Expansion bay card magic value that is unique */
30+
char magic[4];
31+
/* Length of header following this field */
32+
uint32_t length;
33+
/* descriptor version, if EC max version is lower than this, ec cannot parse */
34+
uint16_t descriptor_version_major;
35+
uint16_t descriptor_version_minor;
36+
/* Hardware major version */
37+
uint16_t hardware_version;
38+
/* Hardware minor revision */
39+
uint16_t hardware_revision;
40+
/* 18 digit Framework Serial that starts with FRA
41+
* the first 10 digits must be allocated by framework
42+
*/
43+
char serial[20];
44+
/* Length of descriptor following header*/
45+
uint32_t descriptor_length;
46+
/* CRC of descriptor */
47+
uint32_t descriptor_crc32;
48+
/* CRC of header before this value */
49+
uint32_t crc32;
50+
} __packed;
51+
52+
struct gpu_config_header {
53+
union {
54+
struct gpu_cfg_descriptor header;
55+
uint8_t bytes[0x2B];
56+
};
57+
} __packed;
58+
59+
struct gpu_block_header {
60+
uint8_t block_type;
61+
uint8_t block_length;
62+
} __packed;
63+
BUILD_ASSERT(sizeof(struct gpu_block_header) == 2);
64+
65+
enum gpucfg_type {
66+
GPUCFG_TYPE_UNINITIALIZED = 0,
67+
GPUCFG_TYPE_GPIO = 1,
68+
GPUCFG_TYPE_THERMAL_SENSOR = 2,
69+
GPUCFG_TYPE_FAN = 3,
70+
GPUCFG_TYPE_POWER = 4,
71+
GPUCFG_TYPE_BATTERY = 5,
72+
GPUCFG_TYPE_PCIE = 6,
73+
GPUCFG_TYPE_DPMUX = 7,
74+
GPUCFG_TYPE_POWEREN = 8,
75+
GPUCFG_TYPE_SUBSYS = 9,
76+
GPUCFG_TYPE_VENDOR = 10,
77+
GPUCFG_TYPE_PD = 11,
78+
GPUCFG_TYPE_GPUPWR = 12,
79+
GPUCFG_TYPE_CUSTOM_TEMP = 13,
80+
GPUCFG_TYPE_MAX = 255, /**< Force enum to be 8 bits */
81+
} __packed;
82+
BUILD_ASSERT(sizeof(enum gpucfg_type) == sizeof(uint8_t));
83+
84+
enum gpu_gpio_idx {
85+
GPU_GPIO_INVALID = 0,
86+
GPU_1G1_GPIO0_EC,
87+
GPU_1H1_GPIO1_EC,
88+
GPU_2A2_GPIO2_EC,
89+
GPU_2L7_GPIO3_EC,
90+
GPU_2L5_TH_OVERTn, /* cannot be controlled directly */
91+
GPU_1F2_I2C_S5_INT,
92+
GPU_1L1_DGPU_PWROK, /* connected to APU */
93+
GPU_1C3_ALW_CLK, /* ALW I2C CLOCK PIN to EC */
94+
GPU_1D3_ALW_DAT, /* ALW I2C DATA PIN to EC */
95+
GPU_1F3_MUX1, /* cannot be controlled directly */
96+
GPU_1G3_MUX2, /* cannot be controlled directly */
97+
GPU_2B5_ALERTn,
98+
GPU_EDP_MUX_SEL, /* Select EDP MUX */
99+
GPU_ECPWM_EN, /**/
100+
GPU_PCIE_MUX_SEL, /* select between EDP AUX or SSD PCIE2 CLK*/
101+
GPU_VSYS_EN,
102+
GPU_VADP_EN,
103+
GPU_FAN_EN,
104+
GPU_3V_5V_EN,
105+
GPU_GPIO_MAX
106+
} __packed;
107+
108+
enum gpu_gpio_purpose {
109+
GPIO_FUNC_UNUSED,
110+
GPIO_FUNC_HIGH, /* set high */
111+
GPIO_FUNC_TEMPFAULT,
112+
GPIO_FUNC_ACDC,
113+
GPIO_FUNC_HPD,
114+
GPIO_FUNC_PD_INT,
115+
GPIO_FUNC_SSD1_POWER,
116+
GPIO_FUNC_SSD2_POWER,
117+
GPIO_FUNC_EC_PWM_EN,
118+
GPIO_FUNC_EDP_MUX_SEL,
119+
GPIO_FUNC_VSYS_EN,
120+
GPIO_FUNC_VADP_EN,
121+
GPIO_FUNC_GPU_PWR,
122+
GPIO_FUNC_MAX,
123+
};
124+
125+
enum power_request_source_t {
126+
POWER_REQ_INIT,
127+
POWER_REQ_POWER_ON,
128+
POWER_REQ_GPU_3V_5V,
129+
POWER_REQ_COUNT,
130+
};
131+
132+
struct gpu_cfg_gpio {
133+
uint8_t gpio;
134+
uint8_t function;
135+
uint32_t flags;
136+
/* Follow enum power_state, if the system power state is lower than this power state,
137+
* it will be turned off (low)
138+
*/
139+
uint8_t power_domain;
140+
} __packed;
141+
142+
enum gpu_thermal_sensor {
143+
GPU_THERM_INVALID,
144+
GPU_THERM_F75303,
145+
} __packed;
146+
struct gpu_cfg_thermal {
147+
uint8_t thermal_type;
148+
uint8_t address;
149+
uint32_t reserved;
150+
uint32_t reserved2;
151+
} __packed;
152+
153+
struct gpu_cfg_custom_temp {
154+
uint8_t idx;
155+
uint16_t temp_fan_off;
156+
uint16_t temp_fan_max;
157+
} __packed;
158+
159+
struct gpu_cfg_fan {
160+
uint8_t idx;
161+
uint8_t flags;
162+
uint16_t min_rpm;
163+
uint16_t min_temp;
164+
uint16_t start_rpm;
165+
uint16_t max_rpm;
166+
uint16_t max_temp;
167+
} __packed;
168+
169+
struct gpu_cfg_power {
170+
uint8_t device_idx;
171+
uint8_t battery_power;
172+
uint8_t average_power;
173+
uint8_t long_term_power;
174+
uint8_t short_term_power;
175+
uint8_t peak_power;
176+
} __packed;
177+
178+
struct gpu_cfg_battery {
179+
uint16_t max_current;
180+
uint16_t max_mv;
181+
uint16_t min_mv;
182+
uint16_t max_charge_current;
183+
} __packed;
184+
185+
186+
enum gpu_subsys_type {
187+
GPU_ASSEMBLY = 0, /* Populated in header, not valid for extended structure */
188+
GPU_PCB = 1,
189+
GPU_LEFT_FAN = 2,
190+
GPU_RIGHT_FAN = 3,
191+
GPU_HOUSING = 4,
192+
GPU_SUBSYS_MAX = 10,
193+
};
194+
struct gpu_subsys_serial {
195+
uint8_t gpu_subsys;
196+
char serial[GPU_SERIAL_LEN];
197+
} __packed;
198+
199+
enum gpu_pcie_cfg {
200+
PCIE_8X1 = 0,
201+
PCIE_4X1 = 1,
202+
PCIE_4X2 = 2,
203+
} __packed;
204+
BUILD_ASSERT(sizeof(enum gpu_pcie_cfg) == sizeof(uint8_t));
205+
206+
207+
enum gpu_vendor {
208+
GPU_VENDOR_INITIALIZING = 0,
209+
GPU_FAN_ONLY = 1,
210+
GPU_AMD_R23M = 2,
211+
GPU_SSD = 3,
212+
GPU_PCIE_ACCESSORY = 4
213+
} __packed;
214+
BUILD_ASSERT(sizeof(enum gpu_vendor) == sizeof(uint8_t));
215+
216+
enum gpu_pd {
217+
PD_TYPE_INVALID = 0,
218+
PD_TYPE_ETRON_EJ889I = 1,
219+
PD_TYPE_MAX = 0xFF
220+
} __packed;
221+
struct gpu_subsys_pd {
222+
uint8_t gpu_pd_type;
223+
uint8_t address;
224+
uint32_t flags;
225+
uint32_t pdo;
226+
uint32_t rdo;
227+
uint8_t power_domain;
228+
uint8_t gpio_hpd;
229+
uint8_t gpio_interrupt;
230+
} __packed;

crc.h

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/**
2+
* The type of the CRC values.
3+
*
4+
* This type must be big enough to contain at least 32 bits.
5+
*/
6+
typedef uint32_t crc_t;
7+
8+
/**
9+
* Calculate the initial crc value.
10+
*
11+
* \return The initial crc value.
12+
*/
13+
static inline crc_t crc_init(void)
14+
{
15+
return 0xffffffff;
16+
}
17+
18+
/**
19+
* Static table used for the table_driven implementation.
20+
*/
21+
static const crc_t crc_table[256] = {
22+
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
23+
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
24+
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
25+
0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
26+
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
27+
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
28+
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
29+
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
30+
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
31+
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
32+
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
33+
0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
34+
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
35+
0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
36+
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
37+
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
38+
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
39+
0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
40+
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
41+
0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
42+
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
43+
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
44+
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
45+
0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
46+
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
47+
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
48+
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
49+
0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
50+
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
51+
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
52+
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
53+
0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
54+
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
55+
0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
56+
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
57+
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
58+
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
59+
0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
60+
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
61+
0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
62+
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
63+
0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
64+
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
65+
};
66+
67+
crc_t crc_update(crc_t crc, const void *data, size_t data_len)
68+
{
69+
const unsigned char *d = (const unsigned char *)data;
70+
unsigned int tbl_idx;
71+
72+
while (data_len--) {
73+
tbl_idx = (crc ^ *d) & 0xff;
74+
crc = (crc_table[tbl_idx] ^ (crc >> 8)) & 0xffffffff;
75+
d++;
76+
}
77+
return crc & 0xffffffff;
78+
}
79+
80+
/**
81+
* Calculate the final crc value.
82+
*
83+
* \param[in] crc The current crc value.
84+
* \return The final crc value.
85+
*/
86+
static inline crc_t crc_finalize(crc_t crc)
87+
{
88+
return crc ^ 0xffffffff;
89+
}

eeprom.bin

194 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)