1 /* $NetBSD: fbmem.h,v 1.5 2021/12/18 23:45:39 riastradh Exp $ */
2
3 /*
4 * Copyright (C) 2010 Francisco Jerez.
5 * All Rights Reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining
8 * a copy of this software and associated documentation files (the
9 * "Software"), to deal in the Software without restriction, including
10 * without limitation the rights to use, copy, modify, merge, publish,
11 * distribute, sublicense, and/or sell copies of the Software, and to
12 * permit persons to whom the Software is furnished to do so, subject to
13 * the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the
16 * next paragraph) shall be included in all copies or substantial
17 * portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
23 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
25 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 *
27 */
28 #include <subdev/fb/regsnv04.h>
29
30 #define NV04_PFB_DEBUG_0 0x00100080
31 # define NV04_PFB_DEBUG_0_PAGE_MODE 0x00000001
32 # define NV04_PFB_DEBUG_0_REFRESH_OFF 0x00000010
33 # define NV04_PFB_DEBUG_0_REFRESH_COUNTX64 0x00003f00
34 # define NV04_PFB_DEBUG_0_REFRESH_SLOW_CLK 0x00004000
35 # define NV04_PFB_DEBUG_0_SAFE_MODE 0x00008000
36 # define NV04_PFB_DEBUG_0_ALOM_ENABLE 0x00010000
37 # define NV04_PFB_DEBUG_0_CASOE 0x00100000
38 # define NV04_PFB_DEBUG_0_CKE_INVERT 0x10000000
39 # define NV04_PFB_DEBUG_0_REFINC 0x20000000
40 # define NV04_PFB_DEBUG_0_SAVE_POWER_OFF 0x40000000
41 #define NV04_PFB_CFG0 0x00100200
42 # define NV04_PFB_CFG0_SCRAMBLE 0x20000000
43 #define NV04_PFB_CFG1 0x00100204
44 #define NV04_PFB_SCRAMBLE(i) (0x00100400 + 4 * (i))
45
46 #define NV10_PFB_REFCTRL 0x00100210
47 # define NV10_PFB_REFCTRL_VALID_1 (1 << 31)
48
49 static inline struct io_mapping *
fbmem_init(struct nvkm_device * dev)50 fbmem_init(struct nvkm_device *dev)
51 {
52 #ifdef __NetBSD__
53 return bus_space_io_mapping_create_wc(dev->func->resource_tag(dev, 1),
54 dev->func->resource_addr(dev, 1),
55 dev->func->resource_size(dev, 1));
56 #else
57 return io_mapping_create_wc(dev->func->resource_addr(dev, 1),
58 dev->func->resource_size(dev, 1));
59 #endif
60 }
61
62 static inline void
fbmem_fini(struct io_mapping * fb)63 fbmem_fini(struct io_mapping *fb)
64 {
65 io_mapping_free(fb);
66 }
67
68 #ifdef __NetBSD__
69 /*
70 * XXX Consider using bus_space_reserve/map instead. Don't want to use
71 * bus_space_map because presumably that will eat too much KVA.
72 */
73
74 # define __iomem volatile
75 # define ioread32 fake_ioread32
76 # define iowrite32 fake_iowrite32
77
78 static inline uint32_t
ioread32(const void __iomem * p)79 ioread32(const void __iomem *p)
80 {
81 const uint32_t v = *(const uint32_t __iomem *)p;
82
83 membar_consumer();
84
85 return v; /* XXX nouveau byte order */
86 }
87
88 static inline void
iowrite32(uint32_t v,void __iomem * p)89 iowrite32(uint32_t v, void __iomem *p)
90 {
91
92 membar_producer();
93 *(uint32_t __iomem *)p = v; /* XXX nouveau byte order */
94 }
95 #endif
96
97 static inline u32
fbmem_peek(struct io_mapping * fb,u32 off)98 fbmem_peek(struct io_mapping *fb, u32 off)
99 {
100 u8 __iomem *p = io_mapping_map_atomic_wc(fb, off & PAGE_MASK);
101 u32 val = ioread32(p + (off & ~PAGE_MASK));
102 #ifdef __NetBSD__
103 io_mapping_unmap_atomic(fb, __UNVOLATILE(p));
104 #else
105 io_mapping_unmap_atomic(p);
106 #endif
107 return val;
108 }
109
110 static inline void
fbmem_poke(struct io_mapping * fb,u32 off,u32 val)111 fbmem_poke(struct io_mapping *fb, u32 off, u32 val)
112 {
113 u8 __iomem *p = io_mapping_map_atomic_wc(fb, off & PAGE_MASK);
114 iowrite32(val, p + (off & ~PAGE_MASK));
115 wmb();
116 #ifdef __NetBSD__
117 io_mapping_unmap_atomic(fb, __UNVOLATILE(p));
118 #else
119 io_mapping_unmap_atomic(p);
120 #endif
121 }
122
123 static inline bool
fbmem_readback(struct io_mapping * fb,u32 off,u32 val)124 fbmem_readback(struct io_mapping *fb, u32 off, u32 val)
125 {
126 fbmem_poke(fb, off, val);
127 return val == fbmem_peek(fb, off);
128 }
129
130 #ifdef __NetBSD__
131 # undef __iomem
132 # undef ioread32
133 # undef iowrite32
134 #endif
135