blob: a927242364d22b5a4ad685c6a41682e51fbfb8dd [file] [log] [blame]
Karthikeyan Pasupathi813f2932022-04-06 14:10:48 +05301/*
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
Patrick Williamsf863a182022-06-16 16:17:28 -050017#include <ipmid/api.h>
Karthikeyan Pasupathi813f2932022-04-06 14:10:48 +053018#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>
Karthikeyan Pasupathi39836ff2022-01-17 12:20:06 +053027#include <sdbusplus/asio/property.hpp>
28#include <ipmid/utils.hpp>
Karthikeyan Pasupathi813f2932022-04-06 14:10:48 +053029
30#include <fstream>
31#include <iomanip>
32#include <iostream>
33#include <sstream>
34
35namespace 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
72static constexpr bool DEBUG = false;
73static const uint8_t meAddress = 1;
74static constexpr uint8_t lun = 0;
75
76using IpmbMethodType =
77 std::tuple<int, uint8_t, uint8_t, uint8_t, uint8_t, std::vector<uint8_t>>;
78
79typedef 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
88struct 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
112struct frame frame_info;
113struct frame frame_sel;
114struct frame frame_snr;
115
116enum ENUM_PANEL
117{
118 PANEL_MAIN = 1,
119 PANEL_BOOT_ORDER = 2,
120 PANEL_POWER_POLICY = 3,
121};
122
123struct 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
131static uint8_t panel_main(uint8_t item);
132static uint8_t panel_boot_order(uint8_t item);
133static uint8_t panel_power_policy(uint8_t item);
134
135static 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