xref: /openbmc/fb-ipmi-oem/include/usb-dbg.hpp (revision 7bb4592a)
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;
frameipmi::frame102     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 
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     std::string item_str[8];
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