Merge "ARM: dts: msm: change LDO regulator HPM current threshold for sdm845 BT"
diff --git a/arch/arm/boot/dts/qcom/sdxpoorwills-bus.dtsi b/arch/arm/boot/dts/qcom/sdxpoorwills-bus.dtsi
index 7819d26..e6dc45a 100644
--- a/arch/arm/boot/dts/qcom/sdxpoorwills-bus.dtsi
+++ b/arch/arm/boot/dts/qcom/sdxpoorwills-bus.dtsi
@@ -23,6 +23,9 @@
reg-names = "mc_virt-base", "mem_noc-base",
"system_noc-base", "ipa_virt-base";
+ mbox-names = "apps_rsc";
+ mboxes = <&apps_rsc 0>;
+
/*RSCs*/
rsc_apps: rsc-apps {
cell-id = <MSM_BUS_RSC_APPS>;
@@ -360,7 +363,7 @@
label = "mas-qhm-qpic";
qcom,buswidth = <4>;
qcom,agg-ports = <1>;
- qcom,connections = <&slv_qhs_aoss &slv_qns_aggre_noc>;
+ qcom,connections = <&slv_qns_aggre_noc>;
qcom,bus-dev = <&fab_system_noc>;
qcom,bcms = <&bcm_pn3>;
};
@@ -451,7 +454,7 @@
qcom,buswidth = <8>;
qcom,agg-ports = <1>;
qcom,qport = <1>;
- qcom,connections = <&slv_qhs_aoss &slv_qns_aggre_noc>;
+ qcom,connections = <&slv_qns_aggre_noc>;
qcom,bus-dev = <&fab_system_noc>;
qcom,bcms = <&bcm_ce>, <&bcm_pn5>;
qcom,ap-owned;
@@ -538,7 +541,7 @@
qcom,buswidth = <8>;
qcom,agg-ports = <1>;
qcom,qport = <8>;
- qcom,connections = <&slv_qhs_aoss &slv_qns_aggre_noc>;
+ qcom,connections = <&slv_qns_aggre_noc>;
qcom,bus-dev = <&fab_system_noc>;
qcom,bcms = <&bcm_pn1>;
qcom,ap-owned;
diff --git a/arch/arm/boot/dts/qcom/sdxpoorwills-thermal.dtsi b/arch/arm/boot/dts/qcom/sdxpoorwills-thermal.dtsi
index 2148cc9..65467f9 100644
--- a/arch/arm/boot/dts/qcom/sdxpoorwills-thermal.dtsi
+++ b/arch/arm/boot/dts/qcom/sdxpoorwills-thermal.dtsi
@@ -338,4 +338,39 @@
};
};
};
+
+ xo-therm-adc {
+ polling-delay-passive = <0>;
+ polling-delay = <0>;
+ thermal-sensors = <&pmxpoorwills_vadc 0x4c>;
+ thermal-governor = "user_space";
+ };
+
+ pa-therm1-adc {
+ polling-delay-passive = <0>;
+ polling-delay = <0>;
+ thermal-sensors = <&pmxpoorwills_vadc 0x4d>;
+ thermal-governor = "user_space";
+ };
+
+ pa-therm2-adc {
+ polling-delay-passive = <0>;
+ polling-delay = <0>;
+ thermal-sensors = <&pmxpoorwills_vadc 0x4e>;
+ thermal-governor = "user_space";
+ };
+
+ mdm-case-therm-adc {
+ polling-delay-passive = <0>;
+ polling-delay = <0>;
+ thermal-sensors = <&pmxpoorwills_vadc 0x4f>;
+ thermal-governor = "user_space";
+ };
+
+ ambient-therm-adc {
+ polling-delay-passive = <0>;
+ polling-delay = <0>;
+ thermal-sensors = <&pmxpoorwills_vadc 0x52>;
+ thermal-governor = "user_space";
+ };
};
diff --git a/arch/arm/configs/sdxpoorwills_defconfig b/arch/arm/configs/sdxpoorwills_defconfig
index 46eb60b..d0568aa 100644
--- a/arch/arm/configs/sdxpoorwills_defconfig
+++ b/arch/arm/configs/sdxpoorwills_defconfig
@@ -313,6 +313,8 @@
CONFIG_MSM_QMP=y
CONFIG_QCOM_SCM=y
CONFIG_MSM_BOOT_STATS=y
+CONFIG_QCOM_BUS_SCALING=y
+CONFIG_QCOM_BUS_CONFIG_RPMH=y
CONFIG_MSM_SMEM=y
CONFIG_MSM_GLINK=y
CONFIG_MSM_GLINK_LOOPBACK_SERVER=y
@@ -329,6 +331,7 @@
CONFIG_QCOM_COMMAND_DB=y
CONFIG_MSM_PM=y
CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y
+CONFIG_QCOM_DEVFREQ_DEVBW=y
CONFIG_IIO=y
CONFIG_PWM=y
CONFIG_PWM_QPNP=y
diff --git a/drivers/gpu/msm/a6xx_reg.h b/drivers/gpu/msm/a6xx_reg.h
index 5991cd5..e123555 100644
--- a/drivers/gpu/msm/a6xx_reg.h
+++ b/drivers/gpu/msm/a6xx_reg.h
@@ -982,37 +982,8 @@
/* ISENSE registers */
#define A6XX_GMU_ISENSE_CTRL 0x1F95D
-#define A6XX_GPU_CS_ENABLE_REG 0x23120
#define A6XX_GPU_GMU_CX_GMU_ISENSE_CTRL 0x1f95d
-#define A6XX_GPU_CS_AMP_CALIBRATION_CONTROL3 0x22d78
-#define A6XX_GPU_CS_AMP_CALIBRATION_CONTROL2 0x22d58
-#define A6XX_GPU_CS_A_SENSOR_CTRL_0 0x22d80
-#define A6XX_GPU_CS_A_SENSOR_CTRL_2 0x422da
-#define A6XX_GPU_CS_SENSOR_GENERAL_STATUS 0x2301a
-#define A6XX_GPU_CS_AMP_CALIBRATION_CONTROL1 0x23157
-#define A6XX_GPU_CS_SENSOR_GENERAL_STATUS 0x2301a
-#define A6XX_GPU_CS_AMP_CALIBRATION_STATUS1_0 0x2301d
-#define A6XX_GPU_CS_AMP_CALIBRATION_STATUS1_2 0x2301f
-#define A6XX_GPU_CS_AMP_CALIBRATION_STATUS1_4 0x23021
-#define A6XX_GPU_CS_AMP_CALIBRATION_DONE 0x23165
-#define A6XX_GPU_CS_AMP_PERIOD_CTRL 0x2316d
-#define A6XX_GPU_CS_AMP_CALIBRATION_DONE 0x23165
-
-#define CS_PWR_ON_STATUS (10)
-#define AMP_SW_WRM_TRIM_START (24)
-#define AMP_TRIM_TIMER (6)
-#define AMP_SW_TRIM_START (0)
-#define SS_AMPTRIM_DONE (11)
-#define AMP_OFFSET_CHECK_MIN_ERR (1)
-#define AMP_OFFSET_CHECK_MAX_ERR (2)
-#define AMP_OUT_OF_RANGE_ERR (4)
-#define TRIM_CNT_VALUE (1)
-#define RUNTIME_CNT_VALUE (16)
-#define TRIM_ENABLE (0)
-
-#define AMP_ERR (BIT(AMP_OFFSET_CHECK_MIN_ERR) || \
- BIT(AMP_OFFSET_CHECK_MAX_ERR) || \
- BIT(AMP_OUT_OF_RANGE_ERR))
+#define A6XX_GPU_CS_ENABLE_REG 0x23120
/* LM registers */
#define A6XX_GPU_GMU_CX_GMU_PWR_THRESHOLD 0x1F94D
diff --git a/drivers/gpu/msm/adreno-gpulist.h b/drivers/gpu/msm/adreno-gpulist.h
index 770cf3b..08cd06b 100644
--- a/drivers/gpu/msm/adreno-gpulist.h
+++ b/drivers/gpu/msm/adreno-gpulist.h
@@ -347,7 +347,7 @@
.minor = 0,
.patchid = ANY_ID,
.features = ADRENO_64BIT | ADRENO_RPMH | ADRENO_IFPC |
- ADRENO_GPMU | ADRENO_CONTENT_PROTECTION | ADRENO_LM |
+ ADRENO_GPMU | ADRENO_CONTENT_PROTECTION |
ADRENO_IOCOHERENT,
.sqefw_name = "a630_sqe.fw",
.zap_name = "a630_zap",
diff --git a/drivers/gpu/msm/adreno_a6xx.c b/drivers/gpu/msm/adreno_a6xx.c
index 83dd3fb..287ea206 100644
--- a/drivers/gpu/msm/adreno_a6xx.c
+++ b/drivers/gpu/msm/adreno_a6xx.c
@@ -43,6 +43,8 @@
#define A6XX_GPU_CX_REG_BASE 0x509E000
#define A6XX_GPU_CX_REG_SIZE 0x1000
+#define GPU_LIMIT_THRESHOLD_ENABLE BIT(31)
+
static int _load_gmu_firmware(struct kgsl_device *device);
static const struct adreno_vbif_data a630_vbif[] = {
@@ -758,6 +760,38 @@
a6xx_preemption_start(adreno_dev);
a6xx_protect_init(adreno_dev);
+
+ /*
+ * We start LM here because we want all the following to be up
+ * 1. GX HS
+ * 2. SPTPRAC
+ * 3. HFI
+ * At this point, we are guaranteed all.
+ */
+ if (ADRENO_FEATURE(adreno_dev, ADRENO_LM) &&
+ test_bit(ADRENO_LM_CTRL, &adreno_dev->pwrctrl_flag)) {
+ int result;
+ struct gmu_device *gmu = &device->gmu;
+ struct device *dev = &gmu->pdev->dev;
+
+ kgsl_gmu_regwrite(device, A6XX_GPU_GMU_CX_GMU_PWR_THRESHOLD,
+ GPU_LIMIT_THRESHOLD_ENABLE | lm_limit(adreno_dev));
+ kgsl_gmu_regwrite(device, A6XX_GMU_AO_SPARE_CNTL, 1);
+ kgsl_gmu_regwrite(device, A6XX_GPU_GMU_CX_GMU_ISENSE_CTRL, 0x1);
+
+ gmu->lm_config.lm_type = 1;
+ gmu->lm_config.lm_sensor_type = 1;
+ gmu->lm_config.throttle_config = 1;
+ gmu->lm_config.idle_throttle_en = 0;
+ gmu->lm_config.acd_en = 0;
+ gmu->bcl_config = 0;
+ gmu->lm_dcvs_level = 0;
+
+ result = hfi_send_lmconfig(gmu);
+ if (result)
+ dev_err(dev, "Failure enabling limits management (%d)\n",
+ result);
+ }
}
/*
@@ -1713,80 +1747,6 @@
return 0;
}
-#define KMASK(start, n) (GENMASK((start + n), (start)))
-
-static void isense_cold_trimm(struct kgsl_device *device)
-{
- unsigned int reg;
- struct gmu_device *gmu = &device->gmu;
-
- kgsl_gmu_regwrite(device, A6XX_GMU_AO_SPARE_CNTL, 1);
- kgsl_gmu_regwrite(device, A6XX_GPU_CS_AMP_CALIBRATION_DONE, 0);
-
- kgsl_gmu_regwrite(device, A6XX_GPU_GMU_CX_GMU_ISENSE_CTRL, 0x1);
- kgsl_gmu_regwrite(device, A6XX_GPU_CS_AMP_CALIBRATION_CONTROL3,
- 0x00000F8F);
- kgsl_gmu_regwrite(device, A6XX_GPU_CS_AMP_CALIBRATION_CONTROL2,
- 0x00705161);
- udelay(10);
- kgsl_gmu_regwrite(device, A6XX_GPU_CS_ENABLE_REG, 0x3);
- kgsl_gmu_regwrite(device, A6XX_GPU_CS_A_SENSOR_CTRL_0, 0x10040a);
- kgsl_gmu_regwrite(device, A6XX_GPU_CS_A_SENSOR_CTRL_2, 0x10040a);
-
- kgsl_gmu_regread(device, A6XX_GPU_CS_SENSOR_GENERAL_STATUS, ®);
- if ((reg & BIT(CS_PWR_ON_STATUS)) != (1 << CS_PWR_ON_STATUS)) {
- dev_err(&gmu->pdev->dev, "ERROR - ISENSE power-up\n");
- return;
- }
-
- kgsl_gmu_regrmw(device, A6XX_GPU_CS_AMP_CALIBRATION_CONTROL1,
- KMASK(AMP_TRIM_TIMER, 15), 70 << AMP_TRIM_TIMER);
- kgsl_gmu_regrmw(device, A6XX_GPU_CS_AMP_CALIBRATION_CONTROL1,
- KMASK(AMP_SW_TRIM_START, 1), 0 << AMP_SW_TRIM_START);
- kgsl_gmu_regrmw(device, A6XX_GPU_CS_AMP_CALIBRATION_CONTROL1,
- KMASK(AMP_SW_TRIM_START, 1), 1 << AMP_SW_TRIM_START);
-
- if (timed_poll_check(device, A6XX_GPU_CS_SENSOR_GENERAL_STATUS,
- BIT(SS_AMPTRIM_DONE), GMU_START_TIMEOUT,
- BIT(SS_AMPTRIM_DONE))) {
- dev_err(&gmu->pdev->dev, "ISENSE SS_AMPTRIM failure\n");
- return;
- }
-
- kgsl_gmu_regread(device, A6XX_GPU_CS_AMP_CALIBRATION_STATUS1_0, ®);
- if (reg & AMP_ERR) {
- kgsl_gmu_regread(device, A6XX_GPU_CS_AMP_CALIBRATION_STATUS1_0,
- ®);
- dev_err(&gmu->pdev->dev,
- "ISENSE ERROR:trimming GX 0x%08x\n", reg);
- return;
- }
-
- kgsl_gmu_regread(device, A6XX_GPU_CS_AMP_CALIBRATION_STATUS1_2, ®);
- if (reg & AMP_ERR) {
- kgsl_gmu_regread(device, A6XX_GPU_CS_AMP_CALIBRATION_STATUS1_2,
- ®);
- dev_err(&gmu->pdev->dev,
- "ISENSE ERROR:trimming SPTPRAC 0x%08x\n", reg);
- return;
- }
-
- kgsl_gmu_regwrite(device, A6XX_GPU_CS_AMP_CALIBRATION_DONE, 1);
- kgsl_gmu_regrmw(device, A6XX_GPU_CS_AMP_PERIOD_CTRL,
- KMASK(TRIM_CNT_VALUE, 13), 20 << TRIM_CNT_VALUE);
- kgsl_gmu_regrmw(device, A6XX_GPU_CS_AMP_PERIOD_CTRL,
- KMASK(RUNTIME_CNT_VALUE, 9), 50 << RUNTIME_CNT_VALUE);
-
- kgsl_gmu_regrmw(device, A6XX_GPU_CS_AMP_PERIOD_CTRL,
- KMASK(TRIM_ENABLE, 1), 1 << TRIM_ENABLE);
- udelay(4);
- kgsl_gmu_regrmw(device, A6XX_GPU_CS_AMP_PERIOD_CTRL,
- KMASK(TRIM_ENABLE, 1), 0 << TRIM_ENABLE);
- kgsl_gmu_regwrite(device, A6XX_GPU_CS_AMP_CALIBRATION_DONE, 1);
-
-}
-
-#define GPU_LIMIT_THRESHOLD_ENABLE BIT(31)
/*
* a6xx_gmu_fw_start() - set up GMU and start FW
* @device: Pointer to KGSL device
@@ -1867,13 +1827,6 @@
kgsl_gmu_regwrite(device, A6XX_GMU_HFI_SFR_ADDR, chipid);
- if (ADRENO_FEATURE(adreno_dev, ADRENO_LM) &&
- test_bit(ADRENO_LM_CTRL, &adreno_dev->pwrctrl_flag)) {
- kgsl_gmu_regwrite(device, A6XX_GPU_GMU_CX_GMU_PWR_THRESHOLD,
- GPU_LIMIT_THRESHOLD_ENABLE | lm_limit(adreno_dev));
- isense_cold_trimm(device);
- }
-
/* Configure power control and bring the GMU out of reset */
a6xx_gmu_power_config(device);
ret = a6xx_gmu_start(device);
diff --git a/drivers/gpu/msm/kgsl_hfi.c b/drivers/gpu/msm/kgsl_hfi.c
index 3a5b489..daac9f1 100644
--- a/drivers/gpu/msm/kgsl_hfi.c
+++ b/drivers/gpu/msm/kgsl_hfi.c
@@ -611,24 +611,6 @@
if (result)
return result;
- if (ADRENO_FEATURE(adreno_dev, ADRENO_LM) &&
- test_bit(ADRENO_LM_CTRL, &adreno_dev->pwrctrl_flag)) {
- gmu->lm_config.lm_type = 1;
- gmu->lm_config.lm_sensor_type = 1;
- gmu->lm_config.throttle_config = 1;
- gmu->lm_config.idle_throttle_en = 0;
- gmu->lm_config.acd_en = 0;
- gmu->bcl_config = 0;
- gmu->lm_dcvs_level = 0;
-
- result = hfi_send_lmconfig(gmu);
- if (result) {
- dev_err(dev, "Failure enabling LM (%d)\n",
- result);
- return result;
- }
- }
-
/* Tell the GMU we are sending no more HFIs until the next boot */
if (ADRENO_QUIRK(adreno_dev, ADRENO_QUIRK_HFI_USE_REG)) {
result = hfi_send_test(gmu);
diff --git a/drivers/gpu/msm/kgsl_hfi.h b/drivers/gpu/msm/kgsl_hfi.h
index 105599c..b24509d 100644
--- a/drivers/gpu/msm/kgsl_hfi.h
+++ b/drivers/gpu/msm/kgsl_hfi.h
@@ -360,4 +360,5 @@
uint32_t bw_idx, enum rpm_ack_type ack_type);
int hfi_notify_slumber(struct gmu_device *gmu, uint32_t init_perf_idx,
uint32_t init_bw_idx);
+int hfi_send_lmconfig(struct gmu_device *gmu);
#endif /* __KGSL_HFI_H */
diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_pm.c b/drivers/platform/msm/ipa/ipa_v3/ipa_pm.c
index 3bf0327..be342cb 100644
--- a/drivers/platform/msm/ipa/ipa_v3/ipa_pm.c
+++ b/drivers/platform/msm/ipa/ipa_v3/ipa_pm.c
@@ -1030,8 +1030,9 @@
client->state);
spin_unlock_irqrestore(&client->state_lock, flags);
} else if (client->state ==
- IPA_PM_ACTIVATED_PENDING_DEACTIVATION ||
- IPA_PM_ACTIVATED_PENDING_RESCHEDULE) {
+ IPA_PM_ACTIVATED_PENDING_DEACTIVATION ||
+ client->state ==
+ IPA_PM_ACTIVATED_PENDING_RESCHEDULE) {
run_algorithm = true;
client->state = IPA_PM_DEACTIVATED;
IPA_PM_DBG_STATE(client->hdl, client->name,
diff --git a/drivers/platform/msm/usb_bam.c b/drivers/platform/msm/usb_bam.c
index 93121df..95e3782 100644
--- a/drivers/platform/msm/usb_bam.c
+++ b/drivers/platform/msm/usb_bam.c
@@ -321,10 +321,18 @@
struct usb_bam_ctx_type *ctx = &msm_usb_bam[pipe_connect->bam_type];
struct sps_mem_buffer *data_buf = &(pipe_connect->data_mem_buf);
struct sps_mem_buffer *desc_buf = &(pipe_connect->desc_mem_buf);
+ struct device *dev = &ctx->usb_bam_pdev->dev;
+ struct sg_table data_sgt, desc_sgt;
+ dma_addr_t data_iova, desc_iova;
+ u32 data_fifo_size;
pr_debug("%s: data_fifo size:%x desc_fifo_size:%x\n",
__func__, pipe_connect->data_fifo_size,
pipe_connect->desc_fifo_size);
+
+ if (dev->parent)
+ dev = dev->parent;
+
switch (pipe_connect->mem_type) {
case SPS_PIPE_MEM:
log_event_dbg("%s: USB BAM using SPS pipe memory\n", __func__);
@@ -366,7 +374,16 @@
ret = -ENOMEM;
goto err_exit;
}
+
memset_io(data_buf->base, 0, data_buf->size);
+ data_buf->iova = dma_map_resource(dev, data_buf->phys_base,
+ data_buf->size, DMA_BIDIRECTIONAL, 0);
+ if (dma_mapping_error(dev, data_buf->iova))
+ log_event_err("%s(): oci_mem: err mapping data_buf\n",
+ __func__);
+ log_event_dbg("%s: data_buf:%s virt:%pK, phys:%lx, iova:%lx\n",
+ __func__, dev_name(dev), data_buf->base,
+ (unsigned long)data_buf->phys_base, data_buf->iova);
desc_buf->phys_base = pipe_connect->desc_fifo_base_offset +
ctx->usb_bam_data->usb_bam_fifo_baseaddr;
@@ -380,6 +397,16 @@
goto err_exit;
}
memset_io(desc_buf->base, 0, desc_buf->size);
+ desc_buf->iova = dma_map_resource(dev, desc_buf->phys_base,
+ desc_buf->size,
+ DMA_BIDIRECTIONAL, 0);
+ if (dma_mapping_error(dev, desc_buf->iova))
+ log_event_err("%s(): oci_mem: err mapping desc_buf\n",
+ __func__);
+
+ log_event_dbg("%s: desc_buf:%s virt:%pK, phys:%lx, iova:%lx\n",
+ __func__, dev_name(dev), desc_buf->base,
+ (unsigned long)desc_buf->phys_base, desc_buf->iova);
break;
case SYSTEM_MEM:
log_event_dbg("%s: USB BAM using system memory\n", __func__);
@@ -391,56 +418,57 @@
}
/* BAM would use system memory, allocate FIFOs */
- data_buf->size = pipe_connect->data_fifo_size;
+ data_fifo_size = data_buf->size = pipe_connect->data_fifo_size;
/* On platforms which use CI controller, USB HW can fetch
* additional 128 bytes at the end of circular buffer when
* AXI prefetch is enabled and hence requirement is to
* allocate 512 bytes more than required length.
*/
if (pipe_connect->bam_type == CI_CTRL)
- data_buf->base =
- dma_alloc_coherent(&ctx->usb_bam_pdev->dev,
- (pipe_connect->data_fifo_size +
- DATA_FIFO_EXTRA_MEM_ALLOC_SIZE),
- &(data_buf->phys_base),
- GFP_KERNEL);
- else
- data_buf->base =
- dma_alloc_coherent(&ctx->usb_bam_pdev->dev,
- pipe_connect->data_fifo_size,
- &(data_buf->phys_base),
- GFP_KERNEL);
+ data_fifo_size += DATA_FIFO_EXTRA_MEM_ALLOC_SIZE;
+
+ data_buf->base = dma_alloc_attrs(dev, data_fifo_size,
+ &data_iova, GFP_KERNEL,
+ DMA_ATTR_FORCE_CONTIGUOUS);
if (!data_buf->base) {
- log_event_err("%s: dma_alloc_coherent failed for data fifo\n",
+ log_event_err("%s: data_fifo: dma_alloc_attr failed\n",
__func__);
ret = -ENOMEM;
goto err_exit;
}
memset(data_buf->base, 0, pipe_connect->data_fifo_size);
+ data_buf->iova = data_iova;
+ dma_get_sgtable(dev, &data_sgt, data_buf->base, data_buf->iova,
+ data_fifo_size);
+ data_buf->phys_base = page_to_phys(sg_page(data_sgt.sgl));
+ sg_free_table(&data_sgt);
+ log_event_dbg("%s: data_buf:%s virt:%pK, phys:%lx, iova:%lx\n",
+ __func__, dev_name(dev), data_buf->base,
+ (unsigned long)data_buf->phys_base, data_buf->iova);
+
desc_buf->size = pipe_connect->desc_fifo_size;
- desc_buf->base = dma_alloc_coherent(&ctx->usb_bam_pdev->dev,
- pipe_connect->desc_fifo_size,
- &(desc_buf->phys_base),
- GFP_KERNEL);
+ desc_buf->base = dma_alloc_attrs(dev,
+ pipe_connect->desc_fifo_size,
+ &desc_iova, GFP_KERNEL,
+ DMA_ATTR_FORCE_CONTIGUOUS);
if (!desc_buf->base) {
- log_event_err("%s: dma_alloc_coherent failed for desc fifo\n",
+ log_event_err("%s: desc_fifo: dma_alloc_attr failed\n",
__func__);
- if (pipe_connect->bam_type == CI_CTRL)
- dma_free_coherent(&ctx->usb_bam_pdev->dev,
- (pipe_connect->data_fifo_size +
- DATA_FIFO_EXTRA_MEM_ALLOC_SIZE),
- data_buf->base,
- data_buf->phys_base);
- else
- dma_free_coherent(&ctx->usb_bam_pdev->dev,
- pipe_connect->data_fifo_size,
- data_buf->base,
- data_buf->phys_base);
+ dma_free_attrs(dev, data_fifo_size, data_buf->base,
+ data_buf->iova, DMA_ATTR_FORCE_CONTIGUOUS);
ret = -ENOMEM;
goto err_exit;
}
memset(desc_buf->base, 0, pipe_connect->desc_fifo_size);
+ desc_buf->iova = desc_iova;
+ dma_get_sgtable(dev, &desc_sgt, desc_buf->base, desc_buf->iova,
+ desc_buf->size);
+ desc_buf->phys_base = page_to_phys(sg_page(desc_sgt.sgl));
+ sg_free_table(&desc_sgt);
+ log_event_dbg("%s: desc_buf:%s virt:%pK, phys:%lx, iova:%lx\n",
+ __func__, dev_name(dev), desc_buf->base,
+ (unsigned long)desc_buf->phys_base, desc_buf->iova);
break;
default:
log_event_err("%s: invalid mem type\n", __func__);
@@ -476,35 +504,40 @@
&ctx->usb_bam_connections[idx];
struct sps_connect *sps_connection =
&ctx->usb_bam_sps.sps_connections[idx];
+ struct device *dev = &ctx->usb_bam_pdev->dev;
+ u32 data_fifo_size;
pr_debug("%s(): data size:%x desc size:%x\n",
__func__, sps_connection->data.size,
sps_connection->desc.size);
+ if (dev->parent)
+ dev = dev->parent;
+
switch (pipe_connect->mem_type) {
case SYSTEM_MEM:
log_event_dbg("%s: Freeing system memory used by PIPE\n",
__func__);
- if (sps_connection->data.phys_base) {
+ if (sps_connection->data.iova) {
+ data_fifo_size = sps_connection->data.size;
if (cur_bam == CI_CTRL)
- dma_free_coherent(&ctx->usb_bam_pdev->dev,
- (sps_connection->data.size +
- DATA_FIFO_EXTRA_MEM_ALLOC_SIZE),
+ data_fifo_size +=
+ DATA_FIFO_EXTRA_MEM_ALLOC_SIZE;
+
+ dma_free_attrs(dev, data_fifo_size,
sps_connection->data.base,
- sps_connection->data.phys_base);
- else
- dma_free_coherent(&ctx->usb_bam_pdev->dev,
- sps_connection->data.size,
- sps_connection->data.base,
- sps_connection->data.phys_base);
+ sps_connection->data.iova,
+ DMA_ATTR_FORCE_CONTIGUOUS);
+ sps_connection->data.iova = 0;
sps_connection->data.phys_base = 0;
pipe_connect->data_mem_buf.base = NULL;
}
- if (sps_connection->desc.phys_base) {
- dma_free_coherent(&ctx->usb_bam_pdev->dev,
- sps_connection->desc.size,
+ if (sps_connection->desc.iova) {
+ dma_free_attrs(dev, sps_connection->desc.size,
sps_connection->desc.base,
- sps_connection->desc.phys_base);
+ sps_connection->desc.iova,
+ DMA_ATTR_FORCE_CONTIGUOUS);
+ sps_connection->desc.iova = 0;
sps_connection->desc.phys_base = 0;
pipe_connect->desc_mem_buf.base = NULL;
}
@@ -512,11 +545,25 @@
case OCI_MEM:
log_event_dbg("Freeing oci memory used by BAM PIPE\n");
if (sps_connection->data.base) {
+ if (sps_connection->data.iova) {
+ dma_unmap_resource(dev,
+ sps_connection->data.iova,
+ sps_connection->data.size,
+ DMA_BIDIRECTIONAL, 0);
+ sps_connection->data.iova = 0;
+ }
iounmap(sps_connection->data.base);
sps_connection->data.base = NULL;
pipe_connect->data_mem_buf.base = NULL;
}
if (sps_connection->desc.base) {
+ if (sps_connection->desc.iova) {
+ dma_unmap_resource(dev,
+ sps_connection->desc.iova,
+ sps_connection->desc.size,
+ DMA_BIDIRECTIONAL, 0);
+ sps_connection->desc.iova = 0;
+ }
iounmap(sps_connection->desc.base);
sps_connection->desc.base = NULL;
pipe_connect->desc_mem_buf.base = NULL;
@@ -530,7 +577,8 @@
return 0;
}
-static int connect_pipe(enum usb_ctrl cur_bam, u8 idx, u32 *usb_pipe_idx)
+static int connect_pipe(enum usb_ctrl cur_bam, u8 idx, u32 *usb_pipe_idx,
+ unsigned long iova)
{
int ret;
struct usb_bam_ctx_type *ctx = &msm_usb_bam[cur_bam];
@@ -575,9 +623,11 @@
if (dir == USB_TO_PEER_PERIPHERAL) {
sps_connection->mode = SPS_MODE_SRC;
*usb_pipe_idx = pipe_connect->src_pipe_index;
+ sps_connection->dest_iova = iova;
} else {
sps_connection->mode = SPS_MODE_DEST;
*usb_pipe_idx = pipe_connect->dst_pipe_index;
+ sps_connection->source_iova = iova;
}
sps_connection->data = *data_buf;
@@ -1059,7 +1109,34 @@
return 0;
}
-int usb_bam_connect(enum usb_ctrl cur_bam, int idx, u32 *bam_pipe_idx)
+int get_qdss_bam_info(enum usb_ctrl cur_bam, u8 idx,
+ phys_addr_t *p_addr, u32 *bam_size)
+{
+ int ret = 0;
+ struct usb_bam_ctx_type *ctx = &msm_usb_bam[cur_bam];
+ struct usb_bam_pipe_connect *pipe_connect =
+ &ctx->usb_bam_connections[idx];
+ unsigned long peer_bam_handle;
+
+ ret = sps_phy2h(pipe_connect->dst_phy_addr, &peer_bam_handle);
+ if (ret) {
+ log_event_err("%s: sps_phy2h failed (src BAM) %d\n",
+ __func__, ret);
+ return ret;
+ }
+
+ ret = sps_get_bam_addr(peer_bam_handle, p_addr, bam_size);
+ if (ret) {
+ log_event_err("%s: sps_get_bam_addr failed%d\n",
+ __func__, ret);
+ return ret;
+ }
+
+ return 0;
+}
+
+int usb_bam_connect(enum usb_ctrl cur_bam, int idx, u32 *bam_pipe_idx,
+ unsigned long iova)
{
int ret;
struct usb_bam_ctx_type *ctx = &msm_usb_bam[cur_bam];
@@ -1110,7 +1187,7 @@
/* Set the BAM mode (host/device) according to connected pipe */
info[cur_bam].cur_bam_mode = pipe_connect->bam_mode;
- ret = connect_pipe(cur_bam, idx, bam_pipe_idx);
+ ret = connect_pipe(cur_bam, idx, bam_pipe_idx, iova);
if (ret) {
log_event_err("%s: pipe connection[%d] failure\n",
__func__, idx);
@@ -3024,6 +3101,7 @@
struct usb_bam_ctx_type *ctx = dev_get_drvdata(&pdev->dev);
enum usb_ctrl bam_type = ctx->usb_bam_data->bam_type;
struct sps_bam_props props;
+ struct device *dev;
memset(&props, 0, sizeof(props));
@@ -3059,8 +3137,16 @@
pr_debug("Register and enable HSUSB BAM\n");
props.options |= SPS_BAM_OPT_ENABLE_AT_BOOT;
}
- ret = sps_register_bam_device(&props, &ctx->h_bam);
+ dev = &ctx->usb_bam_pdev->dev;
+ if (dev && dev->parent && !device_property_present(dev->parent,
+ "qcom,smmu-s1-bypass")) {
+ pr_info("%s: setting SPS_BAM_SMMU_EN flag with (%s)\n",
+ __func__, dev_name(dev));
+ props.options |= SPS_BAM_SMMU_EN;
+ }
+
+ ret = sps_register_bam_device(&props, &ctx->h_bam);
if (ret < 0) {
log_event_err("%s: register bam error %d\n", __func__, ret);
return -EFAULT;
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index a6bc1da..8060142 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -6146,7 +6146,7 @@
out:
ufshcd_scsi_unblock_requests(hba);
- pm_runtime_put_sync(hba->dev);
+ pm_runtime_put(hba->dev);
return;
}
diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c
index 720ac31..c1103c7 100644
--- a/drivers/staging/android/ion/ion.c
+++ b/drivers/staging/android/ion/ion.c
@@ -1523,6 +1523,11 @@
}
buffer = dmabuf->priv;
+ if (!is_buffer_hlos_assigned(buffer)) {
+ pr_err("%s: cannot sync a secure dmabuf\n", __func__);
+ dma_buf_put(dmabuf);
+ return -EINVAL;
+ }
dma_sync_sg_for_device(NULL, buffer->sg_table->sgl,
buffer->sg_table->nents, DMA_BIDIRECTIONAL);
dma_buf_put(dmabuf);
diff --git a/drivers/staging/android/ion/msm/msm_ion.c b/drivers/staging/android/ion/msm/msm_ion.c
index c7b58ce..f868336 100644
--- a/drivers/staging/android/ion/msm/msm_ion.c
+++ b/drivers/staging/android/ion/msm/msm_ion.c
@@ -340,7 +340,7 @@
if (!ION_IS_CACHED(flags))
return 0;
- if (flags & ION_FLAG_SECURE)
+ if (!is_buffer_hlos_assigned(ion_handle_buffer(handle)))
return 0;
table = ion_sg_table(client, handle);
@@ -675,6 +675,20 @@
return -EINVAL;
}
+bool is_buffer_hlos_assigned(struct ion_buffer *buffer)
+{
+ bool is_hlos = false;
+
+ if (buffer->heap->type == (enum ion_heap_type)ION_HEAP_TYPE_HYP_CMA &&
+ (buffer->flags & ION_FLAG_CP_HLOS))
+ is_hlos = true;
+
+ if (get_secure_vmid(buffer->flags) <= 0)
+ is_hlos = true;
+
+ return is_hlos;
+}
+
int get_vmid(unsigned long flags)
{
int vmid;
@@ -751,9 +765,9 @@
down_read(&mm->mmap_sem);
- start = (unsigned long)data.flush_data.vaddr;
- end = (unsigned long)data.flush_data.vaddr
- + data.flush_data.length;
+ start = (unsigned long)data.flush_data.vaddr +
+ data.flush_data.offset;
+ end = start + data.flush_data.length;
if (check_vaddr_bounds(start, end)) {
pr_err("%s: virtual address %pK is out of bounds\n",
diff --git a/drivers/staging/android/ion/msm/msm_ion.h b/drivers/staging/android/ion/msm/msm_ion.h
index 741d017..ad7b1c5 100644
--- a/drivers/staging/android/ion/msm/msm_ion.h
+++ b/drivers/staging/android/ion/msm/msm_ion.h
@@ -174,6 +174,8 @@
void *vaddr, unsigned int offset, unsigned long len,
unsigned int cmd);
+bool is_buffer_hlos_assigned(struct ion_buffer *buffer);
+
#else
static inline struct ion_client *msm_ion_client_create(const char *name)
{
@@ -202,6 +204,10 @@
return -ENODEV;
}
+static bool is_buffer_hlos_assigned(struct ion_buffer *buffer)
+{
+ return true;
+}
#endif /* CONFIG_ION */
#endif
diff --git a/drivers/staging/android/lowmemorykiller.c b/drivers/staging/android/lowmemorykiller.c
index 8d67f76..4747949 100644
--- a/drivers/staging/android/lowmemorykiller.c
+++ b/drivers/staging/android/lowmemorykiller.c
@@ -221,6 +221,22 @@
return 0;
}
+static int test_task_state(struct task_struct *p, int state)
+{
+ struct task_struct *t;
+
+ for_each_thread(p, t) {
+ task_lock(t);
+ if (t->state & state) {
+ task_unlock(t);
+ return 1;
+ }
+ task_unlock(t);
+ }
+
+ return 0;
+}
+
static int test_task_lmk_waiting(struct task_struct *p)
{
struct task_struct *t;
@@ -435,7 +451,7 @@
int other_free;
int other_file;
- if (mutex_lock_interruptible(&scan_mutex) < 0)
+ if (!mutex_trylock(&scan_mutex))
return 0;
other_free = global_page_state(NR_FREE_PAGES) - totalreserve_pages;
@@ -495,8 +511,6 @@
if (time_before_eq(jiffies, lowmem_deathpending_timeout)) {
if (test_task_lmk_waiting(tsk)) {
rcu_read_unlock();
- /* give the system time to free up the memory */
- msleep_interruptible(20);
mutex_unlock(&scan_mutex);
return 0;
}
@@ -533,6 +547,16 @@
long cache_limit = minfree * (long)(PAGE_SIZE / 1024);
long free = other_free * (long)(PAGE_SIZE / 1024);
+ if (test_task_lmk_waiting(selected) &&
+ (test_task_state(selected, TASK_UNINTERRUPTIBLE))) {
+ lowmem_print(2, "'%s' (%d) is already killed\n",
+ selected->comm,
+ selected->pid);
+ rcu_read_unlock();
+ mutex_unlock(&scan_mutex);
+ return 0;
+ }
+
task_lock(selected);
send_sig(SIGKILL, selected, 0);
if (selected->mm)
diff --git a/drivers/tty/serial/msm_geni_serial.c b/drivers/tty/serial/msm_geni_serial.c
index 67a71ba..0ce23c3 100644
--- a/drivers/tty/serial/msm_geni_serial.c
+++ b/drivers/tty/serial/msm_geni_serial.c
@@ -1286,6 +1286,8 @@
geni_se_rx_dma_unprep(msm_port->wrapper_dev, msm_port->rx_dma,
DMA_RX_BUF_SIZE);
+ msm_port->rx_dma = (dma_addr_t)NULL;
+
rx_bytes = geni_read_reg_nolog(uport->membase, SE_DMA_RX_LEN_IN);
if (unlikely(!msm_port->rx_buf)) {
IPC_LOG_MSG(msm_port->ipc_log_rx, "%s: NULL Rx_buf\n",
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 64ed834..719fcbf 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -1173,6 +1173,9 @@
device_property_read_u32(dev, "snps,xhci-imod-value",
&dwc->xhci_imod_value);
+ dwc->core_id = -1;
+ device_property_read_u32(dev, "usb-core-id", &dwc->core_id);
+
dwc->usb3_lpm_capable = device_property_read_bool(dev,
"snps,usb3_lpm_capable");
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index 68a40f9..a8400dd 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -954,6 +954,7 @@
* increments or 0 to disable.
* @create_reg_debugfs: create debugfs entry to allow dwc3 register dump
* @xhci_imod_value: imod value to use with xhci
+ * @core_id: usb core id to differentiate different controller
*/
struct dwc3 {
struct usb_ctrlrequest *ctrl_req;
@@ -1150,6 +1151,7 @@
struct dwc3_gadget_events dbg_gadget_events;
bool create_reg_debugfs;
u32 xhci_imod_value;
+ int core_id;
};
/* -------------------------------------------------------------------------- */
diff --git a/drivers/usb/dwc3/dbm.c b/drivers/usb/dwc3/dbm.c
index 3860a1a..44c082a 100644
--- a/drivers/usb/dwc3/dbm.c
+++ b/drivers/usb/dwc3/dbm.c
@@ -450,7 +450,7 @@
}
-int dbm_data_fifo_config(struct dbm *dbm, u8 dep_num, phys_addr_t addr,
+int dbm_data_fifo_config(struct dbm *dbm, u8 dep_num, unsigned long addr,
u32 size, u8 dst_pipe_idx)
{
u8 dbm_ep = dst_pipe_idx;
diff --git a/drivers/usb/dwc3/dbm.h b/drivers/usb/dwc3/dbm.h
index 260afc2..d8e1ce9 100644
--- a/drivers/usb/dwc3/dbm.h
+++ b/drivers/usb/dwc3/dbm.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2015, 2017 The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -63,7 +63,7 @@
int dbm_get_num_of_eps_configured(struct dbm *dbm);
int dbm_event_buffer_config(struct dbm *dbm, u32 addr_lo, u32 addr_hi,
int size);
-int dbm_data_fifo_config(struct dbm *dbm, u8 dep_num, phys_addr_t addr,
+int dbm_data_fifo_config(struct dbm *dbm, u8 dep_num, unsigned long addr,
u32 size, u8 dst_pipe_idx);
void dbm_set_speed(struct dbm *dbm, bool speed);
void dbm_enable(struct dbm *dbm);
diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c
index b022e54..5c70da8 100644
--- a/drivers/usb/dwc3/dwc3-msm.c
+++ b/drivers/usb/dwc3/dwc3-msm.c
@@ -461,7 +461,7 @@
* @size - size of data fifo.
*
*/
-int msm_data_fifo_config(struct usb_ep *ep, phys_addr_t addr,
+int msm_data_fifo_config(struct usb_ep *ep, unsigned long addr,
u32 size, u8 dst_pipe_idx)
{
struct dwc3_ep *dep = to_dwc3_ep(ep);
diff --git a/drivers/usb/dwc3/host.c b/drivers/usb/dwc3/host.c
index 3f79aa4..8b159c3 100644
--- a/drivers/usb/dwc3/host.c
+++ b/drivers/usb/dwc3/host.c
@@ -52,7 +52,7 @@
return irq;
}
-#define NUMBER_OF_PROPS 4
+#define NUMBER_OF_PROPS 5
int dwc3_host_init(struct dwc3 *dwc)
{
struct property_entry props[NUMBER_OF_PROPS];
@@ -62,6 +62,7 @@
struct platform_device *dwc3_pdev = to_platform_device(dwc->dev);
int prop_idx = 0;
struct property_entry imod_prop;
+ struct property_entry core_id_prop;
irq = dwc3_host_get_irq(dwc);
if (irq < 0)
@@ -112,6 +113,15 @@
props[prop_idx++] = imod_prop;
}
+ if (dwc->core_id >= 0) {
+ core_id_prop.name = "usb-core-id";
+ core_id_prop.length = sizeof(u32);
+ core_id_prop.is_string = false;
+ core_id_prop.is_array = false;
+ core_id_prop.value.u32_data = dwc->core_id;
+ props[prop_idx++] = core_id_prop;
+ }
+
/**
* WORKAROUND: dwc3 revisions <=3.00a have a limitation
* where Port Disable command doesn't work.
diff --git a/drivers/usb/gadget/function/f_qdss.h b/drivers/usb/gadget/function/f_qdss.h
index 4ba2e9b..72edb90 100644
--- a/drivers/usb/gadget/function/f_qdss.h
+++ b/drivers/usb/gadget/function/f_qdss.h
@@ -31,6 +31,9 @@
u32 peer_pipe_idx;
unsigned long usb_bam_handle;
struct sps_mem_buffer *data_fifo;
+ unsigned long qdss_bam_iova;
+ phys_addr_t qdss_bam_phys;
+ u32 qdss_bam_size;
};
struct gqdss {
diff --git a/drivers/usb/gadget/function/u_qdss.c b/drivers/usb/gadget/function/u_qdss.c
index 06eecd1..b4353ac 100644
--- a/drivers/usb/gadget/function/u_qdss.c
+++ b/drivers/usb/gadget/function/u_qdss.c
@@ -47,6 +47,8 @@
int idx;
struct usb_qdss_bam_connect_info bam_info;
struct usb_gadget *gadget;
+ struct device *dev;
+ int ret;
pr_debug("set_qdss_data_connection\n");
@@ -57,6 +59,7 @@
gadget = qdss->gadget;
usb_bam_type = usb_bam_get_bam_type(gadget->name);
+ dev = gadget->dev.parent;
bam_info = qdss->bam_info;
/* There is only one qdss pipe, so the pipe number can be set to 0 */
@@ -68,6 +71,23 @@
}
if (enable) {
+ ret = get_qdss_bam_info(usb_bam_type, idx,
+ &bam_info.qdss_bam_phys,
+ &bam_info.qdss_bam_size);
+ if (ret) {
+ pr_err("%s(): failed to get qdss bam info err(%d)\n",
+ __func__, ret);
+ return ret;
+ }
+
+ bam_info.qdss_bam_iova = dma_map_resource(dev->parent,
+ bam_info.qdss_bam_phys, bam_info.qdss_bam_size,
+ DMA_BIDIRECTIONAL, 0);
+ if (!bam_info.qdss_bam_iova) {
+ pr_err("dma_map_resource failed\n");
+ return -ENOMEM;
+ }
+
usb_bam_alloc_fifos(usb_bam_type, idx);
bam_info.data_fifo =
kzalloc(sizeof(struct sps_mem_buffer), GFP_KERNEL);
@@ -76,25 +96,34 @@
usb_bam_free_fifos(usb_bam_type, idx);
return -ENOMEM;
}
+
+ pr_debug("%s(): qdss_bam: iova:%lx p_addr:%lx size:%x\n",
+ __func__, bam_info.qdss_bam_iova,
+ (unsigned long)bam_info.qdss_bam_phys,
+ bam_info.qdss_bam_size);
+
get_bam2bam_connection_info(usb_bam_type, idx,
&bam_info.usb_bam_pipe_idx,
NULL, bam_info.data_fifo, NULL);
alloc_sps_req(qdss->port.data);
msm_data_fifo_config(qdss->port.data,
- bam_info.data_fifo->phys_base,
- bam_info.data_fifo->size,
- bam_info.usb_bam_pipe_idx);
+ bam_info.data_fifo->iova,
+ bam_info.data_fifo->size,
+ bam_info.usb_bam_pipe_idx);
init_data(qdss->port.data);
res = usb_bam_connect(usb_bam_type, idx,
- &(bam_info.usb_bam_pipe_idx));
+ &(bam_info.usb_bam_pipe_idx),
+ bam_info.qdss_bam_iova);
} else {
- kfree(bam_info.data_fifo);
res = usb_bam_disconnect_pipe(usb_bam_type, idx);
if (res)
pr_err("usb_bam_disconnection error\n");
+ dma_unmap_resource(dev->parent, bam_info.qdss_bam_iova,
+ bam_info.qdss_bam_size, DMA_BIDIRECTIONAL, 0);
usb_bam_free_fifos(usb_bam_type, idx);
+ kfree(bam_info.data_fifo);
}
return res;
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
index 588546a..c7596a7 100644
--- a/drivers/usb/host/xhci-plat.c
+++ b/drivers/usb/host/xhci-plat.c
@@ -220,7 +220,15 @@
* 3. xhci_plat is grandchild of a pci device (dwc3-pci)
*/
sysdev = &pdev->dev;
- if (sysdev->parent && !sysdev->of_node && sysdev->parent->of_node)
+ /*
+ * If sysdev->parent->parent is available and part of IOMMU group
+ * (indicating possible usage of SMMU enablement), then use
+ * sysdev->parent->parent as sysdev.
+ */
+ if (sysdev->parent && !sysdev->of_node && sysdev->parent->of_node &&
+ sysdev->parent->parent && sysdev->parent->parent->iommu_group)
+ sysdev = sysdev->parent->parent;
+ else if (sysdev->parent && !sysdev->of_node && sysdev->parent->of_node)
sysdev = sysdev->parent;
#ifdef CONFIG_PCI
else if (sysdev->parent && sysdev->parent->parent &&
@@ -316,7 +324,7 @@
if (device_property_read_u32(&pdev->dev, "xhci-imod-value", &imod))
imod = 0;
- if (device_property_read_u32(sysdev, "usb-core-id", &xhci->core_id))
+ if (device_property_read_u32(&pdev->dev, "usb-core-id", &xhci->core_id))
xhci->core_id = -EINVAL;
hcd->usb_phy = devm_usb_get_phy_by_phandle(sysdev, "usb-phy", 0);
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
index 4f56e98..b2eb2d0 100644
--- a/include/linux/usb/gadget.h
+++ b/include/linux/usb/gadget.h
@@ -1120,12 +1120,12 @@
int msm_ep_config(struct usb_ep *ep);
int msm_ep_unconfig(struct usb_ep *ep);
void dwc3_tx_fifo_resize_request(struct usb_ep *ep, bool qdss_enable);
-int msm_data_fifo_config(struct usb_ep *ep, phys_addr_t addr, u32 size,
+int msm_data_fifo_config(struct usb_ep *ep, unsigned long addr, u32 size,
u8 dst_pipe_idx);
bool msm_dwc3_reset_ep_after_lpm(struct usb_gadget *gadget);
int msm_dwc3_reset_dbm_ep(struct usb_ep *ep);
#else
-static inline int msm_data_fifo_config(struct usb_ep *ep, phys_addr_t addr,
+static inline int msm_data_fifo_config(struct usb_ep *ep, unsigned long addr,
u32 size, u8 dst_pipe_idx)
{ return -ENODEV; }
diff --git a/include/linux/usb_bam.h b/include/linux/usb_bam.h
index 1b0ca4a..84d7549 100644
--- a/include/linux/usb_bam.h
+++ b/include/linux/usb_bam.h
@@ -245,10 +245,13 @@
*
* @bam_pipe_idx - allocated pipe index.
*
+ * @iova - IPA address of USB peer BAM (i.e. QDSS BAM)
+ *
* @return 0 on success, negative value on error
*
*/
-int usb_bam_connect(enum usb_ctrl bam_type, int idx, u32 *bam_pipe_idx);
+int usb_bam_connect(enum usb_ctrl bam_type, int idx, u32 *bam_pipe_idx,
+ unsigned long iova);
/**
* Connect USB-to-IPA SPS connection.
@@ -430,12 +433,14 @@
/* Frees memory for data fifo and descriptor fifos. */
int usb_bam_free_fifos(enum usb_ctrl cur_bam, u8 idx);
-
+int get_qdss_bam_info(enum usb_ctrl cur_bam, u8 idx,
+ phys_addr_t *p_addr, u32 *bam_size);
bool msm_bam_hsic_lpm_ok(void);
bool msm_bam_hsic_host_pipe_empty(void);
bool msm_usb_bam_enable(enum usb_ctrl ctrl, bool bam_enable);
#else
-static inline int usb_bam_connect(enum usb_ctrl bam, u8 idx, u32 *bam_pipe_idx)
+static inline int usb_bam_connect(enum usb_ctrl bam, u8 idx, u32 *bam_pipe_idx,
+ unsigned long iova)
{
return -ENODEV;
}
@@ -529,6 +534,11 @@
return false;
}
+static int get_qdss_bam_info(enum usb_ctrl cur_bam, u8 idx,
+ phys_addr_t *p_addr, u32 *bam_size)
+{
+ return false;
+}
static inline bool msm_bam_hsic_lpm_ok(void) { return true; }
static inline bool msm_bam_hsic_host_pipe_empty(void) { return true; }
static inline bool msm_usb_bam_enable(enum usb_ctrl ctrl, bool bam_enable)