/* Copyright (c) 2014 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. * * Register map for NPCX processor */ #ifndef __CROS_EC_REGISTERS_H #define __CROS_EC_REGISTERS_H #include "common.h" /******************************************************************************/ /* * Macro Functions */ /* Bit functions */ #define SET_BIT(reg, bit) ((reg) |= (0x1 << (bit))) #define CLEAR_BIT(reg, bit) ((reg) &= (~(0x1 << (bit)))) #define IS_BIT_SET(reg, bit) ((reg >> bit) & (0x1)) #define UPDATE_BIT(reg, bit, cond) { if (cond) \ SET_BIT(reg, bit); \ else \ CLEAR_BIT(reg, bit); } /* Field functions */ #define GET_POS_FIELD(pos, size) pos #define GET_SIZE_FIELD(pos, size) size #define FIELD_POS(field) GET_POS_##field #define FIELD_SIZE(field) GET_SIZE_##field /* Read field functions */ #define GET_FIELD(reg, field) \ _GET_FIELD_(reg, FIELD_POS(field), FIELD_SIZE(field)) #define _GET_FIELD_(reg, f_pos, f_size) (((reg)>>(f_pos)) & ((1<<(f_size))-1)) /* Write field functions */ #define SET_FIELD(reg, field, value) \ _SET_FIELD_(reg, FIELD_POS(field), FIELD_SIZE(field), value) #define _SET_FIELD_(reg, f_pos, f_size, value) \ ((reg) = ((reg) & (~(((1 << (f_size))-1) << (f_pos)))) \ | ((value) << (f_pos))) /******************************************************************************/ /* * NPCX (Nuvoton M4 EC) Register Definitions */ /* Global Definition */ #define I2C_7BITS_ADDR 0 /* Switcher of features */ #define SUPPORT_LCT 1 #define SUPPORT_WDG 1 #define SUPPORT_HIB 1 #define SUPPORT_P80_SEG 0 /* Note: it uses KSO10 & KSO11 */ /* Switcher of debugging */ #define DEBUG_GPIO 0 #define DEBUG_I2C 0 #define DEBUG_TMR 0 #define DEBUG_WDG 0 #define DEBUG_FAN 0 #define DEBUG_PWM 0 #define DEBUG_SPI 0 #define DEBUG_FLH 0 #define DEBUG_PECI 0 #define DEBUG_SHI 0 #define DEBUG_CLK 0 #define DEBUG_LPC 0 #define DEBUG_ESPI 0 /* Modules Map */ #define NPCX_ESPI_BASE_ADDR 0x4000A000 #define NPCX_MDC_BASE_ADDR 0x4000C000 #define NPCX_PMC_BASE_ADDR 0x4000D000 #define NPCX_SIB_BASE_ADDR 0x4000E000 #define NPCX_SHI_BASE_ADDR 0x4000F000 #define NPCX_SHM_BASE_ADDR 0x40010000 #define NPCX_GDMA_BASE_ADDR 0x40011000 #define NPCX_FIU_BASE_ADDR 0x40020000 #define NPCX_KBSCAN_REGS_BASE 0x400A3000 #define NPCX_GLUE_REGS_BASE 0x400A5000 #define NPCX_BBRAM_BASE_ADDR 0x400AF000 #define NPCX_HFCG_BASE_ADDR 0x400B5000 #define NPCX_LFCG_BASE_ADDR 0x400B5100 #define NPCX_MTC_BASE_ADDR 0x400B7000 #define NPCX_MSWC_BASE_ADDR 0x400C1000 #define NPCX_SCFG_BASE_ADDR 0x400C3000 #define NPCX_CR_UART_BASE_ADDR 0x400C4000 #define NPCX_KBC_BASE_ADDR 0x400C7000 #define NPCX_ADC_BASE_ADDR 0x400D1000 #define NPCX_SPI_BASE_ADDR 0x400D2000 #define NPCX_PECI_BASE_ADDR 0x400D4000 #define NPCX_TWD_BASE_ADDR 0x400D8000 /* Multi-Modules Map */ #define NPCX_PWM_BASE_ADDR(mdl) (0x40080000 + ((mdl) * 0x2000L)) #define NPCX_GPIO_BASE_ADDR(mdl) (0x40081000 + ((mdl) * 0x2000L)) #define NPCX_ITIM16_BASE_ADDR(mdl) (0x400B0000 + ((mdl) * 0x2000L)) #define NPCX_ITIM32_BASE_ADDR 0x400BC000 #define NPCX_MIWU_BASE_ADDR(mdl) (0x400BB000 + ((mdl) * 0x2000L)) #define NPCX_MFT_BASE_ADDR(mdl) (0x400E1000 + ((mdl) * 0x2000L)) #define NPCX_PM_CH_BASE_ADDR(mdl) (0x400C9000 + ((mdl) * 0x2000L)) #if defined(CHIP_FAMILY_NPCX7) #define NPCX_SMB_BASE_ADDR(mdl) (((mdl) < 2) ? \ (0x40009000 + ((mdl) * 0x2000L)) : \ ((mdl) < 4) ? \ (0x400C0000 + (((mdl) - 2) * 0x2000L)) : \ ((mdl) == 4) ? \ (0x40008000) : \ (0x40017000 + (((mdl) - 5) * 0x1000L))) #else #define NPCX_SMB_BASE_ADDR(mdl) (((mdl) < 2) ? \ (0x40009000 + ((mdl) * 0x2000L)) : \ (0x400C0000 + (((mdl) - 2) * 0x2000L))) #endif /* * NPCX-IRQ numbers */ #define NPCX_IRQ_0 0 #define NPCX_IRQ_1 1 #define NPCX_IRQ_2 2 #define NPCX_IRQ_3 3 #define NPCX_IRQ_4 4 #define NPCX_IRQ_5 5 #define NPCX_IRQ_6 6 #define NPCX_IRQ_7 7 #define NPCX_IRQ_8 8 #define NPCX_IRQ_9 9 #define NPCX_IRQ_10 10 #define NPCX_IRQ_11 11 #define NPCX_IRQ_12 12 #define NPCX_IRQ_13 13 #define NPCX_IRQ_14 14 #define NPCX_IRQ_15 15 #define NPCX_IRQ_16 16 #define NPCX_IRQ_17 17 #define NPCX_IRQ_18 18 #define NPCX_IRQ_19 19 #define NPCX_IRQ_20 20 #define NPCX_IRQ_21 21 #define NPCX_IRQ_22 22 #define NPCX_IRQ_23 23 #define NPCX_IRQ_24 24 #define NPCX_IRQ_25 25 #define NPCX_IRQ_26 26 #define NPCX_IRQ_27 27 #define NPCX_IRQ_28 28 #define NPCX_IRQ_29 29 #define NPCX_IRQ_30 30 #define NPCX_IRQ_31 31 #define NPCX_IRQ_32 32 #define NPCX_IRQ_33 33 #define NPCX_IRQ_34 34 #define NPCX_IRQ_35 35 #define NPCX_IRQ_36 36 #define NPCX_IRQ_37 37 #define NPCX_IRQ_38 38 #define NPCX_IRQ_39 39 #define NPCX_IRQ_40 40 #define NPCX_IRQ_41 41 #define NPCX_IRQ_42 42 #define NPCX_IRQ_43 43 #define NPCX_IRQ_44 44 #define NPCX_IRQ_45 45 #define NPCX_IRQ_46 46 #define NPCX_IRQ_47 47 #define NPCX_IRQ_48 48 #define NPCX_IRQ_49 49 #define NPCX_IRQ_50 50 #define NPCX_IRQ_51 51 #define NPCX_IRQ_52 52 #define NPCX_IRQ_53 53 #define NPCX_IRQ_54 54 #define NPCX_IRQ_55 55 #define NPCX_IRQ_56 56 #define NPCX_IRQ_57 57 #define NPCX_IRQ_58 58 #define NPCX_IRQ_59 59 #define NPCX_IRQ_60 60 #define NPCX_IRQ_61 61 #define NPCX_IRQ_62 62 #define NPCX_IRQ_63 63 #define NPCX_IRQ0_NOUSED NPCX_IRQ_0 #define NPCX_IRQ1_NOUSED NPCX_IRQ_1 #define NPCX_IRQ_KBSCAN NPCX_IRQ_2 #define NPCX_IRQ_PM_CHAN_OBE NPCX_IRQ_3 #define NPCX_IRQ_PECI NPCX_IRQ_4 #define NPCX_IRQ5_NOUSED NPCX_IRQ_5 #define NPCX_IRQ_PORT80 NPCX_IRQ_6 #define NPCX_IRQ_MTC_WKINTAD_0 NPCX_IRQ_7 #define NPCX_IRQ_SMB8 NPCX_IRQ_8 #define NPCX_IRQ_MFT_1 NPCX_IRQ_9 #define NPCX_IRQ_ADC NPCX_IRQ_10 #define NPCX_IRQ_WKINTEFGH_0 NPCX_IRQ_11 #define NPCX_IRQ_CDMA NPCX_IRQ_12 #define NPCX_IRQ_SMB1 NPCX_IRQ_13 #define NPCX_IRQ_SMB2 NPCX_IRQ_14 #define NPCX_IRQ_WKINTC_0 NPCX_IRQ_15 #define NPCX_IRQ_SMB7 NPCX_IRQ_16 #define NPCX_IRQ_ITIM16_3 NPCX_IRQ_17 #define NPCX_IRQ_SHI NPCX_IRQ_18 #define NPCX_IRQ_ESPI NPCX_IRQ_18 #define NPCX_IRQ_SMB5 NPCX_IRQ_19 #define NPCX_IRQ_SMB6 NPCX_IRQ_20 #define NPCX_IRQ_PS2 NPCX_IRQ_21 #define NPCX_IRQ22_NOUSED NPCX_IRQ_22 #define NPCX_IRQ_MFT_2 NPCX_IRQ_23 #define NPCX_IRQ_SHM NPCX_IRQ_24 #define NPCX_IRQ_KBC_IBF NPCX_IRQ_25 #define NPCX_IRQ_PM_CHAN_IBF NPCX_IRQ_26 #define NPCX_IRQ_ITIM16_2 NPCX_IRQ_27 #define NPCX_IRQ_ITIM16_1 NPCX_IRQ_28 #define NPCX_IRQ29_NOUSED NPCX_IRQ_29 #define NPCX_IRQ30_NOUSED NPCX_IRQ_30 #define NPCX_IRQ_TWD_WKINTB_0 NPCX_IRQ_31 #define NPCX_IRQ32_NOUSED NPCX_IRQ_32 #define NPCX_IRQ_UART NPCX_IRQ_33 #define NPCX_IRQ34_NOUSED NPCX_IRQ_34 #define NPCX_IRQ35_NOUSED NPCX_IRQ_35 #define NPCX_IRQ_SMB3 NPCX_IRQ_36 #define NPCX_IRQ_SMB4 NPCX_IRQ_37 #define NPCX_IRQ38_NOUSED NPCX_IRQ_38 #define NPCX_IRQ39_NOUSED NPCX_IRQ_39 #define NPCX_IRQ40_NOUSED NPCX_IRQ_40 #define NPCX_IRQ_MFT_3 NPCX_IRQ_41 #define NPCX_IRQ42_NOUSED NPCX_IRQ_42 #define NPCX_IRQ_ITIM16_4 NPCX_IRQ_43 #define NPCX_IRQ_ITIM16_5 NPCX_IRQ_44 #define NPCX_IRQ_ITIM16_6 NPCX_IRQ_45 #define NPCX_IRQ_ITIM32 NPCX_IRQ_46 #define NPCX_IRQ_WKINTA_1 NPCX_IRQ_47 #define NPCX_IRQ_WKINTB_1 NPCX_IRQ_48 #define NPCX_IRQ_KSI_WKINTC_1 NPCX_IRQ_49 #define NPCX_IRQ_WKINTD_1 NPCX_IRQ_50 #define NPCX_IRQ_WKINTE_1 NPCX_IRQ_51 #define NPCX_IRQ_WKINTF_1 NPCX_IRQ_52 #define NPCX_IRQ_WKINTG_1 NPCX_IRQ_53 #define NPCX_IRQ_WKINTH_1 NPCX_IRQ_54 #define NPCX_IRQ55_NOUSED NPCX_IRQ_55 #define NPCX_IRQ_KBC_OBE NPCX_IRQ_56 #define NPCX_IRQ_SPI NPCX_IRQ_57 #define NPCX_IRQ58_NOUSED NPCX_IRQ_58 #define NPCX_IRQ_WKINTFG_2 NPCX_IRQ_59 #define NPCX_IRQ_WKINTA_2 NPCX_IRQ_60 #define NPCX_IRQ_WKINTB_2 NPCX_IRQ_61 #define NPCX_IRQ_WKINTC_2 NPCX_IRQ_62 #define NPCX_IRQ_WKINTD_2 NPCX_IRQ_63 #define NPCX_IRQ_COUNT 64 /******************************************************************************/ /* Miscellaneous Device Control (MDC) registers */ #define NPCX_FWCTRL REG8(NPCX_MDC_BASE_ADDR + 0x007) /* MDC register fields */ #define NPCX_FWCTRL_RO_REGION 0 #define NPCX_FWCTRL_FW_SLOT 1 /******************************************************************************/ /* High Frequency Clock Generator (HFCG) registers */ #define NPCX_HFCGCTRL REG8(NPCX_HFCG_BASE_ADDR + 0x000) #define NPCX_HFCGML REG8(NPCX_HFCG_BASE_ADDR + 0x002) #define NPCX_HFCGMH REG8(NPCX_HFCG_BASE_ADDR + 0x004) #define NPCX_HFCGN REG8(NPCX_HFCG_BASE_ADDR + 0x006) #define NPCX_HFCGP REG8(NPCX_HFCG_BASE_ADDR + 0x008) #define NPCX_HFCBCD REG8(NPCX_HFCG_BASE_ADDR + 0x010) #if defined(CHIP_FAMILY_NPCX7) #define NPCX_HFCBCD1 REG8(NPCX_HFCG_BASE_ADDR + 0x012) #define NPCX_HFCBCD2 REG8(NPCX_HFCG_BASE_ADDR + 0x014) #endif /* HFCG register fields */ #define NPCX_HFCGCTRL_LOAD 0 #define NPCX_HFCGCTRL_LOCK 2 #define NPCX_HFCGCTRL_CLK_CHNG 7 /******************************************************************************/ /* Low Frequency Clock Generator (LFCG) registers */ #define NPCX_LFCGCTL REG8(NPCX_LFCG_BASE_ADDR + 0x000) #define NPCX_HFRDI REG16(NPCX_LFCG_BASE_ADDR + 0x002) #define NPCX_HFRDF REG16(NPCX_LFCG_BASE_ADDR + 0x004) #define NPCX_FRCDIV REG16(NPCX_LFCG_BASE_ADDR + 0x006) #define NPCX_DIVCOR1 REG16(NPCX_LFCG_BASE_ADDR + 0x008) #define NPCX_DIVCOR2 REG16(NPCX_LFCG_BASE_ADDR + 0x00A) #define NPCX_LFCGCTL2 REG8(NPCX_LFCG_BASE_ADDR + 0x014) /* LFCG register fields */ #define NPCX_LFCGCTL_XTCLK_VAL 7 #define NPCX_LFCGCTL2_XT_OSC_SL_EN 6 /******************************************************************************/ /*CR UART Register */ #define NPCX_UTBUF REG8(NPCX_CR_UART_BASE_ADDR + 0x000) #define NPCX_URBUF REG8(NPCX_CR_UART_BASE_ADDR + 0x002) #define NPCX_UICTRL REG8(NPCX_CR_UART_BASE_ADDR + 0x004) #define NPCX_USTAT REG8(NPCX_CR_UART_BASE_ADDR + 0x006) #define NPCX_UFRS REG8(NPCX_CR_UART_BASE_ADDR + 0x008) #define NPCX_UMDSL REG8(NPCX_CR_UART_BASE_ADDR + 0x00A) #define NPCX_UBAUD REG8(NPCX_CR_UART_BASE_ADDR + 0x00C) #define NPCX_UPSR REG8(NPCX_CR_UART_BASE_ADDR + 0x00E) /******************************************************************************/ /* KBSCAN registers */ #define NPCX_KBSIN REG8(NPCX_KBSCAN_REGS_BASE + 0x04) #define NPCX_KBSINPU REG8(NPCX_KBSCAN_REGS_BASE + 0x05) #define NPCX_KBSOUT0 REG16(NPCX_KBSCAN_REGS_BASE + 0x06) #define NPCX_KBSOUT1 REG16(NPCX_KBSCAN_REGS_BASE + 0x08) #define NPCX_KBS_BUF_INDX REG8(NPCX_KBSCAN_REGS_BASE + 0x0A) #define NPCX_KBS_BUF_DATA REG8(NPCX_KBSCAN_REGS_BASE + 0x0B) #define NPCX_KBSEVT REG8(NPCX_KBSCAN_REGS_BASE + 0x0C) #define NPCX_KBSCTL REG8(NPCX_KBSCAN_REGS_BASE + 0x0D) #define NPCX_KBS_CFG_INDX REG8(NPCX_KBSCAN_REGS_BASE + 0x0E) #define NPCX_KBS_CFG_DATA REG8(NPCX_KBSCAN_REGS_BASE + 0x0F) /* KBSCAN register fields */ #define NPCX_KBSBUFINDX 0 #define NPCX_KBSDONE 0 #define NPCX_KBSERR 1 #define NPCX_KBSSTART 0 #define NPCX_KBSMODE 1 #define NPCX_KBSIEN 2 #define NPCX_KBSINC 3 #if defined(CHIP_FAMILY_NPCX7) #define NPCX_KBHDRV_FIELD FIELD(6, 2) #endif #define NPCX_KBSCFGINDX 0 /* KBSCAN definitions */ #define KB_ROW_NUM 8 /* Rows numbers of keyboard matrix */ #define KB_COL_NUM 18 /* Columns numbers of keyboard matrix */ #define KB_ROW_MASK ((1<= 0 && i <= 1) ? ESPI_VW_TYPE_INT_EV : \ (i >= 2 && i <= 7) ? ESPI_VW_TYPE_SYS_EV : \ (i >= 64 && i <= 127) ? ESPI_VW_TYPE_PLT : \ (i >= 128 && i <= 255) ? ESPI_VW_TYPE_GPIO : \ ESPI_VW_TYPE_NONE) /* Bit filed manipulation for VWEVMS Value */ #define VWEVMS_INX(i) ((i<<8) & 0x00007F00) #define VWEVMS_INX_EN(n) ((n<<15) & 0x00008000) #define VWEVMS_PLTRST_EN(p) ((p<<17) & 0x00020000) #define VWEVMS_INT_EN(e) ((e<<18) & 0x00040000) #define VWEVMS_ESPIRST_EN(r) ((r<<19) & 0x00080000) #define VWEVMS_FIELD(i, n, p, e, r) (VWEVMS_INX(i) | VWEVMS_INX_EN(n) | \ VWEVMS_PLTRST_EN(p) | VWEVMS_INT_EN(e) | \ VWEVMS_ESPIRST_EN(r)) #define VWEVMS_IDX_GET(reg) (((reg & 0x00007F00)>>8)) /* Bit filed manipulation for VWEVSM Value */ #define VWEVSM_VALID_N(v) ((v<<4) & 0x000000F0) #define VWEVSM_INX(i) ((i<<8) & 0x00007F00) #define VWEVSM_INX_EN(n) ((n<<15) & 0x00008000) #define VWEVSM_DIRTY(d) ((d<<16) & 0x00010000) #define VWEVSM_PLTRST_EN(p) ((p<<17) & 0x00020000) #define VWEVSM_CDRST_EN(c) ((c<<19) & 0x00080000) #define VWEVSM_FIELD(i, n, v, p, c) (VWEVSM_INX(i) | VWEVSM_INX_EN(n) | \ VWEVSM_VALID_N(v) | VWEVSM_PLTRST_EN(p) |\ VWEVSM_CDRST_EN(c)) #define VWEVSM_IDX_GET(reg) (((reg & 0x00007F00)>>8)) /* Bit filed manpulation for VWGPMS Value */ #define VWGPMS_INX_EN(n) (((n<<15) & 0x00008000)) #define VWGPMS_MODIFIED(m) (((m<<16) & 0x00010000)) #define VWGPMS_PLTRST_EN(p) (((p<<17) & 0x00020000)) #define VWGPMS_INT_EN(e) (((e<<18) & 0x00040000)) #define VWGPMS_FIELD(n, m, p, e) (VMGPMS_INX_EN(n) | VWGPMS_MODIFIED(m) | \ VWGPMS_PLTRST_EN(p) | VWGPMS_INT_EN(e)) /* define macro to handle SMI/SCI Virtual Wire */ /* Read SMI VWire status from VWEVSM(offset 2) register. */ #define SMI_STATUS_MASK ((uint8_t) (NPCX_VWEVSM(2) & 0x00000002)) /* * Read SCI VWire status from VWEVSM(offset 2) register. * Left shift 2 to meet the SCIB filed in HIPMIC register. */ #define SCI_STATUS_MASK (((uint8_t) (NPCX_VWEVSM(2) & 0x00000001)) << 2) #define SCIB_MASK(v) (v << NPCX_HIPMIC_SCIB) #define SMIB_MASK(v) (v << NPCX_HIPMIC_SMIB) #define NPCX_VW_SCI(level) ((NPCX_HIPMIC(PM_CHAN_1) & 0xF9) | \ SMI_STATUS_MASK | SCIB_MASK(level)) #define NPCX_VW_SMI(level) ((NPCX_HIPMIC(PM_CHAN_1) & 0xF9) | \ SCI_STATUS_MASK | SMIB_MASK(level)) /* eSPI enumeration */ /* eSPI channels */ enum { NPCX_ESPI_CH_PC = 0, NPCX_ESPI_CH_VW, NPCX_ESPI_CH_OOB, NPCX_ESPI_CH_FLASH, NPCX_ESPI_CH_COUNT, NPCX_ESPI_CH_GENERIC, NPCX_ESPI_CH_NONE = 0xFF }; /* eSPI IO modes */ enum { NPCX_ESPI_IO_MODE_SINGLE = 0, NPCX_ESPI_IO_MODE_DUAL = 1, NPCX_ESPI_IO_MODE_Quad = 2, NPCX_ESPI_IO_MODE_ALL = 3, NPCX_ESPI_IO_MODE_NONE = 0xFF }; /* eSPI max supported frequency */ enum { NPCX_ESPI_MAXFREQ_20 = 0, NPCX_ESPI_MAXFREQ_25 = 1, NPCX_ESPI_MAXFREQ_33 = 2, NPCX_ESPI_MAXFREQ_50 = 3, NPCX_ESPI_MAXFREQ_66 = 4, NPCX_ESPI_MAXFREQ_NOOE = 0xFF }; /* VW types */ enum { ESPI_VW_TYPE_INT_EV, /* Interrupt event */ ESPI_VW_TYPE_SYS_EV, /* System Event */ ESPI_VW_TYPE_PLT, /* Platform specific */ ESPI_VW_TYPE_GPIO, /* General Purpose I/O Expander */ ESPI_VW_TYPE_NUM, ESPI_VW_TYPE_NONE = 0xFF }; /******************************************************************************/ /* GDMA (General DMA) Registers */ #define NPCX_GDMA_CTL REG32(NPCX_GDMA_BASE_ADDR + 0x000) #define NPCX_GDMA_SRCB REG32(NPCX_GDMA_BASE_ADDR + 0x004) #define NPCX_GDMA_DSTB REG32(NPCX_GDMA_BASE_ADDR + 0x008) #define NPCX_GDMA_TCNT REG32(NPCX_GDMA_BASE_ADDR + 0x00C) #define NPCX_GDMA_CSRC REG32(NPCX_GDMA_BASE_ADDR + 0x010) #define NPCX_GDMA_CDST REG32(NPCX_GDMA_BASE_ADDR + 0x014) #define NPCX_GDMA_CTCNT REG32(NPCX_GDMA_BASE_ADDR + 0x018) /******************************************************************************/ /* GDMA register fields */ #define NPCX_GDMA_CTL_GDMAEN 0 #define NPCX_GDMA_CTL_GDMAMS FIELD(2, 2) #define NPCX_GDMA_CTL_DADIR 4 #define NPCX_GDMA_CTL_SADIR 5 #define NPCX_GDMA_CTL_SAFIX 7 #define NPCX_GDMA_CTL_SIEN 8 #define NPCX_GDMA_CTL_BME 9 #define NPCX_GDMA_CTL_SBMS 11 #define NPCX_GDMA_CTL_TWS FIELD(12, 2) #define NPCX_GDMA_CTL_DM 15 #define NPCX_GDMA_CTL_SOFTREQ 16 #define NPCX_GDMA_CTL_TC 18 #define NPCX_GDMA_CTL_GDMAERR 20 #define NPCX_GDMA_CTL_BLOCK_BUG_CORRECTION_DISABLE 26 /******************************************************************************/ /* Nuvoton internal used only registers */ #define NPCX_INTERNAL_CTRL1 REG8(0x400DB000) #define NPCX_INTERNAL_CTRL2 REG8(0x400DD000) #define NPCX_INTERNAL_CTRL3 REG8(0x400DF000) /******************************************************************************/ /* Optional M4 Registers */ #define CPU_DHCSR REG32(0xE000EDF0) #define CPU_MPU_CTRL REG32(0xE000ED94) #define CPU_MPU_RNR REG32(0xE000ED98) #define CPU_MPU_RBAR REG32(0xE000ED9C) #define CPU_MPU_RASR REG32(0xE000EDA0) /******************************************************************************/ /* Flash Utiltiy definition */ /* * Flash commands for the W25Q16CV SPI flash */ #define CMD_READ_ID 0x9F #define CMD_READ_MAN_DEV_ID 0x90 #define CMD_WRITE_EN 0x06 #define CMD_WRITE_STATUS 0x50 #define CMD_READ_STATUS_REG 0x05 #define CMD_READ_STATUS_REG2 0x35 #define CMD_WRITE_STATUS_REG 0x01 #define CMD_FLASH_PROGRAM 0x02 #define CMD_SECTOR_ERASE 0x20 #define CMD_PROGRAM_UINT_SIZE 0x08 #define CMD_PAGE_SIZE 0x00 #define CMD_READ_ID_TYPE 0x47 #define CMD_FAST_READ 0x0B /* * Status registers for the W25Q16CV SPI flash */ #define SPI_FLASH_SR2_SUS (1 << 7) #define SPI_FLASH_SR2_CMP (1 << 6) #define SPI_FLASH_SR2_LB3 (1 << 5) #define SPI_FLASH_SR2_LB2 (1 << 4) #define SPI_FLASH_SR2_LB1 (1 << 3) #define SPI_FLASH_SR2_QE (1 << 1) #define SPI_FLASH_SR2_SRP1 (1 << 0) #define SPI_FLASH_SR1_SRP0 (1 << 7) #define SPI_FLASH_SR1_SEC (1 << 6) #define SPI_FLASH_SR1_TB (1 << 5) #define SPI_FLASH_SR1_BP2 (1 << 4) #define SPI_FLASH_SR1_BP1 (1 << 3) #define SPI_FLASH_SR1_BP0 (1 << 2) #define SPI_FLASH_SR1_WEL (1 << 1) #define SPI_FLASH_SR1_BUSY (1 << 0) /* 0: F_CS0 1: F_CS1_1(GPIO86) 2:F_CS1_2(GPIOA6) */ #define FIU_CHIP_SELECT 0 /* Create UMA control mask */ #define MASK(bit) (0x1 << (bit)) #define A_SIZE 0x03 /* 0: No ADR field 1: 3-bytes ADR field */ #define C_SIZE 0x04 /* 0: 1-Byte CMD field 1:No CMD field */ #define RD_WR 0x05 /* 0: Read 1: Write */ #define DEV_NUM 0x06 /* 0: PVT is used 1: SHD is used */ #define EXEC_DONE 0x07 #define D_SIZE_1 0x01 #define D_SIZE_2 0x02 #define D_SIZE_3 0x03 #define D_SIZE_4 0x04 #define FLASH_SEL MASK(DEV_NUM) #define MASK_CMD_ONLY (MASK(EXEC_DONE) | FLASH_SEL) #define MASK_CMD_ADR (MASK(EXEC_DONE) | FLASH_SEL | MASK(A_SIZE)) #define MASK_CMD_ADR_WR (MASK(EXEC_DONE) | FLASH_SEL | MASK(RD_WR) \ |MASK(A_SIZE) | D_SIZE_1) #define MASK_RD_1BYTE (MASK(EXEC_DONE) | FLASH_SEL | MASK(C_SIZE) | D_SIZE_1) #define MASK_RD_2BYTE (MASK(EXEC_DONE) | FLASH_SEL | MASK(C_SIZE) | D_SIZE_2) #define MASK_RD_3BYTE (MASK(EXEC_DONE) | FLASH_SEL | MASK(C_SIZE) | D_SIZE_3) #define MASK_RD_4BYTE (MASK(EXEC_DONE) | FLASH_SEL | MASK(C_SIZE) | D_SIZE_4) #define MASK_CMD_RD_1BYTE (MASK(EXEC_DONE) | FLASH_SEL | D_SIZE_1) #define MASK_CMD_RD_2BYTE (MASK(EXEC_DONE) | FLASH_SEL | D_SIZE_2) #define MASK_CMD_RD_3BYTE (MASK(EXEC_DONE) | FLASH_SEL | D_SIZE_3) #define MASK_CMD_RD_4BYTE (MASK(EXEC_DONE) | FLASH_SEL | D_SIZE_4) #define MASK_CMD_WR_ONLY (MASK(EXEC_DONE) | FLASH_SEL | MASK(RD_WR)) #define MASK_CMD_WR_1BYTE (MASK(EXEC_DONE) | FLASH_SEL | MASK(RD_WR) \ | MASK(C_SIZE) | D_SIZE_1) #define MASK_CMD_WR_2BYTE (MASK(EXEC_DONE) | FLASH_SEL | MASK(RD_WR) \ | MASK(C_SIZE) | D_SIZE_2) #define MASK_CMD_WR_ADR (MASK(EXEC_DONE) | FLASH_SEL | MASK(RD_WR) \ | MASK(A_SIZE)) /******************************************************************************/ /* Inline functions */ /* This routine checks pending bit of GPIO wake-up functionality */ #if defined(CHIP_FAMILY_NPCX5) static inline int uart_is_wakeup_from_gpio(void) { #if NPCX_UART_MODULE2 return IS_BIT_SET(NPCX_WKPND(1, 6), 4); #else return IS_BIT_SET(NPCX_WKPND(1, 1), 0); #endif } /* This routine checks wake-up functionality from GPIO is enabled or not */ static inline int uart_is_enable_wakeup(void) { #if NPCX_UART_MODULE2 return IS_BIT_SET(NPCX_WKEN(1, 6), 4); #else return IS_BIT_SET(NPCX_WKEN(1, 1), 0); #endif } /* This routine clears the pending wake-up from GPIO on UART rx pin */ static inline void uart_clear_pending_wakeup(void) { #if NPCX_UART_MODULE2 SET_BIT(NPCX_WKPCL(1, 6), 4); #else SET_BIT(NPCX_WKPCL(1, 1), 0); #endif } /* This routine enables wake-up functionality from GPIO on UART rx pin */ static inline void uart_enable_wakeup(int enable) { #if NPCX_UART_MODULE2 UPDATE_BIT(NPCX_WKEN(1, 6), 4, enable); #else UPDATE_BIT(NPCX_WKEN(1, 1), 0, enable); #endif } /* This routine checks functionality is UART rx or not */ static inline int npcx_is_uart(void) { #if NPCX_UART_MODULE2 return IS_BIT_SET(NPCX_DEVALT(0x0C), NPCX_DEVALTC_UART_SL2); #else return IS_BIT_SET(NPCX_DEVALT(0x0A), NPCX_DEVALTA_UART_SL1); #endif } /* This routine switches the functionality from UART rx to GPIO */ static inline void npcx_uart2gpio(void) { #if NPCX_UART_MODULE2 UPDATE_BIT(NPCX_WKEDG(1, 6), 4, 1); CLEAR_BIT(NPCX_DEVALT(0x0C), NPCX_DEVALTC_UART_SL2); #else UPDATE_BIT(NPCX_WKEDG(1, 1), 0, 1); CLEAR_BIT(NPCX_DEVALT(0x0A), NPCX_DEVALTA_UART_SL1); #endif } #endif /* This routine switches the functionality from GPIO to UART rx */ static inline void npcx_gpio2uart(void) { #if NPCX_UART_MODULE2 CLEAR_BIT(NPCX_DEVALT(0x0A), NPCX_DEVALTA_UART_SL1); SET_BIT(NPCX_DEVALT(0x0C), NPCX_DEVALTC_UART_SL2); #else #if defined(CHIP_FAMILY_NPCX7) /* UART module 1 belongs to KSO since wake-up functionality in npcx7. */ CLEAR_BIT(NPCX_DEVALT(0x09), NPCX_DEVALT9_NO_KSO09_SL); #endif SET_BIT(NPCX_DEVALT(0x0A), NPCX_DEVALTA_UART_SL1); #endif } /* Wake pin definitions, defined at board-level */ extern const enum gpio_signal hibernate_wake_pins[]; extern const int hibernate_wake_pins_used; #endif /* __CROS_EC_REGISTERS_H */