arch/powerpc/boot/cpm-serial.c

Source file repositories/reference/linux-study-clean/arch/powerpc/boot/cpm-serial.c

File Facts

System
Linux kernel
Corpus path
arch/powerpc/boot/cpm-serial.c
Extension
.c
Size
5312 bytes
Lines
296
Domain
Architecture Layer
Bucket
arch/powerpc
Inferred role
Architecture Layer: implementation source
Status
source implementation candidate

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

struct cpm_scc {
	u32 gsmrl;
	u32 gsmrh;
	u16 psmr;
	u8 res1[2];
	u16 todr;
	u16 dsr;
	u16 scce;
	u8 res2[2];
	u16 sccm;
	u8 res3;
	u8 sccs;
	u8 res4[8];
};

struct cpm_smc {
	u8 res1[2];
	u16 smcmr;
	u8 res2[2];
	u8 smce;
	u8 res3[3];
	u8 smcm;
	u8 res4[5];
};

struct cpm_param {
	u16 rbase;
	u16 tbase;
	u8 rfcr;
	u8 tfcr;
	u16 mrblr;
	u32 rstate;
	u8 res1[4];
	u16 rbptr;
	u8 res2[6];
	u32 tstate;
	u8 res3[4];
	u16 tbptr;
	u8 res4[6];
	u16 maxidl;
	u16 idlc;
	u16 brkln;
	u16 brkec;
	u16 brkcr;
	u16 rmask;
	u8 res5[4];
};

struct cpm_bd {
	u16 sc;   /* Status and Control */
	u16 len;  /* Data length in buffer */
	u8 *addr; /* Buffer address in host memory */
};

static void *cpcr;
static struct cpm_param *param;
static struct cpm_smc *smc;
static struct cpm_scc *scc;
static struct cpm_bd *tbdf, *rbdf;
static u32 cpm_cmd;
static void *cbd_addr;
static u32 cbd_offset;

static void (*do_cmd)(int op);
static void (*enable_port)(void);
static void (*disable_port)(void);

#define CPM_CMD_STOP_TX     4
#define CPM_CMD_RESTART_TX  6
#define CPM_CMD_INIT_RX_TX  0

static void cpm1_cmd(int op)
{
	while (in_be16(cpcr) & 1)
		;

	out_be16(cpcr, (op << 8) | cpm_cmd | 1);

	while (in_be16(cpcr) & 1)
		;
}

static void cpm2_cmd(int op)
{
	while (in_be32(cpcr) & 0x10000)
		;

	out_be32(cpcr, op | cpm_cmd | 0x10000);

	while (in_be32(cpcr) & 0x10000)

Annotation

Implementation Notes