1515#include "gpu.h"
1616#include "board_adc.h"
1717#include "board_function.h"
18+ #include "board_host_command.h"
1819#include "console.h"
1920#include "driver/temp_sensor/f75303.h"
2021#include "extpower.h"
@@ -39,6 +40,9 @@ LOG_MODULE_REGISTER(gpu, LOG_LEVEL_DBG);
3940
4041static int module_present ;
4142static int module_fault ;
43+ static int gpu_id_0 ;
44+ static int gpu_id_1 ;
45+ static int switch_status ;
4246
4347bool gpu_present (void )
4448{
@@ -84,9 +88,9 @@ DECLARE_HOOK(HOOK_INIT, update_thermal_configuration, HOOK_PRIO_DEFAULT + 2);
8488
8589void check_gpu_module (void )
8690{
87- int gpu_id_0 = get_hardware_id (ADC_GPU_BOARD_ID_0 );
88- int gpu_id_1 = get_hardware_id (ADC_GPU_BOARD_ID_1 );
89- int switch_status = 0 ;
91+ gpu_id_0 = get_hardware_id (ADC_GPU_BOARD_ID_0 );
92+ gpu_id_1 = get_hardware_id (ADC_GPU_BOARD_ID_1 );
93+ switch_status = 0 ;
9094
9195 if (board_get_version () >= BOARD_VERSION_7 ) {
9296 gpio_enable_dt_interrupt (GPIO_INT_FROM_NODELABEL (int_beam_open ));
@@ -100,15 +104,18 @@ void check_gpu_module(void)
100104 case VALID_BOARDID (BOARD_VERSION_12 , BOARD_VERSION_12 ):
101105 LOG_DBG ("Detected dual interposer device" );
102106 module_present = 1 ;
107+ module_fault = 0 ;
103108 break ;
104109 case VALID_BOARDID (BOARD_VERSION_11 , BOARD_VERSION_15 ):
105110 case VALID_BOARDID (BOARD_VERSION_13 , BOARD_VERSION_15 ):
106111 LOG_DBG ("Detected single interposer device" );
107112 module_present = 1 ;
113+ module_fault = 0 ;
108114 break ;
109115 case VALID_BOARDID (BOARD_VERSION_15 , BOARD_VERSION_15 ):
110116 LOG_DBG ("No gpu module detected %d %d" , gpu_id_0 , gpu_id_1 );
111117 module_present = 0 ;
118+ module_fault = 0 ;
112119 break ;
113120 default :
114121 LOG_DBG ("GPU module Fault" );
@@ -161,24 +168,6 @@ DECLARE_DEFERRED(gpu_interposer_toggle_deferred);
161168
162169__override void project_chassis_function (enum gpio_signal signal )
163170{
164- int open_state = gpio_pin_get_dt (GPIO_DT_FROM_NODELABEL (gpio_chassis_open_l ));
165-
166- /* The dGPU SW is SW3 at DVT phase */
167- if (board_get_version () >= BOARD_VERSION_7 )
168- return ;
169-
170- if (!open_state ) {
171- /* Make sure the module is off as fast as possible! */
172- LOG_DBG ("Powering off GPU" );
173- gpio_pin_set_dt (GPIO_DT_FROM_NODELABEL (gpio_gpu_b_gpio02_ec ), 0 );
174- gpio_pin_set_dt (GPIO_DT_FROM_NODELABEL (gpio_gpu_vsys_en ), 0 );
175- gpio_pin_set_dt (GPIO_DT_FROM_NODELABEL (gpio_gpu_3v_5v_en ), 0 );
176- gpio_pin_set_dt (GPIO_DT_FROM_NODELABEL (gpio_edp_mux_pwm_sw ), 0 );
177- module_present = 0 ;
178- update_thermal_configuration ();
179- } else {
180- hook_call_deferred (& check_gpu_module_data , 50 * MSEC );
181- }
182171}
183172
184173void beam_open_interrupt (enum gpio_signal signal )
@@ -211,6 +200,7 @@ void beam_open_interrupt(enum gpio_signal signal)
211200 }
212201 } else
213202 gpu_interposer_toggle_count = 0 ;
203+ switch_status = 0 ;
214204 } else {
215205 hook_call_deferred (& check_gpu_module_data , 50 * MSEC );
216206 }
@@ -322,3 +312,27 @@ void gpu_power_enable_handler(void)
322312 hook_call_deferred (& gpu_board_f75303_initial_data , 500 * MSEC );
323313
324314}
315+
316+ static enum ec_status host_command_expansion_bay_status (struct host_cmd_handler_args * args )
317+ {
318+ struct ec_response_expansion_bay_status * r = args -> response ;
319+
320+ r -> state = 0 ;
321+ if (module_present ) {
322+ r -> state |= MODULE_ENABLED ;
323+ }
324+ if (module_fault ) {
325+ r -> state |= MODULE_FAULT ;
326+ }
327+ if (switch_status ) {
328+ r -> state |= HATCH_SWITCH_CLOSED ;
329+ }
330+ r -> board_id_0 = gpu_id_0 ;
331+ r -> board_id_1 = gpu_id_1 ;
332+
333+ args -> response_size = sizeof (* r );
334+
335+ return EC_RES_SUCCESS ;
336+ }
337+ DECLARE_HOST_COMMAND (EC_CMD_EXPANSION_BAY_STATUS , host_command_expansion_bay_status ,
338+ EC_VER_MASK (0 ));
0 commit comments