2016-10-22 06:19:54 -07:00
# ifndef _ASM_X86_INTEL_RDT_H
# define _ASM_X86_INTEL_RDT_H
2016-10-28 15:04:42 -07:00
# include <linux/jump_label.h>
# define IA32_L3_QOS_CFG 0xc81
2016-10-22 06:19:54 -07:00
# define IA32_L3_CBM_BASE 0xc90
2016-10-22 06:19:55 -07:00
# define IA32_L2_CBM_BASE 0xd10
2016-10-22 06:19:54 -07:00
2016-10-28 15:04:42 -07:00
# define L3_QOS_CDP_ENABLE 0x01ULL
/**
* struct rdtgroup - store rdtgroup ' s data in resctrl file system .
* @ kn : kernfs node
* @ rdtgroup_list : linked list for all rdtgroups
* @ closid : closid for this rdtgroup
2016-10-28 15:04:44 -07:00
* @ flags : status bits
* @ waitcount : how many cpus expect to find this
2016-10-28 15:04:42 -07:00
*/
struct rdtgroup {
struct kernfs_node * kn ;
struct list_head rdtgroup_list ;
int closid ;
2016-10-28 15:04:44 -07:00
int flags ;
atomic_t waitcount ;
2016-10-28 15:04:42 -07:00
} ;
2016-10-28 15:04:44 -07:00
/* rdtgroup.flags */
# define RDT_DELETED 1
2016-10-28 15:04:42 -07:00
/* List of all resource groups */
extern struct list_head rdt_all_groups ;
int __init rdtgroup_init ( void ) ;
2016-10-28 15:04:43 -07:00
/**
* struct rftype - describe each file in the resctrl file system
* @ name : file name
* @ mode : access mode
* @ kf_ops : operations
* @ seq_show : show content of the file
* @ write : write to the file
*/
struct rftype {
char * name ;
umode_t mode ;
struct kernfs_ops * kf_ops ;
int ( * seq_show ) ( struct kernfs_open_file * of ,
struct seq_file * sf , void * v ) ;
/*
* write ( ) is the generic write callback which maps directly to
* kernfs write operation and overrides all other operations .
* Maximum write size is determined by - > max_write_len .
*/
ssize_t ( * write ) ( struct kernfs_open_file * of ,
char * buf , size_t nbytes , loff_t off ) ;
} ;
2016-10-22 06:19:55 -07:00
/**
* struct rdt_resource - attributes of an RDT resource
* @ enabled : Is this feature enabled on this machine
* @ capable : Is this feature available on this machine
* @ name : Name to use in " schemata " file
* @ num_closid : Number of CLOSIDs available
* @ max_cbm : Largest Cache Bit Mask allowed
* @ min_cbm_bits : Minimum number of consecutive bits to be set
* in a cache bit mask
* @ domains : All domains for this resource
* @ num_domains : Number of domains active
* @ msr_base : Base MSR address for CBMs
* @ tmp_cbms : Scratch space when updating schemata
* @ cache_level : Which cache level defines scope of this domain
* @ cbm_idx_multi : Multiplier of CBM index
* @ cbm_idx_offset : Offset of CBM index . CBM index is computed by :
* closid * cbm_idx_multi + cbm_idx_offset
*/
struct rdt_resource {
bool enabled ;
bool capable ;
char * name ;
int num_closid ;
int cbm_len ;
int min_cbm_bits ;
u32 max_cbm ;
struct list_head domains ;
int num_domains ;
int msr_base ;
u32 * tmp_cbms ;
int cache_level ;
int cbm_idx_multi ;
int cbm_idx_offset ;
} ;
2016-10-28 15:04:41 -07:00
/**
* struct rdt_domain - group of cpus sharing an RDT resource
* @ list : all instances of this resource
* @ id : unique id for this instance
* @ cpu_mask : which cpus share this resource
* @ cbm : array of cache bit masks ( indexed by CLOSID )
*/
struct rdt_domain {
struct list_head list ;
int id ;
struct cpumask cpu_mask ;
u32 * cbm ;
} ;
/**
* struct msr_param - set a range of MSRs from a domain
* @ res : The resource to use
* @ low : Beginning index from base MSR
* @ high : End index
*/
struct msr_param {
struct rdt_resource * res ;
int low ;
int high ;
} ;
extern struct mutex rdtgroup_mutex ;
2016-10-22 06:19:55 -07:00
extern struct rdt_resource rdt_resources_all [ ] ;
2016-10-28 15:04:42 -07:00
extern struct rdtgroup rdtgroup_default ;
DECLARE_STATIC_KEY_FALSE ( rdt_enable_key ) ;
int __init rdtgroup_init ( void ) ;
2016-10-22 06:19:55 -07:00
enum {
RDT_RESOURCE_L3 ,
RDT_RESOURCE_L3DATA ,
RDT_RESOURCE_L3CODE ,
RDT_RESOURCE_L2 ,
/* Must be the last */
RDT_NUM_RESOURCES ,
} ;
# define for_each_capable_rdt_resource(r) \
for ( r = rdt_resources_all ; r < rdt_resources_all + RDT_NUM_RESOURCES ; \
r + + ) \
if ( r - > capable )
2016-10-28 15:04:41 -07:00
# define for_each_enabled_rdt_resource(r) \
for ( r = rdt_resources_all ; r < rdt_resources_all + RDT_NUM_RESOURCES ; \
r + + ) \
if ( r - > enabled )
2016-10-22 06:19:55 -07:00
/* CPUID.(EAX=10H, ECX=ResID=1).EAX */
union cpuid_0x10_1_eax {
struct {
unsigned int cbm_len : 5 ;
} split ;
unsigned int full ;
} ;
/* CPUID.(EAX=10H, ECX=ResID=1).EDX */
union cpuid_0x10_1_edx {
struct {
unsigned int cos_max : 16 ;
} split ;
unsigned int full ;
} ;
2016-10-28 15:04:41 -07:00
void rdt_cbm_update ( void * arg ) ;
2016-10-28 15:04:44 -07:00
struct rdtgroup * rdtgroup_kn_lock_live ( struct kernfs_node * kn ) ;
void rdtgroup_kn_unlock ( struct kernfs_node * kn ) ;
2016-10-22 06:19:54 -07:00
# endif /* _ASM_X86_INTEL_RDT_H */