blob: fbd2b8c3c250d3905757b95d19f74116994cca23 [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef SOC_INTEL_COMMON_BLOCK_PCR_H
#define SOC_INTEL_COMMON_BLOCK_PCR_H
/* Port Id lives in bits 23:16 and register offset lives in 15:0 of address. */
#define PCR_PORTID_SHIFT 16
#if !defined(__ACPI__)
#include <types.h>
#include <device/pci_ops.h>
uint32_t pcr_read32(uint8_t pid, uint16_t offset);
uint16_t pcr_read16(uint8_t pid, uint16_t offset);
uint8_t pcr_read8(uint8_t pid, uint16_t offset);
void pcr_write32(uint8_t pid, uint16_t offset, uint32_t indata);
void pcr_write16(uint8_t pid, uint16_t offset, uint16_t indata);
void pcr_write8(uint8_t pid, uint16_t offset, uint8_t indata);
void pcr_rmw32(uint8_t pid, uint16_t offset, uint32_t anddata,
uint32_t ordata);
void pcr_rmw16(uint8_t pid, uint16_t offset, uint16_t anddata,
uint16_t ordata);
void pcr_rmw8(uint8_t pid, uint16_t offset, uint8_t anddata,
uint8_t ordata);
void pcr_or32(uint8_t pid, uint16_t offset, uint32_t ordata);
void pcr_or16(uint8_t pid, uint16_t offset, uint16_t ordata);
void pcr_or8(uint8_t pid, uint16_t offset, uint8_t ordata);
/* SBI command */
enum {
MEM_READ = 0x00,
MEM_WRITE = 0x01,
PCI_CONFIG_READ = 0x04,
PCI_CONFIG_WRITE = 0x05,
PCR_READ = 0x06,
PCR_WRITE = 0x07,
GPIO_LOCK_UNLOCK = 0x13,
};
struct pcr_sbi_msg {
uint8_t pid; /* 0x00 - Port ID of the SBI message */
uint32_t offset; /* 0x01 - Register offset of the SBI message */
uint8_t opcode; /* 0x05 - Opcode */
bool is_posted; /* 0x06 - Posted message */
uint16_t fast_byte_enable; /* 0x07 - First Byte Enable */
uint16_t bar; /* 0x09 - base address */
uint16_t fid; /* 0x0B - Function ID */
};
/*
* API to perform sideband communication
*
* Input:
* struct pcr_sbi_msg
* data - read/write for sbi message
* response -
* 0 - successful
* 1 - unsuccessful
* 2 - powered down
* 3 - multi-cast mixed
*
* Output:
* 0: SBI message is successfully completed
* -1: SBI message failure
*/
int pcr_execute_sideband_msg(pci_devfn_t dev, struct pcr_sbi_msg *msg, uint32_t *data,
uint8_t *response);
/* Get the starting address of the port's registers. */
void *pcr_reg_address(uint8_t pid, uint16_t offset);
#endif /* if !defined(__ACPI__) */
#endif /* SOC_INTEL_COMMON_BLOCK_PCR_H */