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 <ipmid/utils.hpp> 25 #include <nlohmann/json.hpp> 26 #include <phosphor-logging/lg2.hpp> 27 #include <phosphor-logging/log.hpp> 28 #include <sdbusplus/asio/connection.hpp> 29 #include <sdbusplus/asio/property.hpp> 30 31 #include <fstream> 32 #include <iomanip> 33 #include <iostream> 34 #include <sstream> 35 36 namespace ipmi 37 { 38 39 #define JSON_POST_DATA_FILE "/usr/share/lcd-debug/post_desc.json" 40 #define JSON_GPIO_DATA_FILE "/usr/share/lcd-debug/gpio_desc.json" 41 #define JSON_SENSOR_NAMES_FILE "/usr/share/lcd-debug/cri_sensors.json" 42 43 #define ETH_INTF_NAME "eth0" 44 45 #define ESCAPE "\x1B" 46 #define ESC_BAT ESCAPE "B" 47 #define ESC_MCU_BL_VER ESCAPE "U" 48 #define ESC_MCU_RUN_VER ESCAPE "R" 49 #define ESC_ALT ESCAPE "[5;7m" 50 #define ESC_RST ESCAPE "[m" 51 52 #define LINE_DELIMITER '\x1F' 53 54 #define FRAME_BUFF_SIZE 4096 55 #define FRAME_PAGE_BUF_SIZE 256 56 #define FRU_ALL 0 57 #define MAX_VALUE_LEN 64 58 59 #define DEBUG_GPIO_KEY "GpioDesc" 60 #define GPIO_ARRAY_SIZE 4 61 #define GPIO_PIN_INDEX 0 62 #define GPIO_LEVEL_INDEX 1 63 #define GPIO_DEF_INDEX 2 64 #define GPIO_DESC_INDEX 3 65 #define BMC_POSITION 0 66 #define MAX_HOST_POS 4 67 68 /* Used for systems which do not specifically have a 69 * phase, and we want to ignore the phase provided by the 70 * debug card */ 71 #define PHASE_ANY 0xff 72 73 static constexpr bool DEBUG = false; 74 static const uint8_t meAddress = 1; 75 static constexpr uint8_t lun = 0; 76 77 using IpmbMethodType = 78 std::tuple<int, uint8_t, uint8_t, uint8_t, uint8_t, std::vector<uint8_t>>; 79 80 typedef struct _sensor_desc 81 { 82 char name[16]; 83 uint8_t sensor_num; 84 char unit[5]; 85 uint8_t fru; 86 uint8_t disp_prec; 87 } sensor_desc_t; 88 89 struct frame 90 { 91 char title[32]; 92 size_t max_size; 93 size_t max_page; 94 char* buf; 95 uint16_t idx_head, idx_tail; 96 uint8_t line_per_page; 97 uint8_t line_width; 98 uint16_t lines, pages; 99 uint8_t esc_sts; 100 uint8_t overwrite; 101 time_t mtime; 102 frame() : buf(NULL), pages(0), mtime(0) {} 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 struct frame frame_postcode; 116 117 enum class panel : uint8_t 118 { 119 NONE = 0, 120 MAIN = 1, 121 BOOT_ORDER = 2, 122 POWER_POLICY = 3, 123 }; 124 125 struct ctrl_panel 126 { 127 panel parent; 128 size_t item_num; 129 std::array<std::string, 8> item_str; 130 panel (*select)(size_t item); 131 }; 132 133 static panel panel_main(size_t item); 134 static panel panel_boot_order(size_t item); 135 static panel panel_power_policy(size_t item); 136 137 static ctrl_panel panels[] = { 138 {/* dummy entry for making other to 1-based */}, 139 { 140 .parent = panel::MAIN, 141 .item_num = 2, 142 .item_str = 143 { 144 "User Setting", 145 ">Boot Order", 146 ">Power Policy", 147 }, 148 .select = panel_main, 149 }, 150 { 151 .parent = panel::MAIN, 152 .item_num = 0, 153 .item_str = 154 { 155 "Boot Order", 156 }, 157 .select = panel_boot_order, 158 }, 159 { 160 .parent = panel::MAIN, 161 .item_num = 0, 162 .item_str = 163 { 164 "Power Policy", 165 }, 166 .select = panel_power_policy, 167 }, 168 }; 169 170 } // end of namespace ipmi 171