// Copyright 2022 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #pragma once #include #include #include #include #include #include #include #include #include namespace google { namespace ipmi { using Resp = ::ipmi::RspType>; using VersionTuple = std::tuple; class HandlerInterface { public: virtual ~HandlerInterface() = default; /** * Return the operation mode of BMC * * @return the BMC operation mode */ virtual uint8_t getBmcMode() = 0; /** * Return ethernet details (hard-coded). * * @return tuple of ethernet details (channel, if name). */ virtual std::tuple getEthDetails(std::string intf) const = 0; /** * Return the value of rx_packets, given a if_name. * * @param[in] name, the interface name. * @return the number of packets received. * @throw IpmiException on failure. */ virtual std::int64_t getRxPackets(const std::string& name) const = 0; /** * Return the values from a cpld version file. * * @param[in] id - the cpld id number. * @return the quad of numbers as a tuple (maj,min,pt,subpt) * @throw IpmiException on failure. */ virtual VersionTuple getCpldVersion(unsigned int id) const = 0; /** * Set the PSU Reset delay. * * @param[in] delay - delay in seconds. * @throw IpmiException on failure. */ virtual void psuResetDelay(std::uint32_t delay) const = 0; /** * Arm for PSU reset on host shutdown. * * @throw IpmiException on failure. */ virtual void psuResetOnShutdown() const = 0; /** * Return the entity name. * On the first call to this method it'll build the list of entities. * @todo Consider moving the list building to construction time (and ignore * failures). * * @param[in] id - the entity id value * @param[in] instance - the entity instance * @return the entity's name * @throw IpmiException on failure. */ virtual std::string getEntityName(std::uint8_t id, std::uint8_t instance) = 0; /** * Return the flash size of bmc chip. * * @return the flash size of bmc chip * @throw IpmiException on failure. */ virtual uint32_t getFlashSize() = 0; /** * Return the name of the machine, parsed from release information. * * @return the machine name * @throw IpmiException on failure. */ virtual std::string getMachineName() = 0; /** * Populate the i2c-pcie mapping vector. */ virtual void buildI2cPcieMapping() = 0; /** * Return the size of the i2c-pcie mapping vector. * * @return the size of the vector holding the i2c-pcie mapping tuples. */ virtual size_t getI2cPcieMappingSize() const = 0; /** * Return a copy of the entry in the vector. * * @param[in] entry - the index into the vector. * @return the tuple at that index. */ virtual std::tuple getI2cEntry(unsigned int entry) const = 0; /** * Set the Host Power Off delay. * * @param[in] delay - delay in seconds. * @throw IpmiException on failure. */ virtual void hostPowerOffDelay(std::uint32_t delay) const = 0; /** * Return the number of devices from the CustomAccel service. * * @return the number of devices. * @throw IpmiException on failure. */ virtual uint32_t accelOobDeviceCount() const = 0; /** * Return the name of a single device from the CustomAccel service. * * Valid indexes start at 0 and go up to (but don't include) the number of * devices. The number of devices can be queried with accelOobDeviceCount. * * @param[in] index - the index of the device, starting at 0. * @return the name of the device. * @throw IpmiException on failure. */ virtual std::string accelOobDeviceName(size_t index) const = 0; /** * Read from a single CustomAccel service device. * * Valid device names can be queried with accelOobDeviceName. * If num_bytes < 8, all unused MSBs are padded with 0s. * * @param[in] name - the name of the device (from DeviceName). * @param[in] address - the address to read from. * @param[in] num_bytes - the size of the read, in bytes. * @return the data read, with 0s padding any unused MSBs. * @throw IpmiException on failure. */ virtual uint64_t accelOobRead(std::string_view name, uint64_t address, uint8_t num_bytes) const = 0; /** * Write to a single CustomAccel service device. * * Valid device names can be queried with accelOobDeviceName. * If num_bytes < 8, all unused MSBs are ignored. * * @param[in] name - the name of the device (from DeviceName). * @param[in] address - the address to read from. * @param[in] num_bytes - the size of the read, in bytes. * @param[in] data - the data to write. * @throw IpmiException on failure. */ virtual void accelOobWrite(std::string_view name, uint64_t address, uint8_t num_bytes, uint64_t data) const = 0; /** * Parse the I2C tree to get the highest level of bifurcation in target bus. * * @param[in] index - PCIe Slot Index * @return list of lanes taken by each device. */ virtual std::vector pcieBifurcation(uint8_t index) = 0; /** * Prepare for OS boot. * * If in bare metal mode, the BMC will disable IPMI, to protect against an * untrusted OS. */ virtual void linuxBootDone() const = 0; /** * Update the VR settings for the given settings_id * * @param[in] chip_id - Accel Device# * @param[in] settings_id - ID of the setting to update * @param[in] value - Value of the setting */ virtual void accelSetVrSettings(::ipmi::Context::ptr ctx, uint8_t chip_id, uint8_t settings_id, uint16_t value) const = 0; /** * Read current VR settings value for the given settings_id * * @param[in] chip_id - Accel Device# * @param[in] settings_id - ID of the setting to read */ virtual uint16_t accelGetVrSettings(::ipmi::Context::ptr ctx, uint8_t chip_id, uint8_t settings_id) const = 0; /** * Get the BM instance property from /run/ * * @param[in] propertyType - BM instance property type * @return - string of the requested BM instance property */ virtual std::string getBMInstanceProperty(uint8_t propertyType) const = 0; }; } // namespace ipmi } // namespace google