| /* Copyright 2017 The ChromiumOS Authors |
| * 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 */ |
| /** @} |
| */ |