Skip to content

Commit

Permalink
Merge pull request #332 from sifive/l2cc-kiwi-cherrypick
Browse files Browse the repository at this point in the history
l2cc,l2pf kiwi cherrypick
  • Loading branch information
bsousi5 authored Sep 2, 2020
2 parents 0ba18c5 + a62943a commit 4afda0c
Show file tree
Hide file tree
Showing 10 changed files with 707 additions and 196 deletions.
4 changes: 2 additions & 2 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,13 @@ nobase_include_HEADERS += \
metal/drivers/sifive_fe310-g000_lfrosc.h \
metal/drivers/sifive_fe310-g000_pll.h \
metal/drivers/sifive_fe310-g000_prci.h \
metal/drivers/sifive_fu540-c000_l2.h \
metal/drivers/sifive_global-external-interrupts0.h \
metal/drivers/sifive_gpio-buttons.h \
metal/drivers/sifive_gpio-leds.h \
metal/drivers/sifive_gpio-switches.h \
metal/drivers/sifive_gpio0.h \
metal/drivers/sifive_i2c0.h \
metal/drivers/sifive_l2pf0.h \
metal/drivers/sifive_local-external-interrupts0.h \
metal/drivers/sifive_pwm0.h \
metal/drivers/sifive_rtc0.h \
Expand Down Expand Up @@ -115,13 +115,13 @@ libmetal_a_SOURCES = \
src/drivers/sifive_fe310-g000_lfrosc.c \
src/drivers/sifive_fe310-g000_pll.c \
src/drivers/sifive_fe310-g000_prci.c \
src/drivers/sifive_fu540-c000_l2.c \
src/drivers/sifive_global-external-interrupts0.c \
src/drivers/sifive_gpio-buttons.c \
src/drivers/sifive_gpio-leds.c \
src/drivers/sifive_gpio-switches.c \
src/drivers/sifive_gpio0.c \
src/drivers/sifive_i2c0.c \
src/drivers/sifive_l2pf0.c \
src/drivers/sifive_local-external-interrupts0.c \
src/drivers/sifive_pwm0.c \
src/drivers/sifive_rtc0.c \
Expand Down
13 changes: 6 additions & 7 deletions Makefile.in

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

44 changes: 31 additions & 13 deletions metal/cache.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright 2018 SiFive, Inc */
/* Copyright 2020 SiFive, Inc */
/* SPDX-License-Identifier: Apache-2.0 */

#ifndef METAL__CACHE_H
Expand All @@ -11,50 +11,68 @@
*/
#include <stdint.h>

struct metal_cache;

struct __metal_cache_vtable {
void (*init)(struct metal_cache *cache, int ways);
int (*get_enabled_ways)(struct metal_cache *cache);
int (*set_enabled_ways)(struct metal_cache *cache, int ways);
};

/*!
* @brief a handle for a cache
* Note: To be deprecated in next release.
*/
struct metal_cache {
const struct __metal_cache_vtable *vtable;
uint8_t __no_empty_structs;
};

/*!
* @brief Initialize L2 cache controller.
* Enables all available cache ways.
* @param None
* @return 0 If no error
*/
int metal_l2cache_init(void);

/*!
* @brief Get the current number of enabled L2 cache ways
* @param None
* @return The current number of enabled L2 cache ways
*/
int metal_l2cache_get_enabled_ways(void);

/*!
* @brief Enable the requested number of L2 cache ways
* @param ways Number of ways to enable
* @return 0 if the ways are successfully enabled
*/
int metal_l2cache_set_enabled_ways(int ways);

/*!
* @brief Initialize a cache
* @param cache The handle for the cache to initialize
* @param ways The number of ways to enable
*
* Initializes a cache with the requested number of ways enabled.
* Note: API to be deprecated in next release.
*/
__inline__ void metal_cache_init(struct metal_cache *cache, int ways) {
cache->vtable->init(cache, ways);
metal_l2cache_init();
}

/*!
* @brief Get the current number of enabled cache ways
* @param cache The handle for the cache
* @return The current number of enabled cache ways
* Note: API to be deprecated in next release.
*/
__inline__ int metal_cache_get_enabled_ways(struct metal_cache *cache) {
return cache->vtable->get_enabled_ways(cache);
return metal_l2cache_get_enabled_ways();
}

/*!
* @brief Enable the requested number of cache ways
* @param cache The handle for the cache
* @param ways The number of ways to enabled
* @return 0 if the ways are successfully enabled
* Note: API to be deprecated in next release.
*/
__inline__ int metal_cache_set_enabled_ways(struct metal_cache *cache,
int ways) {
return cache->vtable->set_enabled_ways(cache, ways);
return metal_l2cache_set_enabled_ways(ways);
}

/*!
Expand Down
139 changes: 128 additions & 11 deletions metal/drivers/sifive_ccache0.h
Original file line number Diff line number Diff line change
@@ -1,22 +1,139 @@
/* Copyright 2019 SiFive, Inc */
/* Copyright 2020 SiFive, Inc */
/* SPDX-License-Identifier: Apache-2.0 */

#ifndef METAL__DRIVERS__SIFIVE_CCACHE0_H
#define METAL__DRIVERS__SIFIVE_CCACHE0_H

#include <metal/cache.h>
#include <metal/compiler.h>
/*!
* @file sifive_ccache0.h
*
* @brief API for configuring the SiFive L2 cache controller
*/

struct __metal_driver_vtable_sifive_ccache0 {
struct __metal_cache_vtable cache;
};
#include <metal/interrupt.h>
#include <stdint.h>

struct __metal_driver_sifive_ccache0;
/*! @brief Cache configuration data */
typedef struct {
uint32_t num_bank;
uint32_t num_ways;
uint32_t num_sets;
uint32_t block_size;
} sifive_ccache0_config;

__METAL_DECLARE_VTABLE(__metal_driver_vtable_sifive_ccache0)
/*! @brief Set of values for ECC error type */
typedef enum {
SIFIVE_CCACHE0_DATA = 0,
SIFIVE_CCACHE0_DIR = 1,
} sifive_ccache0_ecc_errtype_t;

struct __metal_driver_sifive_ccache0 {
struct metal_cache cache;
};
/*! @brief Initialize cache controller, enables all available
* cache-ways.
* @param None.
* @return 0 If no error.*/
int sifive_ccache0_init(void);

/*! @brief Get cache configuration data.
* @param config User specified data buffer.
* @return None.*/
void sifive_ccache0_get_config(sifive_ccache0_config *config);

/*! @brief Get currently active cache ways.
* @param None.
* @return Number of cache ways enabled.*/
uint32_t sifive_ccache0_get_enabled_ways(void);

/*! @brief Enable specified cache ways.
* @param ways Number of ways to be enabled.
* @return 0 If no error.*/
int sifive_ccache0_set_enabled_ways(uint32_t ways);

/*! @brief Inject ECC error into data or meta-data.
* @param bitindex Bit index to be corrupted on next cache operation.
* @param type ECC error target location.
* @return None.*/
void sifive_ccache0_inject_ecc_error(uint32_t bitindex,
sifive_ccache0_ecc_errtype_t type);

/*! @brief Flush out entire cache block containing given address.
* @param flush_addr Address for the cache block to be flushed.
* @return None.*/
void sifive_ccache0_flush(uintptr_t flush_addr);

/*! @brief Get most recently ECC corrected address.
* @param type ECC error target location.
* @return Last corrected ECC address.*/
uintptr_t sifive_ccache0_get_ecc_fix_addr(sifive_ccache0_ecc_errtype_t type);

/*! @brief Get number of times ECC errors were corrected.
* Clears related ECC interrupt signals.
* @param type ECC error target location.
* @return Corrected ECC error count.*/
uint32_t sifive_ccache0_get_ecc_fix_count(sifive_ccache0_ecc_errtype_t type);

/*! @brief Get address location of most recent uncorrected ECC error.
* @param type ECC error target location.
* @return Last uncorrected ECC address.*/
uintptr_t sifive_ccache0_get_ecc_fail_addr(sifive_ccache0_ecc_errtype_t type);

/*! @brief Get number of times ECC errors were not corrected.
* Clears related ECC interrupt signals.
* @param type ECC error target location.
* @return Uncorrected ECC error count.*/
uint32_t sifive_ccache0_get_ecc_fail_count(sifive_ccache0_ecc_errtype_t type);

/*! @brief Get currently active way enable mask value for the given master ID.
* @param master_id Cache controller master ID.
* @return Way enable mask. */
uint64_t sifive_ccache0_get_way_mask(uint32_t master_id);

/*! @brief Set way enable mask for the given master ID.
* @param master_id Cache controller master ID.
* @param waymask Specify ways to be enabled.
* @return 0 If no error.*/
int sifive_ccache0_set_way_mask(uint32_t master_id, uint64_t waymask);

/*! @brief Select cache performance events to be counted.
* @param counter Cache performance monitor counter index.
* @param mask Event selection mask.
* @return None.*/
void sifive_ccache0_set_pmevent_selector(uint32_t counter, uint64_t mask);

/*! @brief Get currently set events for the given counter index.
* @param counter Cache performance monitor counter index.
* @return Event selection mask.*/
uint64_t sifive_ccache0_get_pmevent_selector(uint32_t counter);

/*! @brief Clears specified cache performance counter.
* @param counter Cache performance monitor counter index.
* @return None.*/
void sifive_ccache0_clr_pmevent_counter(uint32_t counter);

/*! @brief Reads specified cache performance counter.
* @param counter Cache performance monitor counter index.
* @return Counter value.*/
uint64_t sifive_ccache0_get_pmevent_counter(uint32_t counter);

/*! @brief Select cache clients to be excluded from performance monitoring.
* @param mask Client disable mask.
* @return None.*/
void sifive_ccache0_set_client_filter(uint64_t mask);

/*! @brief Get currently set cache client disable mask.
* @param None.
* @return Client disable mask.*/
uint64_t sifive_ccache0_get_client_filter(void);

/*! @brief Get interrupt IDs for the cache controller.
* @param src Interrupt trigger source index.
* @return Interrupt id.*/
int sifive_ccache0_get_interrupt_id(uint32_t src);

/*! @brief Get interrupt controller of the cache.
* The interrupt controller must be initialized before any interrupts can be
* registered or enabled with it.
* @param None.
* @return Handle for the interrupt controller.*/
struct metal_interrupt *sifive_ccache0_interrupt_controller(void);

#endif
22 changes: 0 additions & 22 deletions metal/drivers/sifive_fu540-c000_l2.h

This file was deleted.

Loading

0 comments on commit 4afda0c

Please sign in to comment.