cache_info
extern struct pdc_cache_info cache_info;
if (cache_info.dc_size == 0 && cache_info.ic_size == 0) {
if (cache_info.dc_size == 0)
if (cache_info.ic_size == 0)
((cache_info.dc_size == 0) ? ALT_COND_NO_DCACHE : 0) |
((cache_info.ic_size == 0) ? ALT_COND_NO_ICACHE : 0) |
cache_info.ic_size/1024 );
if (cache_info.dc_loop != 1)
snprintf(buf, 32, "%lu-way associative", cache_info.dc_loop);
cache_info.dc_size/1024,
(cache_info.dc_conf.cc_wt ? "WT":"WB"),
(cache_info.dc_conf.cc_sh ? ", shared I/D":""),
((cache_info.dc_loop == 1) ? "direct mapped" : buf),
cache_info.dc_conf.cc_alias
cache_info.it_size,
cache_info.dt_size,
cache_info.dt_conf.tc_sh ? " - shared with ITLB":""
if (pdc_cache_info(&cache_info) < 0)
cache_info.ic_size,
cache_info.dc_size,
cache_info.it_size);
cache_info.dc_base,
cache_info.dc_stride,
cache_info.dc_count,
cache_info.dc_loop);
*(unsigned long *) (&cache_info.dc_conf),
cache_info.dc_conf.cc_alias,
cache_info.dc_conf.cc_block,
cache_info.dc_conf.cc_line,
cache_info.dc_conf.cc_shift);
cache_info.dc_conf.cc_wt,
cache_info.dc_conf.cc_sh,
cache_info.dc_conf.cc_cst,
cache_info.dc_conf.cc_hv);
cache_info.ic_base,
cache_info.ic_stride,
cache_info.ic_count,
cache_info.ic_loop);
cache_info.it_sp_base,
cache_info.it_sp_stride,
cache_info.it_sp_count,
cache_info.it_loop,
cache_info.it_off_base,
cache_info.it_off_stride,
cache_info.it_off_count);
cache_info.dt_sp_base,
cache_info.dt_sp_stride,
cache_info.dt_sp_count,
cache_info.dt_loop,
cache_info.dt_off_base,
cache_info.dt_off_stride,
cache_info.dt_off_count);
*(unsigned long *) (&cache_info.ic_conf),
cache_info.ic_conf.cc_alias,
cache_info.ic_conf.cc_block,
cache_info.ic_conf.cc_line,
cache_info.ic_conf.cc_shift);
cache_info.ic_conf.cc_wt,
cache_info.ic_conf.cc_sh,
cache_info.ic_conf.cc_cst,
cache_info.ic_conf.cc_hv);
cache_info.dt_conf.tc_sh,
cache_info.dt_conf.tc_page,
cache_info.dt_conf.tc_cst,
cache_info.dt_conf.tc_aid,
cache_info.dt_conf.tc_sr);
cache_info.it_conf.tc_sh,
cache_info.it_conf.tc_page,
cache_info.it_conf.tc_cst,
cache_info.it_conf.tc_aid,
cache_info.it_conf.tc_sr);
if (cache_info.dt_conf.tc_sh == 0 || cache_info.dt_conf.tc_sh == 2) {
if (cache_info.dt_conf.tc_sh == 2)
dcache_stride = CAFL_STRIDE(cache_info.dc_conf);
icache_stride = CAFL_STRIDE(cache_info.ic_conf);
WARN_ON(cache_info.dc_size && dcache_stride == 0);
WARN_ON(cache_info.ic_size && icache_stride == 0);
threshold2 = cache_info.dc_size * num_online_cpus();
threshold = max(cache_info.it_size, cache_info.dt_size);
struct pdc_cache_info cache_info __ro_after_init;
p = (unsigned long *) &cache_info;
for (num = 0; num < sizeof(cache_info); num += sizeof(unsigned long)) {
int pdc_cache_info(struct pdc_cache_info *cache_info)
memcpy(cache_info, pdc_result, sizeof(*cache_info));
struct cache_info ci[CACHE_MAX_LEVEL];
static inline enum cache_type get_cache_type(struct cache_info *ci, int level)
struct cache_info icache; /* Primary I-cache */
struct cache_info dcache; /* Primary D-cache */
struct cache_info scache; /* Secondary cache */
struct cache_info info)
struct cache_info *cache;
struct cache_info *dcache;
static void compute_alias(struct cache_info *c)
struct kfd_gpu_cache_info cache_info[KFD_MAX_CACHE_TYPES];
memset(cache_info, 0, sizeof(cache_info));
pcache_info = cache_info;
cache->cache_info.seg_id = seg_id;
struct pcache_cache_info *cache_info = &cache->cache_info;
memset(cache_info, 0, sizeof(*cache_info));
cache_info->n_segs = cache->cache_dev->seg_num;
struct pcache_cache_info *cache_info = &cache->cache_info;
cache_info_set_gc_percent(cache_info, PCACHE_CACHE_GC_PERCENT_DEFAULT);
bool new_cache = !(cache->cache_info.flags & PCACHE_CACHE_FLAGS_INIT_DONE);
cache_info->header.seq++;
cache_info->header.crc = pcache_meta_crc(&cache_info->header,
*seg_id = cache->cache_info.seg_id;
struct pcache_cache_info *cache_info = &cache->cache_info;
memcpy_flushcache(get_cache_info_addr(cache), cache_info,
bool new_cache = !(cache->cache_info.flags & PCACHE_CACHE_FLAGS_INIT_DONE);
for (i = 0; i < cache_info->n_segs; i++) {
&cache->cache_info);
cache->cache_info.flags |= PCACHE_CACHE_FLAGS_INIT_DONE;
(cache->cache_info.flags & PCACHE_CACHE_FLAGS_DATA_CRC)) {
cache->cache_info.flags & PCACHE_CACHE_FLAGS_DATA_CRC ? "true" : "false");
cache->cache_info.flags |= PCACHE_CACHE_FLAGS_DATA_CRC;
static void cache_info_set_gc_percent(struct pcache_cache_info *cache_info, u8 percent)
cache_info->flags &= ~PCACHE_CACHE_FLAGS_GC_PERCENT_MASK;
cache_info->flags |= FIELD_PREP(PCACHE_CACHE_FLAGS_GC_PERCENT_MASK, percent);
cache_info_set_gc_percent(&cache->cache_info, percent);
struct pcache_cache_info cache_info;
return FIELD_GET(PCACHE_CACHE_FLAGS_GC_PERCENT_MASK, cache->cache_info.flags);
return (cache->cache_info.flags & PCACHE_CACHE_FLAGS_DATA_CRC);
return FIELD_GET(PCACHE_CACHE_FLAGS_CACHE_MODE_MASK, cache->cache_info.flags);
cache->cache_info.flags &= ~PCACHE_CACHE_FLAGS_CACHE_MODE_MASK;
cache->cache_info.flags |= FIELD_PREP(PCACHE_CACHE_FLAGS_CACHE_MODE_MASK, cache_mode);
cache->cache_info.flags,
unsigned char cache_info:1;
} cache_info;