1f2c95a08SAlexander Hansen #pragma once 2f2c95a08SAlexander Hansen 3f2c95a08SAlexander Hansen #include "common/include/NotifyWatch.hpp" 4f2c95a08SAlexander Hansen #include "common/include/device.hpp" 5f2c95a08SAlexander Hansen #include "common/include/software.hpp" 6f2c95a08SAlexander Hansen #include "common/include/software_manager.hpp" 7f2c95a08SAlexander Hansen 8f2c95a08SAlexander Hansen #include <sdbusplus/asio/connection.hpp> 9f2c95a08SAlexander Hansen #include <sdbusplus/asio/object_server.hpp> 10f2c95a08SAlexander Hansen #include <sdbusplus/async/context.hpp> 11f2c95a08SAlexander Hansen 12f2c95a08SAlexander Hansen #include <string> 13f2c95a08SAlexander Hansen 14f2c95a08SAlexander Hansen class SPIDevice; 15f2c95a08SAlexander Hansen 16f2c95a08SAlexander Hansen using namespace phosphor::software; 17f2c95a08SAlexander Hansen using namespace phosphor::software::manager; 18f2c95a08SAlexander Hansen using namespace phosphor::notify::watch; 19f2c95a08SAlexander Hansen 20f2c95a08SAlexander Hansen using NotifyWatchIntf = phosphor::notify::watch::NotifyWatch<SPIDevice>; 21f2c95a08SAlexander Hansen 22f2c95a08SAlexander Hansen const std::string biosVersionDirPath = "/var/bios/"; 23f2c95a08SAlexander Hansen const std::string biosVersionFilename = "host0_bios_version.txt"; 24f2c95a08SAlexander Hansen const std::string biosVersionPath = biosVersionDirPath + biosVersionFilename; 25f2c95a08SAlexander Hansen 26f2c95a08SAlexander Hansen const std::string versionUnknown = "Unknown"; 27f2c95a08SAlexander Hansen 28f2c95a08SAlexander Hansen enum FlashLayout 29f2c95a08SAlexander Hansen { 30f2c95a08SAlexander Hansen flashLayoutFlat, 31f2c95a08SAlexander Hansen flashLayoutIntelFlashDescriptor, 32f2c95a08SAlexander Hansen }; 33f2c95a08SAlexander Hansen 34f2c95a08SAlexander Hansen enum FlashTool 35f2c95a08SAlexander Hansen { 36f2c95a08SAlexander Hansen flashToolNone, // write directly to the mtd device 37f2c95a08SAlexander Hansen flashToolFlashrom, // use flashrom, to handle e.g. IFD 385db0c6beSAlexander Hansen flashToolFlashcp, 39f2c95a08SAlexander Hansen }; 40f2c95a08SAlexander Hansen 41f2c95a08SAlexander Hansen class SPIDevice : public Device, public NotifyWatchIntf 42f2c95a08SAlexander Hansen { 43f2c95a08SAlexander Hansen public: 44f2c95a08SAlexander Hansen using Device::softwareCurrent; 45f2c95a08SAlexander Hansen SPIDevice(sdbusplus::async::context& ctx, uint64_t spiControllerIndex, 46f2c95a08SAlexander Hansen uint64_t spiDeviceIndex, bool dryRun, 47f2c95a08SAlexander Hansen const std::vector<std::string>& gpioLinesIn, 48f2c95a08SAlexander Hansen const std::vector<uint64_t>& gpioValuesIn, SoftwareConfig& config, 49f2c95a08SAlexander Hansen SoftwareManager* parent, enum FlashLayout layout, 50f2c95a08SAlexander Hansen enum FlashTool tool, 51f2c95a08SAlexander Hansen const std::string& versionDirPath = biosVersionDirPath); 52f2c95a08SAlexander Hansen 53f2c95a08SAlexander Hansen sdbusplus::async::task<bool> updateDevice(const uint8_t* image, 54f2c95a08SAlexander Hansen size_t image_size) final; 55f2c95a08SAlexander Hansen 56f2c95a08SAlexander Hansen // @returns the bios version which is externally provided. 57f2c95a08SAlexander Hansen static std::string getVersion(); 58f2c95a08SAlexander Hansen 59f2c95a08SAlexander Hansen /** @brief Process async changes to cable configuration */ 60f2c95a08SAlexander Hansen auto processUpdate(std::string versionFileName) -> sdbusplus::async::task<>; 61f2c95a08SAlexander Hansen 62f2c95a08SAlexander Hansen private: 63f2c95a08SAlexander Hansen bool dryRun; 64f2c95a08SAlexander Hansen 65f2c95a08SAlexander Hansen std::vector<std::string> gpioLines; 66f2c95a08SAlexander Hansen 67f2c95a08SAlexander Hansen std::vector<int> gpioValues; 68f2c95a08SAlexander Hansen 69f2c95a08SAlexander Hansen uint64_t spiControllerIndex; 70f2c95a08SAlexander Hansen uint64_t spiDeviceIndex; 71f2c95a08SAlexander Hansen 72f2c95a08SAlexander Hansen // e.g. "1e631000.spi" 73f2c95a08SAlexander Hansen std::string spiDev; 74f2c95a08SAlexander Hansen 75f2c95a08SAlexander Hansen enum FlashLayout layout; 76f2c95a08SAlexander Hansen 77f2c95a08SAlexander Hansen enum FlashTool tool; 78f2c95a08SAlexander Hansen 79f2c95a08SAlexander Hansen // @returns true on success 80f2c95a08SAlexander Hansen sdbusplus::async::task<bool> bindSPIFlash(); 81f2c95a08SAlexander Hansen 82f2c95a08SAlexander Hansen // @returns true on success 83f2c95a08SAlexander Hansen sdbusplus::async::task<bool> unbindSPIFlash(); 84f2c95a08SAlexander Hansen 85ac4fdd05SAlexander Hansen bool isSPIControllerBound(); 86f2c95a08SAlexander Hansen bool isSPIFlashBound(); 87f2c95a08SAlexander Hansen 88f2c95a08SAlexander Hansen // @description preconditions: 89f2c95a08SAlexander Hansen // - host is powered off 90f2c95a08SAlexander Hansen // @returns true on success 91f2c95a08SAlexander Hansen sdbusplus::async::task<bool> writeSPIFlash(const uint8_t* image, 92f2c95a08SAlexander Hansen size_t image_size); 93f2c95a08SAlexander Hansen 94f2c95a08SAlexander Hansen // @description preconditions: 95f2c95a08SAlexander Hansen // - host is powered off 96f2c95a08SAlexander Hansen // - gpio / mux is set 97f2c95a08SAlexander Hansen // - spi device is bound to the driver 98f2c95a08SAlexander Hansen // we write the flat image here 99f2c95a08SAlexander Hansen // @param image the component image 100f2c95a08SAlexander Hansen // @param image_size size of 'image' 101f2c95a08SAlexander Hansen // @returns true on success 102f2c95a08SAlexander Hansen sdbusplus::async::task<bool> writeSPIFlashDefault(const uint8_t* image, 103f2c95a08SAlexander Hansen size_t image_size); 104f2c95a08SAlexander Hansen 105f2c95a08SAlexander Hansen // @description preconditions: 106f2c95a08SAlexander Hansen // - host is powered off 107f2c95a08SAlexander Hansen // - gpio / mux is set 108f2c95a08SAlexander Hansen // - spi device is bound to the driver 109f2c95a08SAlexander Hansen // we use 'flashrom' here to write the image since it can deal with 110f2c95a08SAlexander Hansen // Intel Flash Descriptor 111f2c95a08SAlexander Hansen // @param image the component image 112f2c95a08SAlexander Hansen // @param image_size size of 'image' 113*a2eb951fSKevin Tung // @returns true on success 114*a2eb951fSKevin Tung sdbusplus::async::task<bool> writeSPIFlashWithFlashrom( 115f2c95a08SAlexander Hansen const uint8_t* image, size_t image_size) const; 116f2c95a08SAlexander Hansen 1175db0c6beSAlexander Hansen // @description preconditions: 1185db0c6beSAlexander Hansen // - host is powered off 1195db0c6beSAlexander Hansen // - gpio / mux is set 1205db0c6beSAlexander Hansen // - spi device is bound to the driver 1215db0c6beSAlexander Hansen // @param image the component image 1225db0c6beSAlexander Hansen // @param image_size size of 'image' 1235db0c6beSAlexander Hansen // @returns true on success 1245db0c6beSAlexander Hansen sdbusplus::async::task<bool> writeSPIFlashWithFlashcp( 1255db0c6beSAlexander Hansen const uint8_t* image, size_t image_size) const; 1265db0c6beSAlexander Hansen 127f2c95a08SAlexander Hansen // @returns nullopt on error 128f2c95a08SAlexander Hansen std::optional<std::string> getMTDDevicePath() const; 129f2c95a08SAlexander Hansen }; 130