diff options
author | David Hendricks <dhendricks@fb.com> | 2018-03-09 13:58:27 -0800 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2018-04-06 06:48:11 +0000 |
commit | 2004b93aed993aa02bbc588b8d82c22418ac52ec (patch) | |
tree | cdd5e95a154e2e0139474288262835a7f5847665 /src/vendorcode/cavium/include/bdk/libbdk-os | |
parent | 71cbd71eb5c0e8e13b25b5d5dd2f495e7d2967eb (diff) | |
download | coreboot-2004b93aed993aa02bbc588b8d82c22418ac52ec.tar.xz |
soc/cavium: import raw BDK sources
This imports common BDK sources that will be used in subsequent
patches.
The BDK is licensed under BSD and will be reduced in size and optimized to
compile under coreboot.
Change-Id: Icb32ee670d9fa9e5c10f9abb298cebf616fa67ad
Signed-off-by: David Hendricks <dhendricks@fb.com>
Reviewed-on: https://review.coreboot.org/25524
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: David Hendricks <david.hendricks@gmail.com>
Diffstat (limited to 'src/vendorcode/cavium/include/bdk/libbdk-os')
-rw-r--r-- | src/vendorcode/cavium/include/bdk/libbdk-os/bdk-init.h | 194 | ||||
-rw-r--r-- | src/vendorcode/cavium/include/bdk/libbdk-os/bdk-thread.h | 122 |
2 files changed, 316 insertions, 0 deletions
diff --git a/src/vendorcode/cavium/include/bdk/libbdk-os/bdk-init.h b/src/vendorcode/cavium/include/bdk/libbdk-os/bdk-init.h new file mode 100644 index 0000000000..834f8970f1 --- /dev/null +++ b/src/vendorcode/cavium/include/bdk/libbdk-os/bdk-init.h @@ -0,0 +1,194 @@ +/***********************license start*********************************** +* Copyright (c) 2003-2017 Cavium Inc. (support@cavium.com). All rights +* reserved. +* +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are +* met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* +* * Neither the name of Cavium Inc. nor the names of +* its contributors may be used to endorse or promote products +* derived from this software without specific prior written +* permission. +* +* This Software, including technical data, may be subject to U.S. export +* control laws, including the U.S. Export Administration Act and its +* associated regulations, and may be subject to export or import +* regulations in other countries. +* +* TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" +* AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR +* WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT +* TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY +* REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT +* DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES +* OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR +* PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, +* QUIET POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK +* ARISING OUT OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. +***********************license end**************************************/ + +/** + * @file + * + * Core initialization functions + * + * <hr>$Revision: 49448 $<hr> + * + * @defgroup thread Threading library + * @{ + */ + +/** + * Call this function to take secondary cores out of reset and have + * them start running threads + * + * @param node Node to use in a Numa setup. Can be an exact ID or a special + * value. + * @param coremask Cores to start. Zero is a shortcut for all. + * + * @return Zero on success, negative on failure. + */ +extern int bdk_init_cores(bdk_node_t node, uint64_t coremask); + +/** + * Put cores back in reset and power them down + * + * @param node Node to update + * @param coremask Each bit will be a core put in reset. Cores already in reset are unaffected + * + * @return Zero on success, negative on failure + */ +extern int bdk_reset_cores(bdk_node_t node, uint64_t coremask); + +/** + * Call this function to take secondary nodes and cores out of + * reset and have them start running threads + * + * @param skip_cores If non-zero, cores are not started. Only the nodes are setup + * @param ccpi_sw_gbaud + * If CCPI is in software mode, this is the speed the CCPI QLMs will be configured + * for + * + * @return Zero on success, negative on failure. + */ +extern int bdk_init_nodes(int skip_cores, int ccpi_sw_gbaud); + +/** + * Called very early in during init of both the master and slave. It performs one + * time init of CCPI QLM and link parameters. It must only be called once per + * boot. + * + * @param is_master Non-zero if the caller is the master node + */ +extern void __bdk_init_ccpi_early(int is_master); + +/** + * Brings the CCPI lanes and links into an operational state without perofrming + * node discovery and enumeration. After this function succeeds, CCPI lanes and + * links are ready for traffic, but node routing has not been setup. + * + * Note this function runs on the slave node with the BDK code not at its link + * address. Many normal BDK functions do not work properly. Be careful. + * + * @param is_master Non-zero when run on the master node. Zero when run on the slave + * @param gbaud Baud rate to run links at. This is only used if the QLMs are in software init + * mode. If they are strapped for hardware init, the strapping speed is used. + * @param ccpi_trace Non-zero to enable CCPI tracing. Note that tracing doesn't use the standard + * bdk-trace functions. This code runs on the secondary node before we are + * multi-node, and the C library doesn't work right. + * + * @return Zero on success, negative on failure. Zero means CCPI lanes and links are + * functional. + */ +extern int __bdk_init_ccpi_connection(int is_master, uint64_t gbaud, int ccpi_trace); + +/** + * Brings the CCPI lanes and links into an operational state without enabling + * multi-node operation. Calling this function when the CCPI links are already + * up does nothing. This function must return zero before you can go multi-node + * by calling bdk_init_ccpi_multinode(). + * + * @param gbaud Baud rate to run links at. This is only used if the QLMs are in software init + * mode. If they are strapped for hardware init, the strapping speed is used. + * + * @return Zero on success, negative on failure. Zero means all CCPI links are functional. + */ +extern int __bdk_init_ccpi_links(uint64_t gbaud) BDK_WEAK; + +/** + * Once CCPI links are operational, this function transitions the system to a + * multi-node setup. Note that this function only performs the low level CCPI + * details, not BDK software setup on the other nodes. Call bdk_init_nodes() + * for high level access to multi-node. + * + * @return Zero on success, negative on failure + */ +extern int __bdk_init_ccpi_multinode(void) BDK_WEAK; + +/** + * This function is the first function run on all cores once the + * threading system takes over. + * + * @param arg + * @param arg1 + */ +extern void __bdk_init_main(int arg, void *arg1); + +/** + * Perform one time initialization for a node. Called for each + * node from the master node. + */ +extern void __bdk_init_node(bdk_node_t node); + +/** + * Set the baud rate on a UART + * + * @param node Node to use in a Numa setup. Can be an exact ID or a special + * value. + * @param uart uart to set + * @param baudrate Baud rate (9600, 19200, 115200, etc) + * @param use_flow_control + * Non zero if hardware flow control should be enabled + */ +extern void bdk_set_baudrate(bdk_node_t node, int uart, int baudrate, int use_flow_control); + +/** + * Get the coremask of the cores actively running the BDK. Doesn't count cores + * that aren't booted. + * + * @param node Node to coremask the count for + * + * @return 64bit bitmask + */ +extern uint64_t bdk_get_running_coremask(bdk_node_t node); + +/** + * Return the number of cores actively running in the BDK for the given node + * + * @param node Node to get the core count for + * + * @return Number of cores running. Doesn't count cores that aren't booted + */ +extern int bdk_get_num_running_cores(bdk_node_t node); + +#ifndef BDK_SHOW_BOOT_BANNERS +#define BDK_SHOW_BOOT_BANNERS 1 +#endif + +#define BDK_UART_BAUDRATE 115200 +//#define BDK_UART_BAUDRATE 921600 + +extern uint64_t __bdk_init_reg_x0; /* The contents of X0 when this image started */ +extern uint64_t __bdk_init_reg_x1; /* The contents of X1 when this image started */ + +/** @} */ diff --git a/src/vendorcode/cavium/include/bdk/libbdk-os/bdk-thread.h b/src/vendorcode/cavium/include/bdk/libbdk-os/bdk-thread.h new file mode 100644 index 0000000000..ef62dd7fe3 --- /dev/null +++ b/src/vendorcode/cavium/include/bdk/libbdk-os/bdk-thread.h @@ -0,0 +1,122 @@ +/***********************license start*********************************** +* Copyright (c) 2003-2017 Cavium Inc. (support@cavium.com). All rights +* reserved. +* +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are +* met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* +* * Neither the name of Cavium Inc. nor the names of +* its contributors may be used to endorse or promote products +* derived from this software without specific prior written +* permission. +* +* This Software, including technical data, may be subject to U.S. export +* control laws, including the U.S. Export Administration Act and its +* associated regulations, and may be subject to export or import +* regulations in other countries. +* +* TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" +* AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR +* WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT +* TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY +* REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT +* DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES +* OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR +* PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, +* QUIET POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK +* ARISING OUT OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. +***********************license end**************************************/ + +/** + * @file + * + * Functions for controlling threads. + * + * <hr>$Revision: 49448 $<hr> + * + * @defgroup thread Threading library + * @{ + */ + +/* Use a larger stack size for main() as it tends to do lots of + extra stuff. For example, DDR init requires a bigger stack */ +#define BDK_THREAD_MAIN_STACK_SIZE 16384 +#define BDK_THREAD_DEFAULT_STACK_SIZE 8192 + +typedef void (*bdk_thread_func_t)(int arg, void *arg1); + +extern int bdk_thread_initialize(void); +extern void bdk_thread_yield(void); +extern int bdk_thread_create(bdk_node_t node, uint64_t coremask, bdk_thread_func_t func, int arg0, void *arg1, int stack_size); +extern void bdk_thread_destroy(void) __attribute__ ((noreturn)); +extern void bdk_thread_first(bdk_thread_func_t func, int arg0, void *arg1, int stack_size) __attribute__ ((noreturn)); + +/** + * Number of the Core on which the program is currently running. + * + * @return Number of cores + */ +static inline int bdk_get_core_num(void) __attribute__ ((always_inline)); +static inline int bdk_get_core_num(void) +{ + if (CAVIUM_IS_MODEL(CAVIUM_CN8XXX)) + { + int mpidr_el1; + BDK_MRS(MPIDR_EL1, mpidr_el1); + /* Core is 4 bits from AFF0 and rest from AFF1 */ + int core_num; + core_num = mpidr_el1 & 0xf; + core_num |= (mpidr_el1 & 0xff00) >> 4; + return core_num; + } + else + { + uint64_t cvm_pn_el1; + BDK_MRS(s3_0_c11_c4_2, cvm_pn_el1); + return cvm_pn_el1 & 0xffff; + } +} + +/** + * Return a mask representing this core in a 64bit bitmask + * + * @return + */ +static inline uint64_t bdk_core_to_mask(void) __attribute__ ((always_inline)); +static inline uint64_t bdk_core_to_mask(void) +{ + return 1ull << bdk_get_core_num(); +} + +static inline int bdk_is_boot_core(void) +{ + const int master = 0x80000000 | (bdk_numa_master() << 16); + int mpidr_el1; + BDK_MRS_NV(MPIDR_EL1, mpidr_el1); + return mpidr_el1 == master; +} + + +static inline void *bdk_thread_get_id(void) __attribute__ ((always_inline)); +static inline void *bdk_thread_get_id(void) +{ + uint64_t current; + BDK_MRS_NV(TPIDR_EL3, current); + /* If we haven't started threading yet use the core number. Add one + so the thread id is never zero */ + if (!current) + current = bdk_get_core_num() + 1; + return (void*)current; +} + +/** @} */ |