xref: /aosp_15_r20/external/igt-gpu-tools/lib/intel_mmio.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2008 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker  *
4*d83cc019SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker  *
11*d83cc019SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker  * Software.
14*d83cc019SAndroid Build Coastguard Worker  *
15*d83cc019SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*d83cc019SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21*d83cc019SAndroid Build Coastguard Worker  * DEALINGS IN THE SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker  *
23*d83cc019SAndroid Build Coastguard Worker  * Authors:
24*d83cc019SAndroid Build Coastguard Worker  *    Eric Anholt <[email protected]>
25*d83cc019SAndroid Build Coastguard Worker  *    Ben Widawsky <[email protected]>
26*d83cc019SAndroid Build Coastguard Worker  *
27*d83cc019SAndroid Build Coastguard Worker  */
28*d83cc019SAndroid Build Coastguard Worker 
29*d83cc019SAndroid Build Coastguard Worker #include <unistd.h>
30*d83cc019SAndroid Build Coastguard Worker #include <fcntl.h>
31*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
32*d83cc019SAndroid Build Coastguard Worker #include <stdarg.h>
33*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
34*d83cc019SAndroid Build Coastguard Worker #include <stdint.h>
35*d83cc019SAndroid Build Coastguard Worker #include <stdbool.h>
36*d83cc019SAndroid Build Coastguard Worker #include <string.h>
37*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
38*d83cc019SAndroid Build Coastguard Worker #include <err.h>
39*d83cc019SAndroid Build Coastguard Worker #include <assert.h>
40*d83cc019SAndroid Build Coastguard Worker #include <sys/ioctl.h>
41*d83cc019SAndroid Build Coastguard Worker #include <sys/stat.h>
42*d83cc019SAndroid Build Coastguard Worker #include <sys/mman.h>
43*d83cc019SAndroid Build Coastguard Worker 
44*d83cc019SAndroid Build Coastguard Worker #include "intel_io.h"
45*d83cc019SAndroid Build Coastguard Worker #include "igt_core.h"
46*d83cc019SAndroid Build Coastguard Worker #include "igt_gt.h"
47*d83cc019SAndroid Build Coastguard Worker #include "intel_chipset.h"
48*d83cc019SAndroid Build Coastguard Worker 
49*d83cc019SAndroid Build Coastguard Worker /**
50*d83cc019SAndroid Build Coastguard Worker  * SECTION:intel_io
51*d83cc019SAndroid Build Coastguard Worker  * @short_description: Register access and sideband I/O library
52*d83cc019SAndroid Build Coastguard Worker  * @title: I/O
53*d83cc019SAndroid Build Coastguard Worker  * @include: igt.h
54*d83cc019SAndroid Build Coastguard Worker  * @section_id: igt-gpu-tools-IO
55*d83cc019SAndroid Build Coastguard Worker  *
56*d83cc019SAndroid Build Coastguard Worker  * This library provides register I/O helpers in both a basic version and a more
57*d83cc019SAndroid Build Coastguard Worker  * fancy version which also handles forcewake and can optionally check registers
58*d83cc019SAndroid Build Coastguard Worker  * against a white-list. All register function are compatible. Hence the same
59*d83cc019SAndroid Build Coastguard Worker  * code can be used to decode registers with either of them, or also from a dump
60*d83cc019SAndroid Build Coastguard Worker  * file using intel_mmio_use_dump_file().
61*d83cc019SAndroid Build Coastguard Worker  *
62*d83cc019SAndroid Build Coastguard Worker  * Furthermore this library also provides helper functions for accessing the
63*d83cc019SAndroid Build Coastguard Worker  * various sideband interfaces found on Valleyview/Baytrail based platforms.
64*d83cc019SAndroid Build Coastguard Worker  */
65*d83cc019SAndroid Build Coastguard Worker 
66*d83cc019SAndroid Build Coastguard Worker #define FAKEKEY 0x2468ace0
67*d83cc019SAndroid Build Coastguard Worker 
68*d83cc019SAndroid Build Coastguard Worker /**
69*d83cc019SAndroid Build Coastguard Worker  * igt_global_mmio:
70*d83cc019SAndroid Build Coastguard Worker  *
71*d83cc019SAndroid Build Coastguard Worker  * Pointer to the register range, initialized using intel_register_access_init()
72*d83cc019SAndroid Build Coastguard Worker  * or intel_mmio_use_dump_file(). It is not recommended to use this directly.
73*d83cc019SAndroid Build Coastguard Worker  */
74*d83cc019SAndroid Build Coastguard Worker void *igt_global_mmio;
75*d83cc019SAndroid Build Coastguard Worker 
76*d83cc019SAndroid Build Coastguard Worker static struct _mmio_data {
77*d83cc019SAndroid Build Coastguard Worker 	int inited;
78*d83cc019SAndroid Build Coastguard Worker 	bool safe;
79*d83cc019SAndroid Build Coastguard Worker 	uint32_t i915_devid;
80*d83cc019SAndroid Build Coastguard Worker 	struct intel_register_map map;
81*d83cc019SAndroid Build Coastguard Worker 	int key;
82*d83cc019SAndroid Build Coastguard Worker } mmio_data;
83*d83cc019SAndroid Build Coastguard Worker 
84*d83cc019SAndroid Build Coastguard Worker /**
85*d83cc019SAndroid Build Coastguard Worker  * intel_mmio_use_dump_file:
86*d83cc019SAndroid Build Coastguard Worker  * @file: name of the register dump file to open
87*d83cc019SAndroid Build Coastguard Worker  *
88*d83cc019SAndroid Build Coastguard Worker  * Sets up #igt_global_mmio to point at the data contained in @file. This allows
89*d83cc019SAndroid Build Coastguard Worker  * the same code to get reused for dumping and decoding from running hardware as
90*d83cc019SAndroid Build Coastguard Worker  * from register dumps.
91*d83cc019SAndroid Build Coastguard Worker  */
92*d83cc019SAndroid Build Coastguard Worker void
intel_mmio_use_dump_file(char * file)93*d83cc019SAndroid Build Coastguard Worker intel_mmio_use_dump_file(char *file)
94*d83cc019SAndroid Build Coastguard Worker {
95*d83cc019SAndroid Build Coastguard Worker 	int fd;
96*d83cc019SAndroid Build Coastguard Worker 	struct stat st;
97*d83cc019SAndroid Build Coastguard Worker 
98*d83cc019SAndroid Build Coastguard Worker 	fd = open(file, O_RDWR);
99*d83cc019SAndroid Build Coastguard Worker 	igt_fail_on_f(fd == -1,
100*d83cc019SAndroid Build Coastguard Worker 		      "Couldn't open %s\n", file);
101*d83cc019SAndroid Build Coastguard Worker 
102*d83cc019SAndroid Build Coastguard Worker 	fstat(fd, &st);
103*d83cc019SAndroid Build Coastguard Worker 	igt_global_mmio = mmap(NULL, st.st_size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
104*d83cc019SAndroid Build Coastguard Worker 	igt_fail_on_f(igt_global_mmio == MAP_FAILED,
105*d83cc019SAndroid Build Coastguard Worker 		      "Couldn't mmap %s\n", file);
106*d83cc019SAndroid Build Coastguard Worker 	close(fd);
107*d83cc019SAndroid Build Coastguard Worker }
108*d83cc019SAndroid Build Coastguard Worker 
109*d83cc019SAndroid Build Coastguard Worker /**
110*d83cc019SAndroid Build Coastguard Worker  * intel_mmio_use_pci_bar:
111*d83cc019SAndroid Build Coastguard Worker  * @pci_dev: intel gracphis pci device
112*d83cc019SAndroid Build Coastguard Worker  *
113*d83cc019SAndroid Build Coastguard Worker  * Sets up #igt_global_mmio to point at the mmio bar.
114*d83cc019SAndroid Build Coastguard Worker  *
115*d83cc019SAndroid Build Coastguard Worker  * @pci_dev can be obtained from intel_get_pci_device().
116*d83cc019SAndroid Build Coastguard Worker  */
117*d83cc019SAndroid Build Coastguard Worker void
intel_mmio_use_pci_bar(struct pci_device * pci_dev)118*d83cc019SAndroid Build Coastguard Worker intel_mmio_use_pci_bar(struct pci_device *pci_dev)
119*d83cc019SAndroid Build Coastguard Worker {
120*d83cc019SAndroid Build Coastguard Worker 	uint32_t devid, gen;
121*d83cc019SAndroid Build Coastguard Worker 	int mmio_bar, mmio_size;
122*d83cc019SAndroid Build Coastguard Worker 	int error;
123*d83cc019SAndroid Build Coastguard Worker 
124*d83cc019SAndroid Build Coastguard Worker 	devid = pci_dev->device_id;
125*d83cc019SAndroid Build Coastguard Worker 	if (IS_GEN2(devid))
126*d83cc019SAndroid Build Coastguard Worker 		mmio_bar = 1;
127*d83cc019SAndroid Build Coastguard Worker 	else
128*d83cc019SAndroid Build Coastguard Worker 		mmio_bar = 0;
129*d83cc019SAndroid Build Coastguard Worker 
130*d83cc019SAndroid Build Coastguard Worker 	gen = intel_gen(devid);
131*d83cc019SAndroid Build Coastguard Worker 	if (gen < 3)
132*d83cc019SAndroid Build Coastguard Worker 		mmio_size = 512*1024;
133*d83cc019SAndroid Build Coastguard Worker 	else if (gen < 5)
134*d83cc019SAndroid Build Coastguard Worker 		mmio_size = 512*1024;
135*d83cc019SAndroid Build Coastguard Worker 	else
136*d83cc019SAndroid Build Coastguard Worker 		mmio_size = 2*1024*1024;
137*d83cc019SAndroid Build Coastguard Worker 
138*d83cc019SAndroid Build Coastguard Worker 	error = pci_device_map_range (pci_dev,
139*d83cc019SAndroid Build Coastguard Worker 				      pci_dev->regions[mmio_bar].base_addr,
140*d83cc019SAndroid Build Coastguard Worker 				      mmio_size,
141*d83cc019SAndroid Build Coastguard Worker 				      PCI_DEV_MAP_FLAG_WRITABLE,
142*d83cc019SAndroid Build Coastguard Worker 				      &igt_global_mmio);
143*d83cc019SAndroid Build Coastguard Worker 
144*d83cc019SAndroid Build Coastguard Worker 	igt_fail_on_f(error != 0,
145*d83cc019SAndroid Build Coastguard Worker 		      "Couldn't map MMIO region\n");
146*d83cc019SAndroid Build Coastguard Worker }
147*d83cc019SAndroid Build Coastguard Worker 
148*d83cc019SAndroid Build Coastguard Worker static void
release_forcewake_lock(int fd)149*d83cc019SAndroid Build Coastguard Worker release_forcewake_lock(int fd)
150*d83cc019SAndroid Build Coastguard Worker {
151*d83cc019SAndroid Build Coastguard Worker 	close(fd);
152*d83cc019SAndroid Build Coastguard Worker }
153*d83cc019SAndroid Build Coastguard Worker 
154*d83cc019SAndroid Build Coastguard Worker /**
155*d83cc019SAndroid Build Coastguard Worker  * intel_register_access_init:
156*d83cc019SAndroid Build Coastguard Worker  * @pci_dev: intel graphics pci device
157*d83cc019SAndroid Build Coastguard Worker  * @safe: use safe register access tables
158*d83cc019SAndroid Build Coastguard Worker  *
159*d83cc019SAndroid Build Coastguard Worker  * This initializes the new register access library, which supports forcewake
160*d83cc019SAndroid Build Coastguard Worker  * handling and also allows register access to be checked with an explicit
161*d83cc019SAndroid Build Coastguard Worker  * whitelist.
162*d83cc019SAndroid Build Coastguard Worker  *
163*d83cc019SAndroid Build Coastguard Worker  * It also initializes #igt_global_mmio like intel_mmio_use_pci_bar().
164*d83cc019SAndroid Build Coastguard Worker  *
165*d83cc019SAndroid Build Coastguard Worker  * @pci_dev can be obtained from intel_get_pci_device().
166*d83cc019SAndroid Build Coastguard Worker  */
167*d83cc019SAndroid Build Coastguard Worker int
intel_register_access_init(struct pci_device * pci_dev,int safe,int fd)168*d83cc019SAndroid Build Coastguard Worker intel_register_access_init(struct pci_device *pci_dev, int safe, int fd)
169*d83cc019SAndroid Build Coastguard Worker {
170*d83cc019SAndroid Build Coastguard Worker 	int ret;
171*d83cc019SAndroid Build Coastguard Worker 
172*d83cc019SAndroid Build Coastguard Worker 	/* after old API is deprecated, remove this */
173*d83cc019SAndroid Build Coastguard Worker 	if (igt_global_mmio == NULL)
174*d83cc019SAndroid Build Coastguard Worker 		intel_mmio_use_pci_bar(pci_dev);
175*d83cc019SAndroid Build Coastguard Worker 
176*d83cc019SAndroid Build Coastguard Worker 	igt_assert(igt_global_mmio != NULL);
177*d83cc019SAndroid Build Coastguard Worker 
178*d83cc019SAndroid Build Coastguard Worker 	if (mmio_data.inited)
179*d83cc019SAndroid Build Coastguard Worker 		return -1;
180*d83cc019SAndroid Build Coastguard Worker 
181*d83cc019SAndroid Build Coastguard Worker 	mmio_data.safe = (safe != 0 &&
182*d83cc019SAndroid Build Coastguard Worker 			intel_gen(pci_dev->device_id) >= 4) ? true : false;
183*d83cc019SAndroid Build Coastguard Worker 	mmio_data.i915_devid = pci_dev->device_id;
184*d83cc019SAndroid Build Coastguard Worker 	if (mmio_data.safe)
185*d83cc019SAndroid Build Coastguard Worker 		mmio_data.map = intel_get_register_map(mmio_data.i915_devid);
186*d83cc019SAndroid Build Coastguard Worker 
187*d83cc019SAndroid Build Coastguard Worker 	/* Find where the forcewake lock is. Forcewake doesn't exist
188*d83cc019SAndroid Build Coastguard Worker 	 * gen < 6, but the debugfs should do the right things for us.
189*d83cc019SAndroid Build Coastguard Worker 	 */
190*d83cc019SAndroid Build Coastguard Worker 	ret = igt_open_forcewake_handle(fd);
191*d83cc019SAndroid Build Coastguard Worker 	if (ret == -1)
192*d83cc019SAndroid Build Coastguard Worker 		mmio_data.key = FAKEKEY;
193*d83cc019SAndroid Build Coastguard Worker 	else
194*d83cc019SAndroid Build Coastguard Worker 		mmio_data.key = ret;
195*d83cc019SAndroid Build Coastguard Worker 
196*d83cc019SAndroid Build Coastguard Worker 	mmio_data.inited++;
197*d83cc019SAndroid Build Coastguard Worker 	return 0;
198*d83cc019SAndroid Build Coastguard Worker }
199*d83cc019SAndroid Build Coastguard Worker 
200*d83cc019SAndroid Build Coastguard Worker static int
intel_register_access_needs_wake(void)201*d83cc019SAndroid Build Coastguard Worker intel_register_access_needs_wake(void)
202*d83cc019SAndroid Build Coastguard Worker {
203*d83cc019SAndroid Build Coastguard Worker 	return mmio_data.key != FAKEKEY;
204*d83cc019SAndroid Build Coastguard Worker }
205*d83cc019SAndroid Build Coastguard Worker 
206*d83cc019SAndroid Build Coastguard Worker /**
207*d83cc019SAndroid Build Coastguard Worker  * intel_register_access_needs_fakewake:
208*d83cc019SAndroid Build Coastguard Worker  *
209*d83cc019SAndroid Build Coastguard Worker  * Returns:
210*d83cc019SAndroid Build Coastguard Worker  * Non-zero when forcewake initialization failed.
211*d83cc019SAndroid Build Coastguard Worker  */
intel_register_access_needs_fakewake(void)212*d83cc019SAndroid Build Coastguard Worker int intel_register_access_needs_fakewake(void)
213*d83cc019SAndroid Build Coastguard Worker {
214*d83cc019SAndroid Build Coastguard Worker 	return mmio_data.key == FAKEKEY;
215*d83cc019SAndroid Build Coastguard Worker }
216*d83cc019SAndroid Build Coastguard Worker 
217*d83cc019SAndroid Build Coastguard Worker /**
218*d83cc019SAndroid Build Coastguard Worker  * intel_register_access_fini:
219*d83cc019SAndroid Build Coastguard Worker  *
220*d83cc019SAndroid Build Coastguard Worker  * Clean up the register access helper initialized with
221*d83cc019SAndroid Build Coastguard Worker  * intel_register_access_init().
222*d83cc019SAndroid Build Coastguard Worker  */
223*d83cc019SAndroid Build Coastguard Worker void
intel_register_access_fini(void)224*d83cc019SAndroid Build Coastguard Worker intel_register_access_fini(void)
225*d83cc019SAndroid Build Coastguard Worker {
226*d83cc019SAndroid Build Coastguard Worker 	if (mmio_data.key && intel_register_access_needs_wake())
227*d83cc019SAndroid Build Coastguard Worker 		release_forcewake_lock(mmio_data.key);
228*d83cc019SAndroid Build Coastguard Worker 	mmio_data.inited--;
229*d83cc019SAndroid Build Coastguard Worker }
230*d83cc019SAndroid Build Coastguard Worker 
231*d83cc019SAndroid Build Coastguard Worker /**
232*d83cc019SAndroid Build Coastguard Worker  * intel_register_read:
233*d83cc019SAndroid Build Coastguard Worker  * @reg: register offset
234*d83cc019SAndroid Build Coastguard Worker  *
235*d83cc019SAndroid Build Coastguard Worker  * 32-bit read of the register at @offset. This function only works when the new
236*d83cc019SAndroid Build Coastguard Worker  * register access helper is initialized with intel_register_access_init().
237*d83cc019SAndroid Build Coastguard Worker  *
238*d83cc019SAndroid Build Coastguard Worker  * Compared to INREG() it can do optional checking with the register access
239*d83cc019SAndroid Build Coastguard Worker  * white lists.
240*d83cc019SAndroid Build Coastguard Worker  *
241*d83cc019SAndroid Build Coastguard Worker  * Returns:
242*d83cc019SAndroid Build Coastguard Worker  * The value read from the register.
243*d83cc019SAndroid Build Coastguard Worker  */
244*d83cc019SAndroid Build Coastguard Worker uint32_t
intel_register_read(uint32_t reg)245*d83cc019SAndroid Build Coastguard Worker intel_register_read(uint32_t reg)
246*d83cc019SAndroid Build Coastguard Worker {
247*d83cc019SAndroid Build Coastguard Worker 	struct intel_register_range *range;
248*d83cc019SAndroid Build Coastguard Worker 	uint32_t ret;
249*d83cc019SAndroid Build Coastguard Worker 
250*d83cc019SAndroid Build Coastguard Worker 	igt_assert(mmio_data.inited);
251*d83cc019SAndroid Build Coastguard Worker 
252*d83cc019SAndroid Build Coastguard Worker 	if (intel_gen(mmio_data.i915_devid) >= 6)
253*d83cc019SAndroid Build Coastguard Worker 		igt_assert(mmio_data.key != -1);
254*d83cc019SAndroid Build Coastguard Worker 
255*d83cc019SAndroid Build Coastguard Worker 	if (!mmio_data.safe)
256*d83cc019SAndroid Build Coastguard Worker 		goto read_out;
257*d83cc019SAndroid Build Coastguard Worker 
258*d83cc019SAndroid Build Coastguard Worker 	range = intel_get_register_range(mmio_data.map,
259*d83cc019SAndroid Build Coastguard Worker 					 reg,
260*d83cc019SAndroid Build Coastguard Worker 					 INTEL_RANGE_READ);
261*d83cc019SAndroid Build Coastguard Worker 
262*d83cc019SAndroid Build Coastguard Worker 	if(!range) {
263*d83cc019SAndroid Build Coastguard Worker 		igt_warn("Register read blocked for safety ""(*0x%08x)\n", reg);
264*d83cc019SAndroid Build Coastguard Worker 		ret = 0xffffffff;
265*d83cc019SAndroid Build Coastguard Worker 		goto out;
266*d83cc019SAndroid Build Coastguard Worker 	}
267*d83cc019SAndroid Build Coastguard Worker 
268*d83cc019SAndroid Build Coastguard Worker read_out:
269*d83cc019SAndroid Build Coastguard Worker 	ret = *(volatile uint32_t *)((volatile char *)igt_global_mmio + reg);
270*d83cc019SAndroid Build Coastguard Worker out:
271*d83cc019SAndroid Build Coastguard Worker 	return ret;
272*d83cc019SAndroid Build Coastguard Worker }
273*d83cc019SAndroid Build Coastguard Worker 
274*d83cc019SAndroid Build Coastguard Worker /**
275*d83cc019SAndroid Build Coastguard Worker  * intel_register_write:
276*d83cc019SAndroid Build Coastguard Worker  * @reg: register offset
277*d83cc019SAndroid Build Coastguard Worker  * @val: value to write
278*d83cc019SAndroid Build Coastguard Worker  *
279*d83cc019SAndroid Build Coastguard Worker  * 32-bit write to the register at @offset. This function only works when the new
280*d83cc019SAndroid Build Coastguard Worker  * register access helper is initialized with intel_register_access_init().
281*d83cc019SAndroid Build Coastguard Worker  *
282*d83cc019SAndroid Build Coastguard Worker  * Compared to OUTREG() it can do optional checking with the register access
283*d83cc019SAndroid Build Coastguard Worker  * white lists.
284*d83cc019SAndroid Build Coastguard Worker  */
285*d83cc019SAndroid Build Coastguard Worker void
intel_register_write(uint32_t reg,uint32_t val)286*d83cc019SAndroid Build Coastguard Worker intel_register_write(uint32_t reg, uint32_t val)
287*d83cc019SAndroid Build Coastguard Worker {
288*d83cc019SAndroid Build Coastguard Worker 	struct intel_register_range *range;
289*d83cc019SAndroid Build Coastguard Worker 
290*d83cc019SAndroid Build Coastguard Worker 	igt_assert(mmio_data.inited);
291*d83cc019SAndroid Build Coastguard Worker 
292*d83cc019SAndroid Build Coastguard Worker 	if (intel_gen(mmio_data.i915_devid) >= 6)
293*d83cc019SAndroid Build Coastguard Worker 		igt_assert(mmio_data.key != -1);
294*d83cc019SAndroid Build Coastguard Worker 
295*d83cc019SAndroid Build Coastguard Worker 	if (!mmio_data.safe)
296*d83cc019SAndroid Build Coastguard Worker 		goto write_out;
297*d83cc019SAndroid Build Coastguard Worker 
298*d83cc019SAndroid Build Coastguard Worker 	range = intel_get_register_range(mmio_data.map,
299*d83cc019SAndroid Build Coastguard Worker 					 reg,
300*d83cc019SAndroid Build Coastguard Worker 					 INTEL_RANGE_WRITE);
301*d83cc019SAndroid Build Coastguard Worker 
302*d83cc019SAndroid Build Coastguard Worker 	igt_warn_on_f(!range,
303*d83cc019SAndroid Build Coastguard Worker 		      "Register write blocked for safety ""(*0x%08x = 0x%x)\n", reg, val);
304*d83cc019SAndroid Build Coastguard Worker 
305*d83cc019SAndroid Build Coastguard Worker write_out:
306*d83cc019SAndroid Build Coastguard Worker 	*(volatile uint32_t *)((volatile char *)igt_global_mmio + reg) = val;
307*d83cc019SAndroid Build Coastguard Worker }
308*d83cc019SAndroid Build Coastguard Worker 
309*d83cc019SAndroid Build Coastguard Worker 
310*d83cc019SAndroid Build Coastguard Worker /**
311*d83cc019SAndroid Build Coastguard Worker  * INREG:
312*d83cc019SAndroid Build Coastguard Worker  * @reg: register offset
313*d83cc019SAndroid Build Coastguard Worker  *
314*d83cc019SAndroid Build Coastguard Worker  * 32-bit read of the register at offset @reg. This function only works when the
315*d83cc019SAndroid Build Coastguard Worker  * new register access helper is initialized with intel_register_access_init().
316*d83cc019SAndroid Build Coastguard Worker  *
317*d83cc019SAndroid Build Coastguard Worker  * This function directly accesses the #igt_global_mmio without safety checks.
318*d83cc019SAndroid Build Coastguard Worker  *
319*d83cc019SAndroid Build Coastguard Worker  * Returns:
320*d83cc019SAndroid Build Coastguard Worker  * The value read from the register.
321*d83cc019SAndroid Build Coastguard Worker  */
INREG(uint32_t reg)322*d83cc019SAndroid Build Coastguard Worker uint32_t INREG(uint32_t reg)
323*d83cc019SAndroid Build Coastguard Worker {
324*d83cc019SAndroid Build Coastguard Worker 	return *(volatile uint32_t *)((volatile char *)igt_global_mmio + reg);
325*d83cc019SAndroid Build Coastguard Worker }
326*d83cc019SAndroid Build Coastguard Worker 
327*d83cc019SAndroid Build Coastguard Worker /**
328*d83cc019SAndroid Build Coastguard Worker  * INREG16:
329*d83cc019SAndroid Build Coastguard Worker  * @reg: register offset
330*d83cc019SAndroid Build Coastguard Worker  *
331*d83cc019SAndroid Build Coastguard Worker  * 16-bit read of the register at offset @reg. This function only works when the
332*d83cc019SAndroid Build Coastguard Worker  * new register access helper is initialized with intel_register_access_init().
333*d83cc019SAndroid Build Coastguard Worker  *
334*d83cc019SAndroid Build Coastguard Worker  * This function directly accesses the #igt_global_mmio without safety checks.
335*d83cc019SAndroid Build Coastguard Worker  *
336*d83cc019SAndroid Build Coastguard Worker  * Returns:
337*d83cc019SAndroid Build Coastguard Worker  * The value read from the register.
338*d83cc019SAndroid Build Coastguard Worker  */
INREG16(uint32_t reg)339*d83cc019SAndroid Build Coastguard Worker uint16_t INREG16(uint32_t reg)
340*d83cc019SAndroid Build Coastguard Worker {
341*d83cc019SAndroid Build Coastguard Worker 	return *(volatile uint16_t *)((volatile char *)igt_global_mmio + reg);
342*d83cc019SAndroid Build Coastguard Worker }
343*d83cc019SAndroid Build Coastguard Worker 
344*d83cc019SAndroid Build Coastguard Worker /**
345*d83cc019SAndroid Build Coastguard Worker  * INREG8:
346*d83cc019SAndroid Build Coastguard Worker  * @reg: register offset
347*d83cc019SAndroid Build Coastguard Worker  *
348*d83cc019SAndroid Build Coastguard Worker  * 8-bit read of the register at offset @reg. This function only works when the
349*d83cc019SAndroid Build Coastguard Worker  * new register access helper is initialized with intel_register_access_init().
350*d83cc019SAndroid Build Coastguard Worker  *
351*d83cc019SAndroid Build Coastguard Worker  * This function directly accesses the #igt_global_mmio without safety checks.
352*d83cc019SAndroid Build Coastguard Worker  *
353*d83cc019SAndroid Build Coastguard Worker  * Returns:
354*d83cc019SAndroid Build Coastguard Worker  * The value read from the register.
355*d83cc019SAndroid Build Coastguard Worker  */
INREG8(uint32_t reg)356*d83cc019SAndroid Build Coastguard Worker uint8_t INREG8(uint32_t reg)
357*d83cc019SAndroid Build Coastguard Worker {
358*d83cc019SAndroid Build Coastguard Worker 	return *((volatile uint8_t *)igt_global_mmio + reg);
359*d83cc019SAndroid Build Coastguard Worker }
360*d83cc019SAndroid Build Coastguard Worker 
361*d83cc019SAndroid Build Coastguard Worker /**
362*d83cc019SAndroid Build Coastguard Worker  * OUTREG:
363*d83cc019SAndroid Build Coastguard Worker  * @reg: register offset
364*d83cc019SAndroid Build Coastguard Worker  * @val: value to write
365*d83cc019SAndroid Build Coastguard Worker  *
366*d83cc019SAndroid Build Coastguard Worker  * 32-bit write of @val to the register at offset @reg. This function only works
367*d83cc019SAndroid Build Coastguard Worker  * when the new register access helper is initialized with
368*d83cc019SAndroid Build Coastguard Worker  * intel_register_access_init().
369*d83cc019SAndroid Build Coastguard Worker  *
370*d83cc019SAndroid Build Coastguard Worker  * This function directly accesses the #igt_global_mmio without safety checks.
371*d83cc019SAndroid Build Coastguard Worker  */
OUTREG(uint32_t reg,uint32_t val)372*d83cc019SAndroid Build Coastguard Worker void OUTREG(uint32_t reg, uint32_t val)
373*d83cc019SAndroid Build Coastguard Worker {
374*d83cc019SAndroid Build Coastguard Worker 	*(volatile uint32_t *)((volatile char *)igt_global_mmio + reg) = val;
375*d83cc019SAndroid Build Coastguard Worker }
376*d83cc019SAndroid Build Coastguard Worker 
377*d83cc019SAndroid Build Coastguard Worker /**
378*d83cc019SAndroid Build Coastguard Worker  * OUTREG16:
379*d83cc019SAndroid Build Coastguard Worker  * @reg: register offset
380*d83cc019SAndroid Build Coastguard Worker  * @val: value to write
381*d83cc019SAndroid Build Coastguard Worker  *
382*d83cc019SAndroid Build Coastguard Worker  * 16-bit write of @val to the register at offset @reg. This function only works
383*d83cc019SAndroid Build Coastguard Worker  * when the new register access helper is initialized with
384*d83cc019SAndroid Build Coastguard Worker  * intel_register_access_init().
385*d83cc019SAndroid Build Coastguard Worker  *
386*d83cc019SAndroid Build Coastguard Worker  * This function directly accesses the #igt_global_mmio without safety checks.
387*d83cc019SAndroid Build Coastguard Worker  */
OUTREG16(uint32_t reg,uint16_t val)388*d83cc019SAndroid Build Coastguard Worker void OUTREG16(uint32_t reg, uint16_t val)
389*d83cc019SAndroid Build Coastguard Worker {
390*d83cc019SAndroid Build Coastguard Worker 	*(volatile uint16_t *)((volatile char *)igt_global_mmio + reg) = val;
391*d83cc019SAndroid Build Coastguard Worker }
392*d83cc019SAndroid Build Coastguard Worker 
393*d83cc019SAndroid Build Coastguard Worker /**
394*d83cc019SAndroid Build Coastguard Worker  * OUTREG8:
395*d83cc019SAndroid Build Coastguard Worker  * @reg: register offset
396*d83cc019SAndroid Build Coastguard Worker  * @val: value to write
397*d83cc019SAndroid Build Coastguard Worker  *
398*d83cc019SAndroid Build Coastguard Worker  * 8-bit write of @val to the register at offset @reg. This function only works
399*d83cc019SAndroid Build Coastguard Worker  * when the new register access helper is initialized with
400*d83cc019SAndroid Build Coastguard Worker  * intel_register_access_init().
401*d83cc019SAndroid Build Coastguard Worker  *
402*d83cc019SAndroid Build Coastguard Worker  * This function directly accesses the #igt_global_mmio without safety checks.
403*d83cc019SAndroid Build Coastguard Worker  */
OUTREG8(uint32_t reg,uint8_t val)404*d83cc019SAndroid Build Coastguard Worker void OUTREG8(uint32_t reg, uint8_t val)
405*d83cc019SAndroid Build Coastguard Worker {
406*d83cc019SAndroid Build Coastguard Worker 	*((volatile uint8_t *)igt_global_mmio + reg) = val;
407*d83cc019SAndroid Build Coastguard Worker }
408