1 /*
2  * Copyright (c) 2023-2024, Arm Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef __NI_TOWER_PSAM_DRV_H__
9 #define __NI_TOWER_PSAM_DRV_H__
10 
11 #include "ni_tower_drv.h"
12 
13 #include <stdint.h>
14 
15 /**
16  * \brief NI-Tower PSAM region configuration info structure
17  */
18 struct ni_tower_psam_reg_cfg_info {
19     /* Base address of the region */
20     uint64_t base_addr;
21     /* End address of the region */
22     uint64_t end_addr;
23     /* ID of the target interface or the strip group for non-striped region.*/
24     uint64_t target_id;
25 };
26 
27 /**
28  * \brief NI-Tower PSAM device structure
29  */
30 struct ni_tower_psam_dev {
31     uintptr_t base;
32     /* Offset to be added to the memory map base and end addresses */
33     uint64_t region_mapping_offset;
34 };
35 
36 /**
37  * \brief Initialize and return PSAM device
38  *
39  * \param[in]  ni_tower_dev          NI-Tower device struct \ref ni_tower_dev.
40  * \param[in]  component             NI-Tower component node struct \ref
41  *                                   ni_tower_component_node.
42  * \param[in]  region_mapping_offset Offset which will added to the memory map
43  *                                   base and end addresses.
44  * \param[out] dev                   NI-Tower PSAM device struct \ref
45  *                                   ni_tower_psam_dev
46  *
47  * \return Returns error code as specified in \ref ni_tower_err
48  */
49 enum ni_tower_err ni_tower_psam_dev_init(
50     const struct ni_tower_dev *ni_tower_dev,
51     const struct ni_tower_component_node* component,
52     const uint64_t region_mapping_offset,
53     struct ni_tower_psam_dev *dev);
54 
55 /**
56  * \brief Configure non-striped (non-hashed) region.
57  *
58  * \param[in] dev         NI-Tower PSAM device struct \ref ni_tower_psam_dev.
59  * \param[in] cfg_info    Configuration info of a region to be configured.
60  *                        struct \ref ni_tower_psam_reg_cfg_info.
61  * \param[in] region      PSAM region number to be initialized.
62  *
63  * \return Returns error code as specified in \ref ni_tower_err
64  */
65 enum ni_tower_err ni_tower_psam_configure_nhregion(
66     const struct ni_tower_psam_dev *dev,
67     const struct ni_tower_psam_reg_cfg_info *cfg_info,
68     const uint32_t region);
69 
70 /**
71  * \brief Get the next available region number and configure the non-striped
72  *        (non-hashed) region.
73  *
74  * \param[in] dev         NI-Tower PSAM device struct \ref ni_tower_psam_dev.
75  * \param[in] cfg_info    Configuration info of a region to be configured.
76  *                        struct \ref ni_tower_psam_reg_cfg_info.
77  *
78  * \return Returns error code as specified in \ref ni_tower_err
79  */
80 enum ni_tower_err ni_tower_psam_configure_next_available_nhregion(
81     const struct ni_tower_psam_dev *dev,
82     const struct ni_tower_psam_reg_cfg_info *cfg_info);
83 
84 /**
85  * \brief Enables the PSAM device
86  *
87  * \param[in] dev         NI-Tower PSAM device struct \ref ni_tower_psam_dev.
88  *
89  * \return Returns error code as specified in \ref ni_tower_err
90  */
91 enum ni_tower_err ni_tower_psam_enable(const struct ni_tower_psam_dev *dev);
92 
93 /**
94  * \brief Disables the PSAM device
95  *
96  * \param[in] dev         NI-Tower PSAM device struct \ref ni_tower_psam_dev.
97  *
98  * \return Returns error code as specified in \ref ni_tower_err
99  */
100 enum ni_tower_err ni_tower_psam_disable(const struct ni_tower_psam_dev *dev);
101 
102 #endif /* __NI_TOWER_PSAM_DRV_H__ */
103