Home | History | Annotate | Download | only in arm
      1 /*
      2  * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved.
      3  *
      4  * SPDX-License-Identifier: BSD-3-Clause
      5  */
      6 
      7 #ifndef __CCN_H__
      8 #define __CCN_H__
      9 
     10 /*
     11  * This macro defines the maximum number of master interfaces that reside on
     12  * Request nodes which the CCN driver can accommodate. The driver APIs to add
     13  * and remove Request nodes from snoop/dvm domains take a bit map of master
     14  * interfaces as inputs. The largest C data type that can be used is a 64-bit
     15  * unsigned integer. Hence the value of 64. The platform will have to ensure
     16  * that the master interfaces are numbered from 0-63.
     17  */
     18 #define CCN_MAX_RN_MASTERS	64
     19 
     20 /*
     21  * The following constants define the various run modes that the platform can
     22  * request the CCN driver to place the L3 cache in. These map to the
     23  * programmable P-State values in a HN-F P-state register.
     24  */
     25 #define CCN_L3_RUN_MODE_NOL3	0x0	/* HNF_PM_NOL3 */
     26 #define CCN_L3_RUN_MODE_SFONLY	0x1	/* HNF_PM_SFONLY */
     27 #define CCN_L3_RUN_MODE_HAM	0x2	/* HNF_PM_HALF */
     28 #define CCN_L3_RUN_MODE_FAM	0x3	/* HNF_PM_FULL */
     29 
     30 /* part 0 IDs for various CCN variants */
     31 #define CCN_502_PART0_ID	0x30
     32 #define CCN_504_PART0_ID	0x26
     33 #define CCN_505_PART0_ID	0x27
     34 #define CCN_508_PART0_ID	0x28
     35 #define CCN_512_PART0_ID	0x29
     36 
     37 /*
     38  * The following macro takes the value returned from a read of a HN-F P-state
     39  * status register and returns the retention state value.
     40  */
     41 #define CCN_GET_RETENTION_STATE(pstate)	((pstate >> 4) & 0x3)
     42 
     43 /*
     44  * The following macro takes the value returned from a read of a HN-F P-state
     45  * status register and returns the run state value.
     46  */
     47 #define CCN_GET_RUN_STATE(pstate)	(pstate & 0xf)
     48 
     49 #ifndef __ASSEMBLY__
     50 #include <stdint.h>
     51 
     52 /*
     53  * This structure describes some of the implementation defined attributes of the
     54  * CCN IP. It is used by the platform port to specify these attributes in order
     55  * to initialise the CCN driver. The attributes are described below.
     56  *
     57  * 1. The 'num_masters' field specifies the total number of master interfaces
     58  *    resident on Request nodes.
     59  *
     60  * 2. The 'master_to_rn_id_map' field is a ponter to an array in which each
     61  *    index corresponds to a master interface and its value corresponds to the
     62  *    Request node on which the master interface resides.
     63  *    This field is not simply defined as an array of size CCN_MAX_RN_MASTERS.
     64  *    In reality, a platform will have much fewer master * interfaces than
     65  *    CCN_MAX_RN_MASTERS. With an array of this size, it would also have to
     66  *    set the unused entries to a suitable value. Zeroing the array would not
     67  *    be enough since 0 is also a valid node id. Hence, such an array is not
     68  *    used.
     69  *
     70  * 3. The 'periphbase' field is the base address of the programmer's view of the
     71  *    CCN IP.
     72  */
     73 typedef struct ccn_desc {
     74 	unsigned int num_masters;
     75 	const unsigned char *master_to_rn_id_map;
     76 	uintptr_t periphbase;
     77 } ccn_desc_t;
     78 
     79 
     80 void ccn_init(const ccn_desc_t *plat_ccn_desc);
     81 void ccn_enter_snoop_dvm_domain(unsigned long long master_iface_map);
     82 void ccn_exit_snoop_dvm_domain(unsigned long long master_iface_map);
     83 void ccn_enter_dvm_domain(unsigned long long master_iface_map);
     84 void ccn_exit_dvm_domain(unsigned long long master_iface_map);
     85 void ccn_set_l3_run_mode(unsigned int mode);
     86 void ccn_program_sys_addrmap(unsigned int sn0_id,
     87 		 unsigned int sn1_id,
     88 		 unsigned int sn2_id,
     89 		 unsigned int top_addr_bit0,
     90 		 unsigned int top_addr_bit1,
     91 		 unsigned char three_sn_en);
     92 unsigned int ccn_get_l3_run_mode(void);
     93 int ccn_get_part0_id(uintptr_t periphbase);
     94 
     95 #endif /* __ASSEMBLY__ */
     96 #endif /* __CCN_H__ */
     97