1 /* 2 * Copyright (c) 2018-present Facebook. All Rights Reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <ipmid/api.h> 18 #include <stdbool.h> 19 #include <stdio.h> 20 #include <sys/stat.h> 21 22 #include <appcommands.hpp> 23 #include <ipmid/api.hpp> 24 #include <nlohmann/json.hpp> 25 #include <phosphor-logging/log.hpp> 26 #include <sdbusplus/asio/connection.hpp> 27 #include <sdbusplus/asio/property.hpp> 28 #include <ipmid/utils.hpp> 29 30 #include <fstream> 31 #include <iomanip> 32 #include <iostream> 33 #include <sstream> 34 35 namespace ipmi 36 { 37 38 #define JSON_POST_DATA_FILE "/usr/share/lcd-debug/post_desc.json" 39 #define JSON_GPIO_DATA_FILE "/usr/share/lcd-debug/gpio_desc.json" 40 #define JSON_SENSOR_NAMES_FILE "/usr/share/lcd-debug/cri_sensors.json" 41 42 #define ETH_INTF_NAME "eth0" 43 44 #define ESCAPE "\x1B" 45 #define ESC_BAT ESCAPE "B" 46 #define ESC_MCU_BL_VER ESCAPE "U" 47 #define ESC_MCU_RUN_VER ESCAPE "R" 48 #define ESC_ALT ESCAPE "[5;7m" 49 #define ESC_RST ESCAPE "[m" 50 51 #define LINE_DELIMITER '\x1F' 52 53 #define FRAME_BUFF_SIZE 4096 54 #define FRAME_PAGE_BUF_SIZE 256 55 #define FRU_ALL 0 56 #define MAX_VALUE_LEN 64 57 58 #define DEBUG_GPIO_KEY "GpioDesc" 59 #define GPIO_ARRAY_SIZE 4 60 #define GPIO_PIN_INDEX 0 61 #define GPIO_LEVEL_INDEX 1 62 #define GPIO_DEF_INDEX 2 63 #define GPIO_DESC_INDEX 3 64 #define BMC_POSITION 0 65 #define MAX_HOST_POS 4 66 67 /* Used for systems which do not specifically have a 68 * phase, and we want to ignore the phase provided by the 69 * debug card */ 70 #define PHASE_ANY 0xff 71 72 static constexpr bool DEBUG = false; 73 static const uint8_t meAddress = 1; 74 static constexpr uint8_t lun = 0; 75 76 using IpmbMethodType = 77 std::tuple<int, uint8_t, uint8_t, uint8_t, uint8_t, std::vector<uint8_t>>; 78 79 typedef struct _sensor_desc 80 { 81 char name[16]; 82 uint8_t sensor_num; 83 char unit[5]; 84 uint8_t fru; 85 uint8_t disp_prec; 86 } sensor_desc_t; 87 88 struct frame 89 { 90 char title[32]; 91 size_t max_size; 92 size_t max_page; 93 char* buf; 94 uint16_t idx_head, idx_tail; 95 uint8_t line_per_page; 96 uint8_t line_width; 97 uint16_t lines, pages; 98 uint8_t esc_sts; 99 uint8_t overwrite; 100 time_t mtime; 101 frame() : buf(NULL), pages(0), mtime(0) 102 {} 103 int init(size_t size); 104 int append(const char* string, int indent); 105 int insert(const char* string, int indent); 106 int getPage(int page, char* page_buf, size_t page_buf_size); 107 int isFull(); 108 int isEscSeq(char chr); 109 int parse(char* buf, size_t buf_size, const char* input, int indent); 110 }; 111 112 struct frame frame_info; 113 struct frame frame_sel; 114 struct frame frame_snr; 115 116 enum ENUM_PANEL 117 { 118 PANEL_MAIN = 1, 119 PANEL_BOOT_ORDER = 2, 120 PANEL_POWER_POLICY = 3, 121 }; 122 123 struct ctrl_panel 124 { 125 uint8_t parent; 126 uint8_t item_num; 127 char item_str[8][32]; 128 uint8_t (*select)(uint8_t item); 129 }; 130 131 static uint8_t panel_main(uint8_t item); 132 static uint8_t panel_boot_order(uint8_t item); 133 static uint8_t panel_power_policy(uint8_t item); 134 135 static struct ctrl_panel panels[] = { 136 {/* dummy entry for making other to 1-based */}, 137 { 138 .parent = PANEL_MAIN, 139 .item_num = 2, 140 .item_str = 141 { 142 "User Setting", 143 ">Boot Order", 144 ">Power Policy", 145 }, 146 .select = panel_main, 147 }, 148 { 149 .parent = PANEL_MAIN, 150 .item_num = 0, 151 .item_str = 152 { 153 "Boot Order", 154 }, 155 .select = panel_boot_order, 156 }, 157 { 158 .parent = PANEL_MAIN, 159 .item_num = 0, 160 .item_str = 161 { 162 "Power Policy", 163 }, 164 .select = panel_power_policy, 165 }, 166 }; 167 168 } // end of namespace ipmi 169