9 #include <soc/pci_devs.h>
17 #define IPC_WBUF0 0x80
23 #define IPC_RBUF0 0x90
28 #define PMC_IPC_CMD_OFFSET 0x0
29 #define PMC_IPC_STS_OFFSET 0x4
30 #define PMC_IPC_STS_BUSY BIT(0)
31 #define PMC_IPC_STS_ERR BIT(1)
32 #define PMC_IPC_ERR_CODE_SHIFT 16
33 #define PMC_IPC_ERR_CODE_MASK 0xff
35 #define PMC_IPC_XFER_TIMEOUT_MS (1 * MSECS_PER_SEC)
36 #define IS_IPC_STS_BUSY(status) ((status) & PMC_IPC_STS_BUSY)
37 #define IPC_STS_HAS_ERROR(status) ((status) & PMC_IPC_STS_ERR)
38 #define IPC_STS_ERROR_CODE(sts) (((sts) >> PMC_IPC_ERR_CODE_SHIFT & \
39 PMC_IPC_ERR_CODE_MASK))
41 static void *
pmc_reg(
unsigned int pmc_reg_offset)
44 return (
void *)(pmcbase + pmc_reg_offset);
128 for (i = 0; i < 5; ++i)
223 (enable ? 1 : 0) << clock_pin,
225 (enable ? 1 : 0) << pcie_rp,
230 printk(
BIOS_ERR,
"%s: Unable to find PMC device IPCS method\n", __func__);
const char * acpi_device_path_join(const struct device *dev, const char *name)
void acpigen_write_len_f(void)
void acpigen_write_dword(unsigned int data)
void acpigen_emit_namestring(const char *namepath)
void acpigen_write_integer(uint64_t data)
void acpigen_pop_len(void)
void acpigen_set_package_element_int(const char *package, unsigned int element, uint64_t src)
void acpigen_write_shiftleft_op_int(uint8_t src_result, uint64_t count)
void acpigen_write_sleep(uint64_t sleep_ms)
void acpigen_write_method_serialized(const char *name, int nargs)
char * acpigen_write_package(int nr_el)
void acpigen_emit_byte(unsigned char b)
void acpigen_write_field(const char *name, const struct fieldlist *l, size_t count, uint8_t flags)
void acpigen_write_store_op_to_namestr(uint8_t src, const char *dst)
void acpigen_write_debug_namestr(const char *str)
void acpigen_write_return_namestr(const char *arg)
void acpigen_write_opregion(const struct opregion *opreg)
void acpigen_set_package_element_namestr(const char *package, unsigned int element, const char *src)
void acpigen_write_debug_string(const char *str)
void acpigen_write_name(const char *name)
void acpigen_write_store_int_to_op(uint64_t src, uint8_t dst)
void acpigen_write_if_lequal_namestr_int(const char *namestr, uint64_t val)
static void write32(void *addr, uint32_t val)
static uint32_t read32(const void *addr)
cb_err
coreboot error codes
@ CB_ERR
Generic error code.
@ CB_SUCCESS
Call completed successfully.
#define printk(level,...)
DEVTREE_CONST struct device * pcidev_path_on_root(pci_devfn_t devfn)
#define FIELDLIST_RESERVED(X)
#define FIELDLIST_OFFSET(X)
#define OPREGION(rname, space, offset, len)
#define FIELDLIST_NAMESTR(X, Y)
static int stopwatch_expired(struct stopwatch *sw)
static void stopwatch_init_msecs_expire(struct stopwatch *sw, long ms)
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
#define IPC_STS_ERROR_CODE(sts)
static const void * pmc_rbuf(unsigned int ix)
static void * pmc_wbuf(unsigned int ix)
#define IS_IPC_STS_BUSY(status)
static void * pmc_reg(unsigned int pmc_reg_offset)
#define PMC_IPC_XFER_TIMEOUT_MS
void pmc_ipc_acpi_set_pci_clock(unsigned int pcie_rp, unsigned int clock_pin, bool enable)
enum cb_err pmc_send_ipc_cmd(uint32_t cmd, const struct pmc_ipc_buffer *wbuf, struct pmc_ipc_buffer *rbuf)
#define PMC_IPC_STS_OFFSET
#define IPC_STS_HAS_ERROR(status)
#define PMC_IPC_CMD_OFFSET
void pmc_ipc_acpi_fill_ssdt(void)
static int check_ipc_sts(void)
#define PMC_IPC_BUF_COUNT
#define PMC_IPC_CMD_MSI_SHIFT
#define PMC_IPC_CMD_NO_MSI
#define PMC_IPC_CMD_COMMAND_SHIFT
#define PMC_IPC_CMD_SIZE_SHIFT
#define PMC_IPC_CMD_ID_SET_PCIE_CLOCK
#define PMC_IPC_CMD_SUB_COMMAND_SHIFT
uintptr_t soc_read_pmc_base(void)
uint32_t buf[PMC_IPC_BUF_COUNT]