xref: /linux/drivers/gpu/drm/tyr/regs.rs (revision 58809f614e0e3f4e12b489bddf680bfeb31c0a20)
1*cf4fd52eSDaniel Almeida // SPDX-License-Identifier: GPL-2.0 or MIT
2*cf4fd52eSDaniel Almeida 
3*cf4fd52eSDaniel Almeida // We don't expect that all the registers and fields will be used, even in the
4*cf4fd52eSDaniel Almeida // future.
5*cf4fd52eSDaniel Almeida //
6*cf4fd52eSDaniel Almeida // Nevertheless, it is useful to have most of them defined, like the C driver
7*cf4fd52eSDaniel Almeida // does.
8*cf4fd52eSDaniel Almeida #![allow(dead_code)]
9*cf4fd52eSDaniel Almeida 
10*cf4fd52eSDaniel Almeida use kernel::bits::bit_u32;
11*cf4fd52eSDaniel Almeida use kernel::device::Bound;
12*cf4fd52eSDaniel Almeida use kernel::device::Device;
13*cf4fd52eSDaniel Almeida use kernel::devres::Devres;
14*cf4fd52eSDaniel Almeida use kernel::prelude::*;
15*cf4fd52eSDaniel Almeida 
16*cf4fd52eSDaniel Almeida use crate::driver::IoMem;
17*cf4fd52eSDaniel Almeida 
18*cf4fd52eSDaniel Almeida /// Represents a register in the Register Set
19*cf4fd52eSDaniel Almeida ///
20*cf4fd52eSDaniel Almeida /// TODO: Replace this with the Nova `register!()` macro when it is available.
21*cf4fd52eSDaniel Almeida /// In particular, this will automatically give us 64bit register reads and
22*cf4fd52eSDaniel Almeida /// writes.
23*cf4fd52eSDaniel Almeida pub(crate) struct Register<const OFFSET: usize>;
24*cf4fd52eSDaniel Almeida 
25*cf4fd52eSDaniel Almeida impl<const OFFSET: usize> Register<OFFSET> {
26*cf4fd52eSDaniel Almeida     #[inline]
27*cf4fd52eSDaniel Almeida     pub(crate) fn read(&self, dev: &Device<Bound>, iomem: &Devres<IoMem>) -> Result<u32> {
28*cf4fd52eSDaniel Almeida         let value = (*iomem).access(dev)?.read32(OFFSET);
29*cf4fd52eSDaniel Almeida         Ok(value)
30*cf4fd52eSDaniel Almeida     }
31*cf4fd52eSDaniel Almeida 
32*cf4fd52eSDaniel Almeida     #[inline]
33*cf4fd52eSDaniel Almeida     pub(crate) fn write(&self, dev: &Device<Bound>, iomem: &Devres<IoMem>, value: u32) -> Result {
34*cf4fd52eSDaniel Almeida         (*iomem).access(dev)?.write32(value, OFFSET);
35*cf4fd52eSDaniel Almeida         Ok(())
36*cf4fd52eSDaniel Almeida     }
37*cf4fd52eSDaniel Almeida }
38*cf4fd52eSDaniel Almeida 
39*cf4fd52eSDaniel Almeida pub(crate) const GPU_ID: Register<0x0> = Register;
40*cf4fd52eSDaniel Almeida pub(crate) const GPU_L2_FEATURES: Register<0x4> = Register;
41*cf4fd52eSDaniel Almeida pub(crate) const GPU_CORE_FEATURES: Register<0x8> = Register;
42*cf4fd52eSDaniel Almeida pub(crate) const GPU_CSF_ID: Register<0x1c> = Register;
43*cf4fd52eSDaniel Almeida pub(crate) const GPU_REVID: Register<0x280> = Register;
44*cf4fd52eSDaniel Almeida pub(crate) const GPU_TILER_FEATURES: Register<0xc> = Register;
45*cf4fd52eSDaniel Almeida pub(crate) const GPU_MEM_FEATURES: Register<0x10> = Register;
46*cf4fd52eSDaniel Almeida pub(crate) const GPU_MMU_FEATURES: Register<0x14> = Register;
47*cf4fd52eSDaniel Almeida pub(crate) const GPU_AS_PRESENT: Register<0x18> = Register;
48*cf4fd52eSDaniel Almeida pub(crate) const GPU_IRQ_RAWSTAT: Register<0x20> = Register;
49*cf4fd52eSDaniel Almeida 
50*cf4fd52eSDaniel Almeida pub(crate) const GPU_IRQ_RAWSTAT_FAULT: u32 = bit_u32(0);
51*cf4fd52eSDaniel Almeida pub(crate) const GPU_IRQ_RAWSTAT_PROTECTED_FAULT: u32 = bit_u32(1);
52*cf4fd52eSDaniel Almeida pub(crate) const GPU_IRQ_RAWSTAT_RESET_COMPLETED: u32 = bit_u32(8);
53*cf4fd52eSDaniel Almeida pub(crate) const GPU_IRQ_RAWSTAT_POWER_CHANGED_SINGLE: u32 = bit_u32(9);
54*cf4fd52eSDaniel Almeida pub(crate) const GPU_IRQ_RAWSTAT_POWER_CHANGED_ALL: u32 = bit_u32(10);
55*cf4fd52eSDaniel Almeida pub(crate) const GPU_IRQ_RAWSTAT_CLEAN_CACHES_COMPLETED: u32 = bit_u32(17);
56*cf4fd52eSDaniel Almeida pub(crate) const GPU_IRQ_RAWSTAT_DOORBELL_STATUS: u32 = bit_u32(18);
57*cf4fd52eSDaniel Almeida pub(crate) const GPU_IRQ_RAWSTAT_MCU_STATUS: u32 = bit_u32(19);
58*cf4fd52eSDaniel Almeida 
59*cf4fd52eSDaniel Almeida pub(crate) const GPU_IRQ_CLEAR: Register<0x24> = Register;
60*cf4fd52eSDaniel Almeida pub(crate) const GPU_IRQ_MASK: Register<0x28> = Register;
61*cf4fd52eSDaniel Almeida pub(crate) const GPU_IRQ_STAT: Register<0x2c> = Register;
62*cf4fd52eSDaniel Almeida pub(crate) const GPU_CMD: Register<0x30> = Register;
63*cf4fd52eSDaniel Almeida pub(crate) const GPU_CMD_SOFT_RESET: u32 = 1 | (1 << 8);
64*cf4fd52eSDaniel Almeida pub(crate) const GPU_CMD_HARD_RESET: u32 = 1 | (2 << 8);
65*cf4fd52eSDaniel Almeida pub(crate) const GPU_THREAD_FEATURES: Register<0xac> = Register;
66*cf4fd52eSDaniel Almeida pub(crate) const GPU_THREAD_MAX_THREADS: Register<0xa0> = Register;
67*cf4fd52eSDaniel Almeida pub(crate) const GPU_THREAD_MAX_WORKGROUP_SIZE: Register<0xa4> = Register;
68*cf4fd52eSDaniel Almeida pub(crate) const GPU_THREAD_MAX_BARRIER_SIZE: Register<0xa8> = Register;
69*cf4fd52eSDaniel Almeida pub(crate) const GPU_TEXTURE_FEATURES0: Register<0xb0> = Register;
70*cf4fd52eSDaniel Almeida pub(crate) const GPU_SHADER_PRESENT_LO: Register<0x100> = Register;
71*cf4fd52eSDaniel Almeida pub(crate) const GPU_SHADER_PRESENT_HI: Register<0x104> = Register;
72*cf4fd52eSDaniel Almeida pub(crate) const GPU_TILER_PRESENT_LO: Register<0x110> = Register;
73*cf4fd52eSDaniel Almeida pub(crate) const GPU_TILER_PRESENT_HI: Register<0x114> = Register;
74*cf4fd52eSDaniel Almeida pub(crate) const GPU_L2_PRESENT_LO: Register<0x120> = Register;
75*cf4fd52eSDaniel Almeida pub(crate) const GPU_L2_PRESENT_HI: Register<0x124> = Register;
76*cf4fd52eSDaniel Almeida pub(crate) const L2_READY_LO: Register<0x160> = Register;
77*cf4fd52eSDaniel Almeida pub(crate) const L2_READY_HI: Register<0x164> = Register;
78*cf4fd52eSDaniel Almeida pub(crate) const L2_PWRON_LO: Register<0x1a0> = Register;
79*cf4fd52eSDaniel Almeida pub(crate) const L2_PWRON_HI: Register<0x1a4> = Register;
80*cf4fd52eSDaniel Almeida pub(crate) const L2_PWRTRANS_LO: Register<0x220> = Register;
81*cf4fd52eSDaniel Almeida pub(crate) const L2_PWRTRANS_HI: Register<0x204> = Register;
82*cf4fd52eSDaniel Almeida pub(crate) const L2_PWRACTIVE_LO: Register<0x260> = Register;
83*cf4fd52eSDaniel Almeida pub(crate) const L2_PWRACTIVE_HI: Register<0x264> = Register;
84*cf4fd52eSDaniel Almeida 
85*cf4fd52eSDaniel Almeida pub(crate) const MCU_CONTROL: Register<0x700> = Register;
86*cf4fd52eSDaniel Almeida pub(crate) const MCU_CONTROL_ENABLE: u32 = 1;
87*cf4fd52eSDaniel Almeida pub(crate) const MCU_CONTROL_AUTO: u32 = 2;
88*cf4fd52eSDaniel Almeida pub(crate) const MCU_CONTROL_DISABLE: u32 = 0;
89*cf4fd52eSDaniel Almeida 
90*cf4fd52eSDaniel Almeida pub(crate) const MCU_STATUS: Register<0x704> = Register;
91*cf4fd52eSDaniel Almeida pub(crate) const MCU_STATUS_DISABLED: u32 = 0;
92*cf4fd52eSDaniel Almeida pub(crate) const MCU_STATUS_ENABLED: u32 = 1;
93*cf4fd52eSDaniel Almeida pub(crate) const MCU_STATUS_HALT: u32 = 2;
94*cf4fd52eSDaniel Almeida pub(crate) const MCU_STATUS_FATAL: u32 = 3;
95*cf4fd52eSDaniel Almeida 
96*cf4fd52eSDaniel Almeida pub(crate) const GPU_COHERENCY_FEATURES: Register<0x300> = Register;
97*cf4fd52eSDaniel Almeida 
98*cf4fd52eSDaniel Almeida pub(crate) const JOB_IRQ_RAWSTAT: Register<0x1000> = Register;
99*cf4fd52eSDaniel Almeida pub(crate) const JOB_IRQ_CLEAR: Register<0x1004> = Register;
100*cf4fd52eSDaniel Almeida pub(crate) const JOB_IRQ_MASK: Register<0x1008> = Register;
101*cf4fd52eSDaniel Almeida pub(crate) const JOB_IRQ_STAT: Register<0x100c> = Register;
102*cf4fd52eSDaniel Almeida 
103*cf4fd52eSDaniel Almeida pub(crate) const JOB_IRQ_GLOBAL_IF: u32 = bit_u32(31);
104*cf4fd52eSDaniel Almeida 
105*cf4fd52eSDaniel Almeida pub(crate) const MMU_IRQ_RAWSTAT: Register<0x2000> = Register;
106*cf4fd52eSDaniel Almeida pub(crate) const MMU_IRQ_CLEAR: Register<0x2004> = Register;
107*cf4fd52eSDaniel Almeida pub(crate) const MMU_IRQ_MASK: Register<0x2008> = Register;
108*cf4fd52eSDaniel Almeida pub(crate) const MMU_IRQ_STAT: Register<0x200c> = Register;
109