Commit 8cb7cf56 authored by Sudeep Holla's avatar Sudeep Holla

firmware: add support for ARM System Control and Power Interface(SCPI) protocol

This patch adds support for System Control and Power Interface (SCPI)
Message Protocol used between the Application Cores(AP) and the System
Control Processor(SCP). The MHU peripheral provides a mechanism for
inter-processor communication between SCP's M3 processor and AP.

SCP offers control and management of the core/cluster power states,
various power domain DVFS including the core/cluster, certain system
clocks configuration, thermal sensors and many others.

This protocol driver provides interface for all the client drivers using
SCPI to make use of the features offered by the SCP.
Signed-off-by: default avatarSudeep Holla <sudeep.holla@arm.com>
Reviewed-by: default avatarJon Medhurst (Tixy) <tixy@linaro.org>
Cc: Jassi Brar <jassisinghbrar@gmail.com>
Cc: Liviu Dudau <Liviu.Dudau@arm.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
parent 80f390ea
......@@ -9154,6 +9154,8 @@ M: Sudeep Holla <sudeep.holla@arm.com>
L: linux-arm-kernel@lists.infradead.org
S: Maintained
F: Documentation/devicetree/bindings/arm/arm,scpi.txt
F: drivers/firmware/arm_scpi.c
F: include/linux/scpi_protocol.h
SCSI CDROM DRIVER
M: Jens Axboe <axboe@kernel.dk>
......
......@@ -8,6 +8,25 @@ menu "Firmware Drivers"
config ARM_PSCI_FW
bool
config ARM_SCPI_PROTOCOL
tristate "ARM System Control and Power Interface (SCPI) Message Protocol"
depends on ARM_MHU
help
System Control and Power Interface (SCPI) Message Protocol is
defined for the purpose of communication between the Application
Cores(AP) and the System Control Processor(SCP). The MHU peripheral
provides a mechanism for inter-processor communication between SCP
and AP.
SCP controls most of the power managament on the Application
Processors. It offers control and management of: the core/cluster
power states, various power domain DVFS including the core/cluster,
certain system clocks configuration, thermal sensors and many
others.
This protocol library provides interface for all the client drivers
making use of the features offered by the SCP.
config EDD
tristate "BIOS Enhanced Disk Drive calls determine boot disk"
depends on X86
......
......@@ -2,6 +2,7 @@
# Makefile for the linux kernel.
#
obj-$(CONFIG_ARM_PSCI_FW) += psci.o
obj-$(CONFIG_ARM_SCPI_PROTOCOL) += arm_scpi.o
obj-$(CONFIG_DMI) += dmi_scan.o
obj-$(CONFIG_DMI_SYSFS) += dmi-sysfs.o
obj-$(CONFIG_EDD) += edd.o
......
This diff is collapsed.
/*
* SCPI Message Protocol driver header
*
* Copyright (C) 2014 ARM Ltd.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/types.h>
struct scpi_opp {
u32 freq;
u32 m_volt;
} __packed;
struct scpi_dvfs_info {
unsigned int count;
unsigned int latency; /* in nanoseconds */
struct scpi_opp *opps;
};
/**
* struct scpi_ops - represents the various operations provided
* by SCP through SCPI message protocol
* @get_version: returns the major and minor revision on the SCPI
* message protocol
* @clk_get_range: gets clock range limit(min - max in Hz)
* @clk_get_val: gets clock value(in Hz)
* @clk_set_val: sets the clock value, setting to 0 will disable the
* clock (if supported)
* @dvfs_get_idx: gets the Operating Point of the given power domain.
* OPP is an index to the list return by @dvfs_get_info
* @dvfs_set_idx: sets the Operating Point of the given power domain.
* OPP is an index to the list return by @dvfs_get_info
* @dvfs_get_info: returns the DVFS capabilities of the given power
* domain. It includes the OPP list and the latency information
*/
struct scpi_ops {
u32 (*get_version)(void);
int (*clk_get_range)(u16, unsigned long *, unsigned long *);
unsigned long (*clk_get_val)(u16);
int (*clk_set_val)(u16, unsigned long);
int (*dvfs_get_idx)(u8);
int (*dvfs_set_idx)(u8, u8);
struct scpi_dvfs_info *(*dvfs_get_info)(u8);
};
#if IS_ENABLED(CONFIG_ARM_SCPI_PROTOCOL)
struct scpi_ops *get_scpi_ops(void);
#else
static inline struct scpi_ops *get_scpi_ops(void) { return NULL; }
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment