From 9f5a1556501d4acfb722f8b977d6f67ff2434bcb Mon Sep 17 00:00:00 2001 From: Scott Worley Date: Thu, 21 Dec 2017 15:00:28 -0500 Subject: ec_chip_mchp: Add MCHP TFDP trace debug files Add Microchip MEC17xx family trace fifo debug (TFDP) files. TFDP is a MCHP specific two pin, output only software message port. Added TFDP module ID. Change-Id: Ibe2399a8c3618b207a89552450d80b7901e85f23 Signed-off-by: Scott Worley --- chip/mchp/tfdp.c | 499 ++++++++++++++++++++++++++++++++++++++++++++++++++ chip/mchp/tfdp_chip.h | 131 +++++++++++++ 2 files changed, 630 insertions(+) create mode 100644 chip/mchp/tfdp.c create mode 100644 chip/mchp/tfdp_chip.h (limited to 'chip') diff --git a/chip/mchp/tfdp.c b/chip/mchp/tfdp.c new file mode 100644 index 0000000000..b4368b46a8 --- /dev/null +++ b/chip/mchp/tfdp.c @@ -0,0 +1,499 @@ +/* Copyright 2017 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/** @file tfdp.c + *MCHP Trace FIFO Data Port hardware access + */ +/** @defgroup MCHP Peripherals TFDP + * @{ + */ + +#include "common.h" +#include "gpio.h" +#include "registers.h" +#include "tfdp_chip.h" + +#ifdef CONFIG_MCHP_TFDP + + +static uint32_t get_disable_intr(void) +{ + uint32_t m; + + __asm__ __volatile__ ("mrs %0, primask;cpsid i" : "=r" (m)); + + return m; +} + +static void restore_intr(uint32_t m) +{ + if (!m) + __asm__ __volatile__ ("cpsie i" : : : "memory"); +} + + +/** + * tfdp_power - Gate clocks On/Off to TFDP block when idle + * + * @param pwr_on (0=Gate clocks when idle), (1=Do not gate + * clocks when idle) + */ +void tfdp_power(uint8_t pwr_on) +{ + if (pwr_on) + MCHP_PCR_SLP_DIS_DEV(MCHP_PCR_TFDP); + else + MCHP_PCR_SLP_EN_DEV(MCHP_PCR_TFDP); +} + + +/** + * tfdp_enable - Init Trace FIFO Data Port + * @param uint8_t non-zero=enable TFDP, false=disable TFDP + * @param uint8_t non-zero=change TFDP pin configuration. + * If TFDP is enabled then GPIO170/171 set to Alt. Func. 1 + * Else GPIO170/171 set to GPIO input, internal pull-up enabled. + * @note - + */ +#define MCHP_TFDP_DATA REG8(MCHP_TFDP_BASE + 0x00) +#define MCHP_TFDP_CTRL REG8(MCHP_TFDP_BASE + 0x04) + +void tfdp_enable(uint8_t en, uint8_t pin_cfg) +{ + if (en) { + MCHP_TFDP_CTRL = 0x01u; + if (pin_cfg) + gpio_config_module(MODULE_TFDP, 1); + } else { + MCHP_TFDP_CTRL = 0x00u; + if (pin_cfg) + gpio_config_module(MODULE_TFDP, 0); + } +} /* end tfdp_enable() */ + + +/** + * TFDPTrace0 - TRACE0: transmit 16-bit trace number lsb first + * over TFDP. + * + * @param nbr 16-bit trace number + * @param b unused + * + * @return uint8_t always TRUE + * @note Function implements critical section. + * Uses tool kit __disable_irq()/__enable_irq() pair which may use + * priviledged Cortex-Mx instructions. + */ +void TFDPTrace0(uint16_t nbr) +{ +#ifdef MCHP_TRACE_MASK_IRQ + uint32_t prim; + + prim = get_disable_intr(); +#endif + + MCHP_TFDP_DATA = (TFDP_FRAME_START); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)nbr; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(nbr >> 8); + TFDP_DELAY(); + +#ifdef MCHP_TRACE_MASK_IRQ + restore_intr(prim); +#endif +} + + +/** + * TRDPTrace1 - TRACE1: transmit 16-bit trace number lsb first + * and 16-bit data lsb first over TFDP. + * + * @param nbr 16-bit trace number + * @param b unused + * @param uint32_t p1 16-bit data1 in b[15:0] + * + * @return uint8_t always TRUE + * @note Function implements critical section. + * Uses tool kit __disable_irq()/__enable_irq() pair which may use + * priviledged Cortex-Mx instructions. + */ +void TFDPTrace1(uint16_t nbr, uint32_t p1) +{ +#ifdef MCHP_TRACE_MASK_IRQ + uint32_t prim; + + prim = get_disable_intr(); +#endif + + MCHP_TFDP_DATA = (TFDP_FRAME_START); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)nbr; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(nbr >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p1; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p1 >> 8); + TFDP_DELAY(); + +#ifdef MCHP_TRACE_MASK_IRQ + restore_intr(prim); +#endif +} + + +/** + * TFDPTrace2 - TRACE2: transmit 16-bit trace number lsb first + * and two 16-bit data parameters lsb first over TFDP. + * + * @param nbr trace number + * @param b unused + * @param uint32_t p1 16-bit data1 in b[15:0] + * @param uint32_t p2 16-bit data2 in b[15:0] + * + * @return uint8_t always TRUE + * @note Uses tool kit functions to save/disable/restore + * interrupts for critical section. These may use + * priviledged instructions. + */ +void TFDPTrace2(uint16_t nbr, uint32_t p1, uint32_t p2) +{ +#ifdef MCHP_TRACE_MASK_IRQ + uint32_t prim; + + prim = get_disable_intr(); +#endif + + MCHP_TFDP_DATA = (TFDP_FRAME_START); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)nbr; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(nbr >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p1; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p1 >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p2; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p2 >> 8); + TFDP_DELAY(); + +#ifdef MCHP_TRACE_MASK_IRQ + restore_intr(prim); +#endif +} + + +/** + * TFDPTrace3 - TRACE3: transmit 16-bit trace number lsb first + * and three 16-bit data parameters lsb first over TFDP. + * + * @param nbr trace number + * @param b unused + * @param uint32_t p1 16-bit data1 in b[15:0] + * @param uint32_t p2 16-bit data2 in b[15:0] + * @param uint32_t p3 16-bit data3 in b[15:0] + * + * @return uint8_t always TRUE + * @note Uses tool kit functions to save/disable/restore + * interrupts for critical section. These may use + * priviledged instructions. + */ +void TFDPTrace3(uint16_t nbr, uint32_t p1, + uint32_t p2, uint32_t p3) +{ +#ifdef MCHP_TRACE_MASK_IRQ + uint32_t prim; + + prim = get_disable_intr(); +#endif + + MCHP_TFDP_DATA = (TFDP_FRAME_START); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)nbr; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(nbr >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p1; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p1 >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p2; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p2 >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p3; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p3 >> 8); + TFDP_DELAY(); + +#ifdef MCHP_TRACE_MASK_IRQ + restore_intr(prim); +#endif +} + + +/** + * TFDPTrace4 - TRACE3: transmit 16-bit trace number lsb first + * and four 16-bit data parameters lsb first over TFDP. + * + * @param nbr trace number + * @param b unused + * @param uint32_t p1 16-bit data1 in b[15:0] + * @param uint32_t p2 16-bit data2 in b[15:0] + * @param uint32_t p3 16-bit data3 in b[15:0] + * @param uint32_t p4 16-bit data4 in b[15:0] + * + * @return uint8_t always TRUE + * @note Uses tool kit functions to save/disable/restore + * interrupts for critical section. These may use + * priviledged instructions. + */ +void TFDPTrace4(uint16_t nbr, uint32_t p1, uint32_t p2, + uint32_t p3, uint32_t p4) +{ +#ifdef MCHP_TRACE_MASK_IRQ + uint32_t prim; + + prim = get_disable_intr(); +#endif + + MCHP_TFDP_DATA = (TFDP_FRAME_START); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)nbr; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(nbr >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p1; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p1 >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p2; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p2 >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p3; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p3 >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p4; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p4 >> 8); + TFDP_DELAY(); + +#ifdef MCHP_TRACE_MASK_IRQ + restore_intr(prim); +#endif +} + + +/** + * TFDPTrace11 - Transmit one 32-bit data item over TFDP + * + * @param nbr trace number + * @param b unused + * @param uint32_t p1 32-bit data to be transmitted + * + */ +void TFDPTrace11(uint16_t nbr, uint32_t p1) +{ +#ifdef MCHP_TRACE_MASK_IRQ + uint32_t prim; + + prim = get_disable_intr(); +#endif + + MCHP_TFDP_DATA = (TFDP_FRAME_START); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)nbr; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(nbr >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p1; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p1 >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p1 >> 16); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p1 >> 24); + TFDP_DELAY(); + +#ifdef MCHP_TRACE_MASK_IRQ + restore_intr(prim); +#endif +} + + +/** + * TFDPTrace12 - Transmit two 32-bit data items over TFDP + * + * @param nbr trace number + * @param b unused + * @param uint32_t p1 32-bit data1 to be transmitted + * @param uint32_t p2 32-bit data2 to be transmitted + * + */ +void TFDPTrace12(uint16_t nbr, uint32_t p1, uint32_t p2) +{ +#ifdef MCHP_TRACE_MASK_IRQ + uint32_t prim; + + prim = get_disable_intr(); +#endif + + MCHP_TFDP_DATA = (TFDP_FRAME_START); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)nbr; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(nbr >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p1; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p1 >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p1 >> 16); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p1 >> 24); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p2; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p2 >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p2 >> 16); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p2 >> 24); + TFDP_DELAY(); + +#ifdef MCHP_TRACE_MASK_IRQ + restore_intr(prim); +#endif +} + +/** + * TFDPTrace13 - Transmit three 32-bit data items over TFDP + * + * @param nbr trace number + * @param b unused + * @param uint32_t p1 32-bit data1 to be transmitted + * @param uint32_t p2 32-bit data2 to be transmitted + * @param uint32_t p3 32-bit data3 to be transmitted + * + */ +void TFDPTrace13(uint16_t nbr, uint32_t p1, + uint32_t p2, uint32_t p3) +{ +#ifdef MCHP_TRACE_MASK_IRQ + uint32_t prim; + + prim = get_disable_intr(); +#endif + + MCHP_TFDP_DATA = (TFDP_FRAME_START); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)nbr; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(nbr >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p1; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p1 >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p1 >> 16); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p1 >> 24); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p2; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p2 >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p2 >> 16); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p2 >> 24); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p3; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p3 >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p3 >> 16); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p3 >> 24); + TFDP_DELAY(); + +#ifdef MCHP_TRACE_MASK_IRQ + restore_intr(prim); +#endif +} + +/** + * TFDPTrace14 - Transmit four 32-bit data items over TFDP + * + * @param nbr trace number + * @param b unused + * @param uint32_t p1 32-bit data1 to be transmitted + * @param uint32_t p2 32-bit data2 to be transmitted + * @param uint32_t p3 32-bit data3 to be transmitted + * @param uint32_t p4 32-bit data4 to be transmitted + */ +void TFDPTrace14(uint16_t nbr, uint32_t p1, uint32_t p2, + uint32_t p3, uint32_t p4) +{ +#ifdef MCHP_TRACE_MASK_IRQ + uint32_t prim; + + prim = get_disable_intr(); +#endif + + MCHP_TFDP_DATA = (TFDP_FRAME_START); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)nbr; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(nbr >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p1; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p1 >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p1 >> 16); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p1 >> 24); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p2; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p2 >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p2 >> 16); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p2 >> 24); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p3; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p3 >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p3 >> 16); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p3 >> 24); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)p4; + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p4 >> 8); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p4 >> 16); + TFDP_DELAY(); + MCHP_TFDP_DATA = (uint8_t)(p4 >> 24); + TFDP_DELAY(); + +#ifdef MCHP_TRACE_MASK_IRQ + restore_intr(prim); +#endif +} + +#endif /* #ifdef CONFIG_MCHP_TFDP */ + + +/* end tfdp.c */ +/** @} + */ diff --git a/chip/mchp/tfdp_chip.h b/chip/mchp/tfdp_chip.h new file mode 100644 index 0000000000..64d4d0b77e --- /dev/null +++ b/chip/mchp/tfdp_chip.h @@ -0,0 +1,131 @@ +/* Copyright 2017 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +/** @file tfdp_chip.h + *MCHP MEC TFDP Peripheral Library API + */ +/** @defgroup MCHP MEC Peripherals Trace + */ + +#ifndef _TFDP_CHIP_H +#define _TFDP_CHIP_H + +#include + + +#ifdef CONFIG_MCHP_TFDP + +#undef TRACE0 +#undef TRACE1 +#undef TRACE2 +#undef TRACE3 +#undef TRACE4 +#undef TRACE11 +#undef TRACE12 +#undef TRACE13 +#undef TRACE14 +#undef trace0 +#undef trace1 +#undef trace2 +#undef trace3 +#undef trace4 +#undef trace11 +#undef trace12 +#undef trace13 +#undef trace14 + +#define MCHP_TFDP_BASE_ADDR (0x40008c00ul) + +#define TFDP_FRAME_START (0xFD) + +#define TFDP_POWER_ON (1u) +#define TFDP_POWER_OFF (0u) + +#define TFDP_ENABLE (1u) +#define TFDP_DISABLE (0u) +#define TFDP_CFG_PINS (1u) +#define TFDP_NO_CFG_PINS (0u) + +#define MCHP_TRACE_MASK_IRQ + +#define TFDP_DELAY() + +#ifdef __cplusplus +extern "C" { +#endif + +void tfdp_power(uint8_t pwr_on); +void tfdp_enable(uint8_t en, uint8_t pin_cfg); +void TFDPTrace0(uint16_t nbr); +void TFDPTrace1(uint16_t nbr, uint32_t p1); +void TFDPTrace2(uint16_t nbr, uint32_t p1, + uint32_t p2); +void TFDPTrace3(uint16_t nbr, uint32_t p1, + uint32_t p2, uint32_t p3); +void TFDPTrace4(uint16_t nbr, uint32_t p1, uint32_t p2, + uint32_t p3, uint32_t p4); +void TFDPTrace11(uint16_t nbr, uint32_t p1); +void TFDPTrace12(uint16_t nbr, uint32_t p1, uint32_t p2); +void TFDPTrace13(uint16_t nbr, uint32_t p1, uint32_t p2, + uint32_t p3); +void TFDPTrace14(uint16_t nbr, uint32_t p1, uint32_t p2, + uint32_t p3, uint32_t p4); + +#ifdef __cplusplus +} +#endif + +#define TRACE0(nbr, cat, b, str) TFDPTrace0(nbr) +#define TRACE1(nbr, cat, b, str, p1) TFDPTrace1(nbr, p1) +#define TRACE2(nbr, cat, b, str, p1, p2) TFDPTrace2(nbr, p1, p2) +#define TRACE3(nbr, cat, b, str, p1, p2, p3) TFDPTrace3(nbr, p1, p2, p3) +#define TRACE4(nbr, cat, b, str, p1, p2, p3, p4) TFDPTrace4(nbr, p1, p2, \ + p3, p4) +#define TRACE11(nbr, cat, b, str, p1) TFDPTrace11(nbr, p1) +#define TRACE12(nbr, cat, b, str, p1, p2) TFDPTrace12(nbr, p1, p2) +#define TRACE13(nbr, cat, b, str, p1, p2, p3) TFDPTrace13(nbr, p1, p2, p3) +#define TRACE14(nbr, cat, b, str, p1, p2, p3, p4) \ + TFDPTrace14(nbr, p1, p2, p3, p4) + + +#else /* #ifdef MCHP_TRACE */ + +/* !!! To prevent compiler warnings of unused parameters, + * when trace is disabled by TRGEN source processing, + * you can either: + * 1. Disable compiler's unused parameter warning + * 2. Change these macros to write parameters to a read-only + * register. + */ +#define tfdp_power(pwr_on) +#define tfdp_enable(en, pin_cfg) +#define TRACE0(nbr, cat, b, str) +#define TRACE1(nbr, cat, b, str, p1) +#define TRACE2(nbr, cat, b, str, p1, p2) +#define TRACE3(nbr, cat, b, str, p1, p2, p3) +#define TRACE4(nbr, cat, b, str, p1, p2, p3, p4) +#define TRACE11(nbr, cat, b, str, p1) +#define TRACE12(nbr, cat, b, str, p1, p2) +#define TRACE13(nbr, cat, b, str, p1, p2, p3) +#define TRACE14(nbr, cat, b, str, p1, p2, p3, p4) + +#endif /* #ifdef CONFIG_MCHP_TFDP */ + +/* + * Always define lower case traceN(...) as blank (fully removed) + */ +#define trace0(nbr, cat, b, str) +#define trace1(nbr, cat, b, str, p1) +#define trace2(nbr, cat, b, str, p1, p2) +#define trace3(nbr, cat, b, str, p1, p2, p3) +#define trace4(nbr, cat, b, str, p1, p2, p3, p4) +#define trace11(nbr, cat, b, str, p1) +#define trace12(nbr, cat, b, str, p1, p2) +#define trace13(nbr, cat, b, str, p1, p2, p3) +#define trace14(nbr, cat, b, str, p1, p2, p3, p4) + +#endif /* #ifndef _TFDP_CHIP_H */ +/* end tfdp_chip.h */ +/** @} + */ -- cgit v1.2.1