1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright (C) 2015 Google Inc.
4 * Copyright (C) 2018 Intel Corporation.
5 */
6
7#include <intelblocks/pcr.h>
8
9/*
10 * Calculate PCR register base at specified PID
11 * Arg0 - PCR Port ID
12 */
13Method (PCRB, 1, NotSerialized)
14{
15	Return (Add (IOMAP_P2SB_BAR,
16				ShiftLeft (Arg0, PCR_PORTID_SHIFT)))
17}
18
19/*
20 * Read a PCR register at specified PID and offset
21 * Arg0 - PCR Port ID
22 * Arg1 - Register Offset
23 */
24Method (PCRR, 2, Serialized)
25{
26	OperationRegion (PCRD, SystemMemory, Add (PCRB (Arg0), Arg1), 4)
27	Field (PCRD, DWordAcc, NoLock, Preserve)
28	{
29		DATA, 32
30	}
31	Return (DATA)
32}
33
34/*
35 * AND a value with PCR register at specified PID and offset
36 * Arg0 - PCR Port ID
37 * Arg1 - Register Offset
38 * Arg2 - Value to AND
39 */
40Method (PCRA, 3, Serialized)
41{
42	OperationRegion (PCRD, SystemMemory, Add (PCRB (Arg0), Arg1), 4)
43	Field (PCRD, DWordAcc, NoLock, Preserve)
44	{
45		DATA, 32
46	}
47	And (DATA, Arg2, DATA)
48
49	/*
50	 * After every write one needs to read an innocuous register
51	 * to ensure the writes are completed for certain ports. This is done
52	 * for all ports so that the callers don't need the per-port knowledge
53	 * for each transaction.
54	 */
55	PCRR (Arg0, Arg1)
56}
57
58/*
59 * OR a value with PCR register at specified PID and offset
60 * Arg0 - PCR Port ID
61 * Arg1 - Register Offset
62 * Arg2 - Value to OR
63 */
64Method (PCRO, 3, Serialized)
65{
66	OperationRegion (PCRD, SystemMemory, Add (PCRB (Arg0), Arg1), 4)
67	Field (PCRD, DWordAcc, NoLock, Preserve)
68	{
69		DATA, 32
70	}
71	Or (DATA, Arg2, DATA)
72
73	/*
74	 * After every write one needs to read an innocuous register
75	 * to ensure the writes are completed for certain ports. This is done
76	 * for all ports so that the callers don't need the per-port knowledge
77	 * for each transaction.
78	 */
79	PCRR (Arg0, Arg1)
80}
81