#ifndef NVE4_COMPUTE_H
#define NVE4_COMPUTE_H
#include "nvc0/nve4_compute.xml.h"
struct nve4_cp_launch_desc
{
u32 unk0[8];
u32 entry;
u32 unk9[2];
u32 unk11_0 : 30;
u32 linked_tsc : 1;
u32 unk11_31 : 1;
u32 griddim_x : 31;
u32 unk12 : 1;
u16 griddim_y;
u16 griddim_z;
u32 unk14[3];
u16 shared_size; /* must be aligned to 0x100 */
u16 unk17;
u16 unk18;
u16 blockdim_x;
u16 blockdim_y;
u16 blockdim_z;
u32 cb_mask : 8;
u32 unk20_8 : 21;
u32 cache_split : 2;
u32 unk20_31 : 1;
u32 unk21[8];
struct {
u32 address_l;
u32 address_h : 8;
u32 reserved : 7;
u32 size : 17;
} cb[8];
u32 local_size_p : 20;
u32 unk45_20 : 7;
u32 bar_alloc : 5;
u32 local_size_n : 20;
u32 unk46_20 : 4;
u32 gpr_alloc : 8;
u32 cstack_size : 20;
u32 unk47_20 : 12;
u32 unk48[16];
};
struct gp100_cp_launch_desc
{
u32 unk0[8];
u32 entry;
u32 unk9[2];
u32 unk11_0 : 30;
u32 linked_tsc : 1;
u32 unk11_31 : 1;
u32 griddim_x : 31;
u32 unk12 : 1;
u16 griddim_y;
u16 unk13;
u16 griddim_z;
u16 unk14;
u32 unk15[2];
u32 shared_size : 18;
u32 unk17 : 14;
u16 unk18;
u16 blockdim_x;
u16 blockdim_y;
u16 blockdim_z;
u32 cb_mask : 8;
u32 unk20 : 24;
u32 unk21[8];
u32 local_size_p : 24;
u32 unk29 : 3;
u32 bar_alloc : 5;
u32 local_size_n : 24;
u32 gpr_alloc : 8;
u32 cstack_size : 24;
u32 unk31 : 8;
struct {
u32 address_l;
u32 address_h : 17;
u32 reserved : 2;
u32 size_sh4 : 13;
} cb[8];
u32 unk48[16];
};
static inline void
nve4_cp_launch_desc_init_default(struct nve4_cp_launch_desc *desc)
{
memset(desc, 0, sizeof(*desc));
desc->unk0[7] = 0xbc000000;
desc->unk11_0 = 0x04014000;
desc->unk47_20 = 0x300;
}
static inline void
nve4_cp_launch_desc_set_cb(struct nve4_cp_launch_desc *desc,
unsigned index,
struct nouveau_bo *bo,
uint32_t base, uint32_t size)
{
uint64_t address = bo->offset + base;
assert(index < 8);
assert(!(base & 0xff));
desc->cb[index].address_l = address;
desc->cb[index].address_h = address >> 32;
desc->cb[index].size = size;
desc->cb_mask |= 1 << index;
}
static inline void
gp100_cp_launch_desc_init_default(struct gp100_cp_launch_desc *desc)
{
memset(desc, 0, sizeof(*desc));
desc->unk0[4] = 0x40;
desc->unk11_0 = 0x04014000;
}
static inline void
gp100_cp_launch_desc_set_cb(struct gp100_cp_launch_desc *desc,
unsigned index,
struct nouveau_bo *bo,
uint32_t base, uint32_t size)
{
uint64_t address = bo->offset + base;
assert(index < 8);
assert(!(base & 0xff));
desc->cb[index].address_l = address;
desc->cb[index].address_h = address >> 32;
desc->cb[index].size_sh4 = DIV_ROUND_UP(size, 16);
desc->cb_mask |= 1 << index;
}
struct nve4_mp_trap_info {
u32 lock;
u32 pc;
u32 trapstat;
u32 warperr;
u32 tid[3];
u32 ctaid[3];
u32 pad028[2];
u32 r[64];
u32 flags;
u32 pad134[3];
u32 s[0x3000];
};
#endif /* NVE4_COMPUTE_H */