mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-19 11:04:20 +00:00

This patch adds the API `ccn_get_part0_id` to query the PART0 ID from the PERIPHERAL_ID 0 register in the CCN driver. This ID allows to distinguish the variant of CCN present on the system and possibly enable dynamic configuration of the IP based on the variant. Also added an assert in `ccn_master_to_rn_id_map()` to ensure that the master map bitfield provided by the platform is within the expected interface id. Change-Id: I92d2db7bd93a9be8a7fbe72a522cbcba0aba2d0e
120 lines
4.9 KiB
C
120 lines
4.9 KiB
C
/*
|
|
* Copyright (c) 2015, ARM Limited and Contributors. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* Redistributions of source code must retain the above copyright notice, this
|
|
* list of conditions and the following disclaimer.
|
|
*
|
|
* Redistributions in binary form must reproduce the above copyright notice,
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
* and/or other materials provided with the distribution.
|
|
*
|
|
* Neither the name of ARM nor the names of its contributors may be used
|
|
* to endorse or promote products derived from this software without specific
|
|
* prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef __CCN_H__
|
|
#define __CCN_H__
|
|
|
|
/*
|
|
* This macro defines the maximum number of master interfaces that reside on
|
|
* Request nodes which the CCN driver can accommodate. The driver APIs to add
|
|
* and remove Request nodes from snoop/dvm domains take a bit map of master
|
|
* interfaces as inputs. The largest C data type that can be used is a 64-bit
|
|
* unsigned integer. Hence the value of 64. The platform will have to ensure
|
|
* that the master interfaces are numbered from 0-63.
|
|
*/
|
|
#define CCN_MAX_RN_MASTERS 64
|
|
|
|
/*
|
|
* The following constants define the various run modes that the platform can
|
|
* request the CCN driver to place the L3 cache in. These map to the
|
|
* programmable P-State values in a HN-F P-state register.
|
|
*/
|
|
#define CCN_L3_RUN_MODE_NOL3 0x0 /* HNF_PM_NOL3 */
|
|
#define CCN_L3_RUN_MODE_SFONLY 0x1 /* HNF_PM_SFONLY */
|
|
#define CCN_L3_RUN_MODE_HAM 0x2 /* HNF_PM_HALF */
|
|
#define CCN_L3_RUN_MODE_FAM 0x3 /* HNF_PM_FULL */
|
|
|
|
/* part 0 IDs for various CCN variants */
|
|
#define CCN_502_PART0_ID 0x30
|
|
#define CCN_504_PART0_ID 0x26
|
|
#define CCN_505_PART0_ID 0x27
|
|
#define CCN_508_PART0_ID 0x28
|
|
#define CCN_512_PART0_ID 0x29
|
|
|
|
/*
|
|
* The following macro takes the value returned from a read of a HN-F P-state
|
|
* status register and returns the retention state value.
|
|
*/
|
|
#define CCN_GET_RETENTION_STATE(pstate) ((pstate >> 4) & 0x3)
|
|
|
|
/*
|
|
* The following macro takes the value returned from a read of a HN-F P-state
|
|
* status register and returns the run state value.
|
|
*/
|
|
#define CCN_GET_RUN_STATE(pstate) (pstate & 0xf)
|
|
|
|
#ifndef __ASSEMBLY__
|
|
#include <stdint.h>
|
|
|
|
/*
|
|
* This structure describes some of the implementation defined attributes of the
|
|
* CCN IP. It is used by the platform port to specify these attributes in order
|
|
* to initialise the CCN driver. The attributes are described below.
|
|
*
|
|
* 1. The 'num_masters' field specifies the total number of master interfaces
|
|
* resident on Request nodes.
|
|
*
|
|
* 2. The 'master_to_rn_id_map' field is a ponter to an array in which each
|
|
* index corresponds to a master interface and its value corresponds to the
|
|
* Request node on which the master interface resides.
|
|
* This field is not simply defined as an array of size CCN_MAX_RN_MASTERS.
|
|
* In reality, a platform will have much fewer master * interfaces than
|
|
* CCN_MAX_RN_MASTERS. With an array of this size, it would also have to
|
|
* set the unused entries to a suitable value. Zeroing the array would not
|
|
* be enough since 0 is also a valid node id. Hence, such an array is not
|
|
* used.
|
|
*
|
|
* 3. The 'periphbase' field is the base address of the programmer's view of the
|
|
* CCN IP.
|
|
*/
|
|
typedef struct ccn_desc {
|
|
unsigned int num_masters;
|
|
const unsigned char *master_to_rn_id_map;
|
|
uintptr_t periphbase;
|
|
} ccn_desc_t;
|
|
|
|
|
|
void ccn_init(const ccn_desc_t *plat_ccn_desc);
|
|
void ccn_enter_snoop_dvm_domain(unsigned long long master_iface_map);
|
|
void ccn_exit_snoop_dvm_domain(unsigned long long master_iface_map);
|
|
void ccn_enter_dvm_domain(unsigned long long master_iface_map);
|
|
void ccn_exit_dvm_domain(unsigned long long master_iface_map);
|
|
void ccn_set_l3_run_mode(unsigned int mode);
|
|
void ccn_program_sys_addrmap(unsigned int sn0_id,
|
|
unsigned int sn1_id,
|
|
unsigned int sn2_id,
|
|
unsigned int top_addr_bit0,
|
|
unsigned int top_addr_bit1,
|
|
unsigned char three_sn_en);
|
|
unsigned int ccn_get_l3_run_mode(void);
|
|
int ccn_get_part0_id(uintptr_t periphbase);
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
#endif /* __CCN_H__ */
|