mirror of https://gitee.com/openkylin/linux.git
Merge tag 'drm-msm-fixes-2021-01-07' of https://gitlab.freedesktop.org/drm/msm into drm-fixes
A few misc fixes from Rob, mostly fallout from the locking rework that landed in the merge window, plus a few smaller things. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> From: Rob Clark <robdclark@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/CAF6AEGtWMhzyD6kejmViZeZ+zfJxRvfq-R2t_zA+DcDiTxsYRQ@mail.gmail.com
This commit is contained in:
commit
25ea8ecf4d
|
@ -534,8 +534,10 @@ struct msm_gpu *a2xx_gpu_init(struct drm_device *dev)
|
|||
|
||||
if (!gpu->aspace) {
|
||||
dev_err(dev->dev, "No memory protection without MMU\n");
|
||||
ret = -ENXIO;
|
||||
goto fail;
|
||||
if (!allow_vram_carveout) {
|
||||
ret = -ENXIO;
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
return gpu;
|
||||
|
|
|
@ -564,8 +564,10 @@ struct msm_gpu *a3xx_gpu_init(struct drm_device *dev)
|
|||
* implement a cmdstream validator.
|
||||
*/
|
||||
DRM_DEV_ERROR(dev->dev, "No memory protection without IOMMU\n");
|
||||
ret = -ENXIO;
|
||||
goto fail;
|
||||
if (!allow_vram_carveout) {
|
||||
ret = -ENXIO;
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
icc_path = devm_of_icc_get(&pdev->dev, "gfx-mem");
|
||||
|
|
|
@ -692,8 +692,10 @@ struct msm_gpu *a4xx_gpu_init(struct drm_device *dev)
|
|||
* implement a cmdstream validator.
|
||||
*/
|
||||
DRM_DEV_ERROR(dev->dev, "No memory protection without IOMMU\n");
|
||||
ret = -ENXIO;
|
||||
goto fail;
|
||||
if (!allow_vram_carveout) {
|
||||
ret = -ENXIO;
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
icc_path = devm_of_icc_get(&pdev->dev, "gfx-mem");
|
||||
|
|
|
@ -18,6 +18,10 @@ bool snapshot_debugbus = false;
|
|||
MODULE_PARM_DESC(snapshot_debugbus, "Include debugbus sections in GPU devcoredump (if not fused off)");
|
||||
module_param_named(snapshot_debugbus, snapshot_debugbus, bool, 0600);
|
||||
|
||||
bool allow_vram_carveout = false;
|
||||
MODULE_PARM_DESC(allow_vram_carveout, "Allow using VRAM Carveout, in place of IOMMU");
|
||||
module_param_named(allow_vram_carveout, allow_vram_carveout, bool, 0600);
|
||||
|
||||
static const struct adreno_info gpulist[] = {
|
||||
{
|
||||
.rev = ADRENO_REV(2, 0, 0, 0),
|
||||
|
|
|
@ -191,8 +191,6 @@ adreno_iommu_create_address_space(struct msm_gpu *gpu,
|
|||
struct platform_device *pdev)
|
||||
{
|
||||
struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
|
||||
struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu);
|
||||
struct io_pgtable_domain_attr pgtbl_cfg;
|
||||
struct iommu_domain *iommu;
|
||||
struct msm_mmu *mmu;
|
||||
struct msm_gem_address_space *aspace;
|
||||
|
@ -202,13 +200,18 @@ adreno_iommu_create_address_space(struct msm_gpu *gpu,
|
|||
if (!iommu)
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* This allows GPU to set the bus attributes required to use system
|
||||
* cache on behalf of the iommu page table walker.
|
||||
*/
|
||||
if (!IS_ERR(a6xx_gpu->htw_llc_slice)) {
|
||||
pgtbl_cfg.quirks = IO_PGTABLE_QUIRK_ARM_OUTER_WBWA;
|
||||
iommu_domain_set_attr(iommu, DOMAIN_ATTR_IO_PGTABLE_CFG, &pgtbl_cfg);
|
||||
|
||||
if (adreno_is_a6xx(adreno_gpu)) {
|
||||
struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu);
|
||||
struct io_pgtable_domain_attr pgtbl_cfg;
|
||||
/*
|
||||
* This allows GPU to set the bus attributes required to use system
|
||||
* cache on behalf of the iommu page table walker.
|
||||
*/
|
||||
if (!IS_ERR(a6xx_gpu->htw_llc_slice)) {
|
||||
pgtbl_cfg.quirks = IO_PGTABLE_QUIRK_ARM_OUTER_WBWA;
|
||||
iommu_domain_set_attr(iommu, DOMAIN_ATTR_IO_PGTABLE_CFG, &pgtbl_cfg);
|
||||
}
|
||||
}
|
||||
|
||||
mmu = msm_iommu_new(&pdev->dev, iommu);
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include "adreno_pm4.xml.h"
|
||||
|
||||
extern bool snapshot_debugbus;
|
||||
extern bool allow_vram_carveout;
|
||||
|
||||
enum {
|
||||
ADRENO_FW_PM4 = 0,
|
||||
|
@ -211,6 +212,11 @@ static inline int adreno_is_a540(struct adreno_gpu *gpu)
|
|||
return gpu->revn == 540;
|
||||
}
|
||||
|
||||
static inline bool adreno_is_a6xx(struct adreno_gpu *gpu)
|
||||
{
|
||||
return ((gpu->revn < 700 && gpu->revn > 599));
|
||||
}
|
||||
|
||||
static inline int adreno_is_a618(struct adreno_gpu *gpu)
|
||||
{
|
||||
return gpu->revn == 618;
|
||||
|
|
|
@ -693,6 +693,13 @@ static int dp_irq_hpd_handle(struct dp_display_private *dp, u32 data)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (state == ST_CONNECT_PENDING) {
|
||||
/* wait until ST_CONNECTED */
|
||||
dp_add_event(dp, EV_IRQ_HPD_INT, 0, 1); /* delay = 1 */
|
||||
mutex_unlock(&dp->event_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = dp_display_usbpd_attention_cb(&dp->pdev->dev);
|
||||
if (ret == -ECONNRESET) { /* cable unplugged */
|
||||
dp->core_initialized = false;
|
||||
|
|
|
@ -167,14 +167,20 @@ int dp_panel_read_sink_caps(struct dp_panel *dp_panel,
|
|||
panel = container_of(dp_panel, struct dp_panel_private, dp_panel);
|
||||
|
||||
rc = dp_panel_read_dpcd(dp_panel);
|
||||
bw_code = drm_dp_link_rate_to_bw_code(dp_panel->link_info.rate);
|
||||
if (rc || !is_link_rate_valid(bw_code) ||
|
||||
!is_lane_count_valid(dp_panel->link_info.num_lanes) ||
|
||||
(bw_code > dp_panel->max_bw_code)) {
|
||||
if (rc) {
|
||||
DRM_ERROR("read dpcd failed %d\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
bw_code = drm_dp_link_rate_to_bw_code(dp_panel->link_info.rate);
|
||||
if (!is_link_rate_valid(bw_code) ||
|
||||
!is_lane_count_valid(dp_panel->link_info.num_lanes) ||
|
||||
(bw_code > dp_panel->max_bw_code)) {
|
||||
DRM_ERROR("Illegal link rate=%d lane=%d\n", dp_panel->link_info.rate,
|
||||
dp_panel->link_info.num_lanes);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (dp_panel->dfp_present) {
|
||||
rlen = drm_dp_dpcd_read(panel->aux, DP_SINK_COUNT,
|
||||
&count, 1);
|
||||
|
|
|
@ -457,15 +457,15 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
|
|||
|
||||
drm_mode_config_init(ddev);
|
||||
|
||||
ret = msm_init_vram(ddev);
|
||||
if (ret)
|
||||
goto err_destroy_mdss;
|
||||
|
||||
/* Bind all our sub-components: */
|
||||
ret = component_bind_all(dev, ddev);
|
||||
if (ret)
|
||||
goto err_destroy_mdss;
|
||||
|
||||
ret = msm_init_vram(ddev);
|
||||
if (ret)
|
||||
goto err_msm_uninit;
|
||||
|
||||
dma_set_max_seg_size(dev, UINT_MAX);
|
||||
|
||||
msm_gem_shrinker_init(ddev);
|
||||
|
|
|
@ -96,6 +96,8 @@ static struct page **get_pages(struct drm_gem_object *obj)
|
|||
{
|
||||
struct msm_gem_object *msm_obj = to_msm_bo(obj);
|
||||
|
||||
WARN_ON(!msm_gem_is_locked(obj));
|
||||
|
||||
if (!msm_obj->pages) {
|
||||
struct drm_device *dev = obj->dev;
|
||||
struct page **p;
|
||||
|
@ -988,6 +990,8 @@ void msm_gem_free_object(struct drm_gem_object *obj)
|
|||
if (msm_obj->pages)
|
||||
kvfree(msm_obj->pages);
|
||||
|
||||
put_iova_vmas(obj);
|
||||
|
||||
/* dma_buf_detach() grabs resv lock, so we need to unlock
|
||||
* prior to drm_prime_gem_destroy
|
||||
*/
|
||||
|
@ -997,11 +1001,10 @@ void msm_gem_free_object(struct drm_gem_object *obj)
|
|||
} else {
|
||||
msm_gem_vunmap(obj);
|
||||
put_pages(obj);
|
||||
put_iova_vmas(obj);
|
||||
msm_gem_unlock(obj);
|
||||
}
|
||||
|
||||
put_iova_vmas(obj);
|
||||
|
||||
drm_gem_object_release(obj);
|
||||
|
||||
kfree(msm_obj);
|
||||
|
@ -1115,6 +1118,8 @@ static struct drm_gem_object *_msm_gem_new(struct drm_device *dev,
|
|||
struct msm_gem_vma *vma;
|
||||
struct page **pages;
|
||||
|
||||
drm_gem_private_object_init(dev, obj, size);
|
||||
|
||||
msm_gem_lock(obj);
|
||||
|
||||
vma = add_vma(obj, NULL);
|
||||
|
@ -1126,9 +1131,9 @@ static struct drm_gem_object *_msm_gem_new(struct drm_device *dev,
|
|||
|
||||
to_msm_bo(obj)->vram_node = &vma->node;
|
||||
|
||||
drm_gem_private_object_init(dev, obj, size);
|
||||
|
||||
msm_gem_lock(obj);
|
||||
pages = get_pages(obj);
|
||||
msm_gem_unlock(obj);
|
||||
if (IS_ERR(pages)) {
|
||||
ret = PTR_ERR(pages);
|
||||
goto fail;
|
||||
|
|
Loading…
Reference in New Issue