root/drivers/gpu/drm/xe/instructions/xe_alu_commands.h
/* SPDX-License-Identifier: MIT */
/*
 * Copyright © 2025 Intel Corporation
 */

#ifndef _XE_ALU_COMMANDS_H_
#define _XE_ALU_COMMANDS_H_

#include "instructions/xe_instr_defs.h"

/* Instruction Opcodes */
#define CS_ALU_OPCODE_NOOP                      0x000
#define CS_ALU_OPCODE_FENCE_RD                  0x001
#define CS_ALU_OPCODE_FENCE_WR                  0x002
#define CS_ALU_OPCODE_LOAD                      0x080
#define CS_ALU_OPCODE_LOADINV                   0x480
#define CS_ALU_OPCODE_LOAD0                     0x081
#define CS_ALU_OPCODE_LOAD1                     0x481
#define CS_ALU_OPCODE_LOADIND                   0x082
#define CS_ALU_OPCODE_ADD                       0x100
#define CS_ALU_OPCODE_SUB                       0x101
#define CS_ALU_OPCODE_AND                       0x102
#define CS_ALU_OPCODE_OR                        0x103
#define CS_ALU_OPCODE_XOR                       0x104
#define CS_ALU_OPCODE_SHL                       0x105
#define CS_ALU_OPCODE_SHR                       0x106
#define CS_ALU_OPCODE_SAR                       0x107
#define CS_ALU_OPCODE_STORE                     0x180
#define CS_ALU_OPCODE_STOREINV                  0x580
#define CS_ALU_OPCODE_STOREIND                  0x181

/* Instruction Operands */
#define CS_ALU_OPERAND_REG(n)                   REG_FIELD_PREP(GENMASK(3, 0), (n))
#define CS_ALU_OPERAND_REG0                     0x0
#define CS_ALU_OPERAND_REG1                     0x1
#define CS_ALU_OPERAND_REG2                     0x2
#define CS_ALU_OPERAND_REG3                     0x3
#define CS_ALU_OPERAND_REG4                     0x4
#define CS_ALU_OPERAND_REG5                     0x5
#define CS_ALU_OPERAND_REG6                     0x6
#define CS_ALU_OPERAND_REG7                     0x7
#define CS_ALU_OPERAND_REG8                     0x8
#define CS_ALU_OPERAND_REG9                     0x9
#define CS_ALU_OPERAND_REG10                    0xa
#define CS_ALU_OPERAND_REG11                    0xb
#define CS_ALU_OPERAND_REG12                    0xc
#define CS_ALU_OPERAND_REG13                    0xd
#define CS_ALU_OPERAND_REG14                    0xe
#define CS_ALU_OPERAND_REG15                    0xf
#define CS_ALU_OPERAND_SRCA                     0x20
#define CS_ALU_OPERAND_SRCB                     0x21
#define CS_ALU_OPERAND_ACCU                     0x31
#define CS_ALU_OPERAND_ZF                       0x32
#define CS_ALU_OPERAND_CF                       0x33
#define CS_ALU_OPERAND_NA                       0 /* N/A operand */

/* Command Streamer ALU Instructions */
#define CS_ALU_INSTR(opcode, op1, op2)          (REG_FIELD_PREP(GENMASK(31, 20), (opcode)) | \
                                                 REG_FIELD_PREP(GENMASK(19, 10), (op1)) | \
                                                 REG_FIELD_PREP(GENMASK(9, 0), (op2)))

#define __CS_ALU_INSTR(opcode, op1, op2)        CS_ALU_INSTR(CS_ALU_OPCODE_##opcode, \
                                                             CS_ALU_OPERAND_##op1, \
                                                             CS_ALU_OPERAND_##op2)

#define CS_ALU_INSTR_NOOP                       __CS_ALU_INSTR(NOOP, NA, NA)
#define CS_ALU_INSTR_LOAD(op1, op2)             __CS_ALU_INSTR(LOAD, op1, op2)
#define CS_ALU_INSTR_LOADINV(op1, op2)          __CS_ALU_INSTR(LOADINV, op1, op2)
#define CS_ALU_INSTR_LOAD0(op1)                 __CS_ALU_INSTR(LOAD0, op1, NA)
#define CS_ALU_INSTR_LOAD1(op1)                 __CS_ALU_INSTR(LOAD1, op1, NA)
#define CS_ALU_INSTR_ADD                        __CS_ALU_INSTR(ADD, NA, NA)
#define CS_ALU_INSTR_SUB                        __CS_ALU_INSTR(SUB, NA, NA)
#define CS_ALU_INSTR_AND                        __CS_ALU_INSTR(AND, NA, NA)
#define CS_ALU_INSTR_OR                         __CS_ALU_INSTR(OR, NA, NA)
#define CS_ALU_INSTR_XOR                        __CS_ALU_INSTR(XOR, NA, NA)
#define CS_ALU_INSTR_STORE(op1, op2)            __CS_ALU_INSTR(STORE, op1, op2)
#define CS_ALU_INSTR_STOREINV(op1, op2)         __CS_ALU_INSTR(STOREINV, op1, op2)

#endif