mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
soc: qcom: add pd-mapper implementation
Existing userspace protection domain mapper implementation has several issue. It doesn't play well with CONFIG_EXTRA_FIRMWARE, it doesn't reread JSON files if firmware location is changed (or if firmware was not available at the time pd-mapper was started but the corresponding directory is mounted later), etc. Provide in-kernel service implementing protection domain mapping required to work with several services, which are provided by the DSP firmware. This module is loaded automatically by the remoteproc drivers when necessary via the symbol dependency. It uses a root node to match a protection domains map for a particular board. It is not possible to implement it as a 'driver' as there is no corresponding device. Tested-by: Steev Klimaszewski <steev@kali.org> Tested-by: Alexey Minnekhanov <alexeymin@postmarketos.org> Reviewed-by: Chris Lew <quic_clew@quicinc.com> Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8550-QRD Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Link: https://lore.kernel.org/r/20240622-qcom-pd-mapper-v9-4-a84ee3591c8e@linaro.org [bjorn: include linux/slab.h] Signed-off-by: Bjorn Andersson <andersson@kernel.org>
This commit is contained in:
committed by
Bjorn Andersson
parent
0ac5c7d933
commit
1ebcde047c
@@ -72,6 +72,17 @@ config QCOM_OCMEM
|
||||
requirements. This is typically used by the GPU, camera/video, and
|
||||
audio components on some Snapdragon SoCs.
|
||||
|
||||
config QCOM_PD_MAPPER
|
||||
tristate "Qualcomm Protection Domain Mapper"
|
||||
select QCOM_QMI_HELPERS
|
||||
depends on NET && QRTR
|
||||
default QCOM_RPROC_COMMON
|
||||
help
|
||||
The Protection Domain Mapper maps registered services to the domains
|
||||
and instances handled by the remote DSPs. This is a kernel-space
|
||||
implementation of the service. It is a simpler alternative to the
|
||||
userspace daemon.
|
||||
|
||||
config QCOM_PDR_HELPERS
|
||||
tristate
|
||||
select QCOM_QMI_HELPERS
|
||||
|
||||
@@ -7,6 +7,7 @@ obj-$(CONFIG_QCOM_COMMAND_DB) += cmd-db.o
|
||||
obj-$(CONFIG_QCOM_GSBI) += qcom_gsbi.o
|
||||
obj-$(CONFIG_QCOM_MDT_LOADER) += mdt_loader.o
|
||||
obj-$(CONFIG_QCOM_OCMEM) += ocmem.o
|
||||
obj-$(CONFIG_QCOM_PD_MAPPER) += qcom_pd_mapper.o
|
||||
obj-$(CONFIG_QCOM_PDR_HELPERS) += pdr_interface.o
|
||||
obj-$(CONFIG_QCOM_PDR_MSG) += qcom_pdr_msg.o
|
||||
obj-$(CONFIG_QCOM_PMIC_GLINK) += pmic_glink.o
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
#define SERVREG_SET_ACK_REQ 0x23
|
||||
#define SERVREG_RESTART_PD_REQ 0x24
|
||||
|
||||
#define SERVREG_LOC_PFR_REQ 0x24
|
||||
|
||||
#define SERVREG_DOMAIN_LIST_LENGTH 32
|
||||
#define SERVREG_RESTART_PD_REQ_MAX_LEN 67
|
||||
#define SERVREG_REGISTER_LISTENER_REQ_LEN 71
|
||||
@@ -20,6 +22,7 @@
|
||||
#define SERVREG_GET_DOMAIN_LIST_REQ_MAX_LEN 74
|
||||
#define SERVREG_STATE_UPDATED_IND_MAX_LEN 79
|
||||
#define SERVREG_GET_DOMAIN_LIST_RESP_MAX_LEN 2389
|
||||
#define SERVREG_LOC_PFR_RESP_MAX_LEN 10
|
||||
|
||||
struct servreg_location_entry {
|
||||
char name[SERVREG_NAME_LENGTH + 1];
|
||||
@@ -79,6 +82,15 @@ struct servreg_set_ack_resp {
|
||||
struct qmi_response_type_v01 resp;
|
||||
};
|
||||
|
||||
struct servreg_loc_pfr_req {
|
||||
char service[SERVREG_NAME_LENGTH + 1];
|
||||
char reason[257];
|
||||
};
|
||||
|
||||
struct servreg_loc_pfr_resp {
|
||||
struct qmi_response_type_v01 rsp;
|
||||
};
|
||||
|
||||
extern const struct qmi_elem_info servreg_location_entry_ei[];
|
||||
extern const struct qmi_elem_info servreg_get_domain_list_req_ei[];
|
||||
extern const struct qmi_elem_info servreg_get_domain_list_resp_ei[];
|
||||
@@ -89,5 +101,7 @@ extern const struct qmi_elem_info servreg_restart_pd_resp_ei[];
|
||||
extern const struct qmi_elem_info servreg_state_updated_ind_ei[];
|
||||
extern const struct qmi_elem_info servreg_set_ack_req_ei[];
|
||||
extern const struct qmi_elem_info servreg_set_ack_resp_ei[];
|
||||
extern const struct qmi_elem_info servreg_loc_pfr_req_ei[];
|
||||
extern const struct qmi_elem_info servreg_loc_pfr_resp_ei[];
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -315,5 +315,39 @@ const struct qmi_elem_info servreg_set_ack_resp_ei[] = {
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(servreg_set_ack_resp_ei);
|
||||
|
||||
const struct qmi_elem_info servreg_loc_pfr_req_ei[] = {
|
||||
{
|
||||
.data_type = QMI_STRING,
|
||||
.elem_len = SERVREG_NAME_LENGTH + 1,
|
||||
.elem_size = sizeof(char),
|
||||
.array_type = VAR_LEN_ARRAY,
|
||||
.tlv_type = 0x01,
|
||||
.offset = offsetof(struct servreg_loc_pfr_req, service)
|
||||
},
|
||||
{
|
||||
.data_type = QMI_STRING,
|
||||
.elem_len = SERVREG_NAME_LENGTH + 1,
|
||||
.elem_size = sizeof(char),
|
||||
.array_type = VAR_LEN_ARRAY,
|
||||
.tlv_type = 0x02,
|
||||
.offset = offsetof(struct servreg_loc_pfr_req, reason)
|
||||
},
|
||||
{}
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(servreg_loc_pfr_req_ei);
|
||||
|
||||
const struct qmi_elem_info servreg_loc_pfr_resp_ei[] = {
|
||||
{
|
||||
.data_type = QMI_STRUCT,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof_field(struct servreg_loc_pfr_resp, rsp),
|
||||
.tlv_type = 0x02,
|
||||
.offset = offsetof(struct servreg_loc_pfr_resp, rsp),
|
||||
.ei_array = qmi_response_type_v01_ei,
|
||||
},
|
||||
{}
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(servreg_loc_pfr_resp_ei);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("Qualcomm Protection Domain messages data");
|
||||
|
||||
Reference in New Issue
Block a user