xref: /openbmc/estoraged/include/sanitize.hpp (revision 15b63e12bdc3f3116fb841349dd4f1cd17a8398b)
1605085a6SJohn Edward Broadbent #pragma once
2605085a6SJohn Edward Broadbent 
3605085a6SJohn Edward Broadbent #include "erase.hpp"
4605085a6SJohn Edward Broadbent 
5605085a6SJohn Edward Broadbent #include <linux/mmc/ioctl.h>
6605085a6SJohn Edward Broadbent #include <sys/ioctl.h>
7605085a6SJohn Edward Broadbent #include <sys/types.h>
8605085a6SJohn Edward Broadbent 
9605085a6SJohn Edward Broadbent #include <stdplus/fd/managed.hpp>
10605085a6SJohn Edward Broadbent #include <util.hpp>
11605085a6SJohn Edward Broadbent 
12605085a6SJohn Edward Broadbent #include <array>
13605085a6SJohn Edward Broadbent #include <cstddef>
14605085a6SJohn Edward Broadbent #include <span>
15605085a6SJohn Edward Broadbent #include <string_view>
16605085a6SJohn Edward Broadbent 
17605085a6SJohn Edward Broadbent namespace estoraged
18605085a6SJohn Edward Broadbent {
19605085a6SJohn Edward Broadbent 
20605085a6SJohn Edward Broadbent class IOCTLWrapperInterface
21605085a6SJohn Edward Broadbent {
22605085a6SJohn Edward Broadbent   public:
23605085a6SJohn Edward Broadbent     /** @brief Wrapper around ioctl
24605085a6SJohn Edward Broadbent      *  @details Used for mocking purposes.
25605085a6SJohn Edward Broadbent      *
26605085a6SJohn Edward Broadbent      * @param[in] devPath - File name of block device
27605085a6SJohn Edward Broadbent      * @param[in] request - Device-dependent request code
28605085a6SJohn Edward Broadbent      * @param[in] mmc_ioc_cmd - eMMC cmd
29605085a6SJohn Edward Broadbent      */
30605085a6SJohn Edward Broadbent     virtual int doIoctl(std::string_view devPath, unsigned long request,
31605085a6SJohn Edward Broadbent                         struct mmc_ioc_cmd data) = 0;
32605085a6SJohn Edward Broadbent 
33605085a6SJohn Edward Broadbent     /** @brief Wrapper around ioctl
34605085a6SJohn Edward Broadbent      *  @details Used for mocking purposes.
35605085a6SJohn Edward Broadbent      *
36605085a6SJohn Edward Broadbent      * @param[in] devPath - File name of block device
37605085a6SJohn Edward Broadbent      * @param[in] request - Device-dependent request code
38605085a6SJohn Edward Broadbent      * @param[in] mmc_io_mutli_cmd - many eMMC cmd
39605085a6SJohn Edward Broadbent      */
40605085a6SJohn Edward Broadbent     virtual int doIoctlMulti(std::string_view devPath, unsigned long request,
41605085a6SJohn Edward Broadbent                              struct mmc_io_multi_cmd_erase data) = 0;
42605085a6SJohn Edward Broadbent 
43605085a6SJohn Edward Broadbent     virtual ~IOCTLWrapperInterface() = default;
44605085a6SJohn Edward Broadbent     IOCTLWrapperInterface() = default;
45605085a6SJohn Edward Broadbent     IOCTLWrapperInterface(const IOCTLWrapperInterface&) = delete;
46605085a6SJohn Edward Broadbent     IOCTLWrapperInterface& operator=(const IOCTLWrapperInterface&) = delete;
47605085a6SJohn Edward Broadbent 
48605085a6SJohn Edward Broadbent     IOCTLWrapperInterface(IOCTLWrapperInterface&&) = delete;
49605085a6SJohn Edward Broadbent     IOCTLWrapperInterface& operator=(IOCTLWrapperInterface&&) = delete;
50605085a6SJohn Edward Broadbent };
51605085a6SJohn Edward Broadbent 
52605085a6SJohn Edward Broadbent // mockIOCTLWapper also inherits from IOCTLWrapperInterface
53605085a6SJohn Edward Broadbent class IOCTLWrapperImpl : public IOCTLWrapperInterface
54605085a6SJohn Edward Broadbent {
55605085a6SJohn Edward Broadbent   public:
56605085a6SJohn Edward Broadbent     int doIoctl(std::string_view devPath, unsigned long request,
57605085a6SJohn Edward Broadbent                 struct mmc_ioc_cmd data) override;
58605085a6SJohn Edward Broadbent     int doIoctlMulti(std::string_view devPath, unsigned long request,
59605085a6SJohn Edward Broadbent                      struct mmc_io_multi_cmd_erase data) override;
60605085a6SJohn Edward Broadbent     ~IOCTLWrapperImpl() override = default;
61605085a6SJohn Edward Broadbent     IOCTLWrapperImpl() = default;
62605085a6SJohn Edward Broadbent 
63605085a6SJohn Edward Broadbent     IOCTLWrapperImpl(const IOCTLWrapperImpl&) = delete;
64605085a6SJohn Edward Broadbent     IOCTLWrapperImpl& operator=(const IOCTLWrapperImpl&) = delete;
65605085a6SJohn Edward Broadbent 
66605085a6SJohn Edward Broadbent     IOCTLWrapperImpl(IOCTLWrapperImpl&&) = delete;
67605085a6SJohn Edward Broadbent     IOCTLWrapperImpl& operator=(IOCTLWrapperImpl&&) = delete;
68605085a6SJohn Edward Broadbent };
69605085a6SJohn Edward Broadbent 
70605085a6SJohn Edward Broadbent class Sanitize : public Erase
71605085a6SJohn Edward Broadbent {
72605085a6SJohn Edward Broadbent   public:
73d4554f2aSManojkiran Eda     /** @brief Creates a sanitize erase object
74605085a6SJohn Edward Broadbent      *
75605085a6SJohn Edward Broadbent      * @param[in] inDevPath - the linux device path for the block device.
76605085a6SJohn Edward Broadbent      * @param[in] IOCTLWrapper - This is a ioctl wrapper, it can be used for
77605085a6SJohn Edward Broadbent      * testing
78605085a6SJohn Edward Broadbent      */
Sanitize(std::string_view inDevPath,std::unique_ptr<IOCTLWrapperInterface> inIOCTL=std::make_unique<IOCTLWrapperImpl> ())79605085a6SJohn Edward Broadbent     Sanitize(std::string_view inDevPath,
80605085a6SJohn Edward Broadbent              std::unique_ptr<IOCTLWrapperInterface> inIOCTL =
81605085a6SJohn Edward Broadbent                  std::make_unique<IOCTLWrapperImpl>()) :
82*15b63e12SPatrick Williams         Erase(inDevPath), ioctlWrapper(std::move(inIOCTL))
83605085a6SJohn Edward Broadbent     {}
84605085a6SJohn Edward Broadbent 
85d4554f2aSManojkiran Eda     /** @brief sanitize the drive, using eMMC specified erase commands
86605085a6SJohn Edward Broadbent      *
87605085a6SJohn Edward Broadbent      * param[in] driveSize - size of the drive in bytes
88605085a6SJohn Edward Broadbent      */
89605085a6SJohn Edward Broadbent     void doSanitize(uint64_t driveSize);
90605085a6SJohn Edward Broadbent 
91d4554f2aSManojkiran Eda     /** @brief sanitize the drive, using eMMC specified erase commands
92605085a6SJohn Edward Broadbent      *   This function uses the built in utils to call sanitize
93605085a6SJohn Edward Broadbent      */
doSanitize()94605085a6SJohn Edward Broadbent     void doSanitize()
95605085a6SJohn Edward Broadbent     {
965d799bb9SJohn Edward Broadbent         doSanitize(util::findSizeOfBlockDevice(devPath));
97605085a6SJohn Edward Broadbent     }
98605085a6SJohn Edward Broadbent 
99605085a6SJohn Edward Broadbent   private:
100605085a6SJohn Edward Broadbent     /* Wrapper for ioctl*/
101605085a6SJohn Edward Broadbent     std::unique_ptr<IOCTLWrapperInterface> ioctlWrapper;
102605085a6SJohn Edward Broadbent 
103605085a6SJohn Edward Broadbent     /** @brief uses the eMMC defined sanitize command, it is not the same as
104605085a6SJohn Edward Broadbent      * vendor_sanitize  */
105605085a6SJohn Edward Broadbent     void emmcSanitize();
106605085a6SJohn Edward Broadbent 
107605085a6SJohn Edward Broadbent     /** @brief uses the eMMC defined erase command
108605085a6SJohn Edward Broadbent      *
109605085a6SJohn Edward Broadbent      * param[in] driveSize - size of the drive in bytes
110605085a6SJohn Edward Broadbent      */
111605085a6SJohn Edward Broadbent     void emmcErase(uint64_t driveSize);
112605085a6SJohn Edward Broadbent };
113605085a6SJohn Edward Broadbent 
114605085a6SJohn Edward Broadbent // can't use the real mmc_ioc_multi_cmd b/c of zero length array
115605085a6SJohn Edward Broadbent // see uapi/linux/mmc/ioctl.h
116605085a6SJohn Edward Broadbent struct mmc_io_multi_cmd_erase
117605085a6SJohn Edward Broadbent {
118605085a6SJohn Edward Broadbent     uint64_t num_of_cmds;
119605085a6SJohn Edward Broadbent     struct mmc_ioc_cmd cmds[3]; // NOLINT (c arrays usage)
120605085a6SJohn Edward Broadbent };
121605085a6SJohn Edward Broadbent 
122605085a6SJohn Edward Broadbent } // namespace estoraged
123