Commit a97d8ffa authored by Arnd Bergmann's avatar Arnd Bergmann

Merge tag 'qcom-drivers-for-5.11' of...

Merge tag 'qcom-drivers-for-5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux into arm/drivers

Qualcomm driver updates for v5.11

This adds support for the core power domains on MSM8916, MSM8939, SDM660
and SDX55. It adds SM8150 support to the last-level cache controller
driver and it makes it possible to build the Command DB and RPMh drivers
as modules.

It also contains a slew of smaller cleanups, style and bug fixes
throughout the various drivers.

* tag 'qcom-drivers-for-5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux: (39 commits)
  soc: qcom: rpmhpd: Add SDX55 power domains
  dt-bindings: power: Add rpm power domain bindings for sdx55
  soc: qcom: rpmh: Use __fill_rpmh_msg API during rpmh_write()
  samples: qmi: Constify static qmi ops
  soc: qcom: pdr: Constify static qmi structs
  soc: qcom: initialize local variable
  soc: qcom: socinfo: add soc ids for msm8953 variants
  soc: qcom: geni: Remove "iova" check
  soc: qcom: llcc: Add configuration data for SM8150
  dt-bindings: msm: Add LLCC for SM8150
  soc: qcom: rpmh: Fix possible doc-rot in rpmh_write()'s header
  soc: qcom: kryo-l2-accessors: Fix misnaming of 'val'
  soc: qcom: rpmhpd: Provide some missing struct member descriptions
  soc: qcom: llcc-qcom: Fix expected kernel-doc formatting
  soc: qcom: smp2p: Remove unused struct attribute provide another
  soc: qcom: wcnss_ctrl: Demote non-conformant struct header and fix function headers
  soc: qcom: smsm: Fix some kernel-doc formatting and naming problems
  soc: qcom: smem: Fix formatting and missing documentation issues
  soc: qcom: qcom-geni-se: Fix misnamed function parameter 'rx_rfr'
  soc: qcom: qcom_aoss: Add missing description for 'cooling_devs'
  ...

Link: https://lore.kernel.org/r/20201130190142.345246-1-bjorn.andersson@linaro.orgSigned-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parents 00c543f6 9c456626
...@@ -23,6 +23,7 @@ properties: ...@@ -23,6 +23,7 @@ properties:
enum: enum:
- qcom,sc7180-llcc - qcom,sc7180-llcc
- qcom,sdm845-llcc - qcom,sdm845-llcc
- qcom,sm8150-llcc
reg: reg:
items: items:
......
...@@ -16,12 +16,16 @@ description: ...@@ -16,12 +16,16 @@ description:
properties: properties:
compatible: compatible:
enum: enum:
- qcom,msm8916-rpmpd
- qcom,msm8939-rpmpd
- qcom,msm8976-rpmpd - qcom,msm8976-rpmpd
- qcom,msm8996-rpmpd - qcom,msm8996-rpmpd
- qcom,msm8998-rpmpd - qcom,msm8998-rpmpd
- qcom,qcs404-rpmpd - qcom,qcs404-rpmpd
- qcom,sdm660-rpmpd
- qcom,sc7180-rpmhpd - qcom,sc7180-rpmhpd
- qcom,sdm845-rpmhpd - qcom,sdm845-rpmhpd
- qcom,sdx55-rpmhpd
- qcom,sm8150-rpmhpd - qcom,sm8150-rpmhpd
- qcom,sm8250-rpmhpd - qcom,sm8250-rpmhpd
......
...@@ -366,6 +366,7 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg, ...@@ -366,6 +366,7 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
geni_se_select_mode(se, GENI_SE_FIFO); geni_se_select_mode(se, GENI_SE_FIFO);
writel_relaxed(len, se->base + SE_I2C_RX_TRANS_LEN); writel_relaxed(len, se->base + SE_I2C_RX_TRANS_LEN);
geni_se_setup_m_cmd(se, I2C_READ, m_param);
if (dma_buf && geni_se_rx_dma_prep(se, dma_buf, len, &rx_dma)) { if (dma_buf && geni_se_rx_dma_prep(se, dma_buf, len, &rx_dma)) {
geni_se_select_mode(se, GENI_SE_FIFO); geni_se_select_mode(se, GENI_SE_FIFO);
...@@ -373,8 +374,6 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg, ...@@ -373,8 +374,6 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
dma_buf = NULL; dma_buf = NULL;
} }
geni_se_setup_m_cmd(se, I2C_READ, m_param);
time_left = wait_for_completion_timeout(&gi2c->done, XFER_TIMEOUT); time_left = wait_for_completion_timeout(&gi2c->done, XFER_TIMEOUT);
if (!time_left) if (!time_left)
geni_i2c_abort_xfer(gi2c); geni_i2c_abort_xfer(gi2c);
...@@ -408,6 +407,7 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg, ...@@ -408,6 +407,7 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
geni_se_select_mode(se, GENI_SE_FIFO); geni_se_select_mode(se, GENI_SE_FIFO);
writel_relaxed(len, se->base + SE_I2C_TX_TRANS_LEN); writel_relaxed(len, se->base + SE_I2C_TX_TRANS_LEN);
geni_se_setup_m_cmd(se, I2C_WRITE, m_param);
if (dma_buf && geni_se_tx_dma_prep(se, dma_buf, len, &tx_dma)) { if (dma_buf && geni_se_tx_dma_prep(se, dma_buf, len, &tx_dma)) {
geni_se_select_mode(se, GENI_SE_FIFO); geni_se_select_mode(se, GENI_SE_FIFO);
...@@ -415,8 +415,6 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg, ...@@ -415,8 +415,6 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
dma_buf = NULL; dma_buf = NULL;
} }
geni_se_setup_m_cmd(se, I2C_WRITE, m_param);
if (!dma_buf) /* Get FIFO IRQ */ if (!dma_buf) /* Get FIFO IRQ */
writel_relaxed(1, se->base + SE_GENI_TX_WATERMARK_REG); writel_relaxed(1, se->base + SE_GENI_TX_WATERMARK_REG);
......
...@@ -17,7 +17,7 @@ config QCOM_AOSS_QMP ...@@ -17,7 +17,7 @@ config QCOM_AOSS_QMP
Subsystem (AOSS) using Qualcomm Messaging Protocol (QMP). Subsystem (AOSS) using Qualcomm Messaging Protocol (QMP).
config QCOM_COMMAND_DB config QCOM_COMMAND_DB
bool "Qualcomm Command DB" tristate "Qualcomm Command DB"
depends on ARCH_QCOM || COMPILE_TEST depends on ARCH_QCOM || COMPILE_TEST
depends on OF_RESERVED_MEM depends on OF_RESERVED_MEM
help help
...@@ -108,8 +108,9 @@ config QCOM_RMTFS_MEM ...@@ -108,8 +108,9 @@ config QCOM_RMTFS_MEM
Say y here if you intend to boot the modem remoteproc. Say y here if you intend to boot the modem remoteproc.
config QCOM_RPMH config QCOM_RPMH
bool "Qualcomm RPM-Hardened (RPMH) Communication" tristate "Qualcomm RPM-Hardened (RPMH) Communication"
depends on ARCH_QCOM || COMPILE_TEST depends on ARCH_QCOM || COMPILE_TEST
depends on (QCOM_COMMAND_DB || !QCOM_COMMAND_DB)
help help
Support for communication with the hardened-RPM blocks in Support for communication with the hardened-RPM blocks in
Qualcomm Technologies Inc (QTI) SoCs. RPMH communication uses an Qualcomm Technologies Inc (QTI) SoCs. RPMH communication uses an
......
/* SPDX-License-Identifier: GPL-2.0 */ /* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. */ /* Copyright (c) 2016-2018, 2020, The Linux Foundation. All rights reserved. */
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_address.h> #include <linux/of_address.h>
#include <linux/of_reserved_mem.h> #include <linux/of_reserved_mem.h>
...@@ -340,12 +341,14 @@ static const struct of_device_id cmd_db_match_table[] = { ...@@ -340,12 +341,14 @@ static const struct of_device_id cmd_db_match_table[] = {
{ .compatible = "qcom,cmd-db" }, { .compatible = "qcom,cmd-db" },
{ } { }
}; };
MODULE_DEVICE_TABLE(of, cmd_db_match_table);
static struct platform_driver cmd_db_dev_driver = { static struct platform_driver cmd_db_dev_driver = {
.probe = cmd_db_dev_probe, .probe = cmd_db_dev_probe,
.driver = { .driver = {
.name = "cmd-db", .name = "cmd-db",
.of_match_table = cmd_db_match_table, .of_match_table = cmd_db_match_table,
.suppress_bind_attrs = true,
}, },
}; };
...@@ -354,3 +357,6 @@ static int __init cmd_db_device_init(void) ...@@ -354,3 +357,6 @@ static int __init cmd_db_device_init(void)
return platform_driver_register(&cmd_db_dev_driver); return platform_driver_register(&cmd_db_dev_driver);
} }
arch_initcall(cmd_db_device_init); arch_initcall(cmd_db_device_init);
MODULE_DESCRIPTION("Qualcomm Technologies, Inc. Command DB Driver");
MODULE_LICENSE("GPL v2");
...@@ -16,7 +16,7 @@ static DEFINE_RAW_SPINLOCK(l2_access_lock); ...@@ -16,7 +16,7 @@ static DEFINE_RAW_SPINLOCK(l2_access_lock);
/** /**
* kryo_l2_set_indirect_reg() - write value to an L2 register * kryo_l2_set_indirect_reg() - write value to an L2 register
* @reg: Address of L2 register. * @reg: Address of L2 register.
* @value: Value to be written to register. * @val: Value to be written to register.
* *
* Use architecturally required barriers for ordering between system register * Use architecturally required barriers for ordering between system register
* accesses, and system registers with respect to device memory * accesses, and system registers with respect to device memory
......
...@@ -45,10 +45,13 @@ ...@@ -45,10 +45,13 @@
#define LLCC_TRP_ATTR0_CFGn(n) (0x21000 + SZ_8 * n) #define LLCC_TRP_ATTR0_CFGn(n) (0x21000 + SZ_8 * n)
#define LLCC_TRP_ATTR1_CFGn(n) (0x21004 + SZ_8 * n) #define LLCC_TRP_ATTR1_CFGn(n) (0x21004 + SZ_8 * n)
#define LLCC_TRP_SCID_DIS_CAP_ALLOC 0x21f00
#define LLCC_TRP_PCB_ACT 0x21f04
#define BANK_OFFSET_STRIDE 0x80000 #define BANK_OFFSET_STRIDE 0x80000
/** /**
* llcc_slice_config - Data associated with the llcc slice * struct llcc_slice_config - Data associated with the llcc slice
* @usecase_id: Unique id for the client's use case * @usecase_id: Unique id for the client's use case
* @slice_id: llcc slice id for each client * @slice_id: llcc slice id for each client
* @max_cap: The maximum capacity of the cache slice provided in KB * @max_cap: The maximum capacity of the cache slice provided in KB
...@@ -89,6 +92,7 @@ struct llcc_slice_config { ...@@ -89,6 +92,7 @@ struct llcc_slice_config {
struct qcom_llcc_config { struct qcom_llcc_config {
const struct llcc_slice_config *sct_data; const struct llcc_slice_config *sct_data;
int size; int size;
bool need_llcc_cfg;
}; };
static const struct llcc_slice_config sc7180_data[] = { static const struct llcc_slice_config sc7180_data[] = {
...@@ -119,14 +123,45 @@ static const struct llcc_slice_config sdm845_data[] = { ...@@ -119,14 +123,45 @@ static const struct llcc_slice_config sdm845_data[] = {
{ LLCC_AUDHW, 22, 1024, 1, 1, 0xffc, 0x2, 0, 0, 1, 1, 0 }, { LLCC_AUDHW, 22, 1024, 1, 1, 0xffc, 0x2, 0, 0, 1, 1, 0 },
}; };
static const struct llcc_slice_config sm8150_data[] = {
{ LLCC_CPUSS, 1, 3072, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 1 },
{ LLCC_VIDSC0, 2, 512, 2, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 },
{ LLCC_VIDSC1, 3, 512, 2, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 },
{ LLCC_AUDIO, 6, 1024, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 },
{ LLCC_MDMHPGRW, 7, 3072, 1, 0, 0xFF, 0xF00, 0, 0, 0, 1, 0 },
{ LLCC_MDM, 8, 3072, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 },
{ LLCC_MODHW, 9, 1024, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 },
{ LLCC_CMPT, 10, 3072, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 },
{ LLCC_GPUHTW , 11, 512, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 },
{ LLCC_GPU, 12, 2560, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 },
{ LLCC_MMUHWT, 13, 1024, 1, 1, 0xFFF, 0x0, 0, 0, 0, 0, 1 },
{ LLCC_CMPTDMA, 15, 3072, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 },
{ LLCC_DISP, 16, 3072, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 },
{ LLCC_MDMHPFX, 20, 1024, 2, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 },
{ LLCC_MDMHPFX, 21, 1024, 0, 1, 0xF, 0x0, 0, 0, 0, 1, 0 },
{ LLCC_AUDHW, 22, 1024, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 },
{ LLCC_NPU, 23, 3072, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 },
{ LLCC_WLHW, 24, 3072, 1, 1, 0xFFF, 0x0, 0, 0, 0, 1, 0 },
{ LLCC_MODPE, 29, 256, 1, 1, 0xF, 0x0, 0, 0, 0, 1, 0 },
{ LLCC_APTCM, 30, 256, 3, 1, 0x0, 0x1, 1, 0, 0, 1, 0 },
{ LLCC_WRCACHE, 31, 128, 1, 1, 0xFFF, 0x0, 0, 0, 0, 0, 0 },
};
static const struct qcom_llcc_config sc7180_cfg = { static const struct qcom_llcc_config sc7180_cfg = {
.sct_data = sc7180_data, .sct_data = sc7180_data,
.size = ARRAY_SIZE(sc7180_data), .size = ARRAY_SIZE(sc7180_data),
.need_llcc_cfg = true,
}; };
static const struct qcom_llcc_config sdm845_cfg = { static const struct qcom_llcc_config sdm845_cfg = {
.sct_data = sdm845_data, .sct_data = sdm845_data,
.size = ARRAY_SIZE(sdm845_data), .size = ARRAY_SIZE(sdm845_data),
.need_llcc_cfg = false,
};
static const struct qcom_llcc_config sm8150_cfg = {
.sct_data = sm8150_data,
.size = ARRAY_SIZE(sm8150_data),
}; };
static struct llcc_drv_data *drv_data = (void *) -EPROBE_DEFER; static struct llcc_drv_data *drv_data = (void *) -EPROBE_DEFER;
...@@ -318,39 +353,28 @@ size_t llcc_get_slice_size(struct llcc_slice_desc *desc) ...@@ -318,39 +353,28 @@ size_t llcc_get_slice_size(struct llcc_slice_desc *desc)
} }
EXPORT_SYMBOL_GPL(llcc_get_slice_size); EXPORT_SYMBOL_GPL(llcc_get_slice_size);
static int qcom_llcc_cfg_program(struct platform_device *pdev) static int _qcom_llcc_cfg_program(const struct llcc_slice_config *config,
const struct qcom_llcc_config *cfg)
{ {
int i; int ret;
u32 attr1_cfg; u32 attr1_cfg;
u32 attr0_cfg; u32 attr0_cfg;
u32 attr1_val; u32 attr1_val;
u32 attr0_val; u32 attr0_val;
u32 max_cap_cacheline; u32 max_cap_cacheline;
u32 sz;
int ret = 0;
const struct llcc_slice_config *llcc_table;
struct llcc_slice_desc desc; struct llcc_slice_desc desc;
sz = drv_data->cfg_size; attr1_val = config->cache_mode;
llcc_table = drv_data->cfg; attr1_val |= config->probe_target_ways << ATTR1_PROBE_TARGET_WAYS_SHIFT;
attr1_val |= config->fixed_size << ATTR1_FIXED_SIZE_SHIFT;
for (i = 0; i < sz; i++) { attr1_val |= config->priority << ATTR1_PRIORITY_SHIFT;
attr1_cfg = LLCC_TRP_ATTR1_CFGn(llcc_table[i].slice_id);
attr0_cfg = LLCC_TRP_ATTR0_CFGn(llcc_table[i].slice_id);
attr1_val = llcc_table[i].cache_mode;
attr1_val |= llcc_table[i].probe_target_ways <<
ATTR1_PROBE_TARGET_WAYS_SHIFT;
attr1_val |= llcc_table[i].fixed_size <<
ATTR1_FIXED_SIZE_SHIFT;
attr1_val |= llcc_table[i].priority <<
ATTR1_PRIORITY_SHIFT;
max_cap_cacheline = MAX_CAP_TO_BYTES(llcc_table[i].max_cap); max_cap_cacheline = MAX_CAP_TO_BYTES(config->max_cap);
/* LLCC instances can vary for each target. /*
* LLCC instances can vary for each target.
* The SW writes to broadcast register which gets propagated * The SW writes to broadcast register which gets propagated
* to each llcc instace (llcc0,.. llccN). * to each llcc instance (llcc0,.. llccN).
* Since the size of the memory is divided equally amongst the * Since the size of the memory is divided equally amongst the
* llcc instances, we need to configure the max cap accordingly. * llcc instances, we need to configure the max cap accordingly.
*/ */
...@@ -358,22 +382,62 @@ static int qcom_llcc_cfg_program(struct platform_device *pdev) ...@@ -358,22 +382,62 @@ static int qcom_llcc_cfg_program(struct platform_device *pdev)
max_cap_cacheline >>= CACHE_LINE_SIZE_SHIFT; max_cap_cacheline >>= CACHE_LINE_SIZE_SHIFT;
attr1_val |= max_cap_cacheline << ATTR1_MAX_CAP_SHIFT; attr1_val |= max_cap_cacheline << ATTR1_MAX_CAP_SHIFT;
attr0_val = llcc_table[i].res_ways & ATTR0_RES_WAYS_MASK; attr1_cfg = LLCC_TRP_ATTR1_CFGn(config->slice_id);
attr0_val |= llcc_table[i].bonus_ways << ATTR0_BONUS_WAYS_SHIFT;
ret = regmap_write(drv_data->bcast_regmap, attr1_cfg, attr1_val);
if (ret)
return ret;
attr0_val = config->res_ways & ATTR0_RES_WAYS_MASK;
attr0_val |= config->bonus_ways << ATTR0_BONUS_WAYS_SHIFT;
attr0_cfg = LLCC_TRP_ATTR0_CFGn(config->slice_id);
ret = regmap_write(drv_data->bcast_regmap, attr0_cfg, attr0_val);
if (ret)
return ret;
if (cfg->need_llcc_cfg) {
u32 disable_cap_alloc, retain_pc;
ret = regmap_write(drv_data->bcast_regmap, attr1_cfg, disable_cap_alloc = config->dis_cap_alloc << config->slice_id;
attr1_val); ret = regmap_write(drv_data->bcast_regmap,
LLCC_TRP_SCID_DIS_CAP_ALLOC, disable_cap_alloc);
if (ret) if (ret)
return ret; return ret;
ret = regmap_write(drv_data->bcast_regmap, attr0_cfg,
attr0_val); retain_pc = config->retain_on_pc << config->slice_id;
ret = regmap_write(drv_data->bcast_regmap,
LLCC_TRP_PCB_ACT, retain_pc);
if (ret) if (ret)
return ret; return ret;
if (llcc_table[i].activate_on_init) { }
desc.slice_id = llcc_table[i].slice_id;
if (config->activate_on_init) {
desc.slice_id = config->slice_id;
ret = llcc_slice_activate(&desc); ret = llcc_slice_activate(&desc);
} }
return ret;
}
static int qcom_llcc_cfg_program(struct platform_device *pdev,
const struct qcom_llcc_config *cfg)
{
int i;
u32 sz;
int ret = 0;
const struct llcc_slice_config *llcc_table;
sz = drv_data->cfg_size;
llcc_table = drv_data->cfg;
for (i = 0; i < sz; i++) {
ret = _qcom_llcc_cfg_program(&llcc_table[i], cfg);
if (ret)
return ret;
} }
return ret; return ret;
} }
...@@ -472,7 +536,7 @@ static int qcom_llcc_probe(struct platform_device *pdev) ...@@ -472,7 +536,7 @@ static int qcom_llcc_probe(struct platform_device *pdev)
mutex_init(&drv_data->lock); mutex_init(&drv_data->lock);
platform_set_drvdata(pdev, drv_data); platform_set_drvdata(pdev, drv_data);
ret = qcom_llcc_cfg_program(pdev); ret = qcom_llcc_cfg_program(pdev, cfg);
if (ret) if (ret)
goto err; goto err;
...@@ -494,6 +558,7 @@ static int qcom_llcc_probe(struct platform_device *pdev) ...@@ -494,6 +558,7 @@ static int qcom_llcc_probe(struct platform_device *pdev)
static const struct of_device_id qcom_llcc_of_match[] = { static const struct of_device_id qcom_llcc_of_match[] = {
{ .compatible = "qcom,sc7180-llcc", .data = &sc7180_cfg }, { .compatible = "qcom,sc7180-llcc", .data = &sc7180_cfg },
{ .compatible = "qcom,sdm845-llcc", .data = &sdm845_cfg }, { .compatible = "qcom,sdm845-llcc", .data = &sdm845_cfg },
{ .compatible = "qcom,sm8150-llcc", .data = &sm8150_cfg },
{ } { }
}; };
......
...@@ -110,7 +110,7 @@ static void pdr_locator_del_server(struct qmi_handle *qmi, ...@@ -110,7 +110,7 @@ static void pdr_locator_del_server(struct qmi_handle *qmi,
pdr->locator_addr.sq_port = 0; pdr->locator_addr.sq_port = 0;
} }
static struct qmi_ops pdr_locator_ops = { static const struct qmi_ops pdr_locator_ops = {
.new_server = pdr_locator_new_server, .new_server = pdr_locator_new_server,
.del_server = pdr_locator_del_server, .del_server = pdr_locator_del_server,
}; };
...@@ -238,7 +238,7 @@ static void pdr_notifier_del_server(struct qmi_handle *qmi, ...@@ -238,7 +238,7 @@ static void pdr_notifier_del_server(struct qmi_handle *qmi,
mutex_unlock(&pdr->list_lock); mutex_unlock(&pdr->list_lock);
} }
static struct qmi_ops pdr_notifier_ops = { static const struct qmi_ops pdr_notifier_ops = {
.new_server = pdr_notifier_new_server, .new_server = pdr_notifier_new_server,
.del_server = pdr_notifier_del_server, .del_server = pdr_notifier_del_server,
}; };
...@@ -343,7 +343,7 @@ static void pdr_indication_cb(struct qmi_handle *qmi, ...@@ -343,7 +343,7 @@ static void pdr_indication_cb(struct qmi_handle *qmi,
queue_work(pdr->indack_wq, &pdr->indack_work); queue_work(pdr->indack_wq, &pdr->indack_work);
} }
static struct qmi_msg_handler qmi_indication_handler[] = { static const struct qmi_msg_handler qmi_indication_handler[] = {
{ {
.type = QMI_INDICATION, .type = QMI_INDICATION,
.msg_id = SERVREG_STATE_UPDATED_IND_ID, .msg_id = SERVREG_STATE_UPDATED_IND_ID,
...@@ -569,7 +569,7 @@ EXPORT_SYMBOL(pdr_add_lookup); ...@@ -569,7 +569,7 @@ EXPORT_SYMBOL(pdr_add_lookup);
int pdr_restart_pd(struct pdr_handle *pdr, struct pdr_service *pds) int pdr_restart_pd(struct pdr_handle *pdr, struct pdr_service *pds)
{ {
struct servreg_restart_pd_resp resp; struct servreg_restart_pd_resp resp;
struct servreg_restart_pd_req req; struct servreg_restart_pd_req req = { 0 };
struct sockaddr_qrtr addr; struct sockaddr_qrtr addr;
struct pdr_service *tmp; struct pdr_service *tmp;
struct qmi_txn txn; struct qmi_txn txn;
......
...@@ -82,10 +82,11 @@ ...@@ -82,10 +82,11 @@
#define NUM_AHB_CLKS 2 #define NUM_AHB_CLKS 2
/** /**
* @struct geni_wrapper - Data structure to represent the QUP Wrapper Core * struct geni_wrapper - Data structure to represent the QUP Wrapper Core
* @dev: Device pointer of the QUP wrapper core * @dev: Device pointer of the QUP wrapper core
* @base: Base address of this instance of QUP wrapper core * @base: Base address of this instance of QUP wrapper core
* @ahb_clks: Handle to the primary & secondary AHB clocks * @ahb_clks: Handle to the primary & secondary AHB clocks
* @to_core: Core ICC path
*/ */
struct geni_wrapper { struct geni_wrapper {
struct device *dev; struct device *dev;
...@@ -237,7 +238,7 @@ static void geni_se_irq_clear(struct geni_se *se) ...@@ -237,7 +238,7 @@ static void geni_se_irq_clear(struct geni_se *se)
* geni_se_init() - Initialize the GENI serial engine * geni_se_init() - Initialize the GENI serial engine
* @se: Pointer to the concerned serial engine. * @se: Pointer to the concerned serial engine.
* @rx_wm: Receive watermark, in units of FIFO words. * @rx_wm: Receive watermark, in units of FIFO words.
* @rx_rfr_wm: Ready-for-receive watermark, in units of FIFO words. * @rx_rfr: Ready-for-receive watermark, in units of FIFO words.
* *
* This function is used to initialize the GENI serial engine, configure * This function is used to initialize the GENI serial engine, configure
* receive watermark and ready-for-receive watermarks. * receive watermark and ready-for-receive watermarks.
...@@ -266,35 +267,62 @@ EXPORT_SYMBOL(geni_se_init); ...@@ -266,35 +267,62 @@ EXPORT_SYMBOL(geni_se_init);
static void geni_se_select_fifo_mode(struct geni_se *se) static void geni_se_select_fifo_mode(struct geni_se *se)
{ {
u32 proto = geni_se_read_proto(se); u32 proto = geni_se_read_proto(se);
u32 val; u32 val, val_old;
geni_se_irq_clear(se); geni_se_irq_clear(se);
val = readl_relaxed(se->base + SE_GENI_M_IRQ_EN); /*
* The RX path for the UART is asynchronous and so needs more
* complex logic for enabling / disabling its interrupts.
*
* Specific notes:
* - The done and TX-related interrupts are managed manually.
* - We don't RX from the main sequencer (we use the secondary) so
* we don't need the RX-related interrupts enabled in the main
* sequencer for UART.
*/
if (proto != GENI_SE_UART) { if (proto != GENI_SE_UART) {
val_old = val = readl_relaxed(se->base + SE_GENI_M_IRQ_EN);
val |= M_CMD_DONE_EN | M_TX_FIFO_WATERMARK_EN; val |= M_CMD_DONE_EN | M_TX_FIFO_WATERMARK_EN;
val |= M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN; val |= M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN;
} if (val != val_old)
writel_relaxed(val, se->base + SE_GENI_M_IRQ_EN); writel_relaxed(val, se->base + SE_GENI_M_IRQ_EN);
val = readl_relaxed(se->base + SE_GENI_S_IRQ_EN); val_old = val = readl_relaxed(se->base + SE_GENI_S_IRQ_EN);
if (proto != GENI_SE_UART)
val |= S_CMD_DONE_EN; val |= S_CMD_DONE_EN;
if (val != val_old)
writel_relaxed(val, se->base + SE_GENI_S_IRQ_EN); writel_relaxed(val, se->base + SE_GENI_S_IRQ_EN);
}
val = readl_relaxed(se->base + SE_GENI_DMA_MODE_EN); val_old = val = readl_relaxed(se->base + SE_GENI_DMA_MODE_EN);
val &= ~GENI_DMA_MODE_EN; val &= ~GENI_DMA_MODE_EN;
if (val != val_old)
writel_relaxed(val, se->base + SE_GENI_DMA_MODE_EN); writel_relaxed(val, se->base + SE_GENI_DMA_MODE_EN);
} }
static void geni_se_select_dma_mode(struct geni_se *se) static void geni_se_select_dma_mode(struct geni_se *se)
{ {
u32 val; u32 proto = geni_se_read_proto(se);
u32 val, val_old;
geni_se_irq_clear(se); geni_se_irq_clear(se);
val = readl_relaxed(se->base + SE_GENI_DMA_MODE_EN); if (proto != GENI_SE_UART) {
val_old = val = readl_relaxed(se->base + SE_GENI_M_IRQ_EN);
val &= ~(M_CMD_DONE_EN | M_TX_FIFO_WATERMARK_EN);
val &= ~(M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN);
if (val != val_old)
writel_relaxed(val, se->base + SE_GENI_M_IRQ_EN);
val_old = val = readl_relaxed(se->base + SE_GENI_S_IRQ_EN);
val &= ~S_CMD_DONE_EN;
if (val != val_old)
writel_relaxed(val, se->base + SE_GENI_S_IRQ_EN);
}
val_old = val = readl_relaxed(se->base + SE_GENI_DMA_MODE_EN);
val |= GENI_DMA_MODE_EN; val |= GENI_DMA_MODE_EN;
if (val != val_old)
writel_relaxed(val, se->base + SE_GENI_DMA_MODE_EN); writel_relaxed(val, se->base + SE_GENI_DMA_MODE_EN);
} }
...@@ -651,7 +679,7 @@ int geni_se_tx_dma_prep(struct geni_se *se, void *buf, size_t len, ...@@ -651,7 +679,7 @@ int geni_se_tx_dma_prep(struct geni_se *se, void *buf, size_t len,
writel_relaxed(lower_32_bits(*iova), se->base + SE_DMA_TX_PTR_L); writel_relaxed(lower_32_bits(*iova), se->base + SE_DMA_TX_PTR_L);
writel_relaxed(upper_32_bits(*iova), se->base + SE_DMA_TX_PTR_H); writel_relaxed(upper_32_bits(*iova), se->base + SE_DMA_TX_PTR_H);
writel_relaxed(GENI_SE_DMA_EOT_BUF, se->base + SE_DMA_TX_ATTR); writel_relaxed(GENI_SE_DMA_EOT_BUF, se->base + SE_DMA_TX_ATTR);
writel_relaxed(len, se->base + SE_DMA_TX_LEN); writel(len, se->base + SE_DMA_TX_LEN);
return 0; return 0;
} }
EXPORT_SYMBOL(geni_se_tx_dma_prep); EXPORT_SYMBOL(geni_se_tx_dma_prep);
...@@ -688,7 +716,7 @@ int geni_se_rx_dma_prep(struct geni_se *se, void *buf, size_t len, ...@@ -688,7 +716,7 @@ int geni_se_rx_dma_prep(struct geni_se *se, void *buf, size_t len,
writel_relaxed(upper_32_bits(*iova), se->base + SE_DMA_RX_PTR_H); writel_relaxed(upper_32_bits(*iova), se->base + SE_DMA_RX_PTR_H);
/* RX does not have EOT buffer type bit. So just reset RX_ATTR */ /* RX does not have EOT buffer type bit. So just reset RX_ATTR */
writel_relaxed(0, se->base + SE_DMA_RX_ATTR); writel_relaxed(0, se->base + SE_DMA_RX_ATTR);
writel_relaxed(len, se->base + SE_DMA_RX_LEN); writel(len, se->base + SE_DMA_RX_LEN);
return 0; return 0;
} }
EXPORT_SYMBOL(geni_se_rx_dma_prep); EXPORT_SYMBOL(geni_se_rx_dma_prep);
...@@ -705,7 +733,7 @@ void geni_se_tx_dma_unprep(struct geni_se *se, dma_addr_t iova, size_t len) ...@@ -705,7 +733,7 @@ void geni_se_tx_dma_unprep(struct geni_se *se, dma_addr_t iova, size_t len)
{ {
struct geni_wrapper *wrapper = se->wrapper; struct geni_wrapper *wrapper = se->wrapper;
if (iova && !dma_mapping_error(wrapper->dev, iova)) if (!dma_mapping_error(wrapper->dev, iova))
dma_unmap_single(wrapper->dev, iova, len, DMA_TO_DEVICE); dma_unmap_single(wrapper->dev, iova, len, DMA_TO_DEVICE);
} }
EXPORT_SYMBOL(geni_se_tx_dma_unprep); EXPORT_SYMBOL(geni_se_tx_dma_unprep);
...@@ -722,7 +750,7 @@ void geni_se_rx_dma_unprep(struct geni_se *se, dma_addr_t iova, size_t len) ...@@ -722,7 +750,7 @@ void geni_se_rx_dma_unprep(struct geni_se *se, dma_addr_t iova, size_t len)
{ {
struct geni_wrapper *wrapper = se->wrapper; struct geni_wrapper *wrapper = se->wrapper;
if (iova && !dma_mapping_error(wrapper->dev, iova)) if (!dma_mapping_error(wrapper->dev, iova))
dma_unmap_single(wrapper->dev, iova, len, DMA_FROM_DEVICE); dma_unmap_single(wrapper->dev, iova, len, DMA_FROM_DEVICE);
} }
EXPORT_SYMBOL(geni_se_rx_dma_unprep); EXPORT_SYMBOL(geni_se_rx_dma_unprep);
......
...@@ -65,6 +65,7 @@ struct qmp_cooling_device { ...@@ -65,6 +65,7 @@ struct qmp_cooling_device {
* @tx_lock: provides synchronization between multiple callers of qmp_send() * @tx_lock: provides synchronization between multiple callers of qmp_send()
* @qdss_clk: QDSS clock hw struct * @qdss_clk: QDSS clock hw struct
* @pd_data: genpd data * @pd_data: genpd data
* @cooling_devs: thermal cooling devices
*/ */
struct qmp { struct qmp {
void __iomem *msgram; void __iomem *msgram;
...@@ -225,7 +226,6 @@ static bool qmp_message_empty(struct qmp *qmp) ...@@ -225,7 +226,6 @@ static bool qmp_message_empty(struct qmp *qmp)
static int qmp_send(struct qmp *qmp, const void *data, size_t len) static int qmp_send(struct qmp *qmp, const void *data, size_t len)
{ {
long time_left; long time_left;
size_t tlen;
int ret; int ret;
if (WARN_ON(len + sizeof(u32) > qmp->size)) if (WARN_ON(len + sizeof(u32) > qmp->size))
...@@ -242,7 +242,7 @@ static int qmp_send(struct qmp *qmp, const void *data, size_t len) ...@@ -242,7 +242,7 @@ static int qmp_send(struct qmp *qmp, const void *data, size_t len)
writel(len, qmp->msgram + qmp->offset); writel(len, qmp->msgram + qmp->offset);
/* Read back len to confirm data written in message RAM */ /* Read back len to confirm data written in message RAM */
tlen = readl(qmp->msgram + qmp->offset); readl(qmp->msgram + qmp->offset);
qmp_kick(qmp); qmp_kick(qmp);
time_left = wait_event_interruptible_timeout(qmp->event, time_left = wait_event_interruptible_timeout(qmp->event,
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/iopoll.h> #include <linux/iopoll.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_irq.h> #include <linux/of_irq.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
...@@ -497,7 +498,7 @@ static void __tcs_buffer_write(struct rsc_drv *drv, int tcs_id, int cmd_id, ...@@ -497,7 +498,7 @@ static void __tcs_buffer_write(struct rsc_drv *drv, int tcs_id, int cmd_id,
write_tcs_cmd(drv, RSC_DRV_CMD_MSGID, tcs_id, j, msgid); write_tcs_cmd(drv, RSC_DRV_CMD_MSGID, tcs_id, j, msgid);
write_tcs_cmd(drv, RSC_DRV_CMD_ADDR, tcs_id, j, cmd->addr); write_tcs_cmd(drv, RSC_DRV_CMD_ADDR, tcs_id, j, cmd->addr);
write_tcs_cmd(drv, RSC_DRV_CMD_DATA, tcs_id, j, cmd->data); write_tcs_cmd(drv, RSC_DRV_CMD_DATA, tcs_id, j, cmd->data);
trace_rpmh_send_msg_rcuidle(drv, tcs_id, j, msgid, cmd); trace_rpmh_send_msg(drv, tcs_id, j, msgid, cmd);
} }
write_tcs_reg(drv, RSC_DRV_CMD_WAIT_FOR_CMPL, tcs_id, cmd_complete); write_tcs_reg(drv, RSC_DRV_CMD_WAIT_FOR_CMPL, tcs_id, cmd_complete);
...@@ -1018,6 +1019,7 @@ static const struct of_device_id rpmh_drv_match[] = { ...@@ -1018,6 +1019,7 @@ static const struct of_device_id rpmh_drv_match[] = {
{ .compatible = "qcom,rpmh-rsc", }, { .compatible = "qcom,rpmh-rsc", },
{ } { }
}; };
MODULE_DEVICE_TABLE(of, rpmh_drv_match);
static struct platform_driver rpmh_driver = { static struct platform_driver rpmh_driver = {
.probe = rpmh_rsc_probe, .probe = rpmh_rsc_probe,
...@@ -1033,3 +1035,6 @@ static int __init rpmh_driver_init(void) ...@@ -1033,3 +1035,6 @@ static int __init rpmh_driver_init(void)
return platform_driver_register(&rpmh_driver); return platform_driver_register(&rpmh_driver);
} }
arch_initcall(rpmh_driver_init); arch_initcall(rpmh_driver_init);
MODULE_DESCRIPTION("Qualcomm Technologies, Inc. RPMh Driver");
MODULE_LICENSE("GPL v2");
...@@ -181,8 +181,6 @@ static int __rpmh_write(const struct device *dev, enum rpmh_state state, ...@@ -181,8 +181,6 @@ static int __rpmh_write(const struct device *dev, enum rpmh_state state,
struct cache_req *req; struct cache_req *req;
int i; int i;
rpm_msg->msg.state = state;
/* Cache the request in our store and link the payload */ /* Cache the request in our store and link the payload */
for (i = 0; i < rpm_msg->msg.num_cmds; i++) { for (i = 0; i < rpm_msg->msg.num_cmds; i++) {
req = cache_rpm_request(ctrlr, state, &rpm_msg->msg.cmds[i]); req = cache_rpm_request(ctrlr, state, &rpm_msg->msg.cmds[i]);
...@@ -190,8 +188,6 @@ static int __rpmh_write(const struct device *dev, enum rpmh_state state, ...@@ -190,8 +188,6 @@ static int __rpmh_write(const struct device *dev, enum rpmh_state state,
return PTR_ERR(req); return PTR_ERR(req);
} }
rpm_msg->msg.state = state;
if (state == RPMH_ACTIVE_ONLY_STATE) { if (state == RPMH_ACTIVE_ONLY_STATE) {
WARN_ON(irqs_disabled()); WARN_ON(irqs_disabled());
ret = rpmh_rsc_send_data(ctrlr_to_drv(ctrlr), &rpm_msg->msg); ret = rpmh_rsc_send_data(ctrlr_to_drv(ctrlr), &rpm_msg->msg);
...@@ -254,7 +250,7 @@ EXPORT_SYMBOL(rpmh_write_async); ...@@ -254,7 +250,7 @@ EXPORT_SYMBOL(rpmh_write_async);
/** /**
* rpmh_write: Write a set of RPMH commands and block until response * rpmh_write: Write a set of RPMH commands and block until response
* *
* @rc: The RPMH handle got from rpmh_get_client * @dev: The device making the request
* @state: Active/sleep set * @state: Active/sleep set
* @cmd: The payload data * @cmd: The payload data
* @n: The number of elements in @cmd * @n: The number of elements in @cmd
...@@ -268,11 +264,9 @@ int rpmh_write(const struct device *dev, enum rpmh_state state, ...@@ -268,11 +264,9 @@ int rpmh_write(const struct device *dev, enum rpmh_state state,
DEFINE_RPMH_MSG_ONSTACK(dev, state, &compl, rpm_msg); DEFINE_RPMH_MSG_ONSTACK(dev, state, &compl, rpm_msg);
int ret; int ret;
if (!cmd || !n || n > MAX_RPMH_PAYLOAD) ret = __fill_rpmh_msg(&rpm_msg, state, cmd, n);
return -EINVAL; if (ret)
return ret;
memcpy(rpm_msg.cmd, cmd, n * sizeof(*cmd));
rpm_msg.msg.num_cmds = n;
ret = __rpmh_write(dev, state, &rpm_msg); ret = __rpmh_write(dev, state, &rpm_msg);
if (ret) if (ret)
......
...@@ -24,9 +24,12 @@ ...@@ -24,9 +24,12 @@
* struct rpmhpd - top level RPMh power domain resource data structure * struct rpmhpd - top level RPMh power domain resource data structure
* @dev: rpmh power domain controller device * @dev: rpmh power domain controller device
* @pd: generic_pm_domain corrresponding to the power domain * @pd: generic_pm_domain corrresponding to the power domain
* @parent: generic_pm_domain corrresponding to the parent's power domain
* @peer: A peer power domain in case Active only Voting is * @peer: A peer power domain in case Active only Voting is
* supported * supported
* @active_only: True if it represents an Active only peer * @active_only: True if it represents an Active only peer
* @corner: current corner
* @active_corner: current active corner
* @level: An array of level (vlvl) to corner (hlvl) mappings * @level: An array of level (vlvl) to corner (hlvl) mappings
* derived from cmd-db * derived from cmd-db
* @level_count: Number of levels supported by the power domain. max * @level_count: Number of levels supported by the power domain. max
...@@ -132,6 +135,18 @@ static const struct rpmhpd_desc sdm845_desc = { ...@@ -132,6 +135,18 @@ static const struct rpmhpd_desc sdm845_desc = {
.num_pds = ARRAY_SIZE(sdm845_rpmhpds), .num_pds = ARRAY_SIZE(sdm845_rpmhpds),
}; };
/* SDX55 RPMH powerdomains */
static struct rpmhpd *sdx55_rpmhpds[] = {
[SDX55_MSS] = &sdm845_mss,
[SDX55_MX] = &sdm845_mx,
[SDX55_CX] = &sdm845_cx,
};
static const struct rpmhpd_desc sdx55_desc = {
.rpmhpds = sdx55_rpmhpds,
.num_pds = ARRAY_SIZE(sdx55_rpmhpds),
};
/* SM8150 RPMH powerdomains */ /* SM8150 RPMH powerdomains */
static struct rpmhpd sm8150_mmcx_ao; static struct rpmhpd sm8150_mmcx_ao;
...@@ -205,6 +220,7 @@ static const struct rpmhpd_desc sc7180_desc = { ...@@ -205,6 +220,7 @@ static const struct rpmhpd_desc sc7180_desc = {
static const struct of_device_id rpmhpd_match_table[] = { static const struct of_device_id rpmhpd_match_table[] = {
{ .compatible = "qcom,sc7180-rpmhpd", .data = &sc7180_desc }, { .compatible = "qcom,sc7180-rpmhpd", .data = &sc7180_desc },
{ .compatible = "qcom,sdm845-rpmhpd", .data = &sdm845_desc }, { .compatible = "qcom,sdm845-rpmhpd", .data = &sdm845_desc },
{ .compatible = "qcom,sdx55-rpmhpd", .data = &sdx55_desc},
{ .compatible = "qcom,sm8150-rpmhpd", .data = &sm8150_desc }, { .compatible = "qcom,sm8150-rpmhpd", .data = &sm8150_desc },
{ .compatible = "qcom,sm8250-rpmhpd", .data = &sm8250_desc }, { .compatible = "qcom,sm8250-rpmhpd", .data = &sm8250_desc },
{ } { }
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
#define KEY_FLOOR_LEVEL 0x6c6676 /* vfl */ #define KEY_FLOOR_LEVEL 0x6c6676 /* vfl */
#define KEY_LEVEL 0x6c766c76 /* vlvl */ #define KEY_LEVEL 0x6c766c76 /* vlvl */
#define MAX_8996_RPMPD_STATE 6 #define MAX_CORNER_RPMPD_STATE 6
#define DEFINE_RPMPD_PAIR(_platform, _name, _active, r_type, r_key, \ #define DEFINE_RPMPD_PAIR(_platform, _name, _active, r_type, r_key, \
r_id) \ r_id) \
...@@ -116,6 +116,52 @@ struct rpmpd_desc { ...@@ -116,6 +116,52 @@ struct rpmpd_desc {
static DEFINE_MUTEX(rpmpd_lock); static DEFINE_MUTEX(rpmpd_lock);
/* msm8939 RPM Power Domains */
DEFINE_RPMPD_PAIR(msm8939, vddmd, vddmd_ao, SMPA, CORNER, 1);
DEFINE_RPMPD_VFC(msm8939, vddmd_vfc, SMPA, 1);
DEFINE_RPMPD_PAIR(msm8939, vddcx, vddcx_ao, SMPA, CORNER, 2);
DEFINE_RPMPD_VFC(msm8939, vddcx_vfc, SMPA, 2);
DEFINE_RPMPD_PAIR(msm8939, vddmx, vddmx_ao, LDOA, CORNER, 3);
static struct rpmpd *msm8939_rpmpds[] = {
[MSM8939_VDDMDCX] = &msm8939_vddmd,
[MSM8939_VDDMDCX_AO] = &msm8939_vddmd_ao,
[MSM8939_VDDMDCX_VFC] = &msm8939_vddmd_vfc,
[MSM8939_VDDCX] = &msm8939_vddcx,
[MSM8939_VDDCX_AO] = &msm8939_vddcx_ao,
[MSM8939_VDDCX_VFC] = &msm8939_vddcx_vfc,
[MSM8939_VDDMX] = &msm8939_vddmx,
[MSM8939_VDDMX_AO] = &msm8939_vddmx_ao,
};
static const struct rpmpd_desc msm8939_desc = {
.rpmpds = msm8939_rpmpds,
.num_pds = ARRAY_SIZE(msm8939_rpmpds),
.max_state = MAX_CORNER_RPMPD_STATE,
};
/* msm8916 RPM Power Domains */
DEFINE_RPMPD_PAIR(msm8916, vddcx, vddcx_ao, SMPA, CORNER, 1);
DEFINE_RPMPD_PAIR(msm8916, vddmx, vddmx_ao, LDOA, CORNER, 3);
DEFINE_RPMPD_VFC(msm8916, vddcx_vfc, SMPA, 1);
static struct rpmpd *msm8916_rpmpds[] = {
[MSM8916_VDDCX] = &msm8916_vddcx,
[MSM8916_VDDCX_AO] = &msm8916_vddcx_ao,
[MSM8916_VDDCX_VFC] = &msm8916_vddcx_vfc,
[MSM8916_VDDMX] = &msm8916_vddmx,
[MSM8916_VDDMX_AO] = &msm8916_vddmx_ao,
};
static const struct rpmpd_desc msm8916_desc = {
.rpmpds = msm8916_rpmpds,
.num_pds = ARRAY_SIZE(msm8916_rpmpds),
.max_state = MAX_CORNER_RPMPD_STATE,
};
/* msm8976 RPM Power Domains */ /* msm8976 RPM Power Domains */
DEFINE_RPMPD_PAIR(msm8976, vddcx, vddcx_ao, SMPA, LEVEL, 2); DEFINE_RPMPD_PAIR(msm8976, vddcx, vddcx_ao, SMPA, LEVEL, 2);
DEFINE_RPMPD_PAIR(msm8976, vddmx, vddmx_ao, SMPA, LEVEL, 6); DEFINE_RPMPD_PAIR(msm8976, vddmx, vddmx_ao, SMPA, LEVEL, 6);
...@@ -159,7 +205,7 @@ static struct rpmpd *msm8996_rpmpds[] = { ...@@ -159,7 +205,7 @@ static struct rpmpd *msm8996_rpmpds[] = {
static const struct rpmpd_desc msm8996_desc = { static const struct rpmpd_desc msm8996_desc = {
.rpmpds = msm8996_rpmpds, .rpmpds = msm8996_rpmpds,
.num_pds = ARRAY_SIZE(msm8996_rpmpds), .num_pds = ARRAY_SIZE(msm8996_rpmpds),
.max_state = MAX_8996_RPMPD_STATE, .max_state = MAX_CORNER_RPMPD_STATE,
}; };
/* msm8998 RPM Power domains */ /* msm8998 RPM Power domains */
...@@ -220,11 +266,46 @@ static const struct rpmpd_desc qcs404_desc = { ...@@ -220,11 +266,46 @@ static const struct rpmpd_desc qcs404_desc = {
.max_state = RPM_SMD_LEVEL_BINNING, .max_state = RPM_SMD_LEVEL_BINNING,
}; };
/* sdm660 RPM Power domains */
DEFINE_RPMPD_PAIR(sdm660, vddcx, vddcx_ao, RWCX, LEVEL, 0);
DEFINE_RPMPD_VFL(sdm660, vddcx_vfl, RWCX, 0);
DEFINE_RPMPD_PAIR(sdm660, vddmx, vddmx_ao, RWMX, LEVEL, 0);
DEFINE_RPMPD_VFL(sdm660, vddmx_vfl, RWMX, 0);
DEFINE_RPMPD_LEVEL(sdm660, vdd_ssccx, RWLC, 0);
DEFINE_RPMPD_VFL(sdm660, vdd_ssccx_vfl, RWLC, 0);
DEFINE_RPMPD_LEVEL(sdm660, vdd_sscmx, RWLM, 0);
DEFINE_RPMPD_VFL(sdm660, vdd_sscmx_vfl, RWLM, 0);
static struct rpmpd *sdm660_rpmpds[] = {
[SDM660_VDDCX] = &sdm660_vddcx,
[SDM660_VDDCX_AO] = &sdm660_vddcx_ao,
[SDM660_VDDCX_VFL] = &sdm660_vddcx_vfl,
[SDM660_VDDMX] = &sdm660_vddmx,
[SDM660_VDDMX_AO] = &sdm660_vddmx_ao,
[SDM660_VDDMX_VFL] = &sdm660_vddmx_vfl,
[SDM660_SSCCX] = &sdm660_vdd_ssccx,
[SDM660_SSCCX_VFL] = &sdm660_vdd_ssccx_vfl,
[SDM660_SSCMX] = &sdm660_vdd_sscmx,
[SDM660_SSCMX_VFL] = &sdm660_vdd_sscmx_vfl,
};
static const struct rpmpd_desc sdm660_desc = {
.rpmpds = sdm660_rpmpds,
.num_pds = ARRAY_SIZE(sdm660_rpmpds),
.max_state = RPM_SMD_LEVEL_TURBO,
};
static const struct of_device_id rpmpd_match_table[] = { static const struct of_device_id rpmpd_match_table[] = {
{ .compatible = "qcom,msm8916-rpmpd", .data = &msm8916_desc },
{ .compatible = "qcom,msm8939-rpmpd", .data = &msm8939_desc },
{ .compatible = "qcom,msm8976-rpmpd", .data = &msm8976_desc }, { .compatible = "qcom,msm8976-rpmpd", .data = &msm8976_desc },
{ .compatible = "qcom,msm8996-rpmpd", .data = &msm8996_desc }, { .compatible = "qcom,msm8996-rpmpd", .data = &msm8996_desc },
{ .compatible = "qcom,msm8998-rpmpd", .data = &msm8998_desc }, { .compatible = "qcom,msm8998-rpmpd", .data = &msm8998_desc },
{ .compatible = "qcom,qcs404-rpmpd", .data = &qcs404_desc }, { .compatible = "qcom,qcs404-rpmpd", .data = &qcs404_desc },
{ .compatible = "qcom,sdm660-rpmpd", .data = &sdm660_desc },
{ } { }
}; };
MODULE_DEVICE_TABLE(of, rpmpd_match_table); MODULE_DEVICE_TABLE(of, rpmpd_match_table);
......
...@@ -122,7 +122,7 @@ struct smem_global_entry { ...@@ -122,7 +122,7 @@ struct smem_global_entry {
* @free_offset: index of the first unallocated byte in smem * @free_offset: index of the first unallocated byte in smem
* @available: number of bytes available for allocation * @available: number of bytes available for allocation
* @reserved: reserved field, must be 0 * @reserved: reserved field, must be 0
* toc: array of references to items * @toc: array of references to items
*/ */
struct smem_header { struct smem_header {
struct smem_proc_comm proc_comm[4]; struct smem_proc_comm proc_comm[4];
...@@ -255,6 +255,7 @@ struct smem_region { ...@@ -255,6 +255,7 @@ struct smem_region {
* processor/host * processor/host
* @cacheline: list of cacheline sizes for each host * @cacheline: list of cacheline sizes for each host
* @item_count: max accepted item number * @item_count: max accepted item number
* @socinfo: platform device pointer
* @num_regions: number of @regions * @num_regions: number of @regions
* @regions: list of the memory regions defining the shared memory * @regions: list of the memory regions defining the shared memory
*/ */
......
...@@ -112,6 +112,7 @@ struct smp2p_entry { ...@@ -112,6 +112,7 @@ struct smp2p_entry {
* struct qcom_smp2p - device driver context * struct qcom_smp2p - device driver context
* @dev: device driver handle * @dev: device driver handle
* @in: pointer to the inbound smem item * @in: pointer to the inbound smem item
* @out: pointer to the outbound smem item
* @smem_items: ids of the two smem items * @smem_items: ids of the two smem items
* @valid_entries: already scanned inbound entries * @valid_entries: already scanned inbound entries
* @local_pid: processor id of the inbound edge * @local_pid: processor id of the inbound edge
...@@ -318,15 +319,16 @@ static int qcom_smp2p_inbound_entry(struct qcom_smp2p *smp2p, ...@@ -318,15 +319,16 @@ static int qcom_smp2p_inbound_entry(struct qcom_smp2p *smp2p,
static int smp2p_update_bits(void *data, u32 mask, u32 value) static int smp2p_update_bits(void *data, u32 mask, u32 value)
{ {
struct smp2p_entry *entry = data; struct smp2p_entry *entry = data;
unsigned long flags;
u32 orig; u32 orig;
u32 val; u32 val;
spin_lock(&entry->lock); spin_lock_irqsave(&entry->lock, flags);
val = orig = readl(entry->value); val = orig = readl(entry->value);
val &= ~mask; val &= ~mask;
val |= value; val |= value;
writel(val, entry->value); writel(val, entry->value);
spin_unlock(&entry->lock); spin_unlock_irqrestore(&entry->lock, flags);
if (val != orig) if (val != orig)
qcom_smp2p_kick(entry->smp2p); qcom_smp2p_kick(entry->smp2p);
......
...@@ -130,7 +130,7 @@ struct smsm_host { ...@@ -130,7 +130,7 @@ struct smsm_host {
/** /**
* smsm_update_bits() - change bit in outgoing entry and inform subscribers * smsm_update_bits() - change bit in outgoing entry and inform subscribers
* @data: smsm context pointer * @data: smsm context pointer
* @offset: bit in the entry * @mask: value mask
* @value: new value * @value: new value
* *
* Used to set and clear the bits in the outgoing/local entry and inform * Used to set and clear the bits in the outgoing/local entry and inform
...@@ -254,10 +254,8 @@ static void smsm_mask_irq(struct irq_data *irqd) ...@@ -254,10 +254,8 @@ static void smsm_mask_irq(struct irq_data *irqd)
* smsm_unmask_irq() - subscribe to cascades of IRQs of a certain status bit * smsm_unmask_irq() - subscribe to cascades of IRQs of a certain status bit
* @irqd: IRQ handle to be unmasked * @irqd: IRQ handle to be unmasked
* *
* This subscribes the local CPU to interrupts upon changes to the defined * This subscribes the local CPU to interrupts upon changes to the defined
* status bit. The bit is also marked for cascading. * status bit. The bit is also marked for cascading.
*/ */
static void smsm_unmask_irq(struct irq_data *irqd) static void smsm_unmask_irq(struct irq_data *irqd)
{ {
......
...@@ -218,13 +218,19 @@ static const struct soc_id soc_id[] = { ...@@ -218,13 +218,19 @@ static const struct soc_id soc_id[] = {
{ 251, "MSM8992" }, { 251, "MSM8992" },
{ 253, "APQ8094" }, { 253, "APQ8094" },
{ 291, "APQ8096" }, { 291, "APQ8096" },
{ 293, "MSM8953" },
{ 304, "APQ8053" },
{ 305, "MSM8996SG" }, { 305, "MSM8996SG" },
{ 310, "MSM8996AU" }, { 310, "MSM8996AU" },
{ 311, "APQ8096AU" }, { 311, "APQ8096AU" },
{ 312, "APQ8096SG" }, { 312, "APQ8096SG" },
{ 318, "SDM630" }, { 318, "SDM630" },
{ 321, "SDM845" }, { 321, "SDM845" },
{ 338, "SDM450" },
{ 341, "SDA845" }, { 341, "SDA845" },
{ 349, "SDM632" },
{ 350, "SDA632" },
{ 351, "SDA450" },
{ 356, "SM8250" }, { 356, "SM8250" },
{ 402, "IPQ6018" }, { 402, "IPQ6018" },
{ 425, "SC7180" }, { 425, "SC7180" },
......
...@@ -68,9 +68,8 @@ struct wcnss_msg_hdr { ...@@ -68,9 +68,8 @@ struct wcnss_msg_hdr {
u32 len; u32 len;
} __packed; } __packed;
/** /*
* struct wcnss_version_resp - version request response * struct wcnss_version_resp - version request response
* @hdr: common packet wcnss_msg_hdr header
*/ */
struct wcnss_version_resp { struct wcnss_version_resp {
struct wcnss_msg_hdr hdr; struct wcnss_msg_hdr hdr;
...@@ -108,9 +107,11 @@ struct wcnss_download_nv_resp { ...@@ -108,9 +107,11 @@ struct wcnss_download_nv_resp {
/** /**
* wcnss_ctrl_smd_callback() - handler from SMD responses * wcnss_ctrl_smd_callback() - handler from SMD responses
* @channel: smd channel handle * @rpdev: remote processor message device pointer
* @data: pointer to the incoming data packet * @data: pointer to the incoming data packet
* @count: size of the incoming data packet * @count: size of the incoming data packet
* @priv: unused
* @addr: unused
* *
* Handles any incoming packets from the remote WCNSS_CTRL service. * Handles any incoming packets from the remote WCNSS_CTRL service.
*/ */
...@@ -267,6 +268,7 @@ static int wcnss_download_nv(struct wcnss_ctrl *wcnss, bool *expect_cbc) ...@@ -267,6 +268,7 @@ static int wcnss_download_nv(struct wcnss_ctrl *wcnss, bool *expect_cbc)
* @wcnss: wcnss handle, retrieved from drvdata * @wcnss: wcnss handle, retrieved from drvdata
* @name: SMD channel name * @name: SMD channel name
* @cb: callback to handle incoming data on the channel * @cb: callback to handle incoming data on the channel
* @priv: private data for use in the call-back
*/ */
struct rpmsg_endpoint *qcom_wcnss_open_channel(void *wcnss, const char *name, rpmsg_rx_cb_t cb, void *priv) struct rpmsg_endpoint *qcom_wcnss_open_channel(void *wcnss, const char *name, rpmsg_rx_cb_t cb, void *priv)
{ {
......
...@@ -15,6 +15,11 @@ ...@@ -15,6 +15,11 @@
#define SDM845_GFX 7 #define SDM845_GFX 7
#define SDM845_MSS 8 #define SDM845_MSS 8
/* SDX55 Power Domain Indexes */
#define SDX55_MSS 0
#define SDX55_MX 1
#define SDX55_CX 2
/* SM8150 Power Domain Indexes */ /* SM8150 Power Domain Indexes */
#define SM8150_MSS 0 #define SM8150_MSS 0
#define SM8150_EBI 1 #define SM8150_EBI 1
...@@ -64,6 +69,23 @@ ...@@ -64,6 +69,23 @@
#define RPMH_REGULATOR_LEVEL_TURBO 384 #define RPMH_REGULATOR_LEVEL_TURBO 384
#define RPMH_REGULATOR_LEVEL_TURBO_L1 416 #define RPMH_REGULATOR_LEVEL_TURBO_L1 416
/* MSM8939 Power Domains */
#define MSM8939_VDDMDCX 0
#define MSM8939_VDDMDCX_AO 1
#define MSM8939_VDDMDCX_VFC 2
#define MSM8939_VDDCX 3
#define MSM8939_VDDCX_AO 4
#define MSM8939_VDDCX_VFC 5
#define MSM8939_VDDMX 6
#define MSM8939_VDDMX_AO 7
/* MSM8916 Power Domain Indexes */
#define MSM8916_VDDCX 0
#define MSM8916_VDDCX_AO 1
#define MSM8916_VDDCX_VFC 2
#define MSM8916_VDDMX 3
#define MSM8916_VDDMX_AO 4
/* MSM8976 Power Domain Indexes */ /* MSM8976 Power Domain Indexes */
#define MSM8976_VDDCX 0 #define MSM8976_VDDCX 0
#define MSM8976_VDDCX_AO 1 #define MSM8976_VDDCX_AO 1
...@@ -102,6 +124,18 @@ ...@@ -102,6 +124,18 @@
#define QCS404_LPIMX 5 #define QCS404_LPIMX 5
#define QCS404_LPIMX_VFL 6 #define QCS404_LPIMX_VFL 6
/* SDM660 Power Domains */
#define SDM660_VDDCX 0
#define SDM660_VDDCX_AO 1
#define SDM660_VDDCX_VFL 2
#define SDM660_VDDMX 3
#define SDM660_VDDMX_AO 4
#define SDM660_VDDMX_VFL 5
#define SDM660_SSCCX 6
#define SDM660_SSCCX_VFL 7
#define SDM660_SSCMX 8
#define SDM660_SSCMX_VFL 9
/* RPM SMD Power Domain performance levels */ /* RPM SMD Power Domain performance levels */
#define RPM_SMD_LEVEL_RETENTION 16 #define RPM_SMD_LEVEL_RETENTION 16
#define RPM_SMD_LEVEL_RETENTION_PLUS 32 #define RPM_SMD_LEVEL_RETENTION_PLUS 32
......
...@@ -48,7 +48,6 @@ struct geni_icc_path { ...@@ -48,7 +48,6 @@ struct geni_icc_path {
* @clk_perf_tbl: Table of clock frequency input to serial engine clock * @clk_perf_tbl: Table of clock frequency input to serial engine clock
* @icc_paths: Array of ICC paths for SE * @icc_paths: Array of ICC paths for SE
* @opp_table: Pointer to the OPP table * @opp_table: Pointer to the OPP table
* @has_opp_table: Specifies if the SE has an OPP table
*/ */
struct geni_se { struct geni_se {
void __iomem *base; void __iomem *base;
...@@ -59,7 +58,6 @@ struct geni_se { ...@@ -59,7 +58,6 @@ struct geni_se {
unsigned long *clk_perf_tbl; unsigned long *clk_perf_tbl;
struct geni_icc_path icc_paths[3]; struct geni_icc_path icc_paths[3];
struct opp_table *opp_table; struct opp_table *opp_table;
bool has_opp_table;
}; };
/* Common SE registers */ /* Common SE registers */
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#define LLCC_AUDIO 6 #define LLCC_AUDIO 6
#define LLCC_MDMHPGRW 7 #define LLCC_MDMHPGRW 7
#define LLCC_MDM 8 #define LLCC_MDM 8
#define LLCC_MODHW 9
#define LLCC_CMPT 10 #define LLCC_CMPT 10
#define LLCC_GPUHTW 11 #define LLCC_GPUHTW 11
#define LLCC_GPU 12 #define LLCC_GPU 12
...@@ -26,6 +27,11 @@ ...@@ -26,6 +27,11 @@
#define LLCC_MDMHPFX 20 #define LLCC_MDMHPFX 20
#define LLCC_MDMPNG 21 #define LLCC_MDMPNG 21
#define LLCC_AUDHW 22 #define LLCC_AUDHW 22
#define LLCC_NPU 23
#define LLCC_WLHW 24
#define LLCC_MODPE 29
#define LLCC_APTCM 30
#define LLCC_WRCACHE 31
/** /**
* llcc_slice_desc - Cache slice descriptor * llcc_slice_desc - Cache slice descriptor
......
...@@ -429,7 +429,7 @@ static const struct file_operations data_fops = { ...@@ -429,7 +429,7 @@ static const struct file_operations data_fops = {
.write = data_write, .write = data_write,
}; };
static struct qmi_msg_handler qmi_sample_handlers[] = { static const struct qmi_msg_handler qmi_sample_handlers[] = {
{ {
.type = QMI_RESPONSE, .type = QMI_RESPONSE,
.msg_id = TEST_PING_REQ_MSG_ID_V01, .msg_id = TEST_PING_REQ_MSG_ID_V01,
...@@ -571,7 +571,7 @@ static void qmi_sample_del_server(struct qmi_handle *qmi, ...@@ -571,7 +571,7 @@ static void qmi_sample_del_server(struct qmi_handle *qmi,
static struct qmi_handle lookup_client; static struct qmi_handle lookup_client;
static struct qmi_ops lookup_ops = { static const struct qmi_ops lookup_ops = {
.new_server = qmi_sample_new_server, .new_server = qmi_sample_new_server,
.del_server = qmi_sample_del_server, .del_server = qmi_sample_del_server,
}; };
......
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