veritefb_ucode.h revision 1.1 1 1.1 rkujawa /* $NetBSD: veritefb_ucode.h,v 1.1 2026/07/11 15:18:21 rkujawa Exp $ */
2 1.1 rkujawa
3 1.1 rkujawa /*
4 1.1 rkujawa * Copyright (c) 2026 The NetBSD Foundation, Inc.
5 1.1 rkujawa * All rights reserved.
6 1.1 rkujawa *
7 1.1 rkujawa * This code is derived from software contributed to The NetBSD Foundation
8 1.1 rkujawa * by Radoslaw Kujawa.
9 1.1 rkujawa *
10 1.1 rkujawa * Redistribution and use in source and binary forms, with or without
11 1.1 rkujawa * modification, are permitted provided that the following conditions
12 1.1 rkujawa * are met:
13 1.1 rkujawa * 1. Redistributions of source code must retain the above copyright
14 1.1 rkujawa * notice, this list of conditions and the following disclaimer.
15 1.1 rkujawa * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 rkujawa * notice, this list of conditions and the following disclaimer in the
17 1.1 rkujawa * documentation and/or other materials provided with the distribution.
18 1.1 rkujawa *
19 1.1 rkujawa * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20 1.1 rkujawa * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 1.1 rkujawa * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 1.1 rkujawa * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23 1.1 rkujawa * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24 1.1 rkujawa * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 1.1 rkujawa * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 1.1 rkujawa * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 1.1 rkujawa * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 1.1 rkujawa * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 1.1 rkujawa */
30 1.1 rkujawa
31 1.1 rkujawa /*
32 1.1 rkujawa * Rendition Verite RISC and 2D microcode interface definitions.
33 1.1 rkujawa *
34 1.1 rkujawa * Command numbers are taken from the dispatch table extracted from the
35 1.1 rkujawa * V2x00 2D microcode blob itself (v20002d.uc, dispatch table at 0x5140).
36 1.1 rkujawa */
37 1.1 rkujawa
38 1.1 rkujawa #ifndef VERITEFB_UCODE_H
39 1.1 rkujawa #define VERITEFB_UCODE_H
40 1.1 rkujawa
41 1.1 rkujawa /*
42 1.1 rkujawa * VRAM layout: the first VFB_MC_SIZE bytes are reserved for microcode,
43 1.1 rkujawa * the framebuffer starts right after...
44 1.1 rkujawa *
45 1.1 rkujawa * The context-switch monitor (csucode) lives at VFB_CSUCODE_BASE.
46 1.1 rkujawa */
47 1.1 rkujawa #define VFB_MC_SIZE 0x10000
48 1.1 rkujawa #define VFB_CSUCODE_BASE 0x800
49 1.1 rkujawa #define VFB_CSUCODE_SEM0 0x7f8
50 1.1 rkujawa #define VFB_CSUCODE_SEM1 0x7fc
51 1.1 rkujawa
52 1.1 rkujawa /* csucode monitor commands (first FIFO word after starting the monitor) */
53 1.1 rkujawa #define VFB_CSUCODE_INIT 0 /* a1=ctx store area, a2, entry */
54 1.1 rkujawa #define VFB_CSUCODE_SYNC 2 /* wait for pixel engine idle */
55 1.1 rkujawa
56 1.1 rkujawa /*
57 1.1 rkujawa * Host->RISC commands: 32-bit words into the input FIFO,
58 1.1 rkujawa * command index in bits 15:0, first parameter in bits 31:16.
59 1.1 rkujawa */
60 1.1 rkujawa #define VFB_CMDW(param, cmd) (((uint32_t)(uint16_t)(param) << 16) | \
61 1.1 rkujawa (uint16_t)(cmd))
62 1.1 rkujawa #define VFB_P2(x, y) VFB_CMDW(x, y)
63 1.1 rkujawa
64 1.1 rkujawa #define VCMD_FILLRECTSOLID 1 /* prefer the ROP variant */
65 1.1 rkujawa #define VCMD_PIXENGSYNC 8 /* -> 0xffffffff in output FIFO */
66 1.1 rkujawa #define VCMD_GETPIXEL 9 /* P2(x,y) -> pixel in output FIFO */
67 1.1 rkujawa #define VCMD_SETSCREENINFO 10
68 1.1 rkujawa #define VCMD_SCREENBLT 12
69 1.1 rkujawa #define VCMD_MONOSOURCEBLT 22
70 1.1 rkujawa #define VCMD_SETUP 32 /* 6 words total */
71 1.1 rkujawa #define VCMD_SETPALETTE 33
72 1.1 rkujawa #define VCMD_SETPIXEL 34
73 1.1 rkujawa #define VCMD_DRAWGLYPHS 35
74 1.1 rkujawa #define VCMD_SETCLIPPING 36
75 1.1 rkujawa #define VCMD_FILLRECTSOLIDROP 41
76 1.1 rkujawa
77 1.1 rkujawa #define VFB_SYNC_TOKEN 0xffffffffU
78 1.1 rkujawa
79 1.1 rkujawa /* 2D blob layout facts, for RISC program counter classification. */
80 1.1 rkujawa #define VFB_UC_BASE 0x1000 /* link base; dispatch loop here */
81 1.1 rkujawa #define VFB_UC_DISPATCH_END 0x101c /* end of the dispatch idle loop */
82 1.1 rkujawa #define VFB_UC_TRAP 0x1050 /* invalid-command self-branch */
83 1.1 rkujawa #define VFB_UC_TRAP_END 0x1058 /* including the delay slot */
84 1.1 rkujawa #define VFB_UC_END 0x5000 /* end of the command handlers */
85 1.1 rkujawa #define VFB_RISC_ROM_BASE 0xfffe0000 /* boot ROM, RISC view */
86 1.1 rkujawa
87 1.1 rkujawa /* DstMode for 2D: ALUMode in bits 3:0, other bits zero. */
88 1.1 rkujawa #define VFB_ROP_COPY 0xc
89 1.1 rkujawa
90 1.1 rkujawa /*
91 1.1 rkujawa * RISC register file indices and instruction encodings, for driving the
92 1.1 rkujawa * processor through the STATEINDEX/STATEDATA debug port.
93 1.1 rkujawa */
94 1.1 rkujawa #define VRISC_FLAG 37 /* flags register */
95 1.1 rkujawa #define VRISC_SP 252 /* stack pointer / scratch */
96 1.1 rkujawa #define VRISC_RA 254 /* link / scratch */
97 1.1 rkujawa #define VRISC_FP 255 /* frame pointer / scratch */
98 1.1 rkujawa
99 1.1 rkujawa #define VRISC_NOP 0x00000000 /* addi zero, zero, 0 */
100 1.1 rkujawa
101 1.1 rkujawa #define VRISC_ADDI_OP 0x00
102 1.1 rkujawa #define VRISC_ADD_OP 0x10
103 1.1 rkujawa #define VRISC_ANDN_OP 0x12
104 1.1 rkujawa #define VRISC_OR_OP 0x15
105 1.1 rkujawa #define VRISC_ADDIFI_OP 0x40
106 1.1 rkujawa #define VRISC_ADDSL8_OP 0x4b
107 1.1 rkujawa #define VRISC_SPRI_OP 0x4f
108 1.1 rkujawa #define VRISC_JMP_OP 0x6c
109 1.1 rkujawa #define VRISC_LB_OP 0x70
110 1.1 rkujawa #define VRISC_LH_OP 0x71
111 1.1 rkujawa #define VRISC_LW_OP 0x72
112 1.1 rkujawa #define VRISC_LI_OP 0x76
113 1.1 rkujawa #define VRISC_LUI_OP 0x77
114 1.1 rkujawa #define VRISC_SB_OP 0x78
115 1.1 rkujawa #define VRISC_SH_OP 0x79
116 1.1 rkujawa #define VRISC_SW_OP 0x7a
117 1.1 rkujawa
118 1.1 rkujawa #define VRISC_INT(op, d, s2, s1) \
119 1.1 rkujawa (((uint32_t)(op) << 24) | ((uint32_t)(d) << 16) | \
120 1.1 rkujawa ((uint32_t)(s2) << 8) | ((uint32_t)(s1) & 0xff))
121 1.1 rkujawa #define VRISC_LD(op, d, off8, s1) \
122 1.1 rkujawa (((uint32_t)(op) << 24) | ((uint32_t)(d) << 16) | \
123 1.1 rkujawa (((uint32_t)(off8) & 0xff) << 8) | ((uint32_t)(s1)))
124 1.1 rkujawa #define VRISC_ST(op, off8, s2, s1) \
125 1.1 rkujawa (((uint32_t)(op) << 24) | (((uint32_t)(off8) & 0xff) << 16) | \
126 1.1 rkujawa ((uint32_t)(s2) << 8) | ((uint32_t)(s1)))
127 1.1 rkujawa #define VRISC_LI(op, d, imm16) \
128 1.1 rkujawa (((uint32_t)(op) << 24) | ((uint32_t)(d) << 16) | \
129 1.1 rkujawa ((uint32_t)(imm16) & 0xffff))
130 1.1 rkujawa #define VRISC_JMP(addr24) \
131 1.1 rkujawa (((uint32_t)VRISC_JMP_OP << 24) | ((uint32_t)(addr24)))
132 1.1 rkujawa
133 1.1 rkujawa /* Instruction cache */
134 1.1 rkujawa #define VRISC_ICACHESIZE 2048
135 1.1 rkujawa #define VRISC_ICACHELINESIZE 32
136 1.1 rkujawa #define VRISC_ICACHE_ONOFF_MASK (((uint32_t)1 << 17) | (1 << 3))
137 1.1 rkujawa
138 1.1 rkujawa /*
139 1.1 rkujawa * Context-switch monitor microcode ("csucode")
140 1.1 rkujawa */
141 1.1 rkujawa static const uint32_t veritefb_csucode[] = {
142 1.1 rkujawa 0x10802100, 0x5d808000, 0x4c808002, 0x6b820000,
143 1.1 rkujawa 0x00818002, 0x45818103, 0x10828281, 0x6f000082,
144 1.1 rkujawa 0x00000000, 0x62000500, 0x00000000, 0x62000300,
145 1.1 rkujawa 0x00000000, 0x62000800, 0x00000000, 0x10812100,
146 1.1 rkujawa 0x10822100, 0x10c02100, 0x6ffe00c0, 0x00000000,
147 1.1 rkujawa 0x62ffeb00, 0x00000000, 0x04812502, 0x61fffe81,
148 1.1 rkujawa 0x00000000, 0x10218000, 0x00000000, 0x00000000,
149 1.1 rkujawa 0x62ffe300, 0x00000000,
150 1.1 rkujawa };
151 1.1 rkujawa
152 1.1 rkujawa #endif /* VERITEFB_UCODE_H */
153