mirror of
https://github.com/revyos/th1520-vendor-uboot.git
synced 2026-06-21 09:02:25 +02:00
Linux_SDK_V0.9.5
This commit is contained in:
4
include/.gitignore
vendored
Normal file
4
include/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
/autoconf.mk*
|
||||
/bmp_logo.h
|
||||
/bmp_logo_data.h
|
||||
/config.h
|
||||
79
include/ACEX1K.h
Normal file
79
include/ACEX1K.h
Normal file
@@ -0,0 +1,79 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2003
|
||||
* Steven Scholz, imc Measurement & Control, steven.scholz@imc-berlin.de
|
||||
*
|
||||
* (C) Copyright 2002
|
||||
* Rich Ireland, Enterasys Networks, rireland@enterasys.com.
|
||||
*/
|
||||
|
||||
#ifndef _ACEX1K_H_
|
||||
#define _ACEX1K_H_
|
||||
|
||||
#include <altera.h>
|
||||
|
||||
extern int ACEX1K_load(Altera_desc *desc, const void *image, size_t size);
|
||||
extern int ACEX1K_dump(Altera_desc *desc, const void *buf, size_t bsize);
|
||||
extern int ACEX1K_info(Altera_desc *desc);
|
||||
|
||||
extern int CYC2_load(Altera_desc *desc, const void *image, size_t size);
|
||||
extern int CYC2_dump(Altera_desc *desc, const void *buf, size_t bsize);
|
||||
extern int CYC2_info(Altera_desc *desc);
|
||||
|
||||
/* Slave Serial Implementation function table */
|
||||
typedef struct {
|
||||
Altera_pre_fn pre;
|
||||
Altera_config_fn config;
|
||||
Altera_clk_fn clk;
|
||||
Altera_status_fn status;
|
||||
Altera_done_fn done;
|
||||
Altera_data_fn data;
|
||||
Altera_abort_fn abort;
|
||||
Altera_post_fn post;
|
||||
} Altera_ACEX1K_Passive_Serial_fns;
|
||||
|
||||
/* Slave Serial Implementation function table */
|
||||
typedef struct {
|
||||
Altera_pre_fn pre;
|
||||
Altera_config_fn config;
|
||||
Altera_status_fn status;
|
||||
Altera_done_fn done;
|
||||
Altera_write_fn write;
|
||||
Altera_abort_fn abort;
|
||||
Altera_post_fn post;
|
||||
} Altera_CYC2_Passive_Serial_fns;
|
||||
|
||||
/* Device Image Sizes
|
||||
*********************************************************************/
|
||||
/* ACEX1K */
|
||||
/* FIXME: Which size do we mean?
|
||||
* Datasheet says 1337000/8=167125Bytes,
|
||||
* Filesize of an *.rbf file is 166965 Bytes
|
||||
*/
|
||||
#if 0
|
||||
#define Altera_EP1K100_SIZE 1337000/8 /* 167125 Bytes */
|
||||
#endif
|
||||
#define Altera_EP1K100_SIZE (166965*8)
|
||||
|
||||
#define Altera_EP2C8_SIZE 247942
|
||||
#define Altera_EP2C20_SIZE 586562
|
||||
#define Altera_EP2C35_SIZE 883905
|
||||
#define Altera_EP3C5_SIZE 368011 /* .rbf size in bytes */
|
||||
|
||||
#define ALTERA_EP4CE6_SIZE 368011 /* 2944088 Bits */
|
||||
#define ALTERA_EP4CE10_SIZE 368011 /* 2944088 Bits */
|
||||
#define ALTERA_EP4CE15_SIZE 510856 /* 4086848 Bits */
|
||||
#define ALTERA_EP4CE22_SIZE 718569 /* 5748552 Bits */
|
||||
#define ALTERA_EP4CE30_SIZE 1191788 /* 9534304 Bits */
|
||||
#define ALTERA_EP4CE40_SIZE 1191788 /* 9534304 Bits */
|
||||
#define ALTERA_EP4CE55_SIZE 1861195 /* 14889560 Bits */
|
||||
#define ALTERA_EP4CE75_SIZE 2495719 /* 19965752 Bits */
|
||||
#define ALTERA_EP4CE115_SIZE 3571462 /* 28571696 Bits */
|
||||
|
||||
/* Descriptor Macros
|
||||
*********************************************************************/
|
||||
/* ACEX1K devices */
|
||||
#define Altera_EP1K100_DESC(iface, fn_table, cookie) \
|
||||
{ Altera_ACEX1K, iface, Altera_EP1K100_SIZE, fn_table, cookie }
|
||||
|
||||
#endif /* _ACEX1K_H_ */
|
||||
369
include/MCD_dma.h
Normal file
369
include/MCD_dma.h
Normal file
@@ -0,0 +1,369 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2004-2007 Freescale Semiconductor, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _MCD_API_H
|
||||
#define _MCD_API_H
|
||||
|
||||
/* Turn Execution Unit tasks ON (#define) or OFF (#undef) */
|
||||
#undef MCD_INCLUDE_EU
|
||||
|
||||
/* Number of DMA channels */
|
||||
#define NCHANNELS 16
|
||||
|
||||
/* Total number of variants */
|
||||
#ifdef MCD_INCLUDE_EU
|
||||
#define NUMOFVARIANTS 6
|
||||
#else
|
||||
#define NUMOFVARIANTS 4
|
||||
#endif
|
||||
|
||||
/* Define sizes of the various tables */
|
||||
#define TASK_TABLE_SIZE (NCHANNELS*32)
|
||||
#define VAR_TAB_SIZE (128)
|
||||
#define CONTEXT_SAVE_SIZE (128)
|
||||
#define FUNCDESC_TAB_SIZE (256)
|
||||
|
||||
#ifdef MCD_INCLUDE_EU
|
||||
#define FUNCDESC_TAB_NUM 16
|
||||
#else
|
||||
#define FUNCDESC_TAB_NUM 1
|
||||
#endif
|
||||
|
||||
#ifndef DEFINESONLY
|
||||
|
||||
/* Portability typedefs */
|
||||
#if 1
|
||||
#include "common.h"
|
||||
#else
|
||||
#ifndef s32
|
||||
typedef int s32;
|
||||
#endif
|
||||
#ifndef u32
|
||||
typedef unsigned int u32;
|
||||
#endif
|
||||
#ifndef s16
|
||||
typedef short s16;
|
||||
#endif
|
||||
#ifndef u16
|
||||
typedef unsigned short u16;
|
||||
#endif
|
||||
#ifndef s8
|
||||
typedef char s8;
|
||||
#endif
|
||||
#ifndef u8
|
||||
typedef unsigned char u8;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* These structures represent the internal registers of the
|
||||
* multi-channel DMA
|
||||
*/
|
||||
struct dmaRegs_s {
|
||||
u32 taskbar; /* task table base address */
|
||||
u32 currPtr;
|
||||
u32 endPtr;
|
||||
u32 varTablePtr;
|
||||
u16 dma_rsvd0;
|
||||
u16 ptdControl; /* ptd control */
|
||||
u32 intPending; /* interrupt pending */
|
||||
u32 intMask; /* interrupt mask */
|
||||
u16 taskControl[16]; /* task control */
|
||||
u8 priority[32]; /* priority */
|
||||
u32 initiatorMux; /* initiator mux control */
|
||||
u32 taskSize0; /* task size control 0. */
|
||||
u32 taskSize1; /* task size control 1. */
|
||||
u32 dma_rsvd1; /* reserved */
|
||||
u32 dma_rsvd2; /* reserved */
|
||||
u32 debugComp1; /* debug comparator 1 */
|
||||
u32 debugComp2; /* debug comparator 2 */
|
||||
u32 debugControl; /* debug control */
|
||||
u32 debugStatus; /* debug status */
|
||||
u32 ptdDebug; /* priority task decode debug */
|
||||
u32 dma_rsvd3[31]; /* reserved */
|
||||
};
|
||||
typedef volatile struct dmaRegs_s dmaRegs;
|
||||
|
||||
#endif
|
||||
|
||||
/* PTD contrl reg bits */
|
||||
#define PTD_CTL_TSK_PRI 0x8000
|
||||
#define PTD_CTL_COMM_PREFETCH 0x0001
|
||||
|
||||
/* Task Control reg bits and field masks */
|
||||
#define TASK_CTL_EN 0x8000
|
||||
#define TASK_CTL_VALID 0x4000
|
||||
#define TASK_CTL_ALWAYS 0x2000
|
||||
#define TASK_CTL_INIT_MASK 0x1f00
|
||||
#define TASK_CTL_ASTRT 0x0080
|
||||
#define TASK_CTL_HIPRITSKEN 0x0040
|
||||
#define TASK_CTL_HLDINITNUM 0x0020
|
||||
#define TASK_CTL_ASTSKNUM_MASK 0x000f
|
||||
|
||||
/* Priority reg bits and field masks */
|
||||
#define PRIORITY_HLD 0x80
|
||||
#define PRIORITY_PRI_MASK 0x07
|
||||
|
||||
/* Debug Control reg bits and field masks */
|
||||
#define DBG_CTL_BLOCK_TASKS_MASK 0xffff0000
|
||||
#define DBG_CTL_AUTO_ARM 0x00008000
|
||||
#define DBG_CTL_BREAK 0x00004000
|
||||
#define DBG_CTL_COMP1_TYP_MASK 0x00003800
|
||||
#define DBG_CTL_COMP2_TYP_MASK 0x00000070
|
||||
#define DBG_CTL_EXT_BREAK 0x00000004
|
||||
#define DBG_CTL_INT_BREAK 0x00000002
|
||||
|
||||
/*
|
||||
* PTD Debug reg selector addresses
|
||||
* This reg must be written with a value to show the contents of
|
||||
* one of the desired internal register.
|
||||
*/
|
||||
#define PTD_DBG_REQ 0x00 /* shows the state of 31 initiators */
|
||||
#define PTD_DBG_TSK_VLD_INIT 0x01 /* shows which 16 tasks are valid and
|
||||
have initiators asserted */
|
||||
|
||||
/* General return values */
|
||||
#define MCD_OK 0
|
||||
#define MCD_ERROR -1
|
||||
#define MCD_TABLE_UNALIGNED -2
|
||||
#define MCD_CHANNEL_INVALID -3
|
||||
|
||||
/* MCD_initDma input flags */
|
||||
#define MCD_RELOC_TASKS 0x00000001
|
||||
#define MCD_NO_RELOC_TASKS 0x00000000
|
||||
#define MCD_COMM_PREFETCH_EN 0x00000002 /* MCF547x/548x ONLY */
|
||||
|
||||
/*
|
||||
* MCD_dmaStatus Status Values for each channel:
|
||||
* MCD_NO_DMA - No DMA has been requested since reset
|
||||
* MCD_IDLE - DMA active, but the initiator is currently inactive
|
||||
* MCD_RUNNING - DMA active, and the initiator is currently active
|
||||
* MCD_PAUSED - DMA active but it is currently paused
|
||||
* MCD_HALTED - the most recent DMA has been killed with MCD_killTask()
|
||||
* MCD_DONE - the most recent DMA has completed
|
||||
*/
|
||||
#define MCD_NO_DMA 1
|
||||
#define MCD_IDLE 2
|
||||
#define MCD_RUNNING 3
|
||||
#define MCD_PAUSED 4
|
||||
#define MCD_HALTED 5
|
||||
#define MCD_DONE 6
|
||||
|
||||
/* MCD_startDma parameter defines */
|
||||
|
||||
/* Constants for the funcDesc parameter */
|
||||
/*
|
||||
* MCD_NO_BYTE_SWAP - to disable byte swapping
|
||||
* MCD_BYTE_REVERSE - to reverse the bytes of each u32 of the DMAed data
|
||||
* MCD_U16_REVERSE - to reverse the 16-bit halves of each 32-bit data
|
||||
* value being DMAed
|
||||
* MCD_U16_BYTE_REVERSE - to reverse the byte halves of each 16-bit half of
|
||||
* each 32-bit data value DMAed
|
||||
* MCD_NO_BIT_REV - do not reverse the bits of each byte DMAed
|
||||
* MCD_BIT_REV - reverse the bits of each byte DMAed
|
||||
* MCD_CRC16 - to perform CRC-16 on DMAed data
|
||||
* MCD_CRCCCITT - to perform CRC-CCITT on DMAed data
|
||||
* MCD_CRC32 - to perform CRC-32 on DMAed data
|
||||
* MCD_CSUMINET - to perform internet checksums on DMAed data
|
||||
* MCD_NO_CSUM - to perform no checksumming
|
||||
*/
|
||||
#define MCD_NO_BYTE_SWAP 0x00045670
|
||||
#define MCD_BYTE_REVERSE 0x00076540
|
||||
#define MCD_U16_REVERSE 0x00067450
|
||||
#define MCD_U16_BYTE_REVERSE 0x00054760
|
||||
#define MCD_NO_BIT_REV 0x00000000
|
||||
#define MCD_BIT_REV 0x00088880
|
||||
/* CRCing: */
|
||||
#define MCD_CRC16 0xc0100000
|
||||
#define MCD_CRCCCITT 0xc0200000
|
||||
#define MCD_CRC32 0xc0300000
|
||||
#define MCD_CSUMINET 0xc0400000
|
||||
#define MCD_NO_CSUM 0xa0000000
|
||||
|
||||
#define MCD_FUNC_NOEU1 (MCD_NO_BYTE_SWAP | MCD_NO_BIT_REV | \
|
||||
MCD_NO_CSUM)
|
||||
#define MCD_FUNC_NOEU2 (MCD_NO_BYTE_SWAP | MCD_NO_CSUM)
|
||||
|
||||
/* Constants for the flags parameter */
|
||||
#define MCD_TT_FLAGS_RL 0x00000001 /* Read line */
|
||||
#define MCD_TT_FLAGS_CW 0x00000002 /* Combine Writes */
|
||||
#define MCD_TT_FLAGS_SP 0x00000004 /* MCF547x/548x ONLY */
|
||||
#define MCD_TT_FLAGS_MASK 0x000000ff
|
||||
#define MCD_TT_FLAGS_DEF (MCD_TT_FLAGS_RL | MCD_TT_FLAGS_CW)
|
||||
|
||||
#define MCD_SINGLE_DMA 0x00000100 /* Unchained DMA */
|
||||
#define MCD_CHAIN_DMA /* TBD */
|
||||
#define MCD_EU_DMA /* TBD */
|
||||
#define MCD_FECTX_DMA 0x00001000 /* FEC TX ring DMA */
|
||||
#define MCD_FECRX_DMA 0x00002000 /* FEC RX ring DMA */
|
||||
|
||||
/* these flags are valid for MCD_startDma and the chained buffer descriptors */
|
||||
/*
|
||||
* MCD_BUF_READY - indicates that this buf is now under the DMA's ctrl
|
||||
* MCD_WRAP - to tell the FEC Dmas to wrap to the first BD
|
||||
* MCD_INTERRUPT - to generate an interrupt after completion of the DMA
|
||||
* MCD_END_FRAME - tell the DMA to end the frame when transferring
|
||||
* last byte of data in buffer
|
||||
* MCD_CRC_RESTART - to empty out the accumulated checksum prior to
|
||||
* performing the DMA
|
||||
*/
|
||||
#define MCD_BUF_READY 0x80000000
|
||||
#define MCD_WRAP 0x20000000
|
||||
#define MCD_INTERRUPT 0x10000000
|
||||
#define MCD_END_FRAME 0x08000000
|
||||
#define MCD_CRC_RESTART 0x40000000
|
||||
|
||||
/* Defines for the FEC buffer descriptor control/status word*/
|
||||
#define MCD_FEC_BUF_READY 0x8000
|
||||
#define MCD_FEC_WRAP 0x2000
|
||||
#define MCD_FEC_INTERRUPT 0x1000
|
||||
#define MCD_FEC_END_FRAME 0x0800
|
||||
|
||||
/* Defines for general intuitiveness */
|
||||
|
||||
#define MCD_TRUE 1
|
||||
#define MCD_FALSE 0
|
||||
|
||||
/* Three different cases for destination and source. */
|
||||
#define MINUS1 -1
|
||||
#define ZERO 0
|
||||
#define PLUS1 1
|
||||
|
||||
#ifndef DEFINESONLY
|
||||
|
||||
/* Task Table Entry struct*/
|
||||
typedef struct {
|
||||
u32 TDTstart; /* task descriptor table start */
|
||||
u32 TDTend; /* task descriptor table end */
|
||||
u32 varTab; /* variable table start */
|
||||
u32 FDTandFlags; /* function descriptor table start & flags */
|
||||
volatile u32 descAddrAndStatus;
|
||||
volatile u32 modifiedVarTab;
|
||||
u32 contextSaveSpace; /* context save space start */
|
||||
u32 literalBases;
|
||||
} TaskTableEntry;
|
||||
|
||||
/* Chained buffer descriptor:
|
||||
* flags - flags describing the DMA
|
||||
* csumResult - checksum performed since last checksum reset
|
||||
* srcAddr - the address to move data from
|
||||
* destAddr - the address to move data to
|
||||
* lastDestAddr - the last address written to
|
||||
* dmaSize - the no of bytes to xfer independent of the xfer sz
|
||||
* next - next buffer descriptor in chain
|
||||
* info - private info about this descriptor; DMA does not affect it
|
||||
*/
|
||||
typedef volatile struct MCD_bufDesc_struct MCD_bufDesc;
|
||||
struct MCD_bufDesc_struct {
|
||||
u32 flags;
|
||||
u32 csumResult;
|
||||
s8 *srcAddr;
|
||||
s8 *destAddr;
|
||||
s8 *lastDestAddr;
|
||||
u32 dmaSize;
|
||||
MCD_bufDesc *next;
|
||||
u32 info;
|
||||
};
|
||||
|
||||
/* Progress Query struct:
|
||||
* lastSrcAddr - the most-recent or last, post-increment source address
|
||||
* lastDestAddr - the most-recent or last, post-increment destination address
|
||||
* dmaSize - the amount of data transferred for the current buffer
|
||||
* currBufDesc - pointer to the current buffer descriptor being DMAed
|
||||
*/
|
||||
|
||||
typedef volatile struct MCD_XferProg_struct {
|
||||
s8 *lastSrcAddr;
|
||||
s8 *lastDestAddr;
|
||||
u32 dmaSize;
|
||||
MCD_bufDesc *currBufDesc;
|
||||
} MCD_XferProg;
|
||||
|
||||
/* FEC buffer descriptor */
|
||||
typedef volatile struct MCD_bufDescFec_struct {
|
||||
u16 statCtrl;
|
||||
u16 length;
|
||||
u32 dataPointer;
|
||||
} MCD_bufDescFec;
|
||||
|
||||
/*************************************************************************/
|
||||
/* API function Prototypes - see MCD_dmaApi.c for further notes */
|
||||
|
||||
/* MCD_startDma starts a particular kind of DMA:
|
||||
* srcAddr - the channel on which to run the DMA
|
||||
* srcIncr - the address to move data from, or buffer-descriptor address
|
||||
* destAddr - the amount to increment the source address per transfer
|
||||
* destIncr - the address to move data to
|
||||
* dmaSize - the amount to increment the destination address per transfer
|
||||
* xferSize - the number bytes in of each data movement (1, 2, or 4)
|
||||
* initiator - what device initiates the DMA
|
||||
* priority - priority of the DMA
|
||||
* flags - flags describing the DMA
|
||||
* funcDesc - description of byte swapping, bit swapping, and CRC actions
|
||||
*/
|
||||
int MCD_startDma(int channel, s8 * srcAddr, s16 srcIncr, s8 * destAddr,
|
||||
s16 destIncr, u32 dmaSize, u32 xferSize, u32 initiator,
|
||||
int priority, u32 flags, u32 funcDesc);
|
||||
|
||||
/*
|
||||
* MCD_initDma() initializes the DMA API by setting up a pointer to the DMA
|
||||
* registers, relocating and creating the appropriate task structures, and
|
||||
* setting up some global settings
|
||||
*/
|
||||
int MCD_initDma(dmaRegs * sDmaBarAddr, void *taskTableDest, u32 flags);
|
||||
|
||||
/* MCD_dmaStatus() returns the status of the DMA on the requested channel. */
|
||||
int MCD_dmaStatus(int channel);
|
||||
|
||||
/* MCD_XferProgrQuery() returns progress of DMA on requested channel */
|
||||
int MCD_XferProgrQuery(int channel, MCD_XferProg * progRep);
|
||||
|
||||
/*
|
||||
* MCD_killDma() halts the DMA on the requested channel, without any
|
||||
* intention of resuming the DMA.
|
||||
*/
|
||||
int MCD_killDma(int channel);
|
||||
|
||||
/*
|
||||
* MCD_continDma() continues a DMA which as stopped due to encountering an
|
||||
* unready buffer descriptor.
|
||||
*/
|
||||
int MCD_continDma(int channel);
|
||||
|
||||
/*
|
||||
* MCD_pauseDma() pauses the DMA on the given channel ( if any DMA is
|
||||
* running on that channel).
|
||||
*/
|
||||
int MCD_pauseDma(int channel);
|
||||
|
||||
/*
|
||||
* MCD_resumeDma() resumes the DMA on a given channel (if any DMA is
|
||||
* running on that channel).
|
||||
*/
|
||||
int MCD_resumeDma(int channel);
|
||||
|
||||
/* MCD_csumQuery provides the checksum/CRC after performing a non-chained DMA */
|
||||
int MCD_csumQuery(int channel, u32 * csum);
|
||||
|
||||
/*
|
||||
* MCD_getCodeSize provides the packed size required by the microcoded task
|
||||
* and structures.
|
||||
*/
|
||||
int MCD_getCodeSize(void);
|
||||
|
||||
/*
|
||||
* MCD_getVersion provides a pointer to a version string and returns a
|
||||
* version number.
|
||||
*/
|
||||
int MCD_getVersion(char **longVersion);
|
||||
|
||||
/* macro for setting a location in the variable table */
|
||||
#define MCD_SET_VAR(taskTab,idx,value) ((u32 *)(taskTab)->varTab)[idx] = value
|
||||
/* Note that MCD_SET_VAR() is invoked many times in firing up a DMA function,
|
||||
so I'm avoiding surrounding it with "do {} while(0)" */
|
||||
|
||||
#endif /* DEFINESONLY */
|
||||
|
||||
#endif /* _MCD_API_H */
|
||||
10
include/MCD_progCheck.h
Normal file
10
include/MCD_progCheck.h
Normal file
@@ -0,0 +1,10 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2004-2007 Freescale Semiconductor, Inc.
|
||||
*/
|
||||
|
||||
/* This file is autogenerated. Do not change */
|
||||
#define CURRBD 4
|
||||
#define DCOUNT 6
|
||||
#define DESTPTR 5
|
||||
#define SRCPTR 7
|
||||
43
include/MCD_tasksInit.h
Normal file
43
include/MCD_tasksInit.h
Normal file
@@ -0,0 +1,43 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2004-2007 Freescale Semiconductor, Inc.
|
||||
*/
|
||||
|
||||
#ifndef MCD_TSK_INIT_H
|
||||
#define MCD_TSK_INIT_H 1
|
||||
|
||||
/*
|
||||
* Do not edit!
|
||||
*/
|
||||
|
||||
/* Task 0 */
|
||||
void MCD_startDmaChainNoEu(int *currBD, short srcIncr, short destIncr,
|
||||
int xferSize, short xferSizeIncr, int *cSave,
|
||||
volatile TaskTableEntry * taskTable, int channel);
|
||||
|
||||
/* Task 1 */
|
||||
void MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr,
|
||||
short destIncr, int dmaSize, short xferSizeIncr,
|
||||
int flags, int *currBD, int *cSave,
|
||||
volatile TaskTableEntry * taskTable, int channel);
|
||||
|
||||
/* Task 2 */
|
||||
void MCD_startDmaChainEu(int *currBD, short srcIncr, short destIncr,
|
||||
int xferSize, short xferSizeIncr, int *cSave,
|
||||
volatile TaskTableEntry * taskTable, int channel);
|
||||
|
||||
/* Task 3 */
|
||||
void MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr,
|
||||
short destIncr, int dmaSize, short xferSizeIncr,
|
||||
int flags, int *currBD, int *cSave,
|
||||
volatile TaskTableEntry * taskTable, int channel);
|
||||
|
||||
/* Task 4 */
|
||||
void MCD_startDmaENetRcv(char *bDBase, char *currBD, char *rcvFifoPtr,
|
||||
volatile TaskTableEntry * taskTable, int channel);
|
||||
|
||||
/* Task 5 */
|
||||
void MCD_startDmaENetXmit(char *bDBase, char *currBD, char *xmitFifoPtr,
|
||||
volatile TaskTableEntry * taskTable, int channel);
|
||||
|
||||
#endif /* MCD_TSK_INIT_H */
|
||||
2833
include/SA-1100.h
Normal file
2833
include/SA-1100.h
Normal file
File diff suppressed because it is too large
Load Diff
86
include/_exports.h
Normal file
86
include/_exports.h
Normal file
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* You need to use #ifdef around functions that may not exist
|
||||
* in the final configuration (such as i2c).
|
||||
* use a dummyfunction as first parameter to EXPORT_FUNC.
|
||||
* As an example see the CONFIG_CMD_I2C section below
|
||||
*/
|
||||
#ifndef EXPORT_FUNC
|
||||
#define EXPORT_FUNC(a, b, c, ...)
|
||||
#endif
|
||||
EXPORT_FUNC(get_version, unsigned long, get_version, void)
|
||||
EXPORT_FUNC(getc, int, getc, void)
|
||||
EXPORT_FUNC(tstc, int, tstc, void)
|
||||
EXPORT_FUNC(putc, void, putc, const char)
|
||||
EXPORT_FUNC(puts, void, puts, const char *)
|
||||
EXPORT_FUNC(printf, int, printf, const char*, ...)
|
||||
#if (defined(CONFIG_X86) && !defined(CONFIG_X86_64)) || defined(CONFIG_PPC)
|
||||
EXPORT_FUNC(irq_install_handler, void, install_hdlr,
|
||||
int, interrupt_handler_t, void*)
|
||||
|
||||
EXPORT_FUNC(irq_free_handler, void, free_hdlr, int)
|
||||
#else
|
||||
EXPORT_FUNC(dummy, void, install_hdlr, void)
|
||||
EXPORT_FUNC(dummy, void, free_hdlr, void)
|
||||
#endif
|
||||
EXPORT_FUNC(malloc, void *, malloc, size_t)
|
||||
#if !CONFIG_IS_ENABLED(SYS_MALLOC_SIMPLE)
|
||||
EXPORT_FUNC(free, void, free, void *)
|
||||
#endif
|
||||
EXPORT_FUNC(udelay, void, udelay, unsigned long)
|
||||
EXPORT_FUNC(get_timer, unsigned long, get_timer, unsigned long)
|
||||
EXPORT_FUNC(vprintf, int, vprintf, const char *, va_list)
|
||||
EXPORT_FUNC(do_reset, int, do_reset, cmd_tbl_t *,
|
||||
int , int , char * const [])
|
||||
EXPORT_FUNC(env_get, char *, env_get, const char*)
|
||||
EXPORT_FUNC(env_set, int, env_set, const char *, const char *)
|
||||
EXPORT_FUNC(simple_strtoul, unsigned long, simple_strtoul,
|
||||
const char *, char **, unsigned int)
|
||||
EXPORT_FUNC(strict_strtoul, int, strict_strtoul,
|
||||
const char *, unsigned int , unsigned long *)
|
||||
EXPORT_FUNC(simple_strtol, long, simple_strtol,
|
||||
const char *, char **, unsigned int)
|
||||
EXPORT_FUNC(strcmp, int, strcmp, const char *cs, const char *ct)
|
||||
#if defined(CONFIG_CMD_I2C) && !defined(CONFIG_DM_I2C)
|
||||
EXPORT_FUNC(i2c_write, int, i2c_write, uchar, uint, int , uchar * , int)
|
||||
EXPORT_FUNC(i2c_read, int, i2c_read, uchar, uint, int , uchar * , int)
|
||||
#else
|
||||
EXPORT_FUNC(dummy, void, i2c_write, void)
|
||||
EXPORT_FUNC(dummy, void, i2c_read, void)
|
||||
#endif
|
||||
|
||||
#if !defined(CONFIG_CMD_SPI) || defined(CONFIG_DM_SPI)
|
||||
EXPORT_FUNC(dummy, void, spi_setup_slave, void)
|
||||
EXPORT_FUNC(dummy, void, spi_free_slave, void)
|
||||
#else
|
||||
EXPORT_FUNC(spi_setup_slave, struct spi_slave *, spi_setup_slave,
|
||||
unsigned int, unsigned int, unsigned int, unsigned int)
|
||||
EXPORT_FUNC(spi_free_slave, void, spi_free_slave, struct spi_slave *)
|
||||
#endif
|
||||
#ifndef CONFIG_CMD_SPI
|
||||
EXPORT_FUNC(dummy, void, spi_claim_bus, void)
|
||||
EXPORT_FUNC(dummy, void, spi_release_bus, void)
|
||||
EXPORT_FUNC(dummy, void, spi_xfer, void)
|
||||
#else
|
||||
EXPORT_FUNC(spi_claim_bus, int, spi_claim_bus, struct spi_slave *)
|
||||
EXPORT_FUNC(spi_release_bus, void, spi_release_bus, struct spi_slave *)
|
||||
EXPORT_FUNC(spi_xfer, int, spi_xfer, struct spi_slave *,
|
||||
unsigned int, const void *, void *, unsigned long)
|
||||
#endif
|
||||
EXPORT_FUNC(ustrtoul, unsigned long, ustrtoul,
|
||||
const char *, char **, unsigned int)
|
||||
EXPORT_FUNC(ustrtoull, unsigned long long, ustrtoull,
|
||||
const char *, char **, unsigned int)
|
||||
EXPORT_FUNC(strcpy, char *, strcpy, char *dest, const char *src)
|
||||
EXPORT_FUNC(mdelay, void, mdelay, unsigned long msec)
|
||||
EXPORT_FUNC(memset, void *, memset, void *, int, size_t)
|
||||
#ifdef CONFIG_PHY_AQUANTIA
|
||||
EXPORT_FUNC(mdio_get_current_dev, struct mii_dev *,
|
||||
mdio_get_current_dev, void)
|
||||
EXPORT_FUNC(phy_find_by_mask, struct phy_device *, phy_find_by_mask,
|
||||
struct mii_dev *bus, unsigned phy_mask,
|
||||
phy_interface_t interface)
|
||||
EXPORT_FUNC(mdio_phydev_for_ethname, struct phy_device *,
|
||||
mdio_phydev_for_ethname, const char *ethname)
|
||||
EXPORT_FUNC(miiphy_set_current_dev, int, miiphy_set_current_dev,
|
||||
const char *devname)
|
||||
#endif
|
||||
130
include/acpi_s3.h
Normal file
130
include/acpi_s3.h
Normal file
@@ -0,0 +1,130 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ACPI_S3_H__
|
||||
#define __ASM_ACPI_S3_H__
|
||||
|
||||
#define WAKEUP_BASE 0x600
|
||||
|
||||
/* PM1_STATUS register */
|
||||
#define WAK_STS (1 << 15)
|
||||
#define PCIEXPWAK_STS (1 << 14)
|
||||
#define RTC_STS (1 << 10)
|
||||
#define SLPBTN_STS (1 << 9)
|
||||
#define PWRBTN_STS (1 << 8)
|
||||
#define GBL_STS (1 << 5)
|
||||
#define BM_STS (1 << 4)
|
||||
#define TMR_STS (1 << 0)
|
||||
|
||||
/* PM1_CNT register */
|
||||
#define SLP_EN (1 << 13)
|
||||
#define SLP_TYP_SHIFT 10
|
||||
#define SLP_TYP (7 << SLP_TYP_SHIFT)
|
||||
#define SLP_TYP_S0 0
|
||||
#define SLP_TYP_S1 1
|
||||
#define SLP_TYP_S3 5
|
||||
#define SLP_TYP_S4 6
|
||||
#define SLP_TYP_S5 7
|
||||
|
||||
/* Memory size reserved for S3 resume */
|
||||
#define S3_RESERVE_SIZE 0x1000
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
extern char __wakeup[];
|
||||
extern int __wakeup_size;
|
||||
|
||||
enum acpi_sleep_state {
|
||||
ACPI_S0,
|
||||
ACPI_S1,
|
||||
ACPI_S2,
|
||||
ACPI_S3,
|
||||
ACPI_S4,
|
||||
ACPI_S5,
|
||||
};
|
||||
|
||||
/**
|
||||
* acpi_ss_string() - get ACPI-defined sleep state string
|
||||
*
|
||||
* @pm1_cnt: ACPI-defined sleep state
|
||||
* @return: a pointer to the sleep state string.
|
||||
*/
|
||||
static inline char *acpi_ss_string(enum acpi_sleep_state state)
|
||||
{
|
||||
char *ss_string[] = { "S0", "S1", "S2", "S3", "S4", "S5"};
|
||||
|
||||
return ss_string[state];
|
||||
}
|
||||
|
||||
/**
|
||||
* acpi_sleep_from_pm1() - get ACPI-defined sleep state from PM1_CNT register
|
||||
*
|
||||
* @pm1_cnt: PM1_CNT register value
|
||||
* @return: ACPI-defined sleep state if given valid PM1_CNT register value,
|
||||
* -EINVAL otherwise.
|
||||
*/
|
||||
static inline enum acpi_sleep_state acpi_sleep_from_pm1(u32 pm1_cnt)
|
||||
{
|
||||
switch ((pm1_cnt & SLP_TYP) >> SLP_TYP_SHIFT) {
|
||||
case SLP_TYP_S0:
|
||||
return ACPI_S0;
|
||||
case SLP_TYP_S1:
|
||||
return ACPI_S1;
|
||||
case SLP_TYP_S3:
|
||||
return ACPI_S3;
|
||||
case SLP_TYP_S4:
|
||||
return ACPI_S4;
|
||||
case SLP_TYP_S5:
|
||||
return ACPI_S5;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/**
|
||||
* chipset_prev_sleep_state() - Get chipset previous sleep state
|
||||
*
|
||||
* This returns chipset previous sleep state from ACPI registers.
|
||||
* Platform codes must supply this routine in order to support ACPI S3.
|
||||
*
|
||||
* @return ACPI_S0/S1/S2/S3/S4/S5.
|
||||
*/
|
||||
enum acpi_sleep_state chipset_prev_sleep_state(void);
|
||||
|
||||
/**
|
||||
* chipset_clear_sleep_state() - Clear chipset sleep state
|
||||
*
|
||||
* This clears chipset sleep state in ACPI registers.
|
||||
* Platform codes must supply this routine in order to support ACPI S3.
|
||||
*/
|
||||
void chipset_clear_sleep_state(void);
|
||||
|
||||
struct acpi_fadt;
|
||||
/**
|
||||
* acpi_resume() - Do ACPI S3 resume
|
||||
*
|
||||
* This calls U-Boot wake up assembly stub and jumps to OS's wake up vector.
|
||||
*
|
||||
* @fadt: FADT table pointer in the ACPI table
|
||||
* @return: Never returns
|
||||
*/
|
||||
void acpi_resume(struct acpi_fadt *fadt);
|
||||
|
||||
/**
|
||||
* acpi_s3_reserve() - Reserve memory for ACPI S3 resume
|
||||
*
|
||||
* This copies memory where real mode interrupt handler stubs reside to the
|
||||
* reserved place on the stack.
|
||||
*
|
||||
* This routine should be called by reserve_arch() before U-Boot is relocated
|
||||
* when ACPI S3 resume is enabled.
|
||||
*
|
||||
* @return: 0 always
|
||||
*/
|
||||
int acpi_s3_reserve(void);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* __ASM_ACPI_S3_H__ */
|
||||
308
include/adc.h
Normal file
308
include/adc.h
Normal file
@@ -0,0 +1,308 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2015 Samsung Electronics
|
||||
* Przemyslaw Marczak <p.marczak@samsung.com>
|
||||
*/
|
||||
|
||||
#ifndef _ADC_H_
|
||||
#define _ADC_H_
|
||||
|
||||
/* ADC_CHANNEL() - ADC channel bit mask, to select only required channels */
|
||||
#define ADC_CHANNEL(x) (1 << x)
|
||||
|
||||
/* The last possible selected channel with 32-bit mask */
|
||||
#define ADC_MAX_CHANNEL 31
|
||||
|
||||
/**
|
||||
* adc_data_format: define the ADC output data format, can be useful when
|
||||
* the device's input Voltage range is bipolar.
|
||||
* - ADC_DATA_FORMAT_BIN - binary offset
|
||||
* - ADC_DATA_FORMAT_2S - two's complement
|
||||
*
|
||||
* Note: Device's driver should fill the 'data_format' field of its uclass's
|
||||
* platform data using one of the above data format types.
|
||||
*/
|
||||
enum adc_data_format {
|
||||
ADC_DATA_FORMAT_BIN,
|
||||
ADC_DATA_FORMAT_2S,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct adc_channel - structure to hold channel conversion data.
|
||||
* Useful to keep the result of a multi-channel conversion output.
|
||||
*
|
||||
* @id - channel id
|
||||
* @data - channel conversion data
|
||||
*/
|
||||
struct adc_channel {
|
||||
int id;
|
||||
unsigned int data;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct adc_uclass_platdata - basic ADC info
|
||||
*
|
||||
* Note: The positive/negative reference Voltage is only a name and it doesn't
|
||||
* provide an information about the value polarity. It is possible, for both
|
||||
* values to be a negative or positive. For this purpose the uclass's platform
|
||||
* data provides a bool fields: 'vdd/vss_supply_is_negative'. This is useful,
|
||||
* since the regulator API returns only a positive Voltage values.
|
||||
*
|
||||
* To get the reference Voltage values with polarity, use functions:
|
||||
* - adc_vdd_value()
|
||||
* - adc_vss_value()
|
||||
* Those are useful for some cases of ADC's references, e.g.:
|
||||
* * Vdd: +3.3V; Vss: -3.3V -> 6.6 Vdiff
|
||||
* * Vdd: +3.3V; Vss: +0.3V -> 3.0 Vdiff
|
||||
* * Vdd: +3.3V; Vss: 0.0V -> 3.3 Vdiff
|
||||
* The last one is usually standard and doesn't require the fdt polarity info.
|
||||
*
|
||||
* For more informations read binding info:
|
||||
* - doc/device-tree-bindings/adc/adc.txt
|
||||
*
|
||||
* @data_mask - conversion output data mask
|
||||
* @data_timeout_us - single channel conversion timeout
|
||||
* @multidata_timeout_us - multi channel conversion timeout
|
||||
* @channel_mask - bit mask of available channels [0:31]
|
||||
* @vdd_supply - positive reference Voltage supply (regulator)
|
||||
* @vss_supply - negative reference Voltage supply (regulator)
|
||||
* @vdd_polarity_negative - positive reference Voltage has negative polarity
|
||||
* @vss_polarity_negative - negative reference Voltage has negative polarity
|
||||
* @vdd_microvolts - positive reference Voltage value
|
||||
* @vss_microvolts - negative reference Voltage value
|
||||
*/
|
||||
struct adc_uclass_platdata {
|
||||
int data_format;
|
||||
unsigned int data_mask;
|
||||
unsigned int data_timeout_us;
|
||||
unsigned int multidata_timeout_us;
|
||||
unsigned int channel_mask;
|
||||
struct udevice *vdd_supply;
|
||||
struct udevice *vss_supply;
|
||||
bool vdd_polarity_negative;
|
||||
bool vss_polarity_negative;
|
||||
int vdd_microvolts;
|
||||
int vss_microvolts;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct adc_ops - ADC device operations for single/multi-channel operation.
|
||||
*/
|
||||
struct adc_ops {
|
||||
/**
|
||||
* start_channel() - start conversion with its default parameters
|
||||
* for the given channel number.
|
||||
*
|
||||
* @dev: ADC device to init
|
||||
* @channel: analog channel number
|
||||
* @return: 0 if OK, -ve on error
|
||||
*/
|
||||
int (*start_channel)(struct udevice *dev, int channel);
|
||||
|
||||
/**
|
||||
* start_channels() - start conversion with its default parameters
|
||||
* for the channel numbers selected by the bit mask.
|
||||
*
|
||||
* This is optional, useful when the hardware supports multichannel
|
||||
* conversion by the single software trigger.
|
||||
*
|
||||
* @dev: ADC device to init
|
||||
* @channel_mask: bit mask of selected analog channels
|
||||
* @return: 0 if OK, -ve on error
|
||||
*/
|
||||
int (*start_channels)(struct udevice *dev, unsigned int channel_mask);
|
||||
|
||||
/**
|
||||
* channel_data() - get conversion output data for the given channel.
|
||||
*
|
||||
* Note: The implementation of this function should only check, that
|
||||
* the conversion data is available at the call time. If the hardware
|
||||
* requires some delay to get the data, then this function should
|
||||
* return with -EBUSY value. The ADC API will call it in a loop,
|
||||
* until the data is available or the timeout expires. The maximum
|
||||
* timeout for this operation is defined by the field 'data_timeout_us'
|
||||
* in ADC uclasses platform data structure.
|
||||
*
|
||||
* @dev: ADC device to trigger
|
||||
* @channel: selected analog channel number
|
||||
* @data: returned pointer to selected channel's output data
|
||||
* @return: 0 if OK, -EBUSY if busy, and other negative on error
|
||||
*/
|
||||
int (*channel_data)(struct udevice *dev, int channel,
|
||||
unsigned int *data);
|
||||
|
||||
/**
|
||||
* channels_data() - get conversion data for the selected channels.
|
||||
*
|
||||
* This is optional, useful when multichannel conversion is supported
|
||||
* by the hardware, by the single software trigger.
|
||||
*
|
||||
* For the proper implementation, please look at the 'Note' for the
|
||||
* above method. The only difference is in used timeout value, which
|
||||
* is defined by field 'multidata_timeout_us'.
|
||||
*
|
||||
* @dev: ADC device to trigger
|
||||
* @channel_mask: bit mask of selected analog channels
|
||||
* @channels: returned pointer to array of output data for channels
|
||||
* selected by the given mask
|
||||
* @return: 0 if OK, -ve on error
|
||||
*/
|
||||
int (*channels_data)(struct udevice *dev, unsigned int channel_mask,
|
||||
struct adc_channel *channels);
|
||||
|
||||
/**
|
||||
* stop() - stop conversion of the given ADC device
|
||||
*
|
||||
* @dev: ADC device to stop
|
||||
* @return: 0 if OK, -ve on error
|
||||
*/
|
||||
int (*stop)(struct udevice *dev);
|
||||
};
|
||||
|
||||
/**
|
||||
* adc_start_channel() - start conversion for given device/channel and exit.
|
||||
*
|
||||
* @dev: ADC device
|
||||
* @channel: analog channel number
|
||||
* @return: 0 if OK, -ve on error
|
||||
*/
|
||||
int adc_start_channel(struct udevice *dev, int channel);
|
||||
|
||||
/**
|
||||
* adc_start_channels() - start conversion for given device/channels and exit.
|
||||
*
|
||||
* Note:
|
||||
* To use this function, device must implement method: start_channels().
|
||||
*
|
||||
* @dev: ADC device to start
|
||||
* @channel_mask: channel selection - a bit mask
|
||||
* @channel_mask: bit mask of analog channels
|
||||
* @return: 0 if OK, -ve on error
|
||||
*/
|
||||
int adc_start_channels(struct udevice *dev, unsigned int channel_mask);
|
||||
|
||||
/**
|
||||
* adc_channel_data() - get conversion data for the given device channel number.
|
||||
*
|
||||
* @dev: ADC device to read
|
||||
* @channel: analog channel number
|
||||
* @data: pointer to returned channel's data
|
||||
* @return: 0 if OK, -ve on error
|
||||
*/
|
||||
int adc_channel_data(struct udevice *dev, int channel, unsigned int *data);
|
||||
|
||||
/**
|
||||
* adc_channels_data() - get conversion data for the channels selected by mask
|
||||
*
|
||||
* Note:
|
||||
* To use this function, device must implement methods:
|
||||
* - start_channels()
|
||||
* - channels_data()
|
||||
*
|
||||
* @dev: ADC device to read
|
||||
* @channel_mask: channel selection - a bit mask
|
||||
* @channels: pointer to structure array of returned data for each channel
|
||||
* @return: 0 if OK, -ve on error
|
||||
*/
|
||||
int adc_channels_data(struct udevice *dev, unsigned int channel_mask,
|
||||
struct adc_channel *channels);
|
||||
|
||||
/**
|
||||
* adc_data_mask() - get data mask (ADC resolution bitmask) for given ADC device
|
||||
*
|
||||
* This can be used if adc uclass platform data is filled.
|
||||
*
|
||||
* @dev: ADC device to check
|
||||
* @data_mask: pointer to the returned data bitmask
|
||||
* @return: 0 if OK, -ve on error
|
||||
*/
|
||||
int adc_data_mask(struct udevice *dev, unsigned int *data_mask);
|
||||
|
||||
/**
|
||||
* adc_channel_mask() - get channel mask for given ADC device
|
||||
*
|
||||
* This can be used if adc uclass platform data is filled.
|
||||
*
|
||||
* @dev: ADC device to check
|
||||
* @channel_mask: pointer to the returned channel bitmask
|
||||
* @return: 0 if OK, -ve on error
|
||||
*/
|
||||
int adc_channel_mask(struct udevice *dev, unsigned int *channel_mask);
|
||||
|
||||
/**
|
||||
* adc_channel_single_shot() - get output data of conversion for the ADC
|
||||
* device's channel. This function searches for the device with the given name,
|
||||
* starts the given channel conversion and returns the output data.
|
||||
*
|
||||
* Note: To use this function, device must implement metods:
|
||||
* - start_channel()
|
||||
* - channel_data()
|
||||
*
|
||||
* @name: device's name to search
|
||||
* @channel: device's input channel to init
|
||||
* @data: pointer to conversion output data
|
||||
* @return: 0 if OK, -ve on error
|
||||
*/
|
||||
int adc_channel_single_shot(const char *name, int channel, unsigned int *data);
|
||||
|
||||
/**
|
||||
* adc_channels_single_shot() - get ADC conversion output data for the selected
|
||||
* device's channels. This function searches for the device by the given name,
|
||||
* starts the selected channels conversion and returns the output data as array
|
||||
* of type 'struct adc_channel'.
|
||||
*
|
||||
* Note: This function can be used if device implements one of ADC's single
|
||||
* or multi-channel operation API. If multi-channel operation is not supported,
|
||||
* then each selected channel is triggered by the sequence start/data in a loop.
|
||||
*
|
||||
* @name: device's name to search
|
||||
* @channel_mask: channel selection - a bit mask
|
||||
* @channels: pointer to conversion output data for the selected channels
|
||||
* @return: 0 if OK, -ve on error
|
||||
*/
|
||||
int adc_channels_single_shot(const char *name, unsigned int channel_mask,
|
||||
struct adc_channel *channels);
|
||||
|
||||
/**
|
||||
* adc_vdd_value() - get the ADC device's positive reference Voltage value
|
||||
*
|
||||
* Note: Depending on bool value 'vdd_supply_is_negative' of platform data,
|
||||
* the returned uV value can be negative, and it's not an error.
|
||||
*
|
||||
* @dev: ADC device to check
|
||||
* @uV: Voltage value with polarization sign (uV)
|
||||
* @return: 0 on success or -ve on error
|
||||
*/
|
||||
int adc_vdd_value(struct udevice *dev, int *uV);
|
||||
|
||||
/**
|
||||
* adc_vss_value() - get the ADC device's negative reference Voltage value
|
||||
*
|
||||
* Note: Depending on bool value 'vdd_supply_is_negative' of platform data,
|
||||
* the returned uV value can be negative, and it's not an error.
|
||||
*
|
||||
* @dev: ADC device to check
|
||||
* @uV: Voltage value with polarization sign (uV)
|
||||
* @return: 0 on success or -ve on error
|
||||
*/
|
||||
int adc_vss_value(struct udevice *dev, int *uV);
|
||||
|
||||
/**
|
||||
* adc_stop() - stop operation for given ADC device.
|
||||
*
|
||||
* @dev: ADC device to stop
|
||||
* @return: 0 if OK, -ve on error
|
||||
*/
|
||||
int adc_stop(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* adc_raw_to_uV() - converts raw value to microvolts for given ADC device.
|
||||
*
|
||||
* @dev: ADC device used from conversion
|
||||
* @raw: raw value to convert
|
||||
* @uV: converted value in microvolts
|
||||
* @return: 0 on success or -ve on error
|
||||
*/
|
||||
int adc_raw_to_uV(struct udevice *dev, unsigned int raw, int *uV);
|
||||
|
||||
#endif
|
||||
16
include/addr_map.h
Normal file
16
include/addr_map.h
Normal file
@@ -0,0 +1,16 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __ADDR_MAP_H
|
||||
#define __ADDR_MAP_H
|
||||
|
||||
/*
|
||||
* Copyright 2008 Freescale Semiconductor, Inc.
|
||||
*/
|
||||
|
||||
#include <asm/types.h>
|
||||
|
||||
extern phys_addr_t addrmap_virt_to_phys(void *vaddr);
|
||||
extern void *addrmap_phys_to_virt(phys_addr_t paddr);
|
||||
extern void addrmap_set_entry(unsigned long vaddr, phys_addr_t paddr,
|
||||
phys_size_t size, int idx);
|
||||
|
||||
#endif
|
||||
288
include/ahci.h
Normal file
288
include/ahci.h
Normal file
@@ -0,0 +1,288 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) Freescale Semiconductor, Inc. 2006.
|
||||
* Author: Jason Jin<Jason.jin@freescale.com>
|
||||
* Zhang Wei<wei.zhang@freescale.com>
|
||||
*/
|
||||
#ifndef _AHCI_H_
|
||||
#define _AHCI_H_
|
||||
|
||||
#include <pci.h>
|
||||
|
||||
#define AHCI_PCI_BAR 0x24
|
||||
#define AHCI_MAX_SG 56 /* hardware max is 64K */
|
||||
#define AHCI_CMD_SLOT_SZ 32
|
||||
#define AHCI_MAX_CMD_SLOT 32
|
||||
#define AHCI_RX_FIS_SZ 256
|
||||
#define AHCI_CMD_TBL_HDR 0x80
|
||||
#define AHCI_CMD_TBL_CDB 0x40
|
||||
#define AHCI_CMD_TBL_SZ AHCI_CMD_TBL_HDR + (AHCI_MAX_SG * 16)
|
||||
#define AHCI_PORT_PRIV_DMA_SZ (AHCI_CMD_SLOT_SZ * AHCI_MAX_CMD_SLOT + \
|
||||
AHCI_CMD_TBL_SZ + AHCI_RX_FIS_SZ)
|
||||
#define AHCI_CMD_ATAPI (1 << 5)
|
||||
#define AHCI_CMD_WRITE (1 << 6)
|
||||
#define AHCI_CMD_PREFETCH (1 << 7)
|
||||
#define AHCI_CMD_RESET (1 << 8)
|
||||
#define AHCI_CMD_CLR_BUSY (1 << 10)
|
||||
|
||||
#define RX_FIS_D2H_REG 0x40 /* offset of D2H Register FIS data */
|
||||
|
||||
/* Global controller registers */
|
||||
#define HOST_CAP 0x00 /* host capabilities */
|
||||
#define HOST_CTL 0x04 /* global host control */
|
||||
#define HOST_IRQ_STAT 0x08 /* interrupt status */
|
||||
#define HOST_PORTS_IMPL 0x0c /* bitmap of implemented ports */
|
||||
#define HOST_VERSION 0x10 /* AHCI spec. version compliancy */
|
||||
#define HOST_CAP2 0x24 /* host capabilities, extended */
|
||||
|
||||
/* HOST_CTL bits */
|
||||
#define HOST_RESET (1 << 0) /* reset controller; self-clear */
|
||||
#define HOST_IRQ_EN (1 << 1) /* global IRQ enable */
|
||||
#define HOST_AHCI_EN (1 << 31) /* AHCI enabled */
|
||||
|
||||
/* Registers for each SATA port */
|
||||
#define PORT_LST_ADDR 0x00 /* command list DMA addr */
|
||||
#define PORT_LST_ADDR_HI 0x04 /* command list DMA addr hi */
|
||||
#define PORT_FIS_ADDR 0x08 /* FIS rx buf addr */
|
||||
#define PORT_FIS_ADDR_HI 0x0c /* FIS rx buf addr hi */
|
||||
#define PORT_IRQ_STAT 0x10 /* interrupt status */
|
||||
#define PORT_IRQ_MASK 0x14 /* interrupt enable/disable mask */
|
||||
#define PORT_CMD 0x18 /* port command */
|
||||
#define PORT_TFDATA 0x20 /* taskfile data */
|
||||
#define PORT_SIG 0x24 /* device TF signature */
|
||||
#define PORT_CMD_ISSUE 0x38 /* command issue */
|
||||
#define PORT_SCR 0x28 /* SATA phy register block */
|
||||
#define PORT_SCR_STAT 0x28 /* SATA phy register: SStatus */
|
||||
#define PORT_SCR_CTL 0x2c /* SATA phy register: SControl */
|
||||
#define PORT_SCR_ERR 0x30 /* SATA phy register: SError */
|
||||
#define PORT_SCR_ACT 0x34 /* SATA phy register: SActive */
|
||||
|
||||
#ifdef CONFIG_SUNXI_AHCI
|
||||
#define PORT_P0DMACR 0x70 /* SUNXI specific "DMA register" */
|
||||
#endif
|
||||
|
||||
/* PORT_IRQ_{STAT,MASK} bits */
|
||||
#define PORT_IRQ_COLD_PRES (1 << 31) /* cold presence detect */
|
||||
#define PORT_IRQ_TF_ERR (1 << 30) /* task file error */
|
||||
#define PORT_IRQ_HBUS_ERR (1 << 29) /* host bus fatal error */
|
||||
#define PORT_IRQ_HBUS_DATA_ERR (1 << 28) /* host bus data error */
|
||||
#define PORT_IRQ_IF_ERR (1 << 27) /* interface fatal error */
|
||||
#define PORT_IRQ_IF_NONFATAL (1 << 26) /* interface non-fatal error */
|
||||
#define PORT_IRQ_OVERFLOW (1 << 24) /* xfer exhausted available S/G */
|
||||
#define PORT_IRQ_BAD_PMP (1 << 23) /* incorrect port multiplier */
|
||||
|
||||
#define PORT_IRQ_PHYRDY (1 << 22) /* PhyRdy changed */
|
||||
#define PORT_IRQ_DEV_ILCK (1 << 7) /* device interlock */
|
||||
#define PORT_IRQ_CONNECT (1 << 6) /* port connect change status */
|
||||
#define PORT_IRQ_SG_DONE (1 << 5) /* descriptor processed */
|
||||
#define PORT_IRQ_UNK_FIS (1 << 4) /* unknown FIS rx'd */
|
||||
#define PORT_IRQ_SDB_FIS (1 << 3) /* Set Device Bits FIS rx'd */
|
||||
#define PORT_IRQ_DMAS_FIS (1 << 2) /* DMA Setup FIS rx'd */
|
||||
#define PORT_IRQ_PIOS_FIS (1 << 1) /* PIO Setup FIS rx'd */
|
||||
#define PORT_IRQ_D2H_REG_FIS (1 << 0) /* D2H Register FIS rx'd */
|
||||
|
||||
#define PORT_IRQ_FATAL PORT_IRQ_TF_ERR | PORT_IRQ_HBUS_ERR \
|
||||
| PORT_IRQ_HBUS_DATA_ERR | PORT_IRQ_IF_ERR
|
||||
|
||||
#define DEF_PORT_IRQ PORT_IRQ_FATAL | PORT_IRQ_PHYRDY \
|
||||
| PORT_IRQ_CONNECT | PORT_IRQ_SG_DONE \
|
||||
| PORT_IRQ_UNK_FIS | PORT_IRQ_SDB_FIS \
|
||||
| PORT_IRQ_DMAS_FIS | PORT_IRQ_PIOS_FIS \
|
||||
| PORT_IRQ_D2H_REG_FIS
|
||||
|
||||
/* PORT_SCR_STAT bits */
|
||||
#define PORT_SCR_STAT_DET_MASK 0x3
|
||||
#define PORT_SCR_STAT_DET_COMINIT 0x1
|
||||
#define PORT_SCR_STAT_DET_PHYRDY 0x3
|
||||
|
||||
/* PORT_CMD bits */
|
||||
#define PORT_CMD_ATAPI (1 << 24) /* Device is ATAPI */
|
||||
#define PORT_CMD_LIST_ON (1 << 15) /* cmd list DMA engine running */
|
||||
#define PORT_CMD_FIS_ON (1 << 14) /* FIS DMA engine running */
|
||||
#define PORT_CMD_FIS_RX (1 << 4) /* Enable FIS receive DMA engine */
|
||||
#define PORT_CMD_CLO (1 << 3) /* Command list override */
|
||||
#define PORT_CMD_POWER_ON (1 << 2) /* Power up device */
|
||||
#define PORT_CMD_SPIN_UP (1 << 1) /* Spin up device */
|
||||
#define PORT_CMD_START (1 << 0) /* Enable port DMA engine */
|
||||
|
||||
#define PORT_CMD_ICC_ACTIVE (0x1 << 28) /* Put i/f in active state */
|
||||
#define PORT_CMD_ICC_PARTIAL (0x2 << 28) /* Put i/f in partial state */
|
||||
#define PORT_CMD_ICC_SLUMBER (0x6 << 28) /* Put i/f in slumber state */
|
||||
|
||||
#define AHCI_MAX_PORTS 32
|
||||
|
||||
#define ATA_FLAG_SATA (1 << 3)
|
||||
#define ATA_FLAG_NO_LEGACY (1 << 4) /* no legacy mode check */
|
||||
#define ATA_FLAG_MMIO (1 << 6) /* use MMIO, not PIO */
|
||||
#define ATA_FLAG_SATA_RESET (1 << 7) /* (obsolete) use COMRESET */
|
||||
#define ATA_FLAG_PIO_DMA (1 << 8) /* PIO cmds via DMA */
|
||||
#define ATA_FLAG_NO_ATAPI (1 << 11) /* No ATAPI support */
|
||||
|
||||
struct ahci_cmd_hdr {
|
||||
u32 opts;
|
||||
u32 status;
|
||||
u32 tbl_addr;
|
||||
u32 tbl_addr_hi;
|
||||
u32 reserved[4];
|
||||
};
|
||||
|
||||
struct ahci_sg {
|
||||
u32 addr;
|
||||
u32 addr_hi;
|
||||
u32 reserved;
|
||||
u32 flags_size;
|
||||
};
|
||||
|
||||
struct ahci_ioports {
|
||||
void __iomem *port_mmio;
|
||||
struct ahci_cmd_hdr *cmd_slot;
|
||||
struct ahci_sg *cmd_tbl_sg;
|
||||
ulong cmd_tbl;
|
||||
u32 rx_fis;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ahci_uc_priv - information about an AHCI controller
|
||||
*
|
||||
* When driver model is used, this is accessible using dev_get_uclass_priv(dev)
|
||||
* where dev is the controller (although at present it sometimes stands alone).
|
||||
*/
|
||||
struct ahci_uc_priv {
|
||||
#if defined(CONFIG_DM_PCI) || defined(CONFIG_DM_SCSI)
|
||||
/*
|
||||
* TODO(sjg@chromium.org): Drop this once this structure is only used
|
||||
* in a driver-model context (i.e. attached to a device with
|
||||
* dev_get_uclass_priv()
|
||||
*/
|
||||
struct udevice *dev;
|
||||
#else
|
||||
pci_dev_t dev;
|
||||
#endif
|
||||
struct ahci_ioports port[AHCI_MAX_PORTS];
|
||||
u16 *ataid[AHCI_MAX_PORTS];
|
||||
u32 n_ports;
|
||||
u32 hard_port_no;
|
||||
u32 host_flags;
|
||||
u32 host_set_flags;
|
||||
void __iomem *mmio_base;
|
||||
u32 pio_mask;
|
||||
u32 udma_mask;
|
||||
u32 flags;
|
||||
u32 cap; /* cache of HOST_CAP register */
|
||||
u32 port_map; /* cache of HOST_PORTS_IMPL reg */
|
||||
u32 link_port_map; /*linkup port map*/
|
||||
};
|
||||
|
||||
struct ahci_ops {
|
||||
/**
|
||||
* reset() - reset the controller
|
||||
*
|
||||
* @dev: Controller to reset
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int (*reset)(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* port_status() - get the status of a SATA port
|
||||
*
|
||||
* @dev: Controller to reset
|
||||
* @port: Port number to check (0 for first)
|
||||
* @return 0 if detected, -ENXIO if nothing on port, other -ve on error
|
||||
*/
|
||||
int (*port_status)(struct udevice *dev, int port);
|
||||
|
||||
/**
|
||||
* scan() - scan SATA ports
|
||||
*
|
||||
* @dev: Controller to scan
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int (*scan)(struct udevice *dev);
|
||||
};
|
||||
|
||||
#define ahci_get_ops(dev) ((struct ahci_ops *)(dev)->driver->ops)
|
||||
|
||||
/**
|
||||
* sata_reset() - reset the controller
|
||||
*
|
||||
* @dev: Controller to reset
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int sata_reset(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* sata_port_status() - get the status of a SATA port
|
||||
*
|
||||
* @dev: Controller to reset
|
||||
* @port: Port number to check (0 for first)
|
||||
* @return 0 if detected, -ENXIO if nothin on port, other -ve on error
|
||||
*/
|
||||
int sata_dm_port_status(struct udevice *dev, int port);
|
||||
|
||||
/**
|
||||
* sata_scan() - scan SATA ports
|
||||
*
|
||||
* @dev: Controller to scan
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int sata_scan(struct udevice *dev);
|
||||
|
||||
int ahci_init(void __iomem *base);
|
||||
int ahci_reset(void __iomem *base);
|
||||
|
||||
/**
|
||||
* ahci_init_one_dm() - set up a single AHCI port
|
||||
*
|
||||
* @dev: Controller to init
|
||||
*/
|
||||
int ahci_init_one_dm(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* ahci_start_ports_dm() - start all AHCI ports for a controller
|
||||
*
|
||||
* @dev: Controller containing ports to start
|
||||
*/
|
||||
int ahci_start_ports_dm(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* ahci_init_dm() - init AHCI for a controller, finding all ports
|
||||
*
|
||||
* @dev: Device to init
|
||||
*/
|
||||
int ahci_init_dm(struct udevice *dev, void __iomem *base);
|
||||
|
||||
/**
|
||||
* ahci_bind_scsi() - bind a new SCSI bus as a child
|
||||
*
|
||||
* Note that the SCSI bus device will itself bind block devices
|
||||
*
|
||||
* @ahci_dev: AHCI parent device
|
||||
* @devp: Returns new SCSI bus device
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int ahci_bind_scsi(struct udevice *ahci_dev, struct udevice **devp);
|
||||
|
||||
/**
|
||||
* ahci_probe_scsi() - probe and scan the attached SCSI bus
|
||||
*
|
||||
* Note that the SCSI device will itself bind block devices for any storage
|
||||
* devices it finds.
|
||||
*
|
||||
* @ahci_dev: AHCI parent device
|
||||
* @base: Base address of AHCI port
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int ahci_probe_scsi(struct udevice *ahci_dev, ulong base);
|
||||
|
||||
/**
|
||||
* ahci_probe_scsi_pci() - probe and scan the attached SCSI bus on PCI
|
||||
*
|
||||
* Note that the SCSI device will itself bind block devices for any storage
|
||||
* devices it finds.
|
||||
*
|
||||
* @ahci_dev: AHCI parent device
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int ahci_probe_scsi_pci(struct udevice *ahci_dev);
|
||||
|
||||
#endif
|
||||
37
include/ali512x.h
Normal file
37
include/ali512x.h
Normal file
@@ -0,0 +1,37 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2002
|
||||
* Daniel Engström, Omicron Ceti AB <daniel@omicron.se>.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_IC_ALI512X_H_
|
||||
#define __ASM_IC_ALI512X_H_
|
||||
|
||||
# define ALI_INDEX 0x3f0
|
||||
# define ALI_DATA 0x3f1
|
||||
|
||||
# define ALI_ENABLED 1
|
||||
# define ALI_DISABLED 0
|
||||
|
||||
# define ALI_UART1 0
|
||||
# define ALI_UART2 1
|
||||
|
||||
/* setup functions */
|
||||
void ali512x_init(void);
|
||||
void ali512x_set_fdc(int enabled, u16 io, u8 irq, u8 dma_channel);
|
||||
void ali512x_set_pp(int enabled, u16 io, u8 irq, u8 dma_channel);
|
||||
void ali512x_set_uart(int enabled, int index, u16 io, u8 irq);
|
||||
void ali512x_set_rtc(int enabled, u16 io, u8 irq);
|
||||
void ali512x_set_kbc(int enabled, u8 kbc_irq, u8 mouse_irq);
|
||||
void ali512x_set_cio(int enabled);
|
||||
|
||||
|
||||
/* common I/O functions */
|
||||
void ali512x_cio_function(int pin, int special, int inv, int input);
|
||||
void ali512x_cio_out(int pin, int value);
|
||||
int ali512x_cio_in(int pin);
|
||||
|
||||
/* misc features */
|
||||
void ali512x_set_uart2_irda(int enabled);
|
||||
|
||||
#endif
|
||||
127
include/altera.h
Normal file
127
include/altera.h
Normal file
@@ -0,0 +1,127 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2002
|
||||
* Rich Ireland, Enterasys Networks, rireland@enterasys.com.
|
||||
*/
|
||||
|
||||
#include <fpga.h>
|
||||
|
||||
#ifndef _ALTERA_H_
|
||||
#define _ALTERA_H_
|
||||
|
||||
/*
|
||||
* For the StratixV FPGA programming via SPI, the following
|
||||
* information is coded in the 32bit cookie:
|
||||
* Bit 31 ... Bit 0
|
||||
* SPI-Bus | SPI-Dev | Config-Pin | Done-Pin
|
||||
*/
|
||||
#define FPGA_COOKIE(bus, dev, config, done) \
|
||||
(((bus) << 24) | ((dev) << 16) | ((config) << 8) | (done))
|
||||
#define COOKIE2SPI_BUS(c) (((c) >> 24) & 0xff)
|
||||
#define COOKIE2SPI_DEV(c) (((c) >> 16) & 0xff)
|
||||
#define COOKIE2CONFIG(c) (((c) >> 8) & 0xff)
|
||||
#define COOKIE2DONE(c) ((c) & 0xff)
|
||||
|
||||
enum altera_iface {
|
||||
/* insert all new types after this */
|
||||
min_altera_iface_type,
|
||||
/* serial data and external clock */
|
||||
passive_serial,
|
||||
/* parallel data */
|
||||
passive_parallel_synchronous,
|
||||
/* parallel data */
|
||||
passive_parallel_asynchronous,
|
||||
/* serial data w/ internal clock (not used) */
|
||||
passive_serial_asynchronous,
|
||||
/* jtag/tap serial (not used ) */
|
||||
altera_jtag_mode,
|
||||
/* fast passive parallel (FPP) */
|
||||
fast_passive_parallel,
|
||||
/* fast passive parallel with security (FPPS) */
|
||||
fast_passive_parallel_security,
|
||||
/* secure device manager (SDM) mailbox */
|
||||
secure_device_manager_mailbox,
|
||||
/* insert all new types before this */
|
||||
max_altera_iface_type,
|
||||
};
|
||||
|
||||
enum altera_family {
|
||||
/* insert all new types after this */
|
||||
min_altera_type,
|
||||
/* ACEX1K Family */
|
||||
Altera_ACEX1K,
|
||||
/* CYCLONII Family */
|
||||
Altera_CYC2,
|
||||
/* StratixII Family */
|
||||
Altera_StratixII,
|
||||
/* StratixV Family */
|
||||
Altera_StratixV,
|
||||
/* Stratix10 Family */
|
||||
Intel_FPGA_Stratix10,
|
||||
/* SoCFPGA Family */
|
||||
Altera_SoCFPGA,
|
||||
|
||||
/* Add new models here */
|
||||
|
||||
/* insert all new types before this */
|
||||
max_altera_type,
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
/* part type */
|
||||
enum altera_family family;
|
||||
/* interface type */
|
||||
enum altera_iface iface;
|
||||
/* bytes of data part can accept */
|
||||
size_t size;
|
||||
/* interface function table */
|
||||
void *iface_fns;
|
||||
/* base interface address */
|
||||
void *base;
|
||||
/* implementation specific cookie */
|
||||
int cookie;
|
||||
} Altera_desc;
|
||||
|
||||
/* Generic Altera Functions
|
||||
*********************************************************************/
|
||||
extern int altera_load(Altera_desc *desc, const void *image, size_t size);
|
||||
extern int altera_dump(Altera_desc *desc, const void *buf, size_t bsize);
|
||||
extern int altera_info(Altera_desc *desc);
|
||||
|
||||
/* Board specific implementation specific function types
|
||||
*********************************************************************/
|
||||
typedef int (*Altera_pre_fn)( int cookie );
|
||||
typedef int (*Altera_config_fn)( int assert_config, int flush, int cookie );
|
||||
typedef int (*Altera_status_fn)( int cookie );
|
||||
typedef int (*Altera_done_fn)( int cookie );
|
||||
typedef int (*Altera_clk_fn)( int assert_clk, int flush, int cookie );
|
||||
typedef int (*Altera_data_fn)( int assert_data, int flush, int cookie );
|
||||
typedef int(*Altera_write_fn)(const void *buf, size_t len, int flush, int cookie);
|
||||
typedef int (*Altera_abort_fn)( int cookie );
|
||||
typedef int (*Altera_post_fn)( int cookie );
|
||||
|
||||
typedef struct {
|
||||
Altera_pre_fn pre;
|
||||
Altera_config_fn config;
|
||||
Altera_status_fn status;
|
||||
Altera_done_fn done;
|
||||
Altera_clk_fn clk;
|
||||
Altera_data_fn data;
|
||||
Altera_write_fn write;
|
||||
Altera_abort_fn abort;
|
||||
Altera_post_fn post;
|
||||
} altera_board_specific_func;
|
||||
|
||||
#ifdef CONFIG_FPGA_SOCFPGA
|
||||
int socfpga_load(Altera_desc *desc, const void *rbf_data, size_t rbf_size);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FPGA_STRATIX_V
|
||||
int stratixv_load(Altera_desc *desc, const void *rbf_data, size_t rbf_size);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FPGA_STRATIX10
|
||||
int stratix10_load(Altera_desc *desc, const void *rbf_data, size_t rbf_size);
|
||||
#endif
|
||||
|
||||
#endif /* _ALTERA_H_ */
|
||||
354
include/andestech/andes_pcu.h
Normal file
354
include/andestech/andes_pcu.h
Normal file
@@ -0,0 +1,354 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2011 Andes Technology Corp
|
||||
* Macpaul Lin <macpaul@andestech.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Andes Power Control Unit
|
||||
*/
|
||||
#ifndef __ANDES_PCU_H
|
||||
#define __ANDES_PCU_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
struct pcs {
|
||||
unsigned int cr; /* PCSx Configuration (clock scaling) */
|
||||
unsigned int parm; /* PCSx Parameter*/
|
||||
unsigned int stat1; /* PCSx Status 1 */
|
||||
unsigned int stat2; /* PCSx Stusts 2 */
|
||||
unsigned int pdd; /* PCSx PDD */
|
||||
};
|
||||
|
||||
struct andes_pcu {
|
||||
unsigned int rev; /* 0x00 - PCU Revision */
|
||||
unsigned int spinfo; /* 0x04 - Scratch Pad Info */
|
||||
unsigned int rsvd1[2]; /* 0x08-0x0C: Reserved */
|
||||
unsigned int soc_id; /* 0x10 - SoC ID */
|
||||
unsigned int soc_ahb; /* 0x14 - SoC AHB configuration */
|
||||
unsigned int soc_apb; /* 0x18 - SoC APB configuration */
|
||||
unsigned int rsvd2; /* 0x1C */
|
||||
unsigned int dcsrcr0; /* 0x20 - Driving Capability
|
||||
and Slew Rate Control 0 */
|
||||
unsigned int dcsrcr1; /* 0x24 - Driving Capability
|
||||
and Slew Rate Control 1 */
|
||||
unsigned int dcsrcr2; /* 0x28 - Driving Capability
|
||||
and Slew Rate Control 2 */
|
||||
unsigned int rsvd3; /* 0x2C */
|
||||
unsigned int mfpsr0; /* 0x30 - Multi-Func Port Setting 0 */
|
||||
unsigned int mfpsr1; /* 0x34 - Multi-Func Port Setting 1 */
|
||||
unsigned int dmaes; /* 0x38 - DMA Engine Selection */
|
||||
unsigned int rsvd4; /* 0x3C */
|
||||
unsigned int oscc; /* 0x40 - OSC Control */
|
||||
unsigned int pwmcd; /* 0x44 - PWM Clock divider */
|
||||
unsigned int socmisc; /* 0x48 - SoC Misc. */
|
||||
unsigned int rsvd5[13]; /* 0x4C-0x7C: Reserved */
|
||||
unsigned int bsmcr; /* 0x80 - BSM Controrl */
|
||||
unsigned int bsmst; /* 0x84 - BSM Status */
|
||||
unsigned int wes; /* 0x88 - Wakeup Event Sensitivity*/
|
||||
unsigned int west; /* 0x8C - Wakeup Event Status */
|
||||
unsigned int rsttiming; /* 0x90 - Reset Timing */
|
||||
unsigned int intr_st; /* 0x94 - PCU Interrupt Status */
|
||||
unsigned int rsvd6[2]; /* 0x98-0x9C: Reserved */
|
||||
struct pcs pcs1; /* 0xA0-0xB0: PCS1 (clock scaling) */
|
||||
unsigned int pcsrsvd1[3]; /* 0xB4-0xBC: Reserved */
|
||||
struct pcs pcs2; /* 0xC0-0xD0: PCS2 (AHB clock gating) */
|
||||
unsigned int pcsrsvd2[3]; /* 0xD4-0xDC: Reserved */
|
||||
struct pcs pcs3; /* 0xE0-0xF0: PCS3 (APB clock gating) */
|
||||
unsigned int pcsrsvd3[3]; /* 0xF4-0xFC: Reserved */
|
||||
struct pcs pcs4; /* 0x100-0x110: PCS4 main PLL scaling */
|
||||
unsigned int pcsrsvd4[3]; /* 0x114-0x11C: Reserved */
|
||||
struct pcs pcs5; /* 0x120-0x130: PCS5 PCI PLL scaling */
|
||||
unsigned int pcsrsvd5[3]; /* 0x134-0x13C: Reserved */
|
||||
struct pcs pcs6; /* 0x140-0x150: PCS6 AC97 PLL scaling */
|
||||
unsigned int pcsrsvd6[3]; /* 0x154-0x15C: Reserved */
|
||||
struct pcs pcs7; /* 0x160-0x170: PCS7 GMAC PLL scaling */
|
||||
unsigned int pcsrsvd7[3]; /* 0x174-0x17C: Reserved */
|
||||
struct pcs pcs8; /* 0x180-0x190: PCS8 voltage scaling */
|
||||
unsigned int pcsrsvd8[3]; /* 0x194-0x19C: Reserved */
|
||||
struct pcs pcs9; /* 0x1A0-0x1B0: PCS9 power control */
|
||||
unsigned int pcsrsvd9[93]; /* 0x1B4-0x3FC: Reserved */
|
||||
unsigned int pmspdm[40]; /* 0x400-0x4fC: Power Manager
|
||||
Scratch Pad Memory 0 */
|
||||
};
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
/*
|
||||
* PCU Revision Register (ro)
|
||||
*/
|
||||
#define ANDES_PCU_REV_NUMBER_PCS(x) (((x) >> 0) & 0xff)
|
||||
#define ANDES_PCU_REV_VER(x) (((x) >> 16) & 0xffff)
|
||||
|
||||
/*
|
||||
* Scratch Pad Info Register (ro)
|
||||
*/
|
||||
#define ANDES_PCU_SPINFO_SIZE(x) (((x) >> 0) & 0xff)
|
||||
#define ANDES_PCU_SPINFO_OFFSET(x) (((x) >> 8) & 0xf)
|
||||
|
||||
/*
|
||||
* SoC ID Register (ro)
|
||||
*/
|
||||
#define ANDES_PCU_SOC_ID_VER_MINOR(x) (((x) >> 0) & 0xf)
|
||||
#define ANDES_PCU_SOC_ID_VER_MAJOR(x) (((x) >> 4) & 0xfff)
|
||||
#define ANDES_PCU_SOC_ID_DEVICEID(x) (((x) >> 16) & 0xffff)
|
||||
|
||||
/*
|
||||
* SoC AHB Configuration Register (ro)
|
||||
*/
|
||||
#define ANDES_PCU_SOC_AHB_AHBC(x) ((x) << 0)
|
||||
#define ANDES_PCU_SOC_AHB_APBREG(x) ((x) << 1)
|
||||
#define ANDES_PCU_SOC_AHB_APB(x) ((x) << 2)
|
||||
#define ANDES_PCU_SOC_AHB_DLM1(x) ((x) << 3)
|
||||
#define ANDES_PCU_SOC_AHB_SPIROM(x) ((x) << 4)
|
||||
#define ANDES_PCU_SOC_AHB_DDR2C(x) ((x) << 5)
|
||||
#define ANDES_PCU_SOC_AHB_DDR2MEM(x) ((x) << 6)
|
||||
#define ANDES_PCU_SOC_AHB_DMAC(x) ((x) << 7)
|
||||
#define ANDES_PCU_SOC_AHB_DLM2(x) ((x) << 8)
|
||||
#define ANDES_PCU_SOC_AHB_GPU(x) ((x) << 9)
|
||||
#define ANDES_PCU_SOC_AHB_GMAC(x) ((x) << 12)
|
||||
#define ANDES_PCU_SOC_AHB_IDE(x) ((x) << 13)
|
||||
#define ANDES_PCU_SOC_AHB_USBOTG(x) ((x) << 14)
|
||||
#define ANDES_PCU_SOC_AHB_INTC(x) ((x) << 15)
|
||||
#define ANDES_PCU_SOC_AHB_LPCIO(x) ((x) << 16)
|
||||
#define ANDES_PCU_SOC_AHB_LPCREG(x) ((x) << 17)
|
||||
#define ANDES_PCU_SOC_AHB_PCIIO(x) ((x) << 18)
|
||||
#define ANDES_PCU_SOC_AHB_PCIMEM(x) ((x) << 19)
|
||||
#define ANDES_PCU_SOC_AHB_L2CC(x) ((x) << 20)
|
||||
#define ANDES_PCU_SOC_AHB_AHB2AHBREG(x) ((x) << 27)
|
||||
#define ANDES_PCU_SOC_AHB_AHB2AHBMEM0(x) ((x) << 28)
|
||||
#define ANDES_PCU_SOC_AHB_AHB2AHBMEM1(x) ((x) << 29)
|
||||
#define ANDES_PCU_SOC_AHB_AHB2AHBMEM2(x) ((x) << 30)
|
||||
#define ANDES_PCU_SOC_AHB_AHB2AHBMEM3(x) ((x) << 31)
|
||||
|
||||
/*
|
||||
* SoC APB Configuration Register (ro)
|
||||
*/
|
||||
#define ANDES_PCU_SOC_APB_CFC(x) ((x) << 1)
|
||||
#define ANDES_PCU_SOC_APB_SSP(x) ((x) << 2)
|
||||
#define ANDES_PCU_SOC_APB_UART1(x) ((x) << 3)
|
||||
#define ANDES_PCU_SOC_APB_SDC(x) ((x) << 5)
|
||||
#define ANDES_PCU_SOC_APB_AC97I2S(x) ((x) << 6)
|
||||
#define ANDES_PCU_SOC_APB_UART2(x) ((x) << 8)
|
||||
#define ANDES_PCU_SOC_APB_PCU(x) ((x) << 16)
|
||||
#define ANDES_PCU_SOC_APB_TMR(x) ((x) << 17)
|
||||
#define ANDES_PCU_SOC_APB_WDT(x) ((x) << 18)
|
||||
#define ANDES_PCU_SOC_APB_RTC(x) ((x) << 19)
|
||||
#define ANDES_PCU_SOC_APB_GPIO(x) ((x) << 20)
|
||||
#define ANDES_PCU_SOC_APB_I2C(x) ((x) << 22)
|
||||
#define ANDES_PCU_SOC_APB_PWM(x) ((x) << 23)
|
||||
|
||||
/*
|
||||
* Driving Capability and Slew Rate Control Register 0 (rw)
|
||||
*/
|
||||
#define ANDES_PCU_DCSRCR0_TRIAHB(x) (((x) & 0x1f) << 0)
|
||||
#define ANDES_PCU_DCSRCR0_LPC(x) (((x) & 0xf) << 8)
|
||||
#define ANDES_PCU_DCSRCR0_ULPI(x) (((x) & 0xf) << 12)
|
||||
#define ANDES_PCU_DCSRCR0_GMAC(x) (((x) & 0xf) << 16)
|
||||
#define ANDES_PCU_DCSRCR0_GPU(x) (((x) & 0xf) << 20)
|
||||
|
||||
/*
|
||||
* Driving Capability and Slew Rate Control Register 1 (rw)
|
||||
*/
|
||||
#define ANDES_PCU_DCSRCR1_I2C(x) (((x) & 0xf) << 0)
|
||||
|
||||
/*
|
||||
* Driving Capability and Slew Rate Control Register 2 (rw)
|
||||
*/
|
||||
#define ANDES_PCU_DCSRCR2_UART1(x) (((x) & 0xf) << 0)
|
||||
#define ANDES_PCU_DCSRCR2_UART2(x) (((x) & 0xf) << 4)
|
||||
#define ANDES_PCU_DCSRCR2_AC97(x) (((x) & 0xf) << 8)
|
||||
#define ANDES_PCU_DCSRCR2_SPI(x) (((x) & 0xf) << 12)
|
||||
#define ANDES_PCU_DCSRCR2_SD(x) (((x) & 0xf) << 16)
|
||||
#define ANDES_PCU_DCSRCR2_CFC(x) (((x) & 0xf) << 20)
|
||||
#define ANDES_PCU_DCSRCR2_GPIO(x) (((x) & 0xf) << 24)
|
||||
#define ANDES_PCU_DCSRCR2_PCU(x) (((x) & 0xf) << 28)
|
||||
|
||||
/*
|
||||
* Multi-function Port Setting Register 0 (rw)
|
||||
*/
|
||||
#define ANDES_PCU_MFPSR0_PCIMODE(x) ((x) << 0)
|
||||
#define ANDES_PCU_MFPSR0_IDEMODE(x) ((x) << 1)
|
||||
#define ANDES_PCU_MFPSR0_MINI_TC01(x) ((x) << 2)
|
||||
#define ANDES_PCU_MFPSR0_AHB_DEBUG(x) ((x) << 3)
|
||||
#define ANDES_PCU_MFPSR0_AHB_TARGET(x) ((x) << 4)
|
||||
#define ANDES_PCU_MFPSR0_DEFAULT_IVB(x) (((x) & 0x7) << 28)
|
||||
#define ANDES_PCU_MFPSR0_DEFAULT_ENDIAN(x) ((x) << 31)
|
||||
|
||||
/*
|
||||
* Multi-function Port Setting Register 1 (rw)
|
||||
*/
|
||||
#define ANDES_PCU_MFPSR1_SUSPEND(x) ((x) << 0)
|
||||
#define ANDES_PCU_MFPSR1_PWM0(x) ((x) << 1)
|
||||
#define ANDES_PCU_MFPSR1_PWM1(x) ((x) << 2)
|
||||
#define ANDES_PCU_MFPSR1_AC97CLKOUT(x) ((x) << 3)
|
||||
#define ANDES_PCU_MFPSR1_PWREN(x) ((x) << 4)
|
||||
#define ANDES_PCU_MFPSR1_PME(x) ((x) << 5)
|
||||
#define ANDES_PCU_MFPSR1_I2C(x) ((x) << 6)
|
||||
#define ANDES_PCU_MFPSR1_UART1(x) ((x) << 7)
|
||||
#define ANDES_PCU_MFPSR1_UART2(x) ((x) << 8)
|
||||
#define ANDES_PCU_MFPSR1_SPI(x) ((x) << 9)
|
||||
#define ANDES_PCU_MFPSR1_SD(x) ((x) << 10)
|
||||
#define ANDES_PCU_MFPSR1_GPUPLLSRC(x) ((x) << 27)
|
||||
#define ANDES_PCU_MFPSR1_DVOMODE(x) ((x) << 28)
|
||||
#define ANDES_PCU_MFPSR1_HSMP_FAST_REQ(x) ((x) << 29)
|
||||
#define ANDES_PCU_MFPSR1_AHB_FAST_REQ(x) ((x) << 30)
|
||||
#define ANDES_PCU_MFPSR1_PMUR_EXT_INT(x) ((x) << 31)
|
||||
|
||||
/*
|
||||
* DMA Engine Selection Register (rw)
|
||||
*/
|
||||
#define ANDES_PCU_DMAES_AC97RX(x) ((x) << 2)
|
||||
#define ANDES_PCU_DMAES_AC97TX(x) ((x) << 3)
|
||||
#define ANDES_PCU_DMAES_UART1RX(x) ((x) << 4)
|
||||
#define ANDES_PCU_DMAES_UART1TX(x) ((x) << 5)
|
||||
#define ANDES_PCU_DMAES_UART2RX(x) ((x) << 6)
|
||||
#define ANDES_PCU_DMAES_UART2TX(x) ((x) << 7)
|
||||
#define ANDES_PCU_DMAES_SDDMA(x) ((x) << 8)
|
||||
#define ANDES_PCU_DMAES_CFCDMA(x) ((x) << 9)
|
||||
|
||||
/*
|
||||
* OSC Control Register (rw)
|
||||
*/
|
||||
#define ANDES_PCU_OSCC_OSCH_OFF(x) ((x) << 0)
|
||||
#define ANDES_PCU_OSCC_OSCH_STABLE(x) ((x) << 1)
|
||||
#define ANDES_PCU_OSCC_OSCH_TRI(x) ((x) << 2)
|
||||
#define ANDES_PCU_OSCC_OSCH_RANGE(x) (((x) & 0x3) << 4)
|
||||
#define ANDES_PCU_OSCC_OSCH2_RANGE(x) (((x) & 0x3) << 6)
|
||||
#define ANDES_PCU_OSCC_OSCH3_RANGE(x) (((x) & 0x3) << 8)
|
||||
|
||||
/*
|
||||
* PWM Clock Divider Register (rw)
|
||||
*/
|
||||
#define ANDES_PCU_PWMCD_PWMDIV(x) (((x) & 0xf) << 0)
|
||||
|
||||
/*
|
||||
* SoC Misc. Register (rw)
|
||||
*/
|
||||
#define ANDES_PCU_SOCMISC_RSCPUA(x) ((x) << 0)
|
||||
#define ANDES_PCU_SOCMISC_RSCPUB(x) ((x) << 1)
|
||||
#define ANDES_PCU_SOCMISC_RSPCI(x) ((x) << 2)
|
||||
#define ANDES_PCU_SOCMISC_USBWAKE(x) ((x) << 3)
|
||||
#define ANDES_PCU_SOCMISC_EXLM_WAITA(x) (((x) & 0x3) << 4)
|
||||
#define ANDES_PCU_SOCMISC_EXLM_WAITB(x) (((x) & 0x3) << 6)
|
||||
#define ANDES_PCU_SOCMISC_DDRPLL_BYPASS(x) (((x) << 8)
|
||||
#define ANDES_PCU_SOCMISC_300MHZSEL(x) (((x) << 9)
|
||||
#define ANDES_PCU_SOCMISC_DDRDLL_SRST(x) (((x) << 10)
|
||||
#define ANDES_PCU_SOCMISC_DDRDDQ_TEST(x) (((x) << 11)
|
||||
#define ANDES_PCU_SOCMISC_DDRDLL_TEST(x) (((x) << 12)
|
||||
#define ANDES_PCU_SOCMISC_GPUPLL_BYPASS(x) (((x) << 13)
|
||||
#define ANDES_PCU_SOCMISC_ENCPUA(x) (((x) << 14)
|
||||
#define ANDES_PCU_SOCMISC_ENCPUB(x) (((x) << 15)
|
||||
#define ANDES_PCU_SOCMISC_PWON_PWBTN(x) (((x) << 16)
|
||||
#define ANDES_PCU_SOCMISC_PWON_GPIO1(x) (((x) << 17)
|
||||
#define ANDES_PCU_SOCMISC_PWON_GPIO2(x) (((x) << 18)
|
||||
#define ANDES_PCU_SOCMISC_PWON_GPIO3(x) (((x) << 19)
|
||||
#define ANDES_PCU_SOCMISC_PWON_GPIO4(x) (((x) << 20)
|
||||
#define ANDES_PCU_SOCMISC_PWON_GPIO5(x) (((x) << 21)
|
||||
#define ANDES_PCU_SOCMISC_PWON_WOL(x) (((x) << 22)
|
||||
#define ANDES_PCU_SOCMISC_PWON_RTC(x) (((x) << 23)
|
||||
#define ANDES_PCU_SOCMISC_PWON_RTCALM(x) (((x) << 24)
|
||||
#define ANDES_PCU_SOCMISC_PWON_XDBGIN(x) (((x) << 25)
|
||||
#define ANDES_PCU_SOCMISC_PWON_PME(x) (((x) << 26)
|
||||
#define ANDES_PCU_SOCMISC_PWON_PWFAIL(x) (((x) << 27)
|
||||
#define ANDES_PCU_SOCMISC_CPUA_SRSTED(x) (((x) << 28)
|
||||
#define ANDES_PCU_SOCMISC_CPUB_SRSTED(x) (((x) << 29)
|
||||
#define ANDES_PCU_SOCMISC_WD_RESET(x) (((x) << 30)
|
||||
#define ANDES_PCU_SOCMISC_HW_RESET(x) (((x) << 31)
|
||||
|
||||
/*
|
||||
* BSM Control Register (rw)
|
||||
*/
|
||||
#define ANDES_PCU_BSMCR_LINK0(x) (((x) & 0xf) << 0)
|
||||
#define ANDES_PCU_BSMCR_LINK1(x) (((x) & 0xf) << 4)
|
||||
#define ANDES_PCU_BSMCR_SYNCSRC(x) (((x) & 0xf) << 24)
|
||||
#define ANDES_PCU_BSMCR_CMD(x) (((x) & 0x7) << 28)
|
||||
#define ANDES_PCU_BSMCR_IE(x) ((x) << 31)
|
||||
|
||||
/*
|
||||
* BSM Status Register
|
||||
*/
|
||||
#define ANDES_PCU_BSMSR_CI0(x) (((x) & 0xf) << 0)
|
||||
#define ANDES_PCU_BSMSR_CI1(x) (((x) & 0xf) << 4)
|
||||
#define ANDES_PCU_BSMSR_SYNCSRC(x) (((x) & 0xf) << 24)
|
||||
#define ANDES_PCU_BSMSR_BSMST(x) (((x) & 0xf) << 28)
|
||||
|
||||
/*
|
||||
* Wakeup Event Sensitivity Register (rw)
|
||||
*/
|
||||
#define ANDES_PCU_WESR_POLOR(x) (((x) & 0xff) << 0)
|
||||
|
||||
/*
|
||||
* Wakeup Event Status Register (ro)
|
||||
*/
|
||||
#define ANDES_PCU_WEST_SIG(x) (((x) & 0xff) << 0)
|
||||
|
||||
/*
|
||||
* Reset Timing Register
|
||||
*/
|
||||
#define ANDES_PCU_RSTTIMING_RG0(x) (((x) & 0xff) << 0)
|
||||
#define ANDES_PCU_RSTTIMING_RG1(x) (((x) & 0xff) << 8)
|
||||
#define ANDES_PCU_RSTTIMING_RG2(x) (((x) & 0xff) << 16)
|
||||
#define ANDES_PCU_RSTTIMING_RG3(x) (((x) & 0xff) << 24)
|
||||
|
||||
/*
|
||||
* PCU Interrupt Status Register
|
||||
*/
|
||||
#define ANDES_PCU_INTR_ST_BSM(x) ((x) << 0)
|
||||
#define ANDES_PCU_INTR_ST_PCS1(x) ((x) << 1)
|
||||
#define ANDES_PCU_INTR_ST_PCS2(x) ((x) << 2)
|
||||
#define ANDES_PCU_INTR_ST_PCS3(x) ((x) << 3)
|
||||
#define ANDES_PCU_INTR_ST_PCS4(x) ((x) << 4)
|
||||
#define ANDES_PCU_INTR_ST_PCS5(x) ((x) << 5)
|
||||
#define ANDES_PCU_INTR_ST_PCS6(x) ((x) << 6)
|
||||
#define ANDES_PCU_INTR_ST_PCS7(x) ((x) << 7)
|
||||
#define ANDES_PCU_INTR_ST_PCS8(x) ((x) << 8)
|
||||
#define ANDES_PCU_INTR_ST_PCS9(x) ((x) << 9)
|
||||
|
||||
/*
|
||||
* PCSx Configuration Register
|
||||
*/
|
||||
#define ANDES_PCU_PCSX_CR_WAKEUP_EN(x) (((x) & 0xff) << 0)
|
||||
#define ANDES_PCU_PCSX_CR_LW(x) (((x) & 0xf) << 16)
|
||||
#define ANDES_PCU_PCSX_CR_LS(x) (((x) & 0xf) << 20)
|
||||
#define ANDES_PCU_PCSX_CR_TYPE(x) (((x) >> 28) & 0x7) /* (ro) */
|
||||
|
||||
/*
|
||||
* PCSx Parameter Register (rw)
|
||||
*/
|
||||
#define ANDES_PCU_PCSX_PARM_NEXT(x) (((x) & 0xffffff) << 0)
|
||||
#define ANDES_PCU_PCSX_PARM_SYNCSRC(x) (((x) & 0xf) << 24)
|
||||
#define ANDES_PCU_PCSX_PARM_PCSCMD(x) (((x) & 0x7) << 28)
|
||||
#define ANDES_PCU_PCSX_PARM_IE(x) (((x) << 31)
|
||||
|
||||
/*
|
||||
* PCSx Status Register 1
|
||||
*/
|
||||
#define ANDES_PCU_PCSX_STAT1_ERRNO(x) (((x) & 0xf) << 0)
|
||||
#define ANDES_PCU_PCSX_STAT1_ST(x) (((x) & 0x7) << 28)
|
||||
|
||||
/*
|
||||
* PCSx Status Register 2
|
||||
*/
|
||||
#define ANDES_PCU_PCSX_STAT2_CRNTPARM(x) (((x) & 0xffffff) << 0)
|
||||
#define ANDES_PCU_PCSX_STAT2_SYNCSRC(x) (((x) & 0xf) << 24)
|
||||
|
||||
/*
|
||||
* PCSx PDD Register
|
||||
* This is reserved for PCS(1-7)
|
||||
*/
|
||||
#define ANDES_PCU_PCS8_PDD_1BYTE(x) (((x) & 0xff) << 0)
|
||||
#define ANDES_PCU_PCS8_PDD_2BYTE(x) (((x) & 0xff) << 8)
|
||||
#define ANDES_PCU_PCS8_PDD_3BYTE(x) (((x) & 0xff) << 16)
|
||||
#define ANDES_PCU_PCS8_PDD_4BYTE(x) (((x) & 0xff) << 24)
|
||||
|
||||
#define ANDES_PCU_PCS9_PDD_TIME1(x) (((x) & 0x3f) << 0)
|
||||
#define ANDES_PCU_PCS9_PDD_TIME2(x) (((x) & 0x3f) << 6)
|
||||
#define ANDES_PCU_PCS9_PDD_TIME3(x) (((x) & 0x3f) << 12)
|
||||
#define ANDES_PCU_PCS9_PDD_TIME4(x) (((x) & 0x3f) << 18)
|
||||
#define ANDES_PCU_PCS9_PDD_TICKTYPE(x) ((x) << 24)
|
||||
#define ANDES_PCU_PCS9_PDD_GPU_SRST(x) ((x) << 27)
|
||||
#define ANDES_PCU_PCS9_PDD_PWOFFTIME(x) (((x) & 0x3) << 28)
|
||||
#define ANDES_PCU_PCS9_PDD_SUS2DRAM(x) ((x) << 30)
|
||||
#define ANDES_PCU_PCS9_PDD_CLRPWOFF_FLAG(x) ((x) << 31)
|
||||
|
||||
#endif /* __ANDES_PCU_H */
|
||||
34
include/android_ab.h
Normal file
34
include/android_ab.h
Normal file
@@ -0,0 +1,34 @@
|
||||
/* SPDX-License-Identifier: BSD-2-Clause */
|
||||
/*
|
||||
* Copyright (C) 2017 The Android Open Source Project
|
||||
*/
|
||||
|
||||
#ifndef __ANDROID_AB_H
|
||||
#define __ANDROID_AB_H
|
||||
|
||||
#include <common.h>
|
||||
|
||||
/* Android standard boot slot names are 'a', 'b', 'c', ... */
|
||||
#define BOOT_SLOT_NAME(slot_num) ('a' + (slot_num))
|
||||
|
||||
/* Number of slots */
|
||||
#define NUM_SLOTS 2
|
||||
|
||||
/**
|
||||
* Select the slot where to boot from.
|
||||
*
|
||||
* On Android devices with more than one boot slot (multiple copies of the
|
||||
* kernel and system images) selects which slot should be used to boot from and
|
||||
* registers the boot attempt. This is used in by the new A/B update model where
|
||||
* one slot is updated in the background while running from the other slot. If
|
||||
* the selected slot did not successfully boot in the past, a boot attempt is
|
||||
* registered before returning from this function so it isn't selected
|
||||
* indefinitely.
|
||||
*
|
||||
* @param[in] dev_desc Place to store the device description pointer
|
||||
* @param[in] part_info Place to store the partition information
|
||||
* @return The slot number (>= 0) on success, or a negative on error
|
||||
*/
|
||||
int ab_select_slot(struct blk_desc *dev_desc, disk_partition_t *part_info);
|
||||
|
||||
#endif /* __ANDROID_AB_H */
|
||||
256
include/android_bootloader_message.h
Normal file
256
include/android_bootloader_message.h
Normal file
@@ -0,0 +1,256 @@
|
||||
/*
|
||||
* This is from the Android Project,
|
||||
* Repository: https://android.googlesource.com/platform/bootable/recovery
|
||||
* File: bootloader_message/include/bootloader_message/bootloader_message.h
|
||||
* Commit: See U-Boot commit description
|
||||
*
|
||||
* Copyright (C) 2008 The Android Open Source Project
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef __ANDROID_BOOTLOADER_MESSAGE_H
|
||||
#define __ANDROID_BOOTLOADER_MESSAGE_H
|
||||
|
||||
#ifndef __UBOOT__
|
||||
#include <assert.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#else
|
||||
/* compiler.h defines the types that otherwise are included from stdint.h and
|
||||
* stddef.h
|
||||
*/
|
||||
#include <compiler.h>
|
||||
#endif
|
||||
|
||||
// Spaces used by misc partition are as below:
|
||||
// 0 - 2K For bootloader_message
|
||||
// 2K - 16K Used by Vendor's bootloader (the 2K - 4K range may be optionally used
|
||||
// as bootloader_message_ab struct)
|
||||
// 16K - 64K Used by uncrypt and recovery to store wipe_package for A/B devices
|
||||
// Note that these offsets are admitted by bootloader,recovery and uncrypt, so they
|
||||
// are not configurable without changing all of them.
|
||||
static const size_t BOOTLOADER_MESSAGE_OFFSET_IN_MISC = 0;
|
||||
static const size_t WIPE_PACKAGE_OFFSET_IN_MISC = 16 * 1024;
|
||||
|
||||
/* Bootloader Message (2-KiB)
|
||||
*
|
||||
* This structure describes the content of a block in flash
|
||||
* that is used for recovery and the bootloader to talk to
|
||||
* each other.
|
||||
*
|
||||
* The command field is updated by linux when it wants to
|
||||
* reboot into recovery or to update radio or bootloader firmware.
|
||||
* It is also updated by the bootloader when firmware update
|
||||
* is complete (to boot into recovery for any final cleanup)
|
||||
*
|
||||
* The status field was used by the bootloader after the completion
|
||||
* of an "update-radio" or "update-hboot" command, which has been
|
||||
* deprecated since Froyo.
|
||||
*
|
||||
* The recovery field is only written by linux and used
|
||||
* for the system to send a message to recovery or the
|
||||
* other way around.
|
||||
*
|
||||
* The stage field is written by packages which restart themselves
|
||||
* multiple times, so that the UI can reflect which invocation of the
|
||||
* package it is. If the value is of the format "#/#" (eg, "1/3"),
|
||||
* the UI will add a simple indicator of that status.
|
||||
*
|
||||
* We used to have slot_suffix field for A/B boot control metadata in
|
||||
* this struct, which gets unintentionally cleared by recovery or
|
||||
* uncrypt. Move it into struct bootloader_message_ab to avoid the
|
||||
* issue.
|
||||
*/
|
||||
struct bootloader_message {
|
||||
char command[32];
|
||||
char status[32];
|
||||
char recovery[768];
|
||||
|
||||
// The 'recovery' field used to be 1024 bytes. It has only ever
|
||||
// been used to store the recovery command line, so 768 bytes
|
||||
// should be plenty. We carve off the last 256 bytes to store the
|
||||
// stage string (for multistage packages) and possible future
|
||||
// expansion.
|
||||
char stage[32];
|
||||
|
||||
// The 'reserved' field used to be 224 bytes when it was initially
|
||||
// carved off from the 1024-byte recovery field. Bump it up to
|
||||
// 1184-byte so that the entire bootloader_message struct rounds up
|
||||
// to 2048-byte.
|
||||
char reserved[1184];
|
||||
};
|
||||
|
||||
/**
|
||||
* We must be cautious when changing the bootloader_message struct size,
|
||||
* because A/B-specific fields may end up with different offsets.
|
||||
*/
|
||||
#ifndef __UBOOT__
|
||||
#if (__STDC_VERSION__ >= 201112L) || defined(__cplusplus)
|
||||
static_assert(sizeof(struct bootloader_message) == 2048,
|
||||
"struct bootloader_message size changes, which may break A/B devices");
|
||||
#endif
|
||||
#endif /* __UBOOT__ */
|
||||
|
||||
/**
|
||||
* The A/B-specific bootloader message structure (4-KiB).
|
||||
*
|
||||
* We separate A/B boot control metadata from the regular bootloader
|
||||
* message struct and keep it here. Everything that's A/B-specific
|
||||
* stays after struct bootloader_message, which should be managed by
|
||||
* the A/B-bootloader or boot control HAL.
|
||||
*
|
||||
* The slot_suffix field is used for A/B implementations where the
|
||||
* bootloader does not set the androidboot.ro.boot.slot_suffix kernel
|
||||
* commandline parameter. This is used by fs_mgr to mount /system and
|
||||
* other partitions with the slotselect flag set in fstab. A/B
|
||||
* implementations are free to use all 32 bytes and may store private
|
||||
* data past the first NUL-byte in this field. It is encouraged, but
|
||||
* not mandatory, to use 'struct bootloader_control' described below.
|
||||
*
|
||||
* The update_channel field is used to store the Omaha update channel
|
||||
* if update_engine is compiled with Omaha support.
|
||||
*/
|
||||
struct bootloader_message_ab {
|
||||
struct bootloader_message message;
|
||||
char slot_suffix[32];
|
||||
char update_channel[128];
|
||||
|
||||
// Round up the entire struct to 4096-byte.
|
||||
char reserved[1888];
|
||||
};
|
||||
|
||||
/**
|
||||
* Be cautious about the struct size change, in case we put anything post
|
||||
* bootloader_message_ab struct (b/29159185).
|
||||
*/
|
||||
#ifndef __UBOOT__
|
||||
#if (__STDC_VERSION__ >= 201112L) || defined(__cplusplus)
|
||||
static_assert(sizeof(struct bootloader_message_ab) == 4096,
|
||||
"struct bootloader_message_ab size changes");
|
||||
#endif
|
||||
#endif /* __UBOOT__ */
|
||||
|
||||
#define BOOT_CTRL_MAGIC 0x42414342 /* Bootloader Control AB */
|
||||
#define BOOT_CTRL_VERSION 1
|
||||
|
||||
struct slot_metadata {
|
||||
// Slot priority with 15 meaning highest priority, 1 lowest
|
||||
// priority and 0 the slot is unbootable.
|
||||
uint8_t priority : 4;
|
||||
// Number of times left attempting to boot this slot.
|
||||
uint8_t tries_remaining : 3;
|
||||
// 1 if this slot has booted successfully, 0 otherwise.
|
||||
uint8_t successful_boot : 1;
|
||||
// 1 if this slot is corrupted from a dm-verity corruption, 0
|
||||
// otherwise.
|
||||
uint8_t verity_corrupted : 1;
|
||||
// Reserved for further use.
|
||||
uint8_t reserved : 7;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* Bootloader Control AB
|
||||
*
|
||||
* This struct can be used to manage A/B metadata. It is designed to
|
||||
* be put in the 'slot_suffix' field of the 'bootloader_message'
|
||||
* structure described above. It is encouraged to use the
|
||||
* 'bootloader_control' structure to store the A/B metadata, but not
|
||||
* mandatory.
|
||||
*/
|
||||
struct bootloader_control {
|
||||
// NUL terminated active slot suffix.
|
||||
char slot_suffix[4];
|
||||
// Bootloader Control AB magic number (see BOOT_CTRL_MAGIC).
|
||||
uint32_t magic;
|
||||
// Version of struct being used (see BOOT_CTRL_VERSION).
|
||||
uint8_t version;
|
||||
// Number of slots being managed.
|
||||
uint8_t nb_slot : 3;
|
||||
// Number of times left attempting to boot recovery.
|
||||
uint8_t recovery_tries_remaining : 3;
|
||||
// Ensure 4-bytes alignment for slot_info field.
|
||||
uint8_t reserved0[2];
|
||||
// Per-slot information. Up to 4 slots.
|
||||
struct slot_metadata slot_info[4];
|
||||
// Reserved for further use.
|
||||
uint8_t reserved1[8];
|
||||
// CRC32 of all 28 bytes preceding this field (little endian
|
||||
// format).
|
||||
uint32_t crc32_le;
|
||||
} __attribute__((packed));
|
||||
|
||||
#ifndef __UBOOT__
|
||||
#if (__STDC_VERSION__ >= 201112L) || defined(__cplusplus)
|
||||
static_assert(sizeof(struct bootloader_control) ==
|
||||
sizeof(((struct bootloader_message_ab *)0)->slot_suffix),
|
||||
"struct bootloader_control has wrong size");
|
||||
#endif
|
||||
#endif /* __UBOOT__ */
|
||||
|
||||
#ifndef __UBOOT__
|
||||
#ifdef __cplusplus
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
// Return the block device name for the bootloader message partition and waits
|
||||
// for the device for up to 10 seconds. In case of error returns the empty
|
||||
// string.
|
||||
std::string get_bootloader_message_blk_device(std::string* err);
|
||||
|
||||
// Read bootloader message into boot. Error message will be set in err.
|
||||
bool read_bootloader_message(bootloader_message* boot, std::string* err);
|
||||
|
||||
// Read bootloader message from the specified misc device into boot.
|
||||
bool read_bootloader_message_from(bootloader_message* boot, const std::string& misc_blk_device,
|
||||
std::string* err);
|
||||
|
||||
// Write bootloader message to BCB.
|
||||
bool write_bootloader_message(const bootloader_message& boot, std::string* err);
|
||||
|
||||
// Write bootloader message to the specified BCB device.
|
||||
bool write_bootloader_message_to(const bootloader_message& boot,
|
||||
const std::string& misc_blk_device, std::string* err);
|
||||
|
||||
// Write bootloader message (boots into recovery with the options) to BCB. Will
|
||||
// set the command and recovery fields, and reset the rest.
|
||||
bool write_bootloader_message(const std::vector<std::string>& options, std::string* err);
|
||||
|
||||
// Write bootloader message (boots into recovery with the options) to the specific BCB device. Will
|
||||
// set the command and recovery fields, and reset the rest.
|
||||
bool write_bootloader_message_to(const std::vector<std::string>& options,
|
||||
const std::string& misc_blk_device, std::string* err);
|
||||
|
||||
// Update bootloader message (boots into recovery with the options) to BCB. Will
|
||||
// only update the command and recovery fields.
|
||||
bool update_bootloader_message(const std::vector<std::string>& options, std::string* err);
|
||||
|
||||
// Update bootloader message (boots into recovery with the |options|) in |boot|. Will only update
|
||||
// the command and recovery fields.
|
||||
bool update_bootloader_message_in_struct(bootloader_message* boot,
|
||||
const std::vector<std::string>& options);
|
||||
|
||||
// Clear BCB.
|
||||
bool clear_bootloader_message(std::string* err);
|
||||
|
||||
// Writes the reboot-bootloader reboot reason to the bootloader_message.
|
||||
bool write_reboot_bootloader(std::string* err);
|
||||
|
||||
// Read the wipe package from BCB (from offset WIPE_PACKAGE_OFFSET_IN_MISC).
|
||||
bool read_wipe_package(std::string* package_data, size_t size, std::string* err);
|
||||
|
||||
// Write the wipe package into BCB (to offset WIPE_PACKAGE_OFFSET_IN_MISC).
|
||||
bool write_wipe_package(const std::string& package_data, std::string* err);
|
||||
|
||||
#else
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
// C Interface.
|
||||
bool write_bootloader_message(const char* options);
|
||||
bool write_reboot_bootloader(void);
|
||||
|
||||
#endif // ifdef __cplusplus
|
||||
#endif /* __UBOOT__ */
|
||||
|
||||
#endif /* __ANDROID_BOOTLOADER_MESSAGE_H */
|
||||
139
include/android_image.h
Normal file
139
include/android_image.h
Normal file
@@ -0,0 +1,139 @@
|
||||
/* SPDX-License-Identifier: BSD-3-Clause */
|
||||
/*
|
||||
* This is from the Android Project,
|
||||
* Repository: https://android.googlesource.com/platform/system/tools/mkbootimg
|
||||
* File: include/bootimg/bootimg.h
|
||||
* Commit: e55998a0f2b61b685d5eb4a486ca3a0c680b1a2f
|
||||
*
|
||||
* Copyright (C) 2007 The Android Open Source Project
|
||||
*/
|
||||
|
||||
#ifndef _ANDROID_IMAGE_H_
|
||||
#define _ANDROID_IMAGE_H_
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#define ANDR_BOOT_MAGIC "ANDROID!"
|
||||
#define ANDR_BOOT_MAGIC_SIZE 8
|
||||
#define ANDR_BOOT_NAME_SIZE 16
|
||||
#define ANDR_BOOT_ARGS_SIZE 512
|
||||
#define ANDR_BOOT_EXTRA_ARGS_SIZE 1024
|
||||
|
||||
/* The bootloader expects the structure of andr_img_hdr with header
|
||||
* version 0 to be as follows: */
|
||||
struct andr_img_hdr {
|
||||
/* Must be ANDR_BOOT_MAGIC. */
|
||||
char magic[ANDR_BOOT_MAGIC_SIZE];
|
||||
|
||||
u32 kernel_size; /* size in bytes */
|
||||
u32 kernel_addr; /* physical load addr */
|
||||
|
||||
u32 ramdisk_size; /* size in bytes */
|
||||
u32 ramdisk_addr; /* physical load addr */
|
||||
|
||||
u32 second_size; /* size in bytes */
|
||||
u32 second_addr; /* physical load addr */
|
||||
|
||||
u32 tags_addr; /* physical addr for kernel tags */
|
||||
u32 page_size; /* flash page size we assume */
|
||||
|
||||
/* Version of the boot image header. */
|
||||
u32 header_version;
|
||||
|
||||
/* Operating system version and security patch level.
|
||||
* For version "A.B.C" and patch level "Y-M-D":
|
||||
* (7 bits for each of A, B, C; 7 bits for (Y-2000), 4 bits for M)
|
||||
* os_version = A[31:25] B[24:18] C[17:11] (Y-2000)[10:4] M[3:0] */
|
||||
u32 os_version;
|
||||
|
||||
char name[ANDR_BOOT_NAME_SIZE]; /* asciiz product name */
|
||||
|
||||
char cmdline[ANDR_BOOT_ARGS_SIZE];
|
||||
|
||||
u32 id[8]; /* timestamp / checksum / sha1 / etc */
|
||||
|
||||
/* Supplemental command line data; kept here to maintain
|
||||
* binary compatibility with older versions of mkbootimg. */
|
||||
char extra_cmdline[ANDR_BOOT_EXTRA_ARGS_SIZE];
|
||||
|
||||
/* Fields in boot_img_hdr_v1 and newer. */
|
||||
u32 recovery_dtbo_size; /* size in bytes for recovery DTBO/ACPIO image */
|
||||
u64 recovery_dtbo_offset; /* offset to recovery dtbo/acpio in boot image */
|
||||
u32 header_size;
|
||||
|
||||
/* Fields in boot_img_hdr_v2 and newer. */
|
||||
u32 dtb_size; /* size in bytes for DTB image */
|
||||
u64 dtb_addr; /* physical load address for DTB image */
|
||||
} __attribute__((packed));
|
||||
|
||||
/* When a boot header is of version 0, the structure of boot image is as
|
||||
* follows:
|
||||
*
|
||||
* +-----------------+
|
||||
* | boot header | 1 page
|
||||
* +-----------------+
|
||||
* | kernel | n pages
|
||||
* +-----------------+
|
||||
* | ramdisk | m pages
|
||||
* +-----------------+
|
||||
* | second stage | o pages
|
||||
* +-----------------+
|
||||
*
|
||||
* n = (kernel_size + page_size - 1) / page_size
|
||||
* m = (ramdisk_size + page_size - 1) / page_size
|
||||
* o = (second_size + page_size - 1) / page_size
|
||||
*
|
||||
* 0. all entities are page_size aligned in flash
|
||||
* 1. kernel and ramdisk are required (size != 0)
|
||||
* 2. second is optional (second_size == 0 -> no second)
|
||||
* 3. load each element (kernel, ramdisk, second) at
|
||||
* the specified physical address (kernel_addr, etc)
|
||||
* 4. prepare tags at tag_addr. kernel_args[] is
|
||||
* appended to the kernel commandline in the tags.
|
||||
* 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr
|
||||
* 6. if second_size != 0: jump to second_addr
|
||||
* else: jump to kernel_addr
|
||||
*/
|
||||
|
||||
/* When the boot image header has a version of 2, the structure of the boot
|
||||
* image is as follows:
|
||||
*
|
||||
* +---------------------+
|
||||
* | boot header | 1 page
|
||||
* +---------------------+
|
||||
* | kernel | n pages
|
||||
* +---------------------+
|
||||
* | ramdisk | m pages
|
||||
* +---------------------+
|
||||
* | second stage | o pages
|
||||
* +---------------------+
|
||||
* | recovery dtbo/acpio | p pages
|
||||
* +---------------------+
|
||||
* | dtb | q pages
|
||||
* +---------------------+
|
||||
*
|
||||
* n = (kernel_size + page_size - 1) / page_size
|
||||
* m = (ramdisk_size + page_size - 1) / page_size
|
||||
* o = (second_size + page_size - 1) / page_size
|
||||
* p = (recovery_dtbo_size + page_size - 1) / page_size
|
||||
* q = (dtb_size + page_size - 1) / page_size
|
||||
*
|
||||
* 0. all entities are page_size aligned in flash
|
||||
* 1. kernel, ramdisk and DTB are required (size != 0)
|
||||
* 2. recovery_dtbo/recovery_acpio is required for recovery.img in non-A/B
|
||||
* devices(recovery_dtbo_size != 0)
|
||||
* 3. second is optional (second_size == 0 -> no second)
|
||||
* 4. load each element (kernel, ramdisk, second, dtb) at
|
||||
* the specified physical address (kernel_addr, etc)
|
||||
* 5. If booting to recovery mode in a non-A/B device, extract recovery
|
||||
* dtbo/acpio and apply the correct set of overlays on the base device tree
|
||||
* depending on the hardware/product revision.
|
||||
* 6. prepare tags at tag_addr. kernel_args[] is
|
||||
* appended to the kernel commandline in the tags.
|
||||
* 7. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr
|
||||
* 8. if second_size != 0: jump to second_addr
|
||||
* else: jump to kernel_addr
|
||||
*/
|
||||
|
||||
#endif
|
||||
25
include/ansi.h
Normal file
25
include/ansi.h
Normal file
@@ -0,0 +1,25 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2012
|
||||
* Pali Rohár <pali.rohar@gmail.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* ANSI terminal
|
||||
*/
|
||||
|
||||
#define ANSI_CURSOR_UP "\e[%dA"
|
||||
#define ANSI_CURSOR_DOWN "\e[%dB"
|
||||
#define ANSI_CURSOR_FORWARD "\e[%dC"
|
||||
#define ANSI_CURSOR_BACK "\e[%dD"
|
||||
#define ANSI_CURSOR_NEXTLINE "\e[%dE"
|
||||
#define ANSI_CURSOR_PREVIOUSLINE "\e[%dF"
|
||||
#define ANSI_CURSOR_COLUMN "\e[%dG"
|
||||
#define ANSI_CURSOR_POSITION "\e[%d;%dH"
|
||||
#define ANSI_CURSOR_SHOW "\e[?25h"
|
||||
#define ANSI_CURSOR_HIDE "\e[?25l"
|
||||
#define ANSI_CLEAR_CONSOLE "\e[2J"
|
||||
#define ANSI_CLEAR_LINE_TO_END "\e[0K"
|
||||
#define ANSI_CLEAR_LINE "\e[2K"
|
||||
#define ANSI_COLOR_RESET "\e[0m"
|
||||
#define ANSI_COLOR_REVERSE "\e[7m"
|
||||
12
include/api.h
Normal file
12
include/api.h
Normal file
@@ -0,0 +1,12 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (c) 2017 Google, Inc
|
||||
* Written by Simon Glass <sjg@chromium.org>
|
||||
*/
|
||||
|
||||
#ifndef __API_H
|
||||
#define __API_H
|
||||
|
||||
void api_init(void);
|
||||
|
||||
#endif
|
||||
127
include/api_public.h
Normal file
127
include/api_public.h
Normal file
@@ -0,0 +1,127 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ OR BSD-2-Clause */
|
||||
/*
|
||||
* (C) Copyright 2007-2008 Semihalf
|
||||
*
|
||||
* Written by: Rafal Jaworowski <raj@semihalf.com>
|
||||
*/
|
||||
|
||||
#ifndef _API_PUBLIC_H_
|
||||
#define _API_PUBLIC_H_
|
||||
|
||||
#define API_EINVAL 1 /* invalid argument(s) */
|
||||
#define API_ENODEV 2 /* no device */
|
||||
#define API_ENOMEM 3 /* no memory */
|
||||
#define API_EBUSY 4 /* busy, occupied etc. */
|
||||
#define API_EIO 5 /* I/O error */
|
||||
#define API_ESYSC 6 /* syscall error */
|
||||
|
||||
typedef int (*scp_t)(int, int *, ...);
|
||||
|
||||
#define API_SIG_VERSION 1
|
||||
#define API_SIG_MAGIC "UBootAPI"
|
||||
#define API_SIG_MAGLEN 8
|
||||
|
||||
struct api_signature {
|
||||
char magic[API_SIG_MAGLEN]; /* magic string */
|
||||
uint16_t version; /* API version */
|
||||
uint32_t checksum; /* checksum of this sig struct */
|
||||
scp_t syscall; /* entry point to the API */
|
||||
};
|
||||
|
||||
enum {
|
||||
API_RSVD = 0,
|
||||
API_GETC,
|
||||
API_PUTC,
|
||||
API_TSTC,
|
||||
API_PUTS,
|
||||
API_RESET,
|
||||
API_GET_SYS_INFO,
|
||||
API_UDELAY,
|
||||
API_GET_TIMER,
|
||||
API_DEV_ENUM,
|
||||
API_DEV_OPEN,
|
||||
API_DEV_CLOSE,
|
||||
API_DEV_READ,
|
||||
API_DEV_WRITE,
|
||||
API_ENV_ENUM,
|
||||
API_ENV_GET,
|
||||
API_ENV_SET,
|
||||
API_DISPLAY_GET_INFO,
|
||||
API_DISPLAY_DRAW_BITMAP,
|
||||
API_DISPLAY_CLEAR,
|
||||
API_MAXCALL
|
||||
};
|
||||
|
||||
#define MR_ATTR_FLASH 0x0001
|
||||
#define MR_ATTR_DRAM 0x0002
|
||||
#define MR_ATTR_SRAM 0x0003
|
||||
|
||||
struct mem_region {
|
||||
unsigned long start;
|
||||
unsigned long size;
|
||||
int flags;
|
||||
};
|
||||
|
||||
struct sys_info {
|
||||
unsigned long clk_bus;
|
||||
unsigned long clk_cpu;
|
||||
unsigned long bar;
|
||||
struct mem_region *mr;
|
||||
int mr_no; /* number of memory regions */
|
||||
};
|
||||
|
||||
#undef CONFIG_SYS_64BIT_LBA
|
||||
#ifdef CONFIG_SYS_64BIT_LBA
|
||||
typedef u_int64_t lbasize_t;
|
||||
#else
|
||||
typedef unsigned long lbasize_t;
|
||||
#endif
|
||||
typedef unsigned long lbastart_t;
|
||||
|
||||
#define DEV_TYP_NONE 0x0000
|
||||
#define DEV_TYP_NET 0x0001
|
||||
|
||||
#define DEV_TYP_STOR 0x0002
|
||||
#define DT_STOR_IDE 0x0010
|
||||
#define DT_STOR_SCSI 0x0020
|
||||
#define DT_STOR_USB 0x0040
|
||||
#define DT_STOR_MMC 0x0080
|
||||
#define DT_STOR_SATA 0x0100
|
||||
|
||||
#define DEV_STA_CLOSED 0x0000 /* invalid, closed */
|
||||
#define DEV_STA_OPEN 0x0001 /* open i.e. active */
|
||||
|
||||
struct device_info {
|
||||
int type;
|
||||
void *cookie;
|
||||
|
||||
union {
|
||||
struct {
|
||||
lbasize_t block_count; /* no of blocks */
|
||||
unsigned long block_size; /* size of one block */
|
||||
} storage;
|
||||
|
||||
struct {
|
||||
unsigned char hwaddr[6];
|
||||
} net;
|
||||
} info;
|
||||
#define di_stor info.storage
|
||||
#define di_net info.net
|
||||
|
||||
int state;
|
||||
};
|
||||
|
||||
#define DISPLAY_TYPE_LCD 0x0001
|
||||
#define DISPLAY_TYPE_VIDEO 0x0002
|
||||
|
||||
struct display_info {
|
||||
int type;
|
||||
/* screen size in pixels */
|
||||
int pixel_width;
|
||||
int pixel_height;
|
||||
/* screen size in rows and columns of text */
|
||||
int screen_rows;
|
||||
int screen_cols;
|
||||
};
|
||||
|
||||
#endif /* _API_PUBLIC_H_ */
|
||||
75
include/armcoremodule.h
Normal file
75
include/armcoremodule.h
Normal file
@@ -0,0 +1,75 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2005
|
||||
* ARM Ltd.
|
||||
* Peter Pearse, <Peter.Pearse@arm.com>
|
||||
* Configuration for ARM Core Modules.
|
||||
* No standalonw port yet available
|
||||
* - this file is included by both integratorap.h & integratorcp.h
|
||||
*/
|
||||
|
||||
#ifndef __ARMCOREMODULE_H
|
||||
#define __ARMCOREMODULE_H
|
||||
|
||||
#define CM_BASE 0x10000000
|
||||
|
||||
/* CM registers common to all CMs */
|
||||
/* Note that observed values after reboot into the ARM Boot Monitor
|
||||
have been used as defaults, rather than the POR values */
|
||||
#define OS_CTRL 0x0000000C
|
||||
#define CMMASK_REMAP 0x00000005 /* set remap & led */
|
||||
#define CMMASK_RESET 0x00000008
|
||||
#define OS_LOCK 0x00000014
|
||||
#define CMVAL_LOCK1 0x0000A000 /* locking value */
|
||||
#define CMVAL_LOCK2 0x0000005F /* locking value */
|
||||
#define CMVAL_UNLOCK 0x00000000 /* any value != CM_LOCKVAL */
|
||||
#define OS_SDRAM 0x00000020
|
||||
#define OS_INIT 0x00000024
|
||||
#define CMMASK_MAP_SIMPLE 0xFFFDFFFF /* simple mapping */
|
||||
#define CMMASK_TCRAM_DISABLE 0xFFFEFFFF /* TCRAM disabled */
|
||||
#define CMMASK_LOWVEC 0x00000000 /* vectors @ 0x00000000 */
|
||||
#define CMMASK_LE 0xFFFFFFF7 /* little endian */
|
||||
#define CMMASK_CMxx6_COMMON 0x00000013 /* Common value for CMxx6 */
|
||||
/* - observed reset value of */
|
||||
/* CM926EJ-S */
|
||||
/* CM1136-EJ-S */
|
||||
|
||||
#if defined (CONFIG_CM10200E) || defined (CONFIG_CM10220E)
|
||||
#define CMMASK_INIT_102 0x00000300 /* see CM102xx ref manual */
|
||||
/* - PLL test clock bypassed */
|
||||
/* - bus clock ratio 2 */
|
||||
/* - little endian */
|
||||
/* - vectors at zero */
|
||||
#endif /* CM1022xx */
|
||||
|
||||
/* Determine CM characteristics */
|
||||
|
||||
#undef CONFIG_CM_MULTIPLE_SSRAM
|
||||
#undef CONFIG_CM_SPD_DETECT
|
||||
#undef CONFIG_CM_REMAP
|
||||
#undef CONFIG_CM_INIT
|
||||
#undef CONFIG_CM_TCRAM
|
||||
|
||||
#if defined (CONFIG_CM946E_S) || defined (CONFIG_CM966E_S)
|
||||
#define CONFIG_CM_MULTIPLE_SSRAM /* CM has multiple SSRAM mapping */
|
||||
#endif
|
||||
|
||||
/* Excalibur core module has reduced functionality */
|
||||
#ifndef CONFIG_CM922T_XA10
|
||||
#define CONFIG_CM_SPD_DETECT /* CM supports SPD query */
|
||||
#define OS_SPD 0x00000100 /* Address of SPD data */
|
||||
#define CONFIG_CM_REMAP /* CM supports remapping */
|
||||
#define CONFIG_CM_INIT /* CM has initialization reg */
|
||||
#endif /* NOT EXCALIBUR */
|
||||
|
||||
#if defined(CONFIG_CM926EJ_S) || defined (CONFIG_CM946E_S) || \
|
||||
defined(CONFIG_CM966E_S) || defined (CONFIG_CM1026EJ_S) || \
|
||||
defined(CONFIG_CM1136JF_S)
|
||||
#define CONFIG_CM_TCRAM /* CM has TCRAM */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CM_SPD_DETECT
|
||||
#define OS_SPD 0x00000100 /* The SDRAM SPD data is copied here */
|
||||
#endif
|
||||
|
||||
#endif /* __ARMCOREMODULE_H */
|
||||
262
include/asm-generic/atomic-long.h
Normal file
262
include/asm-generic/atomic-long.h
Normal file
@@ -0,0 +1,262 @@
|
||||
#ifndef _ASM_GENERIC_ATOMIC_LONG_H
|
||||
#define _ASM_GENERIC_ATOMIC_LONG_H
|
||||
/*
|
||||
* Copyright (C) 2005 Silicon Graphics, Inc.
|
||||
* Christoph Lameter
|
||||
*
|
||||
* Allows to provide arch independent atomic definitions without the need to
|
||||
* edit all arch specific atomic.h files.
|
||||
*/
|
||||
|
||||
#include <asm/types.h>
|
||||
|
||||
/*
|
||||
* Suppport for atomic_long_t
|
||||
*
|
||||
* Casts for parameters are avoided for existing atomic functions in order to
|
||||
* avoid issues with cast-as-lval under gcc 4.x and other limitations that the
|
||||
* macros of a platform may have.
|
||||
*/
|
||||
|
||||
#if BITS_PER_LONG == 64
|
||||
|
||||
typedef atomic64_t atomic_long_t;
|
||||
|
||||
#define ATOMIC_LONG_INIT(i) ATOMIC64_INIT(i)
|
||||
|
||||
static inline long atomic_long_read(atomic_long_t *l)
|
||||
{
|
||||
atomic64_t *v = (atomic64_t *)l;
|
||||
|
||||
return (long)atomic64_read(v);
|
||||
}
|
||||
|
||||
static inline void atomic_long_set(atomic_long_t *l, long i)
|
||||
{
|
||||
atomic64_t *v = (atomic64_t *)l;
|
||||
|
||||
atomic64_set(v, i);
|
||||
}
|
||||
|
||||
static inline void atomic_long_inc(atomic_long_t *l)
|
||||
{
|
||||
atomic64_t *v = (atomic64_t *)l;
|
||||
|
||||
atomic64_inc(v);
|
||||
}
|
||||
|
||||
static inline void atomic_long_dec(atomic_long_t *l)
|
||||
{
|
||||
atomic64_t *v = (atomic64_t *)l;
|
||||
|
||||
atomic64_dec(v);
|
||||
}
|
||||
|
||||
static inline void atomic_long_add(long i, atomic_long_t *l)
|
||||
{
|
||||
atomic64_t *v = (atomic64_t *)l;
|
||||
|
||||
atomic64_add(i, v);
|
||||
}
|
||||
|
||||
static inline void atomic_long_sub(long i, atomic_long_t *l)
|
||||
{
|
||||
atomic64_t *v = (atomic64_t *)l;
|
||||
|
||||
atomic64_sub(i, v);
|
||||
}
|
||||
|
||||
#ifndef __UBOOT__
|
||||
static inline int atomic_long_sub_and_test(long i, atomic_long_t *l)
|
||||
{
|
||||
atomic64_t *v = (atomic64_t *)l;
|
||||
|
||||
return atomic64_sub_and_test(i, v);
|
||||
}
|
||||
|
||||
static inline int atomic_long_dec_and_test(atomic_long_t *l)
|
||||
{
|
||||
atomic64_t *v = (atomic64_t *)l;
|
||||
|
||||
return atomic64_dec_and_test(v);
|
||||
}
|
||||
|
||||
static inline int atomic_long_inc_and_test(atomic_long_t *l)
|
||||
{
|
||||
atomic64_t *v = (atomic64_t *)l;
|
||||
|
||||
return atomic64_inc_and_test(v);
|
||||
}
|
||||
|
||||
static inline int atomic_long_add_negative(long i, atomic_long_t *l)
|
||||
{
|
||||
atomic64_t *v = (atomic64_t *)l;
|
||||
|
||||
return atomic64_add_negative(i, v);
|
||||
}
|
||||
|
||||
static inline long atomic_long_add_return(long i, atomic_long_t *l)
|
||||
{
|
||||
atomic64_t *v = (atomic64_t *)l;
|
||||
|
||||
return (long)atomic64_add_return(i, v);
|
||||
}
|
||||
|
||||
static inline long atomic_long_sub_return(long i, atomic_long_t *l)
|
||||
{
|
||||
atomic64_t *v = (atomic64_t *)l;
|
||||
|
||||
return (long)atomic64_sub_return(i, v);
|
||||
}
|
||||
|
||||
static inline long atomic_long_inc_return(atomic_long_t *l)
|
||||
{
|
||||
atomic64_t *v = (atomic64_t *)l;
|
||||
|
||||
return (long)atomic64_inc_return(v);
|
||||
}
|
||||
|
||||
static inline long atomic_long_dec_return(atomic_long_t *l)
|
||||
{
|
||||
atomic64_t *v = (atomic64_t *)l;
|
||||
|
||||
return (long)atomic64_dec_return(v);
|
||||
}
|
||||
|
||||
static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u)
|
||||
{
|
||||
atomic64_t *v = (atomic64_t *)l;
|
||||
|
||||
return (long)atomic64_add_unless(v, a, u);
|
||||
}
|
||||
|
||||
#define atomic_long_inc_not_zero(l) atomic64_inc_not_zero((atomic64_t *)(l))
|
||||
|
||||
#define atomic_long_cmpxchg(l, old, new) \
|
||||
(atomic64_cmpxchg((atomic64_t *)(l), (old), (new)))
|
||||
#define atomic_long_xchg(v, new) \
|
||||
(atomic64_xchg((atomic64_t *)(v), (new)))
|
||||
#endif /* __UBOOT__ */
|
||||
|
||||
#else /* BITS_PER_LONG == 64 */
|
||||
|
||||
typedef atomic_t atomic_long_t;
|
||||
|
||||
#define ATOMIC_LONG_INIT(i) ATOMIC_INIT(i)
|
||||
static inline long atomic_long_read(atomic_long_t *l)
|
||||
{
|
||||
atomic_t *v = (atomic_t *)l;
|
||||
|
||||
return (long)atomic_read(v);
|
||||
}
|
||||
|
||||
static inline void atomic_long_set(atomic_long_t *l, long i)
|
||||
{
|
||||
atomic_t *v = (atomic_t *)l;
|
||||
|
||||
atomic_set(v, i);
|
||||
}
|
||||
|
||||
static inline void atomic_long_inc(atomic_long_t *l)
|
||||
{
|
||||
atomic_t *v = (atomic_t *)l;
|
||||
|
||||
atomic_inc(v);
|
||||
}
|
||||
|
||||
static inline void atomic_long_dec(atomic_long_t *l)
|
||||
{
|
||||
atomic_t *v = (atomic_t *)l;
|
||||
|
||||
atomic_dec(v);
|
||||
}
|
||||
|
||||
static inline void atomic_long_add(long i, atomic_long_t *l)
|
||||
{
|
||||
atomic_t *v = (atomic_t *)l;
|
||||
|
||||
atomic_add(i, v);
|
||||
}
|
||||
|
||||
static inline void atomic_long_sub(long i, atomic_long_t *l)
|
||||
{
|
||||
atomic_t *v = (atomic_t *)l;
|
||||
|
||||
atomic_sub(i, v);
|
||||
}
|
||||
|
||||
#ifndef __UBOOT__
|
||||
static inline int atomic_long_sub_and_test(long i, atomic_long_t *l)
|
||||
{
|
||||
atomic_t *v = (atomic_t *)l;
|
||||
|
||||
return atomic_sub_and_test(i, v);
|
||||
}
|
||||
|
||||
static inline int atomic_long_dec_and_test(atomic_long_t *l)
|
||||
{
|
||||
atomic_t *v = (atomic_t *)l;
|
||||
|
||||
return atomic_dec_and_test(v);
|
||||
}
|
||||
|
||||
static inline int atomic_long_inc_and_test(atomic_long_t *l)
|
||||
{
|
||||
atomic_t *v = (atomic_t *)l;
|
||||
|
||||
return atomic_inc_and_test(v);
|
||||
}
|
||||
|
||||
static inline int atomic_long_add_negative(long i, atomic_long_t *l)
|
||||
{
|
||||
atomic_t *v = (atomic_t *)l;
|
||||
|
||||
return atomic_add_negative(i, v);
|
||||
}
|
||||
|
||||
static inline long atomic_long_add_return(long i, atomic_long_t *l)
|
||||
{
|
||||
atomic_t *v = (atomic_t *)l;
|
||||
|
||||
return (long)atomic_add_return(i, v);
|
||||
}
|
||||
|
||||
static inline long atomic_long_sub_return(long i, atomic_long_t *l)
|
||||
{
|
||||
atomic_t *v = (atomic_t *)l;
|
||||
|
||||
return (long)atomic_sub_return(i, v);
|
||||
}
|
||||
|
||||
static inline long atomic_long_inc_return(atomic_long_t *l)
|
||||
{
|
||||
atomic_t *v = (atomic_t *)l;
|
||||
|
||||
return (long)atomic_inc_return(v);
|
||||
}
|
||||
|
||||
static inline long atomic_long_dec_return(atomic_long_t *l)
|
||||
{
|
||||
atomic_t *v = (atomic_t *)l;
|
||||
|
||||
return (long)atomic_dec_return(v);
|
||||
}
|
||||
|
||||
static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u)
|
||||
{
|
||||
atomic_t *v = (atomic_t *)l;
|
||||
|
||||
return (long)atomic_add_unless(v, a, u);
|
||||
}
|
||||
|
||||
#define atomic_long_inc_not_zero(l) atomic_inc_not_zero((atomic_t *)(l))
|
||||
|
||||
#define atomic_long_cmpxchg(l, old, new) \
|
||||
(atomic_cmpxchg((atomic_t *)(l), (old), (new)))
|
||||
#define atomic_long_xchg(v, new) \
|
||||
(atomic_xchg((atomic_t *)(v), (new)))
|
||||
#endif /* __UBOOT__ */
|
||||
|
||||
#endif /* BITS_PER_LONG == 64 */
|
||||
|
||||
#endif /* _ASM_GENERIC_ATOMIC_LONG_H */
|
||||
150
include/asm-generic/atomic.h
Normal file
150
include/asm-generic/atomic.h
Normal file
@@ -0,0 +1,150 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
|
||||
#ifndef _ASM_GENERIC_ATOMIC_H
|
||||
#define _ASM_GENERIC_ATOMIC_H
|
||||
|
||||
typedef struct { volatile int counter; } atomic_t;
|
||||
#if BITS_PER_LONG == 32
|
||||
typedef struct { volatile long long counter; } atomic64_t;
|
||||
#else /* BIT_PER_LONG == 32 */
|
||||
typedef struct { volatile long counter; } atomic64_t;
|
||||
#endif
|
||||
|
||||
#define ATOMIC_INIT(i) { (i) }
|
||||
|
||||
#define atomic_read(v) ((v)->counter)
|
||||
#define atomic_set(v, i) ((v)->counter = (i))
|
||||
#define atomic64_read(v) atomic_read(v)
|
||||
#define atomic64_set(v, i) atomic_set(v, i)
|
||||
|
||||
static inline void atomic_add(int i, atomic_t *v)
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
|
||||
local_irq_save(flags);
|
||||
v->counter += i;
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static inline void atomic_sub(int i, atomic_t *v)
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
|
||||
local_irq_save(flags);
|
||||
v->counter -= i;
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static inline void atomic_inc(atomic_t *v)
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
|
||||
local_irq_save(flags);
|
||||
++v->counter;
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static inline void atomic_dec(atomic_t *v)
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
|
||||
local_irq_save(flags);
|
||||
--v->counter;
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static inline int atomic_dec_and_test(volatile atomic_t *v)
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
int val;
|
||||
|
||||
local_irq_save(flags);
|
||||
val = v->counter;
|
||||
v->counter = val -= 1;
|
||||
local_irq_restore(flags);
|
||||
|
||||
return val == 0;
|
||||
}
|
||||
|
||||
static inline int atomic_add_negative(int i, volatile atomic_t *v)
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
int val;
|
||||
|
||||
local_irq_save(flags);
|
||||
val = v->counter;
|
||||
v->counter = val += i;
|
||||
local_irq_restore(flags);
|
||||
|
||||
return val < 0;
|
||||
}
|
||||
|
||||
static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
|
||||
local_irq_save(flags);
|
||||
*addr &= ~mask;
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
#if BITS_PER_LONG == 32
|
||||
|
||||
static inline void atomic64_add(long long i, volatile atomic64_t *v)
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
|
||||
local_irq_save(flags);
|
||||
v->counter += i;
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static inline void atomic64_sub(long long i, volatile atomic64_t *v)
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
|
||||
local_irq_save(flags);
|
||||
v->counter -= i;
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
#else /* BIT_PER_LONG == 32 */
|
||||
|
||||
static inline void atomic64_add(long i, volatile atomic64_t *v)
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
|
||||
local_irq_save(flags);
|
||||
v->counter += i;
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static inline void atomic64_sub(long i, volatile atomic64_t *v)
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
|
||||
local_irq_save(flags);
|
||||
v->counter -= i;
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline void atomic64_inc(volatile atomic64_t *v)
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
|
||||
local_irq_save(flags);
|
||||
v->counter += 1;
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static inline void atomic64_dec(volatile atomic64_t *v)
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
|
||||
local_irq_save(flags);
|
||||
v->counter -= 1;
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
#endif
|
||||
43
include/asm-generic/bitops/__ffs.h
Normal file
43
include/asm-generic/bitops/__ffs.h
Normal file
@@ -0,0 +1,43 @@
|
||||
#ifndef _ASM_GENERIC_BITOPS___FFS_H_
|
||||
#define _ASM_GENERIC_BITOPS___FFS_H_
|
||||
|
||||
#include <asm/types.h>
|
||||
|
||||
/**
|
||||
* __ffs - find first bit in word.
|
||||
* @word: The word to search
|
||||
*
|
||||
* Undefined if no bit exists, so code should check against 0 first.
|
||||
*/
|
||||
static __always_inline unsigned long __ffs(unsigned long word)
|
||||
{
|
||||
int num = 0;
|
||||
|
||||
#if BITS_PER_LONG == 64
|
||||
if ((word & 0xffffffff) == 0) {
|
||||
num += 32;
|
||||
word >>= 32;
|
||||
}
|
||||
#endif
|
||||
if ((word & 0xffff) == 0) {
|
||||
num += 16;
|
||||
word >>= 16;
|
||||
}
|
||||
if ((word & 0xff) == 0) {
|
||||
num += 8;
|
||||
word >>= 8;
|
||||
}
|
||||
if ((word & 0xf) == 0) {
|
||||
num += 4;
|
||||
word >>= 4;
|
||||
}
|
||||
if ((word & 0x3) == 0) {
|
||||
num += 2;
|
||||
word >>= 2;
|
||||
}
|
||||
if ((word & 0x1) == 0)
|
||||
num += 1;
|
||||
return num;
|
||||
}
|
||||
|
||||
#endif /* _ASM_GENERIC_BITOPS___FFS_H_ */
|
||||
43
include/asm-generic/bitops/__fls.h
Normal file
43
include/asm-generic/bitops/__fls.h
Normal file
@@ -0,0 +1,43 @@
|
||||
#ifndef _ASM_GENERIC_BITOPS___FLS_H_
|
||||
#define _ASM_GENERIC_BITOPS___FLS_H_
|
||||
|
||||
#include <asm/types.h>
|
||||
|
||||
/**
|
||||
* __fls - find last (most-significant) set bit in a long word
|
||||
* @word: the word to search
|
||||
*
|
||||
* Undefined if no set bit exists, so code should check against 0 first.
|
||||
*/
|
||||
static __always_inline unsigned long __fls(unsigned long word)
|
||||
{
|
||||
int num = BITS_PER_LONG - 1;
|
||||
|
||||
#if BITS_PER_LONG == 64
|
||||
if (!(word & (~0ul << 32))) {
|
||||
num -= 32;
|
||||
word <<= 32;
|
||||
}
|
||||
#endif
|
||||
if (!(word & (~0ul << (BITS_PER_LONG-16)))) {
|
||||
num -= 16;
|
||||
word <<= 16;
|
||||
}
|
||||
if (!(word & (~0ul << (BITS_PER_LONG-8)))) {
|
||||
num -= 8;
|
||||
word <<= 8;
|
||||
}
|
||||
if (!(word & (~0ul << (BITS_PER_LONG-4)))) {
|
||||
num -= 4;
|
||||
word <<= 4;
|
||||
}
|
||||
if (!(word & (~0ul << (BITS_PER_LONG-2)))) {
|
||||
num -= 2;
|
||||
word <<= 2;
|
||||
}
|
||||
if (!(word & (~0ul << (BITS_PER_LONG-1))))
|
||||
num -= 1;
|
||||
return num;
|
||||
}
|
||||
|
||||
#endif /* _ASM_GENERIC_BITOPS___FLS_H_ */
|
||||
41
include/asm-generic/bitops/fls.h
Normal file
41
include/asm-generic/bitops/fls.h
Normal file
@@ -0,0 +1,41 @@
|
||||
#ifndef _ASM_GENERIC_BITOPS_FLS_H_
|
||||
#define _ASM_GENERIC_BITOPS_FLS_H_
|
||||
|
||||
/**
|
||||
* fls - find last (most-significant) bit set
|
||||
* @x: the word to search
|
||||
*
|
||||
* This is defined the same way as ffs.
|
||||
* Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
|
||||
*/
|
||||
|
||||
static __always_inline int fls(int x)
|
||||
{
|
||||
int r = 32;
|
||||
|
||||
if (!x)
|
||||
return 0;
|
||||
if (!(x & 0xffff0000u)) {
|
||||
x <<= 16;
|
||||
r -= 16;
|
||||
}
|
||||
if (!(x & 0xff000000u)) {
|
||||
x <<= 8;
|
||||
r -= 8;
|
||||
}
|
||||
if (!(x & 0xf0000000u)) {
|
||||
x <<= 4;
|
||||
r -= 4;
|
||||
}
|
||||
if (!(x & 0xc0000000u)) {
|
||||
x <<= 2;
|
||||
r -= 2;
|
||||
}
|
||||
if (!(x & 0x80000000u)) {
|
||||
x <<= 1;
|
||||
r -= 1;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
#endif /* _ASM_GENERIC_BITOPS_FLS_H_ */
|
||||
36
include/asm-generic/bitops/fls64.h
Normal file
36
include/asm-generic/bitops/fls64.h
Normal file
@@ -0,0 +1,36 @@
|
||||
#ifndef _ASM_GENERIC_BITOPS_FLS64_H_
|
||||
#define _ASM_GENERIC_BITOPS_FLS64_H_
|
||||
|
||||
#include <asm/types.h>
|
||||
|
||||
/**
|
||||
* fls64 - find last set bit in a 64-bit word
|
||||
* @x: the word to search
|
||||
*
|
||||
* This is defined in a similar way as the libc and compiler builtin
|
||||
* ffsll, but returns the position of the most significant set bit.
|
||||
*
|
||||
* fls64(value) returns 0 if value is 0 or the position of the last
|
||||
* set bit if value is nonzero. The last (most significant) bit is
|
||||
* at position 64.
|
||||
*/
|
||||
#if BITS_PER_LONG == 32
|
||||
static __always_inline int fls64(__u64 x)
|
||||
{
|
||||
__u32 h = x >> 32;
|
||||
if (h)
|
||||
return fls(h) + 32;
|
||||
return fls(x);
|
||||
}
|
||||
#elif BITS_PER_LONG == 64
|
||||
static __always_inline int fls64(__u64 x)
|
||||
{
|
||||
if (x == 0)
|
||||
return 0;
|
||||
return __fls(x) + 1;
|
||||
}
|
||||
#else
|
||||
#error BITS_PER_LONG not 32 or 64
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_GENERIC_BITOPS_FLS64_H_ */
|
||||
8
include/asm-generic/bitsperlong.h
Normal file
8
include/asm-generic/bitsperlong.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifndef __ASM_GENERIC_BITS_PER_LONG
|
||||
#define __ASM_GENERIC_BITS_PER_LONG
|
||||
|
||||
#ifndef BITS_PER_LONG_LONG
|
||||
#define BITS_PER_LONG_LONG 64
|
||||
#endif
|
||||
|
||||
#endif /* __ASM_GENERIC_BITS_PER_LONG */
|
||||
173
include/asm-generic/global_data.h
Normal file
173
include/asm-generic/global_data.h
Normal file
@@ -0,0 +1,173 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (c) 2012 The Chromium OS Authors.
|
||||
* (C) Copyright 2002-2010
|
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_GENERIC_GBL_DATA_H
|
||||
#define __ASM_GENERIC_GBL_DATA_H
|
||||
/*
|
||||
* The following data structure is placed in some memory which is
|
||||
* available very early after boot (like DPRAM on MPC8xx/MPC82xx, or
|
||||
* some locked parts of the data cache) to allow for a minimum set of
|
||||
* global variables during system initialization (until we have set
|
||||
* up the memory controller so that we can use RAM).
|
||||
*
|
||||
* Keep it *SMALL* and remember to set GENERATED_GBL_DATA_SIZE > sizeof(gd_t)
|
||||
*
|
||||
* Each architecture has its own private fields. For now all are private
|
||||
*/
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <fdtdec.h>
|
||||
#include <membuff.h>
|
||||
#include <linux/list.h>
|
||||
|
||||
typedef struct global_data {
|
||||
bd_t *bd;
|
||||
unsigned long flags;
|
||||
unsigned int baudrate;
|
||||
unsigned long cpu_clk; /* CPU clock in Hz! */
|
||||
unsigned long bus_clk;
|
||||
/* We cannot bracket this with CONFIG_PCI due to mpc5xxx */
|
||||
unsigned long pci_clk;
|
||||
unsigned long mem_clk;
|
||||
#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO) || defined(CONFIG_DM_VIDEO)
|
||||
unsigned long fb_base; /* Base address of framebuffer mem */
|
||||
#endif
|
||||
#if defined(CONFIG_POST)
|
||||
unsigned long post_log_word; /* Record POST activities */
|
||||
unsigned long post_log_res; /* success of POST test */
|
||||
unsigned long post_init_f_time; /* When post_init_f started */
|
||||
#endif
|
||||
#ifdef CONFIG_BOARD_TYPES
|
||||
unsigned long board_type;
|
||||
#endif
|
||||
unsigned long have_console; /* serial_init() was called */
|
||||
#if CONFIG_IS_ENABLED(PRE_CONSOLE_BUFFER)
|
||||
unsigned long precon_buf_idx; /* Pre-Console buffer index */
|
||||
#endif
|
||||
unsigned long env_addr; /* Address of Environment struct */
|
||||
unsigned long env_valid; /* Environment valid? enum env_valid */
|
||||
unsigned long env_has_init; /* Bitmask of boolean of struct env_location offsets */
|
||||
int env_load_prio; /* Priority of the loaded environment */
|
||||
|
||||
unsigned long ram_base; /* Base address of RAM used by U-Boot */
|
||||
unsigned long ram_top; /* Top address of RAM used by U-Boot */
|
||||
unsigned long relocaddr; /* Start address of U-Boot in RAM */
|
||||
phys_size_t ram_size; /* RAM size */
|
||||
unsigned long mon_len; /* monitor len */
|
||||
unsigned long irq_sp; /* irq stack pointer */
|
||||
unsigned long start_addr_sp; /* start_addr_stackpointer */
|
||||
unsigned long reloc_off;
|
||||
struct global_data *new_gd; /* relocated global data */
|
||||
|
||||
#ifdef CONFIG_DM
|
||||
struct udevice *dm_root; /* Root instance for Driver Model */
|
||||
struct udevice *dm_root_f; /* Pre-relocation root instance */
|
||||
struct list_head uclass_root; /* Head of core tree */
|
||||
#endif
|
||||
#ifdef CONFIG_TIMER
|
||||
struct udevice *timer; /* Timer instance for Driver Model */
|
||||
#endif
|
||||
|
||||
const void *fdt_blob; /* Our device tree, NULL if none */
|
||||
void *new_fdt; /* Relocated FDT */
|
||||
unsigned long fdt_size; /* Space reserved for relocated FDT */
|
||||
#ifdef CONFIG_OF_LIVE
|
||||
struct device_node *of_root;
|
||||
#endif
|
||||
|
||||
#if CONFIG_IS_ENABLED(MULTI_DTB_FIT)
|
||||
const void *multi_dtb_fit; /* uncompressed multi-dtb FIT image */
|
||||
#endif
|
||||
struct jt_funcs *jt; /* jump table */
|
||||
char env_buf[32]; /* buffer for env_get() before reloc. */
|
||||
#ifdef CONFIG_TRACE
|
||||
void *trace_buff; /* The trace buffer */
|
||||
#endif
|
||||
#if defined(CONFIG_SYS_I2C)
|
||||
int cur_i2c_bus; /* current used i2c bus */
|
||||
#endif
|
||||
#ifdef CONFIG_SYS_I2C_MXC
|
||||
void *srdata[10];
|
||||
#endif
|
||||
unsigned int timebase_h;
|
||||
unsigned int timebase_l;
|
||||
#if CONFIG_VAL(SYS_MALLOC_F_LEN)
|
||||
unsigned long malloc_base; /* base address of early malloc() */
|
||||
unsigned long malloc_limit; /* limit address */
|
||||
unsigned long malloc_ptr; /* current address */
|
||||
#endif
|
||||
#ifdef CONFIG_PCI
|
||||
struct pci_controller *hose; /* PCI hose for early use */
|
||||
phys_addr_t pci_ram_top; /* top of region accessible to PCI */
|
||||
#endif
|
||||
#ifdef CONFIG_PCI_BOOTDELAY
|
||||
int pcidelay_done;
|
||||
#endif
|
||||
struct udevice *cur_serial_dev; /* current serial device */
|
||||
struct arch_global_data arch; /* architecture-specific data */
|
||||
#ifdef CONFIG_CONSOLE_RECORD
|
||||
struct membuff console_out; /* console output */
|
||||
struct membuff console_in; /* console input */
|
||||
#endif
|
||||
#ifdef CONFIG_DM_VIDEO
|
||||
ulong video_top; /* Top of video frame buffer area */
|
||||
ulong video_bottom; /* Bottom of video frame buffer area */
|
||||
#endif
|
||||
#ifdef CONFIG_BOOTSTAGE
|
||||
struct bootstage_data *bootstage; /* Bootstage information */
|
||||
struct bootstage_data *new_bootstage; /* Relocated bootstage info */
|
||||
#endif
|
||||
#ifdef CONFIG_LOG
|
||||
int log_drop_count; /* Number of dropped log messages */
|
||||
int default_log_level; /* For devices with no filters */
|
||||
struct list_head log_head; /* List of struct log_device */
|
||||
int log_fmt; /* Mask containing log format info */
|
||||
#endif
|
||||
#if CONFIG_IS_ENABLED(BLOBLIST)
|
||||
struct bloblist_hdr *bloblist; /* Bloblist information */
|
||||
struct bloblist_hdr *new_bloblist; /* Relocated blolist info */
|
||||
# ifdef CONFIG_SPL
|
||||
struct spl_handoff *spl_handoff;
|
||||
# endif
|
||||
#endif
|
||||
#if defined(CONFIG_TRANSLATION_OFFSET)
|
||||
fdt_addr_t translation_offset; /* optional translation offset */
|
||||
#endif
|
||||
#if CONFIG_IS_ENABLED(WDT)
|
||||
struct udevice *watchdog_dev;
|
||||
#endif
|
||||
} gd_t;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_BOARD_TYPES
|
||||
#define gd_board_type() gd->board_type
|
||||
#else
|
||||
#define gd_board_type() 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Global Data Flags
|
||||
*/
|
||||
#define GD_FLG_RELOC 0x00001 /* Code was relocated to RAM */
|
||||
#define GD_FLG_DEVINIT 0x00002 /* Devices have been initialized */
|
||||
#define GD_FLG_SILENT 0x00004 /* Silent mode */
|
||||
#define GD_FLG_POSTFAIL 0x00008 /* Critical POST test failed */
|
||||
#define GD_FLG_POSTSTOP 0x00010 /* POST seqeunce aborted */
|
||||
#define GD_FLG_LOGINIT 0x00020 /* Log Buffer has been initialized */
|
||||
#define GD_FLG_DISABLE_CONSOLE 0x00040 /* Disable console (in & out) */
|
||||
#define GD_FLG_ENV_READY 0x00080 /* Env. imported into hash table */
|
||||
#define GD_FLG_SERIAL_READY 0x00100 /* Pre-reloc serial console ready */
|
||||
#define GD_FLG_FULL_MALLOC_INIT 0x00200 /* Full malloc() is ready */
|
||||
#define GD_FLG_SPL_INIT 0x00400 /* spl_init() has been called */
|
||||
#define GD_FLG_SKIP_RELOC 0x00800 /* Don't relocate */
|
||||
#define GD_FLG_RECORD 0x01000 /* Record console */
|
||||
#define GD_FLG_ENV_DEFAULT 0x02000 /* Default variable flag */
|
||||
#define GD_FLG_SPL_EARLY_INIT 0x04000 /* Early SPL init is done */
|
||||
#define GD_FLG_LOG_READY 0x08000 /* Log system is ready for use */
|
||||
#define GD_FLG_WDT_READY 0x10000 /* Watchdog is ready for use */
|
||||
|
||||
#endif /* __ASM_GENERIC_GBL_DATA_H */
|
||||
660
include/asm-generic/gpio.h
Normal file
660
include/asm-generic/gpio.h
Normal file
@@ -0,0 +1,660 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (c) 2011 The Chromium OS Authors.
|
||||
* Copyright (c) 2011, NVIDIA Corp. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef _ASM_GENERIC_GPIO_H_
|
||||
#define _ASM_GENERIC_GPIO_H_
|
||||
|
||||
#include <dm/ofnode.h>
|
||||
|
||||
struct ofnode_phandle_args;
|
||||
|
||||
/*
|
||||
* Generic GPIO API for U-Boot
|
||||
*
|
||||
* --
|
||||
* NB: This is deprecated. Please use the driver model functions instead:
|
||||
*
|
||||
* - gpio_request_by_name()
|
||||
* - dm_gpio_get_value() etc.
|
||||
*
|
||||
* For now we need a dm_ prefix on some functions to avoid name collision.
|
||||
* --
|
||||
*
|
||||
* GPIOs are numbered from 0 to GPIO_COUNT-1 which value is defined
|
||||
* by the SOC/architecture.
|
||||
*
|
||||
* Each GPIO can be an input or output. If an input then its value can
|
||||
* be read as 0 or 1. If an output then its value can be set to 0 or 1.
|
||||
* If you try to write an input then the value is undefined. If you try
|
||||
* to read an output, barring something very unusual, you will get
|
||||
* back the value of the output that you previously set.
|
||||
*
|
||||
* In some cases the operation may fail, for example if the GPIO number
|
||||
* is out of range, or the GPIO is not available because its pin is
|
||||
* being used by another function. In that case, functions may return
|
||||
* an error value of -1.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @deprecated Please use driver model instead
|
||||
* Request a GPIO. This should be called before any of the other functions
|
||||
* are used on this GPIO.
|
||||
*
|
||||
* Note: With driver model, the label is allocated so there is no need for
|
||||
* the caller to preserve it.
|
||||
*
|
||||
* @param gpio GPIO number
|
||||
* @param label User label for this GPIO
|
||||
* @return 0 if ok, -1 on error
|
||||
*/
|
||||
int gpio_request(unsigned gpio, const char *label);
|
||||
|
||||
/**
|
||||
* @deprecated Please use driver model instead
|
||||
* Stop using the GPIO. This function should not alter pin configuration.
|
||||
*
|
||||
* @param gpio GPIO number
|
||||
* @return 0 if ok, -1 on error
|
||||
*/
|
||||
int gpio_free(unsigned gpio);
|
||||
|
||||
/**
|
||||
* @deprecated Please use driver model instead
|
||||
* Make a GPIO an input.
|
||||
*
|
||||
* @param gpio GPIO number
|
||||
* @return 0 if ok, -1 on error
|
||||
*/
|
||||
int gpio_direction_input(unsigned gpio);
|
||||
|
||||
/**
|
||||
* @deprecated Please use driver model instead
|
||||
* Make a GPIO an output, and set its value.
|
||||
*
|
||||
* @param gpio GPIO number
|
||||
* @param value GPIO value (0 for low or 1 for high)
|
||||
* @return 0 if ok, -1 on error
|
||||
*/
|
||||
int gpio_direction_output(unsigned gpio, int value);
|
||||
|
||||
/**
|
||||
* @deprecated Please use driver model instead
|
||||
* Get a GPIO's value. This will work whether the GPIO is an input
|
||||
* or an output.
|
||||
*
|
||||
* @param gpio GPIO number
|
||||
* @return 0 if low, 1 if high, -1 on error
|
||||
*/
|
||||
int gpio_get_value(unsigned gpio);
|
||||
|
||||
/**
|
||||
* @deprecated Please use driver model instead
|
||||
* Set an output GPIO's value. The GPIO must already be an output or
|
||||
* this function may have no effect.
|
||||
*
|
||||
* @param gpio GPIO number
|
||||
* @param value GPIO value (0 for low or 1 for high)
|
||||
* @return 0 if ok, -1 on error
|
||||
*/
|
||||
int gpio_set_value(unsigned gpio, int value);
|
||||
|
||||
/* State of a GPIO, as reported by get_function() */
|
||||
enum gpio_func_t {
|
||||
GPIOF_INPUT = 0,
|
||||
GPIOF_OUTPUT,
|
||||
GPIOF_UNUSED, /* Not claimed */
|
||||
GPIOF_UNKNOWN, /* Not known */
|
||||
GPIOF_FUNC, /* Not used as a GPIO */
|
||||
|
||||
GPIOF_COUNT,
|
||||
};
|
||||
|
||||
struct udevice;
|
||||
|
||||
struct gpio_desc {
|
||||
struct udevice *dev; /* Device, NULL for invalid GPIO */
|
||||
unsigned long flags;
|
||||
#define GPIOD_REQUESTED (1 << 0) /* Requested/claimed */
|
||||
#define GPIOD_IS_OUT (1 << 1) /* GPIO is an output */
|
||||
#define GPIOD_IS_IN (1 << 2) /* GPIO is an input */
|
||||
#define GPIOD_ACTIVE_LOW (1 << 3) /* value has active low */
|
||||
#define GPIOD_IS_OUT_ACTIVE (1 << 4) /* set output active */
|
||||
|
||||
uint offset; /* GPIO offset within the device */
|
||||
/*
|
||||
* We could consider adding the GPIO label in here. Possibly we could
|
||||
* use this structure for internal GPIO information.
|
||||
*/
|
||||
};
|
||||
|
||||
/**
|
||||
* dm_gpio_is_valid() - Check if a GPIO is valid
|
||||
*
|
||||
* @desc: GPIO description containing device, offset and flags,
|
||||
* previously returned by gpio_request_by_name()
|
||||
* @return true if valid, false if not
|
||||
*/
|
||||
static inline bool dm_gpio_is_valid(const struct gpio_desc *desc)
|
||||
{
|
||||
return desc->dev != NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* gpio_get_status() - get the current GPIO status as a string
|
||||
*
|
||||
* Obtain the current GPIO status as a string which can be presented to the
|
||||
* user. A typical string is:
|
||||
*
|
||||
* "b4: in: 1 [x] sdmmc_cd"
|
||||
*
|
||||
* which means this is GPIO bank b, offset 4, currently set to input, current
|
||||
* value 1, [x] means that it is requested and the owner is 'sdmmc_cd'
|
||||
*
|
||||
* TODO(sjg@chromium.org): This should use struct gpio_desc
|
||||
*
|
||||
* @dev: Device to check
|
||||
* @offset: Offset of device GPIO to check
|
||||
* @buf: Place to put string
|
||||
* @buffsize: Size of string including \0
|
||||
*/
|
||||
int gpio_get_status(struct udevice *dev, int offset, char *buf, int buffsize);
|
||||
|
||||
/**
|
||||
* gpio_get_function() - get the current function for a GPIO pin
|
||||
*
|
||||
* Note this returns GPIOF_UNUSED if the GPIO is not requested.
|
||||
*
|
||||
* TODO(sjg@chromium.org): This should use struct gpio_desc
|
||||
*
|
||||
* @dev: Device to check
|
||||
* @offset: Offset of device GPIO to check
|
||||
* @namep: If non-NULL, this is set to the name given when the GPIO
|
||||
* was requested, or -1 if it has not been requested
|
||||
* @return -ENODATA if the driver returned an unknown function,
|
||||
* -ENODEV if the device is not active, -EINVAL if the offset is invalid.
|
||||
* GPIOF_UNUSED if the GPIO has not been requested. Otherwise returns the
|
||||
* function from enum gpio_func_t.
|
||||
*/
|
||||
int gpio_get_function(struct udevice *dev, int offset, const char **namep);
|
||||
|
||||
/**
|
||||
* gpio_get_raw_function() - get the current raw function for a GPIO pin
|
||||
*
|
||||
* Note this does not return GPIOF_UNUSED - it will always return the GPIO
|
||||
* driver's view of a pin function, even if it is not correctly set up.
|
||||
*
|
||||
* TODO(sjg@chromium.org): This should use struct gpio_desc
|
||||
*
|
||||
* @dev: Device to check
|
||||
* @offset: Offset of device GPIO to check
|
||||
* @namep: If non-NULL, this is set to the name given when the GPIO
|
||||
* was requested, or -1 if it has not been requested
|
||||
* @return -ENODATA if the driver returned an unknown function,
|
||||
* -ENODEV if the device is not active, -EINVAL if the offset is invalid.
|
||||
* Otherwise returns the function from enum gpio_func_t.
|
||||
*/
|
||||
int gpio_get_raw_function(struct udevice *dev, int offset, const char **namep);
|
||||
|
||||
/**
|
||||
* gpio_requestf() - request a GPIO using a format string for the owner
|
||||
*
|
||||
* This is a helper function for gpio_request(). It allows you to provide
|
||||
* a printf()-format string for the GPIO owner. It calls gpio_request() with
|
||||
* the string that is created
|
||||
*/
|
||||
int gpio_requestf(unsigned gpio, const char *fmt, ...)
|
||||
__attribute__ ((format (__printf__, 2, 3)));
|
||||
|
||||
struct fdtdec_phandle_args;
|
||||
|
||||
/**
|
||||
* gpio_xlate_offs_flags() - implementation for common use of dm_gpio_ops.xlate
|
||||
*
|
||||
* This routine sets the offset field to args[0] and the flags field to
|
||||
* GPIOD_ACTIVE_LOW if the GPIO_ACTIVE_LOW flag is present in args[1].
|
||||
*/
|
||||
int gpio_xlate_offs_flags(struct udevice *dev, struct gpio_desc *desc,
|
||||
struct ofnode_phandle_args *args);
|
||||
|
||||
/**
|
||||
* struct struct dm_gpio_ops - Driver model GPIO operations
|
||||
*
|
||||
* Refer to functions above for description. These function largely copy
|
||||
* the old API.
|
||||
*
|
||||
* This is trying to be close to Linux GPIO API. Once the U-Boot uses the
|
||||
* new DM GPIO API, this should be really easy to flip over to the Linux
|
||||
* GPIO API-alike interface.
|
||||
*
|
||||
* Also it would be useful to standardise additional functions like
|
||||
* pullup, slew rate and drive strength.
|
||||
*
|
||||
* gpio_request() and gpio_free() are optional - if NULL then they will
|
||||
* not be called.
|
||||
*
|
||||
* Note that @offset is the offset from the base GPIO of the device. So
|
||||
* offset 0 is the device's first GPIO and offset o-1 is the last GPIO,
|
||||
* where o is the number of GPIO lines controlled by the device. A device
|
||||
* is typically used to control a single bank of GPIOs. Within complex
|
||||
* SoCs there may be many banks and therefore many devices all referring
|
||||
* to the different IO addresses within the SoC.
|
||||
*
|
||||
* The uclass combines all GPIO devices together to provide a consistent
|
||||
* numbering from 0 to n-1, where n is the number of GPIOs in total across
|
||||
* all devices. Be careful not to confuse offset with gpio in the parameters.
|
||||
*/
|
||||
struct dm_gpio_ops {
|
||||
int (*request)(struct udevice *dev, unsigned offset, const char *label);
|
||||
int (*free)(struct udevice *dev, unsigned offset);
|
||||
int (*direction_input)(struct udevice *dev, unsigned offset);
|
||||
int (*direction_output)(struct udevice *dev, unsigned offset,
|
||||
int value);
|
||||
int (*get_value)(struct udevice *dev, unsigned offset);
|
||||
int (*set_value)(struct udevice *dev, unsigned offset, int value);
|
||||
int (*get_open_drain)(struct udevice *dev, unsigned offset);
|
||||
int (*set_open_drain)(struct udevice *dev, unsigned offset, int value);
|
||||
/**
|
||||
* get_function() Get the GPIO function
|
||||
*
|
||||
* @dev: Device to check
|
||||
* @offset: GPIO offset within that device
|
||||
* @return current function - GPIOF_...
|
||||
*/
|
||||
int (*get_function)(struct udevice *dev, unsigned offset);
|
||||
|
||||
/**
|
||||
* xlate() - Translate phandle arguments into a GPIO description
|
||||
*
|
||||
* This function should set up the fields in desc according to the
|
||||
* information in the arguments. The uclass will have set up:
|
||||
*
|
||||
* @desc->dev to @dev
|
||||
* @desc->flags to 0
|
||||
* @desc->offset to 0
|
||||
*
|
||||
* This method is optional and defaults to gpio_xlate_offs_flags,
|
||||
* which will parse offset and the GPIO_ACTIVE_LOW flag in the first
|
||||
* two arguments.
|
||||
*
|
||||
* Note that @dev is passed in as a parameter to follow driver model
|
||||
* uclass conventions, even though it is already available as
|
||||
* desc->dev.
|
||||
*
|
||||
* @dev: GPIO device
|
||||
* @desc: Place to put GPIO description
|
||||
* @args: Arguments provided in description
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int (*xlate)(struct udevice *dev, struct gpio_desc *desc,
|
||||
struct ofnode_phandle_args *args);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct gpio_dev_priv - information about a device used by the uclass
|
||||
*
|
||||
* The uclass combines all active GPIO devices into a unified numbering
|
||||
* scheme. To do this it maintains some private information about each
|
||||
* device.
|
||||
*
|
||||
* To implement driver model support in your GPIO driver, add a probe
|
||||
* handler, and set @gpio_count and @bank_name correctly in that handler.
|
||||
* This tells the uclass the name of the GPIO bank and the number of GPIOs
|
||||
* it contains.
|
||||
*
|
||||
* @bank_name: Name of the GPIO device (e.g 'a' means GPIOs will be called
|
||||
* 'A0', 'A1', etc.
|
||||
* @gpio_count: Number of GPIOs in this device
|
||||
* @gpio_base: Base GPIO number for this device. For the first active device
|
||||
* this will be 0; the numbering for others will follow sequentially so that
|
||||
* @gpio_base for device 1 will equal the number of GPIOs in device 0.
|
||||
* @name: Array of pointers to the name for each GPIO in this bank. The
|
||||
* value of the pointer will be NULL if the GPIO has not been claimed.
|
||||
*/
|
||||
struct gpio_dev_priv {
|
||||
const char *bank_name;
|
||||
unsigned gpio_count;
|
||||
unsigned gpio_base;
|
||||
char **name;
|
||||
};
|
||||
|
||||
/* Access the GPIO operations for a device */
|
||||
#define gpio_get_ops(dev) ((struct dm_gpio_ops *)(dev)->driver->ops)
|
||||
|
||||
/**
|
||||
* gpio_get_bank_info - Return information about a GPIO bank/device
|
||||
*
|
||||
* This looks up a device and returns both its GPIO base name and the number
|
||||
* of GPIOs it controls.
|
||||
*
|
||||
* @dev: Device to look up
|
||||
* @offset_count: Returns number of GPIOs within this bank
|
||||
* @return bank name of this device
|
||||
*/
|
||||
const char *gpio_get_bank_info(struct udevice *dev, int *offset_count);
|
||||
|
||||
/**
|
||||
* dm_gpio_lookup_name() - Look up a named GPIO and return its description
|
||||
*
|
||||
* The name of a GPIO is typically its bank name followed by a number from 0.
|
||||
* For example A0 is the first GPIO in bank A. Each bank is a separate driver
|
||||
* model device.
|
||||
*
|
||||
* @name: Name to look up
|
||||
* @desc: Returns description, on success
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int dm_gpio_lookup_name(const char *name, struct gpio_desc *desc);
|
||||
|
||||
/**
|
||||
* gpio_hog_lookup_name() - Look up a named GPIO and return the gpio descr.
|
||||
*
|
||||
* @name: Name to look up
|
||||
* @desc: Returns GPIO description, on success, else NULL
|
||||
* @return: Returns 0 if OK, else -ENODEV
|
||||
*/
|
||||
int gpio_hog_lookup_name(const char *name, struct gpio_desc **desc);
|
||||
|
||||
/**
|
||||
* gpio_hog_probe_all() - probe all gpio devices with
|
||||
* gpio-hog subnodes.
|
||||
*
|
||||
* @return: Returns return value from device_probe()
|
||||
*/
|
||||
int gpio_hog_probe_all(void);
|
||||
|
||||
/**
|
||||
* gpio_lookup_name - Look up a GPIO name and return its details
|
||||
*
|
||||
* This is used to convert a named GPIO into a device, offset and GPIO
|
||||
* number.
|
||||
*
|
||||
* @name: GPIO name to look up
|
||||
* @devp: Returns pointer to device which contains this GPIO
|
||||
* @offsetp: Returns the offset number within this device
|
||||
* @gpiop: Returns the absolute GPIO number, numbered from 0
|
||||
*/
|
||||
int gpio_lookup_name(const char *name, struct udevice **devp,
|
||||
unsigned int *offsetp, unsigned int *gpiop);
|
||||
|
||||
/**
|
||||
* gpio_get_values_as_int() - Turn the values of a list of GPIOs into an int
|
||||
*
|
||||
* This puts the value of the first GPIO into bit 0, the second into bit 1,
|
||||
* etc. then returns the resulting integer.
|
||||
*
|
||||
* @gpio_list: List of GPIOs to collect
|
||||
* @return resulting integer value, or -ve on error
|
||||
*/
|
||||
int gpio_get_values_as_int(const int *gpio_list);
|
||||
|
||||
/**
|
||||
* dm_gpio_get_values_as_int() - Turn the values of a list of GPIOs into an int
|
||||
*
|
||||
* This puts the value of the first GPIO into bit 0, the second into bit 1,
|
||||
* etc. then returns the resulting integer.
|
||||
*
|
||||
* @desc_list: List of GPIOs to collect
|
||||
* @count: Number of GPIOs
|
||||
* @return resulting integer value, or -ve on error
|
||||
*/
|
||||
int dm_gpio_get_values_as_int(const struct gpio_desc *desc_list, int count);
|
||||
|
||||
/**
|
||||
* gpio_claim_vector() - claim a number of GPIOs for input
|
||||
*
|
||||
* @gpio_num_array: array of gpios to claim, terminated by -1
|
||||
* @fmt: format string for GPIO names, e.g. "board_id%d"
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int gpio_claim_vector(const int *gpio_num_array, const char *fmt);
|
||||
|
||||
/**
|
||||
* gpio_request_by_name() - Locate and request a GPIO by name
|
||||
*
|
||||
* This operates by looking up the given list name in the device (device
|
||||
* tree property) and requesting the GPIO for use. The property must exist
|
||||
* in @dev's node.
|
||||
*
|
||||
* Use @flags to specify whether the GPIO should be an input or output. In
|
||||
* principle this can also come from the device tree binding but most
|
||||
* bindings don't provide this information. Specifically, when the GPIO uclass
|
||||
* calls the xlate() method, it can return default flags, which are then
|
||||
* ORed with this @flags.
|
||||
*
|
||||
* If we find that requesting the GPIO is not always needed we could add a
|
||||
* new function or a new GPIOD_NO_REQUEST flag.
|
||||
*
|
||||
* At present driver model has no reference counting so if one device
|
||||
* requests a GPIO which subsequently is unbound, the @desc->dev pointer
|
||||
* will be invalid. However this will only happen if the GPIO device is
|
||||
* unbound, not if it is removed, so this seems like a reasonable limitation
|
||||
* for now. There is no real use case for unbinding drivers in normal
|
||||
* operation.
|
||||
*
|
||||
* The device tree binding is doc/device-tree-bindings/gpio/gpio.txt in
|
||||
* generate terms and each specific device may add additional details in
|
||||
* a binding file in the same directory.
|
||||
*
|
||||
* @dev: Device requesting the GPIO
|
||||
* @list_name: Name of GPIO list (e.g. "board-id-gpios")
|
||||
* @index: Index number of the GPIO in that list use request (0=first)
|
||||
* @desc: Returns GPIO description information. If there is no such
|
||||
* GPIO, dev->dev will be NULL.
|
||||
* @flags: Indicates the GPIO input/output settings (GPIOD_...)
|
||||
* @return 0 if OK, -ENOENT if the GPIO does not exist, -EINVAL if there is
|
||||
* something wrong with the list, or other -ve for another error (e.g.
|
||||
* -EBUSY if a GPIO was already requested)
|
||||
*/
|
||||
int gpio_request_by_name(struct udevice *dev, const char *list_name,
|
||||
int index, struct gpio_desc *desc, int flags);
|
||||
|
||||
/**
|
||||
* gpio_request_list_by_name() - Request a list of GPIOs
|
||||
*
|
||||
* Reads all the GPIOs from a list and requests them. See
|
||||
* gpio_request_by_name() for additional details. Lists should not be
|
||||
* misused to hold unrelated or optional GPIOs. They should only be used
|
||||
* for things like parallel data lines. A zero phandle terminates the list
|
||||
* the list.
|
||||
*
|
||||
* This function will either succeed, and request all GPIOs in the list, or
|
||||
* fail and request none (it will free already-requested GPIOs in case of
|
||||
* an error part-way through).
|
||||
*
|
||||
* @dev: Device requesting the GPIO
|
||||
* @list_name: Name of GPIO list (e.g. "board-id-gpios")
|
||||
* @desc_list: Returns a list of GPIO description information
|
||||
* @max_count: Maximum number of GPIOs to return (@desc_list must be at least
|
||||
* this big)
|
||||
* @flags: Indicates the GPIO input/output settings (GPIOD_...)
|
||||
* @return number of GPIOs requested, or -ve on error
|
||||
*/
|
||||
int gpio_request_list_by_name(struct udevice *dev, const char *list_name,
|
||||
struct gpio_desc *desc_list, int max_count,
|
||||
int flags);
|
||||
|
||||
/**
|
||||
* dm_gpio_request() - manually request a GPIO
|
||||
*
|
||||
* Note: This function should only be used for testing / debugging. Instead.
|
||||
* use gpio_request_by_name() to pull GPIOs from the device tree.
|
||||
*
|
||||
* @desc: GPIO description of GPIO to request (see dm_gpio_lookup_name())
|
||||
* @label: Label to attach to the GPIO while claimed
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int dm_gpio_request(struct gpio_desc *desc, const char *label);
|
||||
|
||||
/**
|
||||
* gpio_get_list_count() - Returns the number of GPIOs in a list
|
||||
*
|
||||
* Counts the GPIOs in a list. See gpio_request_by_name() for additional
|
||||
* details.
|
||||
*
|
||||
* @dev: Device requesting the GPIO
|
||||
* @list_name: Name of GPIO list (e.g. "board-id-gpios")
|
||||
* @return number of GPIOs (0 for an empty property) or -ENOENT if the list
|
||||
* does not exist
|
||||
*/
|
||||
int gpio_get_list_count(struct udevice *dev, const char *list_name);
|
||||
|
||||
/**
|
||||
* gpio_request_by_name_nodev() - request GPIOs without a device
|
||||
*
|
||||
* This is a version of gpio_request_list_by_name() that does not use a
|
||||
* device. Avoid it unless the caller is not yet using driver model
|
||||
*/
|
||||
int gpio_request_by_name_nodev(ofnode node, const char *list_name, int index,
|
||||
struct gpio_desc *desc, int flags);
|
||||
|
||||
/**
|
||||
* gpio_request_list_by_name_nodev() - request GPIOs without a device
|
||||
*
|
||||
* This is a version of gpio_request_list_by_name() that does not use a
|
||||
* device. Avoid it unless the caller is not yet using driver model
|
||||
*/
|
||||
int gpio_request_list_by_name_nodev(ofnode node, const char *list_name,
|
||||
struct gpio_desc *desc_list, int max_count,
|
||||
int flags);
|
||||
|
||||
/**
|
||||
* gpio_dev_request_index() - request single GPIO from gpio device
|
||||
*
|
||||
* @dev: GPIO device
|
||||
* @nodename: Name of node for which gpio gets requested, used
|
||||
* for the gpio label name
|
||||
* @list_name: Name of GPIO list (e.g. "board-id-gpios")
|
||||
* @index: Index number of the GPIO in that list use request (0=first)
|
||||
* @flags: GPIOD_* flags
|
||||
* @dtflags: GPIO flags read from DT defined see GPIOD_*
|
||||
* @desc: returns GPIO descriptor filled from this function
|
||||
* @return: return value from gpio_request_tail()
|
||||
*/
|
||||
int gpio_dev_request_index(struct udevice *dev, const char *nodename,
|
||||
char *list_name, int index, int flags,
|
||||
int dtflags, struct gpio_desc *desc);
|
||||
|
||||
/**
|
||||
* dm_gpio_free() - Free a single GPIO
|
||||
*
|
||||
* This frees a single GPIOs previously returned from gpio_request_by_name().
|
||||
*
|
||||
* @dev: Device which requested the GPIO
|
||||
* @desc: GPIO to free
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int dm_gpio_free(struct udevice *dev, struct gpio_desc *desc);
|
||||
|
||||
/**
|
||||
* gpio_free_list() - Free a list of GPIOs
|
||||
*
|
||||
* This frees a list of GPIOs previously returned from
|
||||
* gpio_request_list_by_name().
|
||||
*
|
||||
* @dev: Device which requested the GPIOs
|
||||
* @desc: List of GPIOs to free
|
||||
* @count: Number of GPIOs in the list
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int gpio_free_list(struct udevice *dev, struct gpio_desc *desc, int count);
|
||||
|
||||
/**
|
||||
* gpio_free_list_nodev() - free GPIOs without a device
|
||||
*
|
||||
* This is a version of gpio_free_list() that does not use a
|
||||
* device. Avoid it unless the caller is not yet using driver model
|
||||
*/
|
||||
int gpio_free_list_nodev(struct gpio_desc *desc, int count);
|
||||
|
||||
/**
|
||||
* dm_gpio_get_value() - Get the value of a GPIO
|
||||
*
|
||||
* This is the driver model version of the existing gpio_get_value() function
|
||||
* and should be used instead of that.
|
||||
*
|
||||
* For now, these functions have a dm_ prefix since they conflict with
|
||||
* existing names.
|
||||
*
|
||||
* @desc: GPIO description containing device, offset and flags,
|
||||
* previously returned by gpio_request_by_name()
|
||||
* @return GPIO value (0 for inactive, 1 for active) or -ve on error
|
||||
*/
|
||||
int dm_gpio_get_value(const struct gpio_desc *desc);
|
||||
|
||||
int dm_gpio_set_value(const struct gpio_desc *desc, int value);
|
||||
|
||||
/**
|
||||
* dm_gpio_get_open_drain() - Check if open-drain-mode of a GPIO is active
|
||||
*
|
||||
* This checks if open-drain-mode for a GPIO is enabled or not. This method is
|
||||
* optional.
|
||||
*
|
||||
* @desc: GPIO description containing device, offset and flags,
|
||||
* previously returned by gpio_request_by_name()
|
||||
* @return Value of open drain mode for GPIO (0 for inactive, 1 for active) or
|
||||
* -ve on error
|
||||
*/
|
||||
int dm_gpio_get_open_drain(struct gpio_desc *desc);
|
||||
|
||||
/**
|
||||
* dm_gpio_set_open_drain() - Switch open-drain-mode of a GPIO on or off
|
||||
*
|
||||
* This enables or disables open-drain mode for a GPIO. This method is
|
||||
* optional; if the driver does not support it, nothing happens when the method
|
||||
* is called.
|
||||
*
|
||||
* In open-drain mode, instead of actively driving the output (Push-pull
|
||||
* output), the GPIO's pin is connected to the collector (for a NPN transistor)
|
||||
* or the drain (for a MOSFET) of a transistor, respectively. The pin then
|
||||
* either forms an open circuit or a connection to ground, depending on the
|
||||
* state of the transistor.
|
||||
*
|
||||
* @desc: GPIO description containing device, offset and flags,
|
||||
* previously returned by gpio_request_by_name()
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int dm_gpio_set_open_drain(struct gpio_desc *desc, int value);
|
||||
|
||||
/**
|
||||
* dm_gpio_set_dir() - Set the direction for a GPIO
|
||||
*
|
||||
* This sets up the direction according tot the provided flags. It will do
|
||||
* nothing unless the direction is actually specified.
|
||||
*
|
||||
* @desc: GPIO description containing device, offset and flags,
|
||||
* previously returned by gpio_request_by_name()
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int dm_gpio_set_dir(struct gpio_desc *desc);
|
||||
|
||||
/**
|
||||
* dm_gpio_set_dir_flags() - Set direction using specific flags
|
||||
*
|
||||
* This is like dm_gpio_set_dir() except that the flags value is provided
|
||||
* instead of being used from desc->flags. This is needed because in many
|
||||
* cases the GPIO description does not include direction information.
|
||||
* Note that desc->flags is updated by this function.
|
||||
*
|
||||
* @desc: GPIO description containing device, offset and flags,
|
||||
* previously returned by gpio_request_by_name()
|
||||
* @flags: New flags to use
|
||||
* @return 0 if OK, -ve on error, in which case desc->flags is not updated
|
||||
*/
|
||||
int dm_gpio_set_dir_flags(struct gpio_desc *desc, ulong flags);
|
||||
|
||||
/**
|
||||
* gpio_get_number() - Get the global GPIO number of a GPIO
|
||||
*
|
||||
* This should only be used for debugging or interest. It returns the number
|
||||
* that should be used for gpio_get_value() etc. to access this GPIO.
|
||||
*
|
||||
* @desc: GPIO description containing device, offset and flags,
|
||||
* previously returned by gpio_request_by_name()
|
||||
* @return GPIO number, or -ve if not found
|
||||
*/
|
||||
int gpio_get_number(const struct gpio_desc *desc);
|
||||
|
||||
#endif /* _ASM_GENERIC_GPIO_H_ */
|
||||
47
include/asm-generic/int-ll64.h
Normal file
47
include/asm-generic/int-ll64.h
Normal file
@@ -0,0 +1,47 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* asm-generic/int-ll64.h
|
||||
*
|
||||
* Integer declarations for architectures which use "long long"
|
||||
* for 64-bit types.
|
||||
*/
|
||||
|
||||
#ifndef _ASM_GENERIC_INT_LL64_H
|
||||
#define _ASM_GENERIC_INT_LL64_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
/*
|
||||
* __xx is ok: it doesn't pollute the POSIX namespace. Use these in the
|
||||
* header files exported to user space
|
||||
*/
|
||||
|
||||
typedef __signed__ char __s8;
|
||||
typedef unsigned char __u8;
|
||||
|
||||
typedef __signed__ short __s16;
|
||||
typedef unsigned short __u16;
|
||||
|
||||
typedef __signed__ int __s32;
|
||||
typedef unsigned int __u32;
|
||||
|
||||
#ifdef __GNUC__
|
||||
__extension__ typedef __signed__ long long __s64;
|
||||
__extension__ typedef unsigned long long __u64;
|
||||
#else
|
||||
typedef __signed__ long long __s64;
|
||||
typedef unsigned long long __u64;
|
||||
#endif
|
||||
|
||||
typedef __s8 s8;
|
||||
typedef __u8 u8;
|
||||
typedef __s16 s16;
|
||||
typedef __u16 u16;
|
||||
typedef __s32 s32;
|
||||
typedef __u32 u32;
|
||||
typedef __s64 s64;
|
||||
typedef __u64 u64;
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
|
||||
#endif /* _ASM_GENERIC_INT_LL64_H */
|
||||
109
include/asm-generic/io.h
Normal file
109
include/asm-generic/io.h
Normal file
@@ -0,0 +1,109 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Generic I/O functions.
|
||||
*
|
||||
* Copyright (c) 2016 Imagination Technologies Ltd.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_GENERIC_IO_H__
|
||||
#define __ASM_GENERIC_IO_H__
|
||||
|
||||
/*
|
||||
* This file should be included at the end of each architecture-specific
|
||||
* asm/io.h such that we may provide generic implementations without
|
||||
* conflicting with architecture-specific code.
|
||||
*/
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/**
|
||||
* phys_to_virt() - Return a virtual address mapped to a given physical address
|
||||
* @paddr: the physical address
|
||||
*
|
||||
* Returns a virtual address which the CPU can access that maps to the physical
|
||||
* address @paddr. This should only be used where it is known that no dynamic
|
||||
* mapping is required. In general, map_physmem should be used instead.
|
||||
*
|
||||
* Returns: a virtual address which maps to @paddr
|
||||
*/
|
||||
#ifndef phys_to_virt
|
||||
static inline void *phys_to_virt(phys_addr_t paddr)
|
||||
{
|
||||
return (void *)(unsigned long)paddr;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* virt_to_phys() - Return the physical address that a virtual address maps to
|
||||
* @vaddr: the virtual address
|
||||
*
|
||||
* Returns the physical address which the CPU-accessible virtual address @vaddr
|
||||
* maps to.
|
||||
*
|
||||
* Returns: the physical address which @vaddr maps to
|
||||
*/
|
||||
#ifndef virt_to_phys
|
||||
static inline phys_addr_t virt_to_phys(void *vaddr)
|
||||
{
|
||||
return (phys_addr_t)((unsigned long)vaddr);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Flags for use with map_physmem() & unmap_physmem(). Architectures need not
|
||||
* support all of these, in which case they will be defined as zero here &
|
||||
* ignored. Callers that may run on multiple architectures should therefore
|
||||
* treat them as hints rather than requirements.
|
||||
*/
|
||||
#ifndef MAP_NOCACHE
|
||||
# define MAP_NOCACHE 0 /* Produce an uncached mapping */
|
||||
#endif
|
||||
#ifndef MAP_WRCOMBINE
|
||||
# define MAP_WRCOMBINE 0 /* Allow write-combining on the mapping */
|
||||
#endif
|
||||
#ifndef MAP_WRBACK
|
||||
# define MAP_WRBACK 0 /* Map using write-back caching */
|
||||
#endif
|
||||
#ifndef MAP_WRTHROUGH
|
||||
# define MAP_WRTHROUGH 0 /* Map using write-through caching */
|
||||
#endif
|
||||
|
||||
/**
|
||||
* map_physmem() - Return a virtual address mapped to a given physical address
|
||||
* @paddr: the physical address
|
||||
* @len: the length of the required mapping
|
||||
* @flags: flags affecting the type of mapping
|
||||
*
|
||||
* Return a virtual address through which the CPU may access the memory at
|
||||
* physical address @paddr. The mapping will be valid for at least @len bytes,
|
||||
* and may be affected by flags passed to the @flags argument. This function
|
||||
* may create new mappings, so should generally be paired with a matching call
|
||||
* to unmap_physmem once the caller is finished with the memory in question.
|
||||
*
|
||||
* Returns: a virtual address suitably mapped to @paddr
|
||||
*/
|
||||
#ifndef map_physmem
|
||||
static inline void *map_physmem(phys_addr_t paddr, unsigned long len,
|
||||
unsigned long flags)
|
||||
{
|
||||
return phys_to_virt(paddr);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* unmap_physmem() - Remove mappings created by a prior call to map_physmem()
|
||||
* @vaddr: the virtual address which map_physmem() previously returned
|
||||
* @flags: flags matching those originally passed to map_physmem()
|
||||
*
|
||||
* Unmap memory which was previously mapped by a call to map_physmem(). If
|
||||
* map_physmem() dynamically created a mapping for the memory in question then
|
||||
* unmap_physmem() will remove that mapping.
|
||||
*/
|
||||
#ifndef unmap_physmem
|
||||
static inline void unmap_physmem(void *vaddr, unsigned long flags)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
#endif /* __ASM_GENERIC_IO_H__ */
|
||||
105
include/asm-generic/ioctl.h
Normal file
105
include/asm-generic/ioctl.h
Normal file
@@ -0,0 +1,105 @@
|
||||
#ifndef _ASM_GENERIC_IOCTL_H
|
||||
#define _ASM_GENERIC_IOCTL_H
|
||||
|
||||
/* ioctl command encoding: 32 bits total, command in lower 16 bits,
|
||||
* size of the parameter structure in the lower 14 bits of the
|
||||
* upper 16 bits.
|
||||
* Encoding the size of the parameter structure in the ioctl request
|
||||
* is useful for catching programs compiled with old versions
|
||||
* and to avoid overwriting user space outside the user buffer area.
|
||||
* The highest 2 bits are reserved for indicating the ``access mode''.
|
||||
* NOTE: This limits the max parameter size to 16kB -1 !
|
||||
*/
|
||||
|
||||
/*
|
||||
* The following is for compatibility across the various Linux
|
||||
* platforms. The generic ioctl numbering scheme doesn't really enforce
|
||||
* a type field. De facto, however, the top 8 bits of the lower 16
|
||||
* bits are indeed used as a type field, so we might just as well make
|
||||
* this explicit here. Please be sure to use the decoding macros
|
||||
* below from now on.
|
||||
*/
|
||||
#define _IOC_NRBITS 8
|
||||
#define _IOC_TYPEBITS 8
|
||||
|
||||
/*
|
||||
* Let any architecture override either of the following before
|
||||
* including this file.
|
||||
*/
|
||||
|
||||
#ifndef _IOC_SIZEBITS
|
||||
# define _IOC_SIZEBITS 14
|
||||
#endif
|
||||
|
||||
#ifndef _IOC_DIRBITS
|
||||
# define _IOC_DIRBITS 2
|
||||
#endif
|
||||
|
||||
#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)
|
||||
#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
|
||||
#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
|
||||
#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)
|
||||
|
||||
#define _IOC_NRSHIFT 0
|
||||
#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
|
||||
#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
|
||||
#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
|
||||
|
||||
/*
|
||||
* Direction bits, which any architecture can choose to override
|
||||
* before including this file.
|
||||
*/
|
||||
|
||||
#ifndef _IOC_NONE
|
||||
# define _IOC_NONE 0U
|
||||
#endif
|
||||
|
||||
#ifndef _IOC_WRITE
|
||||
# define _IOC_WRITE 1U
|
||||
#endif
|
||||
|
||||
#ifndef _IOC_READ
|
||||
# define _IOC_READ 2U
|
||||
#endif
|
||||
|
||||
#define _IOC(dir,type,nr,size) \
|
||||
(((dir) << _IOC_DIRSHIFT) | \
|
||||
((type) << _IOC_TYPESHIFT) | \
|
||||
((nr) << _IOC_NRSHIFT) | \
|
||||
((size) << _IOC_SIZESHIFT))
|
||||
|
||||
#ifdef __KERNEL__
|
||||
/* provoke compile error for invalid uses of size argument */
|
||||
extern unsigned int __invalid_size_argument_for_IOC;
|
||||
#define _IOC_TYPECHECK(t) \
|
||||
((sizeof(t) == sizeof(t[1]) && \
|
||||
sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
|
||||
sizeof(t) : __invalid_size_argument_for_IOC)
|
||||
#else
|
||||
#define _IOC_TYPECHECK(t) (sizeof(t))
|
||||
#endif
|
||||
|
||||
/* used to create numbers */
|
||||
#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
|
||||
#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
|
||||
#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
|
||||
#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
|
||||
#define _IOR_BAD(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size))
|
||||
#define _IOW_BAD(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
|
||||
#define _IOWR_BAD(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
|
||||
|
||||
/* used to decode ioctl numbers.. */
|
||||
#define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
|
||||
#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
|
||||
#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
|
||||
#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
|
||||
|
||||
/* ...and for the drivers/sound files... */
|
||||
|
||||
#define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT)
|
||||
#define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT)
|
||||
#define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
|
||||
#define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT)
|
||||
#define IOCSIZE_SHIFT (_IOC_SIZESHIFT)
|
||||
|
||||
#endif /* _ASM_GENERIC_IOCTL_H */
|
||||
54
include/asm-generic/pe.h
Normal file
54
include/asm-generic/pe.h
Normal file
@@ -0,0 +1,54 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Portable Executable and Common Object Constants
|
||||
*
|
||||
* Copyright (c) 2018 Heinrich Schuchardt
|
||||
*
|
||||
* based on the "Microsoft Portable Executable and Common Object File Format
|
||||
* Specification", revision 11, 2017-01-23
|
||||
*/
|
||||
|
||||
#ifndef _ASM_PE_H
|
||||
#define _ASM_PE_H
|
||||
|
||||
/* Characteristics */
|
||||
#define IMAGE_FILE_RELOCS_STRIPPED 0x0001
|
||||
#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
|
||||
#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004
|
||||
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008
|
||||
#define IMAGE_FILE_AGGRESSIVE_WS_TRIM 0x0010
|
||||
#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020
|
||||
/* Reserved 0x0040 */
|
||||
#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080
|
||||
#define IMAGE_FILE_32BIT_MACHINE 0x0100
|
||||
#define IMAGE_FILE_DEBUG_STRIPPED 0x0200
|
||||
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400
|
||||
#define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800
|
||||
#define IMAGE_FILE_SYSTEM 0x1000
|
||||
#define IMAGE_FILE_DLL 0x2000
|
||||
#define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000
|
||||
#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000
|
||||
|
||||
/* Machine types */
|
||||
#define IMAGE_FILE_MACHINE_I386 0x014c
|
||||
#define IMAGE_FILE_MACHINE_ARM 0x01c0
|
||||
#define IMAGE_FILE_MACHINE_THUMB 0x01c2
|
||||
#define IMAGE_FILE_MACHINE_ARMNT 0x01c4
|
||||
#define IMAGE_FILE_MACHINE_AMD64 0x8664
|
||||
#define IMAGE_FILE_MACHINE_ARM64 0xaa64
|
||||
#define IMAGE_FILE_MACHINE_RISCV32 0x5032
|
||||
#define IMAGE_FILE_MACHINE_RISCV64 0x5064
|
||||
|
||||
/* Header magic constants */
|
||||
#define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x010b
|
||||
#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x020b
|
||||
#define IMAGE_DOS_SIGNATURE 0x5a4d /* MZ */
|
||||
#define IMAGE_NT_SIGNATURE 0x00004550 /* PE00 */
|
||||
|
||||
/* Subsystem type */
|
||||
#define IMAGE_SUBSYSTEM_EFI_APPLICATION 10
|
||||
#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11
|
||||
#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12
|
||||
#define IMAGE_SUBSYSTEM_EFI_ROM 13
|
||||
|
||||
#endif /* _ASM_PE_H */
|
||||
92
include/asm-generic/sections.h
Normal file
92
include/asm-generic/sections.h
Normal file
@@ -0,0 +1,92 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (c) 2011 The Chromium OS Authors.
|
||||
*/
|
||||
|
||||
/* Taken from Linux kernel, commit f56c3196 */
|
||||
|
||||
#ifndef _ASM_GENERIC_SECTIONS_H_
|
||||
#define _ASM_GENERIC_SECTIONS_H_
|
||||
|
||||
/* References to section boundaries */
|
||||
|
||||
extern char _text[], _stext[], _etext[];
|
||||
extern char _data[], _sdata[], _edata[];
|
||||
extern char __bss_start[], __bss_stop[];
|
||||
extern char __init_begin[], __init_end[];
|
||||
extern char _sinittext[], _einittext[];
|
||||
extern char _end[], _init[];
|
||||
extern char __per_cpu_load[], __per_cpu_start[], __per_cpu_end[];
|
||||
extern char __kprobes_text_start[], __kprobes_text_end[];
|
||||
extern char __entry_text_start[], __entry_text_end[];
|
||||
extern char __initdata_begin[], __initdata_end[];
|
||||
extern char __start_rodata[], __end_rodata[];
|
||||
extern char __efi_helloworld_begin[];
|
||||
extern char __efi_helloworld_end[];
|
||||
|
||||
/* Start and end of .ctors section - used for constructor calls. */
|
||||
extern char __ctors_start[], __ctors_end[];
|
||||
|
||||
/* function descriptor handling (if any). Override
|
||||
* in asm/sections.h */
|
||||
#ifndef dereference_function_descriptor
|
||||
#define dereference_function_descriptor(p) (p)
|
||||
#endif
|
||||
|
||||
/* random extra sections (if any). Override
|
||||
* in asm/sections.h */
|
||||
#ifndef arch_is_kernel_text
|
||||
static inline int arch_is_kernel_text(unsigned long addr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef arch_is_kernel_data
|
||||
static inline int arch_is_kernel_data(unsigned long addr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* U-Boot-specific things begin here */
|
||||
|
||||
/* Start of U-Boot text region */
|
||||
extern char __text_start[];
|
||||
|
||||
/* This marks the end of the text region which must be relocated */
|
||||
extern char __image_copy_end[];
|
||||
|
||||
/*
|
||||
* This is the U-Boot entry point - prior to relocation it should be same
|
||||
* as __text_start
|
||||
*/
|
||||
extern void _start(void);
|
||||
|
||||
/*
|
||||
* ARM defines its symbols as char[]. Other arches define them as ulongs.
|
||||
*/
|
||||
#if (defined(CONFIG_ARM) || defined(CONFIG_CSKY))
|
||||
|
||||
extern char __bss_start[];
|
||||
extern char __bss_end[];
|
||||
extern char __image_copy_start[];
|
||||
extern char __image_copy_end[];
|
||||
extern char _image_binary_end[];
|
||||
extern char __rel_dyn_start[];
|
||||
extern char __rel_dyn_end[];
|
||||
|
||||
#else /* don't use offsets: */
|
||||
|
||||
/* Exports from the Linker Script */
|
||||
extern ulong __data_end;
|
||||
extern ulong __rel_dyn_start;
|
||||
extern ulong __rel_dyn_end;
|
||||
extern ulong __bss_end;
|
||||
extern ulong _image_binary_end;
|
||||
|
||||
extern ulong _TEXT_BASE; /* code start */
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_GENERIC_SECTIONS_H_ */
|
||||
101
include/asm-generic/signal.h
Normal file
101
include/asm-generic/signal.h
Normal file
@@ -0,0 +1,101 @@
|
||||
#ifndef __ASM_GENERIC_SIGNAL_H
|
||||
#define __ASM_GENERIC_SIGNAL_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define _NSIG 64
|
||||
#define _NSIG_BPW BITS_PER_LONG
|
||||
#define _NSIG_WORDS (_NSIG / _NSIG_BPW)
|
||||
|
||||
#define SIGHUP 1
|
||||
#define SIGINT 2
|
||||
#define SIGQUIT 3
|
||||
#define SIGILL 4
|
||||
#define SIGTRAP 5
|
||||
#define SIGABRT 6
|
||||
#define SIGIOT 6
|
||||
#define SIGBUS 7
|
||||
#define SIGFPE 8
|
||||
#define SIGKILL 9
|
||||
#define SIGUSR1 10
|
||||
#define SIGSEGV 11
|
||||
#define SIGUSR2 12
|
||||
#define SIGPIPE 13
|
||||
#define SIGALRM 14
|
||||
#define SIGTERM 15
|
||||
#define SIGSTKFLT 16
|
||||
#define SIGCHLD 17
|
||||
#define SIGCONT 18
|
||||
#define SIGSTOP 19
|
||||
#define SIGTSTP 20
|
||||
#define SIGTTIN 21
|
||||
#define SIGTTOU 22
|
||||
#define SIGURG 23
|
||||
#define SIGXCPU 24
|
||||
#define SIGXFSZ 25
|
||||
#define SIGVTALRM 26
|
||||
#define SIGPROF 27
|
||||
#define SIGWINCH 28
|
||||
#define SIGIO 29
|
||||
#define SIGPOLL SIGIO
|
||||
/*
|
||||
#define SIGLOST 29
|
||||
*/
|
||||
#define SIGPWR 30
|
||||
#define SIGSYS 31
|
||||
#define SIGUNUSED 31
|
||||
|
||||
/* These should not be considered constants from userland. */
|
||||
#define SIGRTMIN 32
|
||||
#ifndef SIGRTMAX
|
||||
#define SIGRTMAX _NSIG
|
||||
#endif
|
||||
|
||||
/*
|
||||
* SA_FLAGS values:
|
||||
*
|
||||
* SA_ONSTACK indicates that a registered stack_t will be used.
|
||||
* SA_RESTART flag to get restarting signals (which were the default long ago)
|
||||
* SA_NOCLDSTOP flag to turn off SIGCHLD when children stop.
|
||||
* SA_RESETHAND clears the handler when the signal is delivered.
|
||||
* SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies.
|
||||
* SA_NODEFER prevents the current signal from being masked in the handler.
|
||||
*
|
||||
* SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single
|
||||
* Unix names RESETHAND and NODEFER respectively.
|
||||
*/
|
||||
#define SA_NOCLDSTOP 0x00000001
|
||||
#define SA_NOCLDWAIT 0x00000002
|
||||
#define SA_SIGINFO 0x00000004
|
||||
#define SA_ONSTACK 0x08000000
|
||||
#define SA_RESTART 0x10000000
|
||||
#define SA_NODEFER 0x40000000
|
||||
#define SA_RESETHAND 0x80000000
|
||||
|
||||
#define SA_NOMASK SA_NODEFER
|
||||
#define SA_ONESHOT SA_RESETHAND
|
||||
|
||||
/*
|
||||
* New architectures should not define the obsolete
|
||||
* SA_RESTORER 0x04000000
|
||||
*/
|
||||
|
||||
/*
|
||||
* sigaltstack controls
|
||||
*/
|
||||
#define SS_ONSTACK 1
|
||||
#define SS_DISABLE 2
|
||||
|
||||
#define MINSIGSTKSZ 2048
|
||||
#define SIGSTKSZ 8192
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
typedef struct {
|
||||
unsigned long sig[_NSIG_WORDS];
|
||||
} sigset_t;
|
||||
|
||||
/* not actually used, but required for linux/syscalls.h */
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* _ASM_GENERIC_SIGNAL_H */
|
||||
9
include/asm-generic/types.h
Normal file
9
include/asm-generic/types.h
Normal file
@@ -0,0 +1,9 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _ASM_GENERIC_TYPES_H
|
||||
#define _ASM_GENERIC_TYPES_H
|
||||
/*
|
||||
* int-ll64 is used everywhere now.
|
||||
*/
|
||||
#include <asm-generic/int-ll64.h>
|
||||
|
||||
#endif /* _ASM_GENERIC_TYPES_H */
|
||||
98
include/asm-generic/u-boot.h
Normal file
98
include/asm-generic/u-boot.h
Normal file
@@ -0,0 +1,98 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (c) 2011 The Chromium OS Authors.
|
||||
*
|
||||
* (C) Copyright 2000 - 2002
|
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
********************************************************************
|
||||
* NOTE: This header file defines an interface to U-Boot. Including
|
||||
* this (unmodified) header file in another file is considered normal
|
||||
* use of U-Boot, and does *not* fall under the heading of "derived
|
||||
* work".
|
||||
********************************************************************
|
||||
*/
|
||||
|
||||
#ifndef __ASM_GENERIC_U_BOOT_H__
|
||||
#define __ASM_GENERIC_U_BOOT_H__
|
||||
|
||||
/*
|
||||
* Board information passed to Linux kernel from U-Boot
|
||||
*
|
||||
* include/asm-ppc/u-boot.h
|
||||
*/
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
typedef struct bd_info {
|
||||
unsigned long bi_memstart; /* start of DRAM memory */
|
||||
phys_size_t bi_memsize; /* size of DRAM memory in bytes */
|
||||
unsigned long bi_flashstart; /* start of FLASH memory */
|
||||
unsigned long bi_flashsize; /* size of FLASH memory */
|
||||
unsigned long bi_flashoffset; /* reserved area for startup monitor */
|
||||
unsigned long bi_sramstart; /* start of SRAM memory */
|
||||
unsigned long bi_sramsize; /* size of SRAM memory */
|
||||
#ifdef CONFIG_ARM
|
||||
unsigned long bi_arm_freq; /* arm frequency */
|
||||
unsigned long bi_dsp_freq; /* dsp core frequency */
|
||||
unsigned long bi_ddr_freq; /* ddr frequency */
|
||||
#endif
|
||||
#if defined(CONFIG_MPC8xx) || defined(CONFIG_E500) || defined(CONFIG_MPC86xx)
|
||||
unsigned long bi_immr_base; /* base of IMMR register */
|
||||
#endif
|
||||
#if defined(CONFIG_M68K)
|
||||
unsigned long bi_mbar_base; /* base of internal registers */
|
||||
#endif
|
||||
#if defined(CONFIG_MPC83xx)
|
||||
unsigned long bi_immrbar;
|
||||
#endif
|
||||
unsigned long bi_bootflags; /* boot / reboot flag (Unused) */
|
||||
unsigned long bi_ip_addr; /* IP Address */
|
||||
unsigned char bi_enetaddr[6]; /* OLD: see README.enetaddr */
|
||||
unsigned short bi_ethspeed; /* Ethernet speed in Mbps */
|
||||
unsigned long bi_intfreq; /* Internal Freq, in MHz */
|
||||
unsigned long bi_busfreq; /* Bus Freq, in MHz */
|
||||
#if defined(CONFIG_CPM2)
|
||||
unsigned long bi_cpmfreq; /* CPM_CLK Freq, in MHz */
|
||||
unsigned long bi_brgfreq; /* BRG_CLK Freq, in MHz */
|
||||
unsigned long bi_sccfreq; /* SCC_CLK Freq, in MHz */
|
||||
unsigned long bi_vco; /* VCO Out from PLL, in MHz */
|
||||
#endif
|
||||
#if defined(CONFIG_M68K)
|
||||
unsigned long bi_ipbfreq; /* IPB Bus Freq, in MHz */
|
||||
unsigned long bi_pcifreq; /* PCI Bus Freq, in MHz */
|
||||
#endif
|
||||
#if defined(CONFIG_EXTRA_CLOCK)
|
||||
unsigned long bi_inpfreq; /* input Freq in MHz */
|
||||
unsigned long bi_vcofreq; /* vco Freq in MHz */
|
||||
unsigned long bi_flbfreq; /* Flexbus Freq in MHz */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_HAS_ETH1
|
||||
unsigned char bi_enet1addr[6]; /* OLD: see README.enetaddr */
|
||||
#endif
|
||||
#ifdef CONFIG_HAS_ETH2
|
||||
unsigned char bi_enet2addr[6]; /* OLD: see README.enetaddr */
|
||||
#endif
|
||||
#ifdef CONFIG_HAS_ETH3
|
||||
unsigned char bi_enet3addr[6]; /* OLD: see README.enetaddr */
|
||||
#endif
|
||||
#ifdef CONFIG_HAS_ETH4
|
||||
unsigned char bi_enet4addr[6]; /* OLD: see README.enetaddr */
|
||||
#endif
|
||||
#ifdef CONFIG_HAS_ETH5
|
||||
unsigned char bi_enet5addr[6]; /* OLD: see README.enetaddr */
|
||||
#endif
|
||||
|
||||
ulong bi_arch_number; /* unique id for this board */
|
||||
ulong bi_boot_params; /* where this board expects params */
|
||||
#ifdef CONFIG_NR_DRAM_BANKS
|
||||
struct { /* RAM configuration */
|
||||
phys_addr_t start;
|
||||
phys_size_t size;
|
||||
} bi_dram[CONFIG_NR_DRAM_BANKS];
|
||||
#endif /* CONFIG_NR_DRAM_BANKS */
|
||||
} bd_t;
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* __ASM_GENERIC_U_BOOT_H__ */
|
||||
26
include/asm-generic/unaligned.h
Normal file
26
include/asm-generic/unaligned.h
Normal file
@@ -0,0 +1,26 @@
|
||||
#ifndef _GENERIC_UNALIGNED_H
|
||||
#define _GENERIC_UNALIGNED_H
|
||||
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
#include <linux/unaligned/le_byteshift.h>
|
||||
#include <linux/unaligned/be_byteshift.h>
|
||||
#include <linux/unaligned/generic.h>
|
||||
|
||||
/*
|
||||
* Select endianness
|
||||
*/
|
||||
#if defined(__LITTLE_ENDIAN)
|
||||
#define get_unaligned __get_unaligned_le
|
||||
#define put_unaligned __put_unaligned_le
|
||||
#elif defined(__BIG_ENDIAN)
|
||||
#define get_unaligned __get_unaligned_be
|
||||
#define put_unaligned __put_unaligned_be
|
||||
#else
|
||||
#error invalid endian
|
||||
#endif
|
||||
|
||||
/* Allow unaligned memory access */
|
||||
void allow_unaligned(void);
|
||||
|
||||
#endif
|
||||
6
include/asm-offsets.h
Normal file
6
include/asm-offsets.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#ifndef DO_DEPS_ONLY
|
||||
|
||||
#include <generated/generic-asm-offsets.h>
|
||||
/* #include <generated/asm-offsets.h> */
|
||||
|
||||
#endif
|
||||
250
include/ata.h
Normal file
250
include/ata.h
Normal file
@@ -0,0 +1,250 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2000
|
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Most of the following information was derived from the document
|
||||
* "Information Technology - AT Attachment-3 Interface (ATA-3)"
|
||||
* which can be found at:
|
||||
* http://www.dt.wdc.com/ata/ata-3/ata3r5v.zip
|
||||
* ftp://poctok.iae.nsk.su/pub/asm/Documents/IDE/ATA3R5V.ZIP
|
||||
* ftp://ftp.fee.vutbr.cz/pub/doc/io/ata/ata-3/ata3r5v.zip
|
||||
*/
|
||||
|
||||
#ifndef _ATA_H
|
||||
#define _ATA_H
|
||||
|
||||
#include <libata.h>
|
||||
|
||||
/* Register addressing depends on the hardware design; for instance,
|
||||
* 8-bit (register) and 16-bit (data) accesses might use different
|
||||
* address spaces. This is implemented by the following definitions.
|
||||
*/
|
||||
#ifndef CONFIG_SYS_ATA_STRIDE
|
||||
#define CONFIG_SYS_ATA_STRIDE 1
|
||||
#endif
|
||||
|
||||
#define ATA_IO_DATA(x) (CONFIG_SYS_ATA_DATA_OFFSET+((x) * CONFIG_SYS_ATA_STRIDE))
|
||||
#define ATA_IO_REG(x) (CONFIG_SYS_ATA_REG_OFFSET +((x) * CONFIG_SYS_ATA_STRIDE))
|
||||
#define ATA_IO_ALT(x) (CONFIG_SYS_ATA_ALT_OFFSET +((x) * CONFIG_SYS_ATA_STRIDE))
|
||||
|
||||
/*
|
||||
* I/O Register Descriptions
|
||||
*/
|
||||
#define ATA_DATA_REG ATA_IO_DATA(0)
|
||||
#define ATA_ERROR_REG ATA_IO_REG(1)
|
||||
#define ATA_SECT_CNT ATA_IO_REG(2)
|
||||
#define ATA_SECT_NUM ATA_IO_REG(3)
|
||||
#define ATA_CYL_LOW ATA_IO_REG(4)
|
||||
#define ATA_CYL_HIGH ATA_IO_REG(5)
|
||||
#define ATA_DEV_HD ATA_IO_REG(6)
|
||||
#define ATA_COMMAND ATA_IO_REG(7)
|
||||
#define ATA_DATA_EVEN ATA_IO_REG(8)
|
||||
#define ATA_DATA_ODD ATA_IO_REG(9)
|
||||
#define ATA_STATUS ATA_COMMAND
|
||||
#define ATA_DEV_CTL ATA_IO_ALT(6)
|
||||
#define ATA_LBA_LOW ATA_SECT_NUM
|
||||
#define ATA_LBA_MID ATA_CYL_LOW
|
||||
#define ATA_LBA_HIGH ATA_CYL_HIGH
|
||||
#define ATA_LBA_SEL ATA_DEV_CTL
|
||||
|
||||
/*
|
||||
* Status register bits
|
||||
*/
|
||||
#define ATA_STAT_BUSY 0x80 /* Device Busy */
|
||||
#define ATA_STAT_READY 0x40 /* Device Ready */
|
||||
#define ATA_STAT_FAULT 0x20 /* Device Fault */
|
||||
#define ATA_STAT_SEEK 0x10 /* Device Seek Complete */
|
||||
#define ATA_STAT_DRQ 0x08 /* Data Request (ready) */
|
||||
#define ATA_STAT_CORR 0x04 /* Corrected Data Error */
|
||||
#define ATA_STAT_INDEX 0x02 /* Vendor specific */
|
||||
#define ATA_STAT_ERR 0x01 /* Error */
|
||||
|
||||
/*
|
||||
* Device / Head Register Bits
|
||||
*/
|
||||
#ifndef ATA_DEVICE
|
||||
#define ATA_DEVICE(x) ((x & 1)<<4)
|
||||
#endif /* ATA_DEVICE */
|
||||
#define ATA_LBA 0xE0
|
||||
|
||||
/*
|
||||
* ATA Commands (only mandatory commands listed here)
|
||||
*/
|
||||
#define ATA_CMD_READ 0x20 /* Read Sectors (with retries) */
|
||||
#define ATA_CMD_READN 0x21 /* Read Sectors ( no retries) */
|
||||
#define ATA_CMD_WRITE 0x30 /* Write Sectores (with retries)*/
|
||||
#define ATA_CMD_WRITEN 0x31 /* Write Sectors ( no retries)*/
|
||||
#define ATA_CMD_VRFY 0x40 /* Read Verify (with retries) */
|
||||
#define ATA_CMD_VRFYN 0x41 /* Read verify ( no retries) */
|
||||
#define ATA_CMD_SEEK 0x70 /* Seek */
|
||||
#define ATA_CMD_DIAG 0x90 /* Execute Device Diagnostic */
|
||||
#define ATA_CMD_INIT 0x91 /* Initialize Device Parameters */
|
||||
#define ATA_CMD_RD_MULT 0xC4 /* Read Multiple */
|
||||
#define ATA_CMD_WR_MULT 0xC5 /* Write Multiple */
|
||||
#define ATA_CMD_SETMULT 0xC6 /* Set Multiple Mode */
|
||||
#define ATA_CMD_RD_DMA 0xC8 /* Read DMA (with retries) */
|
||||
#define ATA_CMD_RD_DMAN 0xC9 /* Read DMS ( no retries) */
|
||||
#define ATA_CMD_WR_DMA 0xCA /* Write DMA (with retries) */
|
||||
#define ATA_CMD_WR_DMAN 0xCB /* Write DMA ( no retires) */
|
||||
#define ATA_CMD_IDENT 0xEC /* Identify Device */
|
||||
#define ATA_CMD_SETF 0xEF /* Set Features */
|
||||
#define ATA_CMD_CHK_PWR 0xE5 /* Check Power Mode */
|
||||
|
||||
#define ATA_CMD_READ_EXT 0x24 /* Read Sectors (with retries) with 48bit addressing */
|
||||
#define ATA_CMD_WRITE_EXT 0x34 /* Write Sectores (with retries) with 48bit addressing */
|
||||
#define ATA_CMD_VRFY_EXT 0x42 /* Read Verify (with retries) with 48bit addressing */
|
||||
|
||||
#define ATA_CMD_FLUSH 0xE7 /* Flush drive cache */
|
||||
#define ATA_CMD_FLUSH_EXT 0xEA /* Flush drive cache, with 48bit addressing */
|
||||
|
||||
/*
|
||||
* ATAPI Commands
|
||||
*/
|
||||
#define ATAPI_CMD_IDENT 0xA1 /* Identify AT Atachment Packed Interface Device */
|
||||
#define ATAPI_CMD_PACKET 0xA0 /* Packed Command */
|
||||
|
||||
|
||||
#define ATAPI_CMD_INQUIRY 0x12
|
||||
#define ATAPI_CMD_REQ_SENSE 0x03
|
||||
#define ATAPI_CMD_READ_CAP 0x25
|
||||
#define ATAPI_CMD_START_STOP 0x1B
|
||||
#define ATAPI_CMD_READ_12 0xA8
|
||||
|
||||
|
||||
#define ATA_GET_ERR() inb(ATA_STATUS)
|
||||
#define ATA_GET_STAT() inb(ATA_STATUS)
|
||||
#define ATA_OK_STAT(stat,good,bad) (((stat)&((good)|(bad)))==(good))
|
||||
#define ATA_BAD_R_STAT (ATA_STAT_BUSY | ATA_STAT_ERR)
|
||||
#define ATA_BAD_W_STAT (ATA_BAD_R_STAT | ATA_STAT_FAULT)
|
||||
#define ATA_BAD_STAT (ATA_BAD_R_STAT | ATA_STAT_DRQ)
|
||||
#define ATA_DRIVE_READY (ATA_READY_STAT | ATA_STAT_SEEK)
|
||||
#define ATA_DATA_READY (ATA_STAT_DRQ)
|
||||
|
||||
#define ATA_BLOCKSIZE 512 /* bytes */
|
||||
#define ATA_BLOCKSHIFT 9 /* 2 ^ ATA_BLOCKSIZESHIFT = 512 */
|
||||
#define ATA_SECTORWORDS (512 / sizeof(uint32_t))
|
||||
|
||||
#ifndef ATA_RESET_TIME
|
||||
#define ATA_RESET_TIME 60 /* spec allows up to 31 seconds */
|
||||
#endif
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* structure returned by ATA_CMD_IDENT, as per ANSI ATA2 rev.2f spec
|
||||
*/
|
||||
typedef struct hd_driveid {
|
||||
unsigned short config; /* lots of obsolete bit flags */
|
||||
unsigned short cyls; /* "physical" cyls */
|
||||
unsigned short reserved2; /* reserved (word 2) */
|
||||
unsigned short heads; /* "physical" heads */
|
||||
unsigned short track_bytes; /* unformatted bytes per track */
|
||||
unsigned short sector_bytes; /* unformatted bytes per sector */
|
||||
unsigned short sectors; /* "physical" sectors per track */
|
||||
unsigned short vendor0; /* vendor unique */
|
||||
unsigned short vendor1; /* vendor unique */
|
||||
unsigned short vendor2; /* vendor unique */
|
||||
unsigned char serial_no[20]; /* 0 = not_specified */
|
||||
unsigned short buf_type;
|
||||
unsigned short buf_size; /* 512 byte increments; 0 = not_specified */
|
||||
unsigned short ecc_bytes; /* for r/w long cmds; 0 = not_specified */
|
||||
unsigned char fw_rev[8]; /* 0 = not_specified */
|
||||
unsigned char model[40]; /* 0 = not_specified */
|
||||
unsigned char max_multsect; /* 0=not_implemented */
|
||||
unsigned char vendor3; /* vendor unique */
|
||||
unsigned short dword_io; /* 0=not_implemented; 1=implemented */
|
||||
unsigned char vendor4; /* vendor unique */
|
||||
unsigned char capability; /* bits 0:DMA 1:LBA 2:IORDYsw 3:IORDYsup*/
|
||||
unsigned short reserved50; /* reserved (word 50) */
|
||||
unsigned char vendor5; /* vendor unique */
|
||||
unsigned char tPIO; /* 0=slow, 1=medium, 2=fast */
|
||||
unsigned char vendor6; /* vendor unique */
|
||||
unsigned char tDMA; /* 0=slow, 1=medium, 2=fast */
|
||||
unsigned short field_valid; /* bits 0:cur_ok 1:eide_ok */
|
||||
unsigned short cur_cyls; /* logical cylinders */
|
||||
unsigned short cur_heads; /* logical heads */
|
||||
unsigned short cur_sectors; /* logical sectors per track */
|
||||
unsigned short cur_capacity0; /* logical total sectors on drive */
|
||||
unsigned short cur_capacity1; /* (2 words, misaligned int) */
|
||||
unsigned char multsect; /* current multiple sector count */
|
||||
unsigned char multsect_valid; /* when (bit0==1) multsect is ok */
|
||||
unsigned int lba_capacity; /* total number of sectors */
|
||||
unsigned short dma_1word; /* single-word dma info */
|
||||
unsigned short dma_mword; /* multiple-word dma info */
|
||||
unsigned short eide_pio_modes; /* bits 0:mode3 1:mode4 */
|
||||
unsigned short eide_dma_min; /* min mword dma cycle time (ns) */
|
||||
unsigned short eide_dma_time; /* recommended mword dma cycle time (ns) */
|
||||
unsigned short eide_pio; /* min cycle time (ns), no IORDY */
|
||||
unsigned short eide_pio_iordy; /* min cycle time (ns), with IORDY */
|
||||
unsigned short words69_70[2]; /* reserved words 69-70 */
|
||||
unsigned short words71_74[4]; /* reserved words 71-74 */
|
||||
unsigned short queue_depth; /* */
|
||||
unsigned short words76_79[4]; /* reserved words 76-79 */
|
||||
unsigned short major_rev_num; /* */
|
||||
unsigned short minor_rev_num; /* */
|
||||
unsigned short command_set_1; /* bits 0:Smart 1:Security 2:Removable 3:PM */
|
||||
unsigned short command_set_2; /* bits 14:Smart Enabled 13:0 zero 10:lba48 support*/
|
||||
unsigned short cfsse; /* command set-feature supported extensions */
|
||||
unsigned short cfs_enable_1; /* command set-feature enabled */
|
||||
unsigned short cfs_enable_2; /* command set-feature enabled */
|
||||
unsigned short csf_default; /* command set-feature default */
|
||||
unsigned short dma_ultra; /* */
|
||||
unsigned short word89; /* reserved (word 89) */
|
||||
unsigned short word90; /* reserved (word 90) */
|
||||
unsigned short CurAPMvalues; /* current APM values */
|
||||
unsigned short word92; /* reserved (word 92) */
|
||||
unsigned short hw_config; /* hardware config */
|
||||
unsigned short words94_99[6];/* reserved words 94-99 */
|
||||
/*unsigned long long lba48_capacity; /--* 4 16bit values containing lba 48 total number of sectors */
|
||||
unsigned short lba48_capacity[4]; /* 4 16bit values containing lba 48 total number of sectors */
|
||||
unsigned short words104_125[22];/* reserved words 104-125 */
|
||||
unsigned short last_lun; /* reserved (word 126) */
|
||||
unsigned short word127; /* reserved (word 127) */
|
||||
unsigned short dlf; /* device lock function
|
||||
* 15:9 reserved
|
||||
* 8 security level 1:max 0:high
|
||||
* 7:6 reserved
|
||||
* 5 enhanced erase
|
||||
* 4 expire
|
||||
* 3 frozen
|
||||
* 2 locked
|
||||
* 1 en/disabled
|
||||
* 0 capability
|
||||
*/
|
||||
unsigned short csfo; /* current set features options
|
||||
* 15:4 reserved
|
||||
* 3 auto reassign
|
||||
* 2 reverting
|
||||
* 1 read-look-ahead
|
||||
* 0 write cache
|
||||
*/
|
||||
unsigned short words130_155[26];/* reserved vendor words 130-155 */
|
||||
unsigned short word156;
|
||||
unsigned short words157_159[3];/* reserved vendor words 157-159 */
|
||||
unsigned short words160_162[3];/* reserved words 160-162 */
|
||||
unsigned short cf_advanced_caps;
|
||||
unsigned short words164_255[92];/* reserved words 164-255 */
|
||||
} hd_driveid_t;
|
||||
|
||||
|
||||
/*
|
||||
* PIO Mode Configuration
|
||||
*
|
||||
* See ATA-3 (AT Attachment-3 Interface) documentation, Figure 14 / Table 21
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
unsigned int t_setup; /* Setup Time in [ns] or clocks */
|
||||
unsigned int t_length; /* Length Time in [ns] or clocks */
|
||||
unsigned int t_hold; /* Hold Time in [ns] or clocks */
|
||||
}
|
||||
pio_config_t;
|
||||
|
||||
#define IDE_MAX_PIO_MODE 4 /* max suppurted PIO mode */
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
#endif /* _ATA_H */
|
||||
182
include/atf_common.h
Normal file
182
include/atf_common.h
Normal file
@@ -0,0 +1,182 @@
|
||||
/* SPDX-License-Identifier: BSD-3-Clause */
|
||||
/*
|
||||
* This is from the ARM TF Project,
|
||||
* Repository: https://github.com/ARM-software/arm-trusted-firmware.git
|
||||
* File: include/common/bl_common.h
|
||||
* Portions copyright (c) 2013-2016, ARM Limited and Contributors. All rights
|
||||
* reserved.
|
||||
* Copyright (C) 2016-2017 Rockchip Electronic Co.,Ltd
|
||||
*/
|
||||
|
||||
#ifndef __BL_COMMON_H__
|
||||
#define __BL_COMMON_H__
|
||||
|
||||
#define ATF_PARAM_EP 0x01
|
||||
#define ATF_PARAM_IMAGE_BINARY 0x02
|
||||
#define ATF_PARAM_BL31 0x03
|
||||
|
||||
#define ATF_VERSION_1 0x01
|
||||
|
||||
#define ATF_EP_SECURE 0x0
|
||||
#define ATF_EP_NON_SECURE 0x1
|
||||
|
||||
#define SET_PARAM_HEAD(_p, _type, _ver, _attr) do { \
|
||||
(_p)->h.type = (uint8_t)(_type); \
|
||||
(_p)->h.version = (uint8_t)(_ver); \
|
||||
(_p)->h.size = (uint16_t)sizeof(*_p); \
|
||||
(_p)->h.attr = (uint32_t)(_attr) ; \
|
||||
} while (0)
|
||||
|
||||
#define MODE_RW_SHIFT 0x4
|
||||
#define MODE_RW_MASK 0x1
|
||||
#define MODE_RW_64 0x0
|
||||
#define MODE_RW_32 0x1
|
||||
|
||||
#define MODE_EL_SHIFT 0x2
|
||||
#define MODE_EL_MASK 0x3
|
||||
#define MODE_EL3 0x3
|
||||
#define MODE_EL2 0x2
|
||||
#define MODE_EL1 0x1
|
||||
#define MODE_EL0 0x0
|
||||
|
||||
#define MODE_SP_SHIFT 0x0
|
||||
#define MODE_SP_MASK 0x1
|
||||
#define MODE_SP_EL0 0x0
|
||||
#define MODE_SP_ELX 0x1
|
||||
|
||||
#define SPSR_DAIF_SHIFT 6
|
||||
#define SPSR_DAIF_MASK 0x0f
|
||||
|
||||
#define SPSR_64(el, sp, daif) \
|
||||
(MODE_RW_64 << MODE_RW_SHIFT | \
|
||||
((el) & MODE_EL_MASK) << MODE_EL_SHIFT | \
|
||||
((sp) & MODE_SP_MASK) << MODE_SP_SHIFT | \
|
||||
((daif) & SPSR_DAIF_MASK) << SPSR_DAIF_SHIFT)
|
||||
|
||||
#define SPSR_FIQ (1 << 6)
|
||||
#define SPSR_IRQ (1 << 7)
|
||||
#define SPSR_SERROR (1 << 8)
|
||||
#define SPSR_DEBUG (1 << 9)
|
||||
#define SPSR_EXCEPTION_MASK (SPSR_FIQ | SPSR_IRQ | SPSR_SERROR | SPSR_DEBUG)
|
||||
|
||||
#define DAIF_FIQ_BIT (1<<0)
|
||||
#define DAIF_IRQ_BIT (1<<1)
|
||||
#define DAIF_ABT_BIT (1<<2)
|
||||
#define DAIF_DBG_BIT (1<<3)
|
||||
#define DISABLE_ALL_EXECPTIONS \
|
||||
(DAIF_FIQ_BIT | DAIF_IRQ_BIT | DAIF_ABT_BIT | DAIF_DBG_BIT)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/*******************************************************************************
|
||||
* Structure used for telling the next BL how much of a particular type of
|
||||
* memory is available for its use and how much is already used.
|
||||
******************************************************************************/
|
||||
struct aapcs64_params {
|
||||
unsigned long arg0;
|
||||
unsigned long arg1;
|
||||
unsigned long arg2;
|
||||
unsigned long arg3;
|
||||
unsigned long arg4;
|
||||
unsigned long arg5;
|
||||
unsigned long arg6;
|
||||
unsigned long arg7;
|
||||
};
|
||||
|
||||
/***************************************************************************
|
||||
* This structure provides version information and the size of the
|
||||
* structure, attributes for the structure it represents
|
||||
***************************************************************************/
|
||||
struct param_header {
|
||||
uint8_t type; /* type of the structure */
|
||||
uint8_t version; /* version of this structure */
|
||||
uint16_t size; /* size of this structure in bytes */
|
||||
uint32_t attr; /* attributes: unused bits SBZ */
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
* This structure represents the superset of information needed while
|
||||
* switching exception levels. The only two mechanisms to do so are
|
||||
* ERET & SMC. Security state is indicated using bit zero of header
|
||||
* attribute
|
||||
* NOTE: BL1 expects entrypoint followed by spsr at an offset from the start
|
||||
* of this structure defined by the macro `ENTRY_POINT_INFO_PC_OFFSET` while
|
||||
* processing SMC to jump to BL31.
|
||||
*****************************************************************************/
|
||||
struct entry_point_info {
|
||||
struct param_header h;
|
||||
uintptr_t pc;
|
||||
uint32_t spsr;
|
||||
struct aapcs64_params args;
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
* Image info binary provides information from the image loader that
|
||||
* can be used by the firmware to manage available trusted RAM.
|
||||
* More advanced firmware image formats can provide additional
|
||||
* information that enables optimization or greater flexibility in the
|
||||
* common firmware code
|
||||
*****************************************************************************/
|
||||
struct atf_image_info {
|
||||
struct param_header h;
|
||||
uintptr_t image_base; /* physical address of base of image */
|
||||
uint32_t image_size; /* bytes read from image file */
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
* The image descriptor struct definition.
|
||||
*****************************************************************************/
|
||||
struct image_desc {
|
||||
/* Contains unique image id for the image. */
|
||||
unsigned int image_id;
|
||||
/*
|
||||
* This member contains Image state information.
|
||||
* Refer IMAGE_STATE_XXX defined above.
|
||||
*/
|
||||
unsigned int state;
|
||||
uint32_t copied_size; /* image size copied in blocks */
|
||||
struct atf_image_info atf_image_info;
|
||||
struct entry_point_info ep_info;
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
* This structure represents the superset of information that can be passed to
|
||||
* BL31 e.g. while passing control to it from BL2. The BL32 parameters will be
|
||||
* populated only if BL2 detects its presence. A pointer to a structure of this
|
||||
* type should be passed in X0 to BL31's cold boot entrypoint.
|
||||
*
|
||||
* Use of this structure and the X0 parameter is not mandatory: the BL31
|
||||
* platform code can use other mechanisms to provide the necessary information
|
||||
* about BL32 and BL33 to the common and SPD code.
|
||||
*
|
||||
* BL31 image information is mandatory if this structure is used. If either of
|
||||
* the optional BL32 and BL33 image information is not provided, this is
|
||||
* indicated by the respective image_info pointers being zero.
|
||||
******************************************************************************/
|
||||
struct bl31_params {
|
||||
struct param_header h;
|
||||
struct atf_image_info *bl31_image_info;
|
||||
struct entry_point_info *bl32_ep_info;
|
||||
struct atf_image_info *bl32_image_info;
|
||||
struct entry_point_info *bl33_ep_info;
|
||||
struct atf_image_info *bl33_image_info;
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
* This structure represents the superset of information that is passed to
|
||||
* BL31, e.g. while passing control to it from BL2, bl31_params
|
||||
* and other platform specific params
|
||||
******************************************************************************/
|
||||
struct bl2_to_bl31_params_mem {
|
||||
struct bl31_params bl31_params;
|
||||
struct atf_image_info bl31_image_info;
|
||||
struct atf_image_info bl32_image_info;
|
||||
struct atf_image_info bl33_image_info;
|
||||
struct entry_point_info bl33_ep_info;
|
||||
struct entry_point_info bl32_ep_info;
|
||||
struct entry_point_info bl31_ep_info;
|
||||
};
|
||||
|
||||
#endif /*__ASSEMBLY__*/
|
||||
|
||||
#endif /* __BL_COMMON_H__ */
|
||||
225
include/atmel_hlcdc.h
Normal file
225
include/atmel_hlcdc.h
Normal file
@@ -0,0 +1,225 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Header file for AT91/AT32 MULTI LAYER LCD Controller
|
||||
*
|
||||
* Data structure and register user interface
|
||||
*
|
||||
* Copyright (C) 2012 Atmel Corporation
|
||||
*/
|
||||
#ifndef __ATMEL_HLCDC_H__
|
||||
#define __ATMEL_HLCDC_H__
|
||||
|
||||
/* Atmel multi layer lcdc hardware registers */
|
||||
struct atmel_hlcd_regs {
|
||||
u32 lcdc_lcdcfg0;
|
||||
u32 lcdc_lcdcfg1;
|
||||
u32 lcdc_lcdcfg2;
|
||||
u32 lcdc_lcdcfg3;
|
||||
u32 lcdc_lcdcfg4;
|
||||
u32 lcdc_lcdcfg5;
|
||||
u32 lcdc_lcdcfg6;
|
||||
u32 res1;
|
||||
u32 lcdc_lcden;
|
||||
u32 lcdc_lcddis;
|
||||
u32 lcdc_lcdsr;
|
||||
u32 res2;
|
||||
u32 lcdc_lcdidr;
|
||||
u32 res3[3];
|
||||
u32 lcdc_basecher;
|
||||
u32 res4[3];
|
||||
u32 lcdc_baseidr;
|
||||
u32 res5[3];
|
||||
u32 lcdc_baseaddr;
|
||||
u32 lcdc_basectrl;
|
||||
u32 lcdc_basenext;
|
||||
u32 lcdc_basecfg0;
|
||||
u32 lcdc_basecfg1;
|
||||
u32 lcdc_basecfg2;
|
||||
u32 lcdc_basecfg3;
|
||||
u32 lcdc_basecfg4;
|
||||
};
|
||||
|
||||
#define LCDC_LCDCFG0_CLKPOL (0x1 << 0)
|
||||
#define LCDC_LCDCFG0_CLKSEL (0x1 << 2)
|
||||
#define LCDC_LCDCFG0_CLKPWMSEL (0x1 << 3)
|
||||
#define LCDC_LCDCFG0_CGDISBASE (0x1 << 8)
|
||||
#define LCDC_LCDCFG0_CGDISOVR1 (0x1 << 9)
|
||||
#define LCDC_LCDCFG0_CGDISHEO (0x1 << 11)
|
||||
#define LCDC_LCDCFG0_CGDISHCR (0x1 << 12)
|
||||
#define LCDC_LCDCFG0_CLKDIV_Pos 16
|
||||
#define LCDC_LCDCFG0_CLKDIV_Msk (0xff << LCDC_LCDCFG0_CLKDIV_Pos)
|
||||
#define LCDC_LCDCFG0_CLKDIV(value) \
|
||||
((LCDC_LCDCFG0_CLKDIV_Msk & ((value) << LCDC_LCDCFG0_CLKDIV_Pos)))
|
||||
|
||||
#define LCDC_LCDCFG1_HSPW_Pos 0
|
||||
#define LCDC_LCDCFG1_HSPW_Msk (0x3f << LCDC_LCDCFG1_HSPW_Pos)
|
||||
#define LCDC_LCDCFG1_HSPW(value) \
|
||||
((LCDC_LCDCFG1_HSPW_Msk & ((value) << LCDC_LCDCFG1_HSPW_Pos)))
|
||||
#define LCDC_LCDCFG1_VSPW_Pos 16
|
||||
#define LCDC_LCDCFG1_VSPW_Msk (0x3f << LCDC_LCDCFG1_VSPW_Pos)
|
||||
#define LCDC_LCDCFG1_VSPW(value) \
|
||||
((LCDC_LCDCFG1_VSPW_Msk & ((value) << LCDC_LCDCFG1_VSPW_Pos)))
|
||||
|
||||
#define LCDC_LCDCFG2_VFPW_Pos 0
|
||||
#define LCDC_LCDCFG2_VFPW_Msk (0x3f << LCDC_LCDCFG2_VFPW_Pos)
|
||||
#define LCDC_LCDCFG2_VFPW(value) \
|
||||
((LCDC_LCDCFG2_VFPW_Msk & ((value) << LCDC_LCDCFG2_VFPW_Pos)))
|
||||
#define LCDC_LCDCFG2_VBPW_Pos 16
|
||||
#define LCDC_LCDCFG2_VBPW_Msk (0x3f << LCDC_LCDCFG2_VBPW_Pos)
|
||||
#define LCDC_LCDCFG2_VBPW(value) \
|
||||
((LCDC_LCDCFG2_VBPW_Msk & ((value) << LCDC_LCDCFG2_VBPW_Pos)))
|
||||
|
||||
#define LCDC_LCDCFG3_HFPW_Pos 0
|
||||
#define LCDC_LCDCFG3_HFPW_Msk (0xff << LCDC_LCDCFG3_HFPW_Pos)
|
||||
#define LCDC_LCDCFG3_HFPW(value) \
|
||||
((LCDC_LCDCFG3_HFPW_Msk & ((value) << LCDC_LCDCFG3_HFPW_Pos)))
|
||||
#define LCDC_LCDCFG3_HBPW_Pos 16
|
||||
#define LCDC_LCDCFG3_HBPW_Msk (0xff << LCDC_LCDCFG3_HBPW_Pos)
|
||||
#define LCDC_LCDCFG3_HBPW(value) \
|
||||
((LCDC_LCDCFG3_HBPW_Msk & ((value) << LCDC_LCDCFG3_HBPW_Pos)))
|
||||
|
||||
#define LCDC_LCDCFG4_PPL_Pos 0
|
||||
#define LCDC_LCDCFG4_PPL_Msk (0x7ff << LCDC_LCDCFG4_PPL_Pos)
|
||||
#define LCDC_LCDCFG4_PPL(value) \
|
||||
((LCDC_LCDCFG4_PPL_Msk & ((value) << LCDC_LCDCFG4_PPL_Pos)))
|
||||
#define LCDC_LCDCFG4_RPF_Pos 16
|
||||
#define LCDC_LCDCFG4_RPF_Msk (0x7ff << LCDC_LCDCFG4_RPF_Pos)
|
||||
#define LCDC_LCDCFG4_RPF(value) \
|
||||
((LCDC_LCDCFG4_RPF_Msk & ((value) << LCDC_LCDCFG4_RPF_Pos)))
|
||||
|
||||
#define LCDC_LCDCFG5_HSPOL (0x1 << 0)
|
||||
#define LCDC_LCDCFG5_VSPOL (0x1 << 1)
|
||||
#define LCDC_LCDCFG5_VSPDLYS (0x1 << 2)
|
||||
#define LCDC_LCDCFG5_VSPDLYE (0x1 << 3)
|
||||
#define LCDC_LCDCFG5_DISPPOL (0x1 << 4)
|
||||
#define LCDC_LCDCFG5_SERIAL (0x1 << 5)
|
||||
#define LCDC_LCDCFG5_DITHER (0x1 << 6)
|
||||
#define LCDC_LCDCFG5_DISPDLY (0x1 << 7)
|
||||
#define LCDC_LCDCFG5_MODE_Pos 8
|
||||
#define LCDC_LCDCFG5_MODE_Msk (0x3 << LCDC_LCDCFG5_MODE_Pos)
|
||||
#define LCDC_LCDCFG5_MODE_OUTPUT_12BPP (0x0 << 8)
|
||||
#define LCDC_LCDCFG5_MODE_OUTPUT_16BPP (0x1 << 8)
|
||||
#define LCDC_LCDCFG5_MODE_OUTPUT_18BPP (0x2 << 8)
|
||||
#define LCDC_LCDCFG5_MODE_OUTPUT_24BPP (0x3 << 8)
|
||||
#define LCDC_LCDCFG5_VSPSU (0x1 << 12)
|
||||
#define LCDC_LCDCFG5_VSPHO (0x1 << 13)
|
||||
#define LCDC_LCDCFG5_GUARDTIME_Pos 16
|
||||
#define LCDC_LCDCFG5_GUARDTIME_Msk (0x1f << LCDC_LCDCFG5_GUARDTIME_Pos)
|
||||
#define LCDC_LCDCFG5_GUARDTIME(value) \
|
||||
((LCDC_LCDCFG5_GUARDTIME_Msk & ((value) << LCDC_LCDCFG5_GUARDTIME_Pos)))
|
||||
|
||||
#define LCDC_LCDCFG6_PWMPS_Pos 0
|
||||
#define LCDC_LCDCFG6_PWMPS_Msk (0x7 << LCDC_LCDCFG6_PWMPS_Pos)
|
||||
#define LCDC_LCDCFG6_PWMPS(value) \
|
||||
((LCDC_LCDCFG6_PWMPS_Msk & ((value) << LCDC_LCDCFG6_PWMPS_Pos)))
|
||||
#define LCDC_LCDCFG6_PWMPOL (0x1 << 4)
|
||||
#define LCDC_LCDCFG6_PWMCVAL_Pos 8
|
||||
#define LCDC_LCDCFG6_PWMCVAL_Msk (0xff << LCDC_LCDCFG6_PWMCVAL_Pos)
|
||||
#define LCDC_LCDCFG6_PWMCVAL(value) \
|
||||
((LCDC_LCDCFG6_PWMCVAL_Msk & ((value) << LCDC_LCDCFG6_PWMCVAL_Pos)))
|
||||
|
||||
#define LCDC_LCDEN_CLKEN (0x1 << 0)
|
||||
#define LCDC_LCDEN_SYNCEN (0x1 << 1)
|
||||
#define LCDC_LCDEN_DISPEN (0x1 << 2)
|
||||
#define LCDC_LCDEN_PWMEN (0x1 << 3)
|
||||
|
||||
#define LCDC_LCDDIS_CLKDIS (0x1 << 0)
|
||||
#define LCDC_LCDDIS_SYNCDIS (0x1 << 1)
|
||||
#define LCDC_LCDDIS_DISPDIS (0x1 << 2)
|
||||
#define LCDC_LCDDIS_PWMDIS (0x1 << 3)
|
||||
#define LCDC_LCDDIS_CLKRST (0x1 << 8)
|
||||
#define LCDC_LCDDIS_SYNCRST (0x1 << 9)
|
||||
#define LCDC_LCDDIS_DISPRST (0x1 << 10)
|
||||
#define LCDC_LCDDIS_PWMRST (0x1 << 11)
|
||||
|
||||
#define LCDC_LCDSR_CLKSTS (0x1 << 0)
|
||||
#define LCDC_LCDSR_LCDSTS (0x1 << 1)
|
||||
#define LCDC_LCDSR_DISPSTS (0x1 << 2)
|
||||
#define LCDC_LCDSR_PWMSTS (0x1 << 3)
|
||||
#define LCDC_LCDSR_SIPSTS (0x1 << 4)
|
||||
|
||||
#define LCDC_LCDIDR_SOFID (0x1 << 0)
|
||||
#define LCDC_LCDIDR_DISID (0x1 << 1)
|
||||
#define LCDC_LCDIDR_DISPID (0x1 << 2)
|
||||
#define LCDC_LCDIDR_FIFOERRID (0x1 << 4)
|
||||
#define LCDC_LCDIDR_BASEID (0x1 << 8)
|
||||
#define LCDC_LCDIDR_OVR1ID (0x1 << 9)
|
||||
#define LCDC_LCDIDR_HEOID (0x1 << 11)
|
||||
#define LCDC_LCDIDR_HCRID (0x1 << 12)
|
||||
|
||||
#define LCDC_BASECHER_CHEN (0x1 << 0)
|
||||
#define LCDC_BASECHER_UPDATEEN (0x1 << 1)
|
||||
#define LCDC_BASECHER_A2QEN (0x1 << 2)
|
||||
|
||||
#define LCDC_BASEIDR_DMA (0x1 << 2)
|
||||
#define LCDC_BASEIDR_DSCR (0x1 << 3)
|
||||
#define LCDC_BASEIDR_ADD (0x1 << 4)
|
||||
#define LCDC_BASEIDR_DONE (0x1 << 5)
|
||||
#define LCDC_BASEIDR_OVR (0x1 << 6)
|
||||
|
||||
#define LCDC_BASECTRL_DFETCH (0x1 << 0)
|
||||
#define LCDC_BASECTRL_LFETCH (0x1 << 1)
|
||||
#define LCDC_BASECTRL_DMAIEN (0x1 << 2)
|
||||
#define LCDC_BASECTRL_DSCRIEN (0x1 << 3)
|
||||
#define LCDC_BASECTRL_ADDIEN (0x1 << 4)
|
||||
#define LCDC_BASECTRL_DONEIEN (0x1 << 5)
|
||||
|
||||
#define LCDC_BASECFG0_BLEN_Pos 4
|
||||
#define LCDC_BASECFG0_BLEN_AHB_SINGLE (0x0 << 4)
|
||||
#define LCDC_BASECFG0_BLEN_AHB_INCR4 (0x1 << 4)
|
||||
#define LCDC_BASECFG0_BLEN_AHB_INCR8 (0x2 << 4)
|
||||
#define LCDC_BASECFG0_BLEN_AHB_INCR16 (0x3 << 4)
|
||||
#define LCDC_BASECFG0_DLBO (0x1 << 8)
|
||||
|
||||
#define LCDC_BASECFG1_RGBMODE_12BPP_RGB_444 (0x0 << 4)
|
||||
#define LCDC_BASECFG1_RGBMODE_16BPP_ARGB_4444 (0x1 << 4)
|
||||
#define LCDC_BASECFG1_RGBMODE_16BPP_RGBA_4444 (0x2 << 4)
|
||||
#define LCDC_BASECFG1_RGBMODE_16BPP_RGB_565 (0x3 << 4)
|
||||
#define LCDC_BASECFG1_RGBMODE_16BPP_TRGB_1555 (0x4 << 4)
|
||||
#define LCDC_BASECFG1_RGBMODE_18BPP_RGB_666 (0x5 << 4)
|
||||
#define LCDC_BASECFG1_RGBMODE_18BPP_RGB_666_PACKED (0x6 << 4)
|
||||
#define LCDC_BASECFG1_RGBMODE_19BPP_TRGB_1666 (0x7 << 4)
|
||||
#define LCDC_BASECFG1_RGBMODE_19BPP_TRGB_PACKED (0x8 << 4)
|
||||
#define LCDC_BASECFG1_RGBMODE_24BPP_RGB_888 (0x9 << 4)
|
||||
#define LCDC_BASECFG1_RGBMODE_24BPP_RGB_888_PACKED (0xA << 4)
|
||||
#define LCDC_BASECFG1_RGBMODE_25BPP_TRGB_1888 (0xB << 4)
|
||||
#define LCDC_BASECFG1_RGBMODE_32BPP_ARGB_8888 (0xC << 4)
|
||||
#define LCDC_BASECFG1_RGBMODE_32BPP_RGBA_8888 (0xD << 4)
|
||||
|
||||
#define LCDC_BASECFG2_XSTRIDE_Pos 0
|
||||
#define LCDC_BASECFG2_XSTRIDE_Msk (0xffffffff << LCDC_BASECFG2_XSTRIDE_Pos)
|
||||
#define LCDC_BASECFG2_XSTRIDE(value) \
|
||||
((LCDC_BASECFG2_XSTRIDE_Msk & ((value) << LCDC_BASECFG2_XSTRIDE_Pos)))
|
||||
|
||||
#define LCDC_BASECFG3_BDEF_Pos 0
|
||||
#define LCDC_BASECFG3_BDEF_Msk (0xff << LCDC_BASECFG3_BDEF_Pos)
|
||||
#define LCDC_BASECFG3_BDEF(value) \
|
||||
((LCDC_BASECFG3_BDEF_Msk & ((value) << LCDC_BASECFG3_BDEF_Pos)))
|
||||
#define LCDC_BASECFG3_GDEF_Pos 8
|
||||
#define LCDC_BASECFG3_GDEF_Msk (0xff << LCDC_BASECFG3_GDEF_Pos)
|
||||
#define LCDC_BASECFG3_GDEF(value) \
|
||||
((LCDC_BASECFG3_GDEF_Msk & ((value) << LCDC_BASECFG3_GDEF_Pos)))
|
||||
#define LCDC_BASECFG3_RDEF_Pos 16
|
||||
#define LCDC_BASECFG3_RDEF_Msk (0xff << LCDC_BASECFG3_RDEF_Pos)
|
||||
#define LCDC_BASECFG3_RDEF(value) \
|
||||
((LCDC_BASECFG3_RDEF_Msk & ((value) << LCDC_BASECFG3_RDEF_Pos)))
|
||||
|
||||
#define LCDC_BASECLUT_BCLUT_Pos 0
|
||||
#define LCDC_BASECLUT_BCLUT_Msk (0xff << LCDC_BASECLUT_BCLUT_Pos)
|
||||
#define LCDC_BASECLUT_GCLUT_Pos 8
|
||||
#define LCDC_BASECLUT_GCLUT_Msk (0xff << LCDC_BASECLUT_GCLUT_Pos)
|
||||
#define LCDC_BASECLUT_RCLUT_Pos 16
|
||||
#define LCDC_BASECLUT_RCLUT_Msk (0xff << LCDC_BASECLUT_RCLUT_Pos)
|
||||
|
||||
#define LCDC_BASECFG4_DMA (0x1 << 8)
|
||||
#define LCDC_BASECFG4_REP (0x1 << 9)
|
||||
|
||||
struct lcd_dma_desc {
|
||||
u32 address;
|
||||
u32 control;
|
||||
u32 next;
|
||||
};
|
||||
|
||||
#define ATMEL_LCDC_LUT(n) (0x0400 + ((n)*4))
|
||||
|
||||
#endif /* __ATMEL_HLCDC_H__ */
|
||||
56
include/atmel_lcd.h
Normal file
56
include/atmel_lcd.h
Normal file
@@ -0,0 +1,56 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* atmel_lcd.h - Atmel LCD Controller structures
|
||||
*
|
||||
* (C) Copyright 2001
|
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
*/
|
||||
|
||||
#ifndef _ATMEL_LCD_H_
|
||||
#define _ATMEL_LCD_H_
|
||||
|
||||
/**
|
||||
* struct atmel_lcd_platdata - platform data for Atmel LCDs with driver model
|
||||
*
|
||||
* @timing_index: Index of LCD timing to use in device tree node
|
||||
*/
|
||||
struct atmel_lcd_platdata {
|
||||
int timing_index;
|
||||
};
|
||||
|
||||
typedef struct vidinfo {
|
||||
ushort vl_col; /* Number of columns (i.e. 640) */
|
||||
ushort vl_row; /* Number of rows (i.e. 480) */
|
||||
ushort vl_rot; /* Rotation of Display (0, 1, 2, 3) */
|
||||
u_long vl_clk; /* pixel clock in ps */
|
||||
|
||||
/* LCD configuration register */
|
||||
u_long vl_sync; /* Horizontal / vertical sync */
|
||||
u_long vl_bpix; /* Bits per pixel, 0 = 1, 1 = 2, 2 = 4, 3 = 8, 4 = 16 */
|
||||
u_long vl_tft; /* 0 = passive, 1 = TFT */
|
||||
u_long vl_cont_pol_low; /* contrast polarity is low */
|
||||
u_long vl_clk_pol; /* clock polarity */
|
||||
|
||||
/* Horizontal control register. */
|
||||
u_long vl_hsync_len; /* Length of horizontal sync */
|
||||
u_long vl_left_margin; /* Time from sync to picture */
|
||||
u_long vl_right_margin; /* Time from picture to sync */
|
||||
|
||||
/* Vertical control register. */
|
||||
u_long vl_vsync_len; /* Length of vertical sync */
|
||||
u_long vl_upper_margin; /* Time from sync to picture */
|
||||
u_long vl_lower_margin; /* Time from picture to sync */
|
||||
|
||||
u_long mmio; /* Memory mapped registers */
|
||||
|
||||
u_int logo_width;
|
||||
u_int logo_height;
|
||||
int logo_x_offset;
|
||||
int logo_y_offset;
|
||||
u_long logo_addr;
|
||||
} vidinfo_t;
|
||||
|
||||
void atmel_logo_info(vidinfo_t *info);
|
||||
void microchip_logo_info(vidinfo_t *info);
|
||||
|
||||
#endif
|
||||
164
include/atmel_lcdc.h
Normal file
164
include/atmel_lcdc.h
Normal file
@@ -0,0 +1,164 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Header file for AT91/AT32 LCD Controller
|
||||
*
|
||||
* Data structure and register user interface
|
||||
*
|
||||
* Copyright (C) 2007 Atmel Corporation
|
||||
*/
|
||||
#ifndef __ATMEL_LCDC_H__
|
||||
#define __ATMEL_LCDC_H__
|
||||
|
||||
#define ATMEL_LCDC_DMABADDR1 0x00
|
||||
#define ATMEL_LCDC_DMABADDR2 0x04
|
||||
#define ATMEL_LCDC_DMAFRMPT1 0x08
|
||||
#define ATMEL_LCDC_DMAFRMPT2 0x0c
|
||||
#define ATMEL_LCDC_DMAFRMADD1 0x10
|
||||
#define ATMEL_LCDC_DMAFRMADD2 0x14
|
||||
|
||||
#define ATMEL_LCDC_DMAFRMCFG 0x18
|
||||
#define ATMEL_LCDC_FRSIZE (0x7fffff << 0)
|
||||
#define ATMEL_LCDC_BLENGTH_OFFSET 24
|
||||
#define ATMEL_LCDC_BLENGTH (0x7f << ATMEL_LCDC_BLENGTH_OFFSET)
|
||||
|
||||
#define ATMEL_LCDC_DMACON 0x1c
|
||||
#define ATMEL_LCDC_DMAEN (0x1 << 0)
|
||||
#define ATMEL_LCDC_DMARST (0x1 << 1)
|
||||
#define ATMEL_LCDC_DMABUSY (0x1 << 2)
|
||||
#define ATMEL_LCDC_DMAUPDT (0x1 << 3)
|
||||
#define ATMEL_LCDC_DMA2DEN (0x1 << 4)
|
||||
|
||||
#define ATMEL_LCDC_DMA2DCFG 0x20
|
||||
#define ATMEL_LCDC_ADDRINC_OFFSET 0
|
||||
#define ATMEL_LCDC_ADDRINC (0xffff)
|
||||
#define ATMEL_LCDC_PIXELOFF_OFFSET 24
|
||||
#define ATMEL_LCDC_PIXELOFF (0x1f << 24)
|
||||
|
||||
#define ATMEL_LCDC_LCDCON1 0x0800
|
||||
#define ATMEL_LCDC_BYPASS (1 << 0)
|
||||
#define ATMEL_LCDC_CLKVAL_OFFSET 12
|
||||
#define ATMEL_LCDC_CLKVAL (0x1ff << ATMEL_LCDC_CLKVAL_OFFSET)
|
||||
#define ATMEL_LCDC_LINCNT (0x7ff << 21)
|
||||
|
||||
#define ATMEL_LCDC_LCDCON2 0x0804
|
||||
#define ATMEL_LCDC_DISTYPE (3 << 0)
|
||||
#define ATMEL_LCDC_DISTYPE_STNMONO (0 << 0)
|
||||
#define ATMEL_LCDC_DISTYPE_STNCOLOR (1 << 0)
|
||||
#define ATMEL_LCDC_DISTYPE_TFT (2 << 0)
|
||||
#define ATMEL_LCDC_SCANMOD (1 << 2)
|
||||
#define ATMEL_LCDC_SCANMOD_SINGLE (0 << 2)
|
||||
#define ATMEL_LCDC_SCANMOD_DUAL (1 << 2)
|
||||
#define ATMEL_LCDC_IFWIDTH (3 << 3)
|
||||
#define ATMEL_LCDC_IFWIDTH_4 (0 << 3)
|
||||
#define ATMEL_LCDC_IFWIDTH_8 (1 << 3)
|
||||
#define ATMEL_LCDC_IFWIDTH_16 (2 << 3)
|
||||
#define ATMEL_LCDC_PIXELSIZE (7 << 5)
|
||||
#define ATMEL_LCDC_PIXELSIZE_1 (0 << 5)
|
||||
#define ATMEL_LCDC_PIXELSIZE_2 (1 << 5)
|
||||
#define ATMEL_LCDC_PIXELSIZE_4 (2 << 5)
|
||||
#define ATMEL_LCDC_PIXELSIZE_8 (3 << 5)
|
||||
#define ATMEL_LCDC_PIXELSIZE_16 (4 << 5)
|
||||
#define ATMEL_LCDC_PIXELSIZE_24 (5 << 5)
|
||||
#define ATMEL_LCDC_PIXELSIZE_32 (6 << 5)
|
||||
#define ATMEL_LCDC_INVVD (1 << 8)
|
||||
#define ATMEL_LCDC_INVVD_NORMAL (0 << 8)
|
||||
#define ATMEL_LCDC_INVVD_INVERTED (1 << 8)
|
||||
#define ATMEL_LCDC_INVFRAME (1 << 9 )
|
||||
#define ATMEL_LCDC_INVFRAME_NORMAL (0 << 9)
|
||||
#define ATMEL_LCDC_INVFRAME_INVERTED (1 << 9)
|
||||
#define ATMEL_LCDC_INVLINE (1 << 10)
|
||||
#define ATMEL_LCDC_INVLINE_NORMAL (0 << 10)
|
||||
#define ATMEL_LCDC_INVLINE_INVERTED (1 << 10)
|
||||
#define ATMEL_LCDC_INVCLK (1 << 11)
|
||||
#define ATMEL_LCDC_INVCLK_NORMAL (0 << 11)
|
||||
#define ATMEL_LCDC_INVCLK_INVERTED (1 << 11)
|
||||
#define ATMEL_LCDC_INVDVAL (1 << 12)
|
||||
#define ATMEL_LCDC_INVDVAL_NORMAL (0 << 12)
|
||||
#define ATMEL_LCDC_INVDVAL_INVERTED (1 << 12)
|
||||
#define ATMEL_LCDC_CLKMOD (1 << 15)
|
||||
#define ATMEL_LCDC_CLKMOD_ACTIVEDISPLAY (0 << 15)
|
||||
#define ATMEL_LCDC_CLKMOD_ALWAYSACTIVE (1 << 15)
|
||||
#define ATMEL_LCDC_MEMOR (1 << 31)
|
||||
#define ATMEL_LCDC_MEMOR_BIG (0 << 31)
|
||||
#define ATMEL_LCDC_MEMOR_LITTLE (1 << 31)
|
||||
|
||||
#define ATMEL_LCDC_TIM1 0x0808
|
||||
#define ATMEL_LCDC_VFP (0xffU << 0)
|
||||
#define ATMEL_LCDC_VBP_OFFSET 8
|
||||
#define ATMEL_LCDC_VBP (0xffU << ATMEL_LCDC_VBP_OFFSET)
|
||||
#define ATMEL_LCDC_VPW_OFFSET 16
|
||||
#define ATMEL_LCDC_VPW (0x3fU << ATMEL_LCDC_VPW_OFFSET)
|
||||
#define ATMEL_LCDC_VHDLY_OFFSET 24
|
||||
#define ATMEL_LCDC_VHDLY (0xfU << ATMEL_LCDC_VHDLY_OFFSET)
|
||||
|
||||
#define ATMEL_LCDC_TIM2 0x080c
|
||||
#define ATMEL_LCDC_HBP (0xffU << 0)
|
||||
#define ATMEL_LCDC_HPW_OFFSET 8
|
||||
#define ATMEL_LCDC_HPW (0x3fU << ATMEL_LCDC_HPW_OFFSET)
|
||||
#define ATMEL_LCDC_HFP_OFFSET 21
|
||||
#define ATMEL_LCDC_HFP (0x7ffU << ATMEL_LCDC_HFP_OFFSET)
|
||||
|
||||
#define ATMEL_LCDC_LCDFRMCFG 0x0810
|
||||
#define ATMEL_LCDC_LINEVAL (0x7ff << 0)
|
||||
#define ATMEL_LCDC_HOZVAL_OFFSET 21
|
||||
#define ATMEL_LCDC_HOZVAL (0x7ff << ATMEL_LCDC_HOZVAL_OFFSET)
|
||||
|
||||
#define ATMEL_LCDC_FIFO 0x0814
|
||||
#define ATMEL_LCDC_FIFOTH (0xffff)
|
||||
|
||||
#define ATMEL_LCDC_MVAL 0x0818
|
||||
|
||||
#define ATMEL_LCDC_DP1_2 0x081c
|
||||
#define ATMEL_LCDC_DP4_7 0x0820
|
||||
#define ATMEL_LCDC_DP3_5 0x0824
|
||||
#define ATMEL_LCDC_DP2_3 0x0828
|
||||
#define ATMEL_LCDC_DP5_7 0x082c
|
||||
#define ATMEL_LCDC_DP3_4 0x0830
|
||||
#define ATMEL_LCDC_DP4_5 0x0834
|
||||
#define ATMEL_LCDC_DP6_7 0x0838
|
||||
#define ATMEL_LCDC_DP1_2_VAL (0xff)
|
||||
#define ATMEL_LCDC_DP4_7_VAL (0xfffffff)
|
||||
#define ATMEL_LCDC_DP3_5_VAL (0xfffff)
|
||||
#define ATMEL_LCDC_DP2_3_VAL (0xfff)
|
||||
#define ATMEL_LCDC_DP5_7_VAL (0xfffffff)
|
||||
#define ATMEL_LCDC_DP3_4_VAL (0xffff)
|
||||
#define ATMEL_LCDC_DP4_5_VAL (0xfffff)
|
||||
#define ATMEL_LCDC_DP6_7_VAL (0xfffffff)
|
||||
|
||||
#define ATMEL_LCDC_PWRCON 0x083c
|
||||
#define ATMEL_LCDC_PWR (1 << 0)
|
||||
#define ATMEL_LCDC_GUARDT_OFFSET 1
|
||||
#define ATMEL_LCDC_GUARDT (0x7f << ATMEL_LCDC_GUARDT_OFFSET)
|
||||
#define ATMEL_LCDC_BUSY (1 << 31)
|
||||
|
||||
#define ATMEL_LCDC_CONTRAST_CTR 0x0840
|
||||
#define ATMEL_LCDC_PS (3 << 0)
|
||||
#define ATMEL_LCDC_PS_DIV1 (0 << 0)
|
||||
#define ATMEL_LCDC_PS_DIV2 (1 << 0)
|
||||
#define ATMEL_LCDC_PS_DIV4 (2 << 0)
|
||||
#define ATMEL_LCDC_PS_DIV8 (3 << 0)
|
||||
#define ATMEL_LCDC_POL (1 << 2)
|
||||
#define ATMEL_LCDC_POL_NEGATIVE (0 << 2)
|
||||
#define ATMEL_LCDC_POL_POSITIVE (1 << 2)
|
||||
#define ATMEL_LCDC_ENA (1 << 3)
|
||||
#define ATMEL_LCDC_ENA_PWMDISABLE (0 << 3)
|
||||
#define ATMEL_LCDC_ENA_PWMENABLE (1 << 3)
|
||||
|
||||
#define ATMEL_LCDC_CONTRAST_VAL 0x0844
|
||||
#define ATMEL_LCDC_CVAL (0xff)
|
||||
|
||||
#define ATMEL_LCDC_IER 0x0848
|
||||
#define ATMEL_LCDC_IDR 0x084c
|
||||
#define ATMEL_LCDC_IMR 0x0850
|
||||
#define ATMEL_LCDC_ISR 0x0854
|
||||
#define ATMEL_LCDC_ICR 0x0858
|
||||
#define ATMEL_LCDC_LNI (1 << 0)
|
||||
#define ATMEL_LCDC_LSTLNI (1 << 1)
|
||||
#define ATMEL_LCDC_EOFI (1 << 2)
|
||||
#define ATMEL_LCDC_UFLWI (1 << 4)
|
||||
#define ATMEL_LCDC_OWRI (1 << 5)
|
||||
#define ATMEL_LCDC_MERI (1 << 6)
|
||||
|
||||
#define ATMEL_LCDC_LUT(n) (0x0c00 + ((n)*4))
|
||||
|
||||
#endif /* __ATMEL_LCDC_H__ */
|
||||
217
include/atmel_mci.h
Normal file
217
include/atmel_mci.h
Normal file
@@ -0,0 +1,217 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2005-2006 Atmel Corporation
|
||||
*/
|
||||
#ifndef __ATMEL_MCI_H__
|
||||
#define __ATMEL_MCI_H__
|
||||
|
||||
int atmel_mci_init(void *regs);
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/*
|
||||
* Structure for struct SoC access.
|
||||
* Names starting with '_' are fillers.
|
||||
*/
|
||||
typedef struct atmel_mci {
|
||||
/* reg Offset */
|
||||
u32 cr; /* 0x00 */
|
||||
u32 mr; /* 0x04 */
|
||||
u32 dtor; /* 0x08 */
|
||||
u32 sdcr; /* 0x0c */
|
||||
u32 argr; /* 0x10 */
|
||||
u32 cmdr; /* 0x14 */
|
||||
u32 blkr; /* 0x18 */
|
||||
u32 _1c; /* 0x1c */
|
||||
u32 rspr; /* 0x20 */
|
||||
u32 rspr1; /* 0x24 */
|
||||
u32 rspr2; /* 0x28 */
|
||||
u32 rspr3; /* 0x2c */
|
||||
u32 rdr; /* 0x30 */
|
||||
u32 tdr; /* 0x34 */
|
||||
u32 _38; /* 0x38 */
|
||||
u32 _3c; /* 0x3c */
|
||||
u32 sr; /* 0x40 */
|
||||
u32 ier; /* 0x44 */
|
||||
u32 idr; /* 0x48 */
|
||||
u32 imr; /* 0x4c */
|
||||
u32 dma; /* 0x50 */
|
||||
u32 cfg; /* 0x54 */
|
||||
u32 reserved[41];
|
||||
u32 version;
|
||||
} atmel_mci_t;
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
/* Bitfields in CR */
|
||||
#define MMCI_MCIEN_OFFSET 0
|
||||
#define MMCI_MCIEN_SIZE 1
|
||||
#define MMCI_MCIDIS_OFFSET 1
|
||||
#define MMCI_MCIDIS_SIZE 1
|
||||
#define MMCI_PWSEN_OFFSET 2
|
||||
#define MMCI_PWSEN_SIZE 1
|
||||
#define MMCI_PWSDIS_OFFSET 3
|
||||
#define MMCI_PWSDIS_SIZE 1
|
||||
#define MMCI_SWRST_OFFSET 7
|
||||
#define MMCI_SWRST_SIZE 1
|
||||
|
||||
/* Bitfields in MR */
|
||||
#define MMCI_CLKDIV_OFFSET 0
|
||||
#define MMCI_CLKDIV_SIZE 8
|
||||
#define MMCI_PWSDIV_OFFSET 8
|
||||
#define MMCI_PWSDIV_SIZE 3
|
||||
#define MMCI_RDPROOF_OFFSET 11
|
||||
#define MMCI_RDPROOF_SIZE 1
|
||||
#define MMCI_WRPROOF_OFFSET 12
|
||||
#define MMCI_WRPROOF_SIZE 1
|
||||
#define MMCI_PDCPADV_OFFSET 14
|
||||
#define MMCI_PDCPADV_SIZE 1
|
||||
#define MMCI_PDCMODE_OFFSET 15
|
||||
#define MMCI_PDCMODE_SIZE 1
|
||||
/* MCI IP version >= 0x500, MR bit 16 used for CLKODD */
|
||||
#define MMCI_CLKODD_OFFSET 16
|
||||
#define MMCI_CLKODD_SIZE 1
|
||||
/* MCI IP version < 0x200, MR higher 16bits for BLKLEN */
|
||||
#define MMCI_BLKLEN_OFFSET 16
|
||||
#define MMCI_BLKLEN_SIZE 16
|
||||
|
||||
/* Bitfields in DTOR */
|
||||
#define MMCI_DTOCYC_OFFSET 0
|
||||
#define MMCI_DTOCYC_SIZE 4
|
||||
#define MMCI_DTOMUL_OFFSET 4
|
||||
#define MMCI_DTOMUL_SIZE 3
|
||||
|
||||
/* Bitfields in SDCR */
|
||||
#define MMCI_SCDSEL_OFFSET 0
|
||||
#define MMCI_SCDSEL_SIZE 4
|
||||
#define MMCI_SCDBUS_OFFSET 7
|
||||
#define MMCI_SCDBUS_SIZE 1
|
||||
|
||||
/* Bitfields in ARGR */
|
||||
#define MMCI_ARG_OFFSET 0
|
||||
#define MMCI_ARG_SIZE 32
|
||||
|
||||
/* Bitfields in CMDR */
|
||||
#define MMCI_CMDNB_OFFSET 0
|
||||
#define MMCI_CMDNB_SIZE 6
|
||||
#define MMCI_RSPTYP_OFFSET 6
|
||||
#define MMCI_RSPTYP_SIZE 2
|
||||
#define MMCI_SPCMD_OFFSET 8
|
||||
#define MMCI_SPCMD_SIZE 3
|
||||
#define MMCI_OPDCMD_OFFSET 11
|
||||
#define MMCI_OPDCMD_SIZE 1
|
||||
#define MMCI_MAXLAT_OFFSET 12
|
||||
#define MMCI_MAXLAT_SIZE 1
|
||||
#define MMCI_TRCMD_OFFSET 16
|
||||
#define MMCI_TRCMD_SIZE 2
|
||||
#define MMCI_TRDIR_OFFSET 18
|
||||
#define MMCI_TRDIR_SIZE 1
|
||||
#define MMCI_TRTYP_OFFSET 19
|
||||
#define MMCI_TRTYP_SIZE 2
|
||||
|
||||
/* Bitfields in BLKR */
|
||||
/* MMCI_BLKLEN_OFFSET/SIZE already defined in MR */
|
||||
#define MMCI_BCNT_OFFSET 0
|
||||
#define MMCI_BCNT_SIZE 16
|
||||
|
||||
/* Bitfields in RSPRx */
|
||||
#define MMCI_RSP_OFFSET 0
|
||||
#define MMCI_RSP_SIZE 32
|
||||
|
||||
/* Bitfields in SR/IER/IDR/IMR */
|
||||
#define MMCI_CMDRDY_OFFSET 0
|
||||
#define MMCI_CMDRDY_SIZE 1
|
||||
#define MMCI_RXRDY_OFFSET 1
|
||||
#define MMCI_RXRDY_SIZE 1
|
||||
#define MMCI_TXRDY_OFFSET 2
|
||||
#define MMCI_TXRDY_SIZE 1
|
||||
#define MMCI_BLKE_OFFSET 3
|
||||
#define MMCI_BLKE_SIZE 1
|
||||
#define MMCI_DTIP_OFFSET 4
|
||||
#define MMCI_DTIP_SIZE 1
|
||||
#define MMCI_NOTBUSY_OFFSET 5
|
||||
#define MMCI_NOTBUSY_SIZE 1
|
||||
#define MMCI_ENDRX_OFFSET 6
|
||||
#define MMCI_ENDRX_SIZE 1
|
||||
#define MMCI_ENDTX_OFFSET 7
|
||||
#define MMCI_ENDTX_SIZE 1
|
||||
#define MMCI_RXBUFF_OFFSET 14
|
||||
#define MMCI_RXBUFF_SIZE 1
|
||||
#define MMCI_TXBUFE_OFFSET 15
|
||||
#define MMCI_TXBUFE_SIZE 1
|
||||
#define MMCI_RINDE_OFFSET 16
|
||||
#define MMCI_RINDE_SIZE 1
|
||||
#define MMCI_RDIRE_OFFSET 17
|
||||
#define MMCI_RDIRE_SIZE 1
|
||||
#define MMCI_RCRCE_OFFSET 18
|
||||
#define MMCI_RCRCE_SIZE 1
|
||||
#define MMCI_RENDE_OFFSET 19
|
||||
#define MMCI_RENDE_SIZE 1
|
||||
#define MMCI_RTOE_OFFSET 20
|
||||
#define MMCI_RTOE_SIZE 1
|
||||
#define MMCI_DCRCE_OFFSET 21
|
||||
#define MMCI_DCRCE_SIZE 1
|
||||
#define MMCI_DTOE_OFFSET 22
|
||||
#define MMCI_DTOE_SIZE 1
|
||||
#define MMCI_OVRE_OFFSET 30
|
||||
#define MMCI_OVRE_SIZE 1
|
||||
#define MMCI_UNRE_OFFSET 31
|
||||
#define MMCI_UNRE_SIZE 1
|
||||
|
||||
/* Constants for DTOMUL */
|
||||
#define MMCI_DTOMUL_1_CYCLE 0
|
||||
#define MMCI_DTOMUL_16_CYCLES 1
|
||||
#define MMCI_DTOMUL_128_CYCLES 2
|
||||
#define MMCI_DTOMUL_256_CYCLES 3
|
||||
#define MMCI_DTOMUL_1024_CYCLES 4
|
||||
#define MMCI_DTOMUL_4096_CYCLES 5
|
||||
#define MMCI_DTOMUL_65536_CYCLES 6
|
||||
#define MMCI_DTOMUL_1048576_CYCLES 7
|
||||
|
||||
/* Constants for RSPTYP */
|
||||
#define MMCI_RSPTYP_NO_RESP 0
|
||||
#define MMCI_RSPTYP_48_BIT_RESP 1
|
||||
#define MMCI_RSPTYP_136_BIT_RESP 2
|
||||
|
||||
/* Constants for SPCMD */
|
||||
#define MMCI_SPCMD_NO_SPEC_CMD 0
|
||||
#define MMCI_SPCMD_INIT_CMD 1
|
||||
#define MMCI_SPCMD_SYNC_CMD 2
|
||||
#define MMCI_SPCMD_INT_CMD 4
|
||||
#define MMCI_SPCMD_INT_RESP 5
|
||||
|
||||
/* Constants for TRCMD */
|
||||
#define MMCI_TRCMD_NO_TRANS 0
|
||||
#define MMCI_TRCMD_START_TRANS 1
|
||||
#define MMCI_TRCMD_STOP_TRANS 2
|
||||
|
||||
/* Constants for TRTYP */
|
||||
#define MMCI_TRTYP_BLOCK 0
|
||||
#define MMCI_TRTYP_MULTI_BLOCK 1
|
||||
#define MMCI_TRTYP_STREAM 2
|
||||
|
||||
/* Bitfields in CFG */
|
||||
#define MMCI_FIFOMODE_OFFSET 0
|
||||
#define MMCI_FIFOMODE_SIZE 1
|
||||
#define MMCI_FERRCTRL_OFFSET 4
|
||||
#define MMCI_FERRCTRL_SIZE 1
|
||||
#define MMCI_HSMODE_OFFSET 8
|
||||
#define MMCI_HSMODE_SIZE 1
|
||||
#define MMCI_LSYNC_OFFSET 12
|
||||
#define MMCI_LSYNC_SIZE 1
|
||||
|
||||
/* Bit manipulation macros */
|
||||
#define MMCI_BIT(name) \
|
||||
(1 << MMCI_##name##_OFFSET)
|
||||
#define MMCI_BF(name,value) \
|
||||
(((value) & ((1 << MMCI_##name##_SIZE) - 1)) \
|
||||
<< MMCI_##name##_OFFSET)
|
||||
#define MMCI_BFEXT(name,value) \
|
||||
(((value) >> MMCI_##name##_OFFSET)\
|
||||
& ((1 << MMCI_##name##_SIZE) - 1))
|
||||
#define MMCI_BFINS(name,value,old) \
|
||||
(((old) & ~(((1 << MMCI_##name##_SIZE) - 1) \
|
||||
<< MMCI_##name##_OFFSET)) \
|
||||
| MMCI_BF(name,value))
|
||||
|
||||
#endif /* __ATMEL_MCI_H__ */
|
||||
69
include/atsha204a-i2c.h
Normal file
69
include/atsha204a-i2c.h
Normal file
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* I2C Driver for Atmel ATSHA204 over I2C
|
||||
*
|
||||
* Copyright (C) 2014 Josh Datko, Cryptotronix, jbd@cryptotronix.com
|
||||
* 2016 Tomas Hlavacek, CZ.NIC, tmshlvck@gmail.com
|
||||
* 2017 Marek Behun, CZ.NIC, marek.behun@nic.cz
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef _ATSHA204_I2C_H_
|
||||
#define _ATSHA204_I2C_H_
|
||||
|
||||
enum atsha204a_zone
|
||||
{
|
||||
ATSHA204A_ZONE_CONFIG = 0,
|
||||
ATSHA204A_ZONE_OTP = 1,
|
||||
ATSHA204A_ZONE_DATA = 2,
|
||||
};
|
||||
|
||||
enum atsha204a_status
|
||||
{
|
||||
ATSHA204A_STATUS_SUCCESS = 0x00,
|
||||
ATSHA204A_STATUS_MISCOMPARE = 0x01,
|
||||
ATSHA204A_STATUS_PARSE_ERROR = 0x03,
|
||||
ATSHA204A_STATUS_EXEC_ERROR = 0x0F,
|
||||
ATSHA204A_STATUS_AFTER_WAKE = 0x11,
|
||||
ATSHA204A_STATUS_CRC_ERROR = 0xFF,
|
||||
};
|
||||
|
||||
enum atsha204a_func
|
||||
{
|
||||
ATSHA204A_FUNC_RESET = 0x00,
|
||||
ATSHA204A_FUNC_SLEEP = 0x01,
|
||||
ATSHA204A_FUNC_IDLE = 0x02,
|
||||
ATSHA204A_FUNC_COMMAND = 0x03,
|
||||
};
|
||||
|
||||
enum atsha204a_cmd
|
||||
{
|
||||
ATSHA204A_CMD_READ = 0x02,
|
||||
ATSHA204A_CMD_RANDOM = 0x1B,
|
||||
};
|
||||
|
||||
struct atsha204a_resp
|
||||
{
|
||||
u8 length;
|
||||
u8 code;
|
||||
u8 data[82];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct atsha204a_req
|
||||
{
|
||||
u8 function;
|
||||
u8 length;
|
||||
u8 command;
|
||||
u8 param1;
|
||||
u16 param2;
|
||||
u8 data[78];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
int atsha204a_wakeup(struct udevice *);
|
||||
int atsha204a_idle(struct udevice *);
|
||||
int atsha204a_sleep(struct udevice *);
|
||||
int atsha204a_read(struct udevice *, enum atsha204a_zone, bool, u16, u8 *);
|
||||
int atsha204a_get_random(struct udevice *, u8 *, size_t);
|
||||
|
||||
#endif /* _ATSHA204_I2C_H_ */
|
||||
48
include/audio_codec.h
Normal file
48
include/audio_codec.h
Normal file
@@ -0,0 +1,48 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright 2018 Google LLC
|
||||
* Written by Simon Glass <sjg@chromium.org>
|
||||
*/
|
||||
|
||||
#ifndef __AUDIO_CODEC_H__
|
||||
#define __AUDIO_CODEC_H__
|
||||
|
||||
/*
|
||||
* An audio codec turns digital data into sound with various parameters to
|
||||
* control its operation.
|
||||
*/
|
||||
|
||||
/* Operations for sound */
|
||||
struct audio_codec_ops {
|
||||
/**
|
||||
* set_params() - Set audio codec parameters
|
||||
*
|
||||
* @dev: Sound device
|
||||
* @inteface: Interface number to use on codec
|
||||
* @rate: Sampling rate in Hz
|
||||
* @mclk_freq: Codec clock frequency in Hz
|
||||
* @bits_per_sample: Must be 16 or 24
|
||||
* @channels: Number of channels to use (1=mono, 2=stereo)
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int (*set_params)(struct udevice *dev, int interface, int rate,
|
||||
int mclk_freq, int bits_per_sample, uint channels);
|
||||
};
|
||||
|
||||
#define audio_codec_get_ops(dev) ((struct audio_codec_ops *)(dev)->driver->ops)
|
||||
|
||||
/**
|
||||
* audio_codec_set_params() - Set audio codec parameters
|
||||
*
|
||||
* @dev: Sound device
|
||||
* @inteface: Interface number to use on codec
|
||||
* @rate: Sampling rate in Hz
|
||||
* @mclk_freq: Codec clock frequency in Hz
|
||||
* @bits_per_sample: Must be 16 or 24
|
||||
* @channels: Number of channels to use (1=mono, 2=stereo)
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int audio_codec_set_params(struct udevice *dev, int interface, int rate,
|
||||
int mclk_freq, int bits_per_sample, uint channels);
|
||||
|
||||
#endif /* __AUDIO_CODEC_H__ */
|
||||
46
include/autoboot.h
Normal file
46
include/autoboot.h
Normal file
@@ -0,0 +1,46 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2000
|
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
*
|
||||
* Add to readline cmdline-editing by
|
||||
* (C) Copyright 2005
|
||||
* JinHua Luo, GuangDong Linux Center, <luo.jinhua@gd-linux.com>
|
||||
*/
|
||||
|
||||
#ifndef __AUTOBOOT_H
|
||||
#define __AUTOBOOT_H
|
||||
|
||||
#ifdef CONFIG_AUTOBOOT
|
||||
/**
|
||||
* bootdelay_process() - process the bootd delay
|
||||
*
|
||||
* Process the boot delay, boot limit, then get the value of either
|
||||
* bootcmd, failbootcmd or altbootcmd depending on the current state.
|
||||
* Return this command so it can be executed.
|
||||
*
|
||||
* @return command to executed
|
||||
*/
|
||||
const char *bootdelay_process(void);
|
||||
|
||||
/**
|
||||
* autoboot_command() - run the autoboot command
|
||||
*
|
||||
* If enabled, run the autoboot command returned from bootdelay_process().
|
||||
* Also do the CONFIG_AUTOBOOT_MENUKEY processing if enabled.
|
||||
*
|
||||
* @cmd: Command to run
|
||||
*/
|
||||
void autoboot_command(const char *cmd);
|
||||
#else
|
||||
static inline const char *bootdelay_process(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void autoboot_command(const char *s)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
101
include/avb_verify.h
Normal file
101
include/avb_verify.h
Normal file
@@ -0,0 +1,101 @@
|
||||
|
||||
/*
|
||||
* (C) Copyright 2018, Linaro Limited
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#ifndef _AVB_VERIFY_H
|
||||
#define _AVB_VERIFY_H
|
||||
|
||||
#include <../lib/libavb/libavb.h>
|
||||
#include <mapmem.h>
|
||||
#include <mmc.h>
|
||||
|
||||
#define AVB_MAX_ARGS 1024
|
||||
#define VERITY_TABLE_OPT_RESTART "restart_on_corruption"
|
||||
#define VERITY_TABLE_OPT_LOGGING "ignore_corruption"
|
||||
#define ALLOWED_BUF_ALIGN 8
|
||||
|
||||
enum avb_boot_state {
|
||||
AVB_GREEN,
|
||||
AVB_YELLOW,
|
||||
AVB_ORANGE,
|
||||
AVB_RED,
|
||||
};
|
||||
|
||||
struct AvbOpsData {
|
||||
struct AvbOps ops;
|
||||
int mmc_dev;
|
||||
enum avb_boot_state boot_state;
|
||||
#ifdef CONFIG_OPTEE_TA_AVB
|
||||
struct udevice *tee;
|
||||
u32 session;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct mmc_part {
|
||||
int dev_num;
|
||||
struct mmc *mmc;
|
||||
struct blk_desc *mmc_blk;
|
||||
disk_partition_t info;
|
||||
};
|
||||
|
||||
enum mmc_io_type {
|
||||
IO_READ,
|
||||
IO_WRITE
|
||||
};
|
||||
|
||||
AvbOps *avb_ops_alloc(int boot_device);
|
||||
void avb_ops_free(AvbOps *ops);
|
||||
|
||||
char *avb_set_state(AvbOps *ops, enum avb_boot_state boot_state);
|
||||
char *avb_set_enforce_verity(const char *cmdline);
|
||||
char *avb_set_ignore_corruption(const char *cmdline);
|
||||
|
||||
char *append_cmd_line(char *cmdline_orig, char *cmdline_new);
|
||||
|
||||
/**
|
||||
* ============================================================================
|
||||
* I/O helper inline functions
|
||||
* ============================================================================
|
||||
*/
|
||||
static inline uint64_t calc_offset(struct mmc_part *part, int64_t offset)
|
||||
{
|
||||
u64 part_size = part->info.size * part->info.blksz;
|
||||
|
||||
if (offset < 0)
|
||||
return part_size + offset;
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
static inline size_t get_sector_buf_size(void)
|
||||
{
|
||||
return (size_t)CONFIG_FASTBOOT_BUF_SIZE;
|
||||
}
|
||||
|
||||
static inline void *get_sector_buf(void)
|
||||
{
|
||||
return map_sysmem(CONFIG_FASTBOOT_BUF_ADDR, CONFIG_FASTBOOT_BUF_SIZE);
|
||||
}
|
||||
|
||||
static inline bool is_buf_unaligned(void *buffer)
|
||||
{
|
||||
return (bool)((uintptr_t)buffer % ALLOWED_BUF_ALIGN);
|
||||
}
|
||||
|
||||
static inline int get_boot_device(AvbOps *ops)
|
||||
{
|
||||
struct AvbOpsData *data;
|
||||
|
||||
if (ops) {
|
||||
data = ops->user_data;
|
||||
if (data)
|
||||
return data->mmc_dev;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
#endif /* _AVB_VERIFY_H */
|
||||
118
include/axi.h
Normal file
118
include/axi.h
Normal file
@@ -0,0 +1,118 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2017, 2018
|
||||
* Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc
|
||||
*/
|
||||
|
||||
#ifndef _AXI_H_
|
||||
#define _AXI_H_
|
||||
|
||||
/**
|
||||
* enum axi_size_t - Determine size of AXI transfer
|
||||
* @AXI_SIZE_8: AXI sransfer is 8-bit wide
|
||||
* @AXI_SIZE_16: AXI sransfer is 16-bit wide
|
||||
* @AXI_SIZE_32: AXI sransfer is 32-bit wide
|
||||
*/
|
||||
enum axi_size_t {
|
||||
AXI_SIZE_8,
|
||||
AXI_SIZE_16,
|
||||
AXI_SIZE_32,
|
||||
};
|
||||
|
||||
struct axi_ops {
|
||||
/**
|
||||
* read() - Read a single value from a specified address on a AXI bus
|
||||
* @dev: AXI bus to read from.
|
||||
* @address: The address to read from.
|
||||
* @data: Pointer to a variable that takes the data value read
|
||||
* from the address on the AXI bus.
|
||||
* @size: The size of the data to be read.
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int (*read)(struct udevice *dev, ulong address, void *data,
|
||||
enum axi_size_t size);
|
||||
|
||||
/**
|
||||
* write() - Write a single value to a specified address on a AXI bus
|
||||
* @dev: AXI bus to write to.
|
||||
* @address: The address to write to.
|
||||
* @data: Pointer to the data value to be written to the address
|
||||
* on the AXI bus.
|
||||
* @size: The size of the data to write.
|
||||
*
|
||||
* Return 0 if OK, -ve on error.
|
||||
*/
|
||||
int (*write)(struct udevice *dev, ulong address, void *data,
|
||||
enum axi_size_t size);
|
||||
};
|
||||
|
||||
#define axi_get_ops(dev) ((struct axi_ops *)(dev)->driver->ops)
|
||||
|
||||
/**
|
||||
* axi_read() - Read a single value from a specified address on a AXI bus
|
||||
* @dev: AXI bus to read from.
|
||||
* @address: The address to read from.
|
||||
* @data: Pointer to a variable that takes the data value read from the
|
||||
* address on the AXI bus.
|
||||
* @size: The size of the data to write.
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int axi_read(struct udevice *dev, ulong address, void *data,
|
||||
enum axi_size_t size);
|
||||
|
||||
/**
|
||||
* axi_write() - Write a single value to a specified address on a AXI bus
|
||||
* @dev: AXI bus to write to.
|
||||
* @address: The address to write to.
|
||||
* @data: Pointer to the data value to be written to the address on the
|
||||
* AXI bus.
|
||||
* @size: The size of the data to write.
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int axi_write(struct udevice *dev, ulong address, void *data,
|
||||
enum axi_size_t size);
|
||||
|
||||
struct axi_emul_ops {
|
||||
/**
|
||||
* read() - Read a single value from a specified address on a AXI bus
|
||||
* @dev: AXI bus to read from.
|
||||
* @address: The address to read from.
|
||||
* @data: Pointer to a variable that takes the data value read
|
||||
* from the address on the AXI bus.
|
||||
* @size: The size of the data to be read.
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int (*read)(struct udevice *dev, ulong address, void *data,
|
||||
enum axi_size_t size);
|
||||
|
||||
/**
|
||||
* write() - Write a single value to a specified address on a AXI bus
|
||||
* @dev: AXI bus to write to.
|
||||
* @address: The address to write to.
|
||||
* @data: Pointer to the data value to be written to the address
|
||||
* on the AXI bus.
|
||||
* @size: The size of the data to write.
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int (*write)(struct udevice *dev, ulong address, void *data,
|
||||
enum axi_size_t size);
|
||||
|
||||
/**
|
||||
* get_store() - Get address of internal storage of a emulated AXI
|
||||
* device
|
||||
* @dev: Emulated AXI device to get the pointer of the internal
|
||||
* storage for.
|
||||
* @storep: Pointer to the internal storage of the emulated AXI
|
||||
* device.
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int (*get_store)(struct udevice *dev, u8 **storep);
|
||||
};
|
||||
|
||||
#endif
|
||||
26
include/axp152.h
Normal file
26
include/axp152.h
Normal file
@@ -0,0 +1,26 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2012 Henrik Nordstrom <henrik@henriknordstrom.net>
|
||||
*/
|
||||
|
||||
enum axp152_reg {
|
||||
AXP152_CHIP_VERSION = 0x3,
|
||||
AXP152_DCDC2_VOLTAGE = 0x23,
|
||||
AXP152_DCDC3_VOLTAGE = 0x27,
|
||||
AXP152_DCDC4_VOLTAGE = 0x2B,
|
||||
AXP152_LDO2_VOLTAGE = 0x2A,
|
||||
AXP152_SHUTDOWN = 0x32,
|
||||
};
|
||||
|
||||
#define AXP152_POWEROFF (1 << 7)
|
||||
|
||||
/* For axp_gpio.c */
|
||||
#define AXP_GPIO0_CTRL 0x90
|
||||
#define AXP_GPIO1_CTRL 0x91
|
||||
#define AXP_GPIO2_CTRL 0x92
|
||||
#define AXP_GPIO3_CTRL 0x93
|
||||
#define AXP_GPIO_CTRL_OUTPUT_LOW 0x00 /* Drive pin low */
|
||||
#define AXP_GPIO_CTRL_OUTPUT_HIGH 0x01 /* Drive pin high */
|
||||
#define AXP_GPIO_CTRL_INPUT 0x02 /* Input */
|
||||
#define AXP_GPIO_STATE 0x97
|
||||
#define AXP_GPIO_STATE_OFFSET 0
|
||||
86
include/axp209.h
Normal file
86
include/axp209.h
Normal file
@@ -0,0 +1,86 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2012 Henrik Nordstrom <henrik@henriknordstrom.net>
|
||||
*/
|
||||
|
||||
#include <linux/bitops.h>
|
||||
|
||||
enum axp209_reg {
|
||||
AXP209_POWER_STATUS = 0x00,
|
||||
AXP209_CHIP_VERSION = 0x03,
|
||||
AXP209_OUTPUT_CTRL = 0x12,
|
||||
AXP209_DCDC2_VOLTAGE = 0x23,
|
||||
AXP209_VRC_DCDC2_LDO3 = 0x25,
|
||||
AXP209_DCDC3_VOLTAGE = 0x27,
|
||||
AXP209_LDO24_VOLTAGE = 0x28,
|
||||
AXP209_LDO3_VOLTAGE = 0x29,
|
||||
AXP209_IRQ_ENABLE1 = 0x40,
|
||||
AXP209_IRQ_ENABLE2 = 0x41,
|
||||
AXP209_IRQ_ENABLE3 = 0x42,
|
||||
AXP209_IRQ_ENABLE4 = 0x43,
|
||||
AXP209_IRQ_ENABLE5 = 0x44,
|
||||
AXP209_IRQ_STATUS5 = 0x4c,
|
||||
AXP209_SHUTDOWN = 0x32,
|
||||
};
|
||||
|
||||
#define AXP209_POWER_STATUS_ON_BY_DC BIT(0)
|
||||
#define AXP209_POWER_STATUS_VBUS_USABLE BIT(4)
|
||||
|
||||
#define AXP209_CHIP_VERSION_MASK 0x0f
|
||||
|
||||
#define AXP209_OUTPUT_CTRL_EXTEN BIT(0)
|
||||
#define AXP209_OUTPUT_CTRL_DCDC3 BIT(1)
|
||||
#define AXP209_OUTPUT_CTRL_LDO2 BIT(2)
|
||||
#define AXP209_OUTPUT_CTRL_LDO4 BIT(3)
|
||||
#define AXP209_OUTPUT_CTRL_DCDC2 BIT(4)
|
||||
#define AXP209_OUTPUT_CTRL_LDO3 BIT(6)
|
||||
|
||||
/*
|
||||
* AXP209 datasheet contains wrong information about LDO3 VRC:
|
||||
* - VRC is actually enabled when BIT(1) is True
|
||||
* - VRC is actually not enabled by default (BIT(3) = 0 after reset)
|
||||
*/
|
||||
#define AXP209_VRC_LDO3_EN BIT(3)
|
||||
#define AXP209_VRC_DCDC2_EN BIT(2)
|
||||
#define AXP209_VRC_LDO3_800uV_uS (BIT(1) | AXP209_VRC_LDO3_EN)
|
||||
#define AXP209_VRC_LDO3_1600uV_uS AXP209_VRC_LDO3_EN
|
||||
#define AXP209_VRC_DCDC2_800uV_uS (BIT(0) | AXP209_VRC_DCDC2_EN)
|
||||
#define AXP209_VRC_DCDC2_1600uV_uS AXP209_VRC_DCDC2_EN
|
||||
#define AXP209_VRC_LDO3_MASK 0xa
|
||||
#define AXP209_VRC_DCDC2_MASK 0x5
|
||||
#define AXP209_VRC_DCDC2_SLOPE_SET(reg, cfg) \
|
||||
(((reg) & ~AXP209_VRC_DCDC2_MASK) | \
|
||||
((cfg) & AXP209_VRC_DCDC2_MASK))
|
||||
#define AXP209_VRC_LDO3_SLOPE_SET(reg, cfg) \
|
||||
(((reg) & ~AXP209_VRC_LDO3_MASK) | \
|
||||
((cfg) & AXP209_VRC_LDO3_MASK))
|
||||
|
||||
#define AXP209_LDO24_LDO2_MASK 0xf0
|
||||
#define AXP209_LDO24_LDO4_MASK 0x0f
|
||||
#define AXP209_LDO24_LDO2_SET(reg, cfg) \
|
||||
(((reg) & ~AXP209_LDO24_LDO2_MASK) | \
|
||||
(((cfg) << 4) & AXP209_LDO24_LDO2_MASK))
|
||||
#define AXP209_LDO24_LDO4_SET(reg, cfg) \
|
||||
(((reg) & ~AXP209_LDO24_LDO4_MASK) | \
|
||||
(((cfg) << 0) & AXP209_LDO24_LDO4_MASK))
|
||||
|
||||
#define AXP209_LDO3_VOLTAGE_FROM_LDO3IN BIT(7)
|
||||
#define AXP209_LDO3_VOLTAGE_MASK 0x7f
|
||||
#define AXP209_LDO3_VOLTAGE_SET(x) ((x) & AXP209_LDO3_VOLTAGE_MASK)
|
||||
|
||||
#define AXP209_IRQ5_PEK_UP BIT(6)
|
||||
#define AXP209_IRQ5_PEK_DOWN BIT(5)
|
||||
|
||||
#define AXP209_POWEROFF BIT(7)
|
||||
|
||||
/* For axp_gpio.c */
|
||||
#define AXP_POWER_STATUS 0x00
|
||||
#define AXP_POWER_STATUS_VBUS_PRESENT BIT(5)
|
||||
#define AXP_GPIO0_CTRL 0x90
|
||||
#define AXP_GPIO1_CTRL 0x92
|
||||
#define AXP_GPIO2_CTRL 0x93
|
||||
#define AXP_GPIO_CTRL_OUTPUT_LOW 0x00 /* Drive pin low */
|
||||
#define AXP_GPIO_CTRL_OUTPUT_HIGH 0x01 /* Drive pin high */
|
||||
#define AXP_GPIO_CTRL_INPUT 0x02 /* Input */
|
||||
#define AXP_GPIO_STATE 0x94
|
||||
#define AXP_GPIO_STATE_OFFSET 4
|
||||
65
include/axp221.h
Normal file
65
include/axp221.h
Normal file
@@ -0,0 +1,65 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2013 Oliver Schinagl <oliver@schinagl.nl>
|
||||
*
|
||||
* X-Powers AXP221 Power Management IC driver
|
||||
*/
|
||||
|
||||
/* Page 0 addresses */
|
||||
#define AXP221_CHIP_ID 0x03
|
||||
#define AXP221_OUTPUT_CTRL1 0x10
|
||||
#define AXP221_OUTPUT_CTRL1_DCDC0_EN (1 << 0)
|
||||
#define AXP221_OUTPUT_CTRL1_DCDC1_EN (1 << 1)
|
||||
#define AXP221_OUTPUT_CTRL1_DCDC2_EN (1 << 2)
|
||||
#define AXP221_OUTPUT_CTRL1_DCDC3_EN (1 << 3)
|
||||
#define AXP221_OUTPUT_CTRL1_DCDC4_EN (1 << 4)
|
||||
#define AXP221_OUTPUT_CTRL1_DCDC5_EN (1 << 5)
|
||||
#define AXP221_OUTPUT_CTRL1_ALDO1_EN (1 << 6)
|
||||
#define AXP221_OUTPUT_CTRL1_ALDO2_EN (1 << 7)
|
||||
#define AXP221_OUTPUT_CTRL2 0x12
|
||||
#define AXP221_OUTPUT_CTRL2_ELDO1_EN (1 << 0)
|
||||
#define AXP221_OUTPUT_CTRL2_ELDO2_EN (1 << 1)
|
||||
#define AXP221_OUTPUT_CTRL2_ELDO3_EN (1 << 2)
|
||||
#define AXP221_OUTPUT_CTRL2_DLDO1_EN (1 << 3)
|
||||
#define AXP221_OUTPUT_CTRL2_DLDO2_EN (1 << 4)
|
||||
#define AXP221_OUTPUT_CTRL2_DLDO3_EN (1 << 5)
|
||||
#define AXP221_OUTPUT_CTRL2_DLDO4_EN (1 << 6)
|
||||
#define AXP221_OUTPUT_CTRL2_DCDC1SW_EN (1 << 7)
|
||||
#define AXP221_OUTPUT_CTRL3 0x13
|
||||
#define AXP221_OUTPUT_CTRL3_ALDO3_EN (1 << 7)
|
||||
#define AXP221_DLDO1_CTRL 0x15
|
||||
#define AXP221_DLDO2_CTRL 0x16
|
||||
#define AXP221_DLDO3_CTRL 0x17
|
||||
#define AXP221_DLDO4_CTRL 0x18
|
||||
#define AXP221_ELDO1_CTRL 0x19
|
||||
#define AXP221_ELDO2_CTRL 0x1a
|
||||
#define AXP221_ELDO3_CTRL 0x1b
|
||||
#define AXP221_DCDC1_CTRL 0x21
|
||||
#define AXP221_DCDC2_CTRL 0x22
|
||||
#define AXP221_DCDC3_CTRL 0x23
|
||||
#define AXP221_DCDC4_CTRL 0x24
|
||||
#define AXP221_DCDC5_CTRL 0x25
|
||||
#define AXP221_ALDO1_CTRL 0x28
|
||||
#define AXP221_ALDO2_CTRL 0x29
|
||||
#define AXP221_ALDO3_CTRL 0x2a
|
||||
#define AXP221_SHUTDOWN 0x32
|
||||
#define AXP221_SHUTDOWN_POWEROFF (1 << 7)
|
||||
#define AXP221_PAGE 0xff
|
||||
|
||||
/* Page 1 addresses */
|
||||
#define AXP221_SID 0x20
|
||||
|
||||
/* For axp_gpio.c */
|
||||
#define AXP_POWER_STATUS 0x00
|
||||
#define AXP_POWER_STATUS_VBUS_PRESENT (1 << 5)
|
||||
#define AXP_VBUS_IPSOUT 0x30
|
||||
#define AXP_VBUS_IPSOUT_DRIVEBUS (1 << 2)
|
||||
#define AXP_MISC_CTRL 0x8f
|
||||
#define AXP_MISC_CTRL_N_VBUSEN_FUNC (1 << 4)
|
||||
#define AXP_GPIO0_CTRL 0x90
|
||||
#define AXP_GPIO1_CTRL 0x92
|
||||
#define AXP_GPIO_CTRL_OUTPUT_LOW 0x00 /* Drive pin low */
|
||||
#define AXP_GPIO_CTRL_OUTPUT_HIGH 0x01 /* Drive pin high */
|
||||
#define AXP_GPIO_CTRL_INPUT 0x02 /* Input */
|
||||
#define AXP_GPIO_STATE 0x94
|
||||
#define AXP_GPIO_STATE_OFFSET 0
|
||||
59
include/axp809.h
Normal file
59
include/axp809.h
Normal file
@@ -0,0 +1,59 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2016 Chen-Yu Tsai <wens@csie.org>
|
||||
*
|
||||
* X-Powers AXP809 Power Management IC driver
|
||||
*/
|
||||
|
||||
#define AXP809_CHIP_ID 0x03
|
||||
|
||||
#define AXP809_OUTPUT_CTRL1 0x10
|
||||
#define AXP809_OUTPUT_CTRL1_DC5LDO_EN (1 << 0)
|
||||
#define AXP809_OUTPUT_CTRL1_DCDC1_EN (1 << 1)
|
||||
#define AXP809_OUTPUT_CTRL1_DCDC2_EN (1 << 2)
|
||||
#define AXP809_OUTPUT_CTRL1_DCDC3_EN (1 << 3)
|
||||
#define AXP809_OUTPUT_CTRL1_DCDC4_EN (1 << 4)
|
||||
#define AXP809_OUTPUT_CTRL1_DCDC5_EN (1 << 5)
|
||||
#define AXP809_OUTPUT_CTRL1_ALDO1_EN (1 << 6)
|
||||
#define AXP809_OUTPUT_CTRL1_ALDO2_EN (1 << 7)
|
||||
#define AXP809_OUTPUT_CTRL2 0x12
|
||||
#define AXP809_OUTPUT_CTRL2_ELDO1_EN (1 << 0)
|
||||
#define AXP809_OUTPUT_CTRL2_ELDO2_EN (1 << 1)
|
||||
#define AXP809_OUTPUT_CTRL2_ELDO3_EN (1 << 2)
|
||||
#define AXP809_OUTPUT_CTRL2_DLDO1_EN (1 << 3)
|
||||
#define AXP809_OUTPUT_CTRL2_DLDO2_EN (1 << 4)
|
||||
#define AXP809_OUTPUT_CTRL2_ALDO3_EN (1 << 5)
|
||||
#define AXP809_OUTPUT_CTRL2_SWOUT_EN (1 << 6)
|
||||
#define AXP809_OUTPUT_CTRL2_DC1SW_EN (1 << 7)
|
||||
|
||||
#define AXP809_DLDO1_CTRL 0x15
|
||||
#define AXP809_DLDO2_CTRL 0x16
|
||||
#define AXP809_ELDO1_CTRL 0x19
|
||||
#define AXP809_ELDO2_CTRL 0x1a
|
||||
#define AXP809_ELDO3_CTRL 0x1b
|
||||
#define AXP809_DC5LDO_CTRL 0x1c
|
||||
#define AXP809_DCDC1_CTRL 0x21
|
||||
#define AXP809_DCDC2_CTRL 0x22
|
||||
#define AXP809_DCDC3_CTRL 0x23
|
||||
#define AXP809_DCDC4_CTRL 0x24
|
||||
#define AXP809_DCDC5_CTRL 0x25
|
||||
#define AXP809_ALDO1_CTRL 0x28
|
||||
#define AXP809_ALDO2_CTRL 0x29
|
||||
#define AXP809_ALDO3_CTRL 0x2a
|
||||
#define AXP809_SHUTDOWN 0x32
|
||||
#define AXP809_SHUTDOWN_POWEROFF (1 << 7)
|
||||
|
||||
/* For axp_gpio.c */
|
||||
#define AXP_POWER_STATUS 0x00
|
||||
#define AXP_POWER_STATUS_VBUS_PRESENT (1 << 5)
|
||||
#define AXP_VBUS_IPSOUT 0x30
|
||||
#define AXP_VBUS_IPSOUT_DRIVEBUS (1 << 2)
|
||||
#define AXP_MISC_CTRL 0x8f
|
||||
#define AXP_MISC_CTRL_N_VBUSEN_FUNC (1 << 4)
|
||||
#define AXP_GPIO0_CTRL 0x90
|
||||
#define AXP_GPIO1_CTRL 0x92
|
||||
#define AXP_GPIO_CTRL_OUTPUT_LOW 0x00 /* Drive pin low */
|
||||
#define AXP_GPIO_CTRL_OUTPUT_HIGH 0x01 /* Drive pin high */
|
||||
#define AXP_GPIO_CTRL_INPUT 0x02 /* Input */
|
||||
#define AXP_GPIO_STATE 0x94
|
||||
#define AXP_GPIO_STATE_OFFSET 0
|
||||
73
include/axp818.h
Normal file
73
include/axp818.h
Normal file
@@ -0,0 +1,73 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2015 Vishnu Patekar <vishnupatekar0510@gmail.com>
|
||||
*
|
||||
* X-Powers AXP818 Power Management IC driver
|
||||
*/
|
||||
|
||||
#define AXP818_CHIP_ID 0x03
|
||||
|
||||
#define AXP818_OUTPUT_CTRL1 0x10
|
||||
#define AXP818_OUTPUT_CTRL1_DCDC1_EN (1 << 0)
|
||||
#define AXP818_OUTPUT_CTRL1_DCDC2_EN (1 << 1)
|
||||
#define AXP818_OUTPUT_CTRL1_DCDC3_EN (1 << 2)
|
||||
#define AXP818_OUTPUT_CTRL1_DCDC4_EN (1 << 3)
|
||||
#define AXP818_OUTPUT_CTRL1_DCDC5_EN (1 << 4)
|
||||
#define AXP818_OUTPUT_CTRL1_DCDC6_EN (1 << 5)
|
||||
#define AXP818_OUTPUT_CTRL1_DCDC7_EN (1 << 6)
|
||||
#define AXP818_OUTPUT_CTRL2 0x12
|
||||
#define AXP818_OUTPUT_CTRL2_ELDO1_EN (1 << 0)
|
||||
#define AXP818_OUTPUT_CTRL2_ELDO2_EN (1 << 1)
|
||||
#define AXP818_OUTPUT_CTRL2_ELDO3_EN (1 << 2)
|
||||
#define AXP818_OUTPUT_CTRL2_DLDO1_EN (1 << 3)
|
||||
#define AXP818_OUTPUT_CTRL2_DLDO2_EN (1 << 4)
|
||||
#define AXP818_OUTPUT_CTRL2_DLDO3_EN (1 << 5)
|
||||
#define AXP818_OUTPUT_CTRL2_DLDO4_EN (1 << 6)
|
||||
#define AXP818_OUTPUT_CTRL2_SW_EN (1 << 7)
|
||||
#define AXP818_OUTPUT_CTRL3 0x13
|
||||
#define AXP818_OUTPUT_CTRL3_FLDO1_EN (1 << 2)
|
||||
#define AXP818_OUTPUT_CTRL3_FLDO2_EN (1 << 3)
|
||||
#define AXP818_OUTPUT_CTRL3_FLDO3_EN (1 << 4)
|
||||
#define AXP818_OUTPUT_CTRL3_ALDO1_EN (1 << 5)
|
||||
#define AXP818_OUTPUT_CTRL3_ALDO2_EN (1 << 6)
|
||||
#define AXP818_OUTPUT_CTRL3_ALDO3_EN (1 << 7)
|
||||
|
||||
#define AXP818_DLDO1_CTRL 0x15
|
||||
#define AXP818_DLDO2_CTRL 0x16
|
||||
#define AXP818_DLDO3_CTRL 0x17
|
||||
#define AXP818_DLDO4_CTRL 0x18
|
||||
#define AXP818_ELDO1_CTRL 0x19
|
||||
#define AXP818_ELDO2_CTRL 0x1a
|
||||
#define AXP818_ELDO3_CTRL 0x1b
|
||||
#define AXP818_FLDO1_CTRL 0x1c
|
||||
#define AXP818_FLDO2_3_CTRL 0x1d
|
||||
#define AXP818_FLDO2_3_CTRL_FLDO3_VOL (1 << 4)
|
||||
#define AXP818_DCDC1_CTRL 0x20
|
||||
#define AXP818_DCDC2_CTRL 0x21
|
||||
#define AXP818_DCDC3_CTRL 0x22
|
||||
#define AXP818_DCDC4_CTRL 0x23
|
||||
#define AXP818_DCDC5_CTRL 0x24
|
||||
#define AXP818_DCDC6_CTRL 0x25
|
||||
#define AXP818_DCDC7_CTRL 0x26
|
||||
|
||||
#define AXP818_ALDO1_CTRL 0x28
|
||||
#define AXP818_ALDO2_CTRL 0x29
|
||||
#define AXP818_ALDO3_CTRL 0x2a
|
||||
|
||||
#define AXP818_SHUTDOWN 0x32
|
||||
#define AXP818_SHUTDOWN_POWEROFF (1 << 7)
|
||||
|
||||
/* For axp_gpio.c */
|
||||
#define AXP_POWER_STATUS 0x00
|
||||
#define AXP_POWER_STATUS_VBUS_PRESENT (1 << 5)
|
||||
#define AXP_VBUS_IPSOUT 0x30
|
||||
#define AXP_VBUS_IPSOUT_DRIVEBUS (1 << 2)
|
||||
#define AXP_MISC_CTRL 0x8f
|
||||
#define AXP_MISC_CTRL_N_VBUSEN_FUNC (1 << 4)
|
||||
#define AXP_GPIO0_CTRL 0x90
|
||||
#define AXP_GPIO1_CTRL 0x92
|
||||
#define AXP_GPIO_CTRL_OUTPUT_LOW 0x00 /* Drive pin low */
|
||||
#define AXP_GPIO_CTRL_OUTPUT_HIGH 0x01 /* Drive pin high */
|
||||
#define AXP_GPIO_CTRL_INPUT 0x02 /* Input */
|
||||
#define AXP_GPIO_STATE 0x94
|
||||
#define AXP_GPIO_STATE_OFFSET 0
|
||||
41
include/axp_pmic.h
Normal file
41
include/axp_pmic.h
Normal file
@@ -0,0 +1,41 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2015 Hans de Goede <hdegoede@redhat.com>
|
||||
*
|
||||
* X-Powers AX Power Management IC support header
|
||||
*/
|
||||
#ifndef _AXP_PMIC_H_
|
||||
|
||||
#ifdef CONFIG_AXP152_POWER
|
||||
#include <axp152.h>
|
||||
#endif
|
||||
#ifdef CONFIG_AXP209_POWER
|
||||
#include <axp209.h>
|
||||
#endif
|
||||
#ifdef CONFIG_AXP221_POWER
|
||||
#include <axp221.h>
|
||||
#endif
|
||||
#ifdef CONFIG_AXP809_POWER
|
||||
#include <axp809.h>
|
||||
#endif
|
||||
#ifdef CONFIG_AXP818_POWER
|
||||
#include <axp818.h>
|
||||
#endif
|
||||
|
||||
int axp_set_dcdc1(unsigned int mvolt);
|
||||
int axp_set_dcdc2(unsigned int mvolt);
|
||||
int axp_set_dcdc3(unsigned int mvolt);
|
||||
int axp_set_dcdc4(unsigned int mvolt);
|
||||
int axp_set_dcdc5(unsigned int mvolt);
|
||||
int axp_set_aldo1(unsigned int mvolt);
|
||||
int axp_set_aldo2(unsigned int mvolt);
|
||||
int axp_set_aldo3(unsigned int mvolt);
|
||||
int axp_set_aldo4(unsigned int mvolt);
|
||||
int axp_set_dldo(int dldo_num, unsigned int mvolt);
|
||||
int axp_set_eldo(int eldo_num, unsigned int mvolt);
|
||||
int axp_set_fldo(int fldo_num, unsigned int mvolt);
|
||||
int axp_set_sw(bool on);
|
||||
int axp_init(void);
|
||||
int axp_get_sid(unsigned int *sid);
|
||||
|
||||
#endif
|
||||
55
include/backlight.h
Normal file
55
include/backlight.h
Normal file
@@ -0,0 +1,55 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (c) 2016 Google, Inc
|
||||
* Written by Simon Glass <sjg@chromium.org>
|
||||
*/
|
||||
|
||||
#ifndef _BACKLIGHT_H
|
||||
#define _BACKLIGHT_H
|
||||
|
||||
enum {
|
||||
BACKLIGHT_MAX = 100,
|
||||
BACKLIGHT_MIN = 0,
|
||||
BACKLIGHT_OFF = -1,
|
||||
BACKLIGHT_DEFAULT = -2,
|
||||
};
|
||||
|
||||
struct backlight_ops {
|
||||
/**
|
||||
* enable() - Enable a backlight
|
||||
*
|
||||
* @dev: Backlight device to enable
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int (*enable)(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* set_brightness - Set brightness
|
||||
*
|
||||
* @dev: Backlight device to update
|
||||
* @percent: Brightness value (0 to 100, or BACKLIGHT_... value)
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int (*set_brightness)(struct udevice *dev, int percent);
|
||||
};
|
||||
|
||||
#define backlight_get_ops(dev) ((struct backlight_ops *)(dev)->driver->ops)
|
||||
|
||||
/**
|
||||
* backlight_enable() - Enable a backlight
|
||||
*
|
||||
* @dev: Backlight device to enable
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int backlight_enable(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* backlight_set_brightness - Set brightness
|
||||
*
|
||||
* @dev: Backlight device to update
|
||||
* @percent: Brightness value (0 to 100, or BACKLIGHT_... value)
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int backlight_set_brightness(struct udevice *dev, int percent);
|
||||
|
||||
#endif
|
||||
23
include/bcd.h
Normal file
23
include/bcd.h
Normal file
@@ -0,0 +1,23 @@
|
||||
/* Permission is hereby granted to copy, modify and redistribute this code
|
||||
* in terms of the GNU Library General Public License, Version 2 or later,
|
||||
* at your option.
|
||||
*/
|
||||
|
||||
/* inline functions to translate to/from binary and binary-coded decimal
|
||||
* (frequently found in RTC chips).
|
||||
*/
|
||||
|
||||
#ifndef _BCD_H
|
||||
#define _BCD_H
|
||||
|
||||
static inline unsigned int bcd2bin(unsigned int val)
|
||||
{
|
||||
return ((val) & 0x0f) + ((val & 0xff) >> 4) * 10;
|
||||
}
|
||||
|
||||
static inline unsigned int bin2bcd(unsigned int val)
|
||||
{
|
||||
return (((val / 10) << 4) | (val % 10));
|
||||
}
|
||||
|
||||
#endif /* _BCD_H */
|
||||
40
include/bedbug/bedbug.h
Normal file
40
include/bedbug/bedbug.h
Normal file
@@ -0,0 +1,40 @@
|
||||
/* $Id$ */
|
||||
|
||||
#ifndef _BEDBUG_H
|
||||
#define _BEDBUG_H
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
#define _USE_PROTOTYPES
|
||||
|
||||
#ifndef isblank
|
||||
#define isblank(c) isspace((int)(c))
|
||||
#endif
|
||||
|
||||
#ifndef __P
|
||||
#if defined(_USE_PROTOTYPES) && (defined(__STDC__) || defined(__cplusplus))
|
||||
#define __P(protos) protos /* full-blown ANSI C */
|
||||
#else
|
||||
#define __P(protos) () /* traditional C preprocessor */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* _BEDBUG_H */
|
||||
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001 William L. Pitts
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are freely
|
||||
* permitted provided that the above copyright notice and this
|
||||
* paragraph and the following disclaimer are duplicated in all
|
||||
* such forms.
|
||||
*
|
||||
* This software is provided "AS IS" and without any express or
|
||||
* implied warranties, including, without limitation, the implied
|
||||
* warranties of merchantability and fitness for a particular
|
||||
* purpose.
|
||||
*/
|
||||
408
include/bedbug/ppc.h
Normal file
408
include/bedbug/ppc.h
Normal file
@@ -0,0 +1,408 @@
|
||||
/* $Id$ */
|
||||
|
||||
#ifndef _PPC_H
|
||||
#define _PPC_H
|
||||
|
||||
/*======================================================================
|
||||
*
|
||||
* OPERANDS
|
||||
*
|
||||
*======================================================================*/
|
||||
|
||||
enum OP_FIELD {
|
||||
O_AA = 1, O_BD, O_BI, O_BO, O_crbD, O_crbA, O_crbB, O_CRM, O_d, O_frC, O_frD,
|
||||
O_frS, O_IMM, O_LI, O_LK, O_MB, O_ME, O_NB, O_OE, O_rA, O_rB, O_Rc, O_rD,
|
||||
O_rS, O_SH, O_SIMM, O_SR, O_TO, O_UIMM, O_crfD, O_crfS, O_L, O_spr, O_tbr,
|
||||
O_cr2 };
|
||||
|
||||
struct operand {
|
||||
enum OP_FIELD field; /* The operand identifier from the
|
||||
enum above */
|
||||
|
||||
char * name; /* Symbolic name of this operand */
|
||||
|
||||
unsigned int bits; /* The number of bits used by this
|
||||
operand */
|
||||
|
||||
unsigned int shift; /* How far to the right the operand
|
||||
should be shifted so that it is
|
||||
aligned at the beginning of the
|
||||
word */
|
||||
|
||||
unsigned int hint; /* A bitwise-inclusive-OR of the
|
||||
values shown below. These are used
|
||||
tell the disassembler how to print
|
||||
this operand */
|
||||
};
|
||||
|
||||
/* Values for operand hint */
|
||||
#define OH_SILENT 0x01 /* dont print this operand */
|
||||
#define OH_ADDR 0x02 /* this operand is an address */
|
||||
#define OH_REG 0x04 /* this operand is a register */
|
||||
#define OH_SPR 0x08 /* this operand is an SPR */
|
||||
#define OH_TBR 0x10 /* this operand is a TBR */
|
||||
#define OH_OFFSET 0x20 /* this operand is an offset */
|
||||
#define OH_LITERAL 0x40 /* a literal string */
|
||||
|
||||
|
||||
/*======================================================================
|
||||
*
|
||||
* OPCODES
|
||||
*
|
||||
*======================================================================*/
|
||||
|
||||
/* From the MPCxxx instruction set documentation, all instructions are
|
||||
* 32 bits long and word aligned. Bits 0-5 always specify the primary
|
||||
* opcode. Many instructions also have an extended opcode.
|
||||
*/
|
||||
|
||||
#define GET_OPCD(i) (((unsigned long)(i) >> 26) & 0x3f)
|
||||
#define MAKE_OPCODE(i) ((((unsigned long)(i)) & 0x3f) << 26)
|
||||
|
||||
/* The MPC860 User's Manual, Appendix D.4 contains the definitions of the
|
||||
* instruction forms
|
||||
*/
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
* I-Form Instructions:
|
||||
* bX
|
||||
*-------------------------------------------------
|
||||
* OPCD | LI |AA|LK
|
||||
*-------------------------------------------------*/
|
||||
|
||||
#define I_OPCODE(i,aa,lk) (MAKE_OPCODE(i) | (((aa) & 0x1) << 1) | ((lk) & 0x1))
|
||||
#define I_MASK I_OPCODE(0x3f,0x1,0x1)
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
* B-Form Instructions:
|
||||
* bcX
|
||||
*-------------------------------------------------
|
||||
* OPCD | BO | BI | BD |AA|LK
|
||||
*-------------------------------------------------*/
|
||||
|
||||
#define B_OPCODE(i,aa,lk) (MAKE_OPCODE(i) | (((aa) & 0x1) << 1) | ((lk) & 0x1))
|
||||
#define B_MASK B_OPCODE(0x3f,0x1,0x1)
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
* SC-Form Instructions:
|
||||
* sc
|
||||
*-------------------------------------------------
|
||||
* OPCD | 00000 | 00000 | 00000000000000 |1|0
|
||||
*-------------------------------------------------*/
|
||||
|
||||
#define SC_OPCODE(i) (MAKE_OPCODE(i) | 0x2)
|
||||
#define SC_MASK SC_OPCODE(0x3f)
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
* D-Form Instructions:
|
||||
* addi addic addic. addis andi. andis. cmpi cmpli
|
||||
* lbz lbzu lha lhau lhz lhzu lmw lwz lwzu mulli
|
||||
* ori oris stb stbu sth sthu stmw stw stwu subfic
|
||||
* twi xori xoris
|
||||
*-------------------------------------------------
|
||||
* OPCD | D | A | d
|
||||
* OPCD | D | A | SIMM
|
||||
* OPCD | S | A | d
|
||||
* OPCD | S | A | UIMM
|
||||
* OPCD |crfD|0|L| A | SIMM
|
||||
* OPCD |crfD|0|L| A | UIMM
|
||||
* OPCD | TO | A | SIMM
|
||||
*-------------------------------------------------*/
|
||||
|
||||
#define D_OPCODE(i) MAKE_OPCODE(i)
|
||||
#define D_MASK MAKE_OPCODE(0x3f)
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
* DS-Form Instructions:
|
||||
* (none supported by MPC860)
|
||||
*-------------------------------------------------
|
||||
* OPCD | D | A | ds |XO
|
||||
* OPCD | S | A | ds |XO
|
||||
*-------------------------------------------------*/
|
||||
|
||||
#define DS_OPCODE(i,xo) (MAKE_OPCODE(i) | ((xo) & 0x3))
|
||||
#define DS_MASK DS_OPCODE(0x3f,0x1)
|
||||
|
||||
|
||||
/*---------------------------------------------------
|
||||
* X-Form Instructions:
|
||||
* andX andcX cmp cmpl cntlzwX dcbf dcbi dcbst dcbt
|
||||
* dcbtst dcbz eciwx ecowx eieio eqvX extsbX extshX
|
||||
* icbi lbzux lbxz lhaux lhax lhbrx lhzux lhxz lswi
|
||||
* lswx lwarx lwbrx lwzux lwxz mcrfs mcrxr mfcr
|
||||
* mfmsr mfsr mfsrin mtmsr mtsr mtsrin nandX norX
|
||||
* orX orcX slwX srawX srawiX srwX stbux stbx
|
||||
* sthbrx sthuxsthx stswi stswx stwbrx stwcx. stwux
|
||||
* stwx sync tlbie tlbld tlbli tlbsync tw xorX
|
||||
*---------------------------------------------------
|
||||
* OPCD | D | A | B | XO |0
|
||||
* OPCD | D | A | NB | XO |0
|
||||
* OPCD | D | 00000 | B | XO |0
|
||||
* OPCD | D | 00000 | 00000 | XO |0
|
||||
* OPCD | D |0| SR | 00000 | XO |0
|
||||
* OPCD | S | A | B | XO |Rc
|
||||
* OPCD | S | A | B | XO |1
|
||||
* OPCD | S | A | B | XO |0
|
||||
* OPCD | S | A | NB | XO |0
|
||||
* OPCD | S | A | 00000 | XO |Rc
|
||||
* OPCD | S | 00000 | B | XO |0
|
||||
* OPCD | S | 00000 | 00000 | XO |0
|
||||
* OPCD | S |0| SR | 00000 | XO |0
|
||||
* OPCD | S | A | SH | XO |Rc
|
||||
* OPCD |crfD|0|L| A | SH | XO |0
|
||||
* OPCD |crfD |00| A | B | XO |0
|
||||
* OPCD |crfD |00|crfS |00| 00000 | XO |0
|
||||
* OPCD |crfD |00| 00000 | 00000 | XO |0
|
||||
* OPCD |crfD |00| 00000 | IMM |0| XO |Rc
|
||||
* OPCD | TO | A | B | XO |0
|
||||
* OPCD | D | 00000 | B | XO |Rc
|
||||
* OPCD | D | 00000 | 00000 | XO |Rc
|
||||
* OPCD | crbD | 00000 | 00000 | XO |Rc
|
||||
* OPCD | 00000 | A | B | XO |0
|
||||
* OPCD | 00000 | 00000 | B | XO |0
|
||||
* OPCD | 00000 | 00000 | 00000 | XO |0
|
||||
*---------------------------------------------------*/
|
||||
|
||||
#define X_OPCODE(i,xo,rc) (MAKE_OPCODE(i) | (((xo) & 0x3ff) << 1) | \
|
||||
((rc) & 0x1))
|
||||
#define X_MASK X_OPCODE(0x3f,0x3ff,0x1)
|
||||
|
||||
|
||||
/*---------------------------------------------------
|
||||
* XL-Form Instructions:
|
||||
* bcctrX bclrX crand crandc creqv crnand crnor cror
|
||||
* croc crxorisync mcrf rfi
|
||||
*---------------------------------------------------
|
||||
* OPCD | BO | BI | 00000 | XO |LK
|
||||
* OPCD | crbD | crbA | crbB | XO |0
|
||||
* OPCD |crfD |00|crfS |00| 00000 | XO |0
|
||||
* OPCD | 00000 | 00000 | 00000 | XO |0
|
||||
*---------------------------------------------------*/
|
||||
|
||||
#define XL_OPCODE(i,xo,lk) (MAKE_OPCODE(i) | (((xo) & 0x3ff) << 1) | \
|
||||
((lk) & 0x1))
|
||||
#define XL_MASK XL_OPCODE(0x3f,0x3ff,0x1)
|
||||
|
||||
|
||||
/*---------------------------------------------------
|
||||
* XFX-Form Instructions:
|
||||
* mfspr mftb mtcrf mtspr
|
||||
*---------------------------------------------------
|
||||
* OPCD | D | spr | XO |0
|
||||
* OPCD | D |0| CRM |0| XO |0
|
||||
* OPCD | S | spr | XO |0
|
||||
* OPCD | D | tbr | XO |0
|
||||
*---------------------------------------------------*/
|
||||
|
||||
#define XFX_OPCODE(i,xo,rc) (MAKE_OPCODE(i) | (((xo) & 0x3ff) << 1) | \
|
||||
((rc) & 0x1))
|
||||
#define XFX_MASK XFX_OPCODE(0x3f,0x3ff,0x1)
|
||||
|
||||
|
||||
/*---------------------------------------------------
|
||||
* XFL-Form Instructions:
|
||||
* (none supported by MPC860)
|
||||
*---------------------------------------------------
|
||||
* OPCD |0| FM |0| B | XO |0
|
||||
*---------------------------------------------------*/
|
||||
|
||||
#define XFL_OPCODE(i,xo,rc) (MAKE_OPCODE(i) | (((xo) & 0x3ff) << 1) | \
|
||||
((rc) & 0x1))
|
||||
#define XFL_MASK XFL_OPCODE(0x3f,0x3ff,0x1)
|
||||
|
||||
|
||||
/*---------------------------------------------------
|
||||
* XS-Form Instructions:
|
||||
* (none supported by MPC860)
|
||||
*---------------------------------------------------
|
||||
* OPCD | S | A | sh | XO |sh|LK
|
||||
*---------------------------------------------------*/
|
||||
|
||||
#define XS_OPCODE(i,xo,rc) (MAKE_OPCODE(i) | (((xo) & 0x1ff) << 2) | \
|
||||
((rc) & 0x1))
|
||||
#define XS_MASK XS_OPCODE(0x3f,0x1ff,0x1)
|
||||
|
||||
|
||||
/*---------------------------------------------------
|
||||
* XO-Form Instructions:
|
||||
* addX addcXaddeX addmeX addzeX divwX divwuX mulhwX
|
||||
* mulhwuX mullwX negX subfX subfcX subfeX subfmeX
|
||||
* subfzeX
|
||||
*---------------------------------------------------
|
||||
* OPCD | D | A | B |OE| XO |Rc
|
||||
* OPCD | D | A | B |0 | XO |Rc
|
||||
* OPCD | D | A | 00000 |OE| XO |Rc
|
||||
*---------------------------------------------------*/
|
||||
|
||||
#define XO_OPCODE(i,xo,oe,rc) (MAKE_OPCODE(i) | (((oe) & 0x1) << 10) | \
|
||||
(((xo) & 0x1ff) << 1) | ((rc) & 0x1))
|
||||
#define XO_MASK XO_OPCODE(0x3f,0x1ff,0x1,0x1)
|
||||
|
||||
|
||||
/*---------------------------------------------------
|
||||
* A-Form Instructions:
|
||||
* (none supported by MPC860)
|
||||
*---------------------------------------------------
|
||||
* OPCD | D | A | B |00000| XO |Rc
|
||||
* OPCD | D | A | B | C | XO |Rc
|
||||
* OPCD | D | A | 00000 | C | XO |Rc
|
||||
* OPCD | D | 00000 | B |00000| XO |Rc
|
||||
*---------------------------------------------------*/
|
||||
|
||||
#define A_OPCODE(i,xo,rc) (MAKE_OPCODE(i) | (((xo) & 0x1f) << 1) | \
|
||||
((rc) & 0x1))
|
||||
#define A_MASK A_OPCODE(0x3f,0x1f,0x1)
|
||||
|
||||
|
||||
/*---------------------------------------------------
|
||||
* M-Form Instructions:
|
||||
* rlwimiX rlwinmX rlwnmX
|
||||
*---------------------------------------------------
|
||||
* OPCD | S | A | SH | MB | ME |Rc
|
||||
* OPCD | S | A | B | MB | ME |Rc
|
||||
*---------------------------------------------------*/
|
||||
|
||||
#define M_OPCODE(i,rc) (MAKE_OPCODE(i) | ((rc) & 0x1))
|
||||
#define M_MASK M_OPCODE(0x3f,0x1)
|
||||
|
||||
|
||||
/*---------------------------------------------------
|
||||
* MD-Form Instructions:
|
||||
* (none supported by MPC860)
|
||||
*---------------------------------------------------
|
||||
* OPCD | S | A | sh | mb | XO |sh|Rc
|
||||
* OPCD | S | A | sh | me | XO |sh|Rc
|
||||
*---------------------------------------------------*/
|
||||
|
||||
#define MD_OPCODE(i,xo,rc) (MAKE_OPCODE(i) | (((xo) & 0x7) << 2) | \
|
||||
((rc) & 0x1))
|
||||
#define MD_MASK MD_OPCODE(0x3f,0x7,0x1)
|
||||
|
||||
|
||||
/*---------------------------------------------------
|
||||
* MDS-Form Instructions:
|
||||
* (none supported by MPC860)
|
||||
*---------------------------------------------------
|
||||
* OPCD | S | A | B | mb | XO |Rc
|
||||
* OPCD | S | A | B | me | XO |Rc
|
||||
*---------------------------------------------------*/
|
||||
|
||||
#define MDS_OPCODE(i,xo,rc) (MAKE_OPCODE(i) | (((xo) & 0xf) << 1) | \
|
||||
((rc) & 0x1))
|
||||
#define MDS_MASK MDS_OPCODE(0x3f,0xf,0x1)
|
||||
|
||||
#define INSTRUCTION( memaddr ) ntohl(*(unsigned long *)(memaddr))
|
||||
|
||||
#define MAX_OPERANDS 8
|
||||
|
||||
struct ppc_ctx;
|
||||
|
||||
struct opcode {
|
||||
unsigned long opcode; /* The complete opcode as produced by
|
||||
one of the XXX_OPCODE macros above */
|
||||
|
||||
unsigned long mask; /* The mask to use on an instruction
|
||||
before comparing with the opcode
|
||||
field to see if it matches */
|
||||
|
||||
enum OP_FIELD fields[MAX_OPERANDS];
|
||||
/* An array defining the operands for
|
||||
this opcode. The values of the
|
||||
array are the operand identifiers */
|
||||
|
||||
int (*hfunc)(struct ppc_ctx *);
|
||||
/* Address of a function to handle the given
|
||||
mnemonic */
|
||||
|
||||
char * name; /* The symbolic name of this opcode */
|
||||
|
||||
unsigned int hint; /* A bitwise-inclusive-OR of the
|
||||
values shown below. These are used
|
||||
tell the disassembler how to print
|
||||
some operands for this opcode */
|
||||
};
|
||||
|
||||
/* values for opcode hints */
|
||||
#define H_RELATIVE 0x1 /* The address operand is relative */
|
||||
#define H_IMM_HIGH 0x2 /* [U|S]IMM field shifted high */
|
||||
#define H_RA0_IS_0 0x4 /* If rA = 0 then treat as literal 0 */
|
||||
|
||||
struct ppc_ctx {
|
||||
struct opcode * op;
|
||||
unsigned long instr;
|
||||
unsigned int flags;
|
||||
int datalen;
|
||||
char data[ 256 ];
|
||||
char radix_fmt[ 8 ];
|
||||
unsigned char * virtual;
|
||||
};
|
||||
|
||||
|
||||
/*======================================================================
|
||||
*
|
||||
* FUNCTIONS
|
||||
*
|
||||
*======================================================================*/
|
||||
|
||||
/* Values for flags as passed to various ppc routines */
|
||||
#define F_RADOCTAL 0x1 /* output radix = unsigned octal */
|
||||
#define F_RADUDECIMAL 0x2 /* output radix = unsigned decimal */
|
||||
#define F_RADSDECIMAL 0x4 /* output radix = signed decimal */
|
||||
#define F_RADHEX 0x8 /* output radix = unsigned hex */
|
||||
#define F_SIMPLE 0x10 /* use simplified mnemonics */
|
||||
#define F_SYMBOL 0x20 /* use symbol lookups for addresses */
|
||||
#define F_INSTR 0x40 /* output the raw instruction */
|
||||
#define F_LOCALMEM 0x80 /* retrieve opcodes from local memory
|
||||
rather than from the HMI */
|
||||
#define F_LINENO 0x100 /* show line number info if available */
|
||||
#define F_VALIDONLY 0x200 /* cache: valid entries only */
|
||||
|
||||
/* Values for assembler error codes */
|
||||
#define E_ASM_BAD_OPCODE 1
|
||||
#define E_ASM_NUM_OPERANDS 2
|
||||
#define E_ASM_BAD_REGISTER 3
|
||||
#define E_ASM_BAD_SPR 4
|
||||
#define E_ASM_BAD_TBR 5
|
||||
|
||||
extern int disppc __P((unsigned char *,unsigned char *,int,
|
||||
int (*)(const char *), unsigned long));
|
||||
extern int print_source_line __P((char *,char *,int,
|
||||
int (*pfunc)(const char *)));
|
||||
extern int find_next_address __P((unsigned char *,int,struct pt_regs *));
|
||||
extern int handle_bc __P((struct ppc_ctx *));
|
||||
extern unsigned long asmppc __P((unsigned long,char*,int*));
|
||||
extern char *asm_error_str __P((int));
|
||||
|
||||
/*======================================================================
|
||||
*
|
||||
* GLOBAL VARIABLES
|
||||
*
|
||||
*======================================================================*/
|
||||
|
||||
extern struct operand operands[];
|
||||
extern const unsigned int n_operands;
|
||||
extern struct opcode opcodes[];
|
||||
extern const unsigned int n_opcodes;
|
||||
|
||||
#endif /* _PPC_H */
|
||||
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000 William L. Pitts and W. Gerald Hicks
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are freely
|
||||
* permitted provided that the above copyright notice and this
|
||||
* paragraph and the following disclaimer are duplicated in all
|
||||
* such forms.
|
||||
*
|
||||
* This software is provided "AS IS" and without any express or
|
||||
* implied warranties, including, without limitation, the implied
|
||||
* warranties of merchantability and fitness for a particular
|
||||
* purpose.
|
||||
*/
|
||||
400
include/bedbug/regs.h
Normal file
400
include/bedbug/regs.h
Normal file
@@ -0,0 +1,400 @@
|
||||
/* $Id$ */
|
||||
|
||||
#ifndef _REGS_H
|
||||
#define _REGS_H
|
||||
|
||||
/* Special Purpose Registers */
|
||||
|
||||
#define SPR_CR -1
|
||||
#define SPR_MSR -2
|
||||
|
||||
#define SPR_XER 1
|
||||
#define SPR_LR 8
|
||||
#define SPR_CTR 9
|
||||
#define SPR_DSISR 18
|
||||
#define SPR_DAR 19
|
||||
#define SPR_DEC 22
|
||||
#define SPR_SRR0 26
|
||||
#define SPR_SRR1 27
|
||||
#define SPR_EIE 80
|
||||
#define SPR_EID 81
|
||||
#define SPR_CMPA 144
|
||||
#define SPR_CMPB 145
|
||||
#define SPR_CMPC 146
|
||||
#define SPR_CMPD 147
|
||||
#define SPR_ICR 148
|
||||
#define SPR_DER 149
|
||||
#define SPR_COUNTA 150
|
||||
#define SPR_COUNTB 151
|
||||
#define SPR_CMPE 152
|
||||
#define SPR_CMPF 153
|
||||
#define SPR_CMPG 154
|
||||
#define SPR_CMPH 155
|
||||
#define SPR_LCTRL1 156
|
||||
#define SPR_LCTRL2 157
|
||||
#define SPR_ICTRL 158
|
||||
#define SPR_BAR 159
|
||||
#define SPR_USPRG0 256
|
||||
#define SPR_SPRG4_RO 260
|
||||
#define SPR_SPRG5_RO 261
|
||||
#define SPR_SPRG6_RO 262
|
||||
#define SPR_SPRG7_RO 263
|
||||
#define SPR_SPRG0 272
|
||||
#define SPR_SPRG1 273
|
||||
#define SPR_SPRG2 274
|
||||
#define SPR_SPRG3 275
|
||||
#define SPR_SPRG4 276
|
||||
#define SPR_SPRG5 277
|
||||
#define SPR_SPRG6 278
|
||||
#define SPR_SPRG7 279
|
||||
#define SPR_EAR 282 /* MPC603e core */
|
||||
#define SPR_TBL 284
|
||||
#define SPR_TBU 285
|
||||
#define SPR_PVR 287
|
||||
#define SPR_IC_CST 560
|
||||
#define SPR_IC_ADR 561
|
||||
#define SPR_IC_DAT 562
|
||||
#define SPR_DC_CST 568
|
||||
#define SPR_DC_ADR 569
|
||||
#define SPR_DC_DAT 570
|
||||
#define SPR_DPDR 630
|
||||
#define SPR_IMMR 638
|
||||
#define SPR_MI_CTR 784
|
||||
#define SPR_MI_AP 786
|
||||
#define SPR_MI_EPN 787
|
||||
#define SPR_MI_TWC 789
|
||||
#define SPR_MI_RPN 790
|
||||
#define SPR_MD_CTR 792
|
||||
#define SPR_M_CASID 793
|
||||
#define SPR_MD_AP 794
|
||||
#define SPR_MD_EPN 795
|
||||
#define SPR_M_TWB 796
|
||||
#define SPR_MD_TWC 797
|
||||
#define SPR_MD_RPN 798
|
||||
#define SPR_M_TW 799
|
||||
#define SPR_MI_DBCAM 816
|
||||
#define SPR_MI_DBRAM0 817
|
||||
#define SPR_MI_DBRAM1 818
|
||||
#define SPR_MD_DBCAM 824
|
||||
#define SPR_MD_DBRAM0 825
|
||||
#define SPR_MD_DBRAM1 826
|
||||
#define SPR_ZPR 944
|
||||
#define SPR_PID 945
|
||||
#define SPR_CCR0 947
|
||||
#define SPR_IAC3 948
|
||||
#define SPR_IAC4 949
|
||||
#define SPR_DVC1 950
|
||||
#define SPR_DVC2 951
|
||||
#define SPR_SGR 953
|
||||
#define SPR_DCWR 954
|
||||
#define SPR_SLER 955
|
||||
#define SPR_SU0R 956
|
||||
#define SPR_DBCR1 957
|
||||
#define SPR_ICDBDR 979
|
||||
#define SPR_ESR 980
|
||||
#define SPR_DEAR 981
|
||||
#define SPR_EVPR 982
|
||||
#define SPR_TSR 984
|
||||
#define SPR_TCR 986
|
||||
#define SPR_PIT 987
|
||||
#define SPR_SRR2 990
|
||||
#define SPR_SRR3 991
|
||||
#define SPR_DBSR 1008
|
||||
#define SPR_DBCR0 1010
|
||||
#define SPR_IABR 1010 /* MPC603e core */
|
||||
#define SPR_IAC1 1012
|
||||
#define SPR_IAC2 1013
|
||||
#define SPR_DAC1 1014
|
||||
#define SPR_DAC2 1015
|
||||
#define SPR_DCCR 1018
|
||||
#define SPR_ICCR 1019
|
||||
|
||||
/* Bits for the DBCR0 register */
|
||||
#define DBCR0_EDM 0x80000000
|
||||
#define DBCR0_IDM 0x40000000
|
||||
#define DBCR0_RST 0x30000000
|
||||
#define DBCR0_IC 0x08000000
|
||||
#define DBCR0_BT 0x04000000
|
||||
#define DBCR0_EDE 0x02000000
|
||||
#define DBCR0_TDE 0x01000000
|
||||
#define DBCR0_IA1 0x00800000
|
||||
#define DBCR0_IA2 0x00400000
|
||||
#define DBCR0_IA12 0x00200000
|
||||
#define DBCR0_IA12X 0x00100000
|
||||
#define DBCR0_IA3 0x00080000
|
||||
#define DBCR0_IA4 0x00040000
|
||||
#define DBCR0_IA34 0x00020000
|
||||
#define DBCR0_IA34X 0x00010000
|
||||
#define DBCR0_IA12T 0x00008000
|
||||
#define DBCR0_IA34T 0x00004000
|
||||
#define DBCR0_FT 0x00000001
|
||||
|
||||
/* Bits for the DBCR1 register */
|
||||
#define DBCR1_D1R 0x80000000
|
||||
#define DBCR1_D2R 0x40000000
|
||||
#define DBCR1_D1W 0x20000000
|
||||
#define DBCR1_D2W 0x10000000
|
||||
#define DBCR1_D1S 0x0C000000
|
||||
#define DBCR1_D2S 0x03000000
|
||||
#define DBCR1_DA12 0x00800000
|
||||
#define DBCR1_DA12X 0x00400000
|
||||
#define DBCR1_DV1M 0x000C0000
|
||||
#define DBCR1_DV2M 0x00030000
|
||||
#define DBCR1_DV1BE 0x0000F000
|
||||
#define DBCR1_DV2BE 0x00000F00
|
||||
|
||||
/*
|
||||
* DBSR bits which have conflicting definitions on true Book E versus PPC40x
|
||||
*/
|
||||
#ifdef CONFIG_BOOKE
|
||||
#define DBSR_IA1 0x00800000 /* Instr Address Compare 1 Event */
|
||||
#define DBSR_IA2 0x00400000 /* Instr Address Compare 2 Event */
|
||||
#define DBSR_IA3 0x00200000 /* Instr Address Compare 3 Event */
|
||||
#define DBSR_IA4 0x00100000 /* Instr Address Compare 4 Event */
|
||||
#endif
|
||||
#define DBSR_IA1 0x04000000 /* Instr Address Compare 1 Event */
|
||||
#define DBSR_IA2 0x02000000 /* Instr Address Compare 2 Event */
|
||||
#define DBSR_IA3 0x00080000 /* Instr Address Compare 3 Event */
|
||||
#define DBSR_IA4 0x00040000 /* Instr Address Compare 4 Event */
|
||||
|
||||
struct spr_info {
|
||||
int spr_val;
|
||||
char spr_name[ 10 ];
|
||||
};
|
||||
|
||||
extern struct spr_info spr_map[];
|
||||
extern const unsigned int n_sprs;
|
||||
|
||||
|
||||
#define SET_REGISTER( str, val ) \
|
||||
({ unsigned long __value = (val); \
|
||||
asm volatile( str : : "r" (__value)); \
|
||||
__value; })
|
||||
|
||||
#define GET_REGISTER( str ) \
|
||||
({ unsigned long __value; \
|
||||
asm volatile( str : "=r" (__value) : ); \
|
||||
__value; })
|
||||
|
||||
#define GET_CR() GET_REGISTER( "mfcr %0" )
|
||||
#define SET_CR(val) SET_REGISTER( "mtcr %0", val )
|
||||
#define GET_MSR() GET_REGISTER( "mfmsr %0" )
|
||||
#define SET_MSR(val) SET_REGISTER( "mtmsr %0", val )
|
||||
#define GET_XER() GET_REGISTER( "mfspr %0,1" )
|
||||
#define SET_XER(val) SET_REGISTER( "mtspr 1,%0", val )
|
||||
#define GET_LR() GET_REGISTER( "mfspr %0,8" )
|
||||
#define SET_LR(val) SET_REGISTER( "mtspr 8,%0", val )
|
||||
#define GET_CTR() GET_REGISTER( "mfspr %0,9" )
|
||||
#define SET_CTR(val) SET_REGISTER( "mtspr 9,%0", val )
|
||||
#define GET_DSISR() GET_REGISTER( "mfspr %0,18" )
|
||||
#define SET_DSISR(val) SET_REGISTER( "mtspr 18,%0", val )
|
||||
#define GET_DAR() GET_REGISTER( "mfspr %0,19" )
|
||||
#define SET_DAR(val) SET_REGISTER( "mtspr 19,%0", val )
|
||||
#define GET_DEC() GET_REGISTER( "mfspr %0,22" )
|
||||
#define SET_DEC(val) SET_REGISTER( "mtspr 22,%0", val )
|
||||
#define GET_SRR0() GET_REGISTER( "mfspr %0,26" )
|
||||
#define SET_SRR0(val) SET_REGISTER( "mtspr 26,%0", val )
|
||||
#define GET_SRR1() GET_REGISTER( "mfspr %0,27" )
|
||||
#define SET_SRR1(val) SET_REGISTER( "mtspr 27,%0", val )
|
||||
#define GET_EIE() GET_REGISTER( "mfspr %0,80" )
|
||||
#define SET_EIE(val) SET_REGISTER( "mtspr 80,%0", val )
|
||||
#define GET_EID() GET_REGISTER( "mfspr %0,81" )
|
||||
#define SET_EID(val) SET_REGISTER( "mtspr 81,%0", val )
|
||||
#define GET_CMPA() GET_REGISTER( "mfspr %0,144" )
|
||||
#define SET_CMPA(val) SET_REGISTER( "mtspr 144,%0", val )
|
||||
#define GET_CMPB() GET_REGISTER( "mfspr %0,145" )
|
||||
#define SET_CMPB(val) SET_REGISTER( "mtspr 145,%0", val )
|
||||
#define GET_CMPC() GET_REGISTER( "mfspr %0,146" )
|
||||
#define SET_CMPC(val) SET_REGISTER( "mtspr 146,%0", val )
|
||||
#define GET_CMPD() GET_REGISTER( "mfspr %0,147" )
|
||||
#define SET_CMPD(val) SET_REGISTER( "mtspr 147,%0", val )
|
||||
#define GET_ICR() GET_REGISTER( "mfspr %0,148" )
|
||||
#define SET_ICR(val) SET_REGISTER( "mtspr 148,%0", val )
|
||||
#define GET_DER() GET_REGISTER( "mfspr %0,149" )
|
||||
#define SET_DER(val) SET_REGISTER( "mtspr 149,%0", val )
|
||||
#define GET_COUNTA() GET_REGISTER( "mfspr %0,150" )
|
||||
#define SET_COUNTA(val) SET_REGISTER( "mtspr 150,%0", val )
|
||||
#define GET_COUNTB() GET_REGISTER( "mfspr %0,151" )
|
||||
#define SET_COUNTB(val) SET_REGISTER( "mtspr 151,%0", val )
|
||||
#define GET_CMPE() GET_REGISTER( "mfspr %0,152" )
|
||||
#define SET_CMPE(val) SET_REGISTER( "mtspr 152,%0", val )
|
||||
#define GET_CMPF() GET_REGISTER( "mfspr %0,153" )
|
||||
#define SET_CMPF(val) SET_REGISTER( "mtspr 153,%0", val )
|
||||
#define GET_CMPG() GET_REGISTER( "mfspr %0,154" )
|
||||
#define SET_CMPG(val) SET_REGISTER( "mtspr 154,%0", val )
|
||||
#define GET_CMPH() GET_REGISTER( "mfspr %0,155" )
|
||||
#define SET_CMPH(val) SET_REGISTER( "mtspr 155,%0", val )
|
||||
#define GET_LCTRL1() GET_REGISTER( "mfspr %0,156" )
|
||||
#define SET_LCTRL1(val) SET_REGISTER( "mtspr 156,%0", val )
|
||||
#define GET_LCTRL2() GET_REGISTER( "mfspr %0,157" )
|
||||
#define SET_LCTRL2(val) SET_REGISTER( "mtspr 157,%0", val )
|
||||
#define GET_ICTRL() GET_REGISTER( "mfspr %0,158" )
|
||||
#define SET_ICTRL(val) SET_REGISTER( "mtspr 158,%0", val )
|
||||
#define GET_BAR() GET_REGISTER( "mfspr %0,159" )
|
||||
#define SET_BAR(val) SET_REGISTER( "mtspr 159,%0", val )
|
||||
#define GET_USPRG0() GET_REGISTER( "mfspr %0,256" )
|
||||
#define SET_USPRG0(val) SET_REGISTER( "mtspr 256,%0", val )
|
||||
#define GET_SPRG4_RO() GET_REGISTER( "mfspr %0,260" )
|
||||
#define SET_SPRG4_RO(val) SET_REGISTER( "mtspr 260,%0", val )
|
||||
#define GET_SPRG5_RO() GET_REGISTER( "mfspr %0,261" )
|
||||
#define SET_SPRG5_RO(val) SET_REGISTER( "mtspr 261,%0", val )
|
||||
#define GET_SPRG6_RO() GET_REGISTER( "mfspr %0,262" )
|
||||
#define SET_SPRG6_RO(val) SET_REGISTER( "mtspr 262,%0", val )
|
||||
#define GET_SPRG7_RO() GET_REGISTER( "mfspr %0,263" )
|
||||
#define SET_SPRG7_RO(val) SET_REGISTER( "mtspr 263,%0", val )
|
||||
#define GET_SPRG0() GET_REGISTER( "mfspr %0,272" )
|
||||
#define SET_SPRG0(val) SET_REGISTER( "mtspr 272,%0", val )
|
||||
#define GET_SPRG1() GET_REGISTER( "mfspr %0,273" )
|
||||
#define SET_SPRG1(val) SET_REGISTER( "mtspr 273,%0", val )
|
||||
#define GET_SPRG2() GET_REGISTER( "mfspr %0,274" )
|
||||
#define SET_SPRG2(val) SET_REGISTER( "mtspr 274,%0", val )
|
||||
#define GET_SPRG3() GET_REGISTER( "mfspr %0,275" )
|
||||
#define SET_SPRG3(val) SET_REGISTER( "mtspr 275,%0", val )
|
||||
#define GET_SPRG4() GET_REGISTER( "mfspr %0,276" )
|
||||
#define SET_SPRG4(val) SET_REGISTER( "mtspr 276,%0", val )
|
||||
#define GET_SPRG5() GET_REGISTER( "mfspr %0,277" )
|
||||
#define SET_SPRG5(val) SET_REGISTER( "mtspr 277,%0", val )
|
||||
#define GET_SPRG6() GET_REGISTER( "mfspr %0,278" )
|
||||
#define SET_SPRG6(val) SET_REGISTER( "mtspr 278,%0", val )
|
||||
#define GET_SPRG7() GET_REGISTER( "mfspr %0,279" )
|
||||
#define SET_SPRG7(val) SET_REGISTER( "mtspr 279,%0", val )
|
||||
#define GET_EAR() GET_REGISTER( "mfspr %0,282" )
|
||||
#define SET_EAR(val) SET_REGISTER( "mtspr 282,%0", val )
|
||||
#define GET_TBL() GET_REGISTER( "mfspr %0,284" )
|
||||
#define SET_TBL(val) SET_REGISTER( "mtspr 284,%0", val )
|
||||
#define GET_TBU() GET_REGISTER( "mfspr %0,285" )
|
||||
#define SET_TBU(val) SET_REGISTER( "mtspr 285,%0", val )
|
||||
#define GET_PVR() GET_REGISTER( "mfspr %0,287" )
|
||||
#define SET_PVR(val) SET_REGISTER( "mtspr 287,%0", val )
|
||||
#define GET_IC_CST() GET_REGISTER( "mfspr %0,560" )
|
||||
#define SET_IC_CST(val) SET_REGISTER( "mtspr 560,%0", val )
|
||||
#define GET_IC_ADR() GET_REGISTER( "mfspr %0,561" )
|
||||
#define SET_IC_ADR(val) SET_REGISTER( "mtspr 561,%0", val )
|
||||
#define GET_IC_DAT() GET_REGISTER( "mfspr %0,562" )
|
||||
#define SET_IC_DAT(val) SET_REGISTER( "mtspr 562,%0", val )
|
||||
#define GET_DC_CST() GET_REGISTER( "mfspr %0,568" )
|
||||
#define SET_DC_CST(val) SET_REGISTER( "mtspr 568,%0", val )
|
||||
#define GET_DC_ADR() GET_REGISTER( "mfspr %0,569" )
|
||||
#define SET_DC_ADR(val) SET_REGISTER( "mtspr 569,%0", val )
|
||||
#define GET_DC_DAT() GET_REGISTER( "mfspr %0,570" )
|
||||
#define SET_DC_DAT(val) SET_REGISTER( "mtspr 570,%0", val )
|
||||
#define GET_DPDR() GET_REGISTER( "mfspr %0,630" )
|
||||
#define SET_DPDR(val) SET_REGISTER( "mtspr 630,%0", val )
|
||||
#define GET_IMMR() GET_REGISTER( "mfspr %0,638" )
|
||||
#define SET_IMMR(val) SET_REGISTER( "mtspr 638,%0", val )
|
||||
#define GET_MI_CTR() GET_REGISTER( "mfspr %0,784" )
|
||||
#define SET_MI_CTR(val) SET_REGISTER( "mtspr 784,%0", val )
|
||||
#define GET_MI_AP() GET_REGISTER( "mfspr %0,786" )
|
||||
#define SET_MI_AP(val) SET_REGISTER( "mtspr 786,%0", val )
|
||||
#define GET_MI_EPN() GET_REGISTER( "mfspr %0,787" )
|
||||
#define SET_MI_EPN(val) SET_REGISTER( "mtspr 787,%0", val )
|
||||
#define GET_MI_TWC() GET_REGISTER( "mfspr %0,789" )
|
||||
#define SET_MI_TWC(val) SET_REGISTER( "mtspr 789,%0", val )
|
||||
#define GET_MI_RPN() GET_REGISTER( "mfspr %0,790" )
|
||||
#define SET_MI_RPN(val) SET_REGISTER( "mtspr 790,%0", val )
|
||||
#define GET_MD_CTR() GET_REGISTER( "mfspr %0,792" )
|
||||
#define SET_MD_CTR(val) SET_REGISTER( "mtspr 792,%0", val )
|
||||
#define GET_M_CASID() GET_REGISTER( "mfspr %0,793" )
|
||||
#define SET_M_CASID(val) SET_REGISTER( "mtspr 793,%0", val )
|
||||
#define GET_MD_AP() GET_REGISTER( "mfspr %0,794" )
|
||||
#define SET_MD_AP(val) SET_REGISTER( "mtspr ,794%0", val )
|
||||
#define GET_MD_EPN() GET_REGISTER( "mfspr %0,795" )
|
||||
#define SET_MD_EPN(val) SET_REGISTER( "mtspr 795,%0", val )
|
||||
#define GET_M_TWB() GET_REGISTER( "mfspr %0,796" )
|
||||
#define SET_M_TWB(val) SET_REGISTER( "mtspr 796,%0", val )
|
||||
#define GET_MD_TWC() GET_REGISTER( "mfspr %0,797" )
|
||||
#define SET_MD_TWC(val) SET_REGISTER( "mtspr 797,%0", val )
|
||||
#define GET_MD_RPN() GET_REGISTER( "mfspr %0,798" )
|
||||
#define SET_MD_RPN(val) SET_REGISTER( "mtspr 798,%0", val )
|
||||
#define GET_M_TW() GET_REGISTER( "mfspr %0,799" )
|
||||
#define SET_M_TW(val) SET_REGISTER( "mtspr 799,%0", val )
|
||||
#define GET_MI_DBCAM() GET_REGISTER( "mfspr %0,816" )
|
||||
#define SET_MI_DBCAM(val) SET_REGISTER( "mtspr 816,%0", val )
|
||||
#define GET_MI_DBRAM0() GET_REGISTER( "mfspr %0,817" )
|
||||
#define SET_MI_DBRAM0(val) SET_REGISTER( "mtspr 817,%0", val )
|
||||
#define GET_MI_DBRAM1() GET_REGISTER( "mfspr %0,818" )
|
||||
#define SET_MI_DBRAM1(val) SET_REGISTER( "mtspr 818,%0", val )
|
||||
#define GET_MD_DBCAM() GET_REGISTER( "mfspr %0,824" )
|
||||
#define SET_MD_DBCA(val) SET_REGISTER( "mtspr 824,%0", val )
|
||||
#define GET_MD_DBRAM0() GET_REGISTER( "mfspr %0,825" )
|
||||
#define SET_MD_DBRAM0(val) SET_REGISTER( "mtspr 825,%0", val )
|
||||
#define GET_MD_DBRAM1() GET_REGISTER( "mfspr %0,826" )
|
||||
#define SET_MD_DBRAM1(val) SET_REGISTER( "mtspr 826,%0", val )
|
||||
#define GET_ZPR() GET_REGISTER( "mfspr %0,944" )
|
||||
#define SET_ZPR(val) SET_REGISTER( "mtspr 944,%0", val )
|
||||
#define GET_PID() GET_REGISTER( "mfspr %0,945" )
|
||||
#define SET_PID(val) SET_REGISTER( "mtspr 945,%0", val )
|
||||
#define GET_CCR0() GET_REGISTER( "mfspr %0,947" )
|
||||
#define SET_CCR0(val) SET_REGISTER( "mtspr 947,%0", val )
|
||||
#define GET_IAC3() GET_REGISTER( "mfspr %0,948" )
|
||||
#define SET_IAC3(val) SET_REGISTER( "mtspr 948,%0", val )
|
||||
#define GET_IAC4() GET_REGISTER( "mfspr %0,949" )
|
||||
#define SET_IAC4(val) SET_REGISTER( "mtspr 949,%0", val )
|
||||
#define GET_DVC1() GET_REGISTER( "mfspr %0,950" )
|
||||
#define SET_DVC1(val) SET_REGISTER( "mtspr 950,%0", val )
|
||||
#define GET_DVC2() GET_REGISTER( "mfspr %0,951" )
|
||||
#define SET_DVC2(val) SET_REGISTER( "mtspr 951,%0", val )
|
||||
#define GET_SGR() GET_REGISTER( "mfspr %0,953" )
|
||||
#define SET_SGR(val) SET_REGISTER( "mtspr 953,%0", val )
|
||||
#define GET_DCWR() GET_REGISTER( "mfspr %0,954" )
|
||||
#define SET_DCWR(val) SET_REGISTER( "mtspr 954,%0", val )
|
||||
#define GET_SLER() GET_REGISTER( "mfspr %0,955" )
|
||||
#define SET_SLER(val) SET_REGISTER( "mtspr 955,%0", val )
|
||||
#define GET_SU0R() GET_REGISTER( "mfspr %0,956" )
|
||||
#define SET_SU0R(val) SET_REGISTER( "mtspr 956,%0", val )
|
||||
#define GET_DBCR1() GET_REGISTER( "mfspr %0,957" )
|
||||
#define SET_DBCR1(val) SET_REGISTER( "mtspr 957,%0", val )
|
||||
#define GET_ICDBDR() GET_REGISTER( "mfspr %0,979" )
|
||||
#define SET_ICDBDR(val) SET_REGISTER( "mtspr 979,%0", val )
|
||||
#define GET_ESR() GET_REGISTER( "mfspr %0,980" )
|
||||
#define SET_ESR(val) SET_REGISTER( "mtspr 980,%0", val )
|
||||
#define GET_DEAR() GET_REGISTER( "mfspr %0,981" )
|
||||
#define SET_DEAR(val) SET_REGISTER( "mtspr 981,%0", val )
|
||||
#define GET_EVPR() GET_REGISTER( "mfspr %0,982" )
|
||||
#define SET_EVPR(val) SET_REGISTER( "mtspr 982,%0", val )
|
||||
#define GET_TSR() GET_REGISTER( "mfspr %0,984" )
|
||||
#define SET_TSR(val) SET_REGISTER( "mtspr 984,%0", val )
|
||||
#define GET_TCR() GET_REGISTER( "mfspr %0,986" )
|
||||
#define SET_TCR(val) SET_REGISTER( "mtspr 986,%0", val )
|
||||
#define GET_PIT() GET_REGISTER( "mfspr %0,987" )
|
||||
#define SET_PIT(val) SET_REGISTER( "mtspr 987,%0", val )
|
||||
#define GET_SRR2() GET_REGISTER( "mfspr %0,990" )
|
||||
#define SET_SRR2(val) SET_REGISTER( "mtspr 990,%0", val )
|
||||
#define GET_SRR3() GET_REGISTER( "mfspr %0,991" )
|
||||
#define SET_SRR3(val) SET_REGISTER( "mtspr 991,%0", val )
|
||||
#define GET_DBSR() GET_REGISTER( "mfspr %0,1008" )
|
||||
#define SET_DBSR(val) SET_REGISTER( "mtspr 1008,%0", val )
|
||||
#define GET_DBCR0() GET_REGISTER( "mfspr %0,1010" )
|
||||
#define SET_DBCR0(val) SET_REGISTER( "mtspr 1010,%0", val )
|
||||
#define GET_IABR() GET_REGISTER( "mfspr %0,1010" )
|
||||
#define SET_IABR(val) SET_REGISTER( "mtspr 1010,%0", val )
|
||||
#define GET_IAC1() GET_REGISTER( "mfspr %0,1012" )
|
||||
#define SET_IAC1(val) SET_REGISTER( "mtspr 1012,%0", val )
|
||||
#define GET_IAC2() GET_REGISTER( "mfspr %0,1013" )
|
||||
#define SET_IAC2(val) SET_REGISTER( "mtspr 1013,%0", val )
|
||||
#define GET_DAC1() GET_REGISTER( "mfspr %0,1014" )
|
||||
#define SET_DAC1(val) SET_REGISTER( "mtspr 1014,%0", val )
|
||||
#define GET_DAC2() GET_REGISTER( "mfspr %0,1015" )
|
||||
#define SET_DAC2(val) SET_REGISTER( "mtspr 1015,%0", val )
|
||||
#define GET_DCCR() GET_REGISTER( "mfspr %0,1018" )
|
||||
#define SET_DCCR(val) SET_REGISTER( "mtspr 1018,%0", val )
|
||||
#define GET_ICCR() GET_REGISTER( "mfspr %0,1019" )
|
||||
#define SET_ICCR(val) SET_REGISTER( "mtspr 1019,%0", val )
|
||||
|
||||
#endif /* _REGS_H */
|
||||
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000 William L. Pitts and W. Gerald Hicks
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are freely
|
||||
* permitted provided that the above copyright notice and this
|
||||
* paragraph and the following disclaimer are duplicated in all
|
||||
* such forms.
|
||||
*
|
||||
* This software is provided "AS IS" and without any express or
|
||||
* implied warranties, including, without limitation, the implied
|
||||
* warranties of merchantability and fitness for a particular
|
||||
* purpose.
|
||||
*/
|
||||
601
include/bedbug/tables.h
Normal file
601
include/bedbug/tables.h
Normal file
@@ -0,0 +1,601 @@
|
||||
/* $Id$ */
|
||||
|
||||
#ifndef TABLES_H
|
||||
#define TABLES_H
|
||||
|
||||
/* This is only included by common/bedbug.c, and depends on the following
|
||||
* files to already be included
|
||||
* common.h
|
||||
* bedbug/bedbug.h
|
||||
* bedbug/ppc.h
|
||||
* bedbug/regs.h
|
||||
*/
|
||||
|
||||
struct operand operands[] = {
|
||||
/*Field Name Bits Shift Hint Position */
|
||||
/*----- ------ ----- ----- ---- ------------ */
|
||||
{ O_AA, "O_AA", 1, 1, OH_SILENT }, /* 30 */
|
||||
{ O_BD, "O_BD", 14, 2, OH_ADDR }, /* 16-29 */
|
||||
{ O_BI, "O_BI", 5, 16, 0 }, /* 11-15 */
|
||||
{ O_BO, "O_BO", 5, 21, 0 }, /* 6-10 */
|
||||
{ O_crbD, "O_crbD", 5, 21, 0 }, /* 6-10 */
|
||||
{ O_crbA, "O_crbA", 5, 16, 0 }, /* 11-15 */
|
||||
{ O_crbB, "O_crbB", 5, 11, 0 }, /* 16-20 */
|
||||
{ O_CRM, "O_CRM", 8, 12, 0 }, /* 12-19 */
|
||||
{ O_d, "O_d", 15, 0, OH_OFFSET }, /* 16-31 */
|
||||
{ O_frC, "O_frC", 5, 6, 0 }, /* 21-25 */
|
||||
{ O_frD, "O_frD", 5, 21, 0 }, /* 6-10 */
|
||||
{ O_frS, "O_frS", 5, 21, 0 }, /* 6-10 */
|
||||
{ O_IMM, "O_IMM", 4, 12, 0 }, /* 16-19 */
|
||||
{ O_LI, "O_LI", 24, 2, OH_ADDR }, /* 6-29 */
|
||||
{ O_LK, "O_LK", 1, 0, OH_SILENT }, /* 31 */
|
||||
{ O_MB, "O_MB", 5, 6, 0 }, /* 21-25 */
|
||||
{ O_ME, "O_ME", 5, 1, 0 }, /* 26-30 */
|
||||
{ O_NB, "O_NB", 5, 11, 0 }, /* 16-20 */
|
||||
{ O_OE, "O_OE", 1, 10, OH_SILENT }, /* 21 */
|
||||
{ O_rA, "O_rA", 5, 16, OH_REG }, /* 11-15 */
|
||||
{ O_rB, "O_rB", 5, 11, OH_REG }, /* 16-20 */
|
||||
{ O_Rc, "O_Rc", 1, 0, OH_SILENT }, /* 31 */
|
||||
{ O_rD, "O_rD", 5, 21, OH_REG }, /* 6-10 */
|
||||
{ O_rS, "O_rS", 5, 21, OH_REG }, /* 6-10 */
|
||||
{ O_SH, "O_SH", 5, 11, 0 }, /* 16-20 */
|
||||
{ O_SIMM, "O_SIMM", 16, 0, 0 }, /* 16-31 */
|
||||
{ O_SR, "O_SR", 4, 16, 0 }, /* 12-15 */
|
||||
{ O_TO, "O_TO", 5, 21, 0 }, /* 6-10 */
|
||||
{ O_UIMM, "O_UIMM", 16, 0, 0 }, /* 16-31 */
|
||||
{ O_crfD, "O_crfD", 3, 23, 0 }, /* 6- 8 */
|
||||
{ O_crfS, "O_crfS", 3, 18, 0 }, /* 11-13 */
|
||||
{ O_L, "O_L", 1, 21, 0 }, /* 10 */
|
||||
{ O_spr, "O_spr", 10, 11, OH_SPR }, /* 11-20 */
|
||||
{ O_tbr, "O_tbr", 10, 11, OH_TBR }, /* 11-20 */
|
||||
{ O_cr2, "O_cr2", 0, 0, OH_LITERAL }, /* "cr2" */
|
||||
};
|
||||
|
||||
const unsigned int n_operands = sizeof(operands) / sizeof(operands[0]);
|
||||
|
||||
/* A note about the fields array in the opcodes structure:
|
||||
The operands are listed in the order they appear in the output.
|
||||
|
||||
This table is arranged in numeric order of the opcode. Note that some
|
||||
opcodes have defined bits in odd places so not all forms of a command
|
||||
will be in the same place. This is done so that a binary search can be
|
||||
done to find the opcodes. Note that table D.2 in the MPC860 User's
|
||||
Manual "Instructions Sorted by Opcode" does not account for these
|
||||
bit locations */
|
||||
|
||||
struct opcode opcodes[] = {
|
||||
{ D_OPCODE(3), D_MASK, {O_TO, O_rA, O_SIMM, 0},
|
||||
0, "twi", 0 },
|
||||
{ D_OPCODE(7), D_MASK, {O_rD, O_rA, O_SIMM, 0},
|
||||
0, "mulli", 0 },
|
||||
{ D_OPCODE(8), D_MASK, {O_rD, O_rA, O_SIMM, 0},
|
||||
0, "subfic", 0 },
|
||||
{ D_OPCODE(10), D_MASK, {O_crfD, O_L, O_rA, O_UIMM, 0},
|
||||
0, "cmpli", 0 },
|
||||
{ D_OPCODE(11), D_MASK, {O_crfD, O_L, O_rA, O_SIMM, 0},
|
||||
0, "cmpi", 0 },
|
||||
{ D_OPCODE(12), D_MASK, {O_rD, O_rA, O_SIMM, 0},
|
||||
0, "addic", 0 },
|
||||
{ D_OPCODE(13), D_MASK, {O_rD, O_rA, O_SIMM, 0},
|
||||
0, "addic.", 0 },
|
||||
{ D_OPCODE(14), D_MASK, {O_rD, O_rA, O_SIMM, 0},
|
||||
0, "addi", H_RA0_IS_0 },
|
||||
{ D_OPCODE(15), D_MASK, {O_rD, O_rA, O_SIMM, 0},
|
||||
0, "addis", H_RA0_IS_0|H_IMM_HIGH },
|
||||
{ B_OPCODE(16,0,0), B_MASK, {O_BO, O_BI, O_BD, O_AA, O_LK, 0},
|
||||
handle_bc, "bc", H_RELATIVE },
|
||||
{ B_OPCODE(16,0,1), B_MASK, {O_BO, O_BI, O_BD, O_AA, O_LK, 0},
|
||||
0, "bcl", H_RELATIVE },
|
||||
{ B_OPCODE(16,1,0), B_MASK, {O_BO, O_BI, O_BD, O_AA, O_LK, 0},
|
||||
0, "bca", 0 },
|
||||
{ B_OPCODE(16,1,1), B_MASK, {O_BO, O_BI, O_BD, O_AA, O_LK, 0},
|
||||
0, "bcla", 0 },
|
||||
{ SC_OPCODE(17), SC_MASK, {0},
|
||||
0, "sc", 0 },
|
||||
{ I_OPCODE(18,0,0), I_MASK, {O_LI, O_AA, O_LK, 0},
|
||||
0, "b", H_RELATIVE },
|
||||
{ I_OPCODE(18,0,1), I_MASK, {O_LI, O_AA, O_LK, 0},
|
||||
0, "bl", H_RELATIVE },
|
||||
{ I_OPCODE(18,1,0), I_MASK, {O_LI, O_AA, O_LK, 0},
|
||||
0, "ba", 0 },
|
||||
{ I_OPCODE(18,1,1), I_MASK, {O_LI, O_AA, O_LK, 0},
|
||||
0, "bla", 0 },
|
||||
{ XL_OPCODE(19,0,0), XL_MASK, {O_crfD, O_crfS},
|
||||
0, "mcrf", 0 },
|
||||
{ XL_OPCODE(19,16,0), XL_MASK, {O_BO, O_BI, O_LK, 0},
|
||||
0, "bclr", 0 },
|
||||
{ XL_OPCODE(19,16,1), XL_MASK, {O_BO, O_BI, O_LK, 0},
|
||||
0, "bclrl", 0 },
|
||||
{ XL_OPCODE(19,33,0), XL_MASK, {O_crbD, O_crbA, O_crbB, 0},
|
||||
0, "crnor", 0 },
|
||||
{ XL_OPCODE(19,50,0), XL_MASK, {0},
|
||||
0, "rfi", 0 },
|
||||
{ XL_OPCODE(19,129,0), XL_MASK, {O_crbD, O_crbA, O_crbB, 0},
|
||||
0, "crandc", 0 },
|
||||
{ XL_OPCODE(19,150,0), XL_MASK, {0},
|
||||
0, "isync", 0 },
|
||||
{ XL_OPCODE(19,193,0), XL_MASK, {O_crbD, O_crbA, O_crbB, 0},
|
||||
0, "crxor", 0 },
|
||||
{ XL_OPCODE(19,225,0), XL_MASK, {O_crbD, O_crbA, O_crbB, 0},
|
||||
0, "crnand", 0 },
|
||||
{ XL_OPCODE(19,257,0), XL_MASK, {O_crbD, O_crbA, O_crbB, 0},
|
||||
0, "crand", 0 },
|
||||
{ XL_OPCODE(19,289,0), XL_MASK, {O_crbD, O_crbA, O_crbB, 0},
|
||||
0, "creqv", 0 },
|
||||
{ XL_OPCODE(19,417,0), XL_MASK, {O_crbD, O_crbA, O_crbB, 0},
|
||||
0, "crorc", 0 },
|
||||
{ XL_OPCODE(19,449,0), XL_MASK, {O_crbD, O_crbA, O_crbB, 0},
|
||||
0, "cror", 0 },
|
||||
{ XL_OPCODE(19,528,0), XL_MASK, {O_BO, O_BI, O_LK, 0},
|
||||
0, "bcctr", 0 },
|
||||
{ XL_OPCODE(19,528,1), XL_MASK, {O_BO, O_BI, O_LK, 0},
|
||||
0, "bcctrl", 0 },
|
||||
{ M_OPCODE(20,0), M_MASK, {O_rA, O_rS, O_SH, O_MB, O_ME, O_Rc, 0},
|
||||
0, "rlwimi", 0 },
|
||||
{ M_OPCODE(20,1), M_MASK, {O_rA, O_rS, O_SH, O_MB, O_ME, O_Rc, 0},
|
||||
0, "rlwimi.", 0 },
|
||||
{ M_OPCODE(21,0), M_MASK, {O_rA, O_rS, O_SH, O_MB, O_ME, O_Rc, 0},
|
||||
0, "rlwinm", 0 },
|
||||
{ M_OPCODE(21,1), M_MASK, {O_rA, O_rS, O_SH, O_MB, O_ME, O_Rc, 0},
|
||||
0, "rlwinm.", 0 },
|
||||
{ M_OPCODE(23,0), M_MASK, {O_rA, O_rS, O_rB, O_MB, O_ME, O_Rc, 0},
|
||||
0, "rlwnm", 0 },
|
||||
{ M_OPCODE(23,1), M_MASK, {O_rA, O_rS, O_rB, O_MB, O_ME, O_Rc, 0},
|
||||
0, "rlwnm.", 0 },
|
||||
{ D_OPCODE(24), D_MASK, {O_rA, O_rS, O_UIMM, 0},
|
||||
0, "ori", 0 },
|
||||
{ D_OPCODE(25), D_MASK, {O_rA, O_rS, O_UIMM, 0},
|
||||
0, "oris", H_IMM_HIGH },
|
||||
{ D_OPCODE(26), D_MASK, {O_rA, O_rS, O_UIMM, 0},
|
||||
0, "xori", 0 },
|
||||
{ D_OPCODE(27), D_MASK, {O_rA, O_rS, O_UIMM, 0},
|
||||
0, "xoris", H_IMM_HIGH },
|
||||
{ D_OPCODE(28), D_MASK, {O_rA, O_rS, O_UIMM, 0},
|
||||
0, "andi.", 0 },
|
||||
{ D_OPCODE(29), D_MASK, {O_rA, O_rS, O_UIMM, 0},
|
||||
0, "andis.", H_IMM_HIGH },
|
||||
{ X_OPCODE(31,0,0), X_MASK, {O_crfD, O_L, O_rA, O_rB, 0},
|
||||
0, "cmp", 0 },
|
||||
{ X_OPCODE(31,4,0), X_MASK, {O_TO, O_rA, O_rB, 0},
|
||||
0, "tw", 0 },
|
||||
{ XO_OPCODE(31,8,0,0), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "subfc", 0 },
|
||||
{ XO_OPCODE(31,8,0,1), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "subfc.", 0 },
|
||||
{ XO_OPCODE(31,10,0,0), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "addc", 0 },
|
||||
{ XO_OPCODE(31,10,0,1), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "addc.", 0 },
|
||||
{ XO_OPCODE(31,11,0,0), XO_MASK, {O_rD, O_rA, O_rB, O_Rc, 0},
|
||||
0, "mulhwu", 0 },
|
||||
{ XO_OPCODE(31,11,0,1), XO_MASK, {O_rD, O_rA, O_rB, O_Rc, 0},
|
||||
0, "mulhwu.", 0 },
|
||||
{ X_OPCODE(31,19,0), X_MASK, {O_rD, 0},
|
||||
0, "mfcr", 0 },
|
||||
{ X_OPCODE(31,20,0), X_MASK, {O_rD, O_rA, O_rB, 0},
|
||||
0, "lwarx", H_RA0_IS_0 },
|
||||
{ X_OPCODE(31,23,0), X_MASK, {O_rD, O_rA, O_rB, 0},
|
||||
0, "lwzx", H_RA0_IS_0 },
|
||||
{ X_OPCODE(31,24,0), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "slw", 0 },
|
||||
{ X_OPCODE(31,24,1), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "slw.", 0 },
|
||||
{ X_OPCODE(31,26,0), X_MASK, {O_rA, O_rS, O_Rc, 0 },
|
||||
0, "cntlzw", 0 },
|
||||
{ X_OPCODE(31,26,1), X_MASK, {O_rA, O_rS, O_Rc, 0},
|
||||
0, "cntlzw.", 0 },
|
||||
{ X_OPCODE(31,28,0), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "and", 0 },
|
||||
{ X_OPCODE(31,28,1), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "and.", 0 },
|
||||
{ X_OPCODE(31,32,0), X_MASK, {O_crfD, O_L, O_rA, O_rB, 0},
|
||||
0, "cmpl", 0 },
|
||||
{ XO_OPCODE(31,40,0,0), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "subf", 0 },
|
||||
{ XO_OPCODE(31,40,0,1), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "subf.", 0 },
|
||||
{ X_OPCODE(31,54,0), X_MASK, {O_rA, O_rB, 0},
|
||||
0, "dcbst", H_RA0_IS_0 },
|
||||
{ X_OPCODE(31,55,0), X_MASK, {O_rD, O_rA, O_rB, 0},
|
||||
0, "lwzux", 0 },
|
||||
{ X_OPCODE(31,60,0), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "andc", 0 },
|
||||
{ X_OPCODE(31,60,1), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "andc.", 0 },
|
||||
{ XO_OPCODE(31,75,0,0), XO_MASK, {O_rD, O_rA, O_rB, O_Rc, 0},
|
||||
0, "mulhw", 0 },
|
||||
{ XO_OPCODE(31,75,0,1), XO_MASK, {O_rD, O_rA, O_rB, O_Rc, 0},
|
||||
0, "mulhw.", 0 },
|
||||
{ X_OPCODE(31,83,0), X_MASK, {O_rD, 0},
|
||||
0, "mfmsr", 0 },
|
||||
{ X_OPCODE(31,86,0), X_MASK, {O_rA, O_rB, 0},
|
||||
0, "dcbf", H_RA0_IS_0 },
|
||||
{ X_OPCODE(31,87,0), X_MASK, {O_rD, O_rA, O_rB, 0},
|
||||
0, "lbzx", H_RA0_IS_0 },
|
||||
{ XO_OPCODE(31,104,0,0), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "neg", 0 },
|
||||
{ XO_OPCODE(31,104,0,1), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "neg.", 0 },
|
||||
{ X_OPCODE(31,119,0), X_MASK, {O_rD, O_rA, O_rB, 0},
|
||||
0, "lbzux", 0 },
|
||||
{ X_OPCODE(31,124,0), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "nor", 0 },
|
||||
{ X_OPCODE(31,124,1), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "nor.", 0 },
|
||||
{ XO_OPCODE(31,136,0,0), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "subfe", 0 },
|
||||
{ XO_OPCODE(31,136,0,1), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "subfe.", 0 },
|
||||
{ XO_OPCODE(31,138,0,0), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "adde", 0 },
|
||||
{ XO_OPCODE(31,138,0,1), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "adde.", 0 },
|
||||
{ XFX_OPCODE(31,144,0), XFX_MASK, {O_CRM, O_rS, 0},
|
||||
0, "mtcrf", 0 },
|
||||
{ X_OPCODE(31,146,0), X_MASK, {O_rS, 0},
|
||||
0, "mtmsr", 0 },
|
||||
{ X_OPCODE(31,150,1), X_MASK, {O_rS, O_rA, O_rB, 0},
|
||||
0, "stwcx.", 0 },
|
||||
{ X_OPCODE(31,151,0), X_MASK, {O_rS, O_rA, O_rB, 0},
|
||||
0, "stwx", 0 },
|
||||
{ X_OPCODE(31,183,0), X_MASK, {O_rS, O_rA, O_rB, 0},
|
||||
0, "stwux", 0 },
|
||||
{ XO_OPCODE(31,200,0,0), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "subfze", 0 },
|
||||
{ XO_OPCODE(31,200,0,1), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "subfze.", 0 },
|
||||
{ XO_OPCODE(31,202,0,0), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "addze", 0 },
|
||||
{ XO_OPCODE(31,202,0,1), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "addze.", 0 },
|
||||
{ X_OPCODE(31,210,0), X_MASK, {O_SR, O_rS, 0},
|
||||
0, "mtsr", 0 },
|
||||
{ X_OPCODE(31,215,0), X_MASK, {O_rS, O_rA, O_rB, 0},
|
||||
0, "stbx", H_RA0_IS_0 },
|
||||
{ XO_OPCODE(31,232,0,0), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "subfme", 0 },
|
||||
{ XO_OPCODE(31,232,0,1), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "subfme.", 0 },
|
||||
{ XO_OPCODE(31,234,0,0), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "addme", 0 },
|
||||
{ XO_OPCODE(31,234,0,1), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "addme.", 0 },
|
||||
{ XO_OPCODE(31,235,0,0), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "mullw", 0 },
|
||||
{ XO_OPCODE(31,235,0,1), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "mullw.", 0 },
|
||||
{ X_OPCODE(31,242,0), X_MASK, {O_rS, O_rB, 0},
|
||||
0, "mtsrin", 0 },
|
||||
{ X_OPCODE(31,246,0), X_MASK, {O_rA, O_rB, 0},
|
||||
0, "dcbtst", H_RA0_IS_0 },
|
||||
{ X_OPCODE(31,247,0), X_MASK, {O_rS, O_rA, O_rB, 0},
|
||||
0, "stbux", 0 },
|
||||
{ XO_OPCODE(31,266,0,0), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "add", 0 },
|
||||
{ XO_OPCODE(31,266,0,1), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "add.", 0 },
|
||||
{ X_OPCODE(31,278,0), X_MASK, {O_rA, O_rB, 0},
|
||||
0, "dcbt", H_RA0_IS_0 },
|
||||
{ X_OPCODE(31,279,0), X_MASK, {O_rD, O_rA, O_rB, 0},
|
||||
0, "lhzx", H_RA0_IS_0 },
|
||||
{ X_OPCODE(31,284,0), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "eqv", 0 },
|
||||
{ X_OPCODE(31,284,1), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "eqv.", 0 },
|
||||
{ X_OPCODE(31,306,0), X_MASK, {O_rB, 0},
|
||||
0, "tlbie", 0 },
|
||||
{ X_OPCODE(31,310,0), X_MASK, {O_rD, O_rA, O_rB, 0},
|
||||
0, "eciwx", H_RA0_IS_0 },
|
||||
{ X_OPCODE(31,311,0), X_MASK, {O_rD, O_rA, O_rB, 0},
|
||||
0, "lhzux", 0 },
|
||||
{ X_OPCODE(31,316,0), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "xor", 0 },
|
||||
{ X_OPCODE(31,316,1), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "xor.", 0 },
|
||||
{ XFX_OPCODE(31,339,0), XFX_MASK, {O_rD, O_spr, 0},
|
||||
0, "mfspr", 0 },
|
||||
{ X_OPCODE(31,343,0), X_MASK, {O_rD, O_rA, O_rB, 0},
|
||||
0, "lhax", H_RA0_IS_0 },
|
||||
{ X_OPCODE(31,370,0), X_MASK, {0},
|
||||
0, "tlbia", 0 },
|
||||
{ XFX_OPCODE(31,371,0), XFX_MASK, {O_rD, O_tbr, 0},
|
||||
0, "mftb", 0 },
|
||||
{ X_OPCODE(31,375,0), X_MASK, {O_rD, O_rA, O_rB, 0},
|
||||
0, "lhaux", 0 },
|
||||
{ X_OPCODE(31,407,0), X_MASK, {O_rS, O_rA, O_rB, 0},
|
||||
0, "sthx", H_RA0_IS_0 },
|
||||
{ X_OPCODE(31,412,0), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "orc", 0 },
|
||||
{ X_OPCODE(31,412,1), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "orc.", 0 },
|
||||
{ X_OPCODE(31,438,0), X_MASK, {O_rS, O_rA, O_rB, 0},
|
||||
0, "ecowx", H_RA0_IS_0 },
|
||||
{ X_OPCODE(31,439,0), X_MASK, {O_rS, O_rA, O_rB, 0},
|
||||
0, "sthux", 0 },
|
||||
{ X_OPCODE(31,444,0), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "or", 0 },
|
||||
{ X_OPCODE(31,444,1), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "or.", 0 },
|
||||
{ XO_OPCODE(31,459,0,0), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "divwu", 0 },
|
||||
{ XO_OPCODE(31,459,0,1), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "divwu.", 0 },
|
||||
{ XFX_OPCODE(31,467,0), XFX_MASK, {O_spr, O_rS, 0},
|
||||
0, "mtspr", 0 },
|
||||
{ X_OPCODE(31,470,0), X_MASK, {O_rA, O_rB, 0},
|
||||
0, "dcbi", H_RA0_IS_0 },
|
||||
{ X_OPCODE(31,476,0), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "nand", 0 },
|
||||
{ X_OPCODE(31,476,1), X_MASK, {O_rA, O_rS, O_rB, O_Rc,0},
|
||||
0, "nand.", 0 },
|
||||
{ XO_OPCODE(31,491,0,0), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "divw", 0 },
|
||||
{ XO_OPCODE(31,491,0,1), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "divw.", 0 },
|
||||
{ X_OPCODE(31,512,0), X_MASK, {O_crfD, 0},
|
||||
0, "mcrxr", 0 },
|
||||
{ XO_OPCODE(31,8,1,0), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "subfco", 0 },
|
||||
{ XO_OPCODE(31,8,1,1), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "subfco.", 0 },
|
||||
{ XO_OPCODE(31,10,1,0), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "addco", 0 },
|
||||
{ XO_OPCODE(31,10,1,1), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "addco.", 0 },
|
||||
{ X_OPCODE(31,533,0), X_MASK, {O_rD, O_rA, O_rB, 0},
|
||||
0, "lswx", H_RA0_IS_0 },
|
||||
{ X_OPCODE(31,534,0), X_MASK, {O_rD, O_rA, O_rB, 0},
|
||||
0, "lwbrx", H_RA0_IS_0 },
|
||||
{ X_OPCODE(31,536,0), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "srw", 0 },
|
||||
{ X_OPCODE(31,536,1), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "srw.", 0 },
|
||||
{ XO_OPCODE(31,40,1,0), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "subfo", 0 },
|
||||
{ XO_OPCODE(31,40,1,1), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "subfo.", 0 },
|
||||
{ X_OPCODE(31,566,0), X_MASK, {0},
|
||||
0, "tlbsync", 0 },
|
||||
{ X_OPCODE(31,595,0), X_MASK, {O_rD, O_SR, 0},
|
||||
0, "mfsr", 0 },
|
||||
{ X_OPCODE(31,597,0), X_MASK, {O_rD, O_rA, O_NB, 0},
|
||||
0, "lswi", H_RA0_IS_0 },
|
||||
{ X_OPCODE(31,598,0), X_MASK, {0},
|
||||
0, "sync", 0 },
|
||||
{ XO_OPCODE(31,104,1,0), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "nego", 0 },
|
||||
{ XO_OPCODE(31,104,1,1), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "nego.", 0 },
|
||||
{ XO_OPCODE(31,136,1,0), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "subfeo", 0 },
|
||||
{ XO_OPCODE(31,136,1,1), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "subfeo.", 0 },
|
||||
{ XO_OPCODE(31,138,1,0), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "addeo", 0 },
|
||||
{ XO_OPCODE(31,138,1,1), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "addeo.", 0 },
|
||||
{ X_OPCODE(31,659,0), X_MASK, {O_rD, O_rB, 0},
|
||||
0, "mfsrin", 0 },
|
||||
{ X_OPCODE(31,661,0), X_MASK, {O_rS, O_rA, O_rB, 0},
|
||||
0, "stswx", H_RA0_IS_0 },
|
||||
{ X_OPCODE(31,662,0), X_MASK, {O_rS, O_rA, O_rB, 0},
|
||||
0, "stwbrx", H_RA0_IS_0 },
|
||||
{ XO_OPCODE(31,200,1,0), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "subfzeo", 0 },
|
||||
{ XO_OPCODE(31,200,1,1), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "subfzeo.", 0 },
|
||||
{ XO_OPCODE(31,202,1,0), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "addzeo", 0 },
|
||||
{ XO_OPCODE(31,202,1,1), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "addzeo.", 0 },
|
||||
{ X_OPCODE(31,725,0), X_MASK, {O_rS, O_rA, O_NB, 0},
|
||||
0, "stswi", H_RA0_IS_0 },
|
||||
{ XO_OPCODE(31,232,1,0), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "subfmeo", 0 },
|
||||
{ XO_OPCODE(31,232,1,1), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "subfmeo.", 0 },
|
||||
{ XO_OPCODE(31,234,1,0), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "addmeo", 0 },
|
||||
{ XO_OPCODE(31,234,1,1), XO_MASK, {O_rD, O_rA, O_OE, O_Rc, 0},
|
||||
0, "addmeo.", 0 },
|
||||
{ XO_OPCODE(31,235,1,0), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "mullwo", 0 },
|
||||
{ XO_OPCODE(31,235,1,1), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "mullwo.", 0 },
|
||||
{ XO_OPCODE(31,266,1,0), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "addo", 0 },
|
||||
{ XO_OPCODE(31,266,1,1), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "addo.", 0 },
|
||||
{ X_OPCODE(31,790,0), X_MASK, {O_rD, O_rA, O_rB, 0},
|
||||
0, "lhbrx", H_RA0_IS_0 },
|
||||
{ X_OPCODE(31,792,0), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "sraw", 0 },
|
||||
{ X_OPCODE(31,792,1), X_MASK, {O_rA, O_rS, O_rB, O_Rc, 0},
|
||||
0, "sraw.", 0 },
|
||||
{ X_OPCODE(31,824,0), X_MASK, {O_rA, O_rS, O_SH, O_Rc, 0},
|
||||
0, "srawi", 0 },
|
||||
{ X_OPCODE(31,824,1), X_MASK, {O_rA, O_rS, O_SH, O_Rc, 0},
|
||||
0, "srawi.", 0 },
|
||||
{ X_OPCODE(31,854,0), X_MASK, {0},
|
||||
0, "eieio", 0 },
|
||||
{ X_OPCODE(31,918,0), X_MASK, {O_rS, O_rA, O_rB, 0},
|
||||
0, "sthbrx", H_RA0_IS_0 },
|
||||
{ X_OPCODE(31,922,0), X_MASK, {O_rA, O_rS, O_Rc, 0},
|
||||
0, "extsh", 0 },
|
||||
{ X_OPCODE(31,922,1), X_MASK, {O_rA, O_rS, O_Rc, 0},
|
||||
0, "extsh.", 0 },
|
||||
{ X_OPCODE(31,954,0), X_MASK, {O_rA, O_rS, O_Rc, 0},
|
||||
0, "extsb", 0 },
|
||||
{ X_OPCODE(31,954,1), X_MASK, {O_rA, O_rS, O_Rc, 0},
|
||||
0, "extsb.", 0 },
|
||||
{ XO_OPCODE(31,459,1,0), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "divwuo", 0 },
|
||||
{ XO_OPCODE(31,459,1,1), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "divwuo.", 0 },
|
||||
{ X_OPCODE(31,978,0), X_MASK, {O_rB, 0},
|
||||
0, "tlbld", 0 },
|
||||
{ X_OPCODE(31,982,0), X_MASK, {O_rA, O_rB, 0},
|
||||
0, "icbi", H_RA0_IS_0 },
|
||||
{ XO_OPCODE(31,491,1,0), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "divwo", 0 },
|
||||
{ XO_OPCODE(31,491,1,1), XO_MASK, {O_rD, O_rA, O_rB, O_OE, O_Rc, 0},
|
||||
0, "divwo.", 0 },
|
||||
{ X_OPCODE(31,1010,0), X_MASK, {O_rB, 0},
|
||||
0, "tlbli", 0 },
|
||||
{ X_OPCODE(31,1014,0), X_MASK, {O_rA, O_rB, 0},
|
||||
0, "dcbz", H_RA0_IS_0 },
|
||||
{ D_OPCODE(32), D_MASK, {O_rD, O_d, O_rA, 0},
|
||||
0, "lwz", H_RA0_IS_0 },
|
||||
{ D_OPCODE(33), D_MASK, {O_rD, O_d, O_rA, 0},
|
||||
0, "lwzu", 0 },
|
||||
{ D_OPCODE(34), D_MASK, {O_rD, O_d, O_rA, 0},
|
||||
0, "lbz", H_RA0_IS_0 },
|
||||
{ D_OPCODE(35), D_MASK, {O_rD, O_d, O_rA, 0},
|
||||
0, "lbzu", 0 },
|
||||
{ D_OPCODE(36), D_MASK, {O_rS, O_d, O_rA, 0},
|
||||
0, "stw", H_RA0_IS_0 },
|
||||
{ D_OPCODE(37), D_MASK, {O_rS, O_d, O_rA, 0},
|
||||
0, "stwu", 0 },
|
||||
{ D_OPCODE(38), D_MASK, {O_rS, O_d, O_rA, 0},
|
||||
0, "stb", H_RA0_IS_0 },
|
||||
{ D_OPCODE(39), D_MASK, {O_rS, O_d, O_rA, 0},
|
||||
0, "stbu", 0 },
|
||||
{ D_OPCODE(40), D_MASK, {O_rD, O_d, O_rA, 0},
|
||||
0, "lhz", H_RA0_IS_0 },
|
||||
{ D_OPCODE(41), D_MASK, {O_rD, O_d, O_rA, 0},
|
||||
0, "lhzu", 0 },
|
||||
{ D_OPCODE(42), D_MASK, {O_rD, O_d, O_rA, 0},
|
||||
0, "lha", H_RA0_IS_0 },
|
||||
{ D_OPCODE(43), D_MASK, {O_rD, O_d, O_rA, 0},
|
||||
0, "lhau", 0 },
|
||||
{ D_OPCODE(44), D_MASK, {O_rS, O_d, O_rA, 0},
|
||||
0, "sth", H_RA0_IS_0 },
|
||||
{ D_OPCODE(45), D_MASK, {O_rS, O_d, O_rA, 0},
|
||||
0, "sthu", 0 },
|
||||
{ D_OPCODE(46), D_MASK, {O_rD, O_d, O_rA, 0},
|
||||
0, "lmw", H_RA0_IS_0 },
|
||||
{ D_OPCODE(47), D_MASK, {O_rS, O_d, O_rA, 0},
|
||||
0, "stmw", H_RA0_IS_0 },
|
||||
};
|
||||
|
||||
const unsigned int n_opcodes = sizeof(opcodes) / sizeof(opcodes[0]);
|
||||
|
||||
struct spr_info spr_map[] = {
|
||||
{ SPR_XER, "XER" },
|
||||
{ SPR_LR, "LR" },
|
||||
{ SPR_CTR, "CTR" },
|
||||
{ SPR_DSISR, "DSISR" },
|
||||
{ SPR_DAR, "DAR" },
|
||||
{ SPR_DEC, "DEC" },
|
||||
{ SPR_SRR0, "SRR0" },
|
||||
{ SPR_SRR1, "SRR1" },
|
||||
{ SPR_EIE, "EIE" },
|
||||
{ SPR_EID, "EID" },
|
||||
{ SPR_CMPA, "CMPA" },
|
||||
{ SPR_CMPB, "CMPB" },
|
||||
{ SPR_CMPC, "CMPC" },
|
||||
{ SPR_CMPD, "CMPD" },
|
||||
{ SPR_ICR, "ICR" },
|
||||
{ SPR_DER, "DER" },
|
||||
{ SPR_COUNTA, "COUNTA" },
|
||||
{ SPR_COUNTB, "COUNTB" },
|
||||
{ SPR_CMPE, "CMPE" },
|
||||
{ SPR_CMPF, "CMPF" },
|
||||
{ SPR_CMPG, "CMPG" },
|
||||
{ SPR_CMPH, "CMPH" },
|
||||
{ SPR_LCTRL1, "LCTRL1" },
|
||||
{ SPR_LCTRL2, "LCTRL2" },
|
||||
{ SPR_ICTRL, "ICTRL" },
|
||||
{ SPR_BAR, "BAR" },
|
||||
{ SPR_USPRG0, "USPRG0" },
|
||||
{ SPR_SPRG4_RO, "SPRG4_RO" },
|
||||
{ SPR_SPRG5_RO, "SPRG5_RO" },
|
||||
{ SPR_SPRG6_RO, "SPRG6_RO" },
|
||||
{ SPR_SPRG7_RO, "SPRG7_RO" },
|
||||
{ SPR_SPRG0, "SPRG0" },
|
||||
{ SPR_SPRG1, "SPRG1" },
|
||||
{ SPR_SPRG2, "SPRG2" },
|
||||
{ SPR_SPRG3, "SPRG3" },
|
||||
{ SPR_SPRG4, "SPRG4" },
|
||||
{ SPR_SPRG5, "SPRG5" },
|
||||
{ SPR_SPRG6, "SPRG6" },
|
||||
{ SPR_SPRG7, "SPRG7" },
|
||||
{ SPR_EAR, "EAR" },
|
||||
{ SPR_TBL, "TBL" },
|
||||
{ SPR_TBU, "TBU" },
|
||||
{ SPR_IC_CST, "IC_CST" },
|
||||
{ SPR_IC_ADR, "IC_ADR" },
|
||||
{ SPR_IC_DAT, "IC_DAT" },
|
||||
{ SPR_DC_CST, "DC_CST" },
|
||||
{ SPR_DC_ADR, "DC_ADR" },
|
||||
{ SPR_DC_DAT, "DC_DAT" },
|
||||
{ SPR_DPDR, "DPDR" },
|
||||
{ SPR_IMMR, "IMMR" },
|
||||
{ SPR_MI_CTR, "MI_CTR" },
|
||||
{ SPR_MI_AP, "MI_AP" },
|
||||
{ SPR_MI_EPN, "MI_EPN" },
|
||||
{ SPR_MI_TWC, "MI_TWC" },
|
||||
{ SPR_MI_RPN, "MI_RPN" },
|
||||
{ SPR_MD_CTR, "MD_CTR" },
|
||||
{ SPR_M_CASID, "M_CASID" },
|
||||
{ SPR_MD_AP, "MD_AP" },
|
||||
{ SPR_MD_EPN, "MD_EPN" },
|
||||
{ SPR_M_TWB, "M_TWB" },
|
||||
{ SPR_MD_TWC, "MD_TWC" },
|
||||
{ SPR_MD_RPN, "MD_RPN" },
|
||||
{ SPR_M_TW, "M_TW" },
|
||||
{ SPR_MI_DBCAM, "MI_DBCAM" },
|
||||
{ SPR_MI_DBRAM0, "MI_DBRAM0" },
|
||||
{ SPR_MI_DBRAM1, "MI_DBRAM1" },
|
||||
{ SPR_MD_DBCAM, "MD_DBCAM" },
|
||||
{ SPR_MD_DBRAM0, "MD_DBRAM0" },
|
||||
{ SPR_MD_DBRAM1, "MD_DBRAM1" },
|
||||
{ SPR_ZPR, "ZPR" },
|
||||
{ SPR_PID, "PID" },
|
||||
{ SPR_CCR0, "CCR0" },
|
||||
{ SPR_IAC3, "IAC3" },
|
||||
{ SPR_IAC4, "IAC4" },
|
||||
{ SPR_DVC1, "DVC1" },
|
||||
{ SPR_DVC2, "DVC2" },
|
||||
{ SPR_SGR, "SGR" },
|
||||
{ SPR_DCWR, "DCWR" },
|
||||
{ SPR_SLER, "SLER" },
|
||||
{ SPR_SU0R, "SU0R" },
|
||||
{ SPR_DBCR1, "DBCR1" },
|
||||
{ SPR_ICDBDR, "ICDBDR" },
|
||||
{ SPR_ESR, "ESR" },
|
||||
{ SPR_DEAR, "DEAR" },
|
||||
{ SPR_EVPR, "EVPR" },
|
||||
{ SPR_TSR, "TSR" },
|
||||
{ SPR_TCR, "TCR" },
|
||||
{ SPR_PIT, "PIT" },
|
||||
{ SPR_SRR2, "SRR2" },
|
||||
{ SPR_SRR3, "SRR3" },
|
||||
{ SPR_DBSR, "DBSR" },
|
||||
{ SPR_DBCR0, "DBCR0" },
|
||||
{ SPR_IAC1, "IAC1" },
|
||||
{ SPR_IAC2, "IAC2" },
|
||||
{ SPR_DAC1, "DAC1" },
|
||||
{ SPR_DAC2, "DAC2" },
|
||||
{ SPR_DCCR, "DCCR" },
|
||||
{ SPR_ICCR, "ICCR" },
|
||||
};
|
||||
|
||||
const unsigned int n_sprs = sizeof(spr_map) / sizeof(spr_map[0]);
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Copyright (c) 2000 William L. Pitts and W. Gerald Hicks
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are freely
|
||||
* permitted provided that the above copyright notice and this
|
||||
* paragraph and the following disclaimer are duplicated in all
|
||||
* such forms.
|
||||
*
|
||||
* This software is provided "AS IS" and without any express or
|
||||
* implied warranties, including, without limitation, the implied
|
||||
* warranties of merchantability and fitness for a particular
|
||||
* purpose.
|
||||
*/
|
||||
26
include/bedbug/type.h
Normal file
26
include/bedbug/type.h
Normal file
@@ -0,0 +1,26 @@
|
||||
#ifndef _TYPE_BEDBUG_H
|
||||
#define _TYPE_BEDBUG_H
|
||||
|
||||
/* Supporting routines */
|
||||
int bedbug_puts (const char *);
|
||||
void bedbug_init (void);
|
||||
void bedbug860_init (void);
|
||||
void do_bedbug_breakpoint (struct pt_regs *);
|
||||
void bedbug_main_loop (unsigned long, struct pt_regs *);
|
||||
|
||||
|
||||
typedef struct {
|
||||
int hw_debug_enabled;
|
||||
int stopped;
|
||||
int current_bp;
|
||||
struct pt_regs *regs;
|
||||
|
||||
void (*do_break) (cmd_tbl_t *, int, int, char * const []);
|
||||
void (*break_isr) (struct pt_regs *);
|
||||
int (*find_empty) (void);
|
||||
int (*set) (int, unsigned long);
|
||||
int (*clear) (int);
|
||||
} CPU_DEBUG_CTX;
|
||||
|
||||
|
||||
#endif /* _TYPE_BEDBUG_H */
|
||||
92
include/binman_sym.h
Normal file
92
include/binman_sym.h
Normal file
@@ -0,0 +1,92 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Symbol access for symbols set up by binman as part of the build.
|
||||
*
|
||||
* This allows C code to access the position of a particular part of the image
|
||||
* assembled by binman.
|
||||
*
|
||||
* Copyright (c) 2017 Google, Inc
|
||||
*/
|
||||
|
||||
#ifndef __BINMAN_SYM_H
|
||||
#define __BINMAN_SYM_H
|
||||
|
||||
#define BINMAN_SYM_MISSING (-1UL)
|
||||
|
||||
#ifdef CONFIG_BINMAN
|
||||
|
||||
/**
|
||||
* binman_symname() - Internal fnuction to get a binman symbol name
|
||||
*
|
||||
* @entry_name: Name of the entry to look for (e.g. 'u_boot_spl')
|
||||
* @_prop_name: Property value to get from that entry (e.g. 'pos')
|
||||
* @returns name of the symbol for that entry and property
|
||||
*/
|
||||
#define binman_symname(_entry_name, _prop_name) \
|
||||
_binman_ ## _entry_name ## _prop_ ## _prop_name
|
||||
|
||||
/**
|
||||
* binman_sym_declare() - Declare a symbol that will be used at run-time
|
||||
*
|
||||
* @_type: Type f the symbol (e.g. unsigned long)
|
||||
* @entry_name: Name of the entry to look for (e.g. 'u_boot_spl')
|
||||
* @_prop_name: Property value to get from that entry (e.g. 'pos')
|
||||
*/
|
||||
#define binman_sym_declare(_type, _entry_name, _prop_name) \
|
||||
_type binman_symname(_entry_name, _prop_name) \
|
||||
__attribute__((aligned(4), unused, section(".binman_sym")))
|
||||
|
||||
/**
|
||||
* binman_sym_extern() - Declare a extern symbol that will be used at run-time
|
||||
*
|
||||
* @_type: Type f the symbol (e.g. unsigned long)
|
||||
* @entry_name: Name of the entry to look for (e.g. 'u_boot_spl')
|
||||
* @_prop_name: Property value to get from that entry (e.g. 'pos')
|
||||
*/
|
||||
#define binman_sym_extern(_type, _entry_name, _prop_name) \
|
||||
extern _type binman_symname(_entry_name, _prop_name) \
|
||||
__attribute__((aligned(4), unused, section(".binman_sym")))
|
||||
|
||||
/**
|
||||
* binman_sym_declare_optional() - Declare an optional symbol
|
||||
*
|
||||
* If this symbol cannot be provided by binman, an error will not be generated.
|
||||
* Instead the image will be assigned the value BINMAN_SYM_MISSING.
|
||||
*
|
||||
* @_type: Type f the symbol (e.g. unsigned long)
|
||||
* @entry_name: Name of the entry to look for (e.g. 'u_boot_spl')
|
||||
* @_prop_name: Property value to get from that entry (e.g. 'pos')
|
||||
*/
|
||||
#define binman_sym_declare_optional(_type, _entry_name, _prop_name) \
|
||||
_type binman_symname(_entry_name, _prop_name) \
|
||||
__attribute__((aligned(4), weak, unused, \
|
||||
section(".binman_sym")))
|
||||
|
||||
/**
|
||||
* binman_sym() - Access a previously declared symbol
|
||||
*
|
||||
* This is used to get the value of a symbol. E.g.:
|
||||
*
|
||||
* ulong address = binman_sym(ulong, u_boot_spl, pos);
|
||||
*
|
||||
* @_type: Type f the symbol (e.g. unsigned long)
|
||||
* @entry_name: Name of the entry to look for (e.g. 'u_boot_spl')
|
||||
* @_prop_name: Property value to get from that entry (e.g. 'pos')
|
||||
* @returns value of that property (filled in by binman)
|
||||
*/
|
||||
#define binman_sym(_type, _entry_name, _prop_name) \
|
||||
(*(_type *)&binman_symname(_entry_name, _prop_name))
|
||||
|
||||
#else /* !BINMAN */
|
||||
|
||||
#define binman_sym_declare(_type, _entry_name, _prop_name)
|
||||
|
||||
#define binman_sym_declare_optional(_type, _entry_name, _prop_name)
|
||||
|
||||
#define binman_sym_extern(_type, _entry_name, _prop_name)
|
||||
|
||||
#define binman_sym(_type, _entry_name, _prop_name) BINMAN_SYM_MISSING
|
||||
|
||||
#endif /* BINMAN */
|
||||
|
||||
#endif
|
||||
82
include/bios_emul.h
Normal file
82
include/bios_emul.h
Normal file
@@ -0,0 +1,82 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 1996-1999 SciTech Software, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _BIOS_EMUL_H
|
||||
#define _BIOS_EMUL_H
|
||||
|
||||
/* Include the register header directly here */
|
||||
#include "../drivers/bios_emulator/include/x86emu/regs.h"
|
||||
#include <pci.h>
|
||||
|
||||
/****************************************************************************
|
||||
REMARKS:
|
||||
Data structure used to describe the details for the BIOS emulator system
|
||||
environment as used by the X86 emulator library.
|
||||
|
||||
HEADER:
|
||||
biosemu.h
|
||||
|
||||
MEMBERS:
|
||||
vgaInfo - VGA BIOS information structure
|
||||
biosmem_base - Base of the BIOS image
|
||||
biosmem_limit - Limit of the BIOS image
|
||||
busmem_base - Base of the VGA bus memory
|
||||
****************************************************************************/
|
||||
typedef struct {
|
||||
int function;
|
||||
int device;
|
||||
int bus;
|
||||
u32 VendorID;
|
||||
u32 DeviceID;
|
||||
#ifdef CONFIG_DM_PCI
|
||||
struct udevice *pcidev;
|
||||
#else
|
||||
pci_dev_t pcidev;
|
||||
#endif
|
||||
void *BIOSImage;
|
||||
u32 BIOSImageLen;
|
||||
u8 LowMem[1536];
|
||||
} BE_VGAInfo;
|
||||
|
||||
struct vbe_mode_info;
|
||||
|
||||
#ifdef CONFIG_DM_PCI
|
||||
int BootVideoCardBIOS(struct udevice *pcidev, BE_VGAInfo **pVGAInfo,
|
||||
int clean_up);
|
||||
#else
|
||||
int BootVideoCardBIOS(pci_dev_t pcidev, BE_VGAInfo **pVGAInfo, int clean_up);
|
||||
#endif
|
||||
|
||||
/* Run a BIOS ROM natively (only supported on x86 machines) */
|
||||
void bios_run_on_x86(struct udevice *dev, unsigned long addr, int vesa_mode,
|
||||
struct vbe_mode_info *mode_info);
|
||||
|
||||
/**
|
||||
* bios_set_interrupt_handler() - Install an interrupt handler for the BIOS
|
||||
*
|
||||
* This installs an interrupt handler that the BIOS will call when needed.
|
||||
*
|
||||
* @intnum: Interrupt number to install a handler for
|
||||
* @int_handler_func: Function to call to handle interrupt
|
||||
*/
|
||||
void bios_set_interrupt_handler(int intnum, int (*int_handler_func)(void));
|
||||
|
||||
void biosemu_set_interrupt_handler(int intnum, int (*int_func)(void));
|
||||
|
||||
#ifdef CONFIG_DM_PCI
|
||||
int biosemu_setup(struct udevice *pcidev, BE_VGAInfo **pVGAInfo);
|
||||
|
||||
int biosemu_run(struct udevice *dev, uchar *bios_rom, int bios_len,
|
||||
BE_VGAInfo *vga_info, int clean_up, int vesa_mode,
|
||||
struct vbe_mode_info *mode_info);
|
||||
#else
|
||||
int biosemu_setup(pci_dev_t pcidev, BE_VGAInfo **pVGAInfo);
|
||||
|
||||
int biosemu_run(pci_dev_t pcidev, uchar *bios_rom, int bios_len,
|
||||
BE_VGAInfo *vga_info, int clean_up, int vesa_mode,
|
||||
struct vbe_mode_info *mode_info);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
89
include/bitfield.h
Normal file
89
include/bitfield.h
Normal file
@@ -0,0 +1,89 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright 2013 Broadcom Corporation.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Bitfield operations
|
||||
*
|
||||
* These are generic bitfield operations which allow manipulation of variable
|
||||
* width bitfields within a word. One use of this would be to use data tables
|
||||
* to determine how to reprogram fields within R/W hardware registers.
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* old_reg_val
|
||||
* +--------+----+---+--+-----+----------+
|
||||
* | | | | | old | |
|
||||
* +--------+----+---+--+-----+----------+
|
||||
*
|
||||
* new_reg_val
|
||||
* +--------+----+---+--+-----+----------+
|
||||
* | | | | | new | |
|
||||
* +--------+----+---+--+-----+----------+
|
||||
*
|
||||
* mask = bitfield_mask(10, 5);
|
||||
* old = bitfield_extract(old_reg_val, 10, 5);
|
||||
* new_reg_val = bitfield_replace(old_reg_val, 10, 5, new);
|
||||
*
|
||||
* or
|
||||
*
|
||||
* mask = bitfield_mask(10, 5);
|
||||
* old = bitfield_extract_by_mask(old_reg_val, mask);
|
||||
* new_reg_val = bitfield_replace_by_mask(old_reg_val, mask, new);
|
||||
*
|
||||
* The numbers 10 and 5 could for example come from data
|
||||
* tables which describe all bitfields in all registers.
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/* Produces a mask of set bits covering a range of a uint value */
|
||||
static inline uint bitfield_mask(uint shift, uint width)
|
||||
{
|
||||
return ((1 << width) - 1) << shift;
|
||||
}
|
||||
|
||||
/* Extract the value of a bitfield found within a given register value */
|
||||
static inline uint bitfield_extract(uint reg_val, uint shift, uint width)
|
||||
{
|
||||
return (reg_val & bitfield_mask(shift, width)) >> shift;
|
||||
}
|
||||
|
||||
/*
|
||||
* Replace the value of a bitfield found within a given register value
|
||||
* Returns the newly modified uint value with the replaced field.
|
||||
*/
|
||||
static inline uint bitfield_replace(uint reg_val, uint shift, uint width,
|
||||
uint bitfield_val)
|
||||
{
|
||||
uint mask = bitfield_mask(shift, width);
|
||||
|
||||
return (reg_val & ~mask) | ((bitfield_val << shift) & mask);
|
||||
}
|
||||
|
||||
/* Produces a shift of the bitfield given a mask */
|
||||
static inline uint bitfield_shift(uint mask)
|
||||
{
|
||||
return mask ? ffs(mask) - 1 : 0;
|
||||
}
|
||||
|
||||
/* Extract the value of a bitfield found within a given register value */
|
||||
static inline uint bitfield_extract_by_mask(uint reg_val, uint mask)
|
||||
{
|
||||
uint shift = bitfield_shift(mask);
|
||||
|
||||
return (reg_val & mask) >> shift;
|
||||
}
|
||||
|
||||
/*
|
||||
* Replace the value of a bitfield found within a given register value
|
||||
* Returns the newly modified uint value with the replaced field.
|
||||
*/
|
||||
static inline uint bitfield_replace_by_mask(uint reg_val, uint mask,
|
||||
uint bitfield_val)
|
||||
{
|
||||
uint shift = bitfield_shift(mask);
|
||||
|
||||
return (reg_val & ~mask) | ((bitfield_val << shift) & mask);
|
||||
}
|
||||
679
include/blk.h
Normal file
679
include/blk.h
Normal file
@@ -0,0 +1,679 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2000-2004
|
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
*/
|
||||
|
||||
#ifndef BLK_H
|
||||
#define BLK_H
|
||||
|
||||
#include <efi.h>
|
||||
|
||||
#ifdef CONFIG_SYS_64BIT_LBA
|
||||
typedef uint64_t lbaint_t;
|
||||
#define LBAFlength "ll"
|
||||
#else
|
||||
typedef ulong lbaint_t;
|
||||
#define LBAFlength "l"
|
||||
#endif
|
||||
#define LBAF "%" LBAFlength "x"
|
||||
#define LBAFU "%" LBAFlength "u"
|
||||
|
||||
/* Interface types: */
|
||||
enum if_type {
|
||||
IF_TYPE_UNKNOWN = 0,
|
||||
IF_TYPE_IDE,
|
||||
IF_TYPE_SCSI,
|
||||
IF_TYPE_ATAPI,
|
||||
IF_TYPE_USB,
|
||||
IF_TYPE_DOC,
|
||||
IF_TYPE_MMC,
|
||||
IF_TYPE_SD,
|
||||
IF_TYPE_SATA,
|
||||
IF_TYPE_HOST,
|
||||
IF_TYPE_NVME,
|
||||
IF_TYPE_EFI,
|
||||
IF_TYPE_VIRTIO,
|
||||
|
||||
IF_TYPE_COUNT, /* Number of interface types */
|
||||
};
|
||||
|
||||
#define BLK_VEN_SIZE 40
|
||||
#define BLK_PRD_SIZE 20
|
||||
#define BLK_REV_SIZE 8
|
||||
|
||||
/*
|
||||
* Identifies the partition table type (ie. MBR vs GPT GUID) signature
|
||||
*/
|
||||
enum sig_type {
|
||||
SIG_TYPE_NONE,
|
||||
SIG_TYPE_MBR,
|
||||
SIG_TYPE_GUID,
|
||||
|
||||
SIG_TYPE_COUNT /* Number of signature types */
|
||||
};
|
||||
|
||||
/*
|
||||
* With driver model (CONFIG_BLK) this is uclass platform data, accessible
|
||||
* with dev_get_uclass_platdata(dev)
|
||||
*/
|
||||
struct blk_desc {
|
||||
/*
|
||||
* TODO: With driver model we should be able to use the parent
|
||||
* device's uclass instead.
|
||||
*/
|
||||
enum if_type if_type; /* type of the interface */
|
||||
int devnum; /* device number */
|
||||
unsigned char part_type; /* partition type */
|
||||
unsigned char target; /* target SCSI ID */
|
||||
unsigned char lun; /* target LUN */
|
||||
unsigned char hwpart; /* HW partition, e.g. for eMMC */
|
||||
unsigned char type; /* device type */
|
||||
unsigned char removable; /* removable device */
|
||||
#ifdef CONFIG_LBA48
|
||||
/* device can use 48bit addr (ATA/ATAPI v7) */
|
||||
unsigned char lba48;
|
||||
#endif
|
||||
lbaint_t lba; /* number of blocks */
|
||||
unsigned long blksz; /* block size */
|
||||
int log2blksz; /* for convenience: log2(blksz) */
|
||||
char vendor[BLK_VEN_SIZE + 1]; /* device vendor string */
|
||||
char product[BLK_PRD_SIZE + 1]; /* device product number */
|
||||
char revision[BLK_REV_SIZE + 1]; /* firmware revision */
|
||||
enum sig_type sig_type; /* Partition table signature type */
|
||||
union {
|
||||
uint32_t mbr_sig; /* MBR integer signature */
|
||||
efi_guid_t guid_sig; /* GPT GUID Signature */
|
||||
};
|
||||
#if CONFIG_IS_ENABLED(BLK)
|
||||
/*
|
||||
* For now we have a few functions which take struct blk_desc as a
|
||||
* parameter. This field allows them to look up the associated
|
||||
* device. Once these functions are removed we can drop this field.
|
||||
*/
|
||||
struct udevice *bdev;
|
||||
#else
|
||||
unsigned long (*block_read)(struct blk_desc *block_dev,
|
||||
lbaint_t start,
|
||||
lbaint_t blkcnt,
|
||||
void *buffer);
|
||||
unsigned long (*block_write)(struct blk_desc *block_dev,
|
||||
lbaint_t start,
|
||||
lbaint_t blkcnt,
|
||||
const void *buffer);
|
||||
unsigned long (*block_erase)(struct blk_desc *block_dev,
|
||||
lbaint_t start,
|
||||
lbaint_t blkcnt);
|
||||
void *priv; /* driver private struct pointer */
|
||||
#endif
|
||||
};
|
||||
|
||||
#define BLOCK_CNT(size, blk_desc) (PAD_COUNT(size, blk_desc->blksz))
|
||||
#define PAD_TO_BLOCKSIZE(size, blk_desc) \
|
||||
(PAD_SIZE(size, blk_desc->blksz))
|
||||
|
||||
#if CONFIG_IS_ENABLED(BLOCK_CACHE)
|
||||
/**
|
||||
* blkcache_read() - attempt to read a set of blocks from cache
|
||||
*
|
||||
* @param iftype - IF_TYPE_x for type of device
|
||||
* @param dev - device index of particular type
|
||||
* @param start - starting block number
|
||||
* @param blkcnt - number of blocks to read
|
||||
* @param blksz - size in bytes of each block
|
||||
* @param buf - buffer to contain cached data
|
||||
*
|
||||
* @return - '1' if block returned from cache, '0' otherwise.
|
||||
*/
|
||||
int blkcache_read(int iftype, int dev,
|
||||
lbaint_t start, lbaint_t blkcnt,
|
||||
unsigned long blksz, void *buffer);
|
||||
|
||||
/**
|
||||
* blkcache_fill() - make data read from a block device available
|
||||
* to the block cache
|
||||
*
|
||||
* @param iftype - IF_TYPE_x for type of device
|
||||
* @param dev - device index of particular type
|
||||
* @param start - starting block number
|
||||
* @param blkcnt - number of blocks available
|
||||
* @param blksz - size in bytes of each block
|
||||
* @param buf - buffer containing data to cache
|
||||
*
|
||||
*/
|
||||
void blkcache_fill(int iftype, int dev,
|
||||
lbaint_t start, lbaint_t blkcnt,
|
||||
unsigned long blksz, void const *buffer);
|
||||
|
||||
/**
|
||||
* blkcache_invalidate() - discard the cache for a set of blocks
|
||||
* because of a write or device (re)initialization.
|
||||
*
|
||||
* @param iftype - IF_TYPE_x for type of device
|
||||
* @param dev - device index of particular type
|
||||
*/
|
||||
void blkcache_invalidate(int iftype, int dev);
|
||||
|
||||
/**
|
||||
* blkcache_configure() - configure block cache
|
||||
*
|
||||
* @param blocks - maximum blocks per entry
|
||||
* @param entries - maximum entries in cache
|
||||
*/
|
||||
void blkcache_configure(unsigned blocks, unsigned entries);
|
||||
|
||||
/*
|
||||
* statistics of the block cache
|
||||
*/
|
||||
struct block_cache_stats {
|
||||
unsigned hits;
|
||||
unsigned misses;
|
||||
unsigned entries; /* current entry count */
|
||||
unsigned max_blocks_per_entry;
|
||||
unsigned max_entries;
|
||||
};
|
||||
|
||||
/**
|
||||
* get_blkcache_stats() - return statistics and reset
|
||||
*
|
||||
* @param stats - statistics are copied here
|
||||
*/
|
||||
void blkcache_stats(struct block_cache_stats *stats);
|
||||
|
||||
#else
|
||||
|
||||
static inline int blkcache_read(int iftype, int dev,
|
||||
lbaint_t start, lbaint_t blkcnt,
|
||||
unsigned long blksz, void *buffer)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void blkcache_fill(int iftype, int dev,
|
||||
lbaint_t start, lbaint_t blkcnt,
|
||||
unsigned long blksz, void const *buffer) {}
|
||||
|
||||
static inline void blkcache_invalidate(int iftype, int dev) {}
|
||||
|
||||
#endif
|
||||
|
||||
#if CONFIG_IS_ENABLED(BLK)
|
||||
struct udevice;
|
||||
|
||||
/* Operations on block devices */
|
||||
struct blk_ops {
|
||||
/**
|
||||
* read() - read from a block device
|
||||
*
|
||||
* @dev: Device to read from
|
||||
* @start: Start block number to read (0=first)
|
||||
* @blkcnt: Number of blocks to read
|
||||
* @buffer: Destination buffer for data read
|
||||
* @return number of blocks read, or -ve error number (see the
|
||||
* IS_ERR_VALUE() macro
|
||||
*/
|
||||
unsigned long (*read)(struct udevice *dev, lbaint_t start,
|
||||
lbaint_t blkcnt, void *buffer);
|
||||
|
||||
/**
|
||||
* write() - write to a block device
|
||||
*
|
||||
* @dev: Device to write to
|
||||
* @start: Start block number to write (0=first)
|
||||
* @blkcnt: Number of blocks to write
|
||||
* @buffer: Source buffer for data to write
|
||||
* @return number of blocks written, or -ve error number (see the
|
||||
* IS_ERR_VALUE() macro
|
||||
*/
|
||||
unsigned long (*write)(struct udevice *dev, lbaint_t start,
|
||||
lbaint_t blkcnt, const void *buffer);
|
||||
|
||||
/**
|
||||
* erase() - erase a section of a block device
|
||||
*
|
||||
* @dev: Device to (partially) erase
|
||||
* @start: Start block number to erase (0=first)
|
||||
* @blkcnt: Number of blocks to erase
|
||||
* @return number of blocks erased, or -ve error number (see the
|
||||
* IS_ERR_VALUE() macro
|
||||
*/
|
||||
unsigned long (*erase)(struct udevice *dev, lbaint_t start,
|
||||
lbaint_t blkcnt);
|
||||
|
||||
/**
|
||||
* select_hwpart() - select a particular hardware partition
|
||||
*
|
||||
* Some devices (e.g. MMC) can support partitioning at the hardware
|
||||
* level. This is quite separate from the normal idea of
|
||||
* software-based partitions. MMC hardware partitions must be
|
||||
* explicitly selected. Once selected only the region of the device
|
||||
* covered by that partition is accessible.
|
||||
*
|
||||
* The MMC standard provides for two boot partitions (numbered 1 and 2),
|
||||
* rpmb (3), and up to 4 addition general-purpose partitions (4-7).
|
||||
*
|
||||
* @desc: Block device to update
|
||||
* @hwpart: Hardware partition number to select. 0 means the raw
|
||||
* device, 1 is the first partition, 2 is the second, etc.
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int (*select_hwpart)(struct udevice *dev, int hwpart);
|
||||
};
|
||||
|
||||
#define blk_get_ops(dev) ((struct blk_ops *)(dev)->driver->ops)
|
||||
|
||||
/*
|
||||
* These functions should take struct udevice instead of struct blk_desc,
|
||||
* but this is convenient for migration to driver model. Add a 'd' prefix
|
||||
* to the function operations, so that blk_read(), etc. can be reserved for
|
||||
* functions with the correct arguments.
|
||||
*/
|
||||
unsigned long blk_dread(struct blk_desc *block_dev, lbaint_t start,
|
||||
lbaint_t blkcnt, void *buffer);
|
||||
unsigned long blk_dwrite(struct blk_desc *block_dev, lbaint_t start,
|
||||
lbaint_t blkcnt, const void *buffer);
|
||||
unsigned long blk_derase(struct blk_desc *block_dev, lbaint_t start,
|
||||
lbaint_t blkcnt);
|
||||
|
||||
/**
|
||||
* blk_find_device() - Find a block device
|
||||
*
|
||||
* This function does not activate the device. The device will be returned
|
||||
* whether or not it is activated.
|
||||
*
|
||||
* @if_type: Interface type (enum if_type_t)
|
||||
* @devnum: Device number (specific to each interface type)
|
||||
* @devp: the device, if found
|
||||
* @return 0 if found, -ENODEV if no device found, or other -ve error value
|
||||
*/
|
||||
int blk_find_device(int if_type, int devnum, struct udevice **devp);
|
||||
|
||||
/**
|
||||
* blk_get_device() - Find and probe a block device ready for use
|
||||
*
|
||||
* @if_type: Interface type (enum if_type_t)
|
||||
* @devnum: Device number (specific to each interface type)
|
||||
* @devp: the device, if found
|
||||
* @return 0 if found, -ENODEV if no device found, or other -ve error value
|
||||
*/
|
||||
int blk_get_device(int if_type, int devnum, struct udevice **devp);
|
||||
|
||||
/**
|
||||
* blk_first_device() - Find the first device for a given interface
|
||||
*
|
||||
* The device is probed ready for use
|
||||
*
|
||||
* @devnum: Device number (specific to each interface type)
|
||||
* @devp: the device, if found
|
||||
* @return 0 if found, -ENODEV if no device, or other -ve error value
|
||||
*/
|
||||
int blk_first_device(int if_type, struct udevice **devp);
|
||||
|
||||
/**
|
||||
* blk_next_device() - Find the next device for a given interface
|
||||
*
|
||||
* This can be called repeatedly after blk_first_device() to iterate through
|
||||
* all devices of the given interface type.
|
||||
*
|
||||
* The device is probed ready for use
|
||||
*
|
||||
* @devp: On entry, the previous device returned. On exit, the next
|
||||
* device, if found
|
||||
* @return 0 if found, -ENODEV if no device, or other -ve error value
|
||||
*/
|
||||
int blk_next_device(struct udevice **devp);
|
||||
|
||||
/**
|
||||
* blk_create_device() - Create a new block device
|
||||
*
|
||||
* @parent: Parent of the new device
|
||||
* @drv_name: Driver name to use for the block device
|
||||
* @name: Name for the device
|
||||
* @if_type: Interface type (enum if_type_t)
|
||||
* @devnum: Device number, specific to the interface type, or -1 to
|
||||
* allocate the next available number
|
||||
* @blksz: Block size of the device in bytes (typically 512)
|
||||
* @lba: Total number of blocks of the device
|
||||
* @devp: the new device (which has not been probed)
|
||||
*/
|
||||
int blk_create_device(struct udevice *parent, const char *drv_name,
|
||||
const char *name, int if_type, int devnum, int blksz,
|
||||
lbaint_t lba, struct udevice **devp);
|
||||
|
||||
/**
|
||||
* blk_create_devicef() - Create a new named block device
|
||||
*
|
||||
* @parent: Parent of the new device
|
||||
* @drv_name: Driver name to use for the block device
|
||||
* @name: Name for the device (parent name is prepended)
|
||||
* @if_type: Interface type (enum if_type_t)
|
||||
* @devnum: Device number, specific to the interface type, or -1 to
|
||||
* allocate the next available number
|
||||
* @blksz: Block size of the device in bytes (typically 512)
|
||||
* @lba: Total number of blocks of the device
|
||||
* @devp: the new device (which has not been probed)
|
||||
*/
|
||||
int blk_create_devicef(struct udevice *parent, const char *drv_name,
|
||||
const char *name, int if_type, int devnum, int blksz,
|
||||
lbaint_t lba, struct udevice **devp);
|
||||
|
||||
/**
|
||||
* blk_unbind_all() - Unbind all device of the given interface type
|
||||
*
|
||||
* The devices are removed and then unbound.
|
||||
*
|
||||
* @if_type: Interface type to unbind
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int blk_unbind_all(int if_type);
|
||||
|
||||
/**
|
||||
* blk_find_max_devnum() - find the maximum device number for an interface type
|
||||
*
|
||||
* Finds the last allocated device number for an interface type @if_type. The
|
||||
* next number is safe to use for a newly allocated device.
|
||||
*
|
||||
* @if_type: Interface type to scan
|
||||
* @return maximum device number found, or -ENODEV if none, or other -ve on
|
||||
* error
|
||||
*/
|
||||
int blk_find_max_devnum(enum if_type if_type);
|
||||
|
||||
/**
|
||||
* blk_next_free_devnum() - get the next device number for an interface type
|
||||
*
|
||||
* Finds the next number that is safe to use for a newly allocated device for
|
||||
* an interface type @if_type.
|
||||
*
|
||||
* @if_type: Interface type to scan
|
||||
* @return next device number safe to use, or -ve on error
|
||||
*/
|
||||
int blk_next_free_devnum(enum if_type if_type);
|
||||
|
||||
/**
|
||||
* blk_select_hwpart() - select a hardware partition
|
||||
*
|
||||
* Select a hardware partition if the device supports it (typically MMC does)
|
||||
*
|
||||
* @dev: Device to update
|
||||
* @hwpart: Partition number to select
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int blk_select_hwpart(struct udevice *dev, int hwpart);
|
||||
|
||||
/**
|
||||
* blk_get_from_parent() - obtain a block device by looking up its parent
|
||||
*
|
||||
* All devices with
|
||||
*/
|
||||
int blk_get_from_parent(struct udevice *parent, struct udevice **devp);
|
||||
|
||||
/**
|
||||
* blk_get_by_device() - Get the block device descriptor for the given device
|
||||
* @dev: Instance of a storage device
|
||||
*
|
||||
* Return: With block device descriptor on success , NULL if there is no such
|
||||
* block device.
|
||||
*/
|
||||
struct blk_desc *blk_get_by_device(struct udevice *dev);
|
||||
|
||||
#else
|
||||
#include <errno.h>
|
||||
/*
|
||||
* These functions should take struct udevice instead of struct blk_desc,
|
||||
* but this is convenient for migration to driver model. Add a 'd' prefix
|
||||
* to the function operations, so that blk_read(), etc. can be reserved for
|
||||
* functions with the correct arguments.
|
||||
*/
|
||||
static inline ulong blk_dread(struct blk_desc *block_dev, lbaint_t start,
|
||||
lbaint_t blkcnt, void *buffer)
|
||||
{
|
||||
ulong blks_read;
|
||||
if (blkcache_read(block_dev->if_type, block_dev->devnum,
|
||||
start, blkcnt, block_dev->blksz, buffer))
|
||||
return blkcnt;
|
||||
|
||||
/*
|
||||
* We could check if block_read is NULL and return -ENOSYS. But this
|
||||
* bloats the code slightly (cause some board to fail to build), and
|
||||
* it would be an error to try an operation that does not exist.
|
||||
*/
|
||||
blks_read = block_dev->block_read(block_dev, start, blkcnt, buffer);
|
||||
if (blks_read == blkcnt)
|
||||
blkcache_fill(block_dev->if_type, block_dev->devnum,
|
||||
start, blkcnt, block_dev->blksz, buffer);
|
||||
|
||||
return blks_read;
|
||||
}
|
||||
|
||||
static inline ulong blk_dwrite(struct blk_desc *block_dev, lbaint_t start,
|
||||
lbaint_t blkcnt, const void *buffer)
|
||||
{
|
||||
blkcache_invalidate(block_dev->if_type, block_dev->devnum);
|
||||
return block_dev->block_write(block_dev, start, blkcnt, buffer);
|
||||
}
|
||||
|
||||
static inline ulong blk_derase(struct blk_desc *block_dev, lbaint_t start,
|
||||
lbaint_t blkcnt)
|
||||
{
|
||||
blkcache_invalidate(block_dev->if_type, block_dev->devnum);
|
||||
return block_dev->block_erase(block_dev, start, blkcnt);
|
||||
}
|
||||
|
||||
/**
|
||||
* struct blk_driver - Driver for block interface types
|
||||
*
|
||||
* This provides access to the block devices for each interface type. One
|
||||
* driver should be provided using U_BOOT_LEGACY_BLK() for each interface
|
||||
* type that is to be supported.
|
||||
*
|
||||
* @if_typename: Interface type name
|
||||
* @if_type: Interface type
|
||||
* @max_devs: Maximum number of devices supported
|
||||
* @desc: Pointer to list of devices for this interface type,
|
||||
* or NULL to use @get_dev() instead
|
||||
*/
|
||||
struct blk_driver {
|
||||
const char *if_typename;
|
||||
enum if_type if_type;
|
||||
int max_devs;
|
||||
struct blk_desc *desc;
|
||||
/**
|
||||
* get_dev() - get a pointer to a block device given its number
|
||||
*
|
||||
* Each interface allocates its own devices and typically
|
||||
* struct blk_desc is contained with the interface's data structure.
|
||||
* There is no global numbering for block devices. This method allows
|
||||
* the device for an interface type to be obtained when @desc is NULL.
|
||||
*
|
||||
* @devnum: Device number (0 for first device on that interface,
|
||||
* 1 for second, etc.
|
||||
* @descp: Returns pointer to the block device on success
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int (*get_dev)(int devnum, struct blk_desc **descp);
|
||||
|
||||
/**
|
||||
* select_hwpart() - Select a hardware partition
|
||||
*
|
||||
* Some devices (e.g. MMC) can support partitioning at the hardware
|
||||
* level. This is quite separate from the normal idea of
|
||||
* software-based partitions. MMC hardware partitions must be
|
||||
* explicitly selected. Once selected only the region of the device
|
||||
* covered by that partition is accessible.
|
||||
*
|
||||
* The MMC standard provides for two boot partitions (numbered 1 and 2),
|
||||
* rpmb (3), and up to 4 addition general-purpose partitions (4-7).
|
||||
* Partition 0 is the main user-data partition.
|
||||
*
|
||||
* @desc: Block device descriptor
|
||||
* @hwpart: Hardware partition number to select. 0 means the main
|
||||
* user-data partition, 1 is the first partition, 2 is
|
||||
* the second, etc.
|
||||
* @return 0 if OK, other value for an error
|
||||
*/
|
||||
int (*select_hwpart)(struct blk_desc *desc, int hwpart);
|
||||
};
|
||||
|
||||
/*
|
||||
* Declare a new U-Boot legacy block driver. New drivers should use driver
|
||||
* model (UCLASS_BLK).
|
||||
*/
|
||||
#define U_BOOT_LEGACY_BLK(__name) \
|
||||
ll_entry_declare(struct blk_driver, __name, blk_driver)
|
||||
|
||||
struct blk_driver *blk_driver_lookup_type(int if_type);
|
||||
|
||||
#endif /* !CONFIG_BLK */
|
||||
|
||||
/**
|
||||
* blk_get_devnum_by_typename() - Get a block device by type and number
|
||||
*
|
||||
* This looks through the available block devices of the given type, returning
|
||||
* the one with the given @devnum.
|
||||
*
|
||||
* @if_type: Block device type
|
||||
* @devnum: Device number
|
||||
* @return point to block device descriptor, or NULL if not found
|
||||
*/
|
||||
struct blk_desc *blk_get_devnum_by_type(enum if_type if_type, int devnum);
|
||||
|
||||
/**
|
||||
* blk_get_devnum_by_type() - Get a block device by type name, and number
|
||||
*
|
||||
* This looks up the block device type based on @if_typename, then calls
|
||||
* blk_get_devnum_by_type().
|
||||
*
|
||||
* @if_typename: Block device type name
|
||||
* @devnum: Device number
|
||||
* @return point to block device descriptor, or NULL if not found
|
||||
*/
|
||||
struct blk_desc *blk_get_devnum_by_typename(const char *if_typename,
|
||||
int devnum);
|
||||
|
||||
/**
|
||||
* blk_dselect_hwpart() - select a hardware partition
|
||||
*
|
||||
* This selects a hardware partition (such as is supported by MMC). The block
|
||||
* device size may change as this effectively points the block device to a
|
||||
* partition at the hardware level. See the select_hwpart() method above.
|
||||
*
|
||||
* @desc: Block device descriptor for the device to select
|
||||
* @hwpart: Partition number to select
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int blk_dselect_hwpart(struct blk_desc *desc, int hwpart);
|
||||
|
||||
/**
|
||||
* blk_list_part() - list the partitions for block devices of a given type
|
||||
*
|
||||
* This looks up the partition type for each block device of type @if_type,
|
||||
* then displays a list of partitions.
|
||||
*
|
||||
* @if_type: Block device type
|
||||
* @return 0 if OK, -ENODEV if there is none of that type
|
||||
*/
|
||||
int blk_list_part(enum if_type if_type);
|
||||
|
||||
/**
|
||||
* blk_list_devices() - list the block devices of a given type
|
||||
*
|
||||
* This lists each block device of the type @if_type, showing the capacity
|
||||
* as well as type-specific information.
|
||||
*
|
||||
* @if_type: Block device type
|
||||
*/
|
||||
void blk_list_devices(enum if_type if_type);
|
||||
|
||||
/**
|
||||
* blk_show_device() - show information about a given block device
|
||||
*
|
||||
* This shows the block device capacity as well as type-specific information.
|
||||
*
|
||||
* @if_type: Block device type
|
||||
* @devnum: Device number
|
||||
* @return 0 if OK, -ENODEV for invalid device number
|
||||
*/
|
||||
int blk_show_device(enum if_type if_type, int devnum);
|
||||
|
||||
/**
|
||||
* blk_print_device_num() - show information about a given block device
|
||||
*
|
||||
* This is similar to blk_show_device() but returns an error if the block
|
||||
* device type is unknown.
|
||||
*
|
||||
* @if_type: Block device type
|
||||
* @devnum: Device number
|
||||
* @return 0 if OK, -ENODEV for invalid device number, -ENOENT if the block
|
||||
* device is not connected
|
||||
*/
|
||||
int blk_print_device_num(enum if_type if_type, int devnum);
|
||||
|
||||
/**
|
||||
* blk_print_part_devnum() - print the partition information for a device
|
||||
*
|
||||
* @if_type: Block device type
|
||||
* @devnum: Device number
|
||||
* @return 0 if OK, -ENOENT if the block device is not connected, -ENOSYS if
|
||||
* the interface type is not supported, other -ve on other error
|
||||
*/
|
||||
int blk_print_part_devnum(enum if_type if_type, int devnum);
|
||||
|
||||
/**
|
||||
* blk_read_devnum() - read blocks from a device
|
||||
*
|
||||
* @if_type: Block device type
|
||||
* @devnum: Device number
|
||||
* @blkcnt: Number of blocks to read
|
||||
* @buffer: Address to write data to
|
||||
* @return number of blocks read, or -ve error number on error
|
||||
*/
|
||||
ulong blk_read_devnum(enum if_type if_type, int devnum, lbaint_t start,
|
||||
lbaint_t blkcnt, void *buffer);
|
||||
|
||||
/**
|
||||
* blk_write_devnum() - write blocks to a device
|
||||
*
|
||||
* @if_type: Block device type
|
||||
* @devnum: Device number
|
||||
* @blkcnt: Number of blocks to write
|
||||
* @buffer: Address to read data from
|
||||
* @return number of blocks written, or -ve error number on error
|
||||
*/
|
||||
ulong blk_write_devnum(enum if_type if_type, int devnum, lbaint_t start,
|
||||
lbaint_t blkcnt, const void *buffer);
|
||||
|
||||
/**
|
||||
* blk_select_hwpart_devnum() - select a hardware partition
|
||||
*
|
||||
* This is similar to blk_dselect_hwpart() but it looks up the interface and
|
||||
* device number.
|
||||
*
|
||||
* @if_type: Block device type
|
||||
* @devnum: Device number
|
||||
* @hwpart: Partition number to select
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int blk_select_hwpart_devnum(enum if_type if_type, int devnum, int hwpart);
|
||||
|
||||
/**
|
||||
* blk_get_if_type_name() - Get the name of an interface type
|
||||
*
|
||||
* @if_type: Interface type to check
|
||||
* @return name of interface, or NULL if none
|
||||
*/
|
||||
const char *blk_get_if_type_name(enum if_type if_type);
|
||||
|
||||
/**
|
||||
* blk_common_cmd() - handle common commands with block devices
|
||||
*
|
||||
* @args: Number of arguments to the command (argv[0] is the command itself)
|
||||
* @argv: Command arguments
|
||||
* @if_type: Interface type
|
||||
* @cur_devnump: Current device number for this interface type
|
||||
* @return 0 if OK, CMD_RET_ERROR on error
|
||||
*/
|
||||
int blk_common_cmd(int argc, char * const argv[], enum if_type if_type,
|
||||
int *cur_devnump);
|
||||
|
||||
#endif
|
||||
195
include/bloblist.h
Normal file
195
include/bloblist.h
Normal file
@@ -0,0 +1,195 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* This provides a standard way of passing information between boot phases
|
||||
* (TPL -> SPL -> U-Boot proper.)
|
||||
*
|
||||
* A list of blobs of data, tagged with their owner. The list resides in memory
|
||||
* and can be updated by SPL, U-Boot, etc.
|
||||
*
|
||||
* Copyright 2018 Google, Inc
|
||||
* Written by Simon Glass <sjg@chromium.org>
|
||||
*/
|
||||
|
||||
#ifndef __BLOBLIST_H
|
||||
#define __BLOBLIST_H
|
||||
|
||||
enum {
|
||||
BLOBLIST_VERSION = 0,
|
||||
BLOBLIST_MAGIC = 0xb00757a3,
|
||||
BLOBLIST_ALIGN = 16,
|
||||
};
|
||||
|
||||
enum bloblist_tag_t {
|
||||
BLOBLISTT_NONE = 0,
|
||||
|
||||
/* Vendor-specific tags are permitted here */
|
||||
BLOBLISTT_EC_HOSTEVENT, /* Chromium OS EC host-event mask */
|
||||
BLOBLISTT_SPL_HANDOFF, /* Hand-off info from SPL */
|
||||
BLOBLISTT_VBOOT_CTX, /* Chromium OS verified boot context */
|
||||
BLOBLISTT_VBOOT_HANDOFF, /* Chromium OS internal handoff info */
|
||||
};
|
||||
|
||||
/**
|
||||
* struct bloblist_hdr - header for the bloblist
|
||||
*
|
||||
* This is stored at the start of the bloblist which is always on a 16-byte
|
||||
* boundary. Records follow this header. The bloblist normally stays in the
|
||||
* same place in memory as SPL and U-Boot execute, but it can be safely moved
|
||||
* around.
|
||||
*
|
||||
* None of the bloblist structures contain pointers but it is possible to put
|
||||
* pointers inside a bloblist record if desired. This is not encouraged,
|
||||
* since it can make part of the bloblist inaccessible if the pointer is
|
||||
* no-longer valid. It is better to just store all the data inside a bloblist
|
||||
* record.
|
||||
*
|
||||
* Each bloblist record is aligned to a 16-byte boundary and follows immediately
|
||||
* from the last.
|
||||
*
|
||||
* @version: BLOBLIST_VERSION
|
||||
* @hdr_size: Size of this header, normally sizeof(struct bloblist_hdr). The
|
||||
* first bloblist_rec starts at this offset from the start of the header
|
||||
* @flags: Space for BLOBLISTF_... flags (none yet)
|
||||
* @magic: BLOBLIST_MAGIC
|
||||
* @size: Total size of all records (non-zero if valid) including this header.
|
||||
* The bloblist extends for this many bytes from the start of this header.
|
||||
* @alloced: Total size allocated for this bloblist. When adding new records,
|
||||
* the bloblist can grow up to this size. This starts out as
|
||||
* sizeof(bloblist_hdr) since we need at least that much space to store a
|
||||
* valid bloblist
|
||||
* @spare: Space space
|
||||
* @chksum: CRC32 for the entire bloblist allocated area. Since any of the
|
||||
* blobs can be altered after being created, this checksum is only valid
|
||||
* when the bloblist is finalised before jumping to the next stage of boot.
|
||||
* Note: @chksum is last to make it easier to exclude it from the checksum
|
||||
* calculation.
|
||||
*/
|
||||
struct bloblist_hdr {
|
||||
u32 version;
|
||||
u32 hdr_size;
|
||||
u32 flags;
|
||||
u32 magic;
|
||||
|
||||
u32 size;
|
||||
u32 alloced;
|
||||
u32 spare;
|
||||
u32 chksum;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct bloblist_rec - record for the bloblist
|
||||
*
|
||||
* NOTE: Only exported for testing purposes. Do not use this struct.
|
||||
*
|
||||
* The bloblist contains a number of records each consisting of this record
|
||||
* structure followed by the data contained. Each records is 16-byte aligned.
|
||||
*
|
||||
* @tag: Tag indicating what the record contains
|
||||
* @hdr_size: Size of this header, normally sizeof(struct bloblist_rec). The
|
||||
* record's data starts at this offset from the start of the record
|
||||
* @size: Size of record in bytes, excluding the header size. This does not
|
||||
* need to be aligned (e.g. 3 is OK).
|
||||
* @spare: Spare space for other things
|
||||
*/
|
||||
struct bloblist_rec {
|
||||
u32 tag;
|
||||
u32 hdr_size;
|
||||
u32 size;
|
||||
u32 spare;
|
||||
};
|
||||
|
||||
/**
|
||||
* bloblist_find() - Find a blob
|
||||
*
|
||||
* Searches the bloblist and returns the blob with the matching tag
|
||||
*
|
||||
* @tag: Tag to search for (enum bloblist_tag_t)
|
||||
* @size: Expected size of the blob
|
||||
* @return pointer to blob if found, or NULL if not found, or a blob was found
|
||||
* but it is the wrong size
|
||||
*/
|
||||
void *bloblist_find(uint tag, int size);
|
||||
|
||||
/**
|
||||
* bloblist_add() - Add a new blob
|
||||
*
|
||||
* Add a new blob to the bloblist
|
||||
*
|
||||
* This should only be called if you konw there is no existing blob for a
|
||||
* particular tag. It is typically safe to call in the first phase of U-Boot
|
||||
* (e.g. TPL or SPL). After that, bloblist_ensure() should be used instead.
|
||||
*
|
||||
* @tag: Tag to add (enum bloblist_tag_t)
|
||||
* @size: Size of the blob
|
||||
* @return pointer to the newly added block, or NULL if there is not enough
|
||||
* space for the blob
|
||||
*/
|
||||
void *bloblist_add(uint tag, int size);
|
||||
|
||||
/**
|
||||
* bloblist_ensure_size() - Find or add a blob
|
||||
*
|
||||
* Find an existing blob, or add a new one if not found
|
||||
*
|
||||
* @tag: Tag to add (enum bloblist_tag_t)
|
||||
* @size: Size of the blob
|
||||
* @blobp: Returns a pointer to blob on success
|
||||
* @return 0 if OK, -ENOSPC if it is missing and could not be added due to lack
|
||||
* of space, or -ESPIPE it exists but has the wrong size
|
||||
*/
|
||||
int bloblist_ensure_size(uint tag, int size, void **blobp);
|
||||
|
||||
/**
|
||||
* bloblist_ensure() - Find or add a blob
|
||||
*
|
||||
* Find an existing blob, or add a new one if not found
|
||||
*
|
||||
* @tag: Tag to add (enum bloblist_tag_t)
|
||||
* @size: Size of the blob
|
||||
* @return pointer to blob, or NULL if it is missing and could not be added due
|
||||
* to lack of space, or it exists but has the wrong size
|
||||
*/
|
||||
void *bloblist_ensure(uint tag, int size);
|
||||
|
||||
/**
|
||||
* bloblist_new() - Create a new, empty bloblist of a given size
|
||||
*
|
||||
* @addr: Address of bloblist
|
||||
* @size: Initial size for bloblist
|
||||
* @flags: Flags to use for bloblist
|
||||
* @return 0 if OK, -EFAULT if addr is not aligned correctly, -ENOSPC is the
|
||||
* area is not large enough
|
||||
*/
|
||||
int bloblist_new(ulong addr, uint size, uint flags);
|
||||
|
||||
/**
|
||||
* bloblist_check() - Check if a bloblist exists
|
||||
*
|
||||
* @addr: Address of bloblist
|
||||
* @size: Expected size of blobsize, or 0 to detect the size
|
||||
* @return 0 if OK, -ENOENT if the magic number doesn't match (indicating that
|
||||
* there problem is no bloblist at the given address), -EPROTONOSUPPORT
|
||||
* if the version does not match, -EIO if the checksum does not match,
|
||||
* -EFBIG if the expected size does not match the detected size
|
||||
*/
|
||||
int bloblist_check(ulong addr, uint size);
|
||||
|
||||
/**
|
||||
* bloblist_finish() - Set up the bloblist for the next U-Boot part
|
||||
*
|
||||
* This sets the correct checksum for the bloblist. This ensures that the
|
||||
* bloblist will be detected correctly by the next phase of U-Boot.
|
||||
*
|
||||
* @return 0
|
||||
*/
|
||||
int bloblist_finish(void);
|
||||
|
||||
/**
|
||||
* bloblist_init() - Init the bloblist system with a single bloblist
|
||||
*
|
||||
* This uses CONFIG_BLOBLIST_ADDR and CONFIG_BLOBLIST_SIZE to set up a bloblist
|
||||
* for use by U-Boot.
|
||||
*/
|
||||
int bloblist_init(void);
|
||||
|
||||
#endif /* __BLOBLIST_H */
|
||||
59
include/bmp_layout.h
Normal file
59
include/bmp_layout.h
Normal file
@@ -0,0 +1,59 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/* (C) Copyright 2002
|
||||
* Detlev Zundel, DENX Software Engineering, dzu@denx.de.
|
||||
*/
|
||||
|
||||
/************************************************************************/
|
||||
/* ** Layout of a bmp file */
|
||||
/************************************************************************/
|
||||
|
||||
#ifndef _BMP_H_
|
||||
#define _BMP_H_
|
||||
|
||||
struct __packed bmp_color_table_entry {
|
||||
__u8 blue;
|
||||
__u8 green;
|
||||
__u8 red;
|
||||
__u8 reserved;
|
||||
};
|
||||
|
||||
/* When accessing these fields, remember that they are stored in little
|
||||
endian format, so use linux macros, e.g. le32_to_cpu(width) */
|
||||
|
||||
struct __packed bmp_header {
|
||||
/* Header */
|
||||
char signature[2];
|
||||
__u32 file_size;
|
||||
__u32 reserved;
|
||||
__u32 data_offset;
|
||||
/* InfoHeader */
|
||||
__u32 size;
|
||||
__u32 width;
|
||||
__u32 height;
|
||||
__u16 planes;
|
||||
__u16 bit_count;
|
||||
__u32 compression;
|
||||
__u32 image_size;
|
||||
__u32 x_pixels_per_m;
|
||||
__u32 y_pixels_per_m;
|
||||
__u32 colors_used;
|
||||
__u32 colors_important;
|
||||
/* ColorTable */
|
||||
};
|
||||
|
||||
struct bmp_image {
|
||||
struct bmp_header header;
|
||||
/* We use a zero sized array just as a placeholder for variable
|
||||
sized array */
|
||||
struct bmp_color_table_entry color_table[0];
|
||||
};
|
||||
|
||||
/* Data in the bmp_image is aligned to this length */
|
||||
#define BMP_DATA_ALIGN 4
|
||||
|
||||
/* Constants for the compression field */
|
||||
#define BMP_BI_RGB 0
|
||||
#define BMP_BI_RLE8 1
|
||||
#define BMP_BI_RLE4 2
|
||||
|
||||
#endif /* _BMP_H_ */
|
||||
139
include/board.h
Normal file
139
include/board.h
Normal file
@@ -0,0 +1,139 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2017
|
||||
* Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc
|
||||
*/
|
||||
|
||||
/*
|
||||
* This uclass encapsulates hardware methods to gather information about a
|
||||
* board or a specific device such as hard-wired GPIOs on GPIO expanders,
|
||||
* read-only data in flash ICs, or similar.
|
||||
*
|
||||
* The interface offers functions to read the usual standard data types (bool,
|
||||
* int, string) from the device, each of which is identified by a static
|
||||
* numeric ID (which will usually be defined as a enum in a header file).
|
||||
*
|
||||
* If for example the board had a read-only serial number flash IC, we could
|
||||
* call
|
||||
*
|
||||
* ret = board_detect(dev);
|
||||
* if (ret) {
|
||||
* debug("board device not found.");
|
||||
* return ret;
|
||||
* }
|
||||
*
|
||||
* ret = board_get_int(dev, ID_SERIAL_NUMBER, &serial);
|
||||
* if (ret) {
|
||||
* debug("Error when reading serial number from device.");
|
||||
* return ret;
|
||||
* }
|
||||
*
|
||||
* to read the serial number.
|
||||
*/
|
||||
|
||||
struct board_ops {
|
||||
/**
|
||||
* detect() - Run the hardware info detection procedure for this
|
||||
* device.
|
||||
* @dev: The device containing the information
|
||||
*
|
||||
* This operation might take a long time (e.g. read from EEPROM,
|
||||
* check the presence of a device on a bus etc.), hence this is not
|
||||
* done in the probe() method, but later during operation in this
|
||||
* dedicated method.
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int (*detect)(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* get_bool() - Read a specific bool data value that describes the
|
||||
* hardware setup.
|
||||
* @dev: The board instance to gather the data.
|
||||
* @id: A unique identifier for the bool value to be read.
|
||||
* @val: Pointer to a buffer that receives the value read.
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int (*get_bool)(struct udevice *dev, int id, bool *val);
|
||||
|
||||
/**
|
||||
* get_int() - Read a specific int data value that describes the
|
||||
* hardware setup.
|
||||
* @dev: The board instance to gather the data.
|
||||
* @id: A unique identifier for the int value to be read.
|
||||
* @val: Pointer to a buffer that receives the value read.
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int (*get_int)(struct udevice *dev, int id, int *val);
|
||||
|
||||
/**
|
||||
* get_str() - Read a specific string data value that describes the
|
||||
* hardware setup.
|
||||
* @dev: The board instance to gather the data.
|
||||
* @id: A unique identifier for the string value to be read.
|
||||
* @size: The size of the buffer to receive the string data.
|
||||
* @val: Pointer to a buffer that receives the value read.
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int (*get_str)(struct udevice *dev, int id, size_t size, char *val);
|
||||
};
|
||||
|
||||
#define board_get_ops(dev) ((struct board_ops *)(dev)->driver->ops)
|
||||
|
||||
/**
|
||||
* board_detect() - Run the hardware info detection procedure for this device.
|
||||
*
|
||||
* @dev: The device containing the information
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int board_detect(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* board_get_bool() - Read a specific bool data value that describes the
|
||||
* hardware setup.
|
||||
* @dev: The board instance to gather the data.
|
||||
* @id: A unique identifier for the bool value to be read.
|
||||
* @val: Pointer to a buffer that receives the value read.
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int board_get_bool(struct udevice *dev, int id, bool *val);
|
||||
|
||||
/**
|
||||
* board_get_int() - Read a specific int data value that describes the
|
||||
* hardware setup.
|
||||
* @dev: The board instance to gather the data.
|
||||
* @id: A unique identifier for the int value to be read.
|
||||
* @val: Pointer to a buffer that receives the value read.
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int board_get_int(struct udevice *dev, int id, int *val);
|
||||
|
||||
/**
|
||||
* board_get_str() - Read a specific string data value that describes the
|
||||
* hardware setup.
|
||||
* @dev: The board instance to gather the data.
|
||||
* @id: A unique identifier for the string value to be read.
|
||||
* @size: The size of the buffer to receive the string data.
|
||||
* @val: Pointer to a buffer that receives the value read.
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int board_get_str(struct udevice *dev, int id, size_t size, char *val);
|
||||
|
||||
/**
|
||||
* board_get() - Return the board device for the board in question.
|
||||
* @devp: Pointer to structure to receive the board device.
|
||||
*
|
||||
* Since there can only be at most one board instance, the API can supply a
|
||||
* function that returns the unique device. This is especially useful for use
|
||||
* in board files.
|
||||
*
|
||||
* Return: 0 if OK, -ve on error.
|
||||
*/
|
||||
int board_get(struct udevice **devp);
|
||||
13
include/boot_fit.h
Normal file
13
include/boot_fit.h
Normal file
@@ -0,0 +1,13 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2017 Texas Instruments
|
||||
* Written by Franklin Cooper Jr. <fcooper@ti.com>
|
||||
*/
|
||||
|
||||
/**
|
||||
* locate_dtb_in_fit - Find a DTB matching the board in a FIT image
|
||||
* @fit: pointer to the FIT image
|
||||
*
|
||||
* @return a pointer to a matching DTB blob if found, NULL otherwise
|
||||
*/
|
||||
void *locate_dtb_in_fit(const void *fit);
|
||||
144
include/bootcount.h
Normal file
144
include/bootcount.h
Normal file
@@ -0,0 +1,144 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2012
|
||||
* Stefan Roese, DENX Software Engineering, sr@denx.de.
|
||||
*/
|
||||
#ifndef _BOOTCOUNT_H__
|
||||
#define _BOOTCOUNT_H__
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/byteorder.h>
|
||||
#include <env.h>
|
||||
|
||||
#ifdef CONFIG_DM_BOOTCOUNT
|
||||
|
||||
struct bootcount_ops {
|
||||
/**
|
||||
* get() - get the current bootcount value
|
||||
*
|
||||
* Returns the current counter value of the bootcount backing
|
||||
* store.
|
||||
*
|
||||
* @dev: Device to read from
|
||||
* @bootcount: Address to put the current bootcount value
|
||||
*/
|
||||
int (*get)(struct udevice *dev, u32 *bootcount);
|
||||
|
||||
/**
|
||||
* set() - set a bootcount value (e.g. to reset or increment)
|
||||
*
|
||||
* Sets the value in the bootcount backing store.
|
||||
*
|
||||
* @dev: Device to read from
|
||||
* @bootcount: New bootcount value to store
|
||||
*/
|
||||
int (*set)(struct udevice *dev, const u32 bootcount);
|
||||
};
|
||||
|
||||
/* Access the operations for a bootcount device */
|
||||
#define bootcount_get_ops(dev) ((struct bootcount_ops *)(dev)->driver->ops)
|
||||
|
||||
/**
|
||||
* dm_bootcount_get() - Read the current value from a bootcount storage
|
||||
*
|
||||
* @dev: Device to read from
|
||||
* @bootcount: Place to put the current bootcount
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int dm_bootcount_get(struct udevice *dev, u32 *bootcount);
|
||||
|
||||
/**
|
||||
* dm_bootcount_set() - Write a value to a bootcount storage
|
||||
*
|
||||
* @dev: Device to read from
|
||||
* @bootcount: Value to be written to the backing storage
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int dm_bootcount_set(struct udevice *dev, u32 bootcount);
|
||||
|
||||
#endif
|
||||
|
||||
/** bootcount_store() - store the current bootcount */
|
||||
void bootcount_store(ulong);
|
||||
|
||||
/**
|
||||
* bootcount_load() - load the current bootcount
|
||||
*
|
||||
* @return bootcount, read from the appropriate location
|
||||
*/
|
||||
ulong bootcount_load(void);
|
||||
|
||||
#if defined(CONFIG_SPL_BOOTCOUNT_LIMIT) || defined(CONFIG_BOOTCOUNT_LIMIT)
|
||||
|
||||
#if !defined(CONFIG_SYS_BOOTCOUNT_LE) && !defined(CONFIG_SYS_BOOTCOUNT_BE)
|
||||
# if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
# define CONFIG_SYS_BOOTCOUNT_LE
|
||||
# else
|
||||
# define CONFIG_SYS_BOOTCOUNT_BE
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SYS_BOOTCOUNT_LE
|
||||
static inline void raw_bootcount_store(volatile u32 *addr, u32 data)
|
||||
{
|
||||
out_le32(addr, data);
|
||||
}
|
||||
|
||||
static inline u32 raw_bootcount_load(volatile u32 *addr)
|
||||
{
|
||||
return in_le32(addr);
|
||||
}
|
||||
#else
|
||||
static inline void raw_bootcount_store(volatile u32 *addr, u32 data)
|
||||
{
|
||||
out_be32(addr, data);
|
||||
}
|
||||
|
||||
static inline u32 raw_bootcount_load(volatile u32 *addr)
|
||||
{
|
||||
return in_be32(addr);
|
||||
}
|
||||
#endif
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
static inline int bootcount_error(void)
|
||||
{
|
||||
unsigned long bootcount = bootcount_load();
|
||||
unsigned long bootlimit = env_get_ulong("bootlimit", 10, 0);
|
||||
|
||||
if (bootlimit && bootcount > bootlimit) {
|
||||
printf("Warning: Bootlimit (%lu) exceeded.", bootlimit);
|
||||
if (!(gd->flags & GD_FLG_SPL_INIT))
|
||||
printf(" Using altbootcmd.");
|
||||
printf("\n");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void bootcount_inc(void)
|
||||
{
|
||||
unsigned long bootcount = bootcount_load();
|
||||
|
||||
if (gd->flags & GD_FLG_SPL_INIT) {
|
||||
bootcount_store(++bootcount);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
/* Only increment bootcount when no bootcount support in SPL */
|
||||
#ifndef CONFIG_SPL_BOOTCOUNT_LIMIT
|
||||
bootcount_store(++bootcount);
|
||||
#endif
|
||||
env_set_ulong("bootcount", bootcount);
|
||||
#endif /* !CONFIG_SPL_BUILD */
|
||||
}
|
||||
|
||||
#else
|
||||
static inline int bootcount_error(void) { return 0; }
|
||||
static inline void bootcount_inc(void) {}
|
||||
#endif /* CONFIG_SPL_BOOTCOUNT_LIMIT || CONFIG_BOOTCOUNT_LIMIT */
|
||||
#endif /* _BOOTCOUNT_H__ */
|
||||
75
include/bootm.h
Normal file
75
include/bootm.h
Normal file
@@ -0,0 +1,75 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2000-2009
|
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
*/
|
||||
|
||||
#ifndef _BOOTM_H
|
||||
#define _BOOTM_H
|
||||
|
||||
#include <command.h>
|
||||
#include <image.h>
|
||||
|
||||
#define BOOTM_ERR_RESET (-1)
|
||||
#define BOOTM_ERR_OVERLAP (-2)
|
||||
#define BOOTM_ERR_UNIMPLEMENTED (-3)
|
||||
|
||||
/*
|
||||
* Continue booting an OS image; caller already has:
|
||||
* - copied image header to global variable `header'
|
||||
* - checked header magic number, checksums (both header & image),
|
||||
* - verified image architecture (PPC) and type (KERNEL or MULTI),
|
||||
* - loaded (first part of) image to header load address,
|
||||
* - disabled interrupts.
|
||||
*
|
||||
* @flag: Flags indicating what to do (BOOTM_STATE_...)
|
||||
* @argc: Number of arguments. Note that the arguments are shifted down
|
||||
* so that 0 is the first argument not processed by U-Boot, and
|
||||
* argc is adjusted accordingly. This avoids confusion as to how
|
||||
* many arguments are available for the OS.
|
||||
* @images: Pointers to os/initrd/fdt
|
||||
* @return 1 on error. On success the OS boots so this function does
|
||||
* not return.
|
||||
*/
|
||||
typedef int boot_os_fn(int flag, int argc, char * const argv[],
|
||||
bootm_headers_t *images);
|
||||
|
||||
extern boot_os_fn do_bootm_linux;
|
||||
extern boot_os_fn do_bootm_vxworks;
|
||||
|
||||
int do_bootelf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
|
||||
void lynxkdi_boot(image_header_t *hdr);
|
||||
|
||||
boot_os_fn *bootm_os_get_boot_func(int os);
|
||||
|
||||
#if defined(CONFIG_FIT_SIGNATURE)
|
||||
int bootm_host_load_images(const void *fit, int cfg_noffset);
|
||||
#endif
|
||||
|
||||
int boot_selected_os(int argc, char * const argv[], int state,
|
||||
bootm_headers_t *images, boot_os_fn *boot_fn);
|
||||
|
||||
ulong bootm_disable_interrupts(void);
|
||||
|
||||
/* This is a special function used by booti/bootz */
|
||||
int bootm_find_images(int flag, int argc, char * const argv[]);
|
||||
|
||||
int do_bootm_states(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
|
||||
int states, bootm_headers_t *images, int boot_progress);
|
||||
|
||||
void arch_preboot_os(void);
|
||||
|
||||
/*
|
||||
* boards should define this to disable devices when EFI exits from boot
|
||||
* services.
|
||||
*
|
||||
* TODO(sjg@chromium.org>): Update this to use driver model's device_remove().
|
||||
*/
|
||||
void board_quiesce_devices(void);
|
||||
|
||||
/**
|
||||
* switch_to_non_secure_mode() - switch to non-secure mode
|
||||
*/
|
||||
void switch_to_non_secure_mode(void);
|
||||
|
||||
#endif
|
||||
58
include/bootretry.h
Normal file
58
include/bootretry.h
Normal file
@@ -0,0 +1,58 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2000
|
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
*/
|
||||
|
||||
#ifndef __BOOTRETRY_H
|
||||
#define __BOOTRETRY_H
|
||||
|
||||
#ifdef CONFIG_BOOT_RETRY_TIME
|
||||
/**
|
||||
* bootretry_tstc_timeout() - ensure we get a keypress before timeout
|
||||
*
|
||||
* Check for a keypress repeatedly, resetting the watchdog each time. If a
|
||||
* keypress is not received within the command timeout, return an error.
|
||||
*
|
||||
* @return 0 if a key is received in time, -ETIMEDOUT if not
|
||||
*/
|
||||
int bootretry_tstc_timeout(void);
|
||||
|
||||
/**
|
||||
* bootretry_init_cmd_timeout() - set up command timeout
|
||||
*
|
||||
* Get the required command timeout from the environment.
|
||||
*/
|
||||
void bootretry_init_cmd_timeout(void);
|
||||
|
||||
/**
|
||||
* bootretry_reset_cmd_timeout() - reset command timeout
|
||||
*
|
||||
* Reset the command timeout so that the user has a fresh start. This is
|
||||
* typically used when input is received from the user.
|
||||
*/
|
||||
void bootretry_reset_cmd_timeout(void);
|
||||
|
||||
/** bootretry_dont_retry() - Indicate that we should not retry the boot */
|
||||
void bootretry_dont_retry(void);
|
||||
#else
|
||||
static inline int bootretry_tstc_timeout(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void bootretry_init_cmd_timeout(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void bootretry_reset_cmd_timeout(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void bootretry_dont_retry(void)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
435
include/bootstage.h
Normal file
435
include/bootstage.h
Normal file
@@ -0,0 +1,435 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* This file implements recording of each stage of the boot process. It is
|
||||
* intended to implement timing of each stage, reporting this information
|
||||
* to the user and passing it to the OS for logging / further analysis.
|
||||
* Note that it requires timer_get_boot_us() to be defined by the board
|
||||
*
|
||||
* Copyright (c) 2011 The Chromium OS Authors.
|
||||
*/
|
||||
|
||||
#ifndef _BOOTSTAGE_H
|
||||
#define _BOOTSTAGE_H
|
||||
|
||||
/* Flags for each bootstage record */
|
||||
enum bootstage_flags {
|
||||
BOOTSTAGEF_ERROR = 1 << 0, /* Error record */
|
||||
BOOTSTAGEF_ALLOC = 1 << 1, /* Allocate an id */
|
||||
};
|
||||
|
||||
/* bootstate sub-IDs used for kernel and ramdisk ranges */
|
||||
enum {
|
||||
BOOTSTAGE_SUB_FORMAT,
|
||||
BOOTSTAGE_SUB_FORMAT_OK,
|
||||
BOOTSTAGE_SUB_NO_UNIT_NAME,
|
||||
BOOTSTAGE_SUB_UNIT_NAME,
|
||||
BOOTSTAGE_SUB_SUBNODE,
|
||||
|
||||
BOOTSTAGE_SUB_CHECK,
|
||||
BOOTSTAGE_SUB_HASH = 5,
|
||||
BOOTSTAGE_SUB_CHECK_ARCH = 5,
|
||||
BOOTSTAGE_SUB_CHECK_ALL,
|
||||
BOOTSTAGE_SUB_GET_DATA,
|
||||
BOOTSTAGE_SUB_CHECK_ALL_OK = 7,
|
||||
BOOTSTAGE_SUB_GET_DATA_OK,
|
||||
BOOTSTAGE_SUB_LOAD,
|
||||
};
|
||||
|
||||
/*
|
||||
* A list of boot stages that we know about. Each of these indicates the
|
||||
* state that we are at, and the action that we are about to perform. For
|
||||
* errors, we issue an error for an item when it fails. Therefore the
|
||||
* normal sequence is:
|
||||
*
|
||||
* progress action1
|
||||
* progress action2
|
||||
* progress action3
|
||||
*
|
||||
* and an error condition where action 3 failed would be:
|
||||
*
|
||||
* progress action1
|
||||
* progress action2
|
||||
* progress action3
|
||||
* error on action3
|
||||
*/
|
||||
enum bootstage_id {
|
||||
BOOTSTAGE_ID_START = 0,
|
||||
BOOTSTAGE_ID_CHECK_MAGIC, /* Checking image magic */
|
||||
BOOTSTAGE_ID_CHECK_HEADER, /* Checking image header */
|
||||
BOOTSTAGE_ID_CHECK_CHECKSUM, /* Checking image checksum */
|
||||
BOOTSTAGE_ID_CHECK_ARCH, /* Checking architecture */
|
||||
|
||||
BOOTSTAGE_ID_CHECK_IMAGETYPE = 5,/* Checking image type */
|
||||
BOOTSTAGE_ID_DECOMP_IMAGE, /* Decompressing image */
|
||||
BOOTSTAGE_ID_KERNEL_LOADED, /* Kernel has been loaded */
|
||||
BOOTSTAGE_ID_DECOMP_UNIMPL = 7, /* Odd decompression algorithm */
|
||||
BOOTSTAGE_ID_CHECK_BOOT_OS, /* Calling OS-specific boot function */
|
||||
BOOTSTAGE_ID_BOOT_OS_RETURNED, /* Tried to boot OS, but it returned */
|
||||
BOOTSTAGE_ID_CHECK_RAMDISK = 9, /* Checking ram disk */
|
||||
|
||||
BOOTSTAGE_ID_RD_MAGIC, /* Checking ram disk magic */
|
||||
BOOTSTAGE_ID_RD_HDR_CHECKSUM, /* Checking ram disk heder checksum */
|
||||
BOOTSTAGE_ID_RD_CHECKSUM, /* Checking ram disk checksum */
|
||||
BOOTSTAGE_ID_COPY_RAMDISK = 12, /* Copying ram disk into place */
|
||||
BOOTSTAGE_ID_RAMDISK, /* Checking for valid ramdisk */
|
||||
BOOTSTAGE_ID_NO_RAMDISK, /* No ram disk found (not an error) */
|
||||
|
||||
BOOTSTAGE_ID_RUN_OS = 15, /* Exiting U-Boot, entering OS */
|
||||
|
||||
BOOTSTAGE_ID_NEED_RESET = 30,
|
||||
BOOTSTAGE_ID_POST_FAIL, /* Post failure */
|
||||
BOOTSTAGE_ID_POST_FAIL_R, /* Post failure reported after reloc */
|
||||
|
||||
/*
|
||||
* This set is reported only by x86, and the meaning is different. In
|
||||
* this case we are reporting completion of a particular stage.
|
||||
* This should probably change in the x86 code (which doesn't report
|
||||
* errors in any case), but discussion this can perhaps wait until we
|
||||
* have a generic board implementation.
|
||||
*/
|
||||
BOOTSTAGE_ID_BOARD_INIT_R, /* We have relocated */
|
||||
BOOTSTAGE_ID_BOARD_GLOBAL_DATA, /* Global data is set up */
|
||||
|
||||
BOOTSTAGE_ID_BOARD_INIT_SEQ, /* We completed the init sequence */
|
||||
BOOTSTAGE_ID_BOARD_FLASH, /* We have configured flash banks */
|
||||
BOOTSTAGE_ID_BOARD_FLASH_37, /* In case you didn't hear... */
|
||||
BOOTSTAGE_ID_BOARD_ENV, /* Environment is relocated & ready */
|
||||
BOOTSTAGE_ID_BOARD_PCI, /* PCI is up */
|
||||
|
||||
BOOTSTAGE_ID_BOARD_INTERRUPTS, /* Exceptions / interrupts ready */
|
||||
BOOTSTAGE_ID_BOARD_DONE, /* Board init done, off to main loop */
|
||||
/* ^^^ here ends the x86 sequence */
|
||||
|
||||
/* Boot stages related to loading a kernel from an IDE device */
|
||||
BOOTSTAGE_ID_IDE_START = 41,
|
||||
BOOTSTAGE_ID_IDE_ADDR,
|
||||
BOOTSTAGE_ID_IDE_BOOT_DEVICE,
|
||||
BOOTSTAGE_ID_IDE_TYPE,
|
||||
|
||||
BOOTSTAGE_ID_IDE_PART,
|
||||
BOOTSTAGE_ID_IDE_PART_INFO,
|
||||
BOOTSTAGE_ID_IDE_PART_TYPE,
|
||||
BOOTSTAGE_ID_IDE_PART_READ,
|
||||
BOOTSTAGE_ID_IDE_FORMAT,
|
||||
|
||||
BOOTSTAGE_ID_IDE_CHECKSUM, /* 50 */
|
||||
BOOTSTAGE_ID_IDE_READ,
|
||||
|
||||
/* Boot stages related to loading a kernel from an NAND device */
|
||||
BOOTSTAGE_ID_NAND_PART,
|
||||
BOOTSTAGE_ID_NAND_SUFFIX,
|
||||
BOOTSTAGE_ID_NAND_BOOT_DEVICE,
|
||||
BOOTSTAGE_ID_NAND_HDR_READ = 55,
|
||||
BOOTSTAGE_ID_NAND_AVAILABLE = 55,
|
||||
BOOTSTAGE_ID_NAND_TYPE = 57,
|
||||
BOOTSTAGE_ID_NAND_READ,
|
||||
|
||||
/* Boot stages related to loading a kernel from an network device */
|
||||
BOOTSTAGE_ID_NET_CHECKSUM = 60,
|
||||
BOOTSTAGE_ID_NET_ETH_START = 64,
|
||||
BOOTSTAGE_ID_NET_ETH_INIT,
|
||||
|
||||
BOOTSTAGE_ID_NET_START = 80,
|
||||
BOOTSTAGE_ID_NET_NETLOOP_OK,
|
||||
BOOTSTAGE_ID_NET_LOADED,
|
||||
BOOTSTAGE_ID_NET_DONE_ERR,
|
||||
BOOTSTAGE_ID_NET_DONE,
|
||||
|
||||
BOOTSTAGE_ID_FIT_FDT_START = 90,
|
||||
/*
|
||||
* Boot stages related to loading a FIT image. Some of these are a
|
||||
* bit wonky.
|
||||
*/
|
||||
BOOTSTAGE_ID_FIT_KERNEL_START = 100,
|
||||
|
||||
BOOTSTAGE_ID_FIT_CONFIG = 110,
|
||||
BOOTSTAGE_ID_FIT_TYPE,
|
||||
BOOTSTAGE_ID_FIT_KERNEL_INFO,
|
||||
|
||||
BOOTSTAGE_ID_FIT_COMPRESSION,
|
||||
BOOTSTAGE_ID_FIT_OS,
|
||||
BOOTSTAGE_ID_FIT_LOADADDR,
|
||||
BOOTSTAGE_ID_OVERWRITTEN,
|
||||
|
||||
/* Next 10 IDs used by BOOTSTAGE_SUB_... */
|
||||
BOOTSTAGE_ID_FIT_RD_START = 120, /* Ramdisk stages */
|
||||
|
||||
/* Next 10 IDs used by BOOTSTAGE_SUB_... */
|
||||
BOOTSTAGE_ID_FIT_SETUP_START = 130, /* x86 setup stages */
|
||||
|
||||
BOOTSTAGE_ID_IDE_FIT_READ = 140,
|
||||
BOOTSTAGE_ID_IDE_FIT_READ_OK,
|
||||
|
||||
BOOTSTAGE_ID_NAND_FIT_READ = 150,
|
||||
BOOTSTAGE_ID_NAND_FIT_READ_OK,
|
||||
|
||||
BOOTSTAGE_ID_FIT_LOADABLE_START = 160, /* for Loadable Images */
|
||||
/*
|
||||
* These boot stages are new, higher level, and not directly related
|
||||
* to the old boot progress numbers. They are useful for recording
|
||||
* rough boot timing information.
|
||||
*/
|
||||
BOOTSTAGE_ID_AWAKE,
|
||||
BOOTSTAGE_ID_START_TPL,
|
||||
BOOTSTAGE_ID_END_TPL,
|
||||
BOOTSTAGE_ID_START_SPL,
|
||||
BOOTSTAGE_ID_END_SPL,
|
||||
BOOTSTAGE_ID_START_UBOOT_F,
|
||||
BOOTSTAGE_ID_START_UBOOT_R,
|
||||
BOOTSTAGE_ID_USB_START,
|
||||
BOOTSTAGE_ID_ETH_START,
|
||||
BOOTSTAGE_ID_BOOTP_START,
|
||||
BOOTSTAGE_ID_BOOTP_STOP,
|
||||
BOOTSTAGE_ID_BOOTM_START,
|
||||
BOOTSTAGE_ID_BOOTM_HANDOFF,
|
||||
BOOTSTAGE_ID_MAIN_LOOP,
|
||||
BOOTSTAGE_ID_ENTER_CLI_LOOP,
|
||||
BOOTSTAGE_KERNELREAD_START,
|
||||
BOOTSTAGE_KERNELREAD_STOP,
|
||||
BOOTSTAGE_ID_BOARD_INIT,
|
||||
BOOTSTAGE_ID_BOARD_INIT_DONE,
|
||||
|
||||
BOOTSTAGE_ID_CPU_AWAKE,
|
||||
BOOTSTAGE_ID_MAIN_CPU_AWAKE,
|
||||
BOOTSTAGE_ID_MAIN_CPU_READY,
|
||||
|
||||
BOOTSTAGE_ID_ACCUM_LCD,
|
||||
BOOTSTAGE_ID_ACCUM_SCSI,
|
||||
BOOTSTAGE_ID_ACCUM_SPI,
|
||||
BOOTSTAGE_ID_ACCUM_DECOMP,
|
||||
BOOTSTAGE_ID_ACCUM_OF_LIVE,
|
||||
BOOTSTAGE_ID_FPGA_INIT,
|
||||
BOOTSTATE_ID_ACCUM_DM_SPL,
|
||||
BOOTSTATE_ID_ACCUM_DM_F,
|
||||
BOOTSTATE_ID_ACCUM_DM_R,
|
||||
|
||||
/* a few spare for the user, from here */
|
||||
BOOTSTAGE_ID_USER,
|
||||
BOOTSTAGE_ID_ALLOC,
|
||||
};
|
||||
|
||||
/*
|
||||
* Return the time since boot in microseconds, This is needed for bootstage
|
||||
* and should be defined in CPU- or board-specific code. If undefined then
|
||||
* you will get a link error.
|
||||
*/
|
||||
ulong timer_get_boot_us(void);
|
||||
|
||||
#if defined(USE_HOSTCC)
|
||||
#define show_boot_progress(val) do {} while (0)
|
||||
#else
|
||||
/**
|
||||
* Board code can implement show_boot_progress() if needed.
|
||||
*
|
||||
* @param val Progress state (enum bootstage_id), or -id if an error
|
||||
* has occurred.
|
||||
*/
|
||||
void show_boot_progress(int val);
|
||||
#endif
|
||||
|
||||
#if !defined(USE_HOSTCC)
|
||||
#if CONFIG_IS_ENABLED(BOOTSTAGE)
|
||||
#define ENABLE_BOOTSTAGE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_BOOTSTAGE
|
||||
|
||||
/* This is the full bootstage implementation */
|
||||
|
||||
/**
|
||||
* Relocate existing bootstage records
|
||||
*
|
||||
* Call this after relocation has happened and after malloc has been initted.
|
||||
* We need to copy any pointers in bootstage records that were added pre-
|
||||
* relocation, since memory can be overwritten later.
|
||||
* @return Always returns 0, to indicate success
|
||||
*/
|
||||
int bootstage_relocate(void);
|
||||
|
||||
/**
|
||||
* Add a new bootstage record
|
||||
*
|
||||
* @param id Bootstage ID to use (ignored if flags & BOOTSTAGEF_ALLOC)
|
||||
* @param name Name of record, or NULL for none
|
||||
* @param flags Flags (BOOTSTAGEF_...)
|
||||
* @param mark Time to record in this record, in microseconds
|
||||
*/
|
||||
ulong bootstage_add_record(enum bootstage_id id, const char *name,
|
||||
int flags, ulong mark);
|
||||
|
||||
/**
|
||||
* Mark a time stamp for the current boot stage.
|
||||
*/
|
||||
ulong bootstage_mark(enum bootstage_id id);
|
||||
|
||||
ulong bootstage_error(enum bootstage_id id);
|
||||
|
||||
ulong bootstage_mark_name(enum bootstage_id id, const char *name);
|
||||
|
||||
/**
|
||||
* Mark a time stamp in the given function and line number
|
||||
*
|
||||
* See BOOTSTAGE_MARKER() for a convenient macro.
|
||||
*
|
||||
* @param file Filename to record (NULL if none)
|
||||
* @param func Function name to record
|
||||
* @param linenum Line number to record
|
||||
* @return recorded time stamp
|
||||
*/
|
||||
ulong bootstage_mark_code(const char *file, const char *func,
|
||||
int linenum);
|
||||
|
||||
/**
|
||||
* Mark the start of a bootstage activity. The end will be marked later with
|
||||
* bootstage_accum() and at that point we accumulate the time taken. Calling
|
||||
* this function turns the given id into a accumulator rather than and
|
||||
* absolute mark in time. Accumulators record the total amount of time spent
|
||||
* in an activty during boot.
|
||||
*
|
||||
* @param id Bootstage id to record this timestamp against
|
||||
* @param name Textual name to display for this id in the report (maybe NULL)
|
||||
* @return start timestamp in microseconds
|
||||
*/
|
||||
uint32_t bootstage_start(enum bootstage_id id, const char *name);
|
||||
|
||||
/**
|
||||
* Mark the end of a bootstage activity
|
||||
*
|
||||
* After previously marking the start of an activity with bootstage_start(),
|
||||
* call this function to mark the end. You can call these functions in pairs
|
||||
* as many times as you like.
|
||||
*
|
||||
* @param id Bootstage id to record this timestamp against
|
||||
* @return time spent in this iteration of the activity (i.e. the time now
|
||||
* less the start time recorded in the last bootstage_start() call
|
||||
* with this id.
|
||||
*/
|
||||
uint32_t bootstage_accum(enum bootstage_id id);
|
||||
|
||||
/* Print a report about boot time */
|
||||
void bootstage_report(void);
|
||||
|
||||
/**
|
||||
* Add bootstage information to the device tree
|
||||
*
|
||||
* @return 0 if ok, -ve on error
|
||||
*/
|
||||
int bootstage_fdt_add_report(void);
|
||||
|
||||
/**
|
||||
* Stash bootstage data into memory
|
||||
*
|
||||
* @param base Base address of memory buffer
|
||||
* @param size Size of memory buffer
|
||||
* @return 0 if stashed ok, -1 if out of space
|
||||
*/
|
||||
int bootstage_stash(void *base, int size);
|
||||
|
||||
/**
|
||||
* Read bootstage data from memory
|
||||
*
|
||||
* Bootstage data is read from memory and placed in the bootstage table
|
||||
* in the user records.
|
||||
*
|
||||
* @param base Base address of memory buffer
|
||||
* @param size Size of memory buffer (-1 if unknown)
|
||||
* @return 0 if unstashed ok, -ENOENT if bootstage info not found, -ENOSPC if
|
||||
* there is not space for read the stacked data, or other error if
|
||||
* something else went wrong
|
||||
*/
|
||||
int bootstage_unstash(const void *base, int size);
|
||||
|
||||
/**
|
||||
* bootstage_get_size() - Get the size of the bootstage data
|
||||
*
|
||||
* @return size of boostage data in bytes
|
||||
*/
|
||||
int bootstage_get_size(void);
|
||||
|
||||
/**
|
||||
* bootstage_init() - Prepare bootstage for use
|
||||
*
|
||||
* @first: true if this is the first time bootstage is set up. This causes it
|
||||
* to add a 'reset' record with a time of 0.
|
||||
*/
|
||||
int bootstage_init(bool first);
|
||||
|
||||
#else
|
||||
static inline ulong bootstage_add_record(enum bootstage_id id,
|
||||
const char *name, int flags, ulong mark)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is a dummy implementation which just calls show_boot_progress(),
|
||||
* and won't even do that unless CONFIG_SHOW_BOOT_PROGRESS is defined
|
||||
*/
|
||||
|
||||
static inline int bootstage_relocate(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline ulong bootstage_mark(enum bootstage_id id)
|
||||
{
|
||||
show_boot_progress(id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline ulong bootstage_error(enum bootstage_id id)
|
||||
{
|
||||
show_boot_progress(-id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline ulong bootstage_mark_name(enum bootstage_id id, const char *name)
|
||||
{
|
||||
show_boot_progress(id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline ulong bootstage_mark_code(const char *file, const char *func,
|
||||
int linenum)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline uint32_t bootstage_start(enum bootstage_id id, const char *name)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline uint32_t bootstage_accum(enum bootstage_id id)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int bootstage_stash(void *base, int size)
|
||||
{
|
||||
return 0; /* Pretend to succeed */
|
||||
}
|
||||
|
||||
static inline int bootstage_unstash(const void *base, int size)
|
||||
{
|
||||
return 0; /* Pretend to succeed */
|
||||
}
|
||||
|
||||
static inline int bootstage_get_size(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int bootstage_init(bool first)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* ENABLE_BOOTSTAGE */
|
||||
|
||||
/* Helper macro for adding a bootstage to a line of code */
|
||||
#define BOOTSTAGE_MARKER() \
|
||||
bootstage_mark_code(__FILE__, __func__, __LINE__)
|
||||
|
||||
#endif
|
||||
71
include/bouncebuf.h
Normal file
71
include/bouncebuf.h
Normal file
@@ -0,0 +1,71 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Generic bounce buffer implementation
|
||||
*
|
||||
* Copyright (C) 2012 Marek Vasut <marex@denx.de>
|
||||
*/
|
||||
|
||||
#ifndef __INCLUDE_BOUNCEBUF_H__
|
||||
#define __INCLUDE_BOUNCEBUF_H__
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/*
|
||||
* GEN_BB_READ -- Data are read from the buffer eg. by DMA hardware.
|
||||
* The source buffer is copied into the bounce buffer (if unaligned, otherwise
|
||||
* the source buffer is used directly) upon start() call, then the operation
|
||||
* requiring the aligned transfer happens, then the bounce buffer is lost upon
|
||||
* stop() call.
|
||||
*/
|
||||
#define GEN_BB_READ (1 << 0)
|
||||
/*
|
||||
* GEN_BB_WRITE -- Data are written into the buffer eg. by DMA hardware.
|
||||
* The source buffer starts in an undefined state upon start() call, then the
|
||||
* operation requiring the aligned transfer happens, then the bounce buffer is
|
||||
* copied into the destination buffer (if unaligned, otherwise destination
|
||||
* buffer is used directly) upon stop() call.
|
||||
*/
|
||||
#define GEN_BB_WRITE (1 << 1)
|
||||
/*
|
||||
* GEN_BB_RW -- Data are read and written into the buffer eg. by DMA hardware.
|
||||
* The source buffer is copied into the bounce buffer (if unaligned, otherwise
|
||||
* the source buffer is used directly) upon start() call, then the operation
|
||||
* requiring the aligned transfer happens, then the bounce buffer is copied
|
||||
* into the destination buffer (if unaligned, otherwise destination buffer is
|
||||
* used directly) upon stop() call.
|
||||
*/
|
||||
#define GEN_BB_RW (GEN_BB_READ | GEN_BB_WRITE)
|
||||
|
||||
struct bounce_buffer {
|
||||
/* Copy of data parameter passed to start() */
|
||||
void *user_buffer;
|
||||
/*
|
||||
* DMA-aligned buffer. This field is always set to the value that
|
||||
* should be used for DMA; either equal to .user_buffer, or to a
|
||||
* freshly allocated aligned buffer.
|
||||
*/
|
||||
void *bounce_buffer;
|
||||
/* Copy of len parameter passed to start() */
|
||||
size_t len;
|
||||
/* DMA-aligned buffer length */
|
||||
size_t len_aligned;
|
||||
/* Copy of flags parameter passed to start() */
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
/**
|
||||
* bounce_buffer_start() -- Start the bounce buffer session
|
||||
* state: stores state passed between bounce_buffer_{start,stop}
|
||||
* data: pointer to buffer to be aligned
|
||||
* len: length of the buffer
|
||||
* flags: flags describing the transaction, see above.
|
||||
*/
|
||||
int bounce_buffer_start(struct bounce_buffer *state, void *data,
|
||||
size_t len, unsigned int flags);
|
||||
/**
|
||||
* bounce_buffer_stop() -- Finish the bounce buffer session
|
||||
* state: stores state passed between bounce_buffer_{start,stop}
|
||||
*/
|
||||
int bounce_buffer_stop(struct bounce_buffer *state);
|
||||
|
||||
#endif
|
||||
20
include/btrfs.h
Normal file
20
include/btrfs.h
Normal file
@@ -0,0 +1,20 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* BTRFS filesystem implementation for U-Boot
|
||||
*
|
||||
* 2017 Marek Behun, CZ.NIC, marek.behun@nic.cz
|
||||
*/
|
||||
|
||||
#ifndef __U_BOOT_BTRFS_H__
|
||||
#define __U_BOOT_BTRFS_H__
|
||||
|
||||
int btrfs_probe(struct blk_desc *, disk_partition_t *);
|
||||
int btrfs_ls(const char *);
|
||||
int btrfs_exists(const char *);
|
||||
int btrfs_size(const char *, loff_t *);
|
||||
int btrfs_read(const char *, void *, loff_t, loff_t, loff_t *);
|
||||
void btrfs_close(void);
|
||||
int btrfs_uuid(char *);
|
||||
void btrfs_list_subvols(void);
|
||||
|
||||
#endif /* __U_BOOT_BTRFS_H__ */
|
||||
19
include/bus_vcxk.h
Normal file
19
include/bus_vcxk.h
Normal file
@@ -0,0 +1,19 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2005-2009
|
||||
* Jens Scharsig @ BuS Elektronik GmbH & Co. KG, <esw@bus-elektronik.de>
|
||||
*/
|
||||
|
||||
#ifndef __BUS_VCXK_H_
|
||||
#define __BUS_VCXK_H_
|
||||
|
||||
extern int vcxk_init(unsigned long width, unsigned long height);
|
||||
extern void vcxk_setpixel(int x, int y, unsigned long color);
|
||||
extern int vcxk_acknowledge_wait(void);
|
||||
extern int vcxk_request(void);
|
||||
extern void vcxk_loadimage(ulong source);
|
||||
extern int vcxk_display_bitmap(ulong addr, int x, int y);
|
||||
extern void vcxk_setbrightness(unsigned int side, short brightness);
|
||||
extern int video_display_bitmap(ulong addr, int x, int y);
|
||||
|
||||
#endif
|
||||
332
include/bzlib.h
Normal file
332
include/bzlib.h
Normal file
@@ -0,0 +1,332 @@
|
||||
/*
|
||||
* This file is a modified version of bzlib.h from the bzip2-1.0.2
|
||||
* distribution which can be found at http://sources.redhat.com/bzip2/
|
||||
*/
|
||||
|
||||
/*-------------------------------------------------------------*/
|
||||
/*--- Public header file for the library. ---*/
|
||||
/*--- bzlib.h ---*/
|
||||
/*-------------------------------------------------------------*/
|
||||
|
||||
/*--
|
||||
This file is a part of bzip2 and/or libbzip2, a program and
|
||||
library for lossless, block-sorting data compression.
|
||||
|
||||
Copyright (C) 1996-2002 Julian R Seward. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. The origin of this software must not be misrepresented; you must
|
||||
not claim that you wrote the original software. If you use this
|
||||
software in a product, an acknowledgment in the product
|
||||
documentation would be appreciated but is not required.
|
||||
|
||||
3. Altered source versions must be plainly marked as such, and must
|
||||
not be misrepresented as being the original software.
|
||||
|
||||
4. The name of the author may not be used to endorse or promote
|
||||
products derived from this software without specific prior written
|
||||
permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Julian Seward, Cambridge, UK.
|
||||
jseward@acm.org
|
||||
bzip2/libbzip2 version 1.0 of 21 March 2000
|
||||
|
||||
This program is based on (at least) the work of:
|
||||
Mike Burrows
|
||||
David Wheeler
|
||||
Peter Fenwick
|
||||
Alistair Moffat
|
||||
Radford Neal
|
||||
Ian H. Witten
|
||||
Robert Sedgewick
|
||||
Jon L. Bentley
|
||||
|
||||
For more information on these sources, see the manual.
|
||||
--*/
|
||||
|
||||
|
||||
#ifndef _BZLIB_H
|
||||
#define _BZLIB_H
|
||||
|
||||
/* Configure for U-Boot environment */
|
||||
#define BZ_NO_STDIO
|
||||
|
||||
#ifndef CONFIG_SANDBOX
|
||||
#define BZ_NO_COMPRESS
|
||||
#endif
|
||||
/* End of configuration for U-Boot environment */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define BZ_RUN 0
|
||||
#define BZ_FLUSH 1
|
||||
#define BZ_FINISH 2
|
||||
|
||||
#define BZ_OK 0
|
||||
#define BZ_RUN_OK 1
|
||||
#define BZ_FLUSH_OK 2
|
||||
#define BZ_FINISH_OK 3
|
||||
#define BZ_STREAM_END 4
|
||||
#define BZ_SEQUENCE_ERROR (-1)
|
||||
#define BZ_PARAM_ERROR (-2)
|
||||
#define BZ_MEM_ERROR (-3)
|
||||
#define BZ_DATA_ERROR (-4)
|
||||
#define BZ_DATA_ERROR_MAGIC (-5)
|
||||
#define BZ_IO_ERROR (-6)
|
||||
#define BZ_UNEXPECTED_EOF (-7)
|
||||
#define BZ_OUTBUFF_FULL (-8)
|
||||
#define BZ_CONFIG_ERROR (-9)
|
||||
|
||||
typedef
|
||||
struct {
|
||||
char *next_in;
|
||||
unsigned int avail_in;
|
||||
unsigned int total_in_lo32;
|
||||
unsigned int total_in_hi32;
|
||||
|
||||
char *next_out;
|
||||
unsigned int avail_out;
|
||||
unsigned int total_out_lo32;
|
||||
unsigned int total_out_hi32;
|
||||
|
||||
void *state;
|
||||
|
||||
void *(*bzalloc)(void *,int,int);
|
||||
void (*bzfree)(void *,void *);
|
||||
void *opaque;
|
||||
}
|
||||
bz_stream;
|
||||
|
||||
|
||||
#ifndef BZ_IMPORT
|
||||
#define BZ_EXPORT
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
# include <windows.h>
|
||||
# ifdef small
|
||||
/* windows.h define small to char */
|
||||
# undef small
|
||||
# endif
|
||||
# ifdef BZ_EXPORT
|
||||
# define BZ_API(func) WINAPI func
|
||||
# define BZ_EXTERN extern
|
||||
# else
|
||||
/* import windows dll dynamically */
|
||||
# define BZ_API(func) (WINAPI * func)
|
||||
# define BZ_EXTERN
|
||||
# endif
|
||||
#else
|
||||
# define BZ_API(func) func
|
||||
# define BZ_EXTERN extern
|
||||
#endif
|
||||
|
||||
|
||||
/*-- Core (low-level) library functions --*/
|
||||
|
||||
BZ_EXTERN int BZ_API(BZ2_bzCompressInit) (
|
||||
bz_stream* strm,
|
||||
int blockSize100k,
|
||||
int verbosity,
|
||||
int workFactor
|
||||
);
|
||||
|
||||
BZ_EXTERN int BZ_API(BZ2_bzCompress) (
|
||||
bz_stream* strm,
|
||||
int action
|
||||
);
|
||||
|
||||
BZ_EXTERN int BZ_API(BZ2_bzCompressEnd) (
|
||||
bz_stream* strm
|
||||
);
|
||||
|
||||
BZ_EXTERN int BZ_API(BZ2_bzDecompressInit) (
|
||||
bz_stream *strm,
|
||||
int verbosity,
|
||||
int small
|
||||
);
|
||||
|
||||
BZ_EXTERN int BZ_API(BZ2_bzDecompress) (
|
||||
bz_stream* strm
|
||||
);
|
||||
|
||||
BZ_EXTERN int BZ_API(BZ2_bzDecompressEnd) (
|
||||
bz_stream *strm
|
||||
);
|
||||
|
||||
|
||||
/*-- High(er) level library functions --*/
|
||||
|
||||
#ifndef BZ_NO_STDIO
|
||||
#define BZ_MAX_UNUSED 5000
|
||||
|
||||
/* Need a definitition for FILE */
|
||||
#include <stdio.h>
|
||||
|
||||
typedef void BZFILE;
|
||||
|
||||
BZ_EXTERN BZFILE* BZ_API(BZ2_bzReadOpen) (
|
||||
int* bzerror,
|
||||
FILE* f,
|
||||
int verbosity,
|
||||
int small,
|
||||
void* unused,
|
||||
int nUnused
|
||||
);
|
||||
|
||||
BZ_EXTERN void BZ_API(BZ2_bzReadClose) (
|
||||
int* bzerror,
|
||||
BZFILE* b
|
||||
);
|
||||
|
||||
BZ_EXTERN void BZ_API(BZ2_bzReadGetUnused) (
|
||||
int* bzerror,
|
||||
BZFILE* b,
|
||||
void** unused,
|
||||
int* nUnused
|
||||
);
|
||||
|
||||
BZ_EXTERN int BZ_API(BZ2_bzRead) (
|
||||
int* bzerror,
|
||||
BZFILE* b,
|
||||
void* buf,
|
||||
int len
|
||||
);
|
||||
|
||||
BZ_EXTERN BZFILE* BZ_API(BZ2_bzWriteOpen) (
|
||||
int* bzerror,
|
||||
FILE* f,
|
||||
int blockSize100k,
|
||||
int verbosity,
|
||||
int workFactor
|
||||
);
|
||||
|
||||
BZ_EXTERN void BZ_API(BZ2_bzWrite) (
|
||||
int* bzerror,
|
||||
BZFILE* b,
|
||||
void* buf,
|
||||
int len
|
||||
);
|
||||
|
||||
BZ_EXTERN void BZ_API(BZ2_bzWriteClose) (
|
||||
int* bzerror,
|
||||
BZFILE* b,
|
||||
int abandon,
|
||||
unsigned int* nbytes_in,
|
||||
unsigned int* nbytes_out
|
||||
);
|
||||
|
||||
BZ_EXTERN void BZ_API(BZ2_bzWriteClose64) (
|
||||
int* bzerror,
|
||||
BZFILE* b,
|
||||
int abandon,
|
||||
unsigned int* nbytes_in_lo32,
|
||||
unsigned int* nbytes_in_hi32,
|
||||
unsigned int* nbytes_out_lo32,
|
||||
unsigned int* nbytes_out_hi32
|
||||
);
|
||||
#endif
|
||||
|
||||
|
||||
/*-- Utility functions --*/
|
||||
|
||||
BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffCompress) (
|
||||
char* dest,
|
||||
unsigned int* destLen,
|
||||
char* source,
|
||||
unsigned int sourceLen,
|
||||
int blockSize100k,
|
||||
int verbosity,
|
||||
int workFactor
|
||||
);
|
||||
|
||||
BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffDecompress) (
|
||||
char* dest,
|
||||
unsigned int* destLen,
|
||||
char* source,
|
||||
unsigned int sourceLen,
|
||||
int small,
|
||||
int verbosity
|
||||
);
|
||||
|
||||
|
||||
/*--
|
||||
Code contributed by Yoshioka Tsuneo
|
||||
(QWF00133@niftyserve.or.jp/tsuneo-y@is.aist-nara.ac.jp),
|
||||
to support better zlib compatibility.
|
||||
This code is not _officially_ part of libbzip2 (yet);
|
||||
I haven't tested it, documented it, or considered the
|
||||
threading-safeness of it.
|
||||
If this code breaks, please contact both Yoshioka and me.
|
||||
--*/
|
||||
|
||||
BZ_EXTERN const char * BZ_API(BZ2_bzlibVersion) (
|
||||
void
|
||||
);
|
||||
|
||||
#ifndef BZ_NO_STDIO
|
||||
BZ_EXTERN BZFILE * BZ_API(BZ2_bzopen) (
|
||||
const char *path,
|
||||
const char *mode
|
||||
);
|
||||
|
||||
BZ_EXTERN BZFILE * BZ_API(BZ2_bzdopen) (
|
||||
int fd,
|
||||
const char *mode
|
||||
);
|
||||
|
||||
BZ_EXTERN int BZ_API(BZ2_bzread) (
|
||||
BZFILE* b,
|
||||
void* buf,
|
||||
int len
|
||||
);
|
||||
|
||||
BZ_EXTERN int BZ_API(BZ2_bzwrite) (
|
||||
BZFILE* b,
|
||||
void* buf,
|
||||
int len
|
||||
);
|
||||
|
||||
BZ_EXTERN int BZ_API(BZ2_bzflush) (
|
||||
BZFILE* b
|
||||
);
|
||||
|
||||
BZ_EXTERN void BZ_API(BZ2_bzclose) (
|
||||
BZFILE* b
|
||||
);
|
||||
|
||||
BZ_EXTERN const char * BZ_API(BZ2_bzerror) (
|
||||
BZFILE *b,
|
||||
int *errnum
|
||||
);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------*/
|
||||
/*--- end bzlib.h ---*/
|
||||
/*-------------------------------------------------------------*/
|
||||
69
include/cache.h
Normal file
69
include/cache.h
Normal file
@@ -0,0 +1,69 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2019 Intel Corporation <www.intel.com>
|
||||
*/
|
||||
|
||||
#ifndef __CACHE_H
|
||||
#define __CACHE_H
|
||||
|
||||
/*
|
||||
* Structure for the cache controller
|
||||
*/
|
||||
struct cache_info {
|
||||
phys_addr_t base; /* Base physical address of cache device. */
|
||||
};
|
||||
|
||||
struct cache_ops {
|
||||
/**
|
||||
* get_info() - Get basic cache info
|
||||
*
|
||||
* @dev: Device to check (UCLASS_CACHE)
|
||||
* @info: Place to put info
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int (*get_info)(struct udevice *dev, struct cache_info *info);
|
||||
|
||||
/**
|
||||
* enable() - Enable cache
|
||||
*
|
||||
* @dev: Device to check (UCLASS_CACHE)
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int (*enable)(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* disable() - Flush and disable cache
|
||||
*
|
||||
* @dev: Device to check (UCLASS_CACHE)
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int (*disable)(struct udevice *dev);
|
||||
};
|
||||
|
||||
#define cache_get_ops(dev) ((struct cache_ops *)(dev)->driver->ops)
|
||||
|
||||
/**
|
||||
* cache_get_info() - Get information about a cache controller
|
||||
*
|
||||
* @dev: Device to check (UCLASS_CACHE)
|
||||
* @info: Returns cache info
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int cache_get_info(struct udevice *dev, struct cache_info *info);
|
||||
|
||||
/**
|
||||
* cache_enable() - Enable cache
|
||||
*
|
||||
* @dev: Device to check (UCLASS_CACHE)
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int cache_enable(struct udevice *dev);
|
||||
|
||||
/**
|
||||
* cache_disable() - Flush and disable cache
|
||||
*
|
||||
* @dev: Device to check (UCLASS_CACHE)
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int cache_disable(struct udevice *dev);
|
||||
#endif
|
||||
2028
include/capitalization.h
Normal file
2028
include/capitalization.h
Normal file
File diff suppressed because it is too large
Load Diff
21
include/cavium/atf.h
Normal file
21
include/cavium/atf.h
Normal file
@@ -0,0 +1,21 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/**
|
||||
* (C) Copyright 2014, Cavium Inc.
|
||||
**/
|
||||
#ifndef __ATF_H__
|
||||
#define __ATF_H__
|
||||
#include <cavium/atf_part.h>
|
||||
|
||||
ssize_t atf_read_mmc(uintptr_t offset, void *buffer, size_t size);
|
||||
ssize_t atf_read_nor(uintptr_t offset, void *buffer, size_t size);
|
||||
ssize_t atf_get_pcount(void);
|
||||
ssize_t atf_get_part(struct storage_partition *part, unsigned int index);
|
||||
ssize_t atf_erase_nor(uintptr_t offset, size_t size);
|
||||
ssize_t atf_write_nor(uintptr_t offset, const void *buffer, size_t size);
|
||||
ssize_t atf_write_mmc(uintptr_t offset, const void *buffer, size_t size);
|
||||
ssize_t atf_dram_size(unsigned int node);
|
||||
ssize_t atf_node_count(void);
|
||||
ssize_t atf_env_count(void);
|
||||
ssize_t atf_env_string(size_t index, char *str);
|
||||
|
||||
#endif
|
||||
25
include/cavium/atf_part.h
Normal file
25
include/cavium/atf_part.h
Normal file
@@ -0,0 +1,25 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/**
|
||||
* (C) Copyright 2014, Cavium Inc.
|
||||
**/
|
||||
|
||||
#ifndef __ATF_PART_H__
|
||||
#define __ATF_PART_H__
|
||||
|
||||
struct storage_partition {
|
||||
unsigned int type;
|
||||
unsigned int size;
|
||||
unsigned long offset;
|
||||
};
|
||||
|
||||
enum {
|
||||
PARTITION_NBL1FW_REST = 0,
|
||||
PARTITION_BL2_BL31 = 1,
|
||||
PARTITION_UBOOT = 2,
|
||||
PARTITION_UEFI = 2,
|
||||
PARTITION_KERNEL = 3,
|
||||
PARTITION_DEVICE_TREE = 4,
|
||||
PARTITION_LAST,
|
||||
};
|
||||
|
||||
#endif
|
||||
66
include/cavium/thunderx_svc.h
Normal file
66
include/cavium/thunderx_svc.h
Normal file
@@ -0,0 +1,66 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/**
|
||||
* (C) Copyright 2014, Cavium Inc.
|
||||
**/
|
||||
|
||||
#ifndef __THUNDERX_SVC_H__
|
||||
#define __THUNDERX_SVC_H__
|
||||
|
||||
/* SMC function IDs for general purpose queries */
|
||||
|
||||
#define THUNDERX_SVC_CALL_COUNT 0x4300ff00
|
||||
#define THUNDERX_SVC_UID 0x4300ff01
|
||||
|
||||
#define THUNDERX_SVC_VERSION 0x4300ff03
|
||||
|
||||
#define ARM_STD_SVC_VERSION 0x8400ff03
|
||||
|
||||
/* ThunderX Service Calls version numbers */
|
||||
#define THUNDERX_VERSION_MAJOR 0x0
|
||||
#define THUNDERX_VERSION_MINOR 0x1
|
||||
|
||||
#define THUNDERX_MMC_READ 0x43000101
|
||||
/* x1 - block address
|
||||
* x2 - size
|
||||
* x3 - buffer address
|
||||
*/
|
||||
#define THUNDERX_MMC_WRITE 0x43000102
|
||||
/* x1 - block address
|
||||
* x2 - size
|
||||
* x3 - buffer address
|
||||
*/
|
||||
|
||||
#define THUNDERX_NOR_READ 0x43000111
|
||||
/* x1 - block address
|
||||
* x2 - size
|
||||
* x3 - buffer address
|
||||
*/
|
||||
#define THUNDERX_NOR_WRITE 0x43000112
|
||||
/* x1 - block address
|
||||
* x2 - size
|
||||
* x3 - buffer address
|
||||
*/
|
||||
#define THUNDERX_NOR_ERASE 0x43000113
|
||||
/* x1 - block address
|
||||
*/
|
||||
|
||||
#define THUNDERX_PART_COUNT 0x43000201
|
||||
#define THUNDERX_GET_PART 0x43000202
|
||||
/* x1 - pointer to the buffer
|
||||
* x2 - index
|
||||
*/
|
||||
|
||||
#define THUNDERX_DRAM_SIZE 0x43000301
|
||||
/* x1 - node number
|
||||
*/
|
||||
|
||||
#define THUNDERX_GTI_SYNC 0x43000401
|
||||
|
||||
#define THUNDERX_ENV_COUNT 0x43000501
|
||||
#define THUNDERX_ENV_STRING 0x43000502
|
||||
/* x1 - index
|
||||
*/
|
||||
|
||||
#define THUNDERX_NODE_COUNT 0x43000601
|
||||
|
||||
#endif /* __THUNDERX_SVC_H__ */
|
||||
218
include/cbfs.h
Normal file
218
include/cbfs.h
Normal file
@@ -0,0 +1,218 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef __CBFS_H
|
||||
#define __CBFS_H
|
||||
|
||||
#include <compiler.h>
|
||||
#include <linux/compiler.h>
|
||||
|
||||
enum cbfs_result {
|
||||
CBFS_SUCCESS = 0,
|
||||
CBFS_NOT_INITIALIZED,
|
||||
CBFS_BAD_HEADER,
|
||||
CBFS_BAD_FILE,
|
||||
CBFS_FILE_NOT_FOUND
|
||||
};
|
||||
|
||||
enum cbfs_filetype {
|
||||
CBFS_TYPE_BOOTBLOCK = 0x01,
|
||||
CBFS_TYPE_CBFSHEADER = 0x02,
|
||||
CBFS_TYPE_STAGE = 0x10,
|
||||
CBFS_TYPE_PAYLOAD = 0x20,
|
||||
CBFS_TYPE_FIT = 0x21,
|
||||
CBFS_TYPE_OPTIONROM = 0x30,
|
||||
CBFS_TYPE_BOOTSPLASH = 0x40,
|
||||
CBFS_TYPE_RAW = 0x50,
|
||||
CBFS_TYPE_VSA = 0x51,
|
||||
CBFS_TYPE_MBI = 0x52,
|
||||
CBFS_TYPE_MICROCODE = 0x53,
|
||||
CBFS_TYPE_FSP = 0x60,
|
||||
CBFS_TYPE_MRC = 0x61,
|
||||
CBFS_TYPE_MMA = 0x62,
|
||||
CBFS_TYPE_EFI = 0x63,
|
||||
CBFS_TYPE_STRUCT = 0x70,
|
||||
CBFS_TYPE_CMOS_DEFAULT = 0xaa,
|
||||
CBFS_TYPE_SPD = 0xab,
|
||||
CBFS_TYPE_MRC_CACHE = 0xac,
|
||||
CBFS_TYPE_CMOS_LAYOUT = 0x01aa
|
||||
};
|
||||
|
||||
enum {
|
||||
CBFS_HEADER_MAGIC = 0x4f524243,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cbfs_header - header at the start of a CBFS region
|
||||
*
|
||||
* All fields use big-endian format.
|
||||
*
|
||||
* @magic: Magic number (CBFS_HEADER_MAGIC)
|
||||
*/
|
||||
struct cbfs_header {
|
||||
u32 magic;
|
||||
u32 version;
|
||||
u32 rom_size;
|
||||
u32 boot_block_size;
|
||||
u32 align;
|
||||
u32 offset;
|
||||
u32 pad[2];
|
||||
} __packed;
|
||||
|
||||
struct cbfs_fileheader {
|
||||
u8 magic[8];
|
||||
u32 len;
|
||||
u32 type;
|
||||
/* offset to struct cbfs_file_attribute or 0 */
|
||||
u32 attributes_offset;
|
||||
u32 offset;
|
||||
} __packed;
|
||||
|
||||
struct cbfs_cachenode {
|
||||
struct cbfs_cachenode *next;
|
||||
void *data;
|
||||
char *name;
|
||||
u32 type;
|
||||
u32 data_length;
|
||||
u32 name_length;
|
||||
u32 attributes_offset;
|
||||
};
|
||||
|
||||
extern enum cbfs_result file_cbfs_result;
|
||||
|
||||
/**
|
||||
* file_cbfs_error() - Return a string describing the most recent error
|
||||
* condition.
|
||||
*
|
||||
* @return A pointer to the constant string.
|
||||
*/
|
||||
const char *file_cbfs_error(void);
|
||||
|
||||
/**
|
||||
* cbfs_get_result() - Get the result of the last CBFS operation
|
||||
*
|
||||
*@return last result
|
||||
*/
|
||||
enum cbfs_result cbfs_get_result(void);
|
||||
|
||||
/**
|
||||
* file_cbfs_init() - Initialize the CBFS driver and load metadata into RAM.
|
||||
*
|
||||
* @end_of_rom: Points to the end of the ROM the CBFS should be read
|
||||
* from.
|
||||
*/
|
||||
void file_cbfs_init(uintptr_t end_of_rom);
|
||||
|
||||
/**
|
||||
* file_cbfs_get_header() - Get the header structure for the current CBFS.
|
||||
*
|
||||
* @return A pointer to the constant structure, or NULL if there is none.
|
||||
*/
|
||||
const struct cbfs_header *file_cbfs_get_header(void);
|
||||
|
||||
/**
|
||||
* file_cbfs_get_first() - Get a handle for the first file in CBFS.
|
||||
*
|
||||
* @return A handle for the first file in CBFS, NULL on error.
|
||||
*/
|
||||
const struct cbfs_cachenode *file_cbfs_get_first(void);
|
||||
|
||||
/**
|
||||
* file_cbfs_get_next() - Get a handle to the file after this one in CBFS.
|
||||
*
|
||||
* @file: A pointer to the handle to advance.
|
||||
*/
|
||||
void file_cbfs_get_next(const struct cbfs_cachenode **file);
|
||||
|
||||
/**
|
||||
* file_cbfs_find() - Find a file with a particular name in CBFS.
|
||||
*
|
||||
* @name: The name to search for.
|
||||
*
|
||||
* @return A handle to the file, or NULL on error.
|
||||
*/
|
||||
const struct cbfs_cachenode *file_cbfs_find(const char *name);
|
||||
|
||||
struct cbfs_priv *priv;
|
||||
|
||||
/**
|
||||
* cbfs_find_file() - Find a file in a given CBFS
|
||||
*
|
||||
* @cbfs: CBFS to look in (use cbfs_init_mem() to set it up)
|
||||
* @name: Filename to look for
|
||||
* @return pointer to CBFS node if found, else NULL
|
||||
*/
|
||||
const struct cbfs_cachenode *cbfs_find_file(struct cbfs_priv *cbfs,
|
||||
const char *name);
|
||||
|
||||
/**
|
||||
* cbfs_init_mem() - Set up a new CBFS
|
||||
*
|
||||
* @base: Base address of CBFS
|
||||
* @size: Size of CBFS in bytes
|
||||
* @cbfsp: Returns a pointer to CBFS on success
|
||||
* @return 0 if OK, -ve on error
|
||||
*/
|
||||
int cbfs_init_mem(ulong base, ulong size, struct cbfs_priv **privp);
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* All of the functions below can be used without first initializing CBFS. */
|
||||
/***************************************************************************/
|
||||
|
||||
/**
|
||||
* file_cbfs_find_uncached() - Find a file with a particular name in CBFS
|
||||
* without using the heap.
|
||||
*
|
||||
* @end_of_rom: Points to the end of the ROM the CBFS should be read
|
||||
* from.
|
||||
* @name: The name to search for.
|
||||
*
|
||||
* @return A handle to the file, or NULL on error.
|
||||
*/
|
||||
const struct cbfs_cachenode *file_cbfs_find_uncached(uintptr_t end_of_rom,
|
||||
const char *name);
|
||||
|
||||
/**
|
||||
* file_cbfs_name() - Get the name of a file in CBFS.
|
||||
*
|
||||
* @file: The handle to the file.
|
||||
*
|
||||
* @return The name of the file, NULL on error.
|
||||
*/
|
||||
const char *file_cbfs_name(const struct cbfs_cachenode *file);
|
||||
|
||||
/**
|
||||
* file_cbfs_size() - Get the size of a file in CBFS.
|
||||
*
|
||||
* @file: The handle to the file.
|
||||
*
|
||||
* @return The size of the file, zero on error.
|
||||
*/
|
||||
u32 file_cbfs_size(const struct cbfs_cachenode *file);
|
||||
|
||||
/**
|
||||
* file_cbfs_type() - Get the type of a file in CBFS.
|
||||
*
|
||||
* @file: The handle to the file.
|
||||
*
|
||||
* @return The type of the file, zero on error.
|
||||
*/
|
||||
u32 file_cbfs_type(const struct cbfs_cachenode *file);
|
||||
|
||||
/**
|
||||
* file_cbfs_read() - Read a file from CBFS into RAM
|
||||
*
|
||||
* @file: A handle to the file to read.
|
||||
* @buffer: Where to read it into memory.
|
||||
* @maxsize: Maximum number of bytes to read
|
||||
*
|
||||
* @return If positive or zero, the number of characters read. If negative, an
|
||||
* error occurred.
|
||||
*/
|
||||
long file_cbfs_read(const struct cbfs_cachenode *file, void *buffer,
|
||||
unsigned long maxsize);
|
||||
|
||||
#endif /* __CBFS_H */
|
||||
250
include/charset.h
Normal file
250
include/charset.h
Normal file
@@ -0,0 +1,250 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* charset conversion utils
|
||||
*
|
||||
* Copyright (c) 2017 Rob Clark
|
||||
*/
|
||||
|
||||
#ifndef __CHARSET_H_
|
||||
#define __CHARSET_H_
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#define MAX_UTF8_PER_UTF16 3
|
||||
|
||||
/**
|
||||
* console_read_unicode() - read Unicode code point from console
|
||||
*
|
||||
* @code: pointer to store Unicode code point
|
||||
* Return: 0 = success
|
||||
*/
|
||||
int console_read_unicode(s32 *code);
|
||||
|
||||
/**
|
||||
* utf8_get() - get next UTF-8 code point from buffer
|
||||
*
|
||||
* @src: pointer to current byte, updated to point to next byte
|
||||
* Return: code point, or 0 for end of string, or -1 if no legal
|
||||
* code point is found. In case of an error src points to
|
||||
* the incorrect byte.
|
||||
*/
|
||||
s32 utf8_get(const char **src);
|
||||
|
||||
/**
|
||||
* utf8_put() - write UTF-8 code point to buffer
|
||||
*
|
||||
* @code: code point
|
||||
* @dst: pointer to destination buffer, updated to next position
|
||||
* Return: -1 if the input parameters are invalid
|
||||
*/
|
||||
int utf8_put(s32 code, char **dst);
|
||||
|
||||
/**
|
||||
* utf8_utf16_strnlen() - length of a truncated utf-8 string after conversion
|
||||
* to utf-16
|
||||
*
|
||||
* @src: utf-8 string
|
||||
* @count: maximum number of code points to convert
|
||||
* Return: length in u16 after conversion to utf-16 without the
|
||||
* trailing \0. If an invalid UTF-8 sequence is hit one
|
||||
* u16 will be reserved for a replacement character.
|
||||
*/
|
||||
size_t utf8_utf16_strnlen(const char *src, size_t count);
|
||||
|
||||
/**
|
||||
* utf8_utf16_strlen() - length of a utf-8 string after conversion to utf-16
|
||||
*
|
||||
* @src: utf-8 string
|
||||
* Return: length in u16 after conversion to utf-16 without the
|
||||
* trailing \0. If an invalid UTF-8 sequence is hit one
|
||||
* u16 will be reserved for a replacement character.
|
||||
*/
|
||||
#define utf8_utf16_strlen(a) utf8_utf16_strnlen((a), SIZE_MAX)
|
||||
|
||||
/**
|
||||
* utf8_utf16_strncpy() - copy utf-8 string to utf-16 string
|
||||
*
|
||||
* @dst: destination buffer
|
||||
* @src: source buffer
|
||||
* @count: maximum number of code points to copy
|
||||
* Return: -1 if the input parameters are invalid
|
||||
*/
|
||||
int utf8_utf16_strncpy(u16 **dst, const char *src, size_t count);
|
||||
|
||||
/**
|
||||
* utf8_utf16_strcpy() - copy utf-8 string to utf-16 string
|
||||
*
|
||||
* @dst: destination buffer
|
||||
* @src: source buffer
|
||||
* Return: -1 if the input parameters are invalid
|
||||
*/
|
||||
#define utf8_utf16_strcpy(d, s) utf8_utf16_strncpy((d), (s), SIZE_MAX)
|
||||
|
||||
/**
|
||||
* utf16_get() - get next UTF-16 code point from buffer
|
||||
*
|
||||
* @src: pointer to current word, updated to point to next word
|
||||
* Return: code point, or 0 for end of string, or -1 if no legal
|
||||
* code point is found. In case of an error src points to
|
||||
* the incorrect word.
|
||||
*/
|
||||
s32 utf16_get(const u16 **src);
|
||||
|
||||
/**
|
||||
* utf16_put() - write UTF-16 code point to buffer
|
||||
*
|
||||
* @code: code point
|
||||
* @dst: pointer to destination buffer, updated to next position
|
||||
* Return: -1 if the input parameters are invalid
|
||||
*/
|
||||
int utf16_put(s32 code, u16 **dst);
|
||||
|
||||
/**
|
||||
* utf16_strnlen() - length of a truncated utf-16 string
|
||||
*
|
||||
* @src: utf-16 string
|
||||
* @count: maximum number of code points to convert
|
||||
* Return: length in code points. If an invalid UTF-16 sequence is
|
||||
* hit one position will be reserved for a replacement
|
||||
* character.
|
||||
*/
|
||||
size_t utf16_strnlen(const u16 *src, size_t count);
|
||||
|
||||
/**
|
||||
* utf16_utf8_strnlen() - length of a truncated utf-16 string after conversion
|
||||
* to utf-8
|
||||
*
|
||||
* @src: utf-16 string
|
||||
* @count: maximum number of code points to convert
|
||||
* Return: length in bytes after conversion to utf-8 without the
|
||||
* trailing \0. If an invalid UTF-16 sequence is hit one
|
||||
* byte will be reserved for a replacement character.
|
||||
*/
|
||||
size_t utf16_utf8_strnlen(const u16 *src, size_t count);
|
||||
|
||||
/**
|
||||
* utf16_utf8_strlen() - length of a utf-16 string after conversion to utf-8
|
||||
*
|
||||
* @src: utf-16 string
|
||||
* Return: length in bytes after conversion to utf-8 without the
|
||||
* trailing \0. If an invalid UTF-16 sequence is hit one
|
||||
* byte will be reserved for a replacement character.
|
||||
*/
|
||||
#define utf16_utf8_strlen(a) utf16_utf8_strnlen((a), SIZE_MAX)
|
||||
|
||||
/**
|
||||
* utf16_utf8_strncpy() - copy utf-16 string to utf-8 string
|
||||
*
|
||||
* @dst: destination buffer
|
||||
* @src: source buffer
|
||||
* @count: maximum number of code points to copy
|
||||
* Return: -1 if the input parameters are invalid
|
||||
*/
|
||||
int utf16_utf8_strncpy(char **dst, const u16 *src, size_t count);
|
||||
|
||||
/**
|
||||
* utf16_utf8_strcpy() - copy utf-16 string to utf-8 string
|
||||
*
|
||||
* @dst: destination buffer
|
||||
* @src: source buffer
|
||||
* Return: -1 if the input parameters are invalid
|
||||
*/
|
||||
#define utf16_utf8_strcpy(d, s) utf16_utf8_strncpy((d), (s), SIZE_MAX)
|
||||
|
||||
/**
|
||||
* utf_to_lower() - convert a Unicode letter to lower case
|
||||
*
|
||||
* @code: letter to convert
|
||||
* Return: lower case letter or unchanged letter
|
||||
*/
|
||||
s32 utf_to_lower(const s32 code);
|
||||
|
||||
/**
|
||||
* utf_to_upper() - convert a Unicode letter to upper case
|
||||
*
|
||||
* @code: letter to convert
|
||||
* Return: upper case letter or unchanged letter
|
||||
*/
|
||||
s32 utf_to_upper(const s32 code);
|
||||
|
||||
/*
|
||||
* u16_strncmp() - compare two u16 string
|
||||
*
|
||||
* @s1: first string to compare
|
||||
* @s2: second string to compare
|
||||
* @n: maximum number of u16 to compare
|
||||
* Return: 0 if the first n u16 are the same in s1 and s2
|
||||
* < 0 if the first different u16 in s1 is less than the
|
||||
* corresponding u16 in s2
|
||||
* > 0 if the first different u16 in s1 is greater than the
|
||||
* corresponding u16 in s2
|
||||
*/
|
||||
int u16_strncmp(const u16 *s1, const u16 *s2, size_t n);
|
||||
#define u16_strcmp(s1, s2) u16_strncmp((s1), (s2), SIZE_MAX)
|
||||
|
||||
/**
|
||||
* u16_strlen - count non-zero words
|
||||
*
|
||||
* This function matches wsclen() if the -fshort-wchar compiler flag is set.
|
||||
* In the EFI context we explicitly need a function handling u16 strings.
|
||||
*
|
||||
* @in: null terminated u16 string
|
||||
* ReturnValue: number of non-zero words.
|
||||
* This is not the number of utf-16 letters!
|
||||
*/
|
||||
size_t u16_strlen(const void *in);
|
||||
|
||||
/**
|
||||
* u16_strlen - count non-zero words
|
||||
*
|
||||
* This function matches wscnlen_s() if the -fshort-wchar compiler flag is set.
|
||||
* In the EFI context we explicitly need a function handling u16 strings.
|
||||
*
|
||||
* @in: null terminated u16 string
|
||||
* @count: maximum number of words to count
|
||||
* ReturnValue: number of non-zero words.
|
||||
* This is not the number of utf-16 letters!
|
||||
*/
|
||||
size_t u16_strnlen(const u16 *in, size_t count);
|
||||
|
||||
/**
|
||||
* u16_strcpy() - copy u16 string
|
||||
*
|
||||
* Copy u16 string pointed to by src, including terminating null word, to
|
||||
* the buffer pointed to by dest.
|
||||
*
|
||||
* @dest: destination buffer
|
||||
* @src: source buffer (null terminated)
|
||||
* Return: 'dest' address
|
||||
*/
|
||||
u16 *u16_strcpy(u16 *dest, const u16 *src);
|
||||
|
||||
/**
|
||||
* u16_strdup() - duplicate u16 string
|
||||
*
|
||||
* Copy u16 string pointed to by src, including terminating null word, to a
|
||||
* newly allocated buffer.
|
||||
*
|
||||
* @src: source buffer (null terminated)
|
||||
* Return: allocated new buffer on success, NULL on failure
|
||||
*/
|
||||
u16 *u16_strdup(const void *src);
|
||||
|
||||
/**
|
||||
* utf16_to_utf8() - Convert an utf16 string to utf8
|
||||
*
|
||||
* Converts 'size' characters of the utf16 string 'src' to utf8
|
||||
* written to the 'dest' buffer.
|
||||
*
|
||||
* NOTE that a single utf16 character can generate up to 3 utf8
|
||||
* characters. See MAX_UTF8_PER_UTF16.
|
||||
*
|
||||
* @dest the destination buffer to write the utf8 characters
|
||||
* @src the source utf16 string
|
||||
* @size the number of utf16 characters to convert
|
||||
* @return the pointer to the first unwritten byte in 'dest'
|
||||
*/
|
||||
uint8_t *utf16_to_utf8(uint8_t *dest, const uint16_t *src, size_t size);
|
||||
|
||||
#endif /* __CHARSET_H_ */
|
||||
26
include/circbuf.h
Normal file
26
include/circbuf.h
Normal file
@@ -0,0 +1,26 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2003
|
||||
* Gerry Hamel, geh@ti.com, Texas Instruments
|
||||
*/
|
||||
|
||||
#ifndef __CIRCBUF_H__
|
||||
#define __CIRCBUF_H__
|
||||
|
||||
typedef struct circbuf {
|
||||
unsigned int size; /* current number of bytes held */
|
||||
unsigned int totalsize; /* number of bytes allocated */
|
||||
|
||||
char *top; /* pointer to current buffer start */
|
||||
char *tail; /* pointer to space for next element */
|
||||
|
||||
char *data; /* all data */
|
||||
char *end; /* end of data buffer */
|
||||
} circbuf_t;
|
||||
|
||||
int buf_init (circbuf_t * buf, unsigned int size);
|
||||
int buf_free (circbuf_t * buf);
|
||||
int buf_pop (circbuf_t * buf, char *dest, unsigned int len);
|
||||
int buf_push (circbuf_t * buf, const char *src, unsigned int len);
|
||||
|
||||
#endif
|
||||
156
include/cli.h
Normal file
156
include/cli.h
Normal file
@@ -0,0 +1,156 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2014 Google, Inc
|
||||
* Simon Glass <sjg@chromium.org>
|
||||
*/
|
||||
|
||||
#ifndef __CLI_H
|
||||
#define __CLI_H
|
||||
|
||||
/**
|
||||
* Go into the command loop
|
||||
*
|
||||
* This will return if we get a timeout waiting for a command. See
|
||||
* CONFIG_BOOT_RETRY_TIME.
|
||||
*/
|
||||
void cli_simple_loop(void);
|
||||
|
||||
/**
|
||||
* cli_simple_run_command() - Execute a command with the simple CLI
|
||||
*
|
||||
* @cmd: String containing the command to execute
|
||||
* @flag Flag value - see CMD_FLAG_...
|
||||
* @return 1 - command executed, repeatable
|
||||
* 0 - command executed but not repeatable, interrupted commands are
|
||||
* always considered not repeatable
|
||||
* -1 - not executed (unrecognized, bootd recursion or too many args)
|
||||
* (If cmd is NULL or "" or longer than CONFIG_SYS_CBSIZE-1 it is
|
||||
* considered unrecognized)
|
||||
*/
|
||||
int cli_simple_run_command(const char *cmd, int flag);
|
||||
|
||||
/**
|
||||
* cli_simple_process_macros() - Expand $() and ${} format env. variables
|
||||
*
|
||||
* @param input Input string possible containing $() / ${} vars
|
||||
* @param output Output string with $() / ${} vars expanded
|
||||
*/
|
||||
void cli_simple_process_macros(const char *input, char *output);
|
||||
|
||||
/**
|
||||
* cli_simple_run_command_list() - Execute a list of command
|
||||
*
|
||||
* The commands should be separated by ; or \n and will be executed
|
||||
* by the built-in parser.
|
||||
*
|
||||
* This function cannot take a const char * for the command, since if it
|
||||
* finds newlines in the string, it replaces them with \0.
|
||||
*
|
||||
* @param cmd String containing list of commands
|
||||
* @param flag Execution flags (CMD_FLAG_...)
|
||||
* @return 0 on success, or != 0 on error.
|
||||
*/
|
||||
int cli_simple_run_command_list(char *cmd, int flag);
|
||||
|
||||
/**
|
||||
* cli_readline() - read a line into the console_buffer
|
||||
*
|
||||
* This is a convenience function which calls cli_readline_into_buffer().
|
||||
*
|
||||
* @prompt: Prompt to display
|
||||
* @return command line length excluding terminator, or -ve on error
|
||||
*/
|
||||
int cli_readline(const char *const prompt);
|
||||
|
||||
/**
|
||||
* readline_into_buffer() - read a line into a buffer
|
||||
*
|
||||
* Display the prompt, then read a command line into @buffer. The
|
||||
* maximum line length is CONFIG_SYS_CBSIZE including a \0 terminator, which
|
||||
* will always be added.
|
||||
*
|
||||
* The command is echoed as it is typed. Command editing is supported if
|
||||
* CONFIG_CMDLINE_EDITING is defined. Tab auto-complete is supported if
|
||||
* CONFIG_AUTO_COMPLETE is defined. If CONFIG_BOOT_RETRY_TIME is defined,
|
||||
* then a timeout will be applied.
|
||||
*
|
||||
* If CONFIG_BOOT_RETRY_TIME is defined and retry_time >= 0,
|
||||
* time out when time goes past endtime (timebase time in ticks).
|
||||
*
|
||||
* @prompt: Prompt to display
|
||||
* @buffer: Place to put the line that is entered
|
||||
* @timeout: Timeout in milliseconds, 0 if none
|
||||
* @return command line length excluding terminator, or -ve on error: of the
|
||||
* timeout is exceeded (either CONFIG_BOOT_RETRY_TIME or the timeout
|
||||
* parameter), then -2 is returned. If a break is detected (Ctrl-C) then
|
||||
* -1 is returned.
|
||||
*/
|
||||
int cli_readline_into_buffer(const char *const prompt, char *buffer,
|
||||
int timeout);
|
||||
|
||||
/**
|
||||
* parse_line() - split a command line down into separate arguments
|
||||
*
|
||||
* The argv[] array is filled with pointers into @line, and each argument
|
||||
* is terminated by \0 (i.e. @line is changed in the process unless there
|
||||
* is only one argument).
|
||||
*
|
||||
* #argv is terminated by a NULL after the last argument pointer.
|
||||
*
|
||||
* At most CONFIG_SYS_MAXARGS arguments are permited - if there are more
|
||||
* than that then an error is printed, and this function returns
|
||||
* CONFIG_SYS_MAXARGS, with argv[] set up to that point.
|
||||
*
|
||||
* @line: Command line to parse
|
||||
* @args: Array to hold arguments
|
||||
* @return number of arguments
|
||||
*/
|
||||
int cli_simple_parse_line(char *line, char *argv[]);
|
||||
|
||||
#if CONFIG_IS_ENABLED(OF_CONTROL)
|
||||
/**
|
||||
* cli_process_fdt() - process the boot command from the FDT
|
||||
*
|
||||
* If bootcmmd is defined in the /config node of the FDT, we use that
|
||||
* as the boot command. Further, if bootsecure is set to 1 (in the same
|
||||
* node) then we return true, indicating that the command should be executed
|
||||
* as securely as possible, avoiding the CLI parser.
|
||||
*
|
||||
* @cmdp: On entry, the command that will be executed if the FDT does
|
||||
* not have a command. Returns the command to execute after
|
||||
* checking the FDT.
|
||||
* @return true to execute securely, else false
|
||||
*/
|
||||
bool cli_process_fdt(const char **cmdp);
|
||||
|
||||
/** cli_secure_boot_cmd() - execute a command as securely as possible
|
||||
*
|
||||
* This avoids using the parser, thus executing the command with the
|
||||
* smallest amount of code. Parameters are not supported.
|
||||
*/
|
||||
void cli_secure_boot_cmd(const char *cmd);
|
||||
#else
|
||||
static inline bool cli_process_fdt(const char **cmdp)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline void cli_secure_boot_cmd(const char *cmd)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_OF_CONTROL */
|
||||
|
||||
/**
|
||||
* Go into the command loop
|
||||
*
|
||||
* This will return if we get a timeout waiting for a command, but only for
|
||||
* the simple parser (not hush). See CONFIG_BOOT_RETRY_TIME.
|
||||
*/
|
||||
void cli_loop(void);
|
||||
|
||||
/** Set up the command line interpreter ready for action */
|
||||
void cli_init(void);
|
||||
|
||||
#define endtick(seconds) (get_ticks() + (uint64_t)(seconds) * get_tbclk())
|
||||
|
||||
#endif
|
||||
26
include/cli_hush.h
Normal file
26
include/cli_hush.h
Normal file
@@ -0,0 +1,26 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2001
|
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
*/
|
||||
|
||||
#ifndef _CLI_HUSH_H_
|
||||
#define _CLI_HUSH_H_
|
||||
|
||||
#define FLAG_EXIT_FROM_LOOP 1
|
||||
#define FLAG_PARSE_SEMICOLON (1 << 1) /* symbol ';' is special for parser */
|
||||
#define FLAG_REPARSING (1 << 2) /* >=2nd pass */
|
||||
#define FLAG_CONT_ON_NEWLINE (1 << 3) /* continue when we see \n */
|
||||
|
||||
extern int u_boot_hush_start(void);
|
||||
extern int parse_string_outer(const char *, int);
|
||||
extern int parse_file_outer(void);
|
||||
|
||||
int set_local_var(const char *s, int flg_export);
|
||||
void unset_local_var(const char *name);
|
||||
char *get_local_var(const char *s);
|
||||
|
||||
#if defined(CONFIG_HUSH_INIT_VAR)
|
||||
extern int hush_init_var (void);
|
||||
#endif
|
||||
#endif
|
||||
103
include/clk-uclass.h
Normal file
103
include/clk-uclass.h
Normal file
@@ -0,0 +1,103 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (c) 2015 Google, Inc
|
||||
* Written by Simon Glass <sjg@chromium.org>
|
||||
* Copyright (c) 2016, NVIDIA CORPORATION.
|
||||
*/
|
||||
|
||||
#ifndef _CLK_UCLASS_H
|
||||
#define _CLK_UCLASS_H
|
||||
|
||||
/* See clk.h for background documentation. */
|
||||
|
||||
#include <clk.h>
|
||||
|
||||
struct ofnode_phandle_args;
|
||||
|
||||
/**
|
||||
* struct clk_ops - The functions that a clock driver must implement.
|
||||
*/
|
||||
struct clk_ops {
|
||||
/**
|
||||
* of_xlate - Translate a client's device-tree (OF) clock specifier.
|
||||
*
|
||||
* The clock core calls this function as the first step in implementing
|
||||
* a client's clk_get_by_*() call.
|
||||
*
|
||||
* If this function pointer is set to NULL, the clock core will use a
|
||||
* default implementation, which assumes #clock-cells = <1>, and that
|
||||
* the DT cell contains a simple integer clock ID.
|
||||
*
|
||||
* At present, the clock API solely supports device-tree. If this
|
||||
* changes, other xxx_xlate() functions may be added to support those
|
||||
* other mechanisms.
|
||||
*
|
||||
* @clock: The clock struct to hold the translation result.
|
||||
* @args: The clock specifier values from device tree.
|
||||
* @return 0 if OK, or a negative error code.
|
||||
*/
|
||||
int (*of_xlate)(struct clk *clock,
|
||||
struct ofnode_phandle_args *args);
|
||||
/**
|
||||
* request - Request a translated clock.
|
||||
*
|
||||
* The clock core calls this function as the second step in
|
||||
* implementing a client's clk_get_by_*() call, following a successful
|
||||
* xxx_xlate() call, or as the only step in implementing a client's
|
||||
* clk_request() call.
|
||||
*
|
||||
* @clock: The clock struct to request; this has been fille in by
|
||||
* a previoux xxx_xlate() function call, or by the caller
|
||||
* of clk_request().
|
||||
* @return 0 if OK, or a negative error code.
|
||||
*/
|
||||
int (*request)(struct clk *clock);
|
||||
/**
|
||||
* free - Free a previously requested clock.
|
||||
*
|
||||
* This is the implementation of the client clk_free() API.
|
||||
*
|
||||
* @clock: The clock to free.
|
||||
* @return 0 if OK, or a negative error code.
|
||||
*/
|
||||
int (*free)(struct clk *clock);
|
||||
/**
|
||||
* get_rate() - Get current clock rate.
|
||||
*
|
||||
* @clk: The clock to query.
|
||||
* @return clock rate in Hz, or -ve error code
|
||||
*/
|
||||
ulong (*get_rate)(struct clk *clk);
|
||||
/**
|
||||
* set_rate() - Set current clock rate.
|
||||
*
|
||||
* @clk: The clock to manipulate.
|
||||
* @rate: New clock rate in Hz.
|
||||
* @return new rate, or -ve error code.
|
||||
*/
|
||||
ulong (*set_rate)(struct clk *clk, ulong rate);
|
||||
/**
|
||||
* set_parent() - Set current clock parent
|
||||
*
|
||||
* @clk: The clock to manipulate.
|
||||
* @parent: New clock parent.
|
||||
* @return zero on success, or -ve error code.
|
||||
*/
|
||||
int (*set_parent)(struct clk *clk, struct clk *parent);
|
||||
/**
|
||||
* enable() - Enable a clock.
|
||||
*
|
||||
* @clk: The clock to manipulate.
|
||||
* @return zero on success, or -ve error code.
|
||||
*/
|
||||
int (*enable)(struct clk *clk);
|
||||
/**
|
||||
* disable() - Disable a clock.
|
||||
*
|
||||
* @clk: The clock to manipulate.
|
||||
* @return zero on success, or -ve error code.
|
||||
*/
|
||||
int (*disable)(struct clk *clk);
|
||||
};
|
||||
|
||||
#endif
|
||||
431
include/clk.h
Normal file
431
include/clk.h
Normal file
@@ -0,0 +1,431 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (c) 2015 Google, Inc
|
||||
* Written by Simon Glass <sjg@chromium.org>
|
||||
* Copyright (c) 2016, NVIDIA CORPORATION.
|
||||
*/
|
||||
|
||||
#ifndef _CLK_H_
|
||||
#define _CLK_H_
|
||||
|
||||
#include <dm/ofnode.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
/**
|
||||
* A clock is a hardware signal that oscillates autonomously at a specific
|
||||
* frequency and duty cycle. Most hardware modules require one or more clock
|
||||
* signal to drive their operation. Clock signals are typically generated
|
||||
* externally to the HW module consuming them, by an entity this API calls a
|
||||
* clock provider. This API provides a standard means for drivers to enable and
|
||||
* disable clocks, and to set the rate at which they oscillate.
|
||||
*
|
||||
* A driver that implements UCLASS_CLK is a clock provider. A provider will
|
||||
* often implement multiple separate clocks, since the hardware it manages
|
||||
* often has this capability. clk-uclass.h describes the interface which
|
||||
* clock providers must implement.
|
||||
*
|
||||
* Clock consumers/clients are the HW modules driven by the clock signals. This
|
||||
* header file describes the API used by drivers for those HW modules.
|
||||
*/
|
||||
|
||||
struct udevice;
|
||||
|
||||
/**
|
||||
* struct clk - A handle to (allowing control of) a single clock.
|
||||
*
|
||||
* Clients provide storage for clock handles. The content of the structure is
|
||||
* managed solely by the clock API and clock drivers. A clock struct is
|
||||
* initialized by "get"ing the clock struct. The clock struct is passed to all
|
||||
* other clock APIs to identify which clock signal to operate upon.
|
||||
*
|
||||
* @dev: The device which implements the clock signal.
|
||||
* @rate: The clock rate (in HZ).
|
||||
* @flags: Flags used across common clock structure (e.g. CLK_)
|
||||
* Clock IP blocks specific flags (i.e. mux, div, gate, etc) are defined
|
||||
* in struct's for those devices (e.g. struct clk_mux).
|
||||
* @id: The clock signal ID within the provider.
|
||||
* @data: An optional data field for scenarios where a single integer ID is not
|
||||
* sufficient. If used, it can be populated through an .of_xlate op and
|
||||
* processed during the various clock ops.
|
||||
*
|
||||
* Should additional information to identify and configure any clock signal
|
||||
* for any provider be required in the future, the struct could be expanded to
|
||||
* either (a) add more fields to allow clock providers to store additional
|
||||
* information, or (b) replace the id field with an opaque pointer, which the
|
||||
* provider would dynamically allocated during its .of_xlate op, and process
|
||||
* during is .request op. This may require the addition of an extra op to clean
|
||||
* up the allocation.
|
||||
*/
|
||||
struct clk {
|
||||
struct udevice *dev;
|
||||
long long rate; /* in HZ */
|
||||
u32 flags;
|
||||
int enable_count;
|
||||
/*
|
||||
* Written by of_xlate. In the future, we might add more fields here.
|
||||
*/
|
||||
unsigned long id;
|
||||
unsigned long data;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct clk_bulk - A handle to (allowing control of) a bulk of clocks.
|
||||
*
|
||||
* Clients provide storage for the clock bulk. The content of the structure is
|
||||
* managed solely by the clock API. A clock bulk struct is
|
||||
* initialized by "get"ing the clock bulk struct.
|
||||
* The clock bulk struct is passed to all other bulk clock APIs to apply
|
||||
* the API to all the clock in the bulk struct.
|
||||
*
|
||||
* @clks: An array of clock handles.
|
||||
* @count: The number of clock handles in the clks array.
|
||||
*/
|
||||
struct clk_bulk {
|
||||
struct clk *clks;
|
||||
unsigned int count;
|
||||
};
|
||||
|
||||
#if CONFIG_IS_ENABLED(OF_CONTROL) && CONFIG_IS_ENABLED(CLK)
|
||||
struct phandle_1_arg;
|
||||
int clk_get_by_index_platdata(struct udevice *dev, int index,
|
||||
struct phandle_1_arg *cells, struct clk *clk);
|
||||
|
||||
/**
|
||||
* clock_get_by_index - Get/request a clock by integer index.
|
||||
*
|
||||
* This looks up and requests a clock. The index is relative to the client
|
||||
* device; each device is assumed to have n clocks associated with it somehow,
|
||||
* and this function finds and requests one of them. The mapping of client
|
||||
* device clock indices to provider clocks may be via device-tree properties,
|
||||
* board-provided mapping tables, or some other mechanism.
|
||||
*
|
||||
* @dev: The client device.
|
||||
* @index: The index of the clock to request, within the client's list of
|
||||
* clocks.
|
||||
* @clock A pointer to a clock struct to initialize.
|
||||
* @return 0 if OK, or a negative error code.
|
||||
*/
|
||||
int clk_get_by_index(struct udevice *dev, int index, struct clk *clk);
|
||||
|
||||
/**
|
||||
* clock_get_by_index_nodev - Get/request a clock by integer index
|
||||
* without a device.
|
||||
*
|
||||
* This is a version of clk_get_by_index() that does not use a device.
|
||||
*
|
||||
* @node: The client ofnode.
|
||||
* @index: The index of the clock to request, within the client's list of
|
||||
* clocks.
|
||||
* @clock A pointer to a clock struct to initialize.
|
||||
* @return 0 if OK, or a negative error code.
|
||||
*/
|
||||
int clk_get_by_index_nodev(ofnode node, int index, struct clk *clk);
|
||||
|
||||
/**
|
||||
* clock_get_bulk - Get/request all clocks of a device.
|
||||
*
|
||||
* This looks up and requests all clocks of the client device; each device is
|
||||
* assumed to have n clocks associated with it somehow, and this function finds
|
||||
* and requests all of them in a separate structure. The mapping of client
|
||||
* device clock indices to provider clocks may be via device-tree properties,
|
||||
* board-provided mapping tables, or some other mechanism.
|
||||
*
|
||||
* @dev: The client device.
|
||||
* @bulk A pointer to a clock bulk struct to initialize.
|
||||
* @return 0 if OK, or a negative error code.
|
||||
*/
|
||||
int clk_get_bulk(struct udevice *dev, struct clk_bulk *bulk);
|
||||
|
||||
/**
|
||||
* clock_get_by_name - Get/request a clock by name.
|
||||
*
|
||||
* This looks up and requests a clock. The name is relative to the client
|
||||
* device; each device is assumed to have n clocks associated with it somehow,
|
||||
* and this function finds and requests one of them. The mapping of client
|
||||
* device clock names to provider clocks may be via device-tree properties,
|
||||
* board-provided mapping tables, or some other mechanism.
|
||||
*
|
||||
* @dev: The client device.
|
||||
* @name: The name of the clock to request, within the client's list of
|
||||
* clocks.
|
||||
* @clock: A pointer to a clock struct to initialize.
|
||||
* @return 0 if OK, or a negative error code.
|
||||
*/
|
||||
int clk_get_by_name(struct udevice *dev, const char *name, struct clk *clk);
|
||||
|
||||
/**
|
||||
* devm_clk_get - lookup and obtain a managed reference to a clock producer.
|
||||
* @dev: device for clock "consumer"
|
||||
* @id: clock consumer ID
|
||||
*
|
||||
* Returns a struct clk corresponding to the clock producer, or
|
||||
* valid IS_ERR() condition containing errno. The implementation
|
||||
* uses @dev and @id to determine the clock consumer, and thereby
|
||||
* the clock producer. (IOW, @id may be identical strings, but
|
||||
* clk_get may return different clock producers depending on @dev.)
|
||||
*
|
||||
* Drivers must assume that the clock source is not enabled.
|
||||
*
|
||||
* devm_clk_get should not be called from within interrupt context.
|
||||
*
|
||||
* The clock will automatically be freed when the device is unbound
|
||||
* from the bus.
|
||||
*/
|
||||
struct clk *devm_clk_get(struct udevice *dev, const char *id);
|
||||
|
||||
/**
|
||||
* devm_clk_get_optional - lookup and obtain a managed reference to an optional
|
||||
* clock producer.
|
||||
* @dev: device for clock "consumer"
|
||||
* @id: clock consumer ID
|
||||
*
|
||||
* Behaves the same as devm_clk_get() except where there is no clock producer.
|
||||
* In this case, instead of returning -ENOENT, the function returns NULL.
|
||||
*/
|
||||
struct clk *devm_clk_get_optional(struct udevice *dev, const char *id);
|
||||
|
||||
/**
|
||||
* clk_release_all() - Disable (turn off)/Free an array of previously
|
||||
* requested clocks.
|
||||
*
|
||||
* For each clock contained in the clock array, this function will check if
|
||||
* clock has been previously requested and then will disable and free it.
|
||||
*
|
||||
* @clk: A clock struct array that was previously successfully
|
||||
* requested by clk_request/get_by_*().
|
||||
* @count Number of clock contained in the array
|
||||
* @return zero on success, or -ve error code.
|
||||
*/
|
||||
int clk_release_all(struct clk *clk, int count);
|
||||
|
||||
/**
|
||||
* devm_clk_put - "free" a managed clock source
|
||||
* @dev: device used to acquire the clock
|
||||
* @clk: clock source acquired with devm_clk_get()
|
||||
*
|
||||
* Note: drivers must ensure that all clk_enable calls made on this
|
||||
* clock source are balanced by clk_disable calls prior to calling
|
||||
* this function.
|
||||
*
|
||||
* clk_put should not be called from within interrupt context.
|
||||
*/
|
||||
void devm_clk_put(struct udevice *dev, struct clk *clk);
|
||||
|
||||
#else
|
||||
static inline int clk_get_by_index(struct udevice *dev, int index,
|
||||
struct clk *clk)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int clk_get_bulk(struct udevice *dev, struct clk_bulk *bulk)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int clk_get_by_name(struct udevice *dev, const char *name,
|
||||
struct clk *clk)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int clk_release_all(struct clk *clk, int count)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) && \
|
||||
CONFIG_IS_ENABLED(CLK)
|
||||
/**
|
||||
* clk_set_defaults - Process 'assigned-{clocks/clock-parents/clock-rates}'
|
||||
* properties to configure clocks
|
||||
*
|
||||
* @dev: A device to process (the ofnode associated with this device
|
||||
* will be processed).
|
||||
* @stage: A integer. 0 indicates that this is called before the device
|
||||
* is probed. 1 indicates that this is called just after the
|
||||
* device has been probed
|
||||
*/
|
||||
int clk_set_defaults(struct udevice *dev, int stage);
|
||||
#else
|
||||
static inline int clk_set_defaults(struct udevice *dev, int stage)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* clk_release_bulk() - Disable (turn off)/Free an array of previously
|
||||
* requested clocks in a clock bulk struct.
|
||||
*
|
||||
* For each clock contained in the clock bulk struct, this function will check
|
||||
* if clock has been previously requested and then will disable and free it.
|
||||
*
|
||||
* @clk: A clock bulk struct that was previously successfully
|
||||
* requested by clk_get_bulk().
|
||||
* @return zero on success, or -ve error code.
|
||||
*/
|
||||
static inline int clk_release_bulk(struct clk_bulk *bulk)
|
||||
{
|
||||
return clk_release_all(bulk->clks, bulk->count);
|
||||
}
|
||||
|
||||
/**
|
||||
* clk_request - Request a clock by provider-specific ID.
|
||||
*
|
||||
* This requests a clock using a provider-specific ID. Generally, this function
|
||||
* should not be used, since clk_get_by_index/name() provide an interface that
|
||||
* better separates clients from intimate knowledge of clock providers.
|
||||
* However, this function may be useful in core SoC-specific code.
|
||||
*
|
||||
* @dev: The clock provider device.
|
||||
* @clock: A pointer to a clock struct to initialize. The caller must
|
||||
* have already initialized any field in this struct which the
|
||||
* clock provider uses to identify the clock.
|
||||
* @return 0 if OK, or a negative error code.
|
||||
*/
|
||||
int clk_request(struct udevice *dev, struct clk *clk);
|
||||
|
||||
/**
|
||||
* clock_free - Free a previously requested clock.
|
||||
*
|
||||
* @clock: A clock struct that was previously successfully requested by
|
||||
* clk_request/get_by_*().
|
||||
* @return 0 if OK, or a negative error code.
|
||||
*/
|
||||
int clk_free(struct clk *clk);
|
||||
|
||||
/**
|
||||
* clk_get_rate() - Get current clock rate.
|
||||
*
|
||||
* @clk: A clock struct that was previously successfully requested by
|
||||
* clk_request/get_by_*().
|
||||
* @return clock rate in Hz, or -ve error code.
|
||||
*/
|
||||
ulong clk_get_rate(struct clk *clk);
|
||||
|
||||
/**
|
||||
* clk_get_parent() - Get current clock's parent.
|
||||
*
|
||||
* @clk: A clock struct that was previously successfully requested by
|
||||
* clk_request/get_by_*().
|
||||
* @return pointer to parent's struct clk, or error code passed as pointer
|
||||
*/
|
||||
struct clk *clk_get_parent(struct clk *clk);
|
||||
|
||||
/**
|
||||
* clk_get_parent_rate() - Get parent of current clock rate.
|
||||
*
|
||||
* @clk: A clock struct that was previously successfully requested by
|
||||
* clk_request/get_by_*().
|
||||
* @return clock rate in Hz, or -ve error code.
|
||||
*/
|
||||
long long clk_get_parent_rate(struct clk *clk);
|
||||
|
||||
/**
|
||||
* clk_set_rate() - Set current clock rate.
|
||||
*
|
||||
* @clk: A clock struct that was previously successfully requested by
|
||||
* clk_request/get_by_*().
|
||||
* @rate: New clock rate in Hz.
|
||||
* @return new rate, or -ve error code.
|
||||
*/
|
||||
ulong clk_set_rate(struct clk *clk, ulong rate);
|
||||
|
||||
/**
|
||||
* clk_set_parent() - Set current clock parent.
|
||||
*
|
||||
* @clk: A clock struct that was previously successfully requested by
|
||||
* clk_request/get_by_*().
|
||||
* @parent: A clock struct that was previously successfully requested by
|
||||
* clk_request/get_by_*().
|
||||
* @return new rate, or -ve error code.
|
||||
*/
|
||||
int clk_set_parent(struct clk *clk, struct clk *parent);
|
||||
|
||||
/**
|
||||
* clk_enable() - Enable (turn on) a clock.
|
||||
*
|
||||
* @clk: A clock struct that was previously successfully requested by
|
||||
* clk_request/get_by_*().
|
||||
* @return zero on success, or -ve error code.
|
||||
*/
|
||||
int clk_enable(struct clk *clk);
|
||||
|
||||
/**
|
||||
* clk_enable_bulk() - Enable (turn on) all clocks in a clock bulk struct.
|
||||
*
|
||||
* @bulk: A clock bulk struct that was previously successfully requested
|
||||
* by clk_get_bulk().
|
||||
* @return zero on success, or -ve error code.
|
||||
*/
|
||||
int clk_enable_bulk(struct clk_bulk *bulk);
|
||||
|
||||
/**
|
||||
* clk_disable() - Disable (turn off) a clock.
|
||||
*
|
||||
* @clk: A clock struct that was previously successfully requested by
|
||||
* clk_request/get_by_*().
|
||||
* @return zero on success, or -ve error code.
|
||||
*/
|
||||
int clk_disable(struct clk *clk);
|
||||
|
||||
/**
|
||||
* clk_disable_bulk() - Disable (turn off) all clocks in a clock bulk struct.
|
||||
*
|
||||
* @bulk: A clock bulk struct that was previously successfully requested
|
||||
* by clk_get_bulk().
|
||||
* @return zero on success, or -ve error code.
|
||||
*/
|
||||
int clk_disable_bulk(struct clk_bulk *bulk);
|
||||
|
||||
/**
|
||||
* clk_is_match - check if two clk's point to the same hardware clock
|
||||
* @p: clk compared against q
|
||||
* @q: clk compared against p
|
||||
*
|
||||
* Returns true if the two struct clk pointers both point to the same hardware
|
||||
* clock node.
|
||||
*
|
||||
* Returns false otherwise. Note that two NULL clks are treated as matching.
|
||||
*/
|
||||
bool clk_is_match(const struct clk *p, const struct clk *q);
|
||||
|
||||
int soc_clk_dump(void);
|
||||
|
||||
/**
|
||||
* clk_valid() - check if clk is valid
|
||||
*
|
||||
* @clk: the clock to check
|
||||
* @return true if valid, or false
|
||||
*/
|
||||
static inline bool clk_valid(struct clk *clk)
|
||||
{
|
||||
return clk && !!clk->dev;
|
||||
}
|
||||
|
||||
/**
|
||||
* clk_get_by_id() - Get the clock by its ID
|
||||
*
|
||||
* @id: The clock ID to search for
|
||||
*
|
||||
* @clkp: A pointer to clock struct that has been found among added clocks
|
||||
* to UCLASS_CLK
|
||||
* @return zero on success, or -ENOENT on error
|
||||
*/
|
||||
int clk_get_by_id(ulong id, struct clk **clkp);
|
||||
|
||||
/**
|
||||
* clk_dev_binded() - Check whether the clk has a device binded
|
||||
*
|
||||
* @clk A pointer to the clk
|
||||
*
|
||||
* @return true on binded, or false on no
|
||||
*/
|
||||
bool clk_dev_binded(struct clk *clk);
|
||||
#endif
|
||||
|
||||
#define clk_prepare_enable(clk) clk_enable(clk)
|
||||
#define clk_disable_unprepare(clk) clk_disable(clk)
|
||||
14
include/cmd_spl.h
Normal file
14
include/cmd_spl.h
Normal file
@@ -0,0 +1,14 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/* Copyright (C) 2011
|
||||
* Corscience GmbH & Co. KG - Simon Schwarz <schwarz@corscience.de>
|
||||
*/
|
||||
#ifndef _NAND_SPL_H_
|
||||
#define _NAND_SPL_H_
|
||||
|
||||
#define SPL_EXPORT (0x00000001)
|
||||
|
||||
#define SPL_EXPORT_FDT (0x00000001)
|
||||
#define SPL_EXPORT_ATAGS (0x00000002)
|
||||
#define SPL_EXPORT_LAST SPL_EXPORT_ATAGS
|
||||
|
||||
#endif /* _NAND_SPL_H_ */
|
||||
382
include/command.h
Normal file
382
include/command.h
Normal file
@@ -0,0 +1,382 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2000-2009
|
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Definitions for Command Processor
|
||||
*/
|
||||
#ifndef __COMMAND_H
|
||||
#define __COMMAND_H
|
||||
|
||||
#include <env.h>
|
||||
#include <linker_lists.h>
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
/* Default to a width of 8 characters for help message command width */
|
||||
#ifndef CONFIG_SYS_HELP_CMD_WIDTH
|
||||
#define CONFIG_SYS_HELP_CMD_WIDTH 10
|
||||
#endif
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
/*
|
||||
* Monitor Command Table
|
||||
*/
|
||||
|
||||
struct cmd_tbl_s {
|
||||
char *name; /* Command Name */
|
||||
int maxargs; /* maximum number of arguments */
|
||||
/*
|
||||
* Same as ->cmd() except the command
|
||||
* tells us if it can be repeated.
|
||||
* Replaces the old ->repeatable field
|
||||
* which was not able to make
|
||||
* repeatable property different for
|
||||
* the main command and sub-commands.
|
||||
*/
|
||||
int (*cmd_rep)(struct cmd_tbl_s *cmd, int flags, int argc,
|
||||
char * const argv[], int *repeatable);
|
||||
/* Implementation function */
|
||||
int (*cmd)(struct cmd_tbl_s *, int, int, char * const []);
|
||||
char *usage; /* Usage message (short) */
|
||||
#ifdef CONFIG_SYS_LONGHELP
|
||||
char *help; /* Help message (long) */
|
||||
#endif
|
||||
#ifdef CONFIG_AUTO_COMPLETE
|
||||
/* do auto completion on the arguments */
|
||||
int (*complete)(int argc, char * const argv[], char last_char, int maxv, char *cmdv[]);
|
||||
#endif
|
||||
};
|
||||
|
||||
typedef struct cmd_tbl_s cmd_tbl_t;
|
||||
|
||||
|
||||
#if defined(CONFIG_CMD_RUN)
|
||||
extern int do_run(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
|
||||
#endif
|
||||
|
||||
/* common/command.c */
|
||||
int _do_help (cmd_tbl_t *cmd_start, int cmd_items, cmd_tbl_t * cmdtp, int
|
||||
flag, int argc, char * const argv[]);
|
||||
cmd_tbl_t *find_cmd(const char *cmd);
|
||||
cmd_tbl_t *find_cmd_tbl (const char *cmd, cmd_tbl_t *table, int table_len);
|
||||
int complete_subcmdv(cmd_tbl_t *cmdtp, int count, int argc,
|
||||
char * const argv[], char last_char, int maxv,
|
||||
char *cmdv[]);
|
||||
|
||||
extern int cmd_usage(const cmd_tbl_t *cmdtp);
|
||||
|
||||
/* Dummy ->cmd and ->cmd_rep wrappers. */
|
||||
int cmd_always_repeatable(cmd_tbl_t *cmdtp, int flag, int argc,
|
||||
char * const argv[], int *repeatable);
|
||||
int cmd_never_repeatable(cmd_tbl_t *cmdtp, int flag, int argc,
|
||||
char * const argv[], int *repeatable);
|
||||
int cmd_discard_repeatable(cmd_tbl_t *cmdtp, int flag, int argc,
|
||||
char * const argv[]);
|
||||
|
||||
static inline bool cmd_is_repeatable(cmd_tbl_t *cmdtp)
|
||||
{
|
||||
return cmdtp->cmd_rep == cmd_always_repeatable;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_AUTO_COMPLETE
|
||||
extern int var_complete(int argc, char * const argv[], char last_char, int maxv, char *cmdv[]);
|
||||
extern int cmd_auto_complete(const char *const prompt, char *buf, int *np, int *colp);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* cmd_process_error() - report and process a possible error
|
||||
*
|
||||
* @cmdtp: Command which caused the error
|
||||
* @err: Error code (0 if none, -ve for error, like -EIO)
|
||||
* @return 0 (CMD_RET_SUCCESS) if there is not error,
|
||||
* 1 (CMD_RET_FAILURE) if an error is found
|
||||
* -1 (CMD_RET_USAGE) if 'usage' error is found
|
||||
*/
|
||||
int cmd_process_error(cmd_tbl_t *cmdtp, int err);
|
||||
|
||||
/*
|
||||
* Monitor Command
|
||||
*
|
||||
* All commands use a common argument format:
|
||||
*
|
||||
* void function (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
|
||||
*/
|
||||
|
||||
#if defined(CONFIG_CMD_MEMORY) || \
|
||||
defined(CONFIG_CMD_I2C) || \
|
||||
defined(CONFIG_CMD_ITEST) || \
|
||||
defined(CONFIG_CMD_PCI) || \
|
||||
defined(CONFIG_CMD_SETEXPR)
|
||||
#define CMD_DATA_SIZE
|
||||
extern int cmd_get_data_size(char* arg, int default_size);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CMD_BOOTD
|
||||
extern int do_bootd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
|
||||
#endif
|
||||
#ifdef CONFIG_CMD_BOOTM
|
||||
extern int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
|
||||
extern int bootm_maybe_autostart(cmd_tbl_t *cmdtp, const char *cmd);
|
||||
#else
|
||||
static inline int bootm_maybe_autostart(cmd_tbl_t *cmdtp, const char *cmd)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
extern int do_bootz(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
|
||||
|
||||
extern int do_booti(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
|
||||
|
||||
extern int common_diskboot(cmd_tbl_t *cmdtp, const char *intf, int argc,
|
||||
char *const argv[]);
|
||||
|
||||
extern int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
|
||||
extern int do_poweroff(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
|
||||
|
||||
extern unsigned long do_go_exec(ulong (*entry)(int, char * const []), int argc,
|
||||
char * const argv[]);
|
||||
|
||||
#if defined(CONFIG_CMD_NVEDIT_EFI)
|
||||
extern int do_env_print_efi(cmd_tbl_t *cmdtp, int flag, int argc,
|
||||
char * const argv[]);
|
||||
extern int do_env_set_efi(cmd_tbl_t *cmdtp, int flag, int argc,
|
||||
char * const argv[]);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CMD_BOOT_SLAVE
|
||||
extern int do_bootslave(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Error codes that commands return to cmd_process(). We use the standard 0
|
||||
* and 1 for success and failure, but add one more case - failure with a
|
||||
* request to call cmd_usage(). But the cmd_process() function handles
|
||||
* CMD_RET_USAGE itself and after calling cmd_usage() it will return 1.
|
||||
* This is just a convenience for commands to avoid them having to call
|
||||
* cmd_usage() all over the place.
|
||||
*/
|
||||
enum command_ret_t {
|
||||
CMD_RET_SUCCESS, /* 0 = Success */
|
||||
CMD_RET_FAILURE, /* 1 = Failure */
|
||||
CMD_RET_USAGE = -1, /* Failure, please report 'usage' error */
|
||||
};
|
||||
|
||||
/**
|
||||
* Process a command with arguments. We look up the command and execute it
|
||||
* if valid. Otherwise we print a usage message.
|
||||
*
|
||||
* @param flag Some flags normally 0 (see CMD_FLAG_.. above)
|
||||
* @param argc Number of arguments (arg 0 must be the command text)
|
||||
* @param argv Arguments
|
||||
* @param repeatable This function sets this to 0 if the command is not
|
||||
* repeatable. If the command is repeatable, the value
|
||||
* is left unchanged.
|
||||
* @param ticks If ticks is not null, this function set it to the
|
||||
* number of ticks the command took to complete.
|
||||
* @return 0 if the command succeeded, 1 if it failed
|
||||
*/
|
||||
int cmd_process(int flag, int argc, char * const argv[],
|
||||
int *repeatable, unsigned long *ticks);
|
||||
|
||||
void fixup_cmdtable(cmd_tbl_t *cmdtp, int size);
|
||||
|
||||
/**
|
||||
* board_run_command() - Fallback function to execute a command
|
||||
*
|
||||
* When no command line features are enabled in U-Boot, this function is
|
||||
* called to execute a command. Typically the function can look at the
|
||||
* command and perform a few very specific tasks, such as booting the
|
||||
* system in a particular way.
|
||||
*
|
||||
* This function is only used when CONFIG_CMDLINE is not enabled.
|
||||
*
|
||||
* In normal situations this function should not return, since U-Boot will
|
||||
* simply hang.
|
||||
*
|
||||
* @cmdline: Command line string to execute
|
||||
* @return 0 if OK, 1 for error
|
||||
*/
|
||||
int board_run_command(const char *cmdline);
|
||||
|
||||
int run_command(const char *cmd, int flag);
|
||||
int run_command_repeatable(const char *cmd, int flag);
|
||||
|
||||
/**
|
||||
* Run a list of commands separated by ; or even \0
|
||||
*
|
||||
* Note that if 'len' is not -1, then the command does not need to be nul
|
||||
* terminated, Memory will be allocated for the command in that case.
|
||||
*
|
||||
* @param cmd List of commands to run, each separated bu semicolon
|
||||
* @param len Length of commands excluding terminator if known (-1 if not)
|
||||
* @param flag Execution flags (CMD_FLAG_...)
|
||||
* @return 0 on success, or != 0 on error.
|
||||
*/
|
||||
int run_command_list(const char *cmd, int len, int flag);
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
/*
|
||||
* Command Flags:
|
||||
*/
|
||||
#define CMD_FLAG_REPEAT 0x0001 /* repeat last command */
|
||||
#define CMD_FLAG_BOOTD 0x0002 /* command is from bootd */
|
||||
#define CMD_FLAG_ENV 0x0004 /* command is from the environment */
|
||||
|
||||
#ifdef CONFIG_AUTO_COMPLETE
|
||||
# define _CMD_COMPLETE(x) x,
|
||||
#else
|
||||
# define _CMD_COMPLETE(x)
|
||||
#endif
|
||||
#ifdef CONFIG_SYS_LONGHELP
|
||||
# define _CMD_HELP(x) x,
|
||||
#else
|
||||
# define _CMD_HELP(x)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NEEDS_MANUAL_RELOC
|
||||
#define U_BOOT_SUBCMDS_RELOC(_cmdname) \
|
||||
static void _cmdname##_subcmds_reloc(void) \
|
||||
{ \
|
||||
static int relocated; \
|
||||
\
|
||||
if (relocated) \
|
||||
return; \
|
||||
\
|
||||
fixup_cmdtable(_cmdname##_subcmds, \
|
||||
ARRAY_SIZE(_cmdname##_subcmds)); \
|
||||
relocated = 1; \
|
||||
}
|
||||
#else
|
||||
#define U_BOOT_SUBCMDS_RELOC(_cmdname) \
|
||||
static void _cmdname##_subcmds_reloc(void) { }
|
||||
#endif
|
||||
|
||||
#define U_BOOT_SUBCMDS_DO_CMD(_cmdname) \
|
||||
static int do_##_cmdname(cmd_tbl_t *cmdtp, int flag, int argc, \
|
||||
char * const argv[], int *repeatable) \
|
||||
{ \
|
||||
cmd_tbl_t *subcmd; \
|
||||
\
|
||||
_cmdname##_subcmds_reloc(); \
|
||||
\
|
||||
/* We need at least the cmd and subcmd names. */ \
|
||||
if (argc < 2 || argc > CONFIG_SYS_MAXARGS) \
|
||||
return CMD_RET_USAGE; \
|
||||
\
|
||||
subcmd = find_cmd_tbl(argv[1], _cmdname##_subcmds, \
|
||||
ARRAY_SIZE(_cmdname##_subcmds)); \
|
||||
if (!subcmd || argc - 1 > subcmd->maxargs) \
|
||||
return CMD_RET_USAGE; \
|
||||
\
|
||||
if (flag == CMD_FLAG_REPEAT && \
|
||||
!cmd_is_repeatable(subcmd)) \
|
||||
return CMD_RET_SUCCESS; \
|
||||
\
|
||||
return subcmd->cmd_rep(subcmd, flag, argc - 1, \
|
||||
argv + 1, repeatable); \
|
||||
}
|
||||
|
||||
#ifdef CONFIG_AUTO_COMPLETE
|
||||
#define U_BOOT_SUBCMDS_COMPLETE(_cmdname) \
|
||||
static int complete_##_cmdname(int argc, char * const argv[], \
|
||||
char last_char, int maxv, \
|
||||
char *cmdv[]) \
|
||||
{ \
|
||||
return complete_subcmdv(_cmdname##_subcmds, \
|
||||
ARRAY_SIZE(_cmdname##_subcmds), \
|
||||
argc - 1, argv + 1, last_char, \
|
||||
maxv, cmdv); \
|
||||
}
|
||||
#else
|
||||
#define U_BOOT_SUBCMDS_COMPLETE(_cmdname)
|
||||
#endif
|
||||
|
||||
#define U_BOOT_SUBCMDS(_cmdname, ...) \
|
||||
static cmd_tbl_t _cmdname##_subcmds[] = { __VA_ARGS__ }; \
|
||||
U_BOOT_SUBCMDS_RELOC(_cmdname) \
|
||||
U_BOOT_SUBCMDS_DO_CMD(_cmdname) \
|
||||
U_BOOT_SUBCMDS_COMPLETE(_cmdname)
|
||||
|
||||
#ifdef CONFIG_CMDLINE
|
||||
#define U_BOOT_CMDREP_MKENT_COMPLETE(_name, _maxargs, _cmd_rep, \
|
||||
_usage, _help, _comp) \
|
||||
{ #_name, _maxargs, _cmd_rep, cmd_discard_repeatable, \
|
||||
_usage, _CMD_HELP(_help) _CMD_COMPLETE(_comp) }
|
||||
|
||||
#define U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd, \
|
||||
_usage, _help, _comp) \
|
||||
{ #_name, _maxargs, \
|
||||
_rep ? cmd_always_repeatable : cmd_never_repeatable, \
|
||||
_cmd, _usage, _CMD_HELP(_help) _CMD_COMPLETE(_comp) }
|
||||
|
||||
#define U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, _help, _comp) \
|
||||
ll_entry_declare(cmd_tbl_t, _name, cmd) = \
|
||||
U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd, \
|
||||
_usage, _help, _comp);
|
||||
|
||||
#define U_BOOT_CMDREP_COMPLETE(_name, _maxargs, _cmd_rep, _usage, \
|
||||
_help, _comp) \
|
||||
ll_entry_declare(cmd_tbl_t, _name, cmd) = \
|
||||
U_BOOT_CMDREP_MKENT_COMPLETE(_name, _maxargs, _cmd_rep, \
|
||||
_usage, _help, _comp)
|
||||
|
||||
#else
|
||||
#define U_BOOT_SUBCMD_START(name) static cmd_tbl_t name[] = {};
|
||||
#define U_BOOT_SUBCMD_END
|
||||
|
||||
#define _CMD_REMOVE(_name, _cmd) \
|
||||
int __remove_ ## _name(void) \
|
||||
{ \
|
||||
if (0) \
|
||||
_cmd(NULL, 0, 0, NULL); \
|
||||
return 0; \
|
||||
}
|
||||
|
||||
#define U_BOOT_CMDREP_MKENT_COMPLETE(_name, _maxargs, _cmd_rep, \
|
||||
_usage, _help, _comp) \
|
||||
{ #_name, _maxargs, 0 ? _cmd_rep : NULL, NULL, _usage, \
|
||||
_CMD_HELP(_help) _CMD_COMPLETE(_comp) }
|
||||
|
||||
#define U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, \
|
||||
_help, _comp) \
|
||||
{ #_name, _maxargs, NULL, 0 ? _cmd : NULL, _usage, \
|
||||
_CMD_HELP(_help) _CMD_COMPLETE(_comp) }
|
||||
|
||||
#define U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, _help, \
|
||||
_comp) \
|
||||
_CMD_REMOVE(sub_ ## _name, _cmd)
|
||||
|
||||
#define U_BOOT_CMDREP_COMPLETE(_name, _maxargs, _cmd_rep, _usage, \
|
||||
_help, _comp) \
|
||||
_CMD_REMOVE(sub_ ## _name, _cmd_rep)
|
||||
|
||||
#endif /* CONFIG_CMDLINE */
|
||||
|
||||
#define U_BOOT_CMD(_name, _maxargs, _rep, _cmd, _usage, _help) \
|
||||
U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, _help, NULL)
|
||||
|
||||
#define U_BOOT_CMD_MKENT(_name, _maxargs, _rep, _cmd, _usage, _help) \
|
||||
U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd, \
|
||||
_usage, _help, NULL)
|
||||
|
||||
#define U_BOOT_SUBCMD_MKENT_COMPLETE(_name, _maxargs, _rep, _do_cmd, \
|
||||
_comp) \
|
||||
U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _do_cmd, \
|
||||
"", "", _comp)
|
||||
|
||||
#define U_BOOT_SUBCMD_MKENT(_name, _maxargs, _rep, _do_cmd) \
|
||||
U_BOOT_SUBCMD_MKENT_COMPLETE(_name, _maxargs, _rep, _do_cmd, \
|
||||
NULL)
|
||||
|
||||
#define U_BOOT_CMD_WITH_SUBCMDS(_name, _usage, _help, ...) \
|
||||
U_BOOT_SUBCMDS(_name, __VA_ARGS__) \
|
||||
U_BOOT_CMDREP_COMPLETE(_name, CONFIG_SYS_MAXARGS, do_##_name, \
|
||||
_usage, _help, complete_##_name)
|
||||
|
||||
#endif /* __COMMAND_H */
|
||||
195
include/common.h
Normal file
195
include/common.h
Normal file
@@ -0,0 +1,195 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Common header file for U-Boot
|
||||
*
|
||||
* This file still includes quite a bit of stuff that should be in separate
|
||||
* headers. Please think before adding more things.
|
||||
* Patches to remove things are welcome.
|
||||
*
|
||||
* (C) Copyright 2000-2009
|
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
*/
|
||||
|
||||
#ifndef __COMMON_H_
|
||||
#define __COMMON_H_ 1
|
||||
|
||||
#ifndef __ASSEMBLY__ /* put C only stuff in this section */
|
||||
|
||||
typedef volatile unsigned long vu_long;
|
||||
typedef volatile unsigned short vu_short;
|
||||
typedef volatile unsigned char vu_char;
|
||||
|
||||
#include <config.h>
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
#include <asm-offsets.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/printk.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/stringify.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <part.h>
|
||||
#include <flash.h>
|
||||
#include <image.h>
|
||||
|
||||
#ifdef __LP64__
|
||||
#define CONFIG_SYS_SUPPORT_64BIT_DATA
|
||||
#endif
|
||||
|
||||
#include <log.h>
|
||||
|
||||
#include <asm/u-boot.h> /* boot information for Linux kernel */
|
||||
#include <asm/global_data.h> /* global data used for startup functions */
|
||||
|
||||
/* startup functions, used in:
|
||||
* common/board_f.c
|
||||
* common/init/board_init.c
|
||||
* common/board_r.c
|
||||
* common/board_info.c
|
||||
*/
|
||||
#include <init.h>
|
||||
|
||||
/*
|
||||
* Function Prototypes
|
||||
*/
|
||||
void hang (void) __attribute__ ((noreturn));
|
||||
|
||||
#include <display_options.h>
|
||||
|
||||
/* common/main.c */
|
||||
void main_loop (void);
|
||||
|
||||
int checkflash(void);
|
||||
int checkdram(void);
|
||||
extern u8 __dtb_dt_begin[]; /* embedded device tree blob */
|
||||
extern u8 __dtb_dt_spl_begin[]; /* embedded device tree blob for SPL/TPL */
|
||||
int mdm_init(void);
|
||||
|
||||
/**
|
||||
* arch_fixup_fdt() - Write arch-specific information to fdt
|
||||
*
|
||||
* Defined in arch/$(ARCH)/lib/bootm-fdt.c
|
||||
*
|
||||
* @blob: FDT blob to write to
|
||||
* @return 0 if ok, or -ve FDT_ERR_... on failure
|
||||
*/
|
||||
int arch_fixup_fdt(void *blob);
|
||||
|
||||
/* common/flash.c */
|
||||
void flash_perror (int);
|
||||
|
||||
/* common/cmd_source.c */
|
||||
int source (ulong addr, const char *fit_uname);
|
||||
|
||||
extern ulong load_addr; /* Default Load Address */
|
||||
extern ulong save_addr; /* Default Save Address */
|
||||
extern ulong save_size; /* Default Save Size */
|
||||
|
||||
/* common/cmd_net.c */
|
||||
int do_tftpb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
|
||||
|
||||
/* common/cmd_fat.c */
|
||||
int do_fat_fsload(cmd_tbl_t *, int, int, char * const []);
|
||||
|
||||
/* common/cmd_ext2.c */
|
||||
int do_ext2load(cmd_tbl_t *, int, int, char * const []);
|
||||
|
||||
/* common/exports.c */
|
||||
void jumptable_init(void);
|
||||
|
||||
/* common/kallsysm.c */
|
||||
const char *symbol_lookup(unsigned long addr, unsigned long *caddr);
|
||||
|
||||
/* common/memsize.c */
|
||||
long get_ram_size (long *, long);
|
||||
phys_size_t get_effective_memsize(void);
|
||||
|
||||
/* $(BOARD)/$(BOARD).c */
|
||||
void reset_phy (void);
|
||||
void fdc_hw_init (void);
|
||||
|
||||
#if !defined(CONFIG_ENV_EEPROM_IS_ON_I2C) && defined(CONFIG_SYS_I2C_EEPROM_ADDR)
|
||||
# define CONFIG_SYS_DEF_EEPROM_ADDR CONFIG_SYS_I2C_EEPROM_ADDR
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SYS_DRAM_TEST)
|
||||
int testdram(void);
|
||||
#endif /* CONFIG_SYS_DRAM_TEST */
|
||||
|
||||
#if defined(CONFIG_ARM)
|
||||
void relocate_code(ulong);
|
||||
#else
|
||||
void relocate_code(ulong, gd_t *, ulong) __attribute__ ((noreturn));
|
||||
#endif
|
||||
|
||||
void s_init(void);
|
||||
|
||||
void upmconfig (unsigned int, unsigned int *, unsigned int);
|
||||
ulong get_tbclk (void);
|
||||
void reset_misc (void);
|
||||
void reset_cpu (ulong addr);
|
||||
void ft_cpu_setup(void *blob, bd_t *bd);
|
||||
void ft_pci_setup(void *blob, bd_t *bd);
|
||||
|
||||
/* $(CPU)/speed.c */
|
||||
int get_clocks (void);
|
||||
ulong get_bus_freq (ulong);
|
||||
int get_serial_clock(void);
|
||||
|
||||
/* lib/uuid.c */
|
||||
#include <uuid.h>
|
||||
|
||||
/* lib/vsprintf.c */
|
||||
#include <vsprintf.h>
|
||||
|
||||
/* lib/net_utils.c */
|
||||
#include <net.h>
|
||||
|
||||
#include <bootstage.h>
|
||||
|
||||
#else /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
/* Put only stuff here that the assembler can digest */
|
||||
|
||||
#ifdef CONFIG_POST
|
||||
#define CONFIG_HAS_POST
|
||||
#ifndef CONFIG_POST_ALT_LIST
|
||||
#define CONFIG_POST_STD_LIST
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define ROUND(a,b) (((a) + (b) - 1) & ~((b) - 1))
|
||||
|
||||
/*
|
||||
* check_member() - Check the offset of a structure member
|
||||
*
|
||||
* @structure: Name of structure (e.g. global_data)
|
||||
* @member: Name of member (e.g. baudrate)
|
||||
* @offset: Expected offset in bytes
|
||||
*/
|
||||
#define check_member(structure, member, offset) _Static_assert( \
|
||||
offsetof(struct structure, member) == offset, \
|
||||
"`struct " #structure "` offset for `" #member "` is not " #offset)
|
||||
|
||||
/* Avoid using CONFIG_EFI_STUB directly as we may boot from other loaders */
|
||||
#ifdef CONFIG_EFI_STUB
|
||||
#define ll_boot_init() false
|
||||
#else
|
||||
#define ll_boot_init() true
|
||||
#endif
|
||||
|
||||
/* Pull in stuff for the build system */
|
||||
#ifdef DO_DEPS_ONLY
|
||||
# include <env_internal.h>
|
||||
#endif
|
||||
|
||||
#endif /* __COMMON_H_ */
|
||||
68
include/common_timing_params.h
Normal file
68
include/common_timing_params.h
Normal file
@@ -0,0 +1,68 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright 2008-2014 Freescale Semiconductor, Inc.
|
||||
*/
|
||||
|
||||
#ifndef COMMON_TIMING_PARAMS_H
|
||||
#define COMMON_TIMING_PARAMS_H
|
||||
|
||||
typedef struct {
|
||||
/* parameters to constrict */
|
||||
|
||||
unsigned int tckmin_x_ps;
|
||||
unsigned int tckmax_ps;
|
||||
unsigned int trcd_ps;
|
||||
unsigned int trp_ps;
|
||||
unsigned int tras_ps;
|
||||
#if defined(CONFIG_SYS_FSL_DDR3) || defined(CONFIG_SYS_FSL_DDR4)
|
||||
unsigned int taamin_ps;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SYS_FSL_DDR4
|
||||
unsigned int trfc1_ps;
|
||||
unsigned int trfc2_ps;
|
||||
unsigned int trfc4_ps;
|
||||
unsigned int trrds_ps;
|
||||
unsigned int trrdl_ps;
|
||||
unsigned int tccdl_ps;
|
||||
unsigned int trfc_slr_ps;
|
||||
#else
|
||||
unsigned int twtr_ps; /* maximum = 63750 ps */
|
||||
unsigned int trfc_ps; /* maximum = 255 ns + 256 ns + .75 ns
|
||||
= 511750 ps */
|
||||
|
||||
unsigned int trrd_ps; /* maximum = 63750 ps */
|
||||
unsigned int trtp_ps; /* byte 38, spd->trtp */
|
||||
#endif
|
||||
unsigned int twr_ps; /* maximum = 63750 ps */
|
||||
unsigned int trc_ps; /* maximum = 254 ns + .75 ns = 254750 ps */
|
||||
|
||||
unsigned int refresh_rate_ps;
|
||||
unsigned int extended_op_srt;
|
||||
|
||||
#if defined(CONFIG_SYS_FSL_DDR1) || defined(CONFIG_SYS_FSL_DDR2)
|
||||
unsigned int tis_ps; /* byte 32, spd->ca_setup */
|
||||
unsigned int tih_ps; /* byte 33, spd->ca_hold */
|
||||
unsigned int tds_ps; /* byte 34, spd->data_setup */
|
||||
unsigned int tdh_ps; /* byte 35, spd->data_hold */
|
||||
unsigned int tdqsq_max_ps; /* byte 44, spd->tdqsq */
|
||||
unsigned int tqhs_ps; /* byte 45, spd->tqhs */
|
||||
#endif
|
||||
|
||||
unsigned int ndimms_present;
|
||||
unsigned int lowest_common_spd_caslat;
|
||||
unsigned int highest_common_derated_caslat;
|
||||
unsigned int additive_latency;
|
||||
unsigned int all_dimms_burst_lengths_bitmask;
|
||||
unsigned int all_dimms_registered;
|
||||
unsigned int all_dimms_unbuffered;
|
||||
unsigned int all_dimms_ecc_capable;
|
||||
|
||||
unsigned long long total_mem;
|
||||
unsigned long long base_address;
|
||||
|
||||
/* DDR3 RDIMM */
|
||||
unsigned char rcw[16]; /* Register Control Word 0-15 */
|
||||
} common_timing_params_t;
|
||||
|
||||
#endif
|
||||
147
include/compiler.h
Normal file
147
include/compiler.h
Normal file
@@ -0,0 +1,147 @@
|
||||
/*
|
||||
* Keep all the ugly #ifdef for system stuff here
|
||||
*/
|
||||
|
||||
#ifndef __COMPILER_H__
|
||||
#define __COMPILER_H__
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef USE_HOSTCC
|
||||
|
||||
#if defined(__BEOS__) || \
|
||||
defined(__NetBSD__) || \
|
||||
defined(__FreeBSD__) || \
|
||||
defined(__sun__) || \
|
||||
defined(__APPLE__)
|
||||
# include <inttypes.h>
|
||||
#elif defined(__linux__) || defined(__WIN32__) || defined(__MINGW32__) || defined(__OpenBSD__)
|
||||
# include <stdint.h>
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#if !defined(__WIN32__) && !defined(__MINGW32__)
|
||||
# include <sys/mman.h>
|
||||
#endif
|
||||
|
||||
/* Not all systems (like Windows) has this define, and yes
|
||||
* we do replace/emulate mmap() on those systems ...
|
||||
*/
|
||||
#ifndef MAP_FAILED
|
||||
# define MAP_FAILED ((void *)-1)
|
||||
#endif
|
||||
|
||||
#include <fcntl.h>
|
||||
#ifndef O_BINARY /* should be define'd on __WIN32__ */
|
||||
#define O_BINARY 0
|
||||
#endif
|
||||
|
||||
#ifdef __linux__
|
||||
# include <endian.h>
|
||||
# include <byteswap.h>
|
||||
#elif defined(__MACH__) || defined(__FreeBSD__)
|
||||
# include <machine/endian.h>
|
||||
#endif
|
||||
#ifdef __FreeBSD__
|
||||
# include <sys/endian.h> /* htole32 and friends */
|
||||
# define __BYTE_ORDER BYTE_ORDER
|
||||
# define __LITTLE_ENDIAN LITTLE_ENDIAN
|
||||
# define __BIG_ENDIAN BIG_ENDIAN
|
||||
#elif defined(__OpenBSD__)
|
||||
# include <endian.h>
|
||||
# define __BYTE_ORDER BYTE_ORDER
|
||||
# define __LITTLE_ENDIAN LITTLE_ENDIAN
|
||||
# define __BIG_ENDIAN BIG_ENDIAN
|
||||
#endif
|
||||
|
||||
#include <time.h>
|
||||
|
||||
typedef uint8_t __u8;
|
||||
typedef uint16_t __u16;
|
||||
typedef uint32_t __u32;
|
||||
typedef unsigned int uint;
|
||||
typedef unsigned long ulong;
|
||||
|
||||
#define uswap_16(x) \
|
||||
((((x) & 0xff00) >> 8) | \
|
||||
(((x) & 0x00ff) << 8))
|
||||
#define uswap_32(x) \
|
||||
((((x) & 0xff000000) >> 24) | \
|
||||
(((x) & 0x00ff0000) >> 8) | \
|
||||
(((x) & 0x0000ff00) << 8) | \
|
||||
(((x) & 0x000000ff) << 24))
|
||||
#define _uswap_64(x, sfx) \
|
||||
((((x) & 0xff00000000000000##sfx) >> 56) | \
|
||||
(((x) & 0x00ff000000000000##sfx) >> 40) | \
|
||||
(((x) & 0x0000ff0000000000##sfx) >> 24) | \
|
||||
(((x) & 0x000000ff00000000##sfx) >> 8) | \
|
||||
(((x) & 0x00000000ff000000##sfx) << 8) | \
|
||||
(((x) & 0x0000000000ff0000##sfx) << 24) | \
|
||||
(((x) & 0x000000000000ff00##sfx) << 40) | \
|
||||
(((x) & 0x00000000000000ff##sfx) << 56))
|
||||
#if defined(__GNUC__)
|
||||
# define uswap_64(x) _uswap_64(x, ull)
|
||||
#else
|
||||
# define uswap_64(x) _uswap_64(x, )
|
||||
#endif
|
||||
|
||||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
# define cpu_to_le16(x) (x)
|
||||
# define cpu_to_le32(x) (x)
|
||||
# define cpu_to_le64(x) (x)
|
||||
# define le16_to_cpu(x) (x)
|
||||
# define le32_to_cpu(x) (x)
|
||||
# define le64_to_cpu(x) (x)
|
||||
# define cpu_to_be16(x) uswap_16(x)
|
||||
# define cpu_to_be32(x) uswap_32(x)
|
||||
# define cpu_to_be64(x) uswap_64(x)
|
||||
# define be16_to_cpu(x) uswap_16(x)
|
||||
# define be32_to_cpu(x) uswap_32(x)
|
||||
# define be64_to_cpu(x) uswap_64(x)
|
||||
#else
|
||||
# define cpu_to_le16(x) uswap_16(x)
|
||||
# define cpu_to_le32(x) uswap_32(x)
|
||||
# define cpu_to_le64(x) uswap_64(x)
|
||||
# define le16_to_cpu(x) uswap_16(x)
|
||||
# define le32_to_cpu(x) uswap_32(x)
|
||||
# define le64_to_cpu(x) uswap_64(x)
|
||||
# define cpu_to_be16(x) (x)
|
||||
# define cpu_to_be32(x) (x)
|
||||
# define cpu_to_be64(x) (x)
|
||||
# define be16_to_cpu(x) (x)
|
||||
# define be32_to_cpu(x) (x)
|
||||
# define be64_to_cpu(x) (x)
|
||||
#endif
|
||||
|
||||
#else /* !USE_HOSTCC */
|
||||
|
||||
/* Type for `void *' pointers. */
|
||||
typedef unsigned long int uintptr_t;
|
||||
|
||||
#include <linux/string.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
#if __SIZEOF_LONG__ == 8
|
||||
# define __WORDSIZE 64
|
||||
#elif __SIZEOF_LONG__ == 4
|
||||
# define __WORDSIZE 32
|
||||
#else
|
||||
/*
|
||||
* Assume 32-bit for now - only newer toolchains support this feature and
|
||||
* this is only required for sandbox support at present.
|
||||
*/
|
||||
#define __WORDSIZE 32
|
||||
#endif
|
||||
|
||||
#endif /* USE_HOSTCC */
|
||||
|
||||
#define likely(x) __builtin_expect(!!(x), 1)
|
||||
#define unlikely(x) __builtin_expect(!!(x), 0)
|
||||
|
||||
#endif
|
||||
12
include/config_defaults.h
Normal file
12
include/config_defaults.h
Normal file
@@ -0,0 +1,12 @@
|
||||
/*
|
||||
* config_defaults.h - sane defaults for everyone
|
||||
*
|
||||
* Copyright (c) 2009 Analog Devices Inc.
|
||||
*
|
||||
* Licensed under the GPL-2 or later.
|
||||
*/
|
||||
|
||||
#ifndef _CONFIG_DEFAULTS_H_
|
||||
#define _CONFIG_DEFAULTS_H_
|
||||
|
||||
#endif
|
||||
492
include/config_distro_bootcmd.h
Normal file
492
include/config_distro_bootcmd.h
Normal file
@@ -0,0 +1,492 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* (C) Copyright 2014
|
||||
* NVIDIA Corporation <www.nvidia.com>
|
||||
*
|
||||
* Copyright 2014 Red Hat, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _CONFIG_CMD_DISTRO_BOOTCMD_H
|
||||
#define _CONFIG_CMD_DISTRO_BOOTCMD_H
|
||||
|
||||
/*
|
||||
* A note on error handling: It is possible for BOOT_TARGET_DEVICES to
|
||||
* reference a device that is not enabled in the U-Boot configuration, e.g.
|
||||
* it may include MMC in the list without CONFIG_CMD_MMC being enabled. Given
|
||||
* that BOOT_TARGET_DEVICES is a macro that's expanded by the C pre-processor
|
||||
* at compile time, it's not possible to detect and report such problems via
|
||||
* a simple #ifdef/#error combination. Still, the code needs to report errors.
|
||||
* The best way I've found to do this is to make BOOT_TARGET_DEVICES expand to
|
||||
* reference a non-existent symbol, and have the name of that symbol encode
|
||||
* the error message. Consequently, this file contains references to e.g.
|
||||
* BOOT_TARGET_DEVICES_references_MMC_without_CONFIG_CMD_MMC. Given the
|
||||
* prevalence of capitals here, this looks like a pre-processor macro and
|
||||
* hence seems like it should be all capitals, but it's really an error
|
||||
* message that includes some other pre-processor symbols in the text.
|
||||
*/
|
||||
|
||||
#define BOOTENV_SHARED_BLKDEV_BODY(devtypel) \
|
||||
"if " #devtypel " dev ${devnum}; then " \
|
||||
"devtype=" #devtypel "; " \
|
||||
"run scan_dev_for_boot_part; " \
|
||||
"fi\0"
|
||||
|
||||
#define BOOTENV_SHARED_BLKDEV(devtypel) \
|
||||
#devtypel "_boot=" \
|
||||
BOOTENV_SHARED_BLKDEV_BODY(devtypel)
|
||||
|
||||
#define BOOTENV_DEV_BLKDEV(devtypeu, devtypel, instance) \
|
||||
"bootcmd_" #devtypel #instance "=" \
|
||||
"devnum=" #instance "; " \
|
||||
"run " #devtypel "_boot\0"
|
||||
|
||||
#define BOOTENV_DEV_NAME_BLKDEV(devtypeu, devtypel, instance) \
|
||||
#devtypel #instance " "
|
||||
|
||||
#ifdef CONFIG_SANDBOX
|
||||
#define BOOTENV_SHARED_HOST BOOTENV_SHARED_BLKDEV(host)
|
||||
#define BOOTENV_DEV_HOST BOOTENV_DEV_BLKDEV
|
||||
#define BOOTENV_DEV_NAME_HOST BOOTENV_DEV_NAME_BLKDEV
|
||||
#else
|
||||
#define BOOTENV_SHARED_HOST
|
||||
#define BOOTENV_DEV_HOST \
|
||||
BOOT_TARGET_DEVICES_references_HOST_without_CONFIG_SANDBOX
|
||||
#define BOOTENV_DEV_NAME_HOST \
|
||||
BOOT_TARGET_DEVICES_references_HOST_without_CONFIG_SANDBOX
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CMD_MMC
|
||||
#define BOOTENV_SHARED_MMC BOOTENV_SHARED_BLKDEV(mmc)
|
||||
#define BOOTENV_DEV_MMC BOOTENV_DEV_BLKDEV
|
||||
#define BOOTENV_DEV_NAME_MMC BOOTENV_DEV_NAME_BLKDEV
|
||||
#else
|
||||
#define BOOTENV_SHARED_MMC
|
||||
#define BOOTENV_DEV_MMC \
|
||||
BOOT_TARGET_DEVICES_references_MMC_without_CONFIG_CMD_MMC
|
||||
#define BOOTENV_DEV_NAME_MMC \
|
||||
BOOT_TARGET_DEVICES_references_MMC_without_CONFIG_CMD_MMC
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CMD_UBIFS
|
||||
#define BOOTENV_SHARED_UBIFS \
|
||||
"ubifs_boot=" \
|
||||
"env exists bootubipart || " \
|
||||
"env set bootubipart UBI; " \
|
||||
"env exists bootubivol || " \
|
||||
"env set bootubivol boot; " \
|
||||
"if ubi part ${bootubipart} && " \
|
||||
"ubifsmount ubi${devnum}:${bootubivol}; " \
|
||||
"then " \
|
||||
"devtype=ubi; " \
|
||||
"run scan_dev_for_boot; " \
|
||||
"fi\0"
|
||||
#define BOOTENV_DEV_UBIFS BOOTENV_DEV_BLKDEV
|
||||
#define BOOTENV_DEV_NAME_UBIFS BOOTENV_DEV_NAME_BLKDEV
|
||||
#else
|
||||
#define BOOTENV_SHARED_UBIFS
|
||||
#define BOOTENV_DEV_UBIFS \
|
||||
BOOT_TARGET_DEVICES_references_UBIFS_without_CONFIG_CMD_UBIFS
|
||||
#define BOOTENV_DEV_NAME_UBIFS \
|
||||
BOOT_TARGET_DEVICES_references_UBIFS_without_CONFIG_CMD_UBIFS
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_EFI_LOADER
|
||||
#if defined(CONFIG_ARM64)
|
||||
#define BOOTEFI_NAME "bootaa64.efi"
|
||||
#elif defined(CONFIG_ARM)
|
||||
#define BOOTEFI_NAME "bootarm.efi"
|
||||
#elif defined(CONFIG_X86_RUN_32BIT)
|
||||
#define BOOTEFI_NAME "bootia32.efi"
|
||||
#elif defined(CONFIG_X86_RUN_64BIT)
|
||||
#define BOOTEFI_NAME "bootx64.efi"
|
||||
#elif defined(CONFIG_ARCH_RV32I)
|
||||
#define BOOTEFI_NAME "bootriscv32.efi"
|
||||
#elif defined(CONFIG_ARCH_RV64I)
|
||||
#define BOOTEFI_NAME "bootriscv64.efi"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef BOOTEFI_NAME
|
||||
#if defined(CONFIG_ARM) && !defined(CONFIG_ARM64)
|
||||
/*
|
||||
* On 32bit ARM systems there is a reasonable number of systems that follow
|
||||
* the $soc-$board$boardver.dtb name scheme for their device trees. Use that
|
||||
* scheme if we don't have an explicit fdtfile variable.
|
||||
*/
|
||||
#define BOOTENV_EFI_SET_FDTFILE_FALLBACK \
|
||||
"if test -z \"${fdtfile}\" -a -n \"${soc}\"; then " \
|
||||
"setenv efi_fdtfile ${soc}-${board}${boardver}.dtb; " \
|
||||
"fi; "
|
||||
#else
|
||||
#define BOOTENV_EFI_SET_FDTFILE_FALLBACK
|
||||
#endif
|
||||
|
||||
|
||||
#define BOOTENV_SHARED_EFI \
|
||||
"boot_efi_binary=" \
|
||||
"if fdt addr ${fdt_addr_r}; then " \
|
||||
"bootefi bootmgr ${fdt_addr_r};" \
|
||||
"else " \
|
||||
"bootefi bootmgr ${fdtcontroladdr};" \
|
||||
"fi;" \
|
||||
"load ${devtype} ${devnum}:${distro_bootpart} " \
|
||||
"${kernel_addr_r} efi/boot/"BOOTEFI_NAME"; " \
|
||||
"if fdt addr ${fdt_addr_r}; then " \
|
||||
"bootefi ${kernel_addr_r} ${fdt_addr_r};" \
|
||||
"else " \
|
||||
"bootefi ${kernel_addr_r} ${fdtcontroladdr};" \
|
||||
"fi\0" \
|
||||
\
|
||||
"load_efi_dtb=" \
|
||||
"load ${devtype} ${devnum}:${distro_bootpart} " \
|
||||
"${fdt_addr_r} ${prefix}${efi_fdtfile}\0" \
|
||||
\
|
||||
"efi_dtb_prefixes=/ /dtb/ /dtb/current/\0" \
|
||||
"scan_dev_for_efi=" \
|
||||
"setenv efi_fdtfile ${fdtfile}; " \
|
||||
BOOTENV_EFI_SET_FDTFILE_FALLBACK \
|
||||
"for prefix in ${efi_dtb_prefixes}; do " \
|
||||
"if test -e ${devtype} " \
|
||||
"${devnum}:${distro_bootpart} " \
|
||||
"${prefix}${efi_fdtfile}; then " \
|
||||
"run load_efi_dtb; " \
|
||||
"fi;" \
|
||||
"done;" \
|
||||
"if test -e ${devtype} ${devnum}:${distro_bootpart} " \
|
||||
"efi/boot/"BOOTEFI_NAME"; then " \
|
||||
"echo Found EFI removable media binary " \
|
||||
"efi/boot/"BOOTEFI_NAME"; " \
|
||||
"run boot_efi_binary; " \
|
||||
"echo EFI LOAD FAILED: continuing...; " \
|
||||
"fi; " \
|
||||
"setenv efi_fdtfile\0"
|
||||
#define SCAN_DEV_FOR_EFI "run scan_dev_for_efi;"
|
||||
#else
|
||||
#define BOOTENV_SHARED_EFI
|
||||
#define SCAN_DEV_FOR_EFI
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SATA
|
||||
#define BOOTENV_SHARED_SATA BOOTENV_SHARED_BLKDEV(sata)
|
||||
#define BOOTENV_DEV_SATA BOOTENV_DEV_BLKDEV
|
||||
#define BOOTENV_DEV_NAME_SATA BOOTENV_DEV_NAME_BLKDEV
|
||||
#else
|
||||
#define BOOTENV_SHARED_SATA
|
||||
#define BOOTENV_DEV_SATA \
|
||||
BOOT_TARGET_DEVICES_references_SATA_without_CONFIG_SATA
|
||||
#define BOOTENV_DEV_NAME_SATA \
|
||||
BOOT_TARGET_DEVICES_references_SATA_without_CONFIG_SATA
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NVME
|
||||
#define BOOTENV_RUN_NVME_INIT "run nvme_init; "
|
||||
#define BOOTENV_SET_NVME_NEED_INIT "setenv nvme_need_init; "
|
||||
#define BOOTENV_SHARED_NVME \
|
||||
"nvme_init=" \
|
||||
"if ${nvme_need_init}; then " \
|
||||
"setenv nvme_need_init false; " \
|
||||
"nvme scan; " \
|
||||
"fi\0" \
|
||||
\
|
||||
"nvme_boot=" \
|
||||
BOOTENV_RUN_PCI_ENUM \
|
||||
BOOTENV_RUN_NVME_INIT \
|
||||
BOOTENV_SHARED_BLKDEV_BODY(nvme)
|
||||
#define BOOTENV_DEV_NVME BOOTENV_DEV_BLKDEV
|
||||
#define BOOTENV_DEV_NAME_NVME BOOTENV_DEV_NAME_BLKDEV
|
||||
#else
|
||||
#define BOOTENV_RUN_NVME_INIT
|
||||
#define BOOTENV_SET_NVME_NEED_INIT
|
||||
#define BOOTENV_SHARED_NVME
|
||||
#define BOOTENV_DEV_NVME \
|
||||
BOOT_TARGET_DEVICES_references_NVME_without_CONFIG_NVME
|
||||
#define BOOTENV_DEV_NAME_NVME \
|
||||
BOOT_TARGET_DEVICES_references_NVME_without_CONFIG_NVME
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SCSI
|
||||
#define BOOTENV_RUN_SCSI_INIT "run scsi_init; "
|
||||
#define BOOTENV_SET_SCSI_NEED_INIT "scsi_need_init=; "
|
||||
#define BOOTENV_SHARED_SCSI \
|
||||
"scsi_init=" \
|
||||
"if ${scsi_need_init}; then " \
|
||||
"scsi_need_init=false; " \
|
||||
"scsi scan; " \
|
||||
"fi\0" \
|
||||
\
|
||||
"scsi_boot=" \
|
||||
BOOTENV_RUN_SCSI_INIT \
|
||||
BOOTENV_SHARED_BLKDEV_BODY(scsi)
|
||||
#define BOOTENV_DEV_SCSI BOOTENV_DEV_BLKDEV
|
||||
#define BOOTENV_DEV_NAME_SCSI BOOTENV_DEV_NAME_BLKDEV
|
||||
#else
|
||||
#define BOOTENV_RUN_SCSI_INIT
|
||||
#define BOOTENV_SET_SCSI_NEED_INIT
|
||||
#define BOOTENV_SHARED_SCSI
|
||||
#define BOOTENV_DEV_SCSI \
|
||||
BOOT_TARGET_DEVICES_references_SCSI_without_CONFIG_SCSI
|
||||
#define BOOTENV_DEV_NAME_SCSI \
|
||||
BOOT_TARGET_DEVICES_references_SCSI_without_CONFIG_SCSI
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_IDE
|
||||
#define BOOTENV_RUN_IDE_INIT "run ide_init; "
|
||||
#define BOOTENV_SET_IDE_NEED_INIT "setenv ide_need_init; "
|
||||
#define BOOTENV_SHARED_IDE \
|
||||
"ide_init=" \
|
||||
"if ${ide_need_init}; then " \
|
||||
"setenv ide_need_init false; " \
|
||||
"ide reset; " \
|
||||
"fi\0" \
|
||||
\
|
||||
"ide_boot=" \
|
||||
BOOTENV_RUN_IDE_INIT \
|
||||
BOOTENV_SHARED_BLKDEV_BODY(ide)
|
||||
#define BOOTENV_DEV_IDE BOOTENV_DEV_BLKDEV
|
||||
#define BOOTENV_DEV_NAME_IDE BOOTENV_DEV_NAME_BLKDEV
|
||||
#else
|
||||
#define BOOTENV_RUN_IDE_INIT
|
||||
#define BOOTENV_SET_IDE_NEED_INIT
|
||||
#define BOOTENV_SHARED_IDE
|
||||
#define BOOTENV_DEV_IDE \
|
||||
BOOT_TARGET_DEVICES_references_IDE_without_CONFIG_IDE
|
||||
#define BOOTENV_DEV_NAME_IDE \
|
||||
BOOT_TARGET_DEVICES_references_IDE_without_CONFIG_IDE
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_DM_PCI)
|
||||
#define BOOTENV_RUN_PCI_ENUM "run boot_pci_enum; "
|
||||
#define BOOTENV_SHARED_PCI \
|
||||
"boot_pci_enum=pci enum\0"
|
||||
#else
|
||||
#define BOOTENV_RUN_PCI_ENUM
|
||||
#define BOOTENV_SHARED_PCI
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CMD_USB
|
||||
#define BOOTENV_RUN_NET_USB_START "run boot_net_usb_start; "
|
||||
#define BOOTENV_SHARED_USB \
|
||||
"boot_net_usb_start=usb start\0" \
|
||||
"usb_boot=" \
|
||||
"usb start; " \
|
||||
BOOTENV_SHARED_BLKDEV_BODY(usb)
|
||||
#define BOOTENV_DEV_USB BOOTENV_DEV_BLKDEV
|
||||
#define BOOTENV_DEV_NAME_USB BOOTENV_DEV_NAME_BLKDEV
|
||||
#else
|
||||
#define BOOTENV_RUN_NET_USB_START
|
||||
#define BOOTENV_SHARED_USB
|
||||
#define BOOTENV_DEV_USB \
|
||||
BOOT_TARGET_DEVICES_references_USB_without_CONFIG_CMD_USB
|
||||
#define BOOTENV_DEV_NAME_USB \
|
||||
BOOT_TARGET_DEVICES_references_USB_without_CONFIG_CMD_USB
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CMD_VIRTIO
|
||||
#define BOOTENV_RUN_VIRTIO_INIT "run virtio_init; "
|
||||
#define BOOTENV_SET_VIRTIO_NEED_INIT "virtio_need_init=; "
|
||||
#define BOOTENV_SHARED_VIRTIO \
|
||||
"virtio_init=" \
|
||||
"if ${virtio_need_init}; then " \
|
||||
"virtio_need_init=false; " \
|
||||
"virtio scan; " \
|
||||
"fi\0" \
|
||||
\
|
||||
"virtio_boot=" \
|
||||
BOOTENV_RUN_PCI_ENUM \
|
||||
BOOTENV_RUN_VIRTIO_INIT \
|
||||
BOOTENV_SHARED_BLKDEV_BODY(virtio)
|
||||
#define BOOTENV_DEV_VIRTIO BOOTENV_DEV_BLKDEV
|
||||
#define BOOTENV_DEV_NAME_VIRTIO BOOTENV_DEV_NAME_BLKDEV
|
||||
#else
|
||||
#define BOOTENV_RUN_VIRTIO_INIT
|
||||
#define BOOTENV_SET_VIRTIO_NEED_INIT
|
||||
#define BOOTENV_SHARED_VIRTIO
|
||||
#define BOOTENV_DEV_VIRTIO \
|
||||
BOOT_TARGET_DEVICES_references_VIRTIO_without_CONFIG_CMD_VIRTIO
|
||||
#define BOOTENV_DEV_NAME_VIRTIO \
|
||||
BOOT_TARGET_DEVICES_references_VIRTIO_without_CONFIG_CMD_VIRTIO
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CMD_DHCP)
|
||||
#if defined(CONFIG_EFI_LOADER)
|
||||
/* http://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xml */
|
||||
#if defined(CONFIG_ARM64) || defined(__aarch64__)
|
||||
#define BOOTENV_EFI_PXE_ARCH "0xb"
|
||||
#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00011:UNDI:003000"
|
||||
#elif defined(CONFIG_ARM) || defined(__arm__)
|
||||
#define BOOTENV_EFI_PXE_ARCH "0xa"
|
||||
#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00010:UNDI:003000"
|
||||
#elif defined(CONFIG_X86) || defined(__x86_64__)
|
||||
#define BOOTENV_EFI_PXE_ARCH "0x7"
|
||||
#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00007:UNDI:003000"
|
||||
#elif defined(__i386__)
|
||||
#define BOOTENV_EFI_PXE_ARCH "0x6"
|
||||
#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00006:UNDI:003000"
|
||||
#elif defined(CONFIG_ARCH_RV32I) || ((defined(__riscv) && __riscv_xlen == 32))
|
||||
#define BOOTENV_EFI_PXE_ARCH "0x19"
|
||||
#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00025:UNDI:003000"
|
||||
#elif defined(CONFIG_ARCH_RV64I) || ((defined(__riscv) && __riscv_xlen == 64))
|
||||
#define BOOTENV_EFI_PXE_ARCH "0x1b"
|
||||
#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00027:UNDI:003000"
|
||||
#elif defined(CONFIG_SANDBOX)
|
||||
# error "sandbox EFI support is only supported on ARM and x86"
|
||||
#else
|
||||
#error Please specify an EFI client identifier
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Ask the dhcp server for an EFI binary. If we get one, check for a
|
||||
* device tree in the same folder. Then boot everything. If the file was
|
||||
* not an EFI binary, we just return from the bootefi command and continue.
|
||||
*/
|
||||
#define BOOTENV_EFI_RUN_DHCP \
|
||||
"setenv efi_fdtfile ${fdtfile}; " \
|
||||
BOOTENV_EFI_SET_FDTFILE_FALLBACK \
|
||||
"setenv efi_old_vci ${bootp_vci};" \
|
||||
"setenv efi_old_arch ${bootp_arch};" \
|
||||
"setenv bootp_vci " BOOTENV_EFI_PXE_VCI ";" \
|
||||
"setenv bootp_arch " BOOTENV_EFI_PXE_ARCH ";" \
|
||||
"if dhcp ${kernel_addr_r}; then " \
|
||||
"tftpboot ${fdt_addr_r} dtb/${efi_fdtfile};" \
|
||||
"if fdt addr ${fdt_addr_r}; then " \
|
||||
"bootefi ${kernel_addr_r} ${fdt_addr_r}; " \
|
||||
"else " \
|
||||
"bootefi ${kernel_addr_r} ${fdtcontroladdr};" \
|
||||
"fi;" \
|
||||
"fi;" \
|
||||
"setenv bootp_vci ${efi_old_vci};" \
|
||||
"setenv bootp_arch ${efi_old_arch};" \
|
||||
"setenv efi_fdtfile;" \
|
||||
"setenv efi_old_arch;" \
|
||||
"setenv efi_old_vci;"
|
||||
#else
|
||||
#define BOOTENV_EFI_RUN_DHCP
|
||||
#endif
|
||||
#define BOOTENV_DEV_DHCP(devtypeu, devtypel, instance) \
|
||||
"bootcmd_dhcp=" \
|
||||
BOOTENV_RUN_NET_USB_START \
|
||||
BOOTENV_RUN_PCI_ENUM \
|
||||
"if dhcp ${scriptaddr} ${boot_script_dhcp}; then " \
|
||||
"source ${scriptaddr}; " \
|
||||
"fi;" \
|
||||
BOOTENV_EFI_RUN_DHCP \
|
||||
"\0"
|
||||
#define BOOTENV_DEV_NAME_DHCP(devtypeu, devtypel, instance) \
|
||||
"dhcp "
|
||||
#else
|
||||
#define BOOTENV_DEV_DHCP \
|
||||
BOOT_TARGET_DEVICES_references_DHCP_without_CONFIG_CMD_DHCP
|
||||
#define BOOTENV_DEV_NAME_DHCP \
|
||||
BOOT_TARGET_DEVICES_references_DHCP_without_CONFIG_CMD_DHCP
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CMD_DHCP) && defined(CONFIG_CMD_PXE)
|
||||
#define BOOTENV_DEV_PXE(devtypeu, devtypel, instance) \
|
||||
"bootcmd_pxe=" \
|
||||
BOOTENV_RUN_NET_USB_START \
|
||||
BOOTENV_RUN_PCI_ENUM \
|
||||
"dhcp; " \
|
||||
"if pxe get; then " \
|
||||
"pxe boot; " \
|
||||
"fi\0"
|
||||
#define BOOTENV_DEV_NAME_PXE(devtypeu, devtypel, instance) \
|
||||
"pxe "
|
||||
#else
|
||||
#define BOOTENV_DEV_PXE \
|
||||
BOOT_TARGET_DEVICES_references_PXE_without_CONFIG_CMD_DHCP_or_PXE
|
||||
#define BOOTENV_DEV_NAME_PXE \
|
||||
BOOT_TARGET_DEVICES_references_PXE_without_CONFIG_CMD_DHCP_or_PXE
|
||||
#endif
|
||||
|
||||
#define BOOTENV_DEV_NAME(devtypeu, devtypel, instance) \
|
||||
BOOTENV_DEV_NAME_##devtypeu(devtypeu, devtypel, instance)
|
||||
#define BOOTENV_BOOT_TARGETS \
|
||||
"boot_targets=" BOOT_TARGET_DEVICES(BOOTENV_DEV_NAME) "\0"
|
||||
|
||||
#define BOOTENV_DEV(devtypeu, devtypel, instance) \
|
||||
BOOTENV_DEV_##devtypeu(devtypeu, devtypel, instance)
|
||||
#define BOOTENV \
|
||||
BOOTENV_SHARED_HOST \
|
||||
BOOTENV_SHARED_MMC \
|
||||
BOOTENV_SHARED_PCI \
|
||||
BOOTENV_SHARED_USB \
|
||||
BOOTENV_SHARED_SATA \
|
||||
BOOTENV_SHARED_SCSI \
|
||||
BOOTENV_SHARED_NVME \
|
||||
BOOTENV_SHARED_IDE \
|
||||
BOOTENV_SHARED_UBIFS \
|
||||
BOOTENV_SHARED_EFI \
|
||||
BOOTENV_SHARED_VIRTIO \
|
||||
"boot_prefixes=/ /boot/\0" \
|
||||
"boot_scripts=boot.scr.uimg boot.scr\0" \
|
||||
"boot_script_dhcp=boot.scr.uimg\0" \
|
||||
BOOTENV_BOOT_TARGETS \
|
||||
\
|
||||
"boot_syslinux_conf=extlinux/extlinux.conf\0" \
|
||||
"boot_extlinux=" \
|
||||
"sysboot ${devtype} ${devnum}:${distro_bootpart} any " \
|
||||
"${scriptaddr} ${prefix}${boot_syslinux_conf}\0" \
|
||||
\
|
||||
"scan_dev_for_extlinux=" \
|
||||
"if test -e ${devtype} " \
|
||||
"${devnum}:${distro_bootpart} " \
|
||||
"${prefix}${boot_syslinux_conf}; then " \
|
||||
"echo Found ${prefix}${boot_syslinux_conf}; " \
|
||||
"run boot_extlinux; " \
|
||||
"echo SCRIPT FAILED: continuing...; " \
|
||||
"fi\0" \
|
||||
\
|
||||
"boot_a_script=" \
|
||||
"load ${devtype} ${devnum}:${distro_bootpart} " \
|
||||
"${scriptaddr} ${prefix}${script}; " \
|
||||
"source ${scriptaddr}\0" \
|
||||
\
|
||||
"scan_dev_for_scripts=" \
|
||||
"for script in ${boot_scripts}; do " \
|
||||
"if test -e ${devtype} " \
|
||||
"${devnum}:${distro_bootpart} " \
|
||||
"${prefix}${script}; then " \
|
||||
"echo Found U-Boot script " \
|
||||
"${prefix}${script}; " \
|
||||
"run boot_a_script; " \
|
||||
"echo SCRIPT FAILED: continuing...; " \
|
||||
"fi; " \
|
||||
"done\0" \
|
||||
\
|
||||
"scan_dev_for_boot=" \
|
||||
"echo Scanning ${devtype} " \
|
||||
"${devnum}:${distro_bootpart}...; " \
|
||||
"for prefix in ${boot_prefixes}; do " \
|
||||
"run scan_dev_for_extlinux; " \
|
||||
"run scan_dev_for_scripts; " \
|
||||
"done;" \
|
||||
SCAN_DEV_FOR_EFI \
|
||||
"\0" \
|
||||
\
|
||||
"scan_dev_for_boot_part=" \
|
||||
"part list ${devtype} ${devnum} -bootable devplist; " \
|
||||
"env exists devplist || setenv devplist 1; " \
|
||||
"for distro_bootpart in ${devplist}; do " \
|
||||
"if fstype ${devtype} " \
|
||||
"${devnum}:${distro_bootpart} " \
|
||||
"bootfstype; then " \
|
||||
"run scan_dev_for_boot; " \
|
||||
"fi; " \
|
||||
"done; " \
|
||||
"setenv devplist\0" \
|
||||
\
|
||||
BOOT_TARGET_DEVICES(BOOTENV_DEV) \
|
||||
\
|
||||
"distro_bootcmd=" BOOTENV_SET_SCSI_NEED_INIT \
|
||||
BOOTENV_SET_NVME_NEED_INIT \
|
||||
BOOTENV_SET_IDE_NEED_INIT \
|
||||
BOOTENV_SET_VIRTIO_NEED_INIT \
|
||||
"for target in ${boot_targets}; do " \
|
||||
"run bootcmd_${target}; " \
|
||||
"done\0"
|
||||
|
||||
#ifndef CONFIG_BOOTCOMMAND
|
||||
#define CONFIG_BOOTCOMMAND "run distro_bootcmd"
|
||||
#endif
|
||||
|
||||
#endif /* _CONFIG_CMD_DISTRO_BOOTCMD_H */
|
||||
55
include/config_fallbacks.h
Normal file
55
include/config_fallbacks.h
Normal file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright 2012 Texas Instruments
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License Version 2. This file is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#ifndef __CONFIG_FALLBACKS_H
|
||||
#define __CONFIG_FALLBACKS_H
|
||||
|
||||
#ifdef CONFIG_SPL
|
||||
#ifdef CONFIG_SPL_PAD_TO
|
||||
#ifdef CONFIG_SPL_MAX_SIZE
|
||||
#if CONFIG_SPL_PAD_TO && CONFIG_SPL_PAD_TO < CONFIG_SPL_MAX_SIZE
|
||||
#error CONFIG_SPL_PAD_TO < CONFIG_SPL_MAX_SIZE
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#ifdef CONFIG_SPL_MAX_SIZE
|
||||
#define CONFIG_SPL_PAD_TO CONFIG_SPL_MAX_SIZE
|
||||
#else
|
||||
#define CONFIG_SPL_PAD_TO 0
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_SYS_BAUDRATE_TABLE
|
||||
#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
|
||||
#endif
|
||||
|
||||
/* Console I/O Buffer Size */
|
||||
#ifndef CONFIG_SYS_CBSIZE
|
||||
#if defined(CONFIG_CMD_KGDB)
|
||||
#define CONFIG_SYS_CBSIZE 1024
|
||||
#else
|
||||
#define CONFIG_SYS_CBSIZE 256
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_SYS_PBSIZE
|
||||
#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_SYS_MAXARGS
|
||||
#define CONFIG_SYS_MAXARGS 16
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DM_I2C
|
||||
# ifdef CONFIG_SYS_I2C
|
||||
# error "Cannot define CONFIG_SYS_I2C when CONFIG_DM_I2C is used"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /* __CONFIG_FALLBACKS_H */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user