source: rtems/bsps/sparc/leon3/start/cache.c @ 2c07f24

Last change on this file since 2c07f24 was 2c07f24, checked in by Sebastian Huber <sebastian.huber@…>, on 06/10/21 at 11:04:13

grlib: Add ambapp_plb()

Replace the global variable ambapp_plb with a function to allow an automatic on
demand initialization.

  • Property mode set to 100644
File size: 3.5 KB
Line 
1/*
2 * Copyright (c) 2014 embedded brains GmbH.  All rights reserved.
3 *
4 *  embedded brains GmbH
5 *  Dornierstr. 4
6 *  82178 Puchheim
7 *  Germany
8 *  <rtems@embedded-brains.de>
9 *
10 * The license and distribution terms for this file may be
11 * found in the file LICENSE in this distribution or at
12 * http://www.rtems.org/license/LICENSE.
13 */
14
15#include <amba.h>
16#include <leon.h>
17
18#define CPU_CACHE_SUPPORT_PROVIDES_RANGE_FUNCTIONS
19
20#define CPU_CACHE_SUPPORT_PROVIDES_CACHE_SIZE_FUNCTIONS
21
22#define CPU_CACHE_NO_INSTRUCTION_CACHE_SNOOPING
23
24#define CPU_INSTRUCTION_CACHE_ALIGNMENT 64
25
26#define CPU_DATA_CACHE_ALIGNMENT 64
27
28static inline volatile struct l2c_regs *get_l2c_regs(void)
29{
30  volatile struct l2c_regs *l2c = NULL;
31  struct ambapp_dev *adev;
32
33  adev = (void *) ambapp_for_each(
34    ambapp_plb(),
35    OPTIONS_ALL | OPTIONS_AHB_SLVS,
36    VENDOR_GAISLER,
37    GAISLER_L2CACHE,
38    ambapp_find_by_idx,
39    NULL
40  );
41  if (adev != NULL) {
42    l2c = (volatile struct l2c_regs *) DEV_TO_AHB(adev)->start[1];
43  }
44
45  return l2c;
46}
47
48static inline size_t get_l2_size(void)
49{
50  size_t size = 0;
51  volatile struct l2c_regs *l2c = get_l2c_regs();
52
53  if (l2c != NULL) {
54    unsigned status = l2c->status;
55    unsigned ways = (status & 0x3) + 1;
56    unsigned set_size = ((status & 0x7ff) >> 2) * 1024;
57
58    size = ways * set_size;
59  }
60
61  return size;
62}
63
64static inline size_t get_l1_size(uint32_t l1_cfg)
65{
66  uint32_t ways = ((l1_cfg >> 24) & 0x7) + 1;
67  uint32_t wsize = UINT32_C(1) << (((l1_cfg >> 20) & 0xf) + 10);
68
69  return ways * wsize;
70}
71
72static inline size_t get_max_size(size_t a, size_t b)
73{
74  return a < b ? b : a;
75}
76
77static inline size_t get_cache_size(uint32_t level, uint32_t l1_cfg)
78{
79  size_t size;
80
81  switch (level) {
82    case 0:
83      size = get_max_size(get_l1_size(l1_cfg), get_l2_size());
84      break;
85    case 1:
86      size = get_l1_size(l1_cfg);
87      break;
88    case 2:
89      size = get_l2_size();
90      break;
91    default:
92      size = 0;
93      break;
94  }
95
96  return size;
97}
98
99static inline size_t _CPU_cache_get_data_cache_size(uint32_t level)
100{
101  return get_cache_size(level, leon3_get_data_cache_config_register());
102}
103
104static inline void _CPU_cache_flush_data_range(
105  const void *d_addr,
106  size_t n_bytes
107)
108{
109  /* TODO */
110}
111
112static inline void _CPU_cache_invalidate_data_range(
113  const void *d_addr,
114  size_t n_bytes
115)
116{
117  /* TODO */
118}
119
120static inline void _CPU_cache_freeze_data(void)
121{
122  /* TODO */
123}
124
125static inline void _CPU_cache_unfreeze_data(void)
126{
127  /* TODO */
128}
129
130static inline void _CPU_cache_invalidate_entire_instruction(void)
131{
132  uint32_t cache_reg = leon3_get_cache_control_register();
133
134  cache_reg |= LEON3_REG_CACHE_CTRL_FI;
135  leon3_set_cache_control_register(cache_reg);
136}
137
138static inline void _CPU_cache_invalidate_instruction_range(
139  const void *i_addr,
140  size_t n_bytes
141)
142{
143  _CPU_cache_invalidate_entire_instruction();
144}
145
146static inline void _CPU_cache_freeze_instruction(void)
147{
148  /* TODO */
149}
150
151static inline void _CPU_cache_unfreeze_instruction(void)
152{
153  /* TODO */
154}
155
156static inline void _CPU_cache_flush_entire_data(void)
157{
158  /* TODO */
159}
160
161static inline void _CPU_cache_invalidate_entire_data(void)
162{
163  /* TODO */
164}
165
166static inline void _CPU_cache_enable_data(void)
167{
168  /* TODO */
169}
170
171static inline void _CPU_cache_disable_data(void)
172{
173  /* TODO */
174}
175
176static inline size_t _CPU_cache_get_instruction_cache_size( uint32_t level )
177{
178  return get_cache_size(level, leon3_get_inst_cache_config_register());
179}
180
181static inline void _CPU_cache_enable_instruction(void)
182{
183  /* TODO */
184}
185
186static inline void _CPU_cache_disable_instruction(void)
187{
188  /* TODO */
189}
190
191#include "../../../shared/cache/cacheimpl.h"
Note: See TracBrowser for help on using the repository browser.