10c0eeff6SMatt Spinler #pragma once
20c0eeff6SMatt Spinler 
30c0eeff6SMatt Spinler #include "targeting.hpp"
40c0eeff6SMatt Spinler 
5*f78d9042SPatrick Venture #include <memory>
6*f78d9042SPatrick Venture 
70c0eeff6SMatt Spinler namespace openpower
80c0eeff6SMatt Spinler {
90c0eeff6SMatt Spinler namespace cfam
100c0eeff6SMatt Spinler {
110c0eeff6SMatt Spinler namespace access
120c0eeff6SMatt Spinler {
130c0eeff6SMatt Spinler 
140c0eeff6SMatt Spinler using cfam_address_t = uint16_t;
150c0eeff6SMatt Spinler using cfam_data_t = uint32_t;
160c0eeff6SMatt Spinler using cfam_mask_t = uint32_t;
170c0eeff6SMatt Spinler 
180c0eeff6SMatt Spinler /**
190c0eeff6SMatt Spinler  * @brief Writes a CFAM (Common FRU Access Macro) register in a P9.
200c0eeff6SMatt Spinler  *
210c0eeff6SMatt Spinler  * Throws an exception on error.
220c0eeff6SMatt Spinler  *
230c0eeff6SMatt Spinler  * @param[in] target - The Target to perform the operation on
240c0eeff6SMatt Spinler  * @param[in] address - The register address to write to
250c0eeff6SMatt Spinler  * @param[in] data - The data to write
260c0eeff6SMatt Spinler  */
270c0eeff6SMatt Spinler void writeReg(const std::unique_ptr<openpower::targeting::Target>& target,
28*f78d9042SPatrick Venture               cfam_address_t address, cfam_data_t data);
290c0eeff6SMatt Spinler 
300c0eeff6SMatt Spinler /**
310c0eeff6SMatt Spinler  * @brief Reads a CFAM (Common FRU Access Macro) register in a P9.
320c0eeff6SMatt Spinler  *
330c0eeff6SMatt Spinler  * Throws an exception on error.
340c0eeff6SMatt Spinler  *
350c0eeff6SMatt Spinler  * @param[in] target - The Target to perform the operation on
360c0eeff6SMatt Spinler  * @param[in] address - The register address to read
370c0eeff6SMatt Spinler  * @return - The register data
380c0eeff6SMatt Spinler  */
39*f78d9042SPatrick Venture cfam_data_t readReg(const std::unique_ptr<openpower::targeting::Target>& target,
400c0eeff6SMatt Spinler                     cfam_address_t address);
410c0eeff6SMatt Spinler 
420c0eeff6SMatt Spinler /**
430c0eeff6SMatt Spinler  * @brief Writes a CFAM (Common FRU Access Macro) register in a P9
440c0eeff6SMatt Spinler  *        using a mask to specify the bits the modify.
450c0eeff6SMatt Spinler  *
460c0eeff6SMatt Spinler  * Only bits that are set in the mask parameter will be modified.
470c0eeff6SMatt Spinler  *
480c0eeff6SMatt Spinler  * Throws an exception on error.
490c0eeff6SMatt Spinler  *
500c0eeff6SMatt Spinler  * @param[in] target - The Target to perform the operation on
510c0eeff6SMatt Spinler  * @param[in] address - The register address to write to
520c0eeff6SMatt Spinler  * @param[in] data - The data to write
530c0eeff6SMatt Spinler  * @param[in] mask - The mask
540c0eeff6SMatt Spinler  */
550c0eeff6SMatt Spinler void writeRegWithMask(
560c0eeff6SMatt Spinler     const std::unique_ptr<openpower::targeting::Target>& target,
57*f78d9042SPatrick Venture     cfam_address_t address, cfam_data_t data, cfam_mask_t mask);
58*f78d9042SPatrick Venture } // namespace access
59*f78d9042SPatrick Venture } // namespace cfam
60*f78d9042SPatrick Venture } // namespace openpower
61