xref: /openbmc/phosphor-bmc-code-mgmt/bios/spi_device.hpp (revision a2eb951f7384c2b4fa494f90e78295f615c12a56)
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