diff options
75 files changed, 947 insertions, 1847 deletions
diff --git a/Documentation/devicetree/bindings/display/imx/fsl-imx-drm.txt b/Documentation/devicetree/bindings/display/imx/fsl-imx-drm.txt index f79854783c2c..5bf77f6dd19d 100644 --- a/Documentation/devicetree/bindings/display/imx/fsl-imx-drm.txt +++ b/Documentation/devicetree/bindings/display/imx/fsl-imx-drm.txt | |||
@@ -129,7 +129,7 @@ Optional properties: | |||
129 | 129 | ||
130 | example: | 130 | example: |
131 | 131 | ||
132 | display@di0 { | 132 | disp0 { |
133 | compatible = "fsl,imx-parallel-display"; | 133 | compatible = "fsl,imx-parallel-display"; |
134 | edid = [edid-data]; | 134 | edid = [edid-data]; |
135 | interface-pix-fmt = "rgb24"; | 135 | interface-pix-fmt = "rgb24"; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c index 023bfdb3e63f..c04f44a90392 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c | |||
@@ -382,6 +382,8 @@ static int acp_hw_init(void *handle) | |||
382 | adev->acp.acp_cell[0].name = "acp_audio_dma"; | 382 | adev->acp.acp_cell[0].name = "acp_audio_dma"; |
383 | adev->acp.acp_cell[0].num_resources = 4; | 383 | adev->acp.acp_cell[0].num_resources = 4; |
384 | adev->acp.acp_cell[0].resources = &adev->acp.acp_res[0]; | 384 | adev->acp.acp_cell[0].resources = &adev->acp.acp_res[0]; |
385 | adev->acp.acp_cell[0].platform_data = &adev->asic_type; | ||
386 | adev->acp.acp_cell[0].pdata_size = sizeof(adev->asic_type); | ||
385 | 387 | ||
386 | adev->acp.acp_cell[1].name = "designware-i2s"; | 388 | adev->acp.acp_cell[1].name = "designware-i2s"; |
387 | adev->acp.acp_cell[1].num_resources = 1; | 389 | adev->acp.acp_cell[1].num_resources = 1; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c index c21adf60a7f2..057e1ecd83ce 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c | |||
@@ -59,12 +59,6 @@ static bool check_atom_bios(uint8_t *bios, size_t size) | |||
59 | return false; | 59 | return false; |
60 | } | 60 | } |
61 | 61 | ||
62 | tmp = bios[0x18] | (bios[0x19] << 8); | ||
63 | if (bios[tmp + 0x14] != 0x0) { | ||
64 | DRM_INFO("Not an x86 BIOS ROM\n"); | ||
65 | return false; | ||
66 | } | ||
67 | |||
68 | bios_header_start = bios[0x48] | (bios[0x49] << 8); | 62 | bios_header_start = bios[0x48] | (bios[0x49] << 8); |
69 | if (!bios_header_start) { | 63 | if (!bios_header_start) { |
70 | DRM_INFO("Can't locate bios header\n"); | 64 | DRM_INFO("Can't locate bios header\n"); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index f7fceb63413c..bdef497a6a26 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |||
@@ -1497,8 +1497,11 @@ out: | |||
1497 | memset(wait, 0, sizeof(*wait)); | 1497 | memset(wait, 0, sizeof(*wait)); |
1498 | wait->out.status = (r > 0); | 1498 | wait->out.status = (r > 0); |
1499 | wait->out.first_signaled = first; | 1499 | wait->out.first_signaled = first; |
1500 | /* set return value 0 to indicate success */ | 1500 | |
1501 | r = array[first]->error; | 1501 | if (first < fence_count && array[first]) |
1502 | r = array[first]->error; | ||
1503 | else | ||
1504 | r = 0; | ||
1502 | 1505 | ||
1503 | err_free_fence_array: | 1506 | err_free_fence_array: |
1504 | for (i = 0; i < fence_count; i++) | 1507 | for (i = 0; i < fence_count; i++) |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index efcacb827de7..2c85e0a98608 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |||
@@ -1836,6 +1836,9 @@ static int amdgpu_fini(struct amdgpu_device *adev) | |||
1836 | adev->ip_blocks[i].status.hw = false; | 1836 | adev->ip_blocks[i].status.hw = false; |
1837 | } | 1837 | } |
1838 | 1838 | ||
1839 | if (adev->firmware.load_type == AMDGPU_FW_LOAD_SMU) | ||
1840 | amdgpu_ucode_fini_bo(adev); | ||
1841 | |||
1839 | for (i = adev->num_ip_blocks - 1; i >= 0; i--) { | 1842 | for (i = adev->num_ip_blocks - 1; i >= 0; i--) { |
1840 | if (!adev->ip_blocks[i].status.sw) | 1843 | if (!adev->ip_blocks[i].status.sw) |
1841 | continue; | 1844 | continue; |
@@ -3188,9 +3191,9 @@ static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf, | |||
3188 | pm_pg_lock = (*pos >> 23) & 1; | 3191 | pm_pg_lock = (*pos >> 23) & 1; |
3189 | 3192 | ||
3190 | if (*pos & (1ULL << 62)) { | 3193 | if (*pos & (1ULL << 62)) { |
3191 | se_bank = (*pos >> 24) & 0x3FF; | 3194 | se_bank = (*pos & GENMASK_ULL(33, 24)) >> 24; |
3192 | sh_bank = (*pos >> 34) & 0x3FF; | 3195 | sh_bank = (*pos & GENMASK_ULL(43, 34)) >> 34; |
3193 | instance_bank = (*pos >> 44) & 0x3FF; | 3196 | instance_bank = (*pos & GENMASK_ULL(53, 44)) >> 44; |
3194 | 3197 | ||
3195 | if (se_bank == 0x3FF) | 3198 | if (se_bank == 0x3FF) |
3196 | se_bank = 0xFFFFFFFF; | 3199 | se_bank = 0xFFFFFFFF; |
@@ -3264,9 +3267,9 @@ static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf, | |||
3264 | pm_pg_lock = (*pos >> 23) & 1; | 3267 | pm_pg_lock = (*pos >> 23) & 1; |
3265 | 3268 | ||
3266 | if (*pos & (1ULL << 62)) { | 3269 | if (*pos & (1ULL << 62)) { |
3267 | se_bank = (*pos >> 24) & 0x3FF; | 3270 | se_bank = (*pos & GENMASK_ULL(33, 24)) >> 24; |
3268 | sh_bank = (*pos >> 34) & 0x3FF; | 3271 | sh_bank = (*pos & GENMASK_ULL(43, 34)) >> 34; |
3269 | instance_bank = (*pos >> 44) & 0x3FF; | 3272 | instance_bank = (*pos & GENMASK_ULL(53, 44)) >> 44; |
3270 | 3273 | ||
3271 | if (se_bank == 0x3FF) | 3274 | if (se_bank == 0x3FF) |
3272 | se_bank = 0xFFFFFFFF; | 3275 | se_bank = 0xFFFFFFFF; |
@@ -3614,12 +3617,12 @@ static ssize_t amdgpu_debugfs_wave_read(struct file *f, char __user *buf, | |||
3614 | return -EINVAL; | 3617 | return -EINVAL; |
3615 | 3618 | ||
3616 | /* decode offset */ | 3619 | /* decode offset */ |
3617 | offset = (*pos & 0x7F); | 3620 | offset = (*pos & GENMASK_ULL(6, 0)); |
3618 | se = ((*pos >> 7) & 0xFF); | 3621 | se = (*pos & GENMASK_ULL(14, 7)) >> 7; |
3619 | sh = ((*pos >> 15) & 0xFF); | 3622 | sh = (*pos & GENMASK_ULL(22, 15)) >> 15; |
3620 | cu = ((*pos >> 23) & 0xFF); | 3623 | cu = (*pos & GENMASK_ULL(30, 23)) >> 23; |
3621 | wave = ((*pos >> 31) & 0xFF); | 3624 | wave = (*pos & GENMASK_ULL(36, 31)) >> 31; |
3622 | simd = ((*pos >> 37) & 0xFF); | 3625 | simd = (*pos & GENMASK_ULL(44, 37)) >> 37; |
3623 | 3626 | ||
3624 | /* switch to the specific se/sh/cu */ | 3627 | /* switch to the specific se/sh/cu */ |
3625 | mutex_lock(&adev->grbm_idx_mutex); | 3628 | mutex_lock(&adev->grbm_idx_mutex); |
@@ -3664,14 +3667,14 @@ static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf, | |||
3664 | return -EINVAL; | 3667 | return -EINVAL; |
3665 | 3668 | ||
3666 | /* decode offset */ | 3669 | /* decode offset */ |
3667 | offset = (*pos & 0xFFF); /* in dwords */ | 3670 | offset = *pos & GENMASK_ULL(11, 0); |
3668 | se = ((*pos >> 12) & 0xFF); | 3671 | se = (*pos & GENMASK_ULL(19, 12)) >> 12; |
3669 | sh = ((*pos >> 20) & 0xFF); | 3672 | sh = (*pos & GENMASK_ULL(27, 20)) >> 20; |
3670 | cu = ((*pos >> 28) & 0xFF); | 3673 | cu = (*pos & GENMASK_ULL(35, 28)) >> 28; |
3671 | wave = ((*pos >> 36) & 0xFF); | 3674 | wave = (*pos & GENMASK_ULL(43, 36)) >> 36; |
3672 | simd = ((*pos >> 44) & 0xFF); | 3675 | simd = (*pos & GENMASK_ULL(51, 44)) >> 44; |
3673 | thread = ((*pos >> 52) & 0xFF); | 3676 | thread = (*pos & GENMASK_ULL(59, 52)) >> 52; |
3674 | bank = ((*pos >> 60) & 1); | 3677 | bank = (*pos & GENMASK_ULL(61, 60)) >> 60; |
3675 | 3678 | ||
3676 | data = kmalloc_array(1024, sizeof(*data), GFP_KERNEL); | 3679 | data = kmalloc_array(1024, sizeof(*data), GFP_KERNEL); |
3677 | if (!data) | 3680 | if (!data) |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index fb72edc4c026..14aff2f15a94 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | |||
@@ -63,6 +63,11 @@ retry: | |||
63 | flags, NULL, resv, 0, &bo); | 63 | flags, NULL, resv, 0, &bo); |
64 | if (r) { | 64 | if (r) { |
65 | if (r != -ERESTARTSYS) { | 65 | if (r != -ERESTARTSYS) { |
66 | if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) { | ||
67 | flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED; | ||
68 | goto retry; | ||
69 | } | ||
70 | |||
66 | if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) { | 71 | if (initial_domain == AMDGPU_GEM_DOMAIN_VRAM) { |
67 | initial_domain |= AMDGPU_GEM_DOMAIN_GTT; | 72 | initial_domain |= AMDGPU_GEM_DOMAIN_GTT; |
68 | goto retry; | 73 | goto retry; |
@@ -323,7 +328,7 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data, | |||
323 | r = amdgpu_ttm_tt_get_user_pages(bo->tbo.ttm, | 328 | r = amdgpu_ttm_tt_get_user_pages(bo->tbo.ttm, |
324 | bo->tbo.ttm->pages); | 329 | bo->tbo.ttm->pages); |
325 | if (r) | 330 | if (r) |
326 | goto unlock_mmap_sem; | 331 | goto release_object; |
327 | 332 | ||
328 | r = amdgpu_bo_reserve(bo, true); | 333 | r = amdgpu_bo_reserve(bo, true); |
329 | if (r) | 334 | if (r) |
@@ -348,9 +353,6 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data, | |||
348 | free_pages: | 353 | free_pages: |
349 | release_pages(bo->tbo.ttm->pages, bo->tbo.ttm->num_pages, false); | 354 | release_pages(bo->tbo.ttm->pages, bo->tbo.ttm->num_pages, false); |
350 | 355 | ||
351 | unlock_mmap_sem: | ||
352 | up_read(¤t->mm->mmap_sem); | ||
353 | |||
354 | release_object: | 356 | release_object: |
355 | drm_gem_object_put_unlocked(gobj); | 357 | drm_gem_object_put_unlocked(gobj); |
356 | 358 | ||
@@ -556,9 +558,8 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data, | |||
556 | 558 | ||
557 | if (args->va_address < AMDGPU_VA_RESERVED_SIZE) { | 559 | if (args->va_address < AMDGPU_VA_RESERVED_SIZE) { |
558 | dev_err(&dev->pdev->dev, | 560 | dev_err(&dev->pdev->dev, |
559 | "va_address 0x%lX is in reserved area 0x%X\n", | 561 | "va_address 0x%LX is in reserved area 0x%LX\n", |
560 | (unsigned long)args->va_address, | 562 | args->va_address, AMDGPU_VA_RESERVED_SIZE); |
561 | AMDGPU_VA_RESERVED_SIZE); | ||
562 | return -EINVAL; | 563 | return -EINVAL; |
563 | } | 564 | } |
564 | 565 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c index 33535d347734..00e0ce10862f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | |||
@@ -71,12 +71,6 @@ static int amdgpu_gtt_mgr_fini(struct ttm_mem_type_manager *man) | |||
71 | { | 71 | { |
72 | struct amdgpu_gtt_mgr *mgr = man->priv; | 72 | struct amdgpu_gtt_mgr *mgr = man->priv; |
73 | 73 | ||
74 | spin_lock(&mgr->lock); | ||
75 | if (!drm_mm_clean(&mgr->mm)) { | ||
76 | spin_unlock(&mgr->lock); | ||
77 | return -EBUSY; | ||
78 | } | ||
79 | |||
80 | drm_mm_takedown(&mgr->mm); | 74 | drm_mm_takedown(&mgr->mm); |
81 | spin_unlock(&mgr->lock); | 75 | spin_unlock(&mgr->lock); |
82 | kfree(mgr); | 76 | kfree(mgr); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index a59e04f3eeba..ce00f629dcce 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | |||
@@ -946,6 +946,10 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj, | |||
946 | struct amdgpu_device *adev = dev_get_drvdata(dev); | 946 | struct amdgpu_device *adev = dev_get_drvdata(dev); |
947 | umode_t effective_mode = attr->mode; | 947 | umode_t effective_mode = attr->mode; |
948 | 948 | ||
949 | /* no skipping for powerplay */ | ||
950 | if (adev->powerplay.cgs_device) | ||
951 | return effective_mode; | ||
952 | |||
949 | /* Skip limit attributes if DPM is not enabled */ | 953 | /* Skip limit attributes if DPM is not enabled */ |
950 | if (!adev->pm.dpm_enabled && | 954 | if (!adev->pm.dpm_enabled && |
951 | (attr == &sensor_dev_attr_temp1_crit.dev_attr.attr || | 955 | (attr == &sensor_dev_attr_temp1_crit.dev_attr.attr || |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c index 5f5aa5fddc16..033fba2def6f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c | |||
@@ -164,9 +164,6 @@ static int amdgpu_pp_hw_fini(void *handle) | |||
164 | ret = adev->powerplay.ip_funcs->hw_fini( | 164 | ret = adev->powerplay.ip_funcs->hw_fini( |
165 | adev->powerplay.pp_handle); | 165 | adev->powerplay.pp_handle); |
166 | 166 | ||
167 | if (adev->firmware.load_type == AMDGPU_FW_LOAD_SMU) | ||
168 | amdgpu_ucode_fini_bo(adev); | ||
169 | |||
170 | return ret; | 167 | return ret; |
171 | } | 168 | } |
172 | 169 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c index 90af8e82b16a..ae9c106979d7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c | |||
@@ -169,10 +169,14 @@ struct dma_buf *amdgpu_gem_prime_export(struct drm_device *dev, | |||
169 | int flags) | 169 | int flags) |
170 | { | 170 | { |
171 | struct amdgpu_bo *bo = gem_to_amdgpu_bo(gobj); | 171 | struct amdgpu_bo *bo = gem_to_amdgpu_bo(gobj); |
172 | struct dma_buf *buf; | ||
172 | 173 | ||
173 | if (amdgpu_ttm_tt_get_usermm(bo->tbo.ttm) || | 174 | if (amdgpu_ttm_tt_get_usermm(bo->tbo.ttm) || |
174 | bo->flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) | 175 | bo->flags & AMDGPU_GEM_CREATE_VM_ALWAYS_VALID) |
175 | return ERR_PTR(-EPERM); | 176 | return ERR_PTR(-EPERM); |
176 | 177 | ||
177 | return drm_gem_prime_export(dev, gobj, flags); | 178 | buf = drm_gem_prime_export(dev, gobj, flags); |
179 | if (!IS_ERR(buf)) | ||
180 | buf->file->f_mapping = dev->anon_inode->i_mapping; | ||
181 | return buf; | ||
178 | } | 182 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c index 447d446b5015..7714f4a6c8b0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | |||
@@ -442,8 +442,6 @@ static int psp_hw_fini(void *handle) | |||
442 | if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) | 442 | if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) |
443 | return 0; | 443 | return 0; |
444 | 444 | ||
445 | amdgpu_ucode_fini_bo(adev); | ||
446 | |||
447 | psp_ring_destroy(psp, PSP_RING_TYPE__KM); | 445 | psp_ring_destroy(psp, PSP_RING_TYPE__KM); |
448 | 446 | ||
449 | amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, &psp->tmr_buf); | 447 | amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, &psp->tmr_buf); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c index e5ece1fae149..a98fbbb4739f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | |||
@@ -136,7 +136,8 @@ void amdgpu_ring_commit(struct amdgpu_ring *ring) | |||
136 | if (ring->funcs->end_use) | 136 | if (ring->funcs->end_use) |
137 | ring->funcs->end_use(ring); | 137 | ring->funcs->end_use(ring); |
138 | 138 | ||
139 | amdgpu_ring_lru_touch(ring->adev, ring); | 139 | if (ring->funcs->type != AMDGPU_RING_TYPE_KIQ) |
140 | amdgpu_ring_lru_touch(ring->adev, ring); | ||
140 | } | 141 | } |
141 | 142 | ||
142 | /** | 143 | /** |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index b577b717caa0..1f036af85ba6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | |||
@@ -1193,9 +1193,6 @@ static bool amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo, | |||
1193 | unsigned long num_pages = bo->mem.num_pages; | 1193 | unsigned long num_pages = bo->mem.num_pages; |
1194 | struct drm_mm_node *node = bo->mem.mm_node; | 1194 | struct drm_mm_node *node = bo->mem.mm_node; |
1195 | 1195 | ||
1196 | if (bo->mem.start != AMDGPU_BO_INVALID_OFFSET) | ||
1197 | return ttm_bo_eviction_valuable(bo, place); | ||
1198 | |||
1199 | switch (bo->mem.mem_type) { | 1196 | switch (bo->mem.mem_type) { |
1200 | case TTM_PL_TT: | 1197 | case TTM_PL_TT: |
1201 | return true; | 1198 | return true; |
@@ -1210,7 +1207,7 @@ static bool amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo, | |||
1210 | num_pages -= node->size; | 1207 | num_pages -= node->size; |
1211 | ++node; | 1208 | ++node; |
1212 | } | 1209 | } |
1213 | break; | 1210 | return false; |
1214 | 1211 | ||
1215 | default: | 1212 | default: |
1216 | break; | 1213 | break; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c index b46280c1279f..2918de2f39ec 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | |||
@@ -648,7 +648,7 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx) | |||
648 | uint32_t allocated = 0; | 648 | uint32_t allocated = 0; |
649 | uint32_t tmp, handle = 0; | 649 | uint32_t tmp, handle = 0; |
650 | uint32_t *size = &tmp; | 650 | uint32_t *size = &tmp; |
651 | int i, r, idx = 0; | 651 | int i, r = 0, idx = 0; |
652 | 652 | ||
653 | p->job->vm = NULL; | 653 | p->job->vm = NULL; |
654 | ib->gpu_addr = amdgpu_sa_bo_gpu_addr(ib->sa_bo); | 654 | ib->gpu_addr = amdgpu_sa_bo_gpu_addr(ib->sa_bo); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c index 4e4a476593e8..6738df836a70 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | |||
@@ -114,18 +114,19 @@ void amdgpu_virt_init_setting(struct amdgpu_device *adev) | |||
114 | uint32_t amdgpu_virt_kiq_rreg(struct amdgpu_device *adev, uint32_t reg) | 114 | uint32_t amdgpu_virt_kiq_rreg(struct amdgpu_device *adev, uint32_t reg) |
115 | { | 115 | { |
116 | signed long r; | 116 | signed long r; |
117 | unsigned long flags; | ||
117 | uint32_t val, seq; | 118 | uint32_t val, seq; |
118 | struct amdgpu_kiq *kiq = &adev->gfx.kiq; | 119 | struct amdgpu_kiq *kiq = &adev->gfx.kiq; |
119 | struct amdgpu_ring *ring = &kiq->ring; | 120 | struct amdgpu_ring *ring = &kiq->ring; |
120 | 121 | ||
121 | BUG_ON(!ring->funcs->emit_rreg); | 122 | BUG_ON(!ring->funcs->emit_rreg); |
122 | 123 | ||
123 | spin_lock(&kiq->ring_lock); | 124 | spin_lock_irqsave(&kiq->ring_lock, flags); |
124 | amdgpu_ring_alloc(ring, 32); | 125 | amdgpu_ring_alloc(ring, 32); |
125 | amdgpu_ring_emit_rreg(ring, reg); | 126 | amdgpu_ring_emit_rreg(ring, reg); |
126 | amdgpu_fence_emit_polling(ring, &seq); | 127 | amdgpu_fence_emit_polling(ring, &seq); |
127 | amdgpu_ring_commit(ring); | 128 | amdgpu_ring_commit(ring); |
128 | spin_unlock(&kiq->ring_lock); | 129 | spin_unlock_irqrestore(&kiq->ring_lock, flags); |
129 | 130 | ||
130 | r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT); | 131 | r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT); |
131 | if (r < 1) { | 132 | if (r < 1) { |
@@ -140,18 +141,19 @@ uint32_t amdgpu_virt_kiq_rreg(struct amdgpu_device *adev, uint32_t reg) | |||
140 | void amdgpu_virt_kiq_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v) | 141 | void amdgpu_virt_kiq_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v) |
141 | { | 142 | { |
142 | signed long r; | 143 | signed long r; |
144 | unsigned long flags; | ||
143 | uint32_t seq; | 145 | uint32_t seq; |
144 | struct amdgpu_kiq *kiq = &adev->gfx.kiq; | 146 | struct amdgpu_kiq *kiq = &adev->gfx.kiq; |
145 | struct amdgpu_ring *ring = &kiq->ring; | 147 | struct amdgpu_ring *ring = &kiq->ring; |
146 | 148 | ||
147 | BUG_ON(!ring->funcs->emit_wreg); | 149 | BUG_ON(!ring->funcs->emit_wreg); |
148 | 150 | ||
149 | spin_lock(&kiq->ring_lock); | 151 | spin_lock_irqsave(&kiq->ring_lock, flags); |
150 | amdgpu_ring_alloc(ring, 32); | 152 | amdgpu_ring_alloc(ring, 32); |
151 | amdgpu_ring_emit_wreg(ring, reg, v); | 153 | amdgpu_ring_emit_wreg(ring, reg, v); |
152 | amdgpu_fence_emit_polling(ring, &seq); | 154 | amdgpu_fence_emit_polling(ring, &seq); |
153 | amdgpu_ring_commit(ring); | 155 | amdgpu_ring_commit(ring); |
154 | spin_unlock(&kiq->ring_lock); | 156 | spin_unlock_irqrestore(&kiq->ring_lock, flags); |
155 | 157 | ||
156 | r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT); | 158 | r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT); |
157 | if (r < 1) | 159 | if (r < 1) |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 010d14195a5e..c8c26f21993c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -1244,7 +1244,7 @@ static void amdgpu_vm_invalidate_level(struct amdgpu_vm *vm, | |||
1244 | int amdgpu_vm_update_directories(struct amdgpu_device *adev, | 1244 | int amdgpu_vm_update_directories(struct amdgpu_device *adev, |
1245 | struct amdgpu_vm *vm) | 1245 | struct amdgpu_vm *vm) |
1246 | { | 1246 | { |
1247 | int r; | 1247 | int r = 0; |
1248 | 1248 | ||
1249 | spin_lock(&vm->status_lock); | 1249 | spin_lock(&vm->status_lock); |
1250 | while (!list_empty(&vm->relocated)) { | 1250 | while (!list_empty(&vm->relocated)) { |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h index aa914256b4bc..bae77353447b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | |||
@@ -94,7 +94,8 @@ struct amdgpu_bo_list_entry; | |||
94 | #define AMDGPU_MMHUB 1 | 94 | #define AMDGPU_MMHUB 1 |
95 | 95 | ||
96 | /* hardcode that limit for now */ | 96 | /* hardcode that limit for now */ |
97 | #define AMDGPU_VA_RESERVED_SIZE (8 << 20) | 97 | #define AMDGPU_VA_RESERVED_SIZE (8ULL << 20) |
98 | |||
98 | /* max vmids dedicated for process */ | 99 | /* max vmids dedicated for process */ |
99 | #define AMDGPU_VM_MAX_RESERVED_VMID 1 | 100 | #define AMDGPU_VM_MAX_RESERVED_VMID 1 |
100 | 101 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index 26e900627971..4acca92f6a52 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | |||
@@ -68,11 +68,6 @@ static int amdgpu_vram_mgr_fini(struct ttm_mem_type_manager *man) | |||
68 | struct amdgpu_vram_mgr *mgr = man->priv; | 68 | struct amdgpu_vram_mgr *mgr = man->priv; |
69 | 69 | ||
70 | spin_lock(&mgr->lock); | 70 | spin_lock(&mgr->lock); |
71 | if (!drm_mm_clean(&mgr->mm)) { | ||
72 | spin_unlock(&mgr->lock); | ||
73 | return -EBUSY; | ||
74 | } | ||
75 | |||
76 | drm_mm_takedown(&mgr->mm); | 71 | drm_mm_takedown(&mgr->mm); |
77 | spin_unlock(&mgr->lock); | 72 | spin_unlock(&mgr->lock); |
78 | kfree(mgr); | 73 | kfree(mgr); |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c index 00868764a0dd..5c8a7a48a4ad 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | |||
@@ -4670,6 +4670,14 @@ static int gfx_v7_0_sw_fini(void *handle) | |||
4670 | gfx_v7_0_cp_compute_fini(adev); | 4670 | gfx_v7_0_cp_compute_fini(adev); |
4671 | gfx_v7_0_rlc_fini(adev); | 4671 | gfx_v7_0_rlc_fini(adev); |
4672 | gfx_v7_0_mec_fini(adev); | 4672 | gfx_v7_0_mec_fini(adev); |
4673 | amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj, | ||
4674 | &adev->gfx.rlc.clear_state_gpu_addr, | ||
4675 | (void **)&adev->gfx.rlc.cs_ptr); | ||
4676 | if (adev->gfx.rlc.cp_table_size) { | ||
4677 | amdgpu_bo_free_kernel(&adev->gfx.rlc.cp_table_obj, | ||
4678 | &adev->gfx.rlc.cp_table_gpu_addr, | ||
4679 | (void **)&adev->gfx.rlc.cp_table_ptr); | ||
4680 | } | ||
4673 | gfx_v7_0_free_microcode(adev); | 4681 | gfx_v7_0_free_microcode(adev); |
4674 | 4682 | ||
4675 | return 0; | 4683 | return 0; |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index b8002ac3e536..9ecdf621a74a 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |||
@@ -2118,6 +2118,15 @@ static int gfx_v8_0_sw_fini(void *handle) | |||
2118 | 2118 | ||
2119 | gfx_v8_0_mec_fini(adev); | 2119 | gfx_v8_0_mec_fini(adev); |
2120 | gfx_v8_0_rlc_fini(adev); | 2120 | gfx_v8_0_rlc_fini(adev); |
2121 | amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj, | ||
2122 | &adev->gfx.rlc.clear_state_gpu_addr, | ||
2123 | (void **)&adev->gfx.rlc.cs_ptr); | ||
2124 | if ((adev->asic_type == CHIP_CARRIZO) || | ||
2125 | (adev->asic_type == CHIP_STONEY)) { | ||
2126 | amdgpu_bo_free_kernel(&adev->gfx.rlc.cp_table_obj, | ||
2127 | &adev->gfx.rlc.cp_table_gpu_addr, | ||
2128 | (void **)&adev->gfx.rlc.cp_table_ptr); | ||
2129 | } | ||
2121 | gfx_v8_0_free_microcode(adev); | 2130 | gfx_v8_0_free_microcode(adev); |
2122 | 2131 | ||
2123 | return 0; | 2132 | return 0; |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index 7f15bb2c5233..da43813d67a4 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | |||
@@ -207,6 +207,12 @@ static const u32 golden_settings_gc_9_1_rv1[] = | |||
207 | SOC15_REG_OFFSET(GC, 0, mmTD_CNTL), 0x01bd9f33, 0x00000800 | 207 | SOC15_REG_OFFSET(GC, 0, mmTD_CNTL), 0x01bd9f33, 0x00000800 |
208 | }; | 208 | }; |
209 | 209 | ||
210 | static const u32 golden_settings_gc_9_x_common[] = | ||
211 | { | ||
212 | SOC15_REG_OFFSET(GC, 0, mmGRBM_CAM_INDEX), 0xffffffff, 0x00000000, | ||
213 | SOC15_REG_OFFSET(GC, 0, mmGRBM_CAM_DATA), 0xffffffff, 0x2544c382 | ||
214 | }; | ||
215 | |||
210 | #define VEGA10_GB_ADDR_CONFIG_GOLDEN 0x2a114042 | 216 | #define VEGA10_GB_ADDR_CONFIG_GOLDEN 0x2a114042 |
211 | #define RAVEN_GB_ADDR_CONFIG_GOLDEN 0x24000042 | 217 | #define RAVEN_GB_ADDR_CONFIG_GOLDEN 0x24000042 |
212 | 218 | ||
@@ -242,6 +248,9 @@ static void gfx_v9_0_init_golden_registers(struct amdgpu_device *adev) | |||
242 | default: | 248 | default: |
243 | break; | 249 | break; |
244 | } | 250 | } |
251 | |||
252 | amdgpu_program_register_sequence(adev, golden_settings_gc_9_x_common, | ||
253 | (const u32)ARRAY_SIZE(golden_settings_gc_9_x_common)); | ||
245 | } | 254 | } |
246 | 255 | ||
247 | static void gfx_v9_0_scratch_init(struct amdgpu_device *adev) | 256 | static void gfx_v9_0_scratch_init(struct amdgpu_device *adev) |
@@ -988,12 +997,22 @@ static void gfx_v9_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd, | |||
988 | start + SQIND_WAVE_SGPRS_OFFSET, size, dst); | 997 | start + SQIND_WAVE_SGPRS_OFFSET, size, dst); |
989 | } | 998 | } |
990 | 999 | ||
1000 | static void gfx_v9_0_read_wave_vgprs(struct amdgpu_device *adev, uint32_t simd, | ||
1001 | uint32_t wave, uint32_t thread, | ||
1002 | uint32_t start, uint32_t size, | ||
1003 | uint32_t *dst) | ||
1004 | { | ||
1005 | wave_read_regs( | ||
1006 | adev, simd, wave, thread, | ||
1007 | start + SQIND_WAVE_VGPRS_OFFSET, size, dst); | ||
1008 | } | ||
991 | 1009 | ||
992 | static const struct amdgpu_gfx_funcs gfx_v9_0_gfx_funcs = { | 1010 | static const struct amdgpu_gfx_funcs gfx_v9_0_gfx_funcs = { |
993 | .get_gpu_clock_counter = &gfx_v9_0_get_gpu_clock_counter, | 1011 | .get_gpu_clock_counter = &gfx_v9_0_get_gpu_clock_counter, |
994 | .select_se_sh = &gfx_v9_0_select_se_sh, | 1012 | .select_se_sh = &gfx_v9_0_select_se_sh, |
995 | .read_wave_data = &gfx_v9_0_read_wave_data, | 1013 | .read_wave_data = &gfx_v9_0_read_wave_data, |
996 | .read_wave_sgprs = &gfx_v9_0_read_wave_sgprs, | 1014 | .read_wave_sgprs = &gfx_v9_0_read_wave_sgprs, |
1015 | .read_wave_vgprs = &gfx_v9_0_read_wave_vgprs, | ||
997 | }; | 1016 | }; |
998 | 1017 | ||
999 | static void gfx_v9_0_gpu_early_init(struct amdgpu_device *adev) | 1018 | static void gfx_v9_0_gpu_early_init(struct amdgpu_device *adev) |
@@ -1449,6 +1468,14 @@ static int gfx_v9_0_sw_fini(void *handle) | |||
1449 | 1468 | ||
1450 | gfx_v9_0_mec_fini(adev); | 1469 | gfx_v9_0_mec_fini(adev); |
1451 | gfx_v9_0_ngg_fini(adev); | 1470 | gfx_v9_0_ngg_fini(adev); |
1471 | amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj, | ||
1472 | &adev->gfx.rlc.clear_state_gpu_addr, | ||
1473 | (void **)&adev->gfx.rlc.cs_ptr); | ||
1474 | if (adev->asic_type == CHIP_RAVEN) { | ||
1475 | amdgpu_bo_free_kernel(&adev->gfx.rlc.cp_table_obj, | ||
1476 | &adev->gfx.rlc.cp_table_gpu_addr, | ||
1477 | (void **)&adev->gfx.rlc.cp_table_ptr); | ||
1478 | } | ||
1452 | gfx_v9_0_free_microcode(adev); | 1479 | gfx_v9_0_free_microcode(adev); |
1453 | 1480 | ||
1454 | return 0; | 1481 | return 0; |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c index 621699331e09..c8f1aebeac7a 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | |||
@@ -392,7 +392,16 @@ static int gmc_v9_0_early_init(void *handle) | |||
392 | static int gmc_v9_0_late_init(void *handle) | 392 | static int gmc_v9_0_late_init(void *handle) |
393 | { | 393 | { |
394 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 394 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
395 | unsigned vm_inv_eng[AMDGPU_MAX_VMHUBS] = { 3, 3 }; | 395 | /* |
396 | * The latest engine allocation on gfx9 is: | ||
397 | * Engine 0, 1: idle | ||
398 | * Engine 2, 3: firmware | ||
399 | * Engine 4~13: amdgpu ring, subject to change when ring number changes | ||
400 | * Engine 14~15: idle | ||
401 | * Engine 16: kfd tlb invalidation | ||
402 | * Engine 17: Gart flushes | ||
403 | */ | ||
404 | unsigned vm_inv_eng[AMDGPU_MAX_VMHUBS] = { 4, 4 }; | ||
396 | unsigned i; | 405 | unsigned i; |
397 | 406 | ||
398 | for(i = 0; i < adev->num_rings; ++i) { | 407 | for(i = 0; i < adev->num_rings; ++i) { |
@@ -405,9 +414,9 @@ static int gmc_v9_0_late_init(void *handle) | |||
405 | ring->funcs->vmhub); | 414 | ring->funcs->vmhub); |
406 | } | 415 | } |
407 | 416 | ||
408 | /* Engine 17 is used for GART flushes */ | 417 | /* Engine 16 is used for KFD and 17 for GART flushes */ |
409 | for(i = 0; i < AMDGPU_MAX_VMHUBS; ++i) | 418 | for(i = 0; i < AMDGPU_MAX_VMHUBS; ++i) |
410 | BUG_ON(vm_inv_eng[i] > 17); | 419 | BUG_ON(vm_inv_eng[i] > 16); |
411 | 420 | ||
412 | return amdgpu_irq_get(adev, &adev->mc.vm_fault, 0); | 421 | return amdgpu_irq_get(adev, &adev->mc.vm_fault, 0); |
413 | } | 422 | } |
diff --git a/drivers/gpu/drm/amd/include/amd_shared.h b/drivers/gpu/drm/amd/include/amd_shared.h index de6fc2731b98..b72f8a43d86b 100644 --- a/drivers/gpu/drm/amd/include/amd_shared.h +++ b/drivers/gpu/drm/amd/include/amd_shared.h | |||
@@ -23,36 +23,11 @@ | |||
23 | #ifndef __AMD_SHARED_H__ | 23 | #ifndef __AMD_SHARED_H__ |
24 | #define __AMD_SHARED_H__ | 24 | #define __AMD_SHARED_H__ |
25 | 25 | ||
26 | #define AMD_MAX_USEC_TIMEOUT 200000 /* 200 ms */ | 26 | #include <drm/amd_asic_type.h> |
27 | 27 | ||
28 | struct seq_file; | 28 | struct seq_file; |
29 | 29 | ||
30 | /* | 30 | #define AMD_MAX_USEC_TIMEOUT 200000 /* 200 ms */ |
31 | * Supported ASIC types | ||
32 | */ | ||
33 | enum amd_asic_type { | ||
34 | CHIP_TAHITI = 0, | ||
35 | CHIP_PITCAIRN, | ||
36 | CHIP_VERDE, | ||
37 | CHIP_OLAND, | ||
38 | CHIP_HAINAN, | ||
39 | CHIP_BONAIRE, | ||
40 | CHIP_KAVERI, | ||
41 | CHIP_KABINI, | ||
42 | CHIP_HAWAII, | ||
43 | CHIP_MULLINS, | ||
44 | CHIP_TOPAZ, | ||
45 | CHIP_TONGA, | ||
46 | CHIP_FIJI, | ||
47 | CHIP_CARRIZO, | ||
48 | CHIP_STONEY, | ||
49 | CHIP_POLARIS10, | ||
50 | CHIP_POLARIS11, | ||
51 | CHIP_POLARIS12, | ||
52 | CHIP_VEGA10, | ||
53 | CHIP_RAVEN, | ||
54 | CHIP_LAST, | ||
55 | }; | ||
56 | 31 | ||
57 | /* | 32 | /* |
58 | * Chip flags | 33 | * Chip flags |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c index a129bc5b1844..c6febbf0bf69 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c | |||
@@ -1486,7 +1486,7 @@ int atomctrl_get_leakage_vddc_base_on_leakage(struct pp_hwmgr *hwmgr, | |||
1486 | if (vddci_id_buf[i] == virtual_voltage_id) { | 1486 | if (vddci_id_buf[i] == virtual_voltage_id) { |
1487 | for (j = 0; j < profile->ucLeakageBinNum; j++) { | 1487 | for (j = 0; j < profile->ucLeakageBinNum; j++) { |
1488 | if (efuse_voltage_id <= leakage_bin[j]) { | 1488 | if (efuse_voltage_id <= leakage_bin[j]) { |
1489 | *vddci = vddci_buf[j * profile->ucElbVDDC_Num + i]; | 1489 | *vddci = vddci_buf[j * profile->ucElbVDDCI_Num + i]; |
1490 | break; | 1490 | break; |
1491 | } | 1491 | } |
1492 | } | 1492 | } |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/process_pptables_v1_0.c b/drivers/gpu/drm/amd/powerplay/hwmgr/process_pptables_v1_0.c index d1af1483c69b..a651ebcf44fd 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/process_pptables_v1_0.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/process_pptables_v1_0.c | |||
@@ -830,9 +830,9 @@ static int init_over_drive_limits( | |||
830 | const ATOM_Tonga_POWERPLAYTABLE *powerplay_table) | 830 | const ATOM_Tonga_POWERPLAYTABLE *powerplay_table) |
831 | { | 831 | { |
832 | hwmgr->platform_descriptor.overdriveLimit.engineClock = | 832 | hwmgr->platform_descriptor.overdriveLimit.engineClock = |
833 | le16_to_cpu(powerplay_table->ulMaxODEngineClock); | 833 | le32_to_cpu(powerplay_table->ulMaxODEngineClock); |
834 | hwmgr->platform_descriptor.overdriveLimit.memoryClock = | 834 | hwmgr->platform_descriptor.overdriveLimit.memoryClock = |
835 | le16_to_cpu(powerplay_table->ulMaxODMemoryClock); | 835 | le32_to_cpu(powerplay_table->ulMaxODMemoryClock); |
836 | 836 | ||
837 | hwmgr->platform_descriptor.minOverdriveVDDC = 0; | 837 | hwmgr->platform_descriptor.minOverdriveVDDC = 0; |
838 | hwmgr->platform_descriptor.maxOverdriveVDDC = 0; | 838 | hwmgr->platform_descriptor.maxOverdriveVDDC = 0; |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c index 4466469cf8ab..e33ec7fc5d09 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | |||
@@ -3778,7 +3778,7 @@ static int smu7_unfreeze_sclk_mclk_dpm(struct pp_hwmgr *hwmgr) | |||
3778 | "Trying to Unfreeze MCLK DPM when DPM is disabled", | 3778 | "Trying to Unfreeze MCLK DPM when DPM is disabled", |
3779 | ); | 3779 | ); |
3780 | PP_ASSERT_WITH_CODE(0 == smum_send_msg_to_smc(hwmgr, | 3780 | PP_ASSERT_WITH_CODE(0 == smum_send_msg_to_smc(hwmgr, |
3781 | PPSMC_MSG_SCLKDPM_UnfreezeLevel), | 3781 | PPSMC_MSG_MCLKDPM_UnfreezeLevel), |
3782 | "Failed to unfreeze MCLK DPM during UnFreezeSclkMclkDPM Function!", | 3782 | "Failed to unfreeze MCLK DPM during UnFreezeSclkMclkDPM Function!", |
3783 | return -EINVAL); | 3783 | return -EINVAL); |
3784 | } | 3784 | } |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c index 4239b98cf6db..f8d838c2c8ee 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | |||
@@ -753,6 +753,7 @@ static int vega10_hwmgr_backend_init(struct pp_hwmgr *hwmgr) | |||
753 | uint32_t config_telemetry = 0; | 753 | uint32_t config_telemetry = 0; |
754 | struct pp_atomfwctrl_voltage_table vol_table; | 754 | struct pp_atomfwctrl_voltage_table vol_table; |
755 | struct cgs_system_info sys_info = {0}; | 755 | struct cgs_system_info sys_info = {0}; |
756 | uint32_t reg; | ||
756 | 757 | ||
757 | data = kzalloc(sizeof(struct vega10_hwmgr), GFP_KERNEL); | 758 | data = kzalloc(sizeof(struct vega10_hwmgr), GFP_KERNEL); |
758 | if (data == NULL) | 759 | if (data == NULL) |
@@ -859,6 +860,16 @@ static int vega10_hwmgr_backend_init(struct pp_hwmgr *hwmgr) | |||
859 | advanceFanControlParameters.usFanPWMMinLimit * | 860 | advanceFanControlParameters.usFanPWMMinLimit * |
860 | hwmgr->thermal_controller.fanInfo.ulMaxRPM / 100; | 861 | hwmgr->thermal_controller.fanInfo.ulMaxRPM / 100; |
861 | 862 | ||
863 | reg = soc15_get_register_offset(DF_HWID, 0, | ||
864 | mmDF_CS_AON0_DramBaseAddress0_BASE_IDX, | ||
865 | mmDF_CS_AON0_DramBaseAddress0); | ||
866 | data->mem_channels = (cgs_read_register(hwmgr->device, reg) & | ||
867 | DF_CS_AON0_DramBaseAddress0__IntLvNumChan_MASK) >> | ||
868 | DF_CS_AON0_DramBaseAddress0__IntLvNumChan__SHIFT; | ||
869 | PP_ASSERT_WITH_CODE(data->mem_channels < ARRAY_SIZE(channel_number), | ||
870 | "Mem Channel Index Exceeded maximum!", | ||
871 | return -EINVAL); | ||
872 | |||
862 | return result; | 873 | return result; |
863 | } | 874 | } |
864 | 875 | ||
@@ -1777,7 +1788,7 @@ static int vega10_populate_all_memory_levels(struct pp_hwmgr *hwmgr) | |||
1777 | struct vega10_single_dpm_table *dpm_table = | 1788 | struct vega10_single_dpm_table *dpm_table = |
1778 | &(data->dpm_table.mem_table); | 1789 | &(data->dpm_table.mem_table); |
1779 | int result = 0; | 1790 | int result = 0; |
1780 | uint32_t i, j, reg, mem_channels; | 1791 | uint32_t i, j; |
1781 | 1792 | ||
1782 | for (i = 0; i < dpm_table->count; i++) { | 1793 | for (i = 0; i < dpm_table->count; i++) { |
1783 | result = vega10_populate_single_memory_level(hwmgr, | 1794 | result = vega10_populate_single_memory_level(hwmgr, |
@@ -1801,16 +1812,10 @@ static int vega10_populate_all_memory_levels(struct pp_hwmgr *hwmgr) | |||
1801 | i++; | 1812 | i++; |
1802 | } | 1813 | } |
1803 | 1814 | ||
1804 | reg = soc15_get_register_offset(DF_HWID, 0, | 1815 | pp_table->NumMemoryChannels = (uint16_t)(data->mem_channels); |
1805 | mmDF_CS_AON0_DramBaseAddress0_BASE_IDX, | ||
1806 | mmDF_CS_AON0_DramBaseAddress0); | ||
1807 | mem_channels = (cgs_read_register(hwmgr->device, reg) & | ||
1808 | DF_CS_AON0_DramBaseAddress0__IntLvNumChan_MASK) >> | ||
1809 | DF_CS_AON0_DramBaseAddress0__IntLvNumChan__SHIFT; | ||
1810 | pp_table->NumMemoryChannels = cpu_to_le16(mem_channels); | ||
1811 | pp_table->MemoryChannelWidth = | 1816 | pp_table->MemoryChannelWidth = |
1812 | cpu_to_le16(HBM_MEMORY_CHANNEL_WIDTH * | 1817 | (uint16_t)(HBM_MEMORY_CHANNEL_WIDTH * |
1813 | channel_number[mem_channels]); | 1818 | channel_number[data->mem_channels]); |
1814 | 1819 | ||
1815 | pp_table->LowestUclkReservedForUlv = | 1820 | pp_table->LowestUclkReservedForUlv = |
1816 | (uint8_t)(data->lowest_uclk_reserved_for_ulv); | 1821 | (uint8_t)(data->lowest_uclk_reserved_for_ulv); |
@@ -3134,6 +3139,8 @@ static int vega10_apply_state_adjust_rules(struct pp_hwmgr *hwmgr, | |||
3134 | minimum_clocks.memoryClock = hwmgr->display_config.min_mem_set_clock; | 3139 | minimum_clocks.memoryClock = hwmgr->display_config.min_mem_set_clock; |
3135 | 3140 | ||
3136 | if (PP_CAP(PHM_PlatformCaps_StablePState)) { | 3141 | if (PP_CAP(PHM_PlatformCaps_StablePState)) { |
3142 | stable_pstate_sclk_dpm_percentage = | ||
3143 | data->registry_data.stable_pstate_sclk_dpm_percentage; | ||
3137 | PP_ASSERT_WITH_CODE( | 3144 | PP_ASSERT_WITH_CODE( |
3138 | data->registry_data.stable_pstate_sclk_dpm_percentage >= 1 && | 3145 | data->registry_data.stable_pstate_sclk_dpm_percentage >= 1 && |
3139 | data->registry_data.stable_pstate_sclk_dpm_percentage <= 100, | 3146 | data->registry_data.stable_pstate_sclk_dpm_percentage <= 100, |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h index b4b461c3b8ee..8f7358cc3327 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h | |||
@@ -389,6 +389,7 @@ struct vega10_hwmgr { | |||
389 | uint32_t config_telemetry; | 389 | uint32_t config_telemetry; |
390 | uint32_t smu_version; | 390 | uint32_t smu_version; |
391 | uint32_t acg_loop_state; | 391 | uint32_t acg_loop_state; |
392 | uint32_t mem_channels; | ||
392 | }; | 393 | }; |
393 | 394 | ||
394 | #define VEGA10_DPM2_NEAR_TDP_DEC 10 | 395 | #define VEGA10_DPM2_NEAR_TDP_DEC 10 |
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c index 704fc8934616..25f4b2e9a44f 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c | |||
@@ -234,6 +234,10 @@ int drm_connector_init(struct drm_device *dev, | |||
234 | config->link_status_property, | 234 | config->link_status_property, |
235 | 0); | 235 | 0); |
236 | 236 | ||
237 | drm_object_attach_property(&connector->base, | ||
238 | config->non_desktop_property, | ||
239 | 0); | ||
240 | |||
237 | if (drm_core_check_feature(dev, DRIVER_ATOMIC)) { | 241 | if (drm_core_check_feature(dev, DRIVER_ATOMIC)) { |
238 | drm_object_attach_property(&connector->base, config->prop_crtc_id, 0); | 242 | drm_object_attach_property(&connector->base, config->prop_crtc_id, 0); |
239 | } | 243 | } |
@@ -763,6 +767,10 @@ DRM_ENUM_NAME_FN(drm_get_tv_subconnector_name, | |||
763 | * value of link-status is "GOOD". If something fails during or after modeset, | 767 | * value of link-status is "GOOD". If something fails during or after modeset, |
764 | * the kernel driver may set this to "BAD" and issue a hotplug uevent. Drivers | 768 | * the kernel driver may set this to "BAD" and issue a hotplug uevent. Drivers |
765 | * should update this value using drm_mode_connector_set_link_status_property(). | 769 | * should update this value using drm_mode_connector_set_link_status_property(). |
770 | * non_desktop: | ||
771 | * Indicates the output should be ignored for purposes of displaying a | ||
772 | * standard desktop environment or console. This is most likely because | ||
773 | * the output device is not rectilinear. | ||
766 | * | 774 | * |
767 | * Connectors also have one standardized atomic property: | 775 | * Connectors also have one standardized atomic property: |
768 | * | 776 | * |
@@ -811,6 +819,11 @@ int drm_connector_create_standard_properties(struct drm_device *dev) | |||
811 | return -ENOMEM; | 819 | return -ENOMEM; |
812 | dev->mode_config.link_status_property = prop; | 820 | dev->mode_config.link_status_property = prop; |
813 | 821 | ||
822 | prop = drm_property_create_bool(dev, DRM_MODE_PROP_IMMUTABLE, "non-desktop"); | ||
823 | if (!prop) | ||
824 | return -ENOMEM; | ||
825 | dev->mode_config.non_desktop_property = prop; | ||
826 | |||
814 | return 0; | 827 | return 0; |
815 | } | 828 | } |
816 | 829 | ||
@@ -1194,6 +1207,10 @@ int drm_mode_connector_update_edid_property(struct drm_connector *connector, | |||
1194 | if (edid) | 1207 | if (edid) |
1195 | size = EDID_LENGTH * (1 + edid->extensions); | 1208 | size = EDID_LENGTH * (1 + edid->extensions); |
1196 | 1209 | ||
1210 | drm_object_property_set_value(&connector->base, | ||
1211 | dev->mode_config.non_desktop_property, | ||
1212 | connector->display_info.non_desktop); | ||
1213 | |||
1197 | ret = drm_property_replace_global_blob(dev, | 1214 | ret = drm_property_replace_global_blob(dev, |
1198 | &connector->edid_blob_ptr, | 1215 | &connector->edid_blob_ptr, |
1199 | size, | 1216 | size, |
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 00ddabfbf980..2e8fb51282ef 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
@@ -82,6 +82,8 @@ | |||
82 | #define EDID_QUIRK_FORCE_6BPC (1 << 10) | 82 | #define EDID_QUIRK_FORCE_6BPC (1 << 10) |
83 | /* Force 10bpc */ | 83 | /* Force 10bpc */ |
84 | #define EDID_QUIRK_FORCE_10BPC (1 << 11) | 84 | #define EDID_QUIRK_FORCE_10BPC (1 << 11) |
85 | /* Non desktop display (i.e. HMD) */ | ||
86 | #define EDID_QUIRK_NON_DESKTOP (1 << 12) | ||
85 | 87 | ||
86 | struct detailed_mode_closure { | 88 | struct detailed_mode_closure { |
87 | struct drm_connector *connector; | 89 | struct drm_connector *connector; |
@@ -157,6 +159,9 @@ static const struct edid_quirk { | |||
157 | 159 | ||
158 | /* Rotel RSX-1058 forwards sink's EDID but only does HDMI 1.1*/ | 160 | /* Rotel RSX-1058 forwards sink's EDID but only does HDMI 1.1*/ |
159 | { "ETR", 13896, EDID_QUIRK_FORCE_8BPC }, | 161 | { "ETR", 13896, EDID_QUIRK_FORCE_8BPC }, |
162 | |||
163 | /* HTC Vive VR Headset */ | ||
164 | { "HVR", 0xaa01, EDID_QUIRK_NON_DESKTOP }, | ||
160 | }; | 165 | }; |
161 | 166 | ||
162 | /* | 167 | /* |
@@ -4393,7 +4398,7 @@ static void drm_parse_cea_ext(struct drm_connector *connector, | |||
4393 | } | 4398 | } |
4394 | 4399 | ||
4395 | static void drm_add_display_info(struct drm_connector *connector, | 4400 | static void drm_add_display_info(struct drm_connector *connector, |
4396 | struct edid *edid) | 4401 | struct edid *edid, u32 quirks) |
4397 | { | 4402 | { |
4398 | struct drm_display_info *info = &connector->display_info; | 4403 | struct drm_display_info *info = &connector->display_info; |
4399 | 4404 | ||
@@ -4407,6 +4412,8 @@ static void drm_add_display_info(struct drm_connector *connector, | |||
4407 | info->max_tmds_clock = 0; | 4412 | info->max_tmds_clock = 0; |
4408 | info->dvi_dual = false; | 4413 | info->dvi_dual = false; |
4409 | 4414 | ||
4415 | info->non_desktop = !!(quirks & EDID_QUIRK_NON_DESKTOP); | ||
4416 | |||
4410 | if (edid->revision < 3) | 4417 | if (edid->revision < 3) |
4411 | return; | 4418 | return; |
4412 | 4419 | ||
@@ -4627,7 +4634,7 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) | |||
4627 | * To avoid multiple parsing of same block, lets parse that map | 4634 | * To avoid multiple parsing of same block, lets parse that map |
4628 | * from sink info, before parsing CEA modes. | 4635 | * from sink info, before parsing CEA modes. |
4629 | */ | 4636 | */ |
4630 | drm_add_display_info(connector, edid); | 4637 | drm_add_display_info(connector, edid, quirks); |
4631 | 4638 | ||
4632 | /* | 4639 | /* |
4633 | * EDID spec says modes should be preferred in this order: | 4640 | * EDID spec says modes should be preferred in this order: |
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 116d1f1337c7..07374008f146 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
@@ -2033,6 +2033,9 @@ static bool drm_connector_enabled(struct drm_connector *connector, bool strict) | |||
2033 | { | 2033 | { |
2034 | bool enable; | 2034 | bool enable; |
2035 | 2035 | ||
2036 | if (connector->display_info.non_desktop) | ||
2037 | return false; | ||
2038 | |||
2036 | if (strict) | 2039 | if (strict) |
2037 | enable = connector->status == connector_status_connected; | 2040 | enable = connector->status == connector_status_connected; |
2038 | else | 2041 | else |
@@ -2052,7 +2055,8 @@ static void drm_enable_connectors(struct drm_fb_helper *fb_helper, | |||
2052 | connector = fb_helper->connector_info[i]->connector; | 2055 | connector = fb_helper->connector_info[i]->connector; |
2053 | enabled[i] = drm_connector_enabled(connector, true); | 2056 | enabled[i] = drm_connector_enabled(connector, true); |
2054 | DRM_DEBUG_KMS("connector %d enabled? %s\n", connector->base.id, | 2057 | DRM_DEBUG_KMS("connector %d enabled? %s\n", connector->base.id, |
2055 | enabled[i] ? "yes" : "no"); | 2058 | connector->display_info.non_desktop ? "non desktop" : enabled[i] ? "yes" : "no"); |
2059 | |||
2056 | any_enabled |= enabled[i]; | 2060 | any_enabled |= enabled[i]; |
2057 | } | 2061 | } |
2058 | 2062 | ||
diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c index 2affe53f3fda..279c1035c12d 100644 --- a/drivers/gpu/drm/drm_framebuffer.c +++ b/drivers/gpu/drm/drm_framebuffer.c | |||
@@ -681,6 +681,7 @@ EXPORT_SYMBOL(drm_framebuffer_init); | |||
681 | /** | 681 | /** |
682 | * drm_framebuffer_lookup - look up a drm framebuffer and grab a reference | 682 | * drm_framebuffer_lookup - look up a drm framebuffer and grab a reference |
683 | * @dev: drm device | 683 | * @dev: drm device |
684 | * @file_priv: drm file to check for lease against. | ||
684 | * @id: id of the fb object | 685 | * @id: id of the fb object |
685 | * | 686 | * |
686 | * If successful, this grabs an additional reference to the framebuffer - | 687 | * If successful, this grabs an additional reference to the framebuffer - |
diff --git a/drivers/gpu/drm/drm_mode_object.c b/drivers/gpu/drm/drm_mode_object.c index 7c8b2698c6a7..ce4d2fb32810 100644 --- a/drivers/gpu/drm/drm_mode_object.c +++ b/drivers/gpu/drm/drm_mode_object.c | |||
@@ -151,6 +151,7 @@ struct drm_mode_object *__drm_mode_object_find(struct drm_device *dev, | |||
151 | 151 | ||
152 | /** | 152 | /** |
153 | * drm_mode_object_find - look up a drm object with static lifetime | 153 | * drm_mode_object_find - look up a drm object with static lifetime |
154 | * @dev: drm device | ||
154 | * @file_priv: drm file | 155 | * @file_priv: drm file |
155 | * @id: id of the mode object | 156 | * @id: id of the mode object |
156 | * @type: type of the mode object | 157 | * @type: type of the mode object |
diff --git a/drivers/gpu/drm/drm_modeset_lock.c b/drivers/gpu/drm/drm_modeset_lock.c index e123497da0ca..963e23db0fe7 100644 --- a/drivers/gpu/drm/drm_modeset_lock.c +++ b/drivers/gpu/drm/drm_modeset_lock.c | |||
@@ -93,7 +93,7 @@ void drm_modeset_lock_all(struct drm_device *dev) | |||
93 | struct drm_modeset_acquire_ctx *ctx; | 93 | struct drm_modeset_acquire_ctx *ctx; |
94 | int ret; | 94 | int ret; |
95 | 95 | ||
96 | ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); | 96 | ctx = kzalloc(sizeof(*ctx), GFP_KERNEL | __GFP_NOFAIL); |
97 | if (WARN_ON(!ctx)) | 97 | if (WARN_ON(!ctx)) |
98 | return; | 98 | return; |
99 | 99 | ||
diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c index 19404e34cd59..37a93cdffb4a 100644 --- a/drivers/gpu/drm/drm_plane.c +++ b/drivers/gpu/drm/drm_plane.c | |||
@@ -1030,6 +1030,7 @@ retry: | |||
1030 | e->event.base.type = DRM_EVENT_FLIP_COMPLETE; | 1030 | e->event.base.type = DRM_EVENT_FLIP_COMPLETE; |
1031 | e->event.base.length = sizeof(e->event); | 1031 | e->event.base.length = sizeof(e->event); |
1032 | e->event.vbl.user_data = page_flip->user_data; | 1032 | e->event.vbl.user_data = page_flip->user_data; |
1033 | e->event.vbl.crtc_id = crtc->base.id; | ||
1033 | ret = drm_event_reserve_init(dev, file_priv, &e->base, &e->event.base); | 1034 | ret = drm_event_reserve_init(dev, file_priv, &e->base, &e->event.base); |
1034 | if (ret) { | 1035 | if (ret) { |
1035 | kfree(e); | 1036 | kfree(e); |
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c index 57cc6e37c810..09c1c4ff93ca 100644 --- a/drivers/gpu/drm/drm_vblank.c +++ b/drivers/gpu/drm/drm_vblank.c | |||
@@ -299,8 +299,8 @@ u32 drm_crtc_accurate_vblank_count(struct drm_crtc *crtc) | |||
299 | u32 vblank; | 299 | u32 vblank; |
300 | unsigned long flags; | 300 | unsigned long flags; |
301 | 301 | ||
302 | WARN(!dev->driver->get_vblank_timestamp, | 302 | WARN_ONCE(drm_debug & DRM_UT_VBL && !dev->driver->get_vblank_timestamp, |
303 | "This function requires support for accurate vblank timestamps."); | 303 | "This function requires support for accurate vblank timestamps."); |
304 | 304 | ||
305 | spin_lock_irqsave(&dev->vblank_time_lock, flags); | 305 | spin_lock_irqsave(&dev->vblank_time_lock, flags); |
306 | 306 | ||
diff --git a/drivers/gpu/drm/exynos/Kconfig b/drivers/gpu/drm/exynos/Kconfig index 305dc3d4ff77..5a7c9d8abd6b 100644 --- a/drivers/gpu/drm/exynos/Kconfig +++ b/drivers/gpu/drm/exynos/Kconfig | |||
@@ -3,6 +3,7 @@ config DRM_EXYNOS | |||
3 | depends on OF && DRM && (ARCH_S3C64XX || ARCH_EXYNOS || ARCH_MULTIPLATFORM) | 3 | depends on OF && DRM && (ARCH_S3C64XX || ARCH_EXYNOS || ARCH_MULTIPLATFORM) |
4 | select DRM_KMS_HELPER | 4 | select DRM_KMS_HELPER |
5 | select VIDEOMODE_HELPERS | 5 | select VIDEOMODE_HELPERS |
6 | select SND_SOC_HDMI_CODEC if SND_SOC | ||
6 | help | 7 | help |
7 | Choose this option if you have a Samsung SoC EXYNOS chipset. | 8 | Choose this option if you have a Samsung SoC EXYNOS chipset. |
8 | If M is selected the module will be called exynosdrm. | 9 | If M is selected the module will be called exynosdrm. |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c index 6ce0821590df..dc01342e759a 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c | |||
@@ -95,8 +95,23 @@ static enum drm_mode_status exynos_crtc_mode_valid(struct drm_crtc *crtc, | |||
95 | return MODE_OK; | 95 | return MODE_OK; |
96 | } | 96 | } |
97 | 97 | ||
98 | static bool exynos_crtc_mode_fixup(struct drm_crtc *crtc, | ||
99 | const struct drm_display_mode *mode, | ||
100 | struct drm_display_mode *adjusted_mode) | ||
101 | { | ||
102 | struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); | ||
103 | |||
104 | if (exynos_crtc->ops->mode_fixup) | ||
105 | return exynos_crtc->ops->mode_fixup(exynos_crtc, mode, | ||
106 | adjusted_mode); | ||
107 | |||
108 | return true; | ||
109 | } | ||
110 | |||
111 | |||
98 | static const struct drm_crtc_helper_funcs exynos_crtc_helper_funcs = { | 112 | static const struct drm_crtc_helper_funcs exynos_crtc_helper_funcs = { |
99 | .mode_valid = exynos_crtc_mode_valid, | 113 | .mode_valid = exynos_crtc_mode_valid, |
114 | .mode_fixup = exynos_crtc_mode_fixup, | ||
100 | .atomic_check = exynos_crtc_atomic_check, | 115 | .atomic_check = exynos_crtc_atomic_check, |
101 | .atomic_begin = exynos_crtc_atomic_begin, | 116 | .atomic_begin = exynos_crtc_atomic_begin, |
102 | .atomic_flush = exynos_crtc_atomic_flush, | 117 | .atomic_flush = exynos_crtc_atomic_flush, |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h index f8bae4cb4823..c6847fa708fa 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h | |||
@@ -136,6 +136,9 @@ struct exynos_drm_crtc_ops { | |||
136 | u32 (*get_vblank_counter)(struct exynos_drm_crtc *crtc); | 136 | u32 (*get_vblank_counter)(struct exynos_drm_crtc *crtc); |
137 | enum drm_mode_status (*mode_valid)(struct exynos_drm_crtc *crtc, | 137 | enum drm_mode_status (*mode_valid)(struct exynos_drm_crtc *crtc, |
138 | const struct drm_display_mode *mode); | 138 | const struct drm_display_mode *mode); |
139 | bool (*mode_fixup)(struct exynos_drm_crtc *crtc, | ||
140 | const struct drm_display_mode *mode, | ||
141 | struct drm_display_mode *adjusted_mode); | ||
139 | int (*atomic_check)(struct exynos_drm_crtc *crtc, | 142 | int (*atomic_check)(struct exynos_drm_crtc *crtc, |
140 | struct drm_crtc_state *state); | 143 | struct drm_crtc_state *state); |
141 | void (*atomic_begin)(struct exynos_drm_crtc *crtc); | 144 | void (*atomic_begin)(struct exynos_drm_crtc *crtc); |
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c index 0109ff40b1db..82d1b7e2febe 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c | |||
@@ -40,7 +40,7 @@ | |||
40 | #include <linux/component.h> | 40 | #include <linux/component.h> |
41 | #include <linux/mfd/syscon.h> | 41 | #include <linux/mfd/syscon.h> |
42 | #include <linux/regmap.h> | 42 | #include <linux/regmap.h> |
43 | 43 | #include <sound/hdmi-codec.h> | |
44 | #include <drm/exynos_drm.h> | 44 | #include <drm/exynos_drm.h> |
45 | 45 | ||
46 | #include <media/cec-notifier.h> | 46 | #include <media/cec-notifier.h> |
@@ -111,15 +111,20 @@ struct hdmi_driver_data { | |||
111 | struct string_array_spec clk_muxes; | 111 | struct string_array_spec clk_muxes; |
112 | }; | 112 | }; |
113 | 113 | ||
114 | struct hdmi_audio { | ||
115 | struct platform_device *pdev; | ||
116 | struct hdmi_audio_infoframe infoframe; | ||
117 | struct hdmi_codec_params params; | ||
118 | bool mute; | ||
119 | }; | ||
120 | |||
114 | struct hdmi_context { | 121 | struct hdmi_context { |
115 | struct drm_encoder encoder; | 122 | struct drm_encoder encoder; |
116 | struct device *dev; | 123 | struct device *dev; |
117 | struct drm_device *drm_dev; | 124 | struct drm_device *drm_dev; |
118 | struct drm_connector connector; | 125 | struct drm_connector connector; |
119 | bool powered; | ||
120 | bool dvi_mode; | 126 | bool dvi_mode; |
121 | struct delayed_work hotplug_work; | 127 | struct delayed_work hotplug_work; |
122 | struct drm_display_mode current_mode; | ||
123 | struct cec_notifier *notifier; | 128 | struct cec_notifier *notifier; |
124 | const struct hdmi_driver_data *drv_data; | 129 | const struct hdmi_driver_data *drv_data; |
125 | 130 | ||
@@ -137,6 +142,11 @@ struct hdmi_context { | |||
137 | struct regulator *reg_hdmi_en; | 142 | struct regulator *reg_hdmi_en; |
138 | struct exynos_drm_clk phy_clk; | 143 | struct exynos_drm_clk phy_clk; |
139 | struct drm_bridge *bridge; | 144 | struct drm_bridge *bridge; |
145 | |||
146 | /* mutex protecting subsequent fields below */ | ||
147 | struct mutex mutex; | ||
148 | struct hdmi_audio audio; | ||
149 | bool powered; | ||
140 | }; | 150 | }; |
141 | 151 | ||
142 | static inline struct hdmi_context *encoder_to_hdmi(struct drm_encoder *e) | 152 | static inline struct hdmi_context *encoder_to_hdmi(struct drm_encoder *e) |
@@ -298,6 +308,15 @@ static const struct hdmiphy_config hdmiphy_v14_configs[] = { | |||
298 | }, | 308 | }, |
299 | }, | 309 | }, |
300 | { | 310 | { |
311 | .pixel_clock = 85500000, | ||
312 | .conf = { | ||
313 | 0x01, 0xd1, 0x24, 0x11, 0x40, 0x40, 0xd0, 0x08, | ||
314 | 0x84, 0xa0, 0xd6, 0xd8, 0x45, 0xa0, 0xac, 0x80, | ||
315 | 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86, | ||
316 | 0x54, 0x90, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80, | ||
317 | }, | ||
318 | }, | ||
319 | { | ||
301 | .pixel_clock = 106500000, | 320 | .pixel_clock = 106500000, |
302 | .conf = { | 321 | .conf = { |
303 | 0x01, 0xd1, 0x2c, 0x12, 0x40, 0x0c, 0x09, 0x08, | 322 | 0x01, 0xd1, 0x2c, 0x12, 0x40, 0x0c, 0x09, 0x08, |
@@ -768,8 +787,25 @@ static int hdmi_clk_set_parents(struct hdmi_context *hdata, bool to_phy) | |||
768 | return ret; | 787 | return ret; |
769 | } | 788 | } |
770 | 789 | ||
790 | static int hdmi_audio_infoframe_apply(struct hdmi_context *hdata) | ||
791 | { | ||
792 | struct hdmi_audio_infoframe *infoframe = &hdata->audio.infoframe; | ||
793 | u8 buf[HDMI_INFOFRAME_SIZE(AUDIO)]; | ||
794 | int len; | ||
795 | |||
796 | len = hdmi_audio_infoframe_pack(infoframe, buf, sizeof(buf)); | ||
797 | if (len < 0) | ||
798 | return len; | ||
799 | |||
800 | hdmi_reg_writeb(hdata, HDMI_AUI_CON, HDMI_AUI_CON_EVERY_VSYNC); | ||
801 | hdmi_reg_write_buf(hdata, HDMI_AUI_HEADER0, buf, len); | ||
802 | |||
803 | return 0; | ||
804 | } | ||
805 | |||
771 | static void hdmi_reg_infoframes(struct hdmi_context *hdata) | 806 | static void hdmi_reg_infoframes(struct hdmi_context *hdata) |
772 | { | 807 | { |
808 | struct drm_display_mode *m = &hdata->encoder.crtc->state->mode; | ||
773 | union hdmi_infoframe frm; | 809 | union hdmi_infoframe frm; |
774 | u8 buf[25]; | 810 | u8 buf[25]; |
775 | int ret; | 811 | int ret; |
@@ -783,8 +819,7 @@ static void hdmi_reg_infoframes(struct hdmi_context *hdata) | |||
783 | return; | 819 | return; |
784 | } | 820 | } |
785 | 821 | ||
786 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frm.avi, | 822 | ret = drm_hdmi_avi_infoframe_from_display_mode(&frm.avi, m, false); |
787 | &hdata->current_mode, false); | ||
788 | if (!ret) | 823 | if (!ret) |
789 | ret = hdmi_avi_infoframe_pack(&frm.avi, buf, sizeof(buf)); | 824 | ret = hdmi_avi_infoframe_pack(&frm.avi, buf, sizeof(buf)); |
790 | if (ret > 0) { | 825 | if (ret > 0) { |
@@ -794,8 +829,7 @@ static void hdmi_reg_infoframes(struct hdmi_context *hdata) | |||
794 | DRM_INFO("%s: invalid AVI infoframe (%d)\n", __func__, ret); | 829 | DRM_INFO("%s: invalid AVI infoframe (%d)\n", __func__, ret); |
795 | } | 830 | } |
796 | 831 | ||
797 | ret = drm_hdmi_vendor_infoframe_from_display_mode(&frm.vendor.hdmi, | 832 | ret = drm_hdmi_vendor_infoframe_from_display_mode(&frm.vendor.hdmi, m); |
798 | &hdata->current_mode); | ||
799 | if (!ret) | 833 | if (!ret) |
800 | ret = hdmi_vendor_infoframe_pack(&frm.vendor.hdmi, buf, | 834 | ret = hdmi_vendor_infoframe_pack(&frm.vendor.hdmi, buf, |
801 | sizeof(buf)); | 835 | sizeof(buf)); |
@@ -805,15 +839,7 @@ static void hdmi_reg_infoframes(struct hdmi_context *hdata) | |||
805 | hdmi_reg_write_buf(hdata, HDMI_VSI_DATA(0), buf + 3, ret - 3); | 839 | hdmi_reg_write_buf(hdata, HDMI_VSI_DATA(0), buf + 3, ret - 3); |
806 | } | 840 | } |
807 | 841 | ||
808 | ret = hdmi_audio_infoframe_init(&frm.audio); | 842 | hdmi_audio_infoframe_apply(hdata); |
809 | if (!ret) { | ||
810 | frm.audio.channels = 2; | ||
811 | ret = hdmi_audio_infoframe_pack(&frm.audio, buf, sizeof(buf)); | ||
812 | } | ||
813 | if (ret > 0) { | ||
814 | hdmi_reg_writeb(hdata, HDMI_AUI_CON, HDMI_AUI_CON_EVERY_VSYNC); | ||
815 | hdmi_reg_write_buf(hdata, HDMI_AUI_HEADER0, buf, ret); | ||
816 | } | ||
817 | } | 843 | } |
818 | 844 | ||
819 | static enum drm_connector_status hdmi_detect(struct drm_connector *connector, | 845 | static enum drm_connector_status hdmi_detect(struct drm_connector *connector, |
@@ -1003,23 +1029,18 @@ static void hdmi_reg_acr(struct hdmi_context *hdata, u32 freq) | |||
1003 | hdmi_reg_writeb(hdata, HDMI_ACR_CON, 4); | 1029 | hdmi_reg_writeb(hdata, HDMI_ACR_CON, 4); |
1004 | } | 1030 | } |
1005 | 1031 | ||
1006 | static void hdmi_audio_init(struct hdmi_context *hdata) | 1032 | static void hdmi_audio_config(struct hdmi_context *hdata) |
1007 | { | 1033 | { |
1008 | u32 sample_rate, bits_per_sample; | 1034 | u32 bit_ch = 1; |
1009 | u32 data_num, bit_ch, sample_frq; | 1035 | u32 data_num, val; |
1010 | u32 val; | 1036 | int i; |
1011 | |||
1012 | sample_rate = 44100; | ||
1013 | bits_per_sample = 16; | ||
1014 | 1037 | ||
1015 | switch (bits_per_sample) { | 1038 | switch (hdata->audio.params.sample_width) { |
1016 | case 20: | 1039 | case 20: |
1017 | data_num = 2; | 1040 | data_num = 2; |
1018 | bit_ch = 1; | ||
1019 | break; | 1041 | break; |
1020 | case 24: | 1042 | case 24: |
1021 | data_num = 3; | 1043 | data_num = 3; |
1022 | bit_ch = 1; | ||
1023 | break; | 1044 | break; |
1024 | default: | 1045 | default: |
1025 | data_num = 1; | 1046 | data_num = 1; |
@@ -1027,7 +1048,7 @@ static void hdmi_audio_init(struct hdmi_context *hdata) | |||
1027 | break; | 1048 | break; |
1028 | } | 1049 | } |
1029 | 1050 | ||
1030 | hdmi_reg_acr(hdata, sample_rate); | 1051 | hdmi_reg_acr(hdata, hdata->audio.params.sample_rate); |
1031 | 1052 | ||
1032 | hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CON, HDMI_I2S_IN_DISABLE | 1053 | hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CON, HDMI_I2S_IN_DISABLE |
1033 | | HDMI_I2S_AUD_I2S | HDMI_I2S_CUV_I2S_ENABLE | 1054 | | HDMI_I2S_AUD_I2S | HDMI_I2S_CUV_I2S_ENABLE |
@@ -1037,12 +1058,6 @@ static void hdmi_audio_init(struct hdmi_context *hdata) | |||
1037 | | HDMI_I2S_CH1_EN | HDMI_I2S_CH2_EN); | 1058 | | HDMI_I2S_CH1_EN | HDMI_I2S_CH2_EN); |
1038 | 1059 | ||
1039 | hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CUV, HDMI_I2S_CUV_RL_EN); | 1060 | hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CUV, HDMI_I2S_CUV_RL_EN); |
1040 | |||
1041 | sample_frq = (sample_rate == 44100) ? 0 : | ||
1042 | (sample_rate == 48000) ? 2 : | ||
1043 | (sample_rate == 32000) ? 3 : | ||
1044 | (sample_rate == 96000) ? 0xa : 0x0; | ||
1045 | |||
1046 | hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_DIS); | 1061 | hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_DIS); |
1047 | hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_EN); | 1062 | hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_EN); |
1048 | 1063 | ||
@@ -1066,39 +1081,33 @@ static void hdmi_audio_init(struct hdmi_context *hdata) | |||
1066 | | HDMI_I2S_SET_SDATA_BIT(data_num) | 1081 | | HDMI_I2S_SET_SDATA_BIT(data_num) |
1067 | | HDMI_I2S_BASIC_FORMAT); | 1082 | | HDMI_I2S_BASIC_FORMAT); |
1068 | 1083 | ||
1069 | /* Configure register related to CUV information */ | 1084 | /* Configuration of the audio channel status registers */ |
1070 | hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_0, HDMI_I2S_CH_STATUS_MODE_0 | 1085 | for (i = 0; i < HDMI_I2S_CH_ST_MAXNUM; i++) |
1071 | | HDMI_I2S_2AUD_CH_WITHOUT_PREEMPH | 1086 | hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST(i), |
1072 | | HDMI_I2S_COPYRIGHT | 1087 | hdata->audio.params.iec.status[i]); |
1073 | | HDMI_I2S_LINEAR_PCM | ||
1074 | | HDMI_I2S_CONSUMER_FORMAT); | ||
1075 | hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_1, HDMI_I2S_CD_PLAYER); | ||
1076 | hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_2, HDMI_I2S_SET_SOURCE_NUM(0)); | ||
1077 | hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_3, HDMI_I2S_CLK_ACCUR_LEVEL_2 | ||
1078 | | HDMI_I2S_SET_SMP_FREQ(sample_frq)); | ||
1079 | hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_4, | ||
1080 | HDMI_I2S_ORG_SMP_FREQ_44_1 | ||
1081 | | HDMI_I2S_WORD_LEN_MAX24_24BITS | ||
1082 | | HDMI_I2S_WORD_LEN_MAX_24BITS); | ||
1083 | 1088 | ||
1084 | hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_CON, HDMI_I2S_CH_STATUS_RELOAD); | 1089 | hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_CON, HDMI_I2S_CH_STATUS_RELOAD); |
1085 | } | 1090 | } |
1086 | 1091 | ||
1087 | static void hdmi_audio_control(struct hdmi_context *hdata, bool onoff) | 1092 | static void hdmi_audio_control(struct hdmi_context *hdata) |
1088 | { | 1093 | { |
1094 | bool enable = !hdata->audio.mute; | ||
1095 | |||
1089 | if (hdata->dvi_mode) | 1096 | if (hdata->dvi_mode) |
1090 | return; | 1097 | return; |
1091 | 1098 | ||
1092 | hdmi_reg_writeb(hdata, HDMI_AUI_CON, onoff ? 2 : 0); | 1099 | hdmi_reg_writeb(hdata, HDMI_AUI_CON, enable ? |
1093 | hdmi_reg_writemask(hdata, HDMI_CON_0, onoff ? | 1100 | HDMI_AVI_CON_EVERY_VSYNC : HDMI_AUI_CON_NO_TRAN); |
1101 | hdmi_reg_writemask(hdata, HDMI_CON_0, enable ? | ||
1094 | HDMI_ASP_EN : HDMI_ASP_DIS, HDMI_ASP_MASK); | 1102 | HDMI_ASP_EN : HDMI_ASP_DIS, HDMI_ASP_MASK); |
1095 | } | 1103 | } |
1096 | 1104 | ||
1097 | static void hdmi_start(struct hdmi_context *hdata, bool start) | 1105 | static void hdmi_start(struct hdmi_context *hdata, bool start) |
1098 | { | 1106 | { |
1107 | struct drm_display_mode *m = &hdata->encoder.crtc->state->mode; | ||
1099 | u32 val = start ? HDMI_TG_EN : 0; | 1108 | u32 val = start ? HDMI_TG_EN : 0; |
1100 | 1109 | ||
1101 | if (hdata->current_mode.flags & DRM_MODE_FLAG_INTERLACE) | 1110 | if (m->flags & DRM_MODE_FLAG_INTERLACE) |
1102 | val |= HDMI_FIELD_EN; | 1111 | val |= HDMI_FIELD_EN; |
1103 | 1112 | ||
1104 | hdmi_reg_writemask(hdata, HDMI_CON_0, val, HDMI_EN); | 1113 | hdmi_reg_writemask(hdata, HDMI_CON_0, val, HDMI_EN); |
@@ -1168,7 +1177,7 @@ static void hdmiphy_wait_for_pll(struct hdmi_context *hdata) | |||
1168 | 1177 | ||
1169 | static void hdmi_v13_mode_apply(struct hdmi_context *hdata) | 1178 | static void hdmi_v13_mode_apply(struct hdmi_context *hdata) |
1170 | { | 1179 | { |
1171 | struct drm_display_mode *m = &hdata->current_mode; | 1180 | struct drm_display_mode *m = &hdata->encoder.crtc->state->mode; |
1172 | unsigned int val; | 1181 | unsigned int val; |
1173 | 1182 | ||
1174 | hdmi_reg_writev(hdata, HDMI_H_BLANK_0, 2, m->htotal - m->hdisplay); | 1183 | hdmi_reg_writev(hdata, HDMI_H_BLANK_0, 2, m->htotal - m->hdisplay); |
@@ -1247,7 +1256,19 @@ static void hdmi_v13_mode_apply(struct hdmi_context *hdata) | |||
1247 | 1256 | ||
1248 | static void hdmi_v14_mode_apply(struct hdmi_context *hdata) | 1257 | static void hdmi_v14_mode_apply(struct hdmi_context *hdata) |
1249 | { | 1258 | { |
1250 | struct drm_display_mode *m = &hdata->current_mode; | 1259 | struct drm_display_mode *m = &hdata->encoder.crtc->state->mode; |
1260 | struct drm_display_mode *am = | ||
1261 | &hdata->encoder.crtc->state->adjusted_mode; | ||
1262 | int hquirk = 0; | ||
1263 | |||
1264 | /* | ||
1265 | * In case video mode coming from CRTC differs from requested one HDMI | ||
1266 | * sometimes is able to almost properly perform conversion - only | ||
1267 | * first line is distorted. | ||
1268 | */ | ||
1269 | if ((m->vdisplay != am->vdisplay) && | ||
1270 | (m->hdisplay == 1280 || m->hdisplay == 1024 || m->hdisplay == 1366)) | ||
1271 | hquirk = 258; | ||
1251 | 1272 | ||
1252 | hdmi_reg_writev(hdata, HDMI_H_BLANK_0, 2, m->htotal - m->hdisplay); | 1273 | hdmi_reg_writev(hdata, HDMI_H_BLANK_0, 2, m->htotal - m->hdisplay); |
1253 | hdmi_reg_writev(hdata, HDMI_V_LINE_0, 2, m->vtotal); | 1274 | hdmi_reg_writev(hdata, HDMI_V_LINE_0, 2, m->vtotal); |
@@ -1341,8 +1362,9 @@ static void hdmi_v14_mode_apply(struct hdmi_context *hdata) | |||
1341 | hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_0, 2, 0xffff); | 1362 | hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_0, 2, 0xffff); |
1342 | 1363 | ||
1343 | hdmi_reg_writev(hdata, HDMI_TG_H_FSZ_L, 2, m->htotal); | 1364 | hdmi_reg_writev(hdata, HDMI_TG_H_FSZ_L, 2, m->htotal); |
1344 | hdmi_reg_writev(hdata, HDMI_TG_HACT_ST_L, 2, m->htotal - m->hdisplay); | 1365 | hdmi_reg_writev(hdata, HDMI_TG_HACT_ST_L, 2, |
1345 | hdmi_reg_writev(hdata, HDMI_TG_HACT_SZ_L, 2, m->hdisplay); | 1366 | m->htotal - m->hdisplay - hquirk); |
1367 | hdmi_reg_writev(hdata, HDMI_TG_HACT_SZ_L, 2, m->hdisplay + hquirk); | ||
1346 | hdmi_reg_writev(hdata, HDMI_TG_V_FSZ_L, 2, m->vtotal); | 1368 | hdmi_reg_writev(hdata, HDMI_TG_V_FSZ_L, 2, m->vtotal); |
1347 | if (hdata->drv_data == &exynos5433_hdmi_driver_data) | 1369 | if (hdata->drv_data == &exynos5433_hdmi_driver_data) |
1348 | hdmi_reg_writeb(hdata, HDMI_TG_DECON_EN, 1); | 1370 | hdmi_reg_writeb(hdata, HDMI_TG_DECON_EN, 1); |
@@ -1380,10 +1402,11 @@ static void hdmiphy_enable_mode_set(struct hdmi_context *hdata, bool enable) | |||
1380 | 1402 | ||
1381 | static void hdmiphy_conf_apply(struct hdmi_context *hdata) | 1403 | static void hdmiphy_conf_apply(struct hdmi_context *hdata) |
1382 | { | 1404 | { |
1405 | struct drm_display_mode *m = &hdata->encoder.crtc->state->mode; | ||
1383 | int ret; | 1406 | int ret; |
1384 | const u8 *phy_conf; | 1407 | const u8 *phy_conf; |
1385 | 1408 | ||
1386 | ret = hdmi_find_phy_conf(hdata, hdata->current_mode.clock * 1000); | 1409 | ret = hdmi_find_phy_conf(hdata, m->clock * 1000); |
1387 | if (ret < 0) { | 1410 | if (ret < 0) { |
1388 | DRM_ERROR("failed to find hdmiphy conf\n"); | 1411 | DRM_ERROR("failed to find hdmiphy conf\n"); |
1389 | return; | 1412 | return; |
@@ -1406,28 +1429,14 @@ static void hdmiphy_conf_apply(struct hdmi_context *hdata) | |||
1406 | hdmiphy_wait_for_pll(hdata); | 1429 | hdmiphy_wait_for_pll(hdata); |
1407 | } | 1430 | } |
1408 | 1431 | ||
1432 | /* Should be called with hdata->mutex mutex held */ | ||
1409 | static void hdmi_conf_apply(struct hdmi_context *hdata) | 1433 | static void hdmi_conf_apply(struct hdmi_context *hdata) |
1410 | { | 1434 | { |
1411 | hdmi_start(hdata, false); | 1435 | hdmi_start(hdata, false); |
1412 | hdmi_conf_init(hdata); | 1436 | hdmi_conf_init(hdata); |
1413 | hdmi_audio_init(hdata); | 1437 | hdmi_audio_config(hdata); |
1414 | hdmi_mode_apply(hdata); | 1438 | hdmi_mode_apply(hdata); |
1415 | hdmi_audio_control(hdata, true); | 1439 | hdmi_audio_control(hdata); |
1416 | } | ||
1417 | |||
1418 | static void hdmi_mode_set(struct drm_encoder *encoder, | ||
1419 | struct drm_display_mode *mode, | ||
1420 | struct drm_display_mode *adjusted_mode) | ||
1421 | { | ||
1422 | struct hdmi_context *hdata = encoder_to_hdmi(encoder); | ||
1423 | struct drm_display_mode *m = adjusted_mode; | ||
1424 | |||
1425 | DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%s\n", | ||
1426 | m->hdisplay, m->vdisplay, | ||
1427 | m->vrefresh, (m->flags & DRM_MODE_FLAG_INTERLACE) ? | ||
1428 | "INTERLACED" : "PROGRESSIVE"); | ||
1429 | |||
1430 | drm_mode_copy(&hdata->current_mode, m); | ||
1431 | } | 1440 | } |
1432 | 1441 | ||
1433 | static void hdmi_set_refclk(struct hdmi_context *hdata, bool on) | 1442 | static void hdmi_set_refclk(struct hdmi_context *hdata, bool on) |
@@ -1439,6 +1448,7 @@ static void hdmi_set_refclk(struct hdmi_context *hdata, bool on) | |||
1439 | SYSREG_HDMI_REFCLK_INT_CLK, on ? ~0 : 0); | 1448 | SYSREG_HDMI_REFCLK_INT_CLK, on ? ~0 : 0); |
1440 | } | 1449 | } |
1441 | 1450 | ||
1451 | /* Should be called with hdata->mutex mutex held. */ | ||
1442 | static void hdmiphy_enable(struct hdmi_context *hdata) | 1452 | static void hdmiphy_enable(struct hdmi_context *hdata) |
1443 | { | 1453 | { |
1444 | if (hdata->powered) | 1454 | if (hdata->powered) |
@@ -1461,6 +1471,7 @@ static void hdmiphy_enable(struct hdmi_context *hdata) | |||
1461 | hdata->powered = true; | 1471 | hdata->powered = true; |
1462 | } | 1472 | } |
1463 | 1473 | ||
1474 | /* Should be called with hdata->mutex mutex held. */ | ||
1464 | static void hdmiphy_disable(struct hdmi_context *hdata) | 1475 | static void hdmiphy_disable(struct hdmi_context *hdata) |
1465 | { | 1476 | { |
1466 | if (!hdata->powered) | 1477 | if (!hdata->powered) |
@@ -1486,33 +1497,42 @@ static void hdmi_enable(struct drm_encoder *encoder) | |||
1486 | { | 1497 | { |
1487 | struct hdmi_context *hdata = encoder_to_hdmi(encoder); | 1498 | struct hdmi_context *hdata = encoder_to_hdmi(encoder); |
1488 | 1499 | ||
1500 | mutex_lock(&hdata->mutex); | ||
1501 | |||
1489 | hdmiphy_enable(hdata); | 1502 | hdmiphy_enable(hdata); |
1490 | hdmi_conf_apply(hdata); | 1503 | hdmi_conf_apply(hdata); |
1504 | |||
1505 | mutex_unlock(&hdata->mutex); | ||
1491 | } | 1506 | } |
1492 | 1507 | ||
1493 | static void hdmi_disable(struct drm_encoder *encoder) | 1508 | static void hdmi_disable(struct drm_encoder *encoder) |
1494 | { | 1509 | { |
1495 | struct hdmi_context *hdata = encoder_to_hdmi(encoder); | 1510 | struct hdmi_context *hdata = encoder_to_hdmi(encoder); |
1496 | 1511 | ||
1497 | if (!hdata->powered) | 1512 | mutex_lock(&hdata->mutex); |
1513 | |||
1514 | if (hdata->powered) { | ||
1515 | /* | ||
1516 | * The SFRs of VP and Mixer are updated by Vertical Sync of | ||
1517 | * Timing generator which is a part of HDMI so the sequence | ||
1518 | * to disable TV Subsystem should be as following, | ||
1519 | * VP -> Mixer -> HDMI | ||
1520 | * | ||
1521 | * To achieve such sequence HDMI is disabled together with | ||
1522 | * HDMI PHY, via pipe clock callback. | ||
1523 | */ | ||
1524 | mutex_unlock(&hdata->mutex); | ||
1525 | cancel_delayed_work(&hdata->hotplug_work); | ||
1526 | cec_notifier_set_phys_addr(hdata->notifier, | ||
1527 | CEC_PHYS_ADDR_INVALID); | ||
1498 | return; | 1528 | return; |
1529 | } | ||
1499 | 1530 | ||
1500 | /* | 1531 | mutex_unlock(&hdata->mutex); |
1501 | * The SFRs of VP and Mixer are updated by Vertical Sync of | ||
1502 | * Timing generator which is a part of HDMI so the sequence | ||
1503 | * to disable TV Subsystem should be as following, | ||
1504 | * VP -> Mixer -> HDMI | ||
1505 | * | ||
1506 | * To achieve such sequence HDMI is disabled together with HDMI PHY, via | ||
1507 | * pipe clock callback. | ||
1508 | */ | ||
1509 | cancel_delayed_work(&hdata->hotplug_work); | ||
1510 | cec_notifier_set_phys_addr(hdata->notifier, CEC_PHYS_ADDR_INVALID); | ||
1511 | } | 1532 | } |
1512 | 1533 | ||
1513 | static const struct drm_encoder_helper_funcs exynos_hdmi_encoder_helper_funcs = { | 1534 | static const struct drm_encoder_helper_funcs exynos_hdmi_encoder_helper_funcs = { |
1514 | .mode_fixup = hdmi_mode_fixup, | 1535 | .mode_fixup = hdmi_mode_fixup, |
1515 | .mode_set = hdmi_mode_set, | ||
1516 | .enable = hdmi_enable, | 1536 | .enable = hdmi_enable, |
1517 | .disable = hdmi_disable, | 1537 | .disable = hdmi_disable, |
1518 | }; | 1538 | }; |
@@ -1521,6 +1541,99 @@ static const struct drm_encoder_funcs exynos_hdmi_encoder_funcs = { | |||
1521 | .destroy = drm_encoder_cleanup, | 1541 | .destroy = drm_encoder_cleanup, |
1522 | }; | 1542 | }; |
1523 | 1543 | ||
1544 | static void hdmi_audio_shutdown(struct device *dev, void *data) | ||
1545 | { | ||
1546 | struct hdmi_context *hdata = dev_get_drvdata(dev); | ||
1547 | |||
1548 | mutex_lock(&hdata->mutex); | ||
1549 | |||
1550 | hdata->audio.mute = true; | ||
1551 | |||
1552 | if (hdata->powered) | ||
1553 | hdmi_audio_control(hdata); | ||
1554 | |||
1555 | mutex_unlock(&hdata->mutex); | ||
1556 | } | ||
1557 | |||
1558 | static int hdmi_audio_hw_params(struct device *dev, void *data, | ||
1559 | struct hdmi_codec_daifmt *daifmt, | ||
1560 | struct hdmi_codec_params *params) | ||
1561 | { | ||
1562 | struct hdmi_context *hdata = dev_get_drvdata(dev); | ||
1563 | |||
1564 | if (daifmt->fmt != HDMI_I2S || daifmt->bit_clk_inv || | ||
1565 | daifmt->frame_clk_inv || daifmt->bit_clk_master || | ||
1566 | daifmt->frame_clk_master) { | ||
1567 | dev_err(dev, "%s: Bad flags %d %d %d %d\n", __func__, | ||
1568 | daifmt->bit_clk_inv, daifmt->frame_clk_inv, | ||
1569 | daifmt->bit_clk_master, | ||
1570 | daifmt->frame_clk_master); | ||
1571 | return -EINVAL; | ||
1572 | } | ||
1573 | |||
1574 | mutex_lock(&hdata->mutex); | ||
1575 | |||
1576 | hdata->audio.params = *params; | ||
1577 | |||
1578 | if (hdata->powered) { | ||
1579 | hdmi_audio_config(hdata); | ||
1580 | hdmi_audio_infoframe_apply(hdata); | ||
1581 | } | ||
1582 | |||
1583 | mutex_unlock(&hdata->mutex); | ||
1584 | |||
1585 | return 0; | ||
1586 | } | ||
1587 | |||
1588 | static int hdmi_audio_digital_mute(struct device *dev, void *data, bool mute) | ||
1589 | { | ||
1590 | struct hdmi_context *hdata = dev_get_drvdata(dev); | ||
1591 | |||
1592 | mutex_lock(&hdata->mutex); | ||
1593 | |||
1594 | hdata->audio.mute = mute; | ||
1595 | |||
1596 | if (hdata->powered) | ||
1597 | hdmi_audio_control(hdata); | ||
1598 | |||
1599 | mutex_unlock(&hdata->mutex); | ||
1600 | |||
1601 | return 0; | ||
1602 | } | ||
1603 | |||
1604 | static int hdmi_audio_get_eld(struct device *dev, void *data, uint8_t *buf, | ||
1605 | size_t len) | ||
1606 | { | ||
1607 | struct hdmi_context *hdata = dev_get_drvdata(dev); | ||
1608 | struct drm_connector *connector = &hdata->connector; | ||
1609 | |||
1610 | memcpy(buf, connector->eld, min(sizeof(connector->eld), len)); | ||
1611 | |||
1612 | return 0; | ||
1613 | } | ||
1614 | |||
1615 | static const struct hdmi_codec_ops audio_codec_ops = { | ||
1616 | .hw_params = hdmi_audio_hw_params, | ||
1617 | .audio_shutdown = hdmi_audio_shutdown, | ||
1618 | .digital_mute = hdmi_audio_digital_mute, | ||
1619 | .get_eld = hdmi_audio_get_eld, | ||
1620 | }; | ||
1621 | |||
1622 | static int hdmi_register_audio_device(struct hdmi_context *hdata) | ||
1623 | { | ||
1624 | struct hdmi_codec_pdata codec_data = { | ||
1625 | .ops = &audio_codec_ops, | ||
1626 | .max_i2s_channels = 6, | ||
1627 | .i2s = 1, | ||
1628 | }; | ||
1629 | |||
1630 | hdata->audio.pdev = platform_device_register_data( | ||
1631 | hdata->dev, HDMI_CODEC_DRV_NAME, PLATFORM_DEVID_AUTO, | ||
1632 | &codec_data, sizeof(codec_data)); | ||
1633 | |||
1634 | return PTR_ERR_OR_ZERO(hdata->audio.pdev); | ||
1635 | } | ||
1636 | |||
1524 | static void hdmi_hotplug_work_func(struct work_struct *work) | 1637 | static void hdmi_hotplug_work_func(struct work_struct *work) |
1525 | { | 1638 | { |
1526 | struct hdmi_context *hdata; | 1639 | struct hdmi_context *hdata; |
@@ -1596,11 +1709,14 @@ static void hdmiphy_clk_enable(struct exynos_drm_clk *clk, bool enable) | |||
1596 | { | 1709 | { |
1597 | struct hdmi_context *hdata = container_of(clk, struct hdmi_context, | 1710 | struct hdmi_context *hdata = container_of(clk, struct hdmi_context, |
1598 | phy_clk); | 1711 | phy_clk); |
1712 | mutex_lock(&hdata->mutex); | ||
1599 | 1713 | ||
1600 | if (enable) | 1714 | if (enable) |
1601 | hdmiphy_enable(hdata); | 1715 | hdmiphy_enable(hdata); |
1602 | else | 1716 | else |
1603 | hdmiphy_disable(hdata); | 1717 | hdmiphy_disable(hdata); |
1718 | |||
1719 | mutex_unlock(&hdata->mutex); | ||
1604 | } | 1720 | } |
1605 | 1721 | ||
1606 | static int hdmi_bridge_init(struct hdmi_context *hdata) | 1722 | static int hdmi_bridge_init(struct hdmi_context *hdata) |
@@ -1811,6 +1927,7 @@ out: | |||
1811 | 1927 | ||
1812 | static int hdmi_probe(struct platform_device *pdev) | 1928 | static int hdmi_probe(struct platform_device *pdev) |
1813 | { | 1929 | { |
1930 | struct hdmi_audio_infoframe *audio_infoframe; | ||
1814 | struct device *dev = &pdev->dev; | 1931 | struct device *dev = &pdev->dev; |
1815 | struct hdmi_context *hdata; | 1932 | struct hdmi_context *hdata; |
1816 | struct resource *res; | 1933 | struct resource *res; |
@@ -1826,6 +1943,8 @@ static int hdmi_probe(struct platform_device *pdev) | |||
1826 | 1943 | ||
1827 | hdata->dev = dev; | 1944 | hdata->dev = dev; |
1828 | 1945 | ||
1946 | mutex_init(&hdata->mutex); | ||
1947 | |||
1829 | ret = hdmi_resources_init(hdata); | 1948 | ret = hdmi_resources_init(hdata); |
1830 | if (ret) { | 1949 | if (ret) { |
1831 | if (ret != -EPROBE_DEFER) | 1950 | if (ret != -EPROBE_DEFER) |
@@ -1885,12 +2004,26 @@ static int hdmi_probe(struct platform_device *pdev) | |||
1885 | 2004 | ||
1886 | pm_runtime_enable(dev); | 2005 | pm_runtime_enable(dev); |
1887 | 2006 | ||
1888 | ret = component_add(&pdev->dev, &hdmi_component_ops); | 2007 | audio_infoframe = &hdata->audio.infoframe; |
2008 | hdmi_audio_infoframe_init(audio_infoframe); | ||
2009 | audio_infoframe->coding_type = HDMI_AUDIO_CODING_TYPE_STREAM; | ||
2010 | audio_infoframe->sample_size = HDMI_AUDIO_SAMPLE_SIZE_STREAM; | ||
2011 | audio_infoframe->sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM; | ||
2012 | audio_infoframe->channels = 2; | ||
2013 | |||
2014 | ret = hdmi_register_audio_device(hdata); | ||
1889 | if (ret) | 2015 | if (ret) |
1890 | goto err_notifier_put; | 2016 | goto err_notifier_put; |
1891 | 2017 | ||
2018 | ret = component_add(&pdev->dev, &hdmi_component_ops); | ||
2019 | if (ret) | ||
2020 | goto err_unregister_audio; | ||
2021 | |||
1892 | return ret; | 2022 | return ret; |
1893 | 2023 | ||
2024 | err_unregister_audio: | ||
2025 | platform_device_unregister(hdata->audio.pdev); | ||
2026 | |||
1894 | err_notifier_put: | 2027 | err_notifier_put: |
1895 | cec_notifier_put(hdata->notifier); | 2028 | cec_notifier_put(hdata->notifier); |
1896 | pm_runtime_disable(dev); | 2029 | pm_runtime_disable(dev); |
@@ -1914,6 +2047,7 @@ static int hdmi_remove(struct platform_device *pdev) | |||
1914 | cec_notifier_set_phys_addr(hdata->notifier, CEC_PHYS_ADDR_INVALID); | 2047 | cec_notifier_set_phys_addr(hdata->notifier, CEC_PHYS_ADDR_INVALID); |
1915 | 2048 | ||
1916 | component_del(&pdev->dev, &hdmi_component_ops); | 2049 | component_del(&pdev->dev, &hdmi_component_ops); |
2050 | platform_device_unregister(hdata->audio.pdev); | ||
1917 | 2051 | ||
1918 | cec_notifier_put(hdata->notifier); | 2052 | cec_notifier_put(hdata->notifier); |
1919 | pm_runtime_disable(&pdev->dev); | 2053 | pm_runtime_disable(&pdev->dev); |
@@ -1929,6 +2063,8 @@ static int hdmi_remove(struct platform_device *pdev) | |||
1929 | 2063 | ||
1930 | put_device(&hdata->ddc_adpt->dev); | 2064 | put_device(&hdata->ddc_adpt->dev); |
1931 | 2065 | ||
2066 | mutex_destroy(&hdata->mutex); | ||
2067 | |||
1932 | return 0; | 2068 | return 0; |
1933 | } | 2069 | } |
1934 | 2070 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index 002755415e00..dc5d79465f9b 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c | |||
@@ -67,19 +67,6 @@ | |||
67 | #define MXR_FORMAT_ARGB4444 6 | 67 | #define MXR_FORMAT_ARGB4444 6 |
68 | #define MXR_FORMAT_ARGB8888 7 | 68 | #define MXR_FORMAT_ARGB8888 7 |
69 | 69 | ||
70 | struct mixer_resources { | ||
71 | int irq; | ||
72 | void __iomem *mixer_regs; | ||
73 | void __iomem *vp_regs; | ||
74 | spinlock_t reg_slock; | ||
75 | struct clk *mixer; | ||
76 | struct clk *vp; | ||
77 | struct clk *hdmi; | ||
78 | struct clk *sclk_mixer; | ||
79 | struct clk *sclk_hdmi; | ||
80 | struct clk *mout_mixer; | ||
81 | }; | ||
82 | |||
83 | enum mixer_version_id { | 70 | enum mixer_version_id { |
84 | MXR_VER_0_0_0_16, | 71 | MXR_VER_0_0_0_16, |
85 | MXR_VER_16_0_33_0, | 72 | MXR_VER_16_0_33_0, |
@@ -117,8 +104,18 @@ struct mixer_context { | |||
117 | struct exynos_drm_plane planes[MIXER_WIN_NR]; | 104 | struct exynos_drm_plane planes[MIXER_WIN_NR]; |
118 | unsigned long flags; | 105 | unsigned long flags; |
119 | 106 | ||
120 | struct mixer_resources mixer_res; | 107 | int irq; |
108 | void __iomem *mixer_regs; | ||
109 | void __iomem *vp_regs; | ||
110 | spinlock_t reg_slock; | ||
111 | struct clk *mixer; | ||
112 | struct clk *vp; | ||
113 | struct clk *hdmi; | ||
114 | struct clk *sclk_mixer; | ||
115 | struct clk *sclk_hdmi; | ||
116 | struct clk *mout_mixer; | ||
121 | enum mixer_version_id mxr_ver; | 117 | enum mixer_version_id mxr_ver; |
118 | int scan_value; | ||
122 | }; | 119 | }; |
123 | 120 | ||
124 | struct mixer_drv_data { | 121 | struct mixer_drv_data { |
@@ -194,44 +191,44 @@ static inline bool is_alpha_format(unsigned int pixel_format) | |||
194 | } | 191 | } |
195 | } | 192 | } |
196 | 193 | ||
197 | static inline u32 vp_reg_read(struct mixer_resources *res, u32 reg_id) | 194 | static inline u32 vp_reg_read(struct mixer_context *ctx, u32 reg_id) |
198 | { | 195 | { |
199 | return readl(res->vp_regs + reg_id); | 196 | return readl(ctx->vp_regs + reg_id); |
200 | } | 197 | } |
201 | 198 | ||
202 | static inline void vp_reg_write(struct mixer_resources *res, u32 reg_id, | 199 | static inline void vp_reg_write(struct mixer_context *ctx, u32 reg_id, |
203 | u32 val) | 200 | u32 val) |
204 | { | 201 | { |
205 | writel(val, res->vp_regs + reg_id); | 202 | writel(val, ctx->vp_regs + reg_id); |
206 | } | 203 | } |
207 | 204 | ||
208 | static inline void vp_reg_writemask(struct mixer_resources *res, u32 reg_id, | 205 | static inline void vp_reg_writemask(struct mixer_context *ctx, u32 reg_id, |
209 | u32 val, u32 mask) | 206 | u32 val, u32 mask) |
210 | { | 207 | { |
211 | u32 old = vp_reg_read(res, reg_id); | 208 | u32 old = vp_reg_read(ctx, reg_id); |
212 | 209 | ||
213 | val = (val & mask) | (old & ~mask); | 210 | val = (val & mask) | (old & ~mask); |
214 | writel(val, res->vp_regs + reg_id); | 211 | writel(val, ctx->vp_regs + reg_id); |
215 | } | 212 | } |
216 | 213 | ||
217 | static inline u32 mixer_reg_read(struct mixer_resources *res, u32 reg_id) | 214 | static inline u32 mixer_reg_read(struct mixer_context *ctx, u32 reg_id) |
218 | { | 215 | { |
219 | return readl(res->mixer_regs + reg_id); | 216 | return readl(ctx->mixer_regs + reg_id); |
220 | } | 217 | } |
221 | 218 | ||
222 | static inline void mixer_reg_write(struct mixer_resources *res, u32 reg_id, | 219 | static inline void mixer_reg_write(struct mixer_context *ctx, u32 reg_id, |
223 | u32 val) | 220 | u32 val) |
224 | { | 221 | { |
225 | writel(val, res->mixer_regs + reg_id); | 222 | writel(val, ctx->mixer_regs + reg_id); |
226 | } | 223 | } |
227 | 224 | ||
228 | static inline void mixer_reg_writemask(struct mixer_resources *res, | 225 | static inline void mixer_reg_writemask(struct mixer_context *ctx, |
229 | u32 reg_id, u32 val, u32 mask) | 226 | u32 reg_id, u32 val, u32 mask) |
230 | { | 227 | { |
231 | u32 old = mixer_reg_read(res, reg_id); | 228 | u32 old = mixer_reg_read(ctx, reg_id); |
232 | 229 | ||
233 | val = (val & mask) | (old & ~mask); | 230 | val = (val & mask) | (old & ~mask); |
234 | writel(val, res->mixer_regs + reg_id); | 231 | writel(val, ctx->mixer_regs + reg_id); |
235 | } | 232 | } |
236 | 233 | ||
237 | static void mixer_regs_dump(struct mixer_context *ctx) | 234 | static void mixer_regs_dump(struct mixer_context *ctx) |
@@ -239,7 +236,7 @@ static void mixer_regs_dump(struct mixer_context *ctx) | |||
239 | #define DUMPREG(reg_id) \ | 236 | #define DUMPREG(reg_id) \ |
240 | do { \ | 237 | do { \ |
241 | DRM_DEBUG_KMS(#reg_id " = %08x\n", \ | 238 | DRM_DEBUG_KMS(#reg_id " = %08x\n", \ |
242 | (u32)readl(ctx->mixer_res.mixer_regs + reg_id)); \ | 239 | (u32)readl(ctx->mixer_regs + reg_id)); \ |
243 | } while (0) | 240 | } while (0) |
244 | 241 | ||
245 | DUMPREG(MXR_STATUS); | 242 | DUMPREG(MXR_STATUS); |
@@ -271,7 +268,7 @@ static void vp_regs_dump(struct mixer_context *ctx) | |||
271 | #define DUMPREG(reg_id) \ | 268 | #define DUMPREG(reg_id) \ |
272 | do { \ | 269 | do { \ |
273 | DRM_DEBUG_KMS(#reg_id " = %08x\n", \ | 270 | DRM_DEBUG_KMS(#reg_id " = %08x\n", \ |
274 | (u32) readl(ctx->mixer_res.vp_regs + reg_id)); \ | 271 | (u32) readl(ctx->vp_regs + reg_id)); \ |
275 | } while (0) | 272 | } while (0) |
276 | 273 | ||
277 | DUMPREG(VP_ENABLE); | 274 | DUMPREG(VP_ENABLE); |
@@ -301,7 +298,7 @@ do { \ | |||
301 | #undef DUMPREG | 298 | #undef DUMPREG |
302 | } | 299 | } |
303 | 300 | ||
304 | static inline void vp_filter_set(struct mixer_resources *res, | 301 | static inline void vp_filter_set(struct mixer_context *ctx, |
305 | int reg_id, const u8 *data, unsigned int size) | 302 | int reg_id, const u8 *data, unsigned int size) |
306 | { | 303 | { |
307 | /* assure 4-byte align */ | 304 | /* assure 4-byte align */ |
@@ -309,24 +306,23 @@ static inline void vp_filter_set(struct mixer_resources *res, | |||
309 | for (; size; size -= 4, reg_id += 4, data += 4) { | 306 | for (; size; size -= 4, reg_id += 4, data += 4) { |
310 | u32 val = (data[0] << 24) | (data[1] << 16) | | 307 | u32 val = (data[0] << 24) | (data[1] << 16) | |
311 | (data[2] << 8) | data[3]; | 308 | (data[2] << 8) | data[3]; |
312 | vp_reg_write(res, reg_id, val); | 309 | vp_reg_write(ctx, reg_id, val); |
313 | } | 310 | } |
314 | } | 311 | } |
315 | 312 | ||
316 | static void vp_default_filter(struct mixer_resources *res) | 313 | static void vp_default_filter(struct mixer_context *ctx) |
317 | { | 314 | { |
318 | vp_filter_set(res, VP_POLY8_Y0_LL, | 315 | vp_filter_set(ctx, VP_POLY8_Y0_LL, |
319 | filter_y_horiz_tap8, sizeof(filter_y_horiz_tap8)); | 316 | filter_y_horiz_tap8, sizeof(filter_y_horiz_tap8)); |
320 | vp_filter_set(res, VP_POLY4_Y0_LL, | 317 | vp_filter_set(ctx, VP_POLY4_Y0_LL, |
321 | filter_y_vert_tap4, sizeof(filter_y_vert_tap4)); | 318 | filter_y_vert_tap4, sizeof(filter_y_vert_tap4)); |
322 | vp_filter_set(res, VP_POLY4_C0_LL, | 319 | vp_filter_set(ctx, VP_POLY4_C0_LL, |
323 | filter_cr_horiz_tap4, sizeof(filter_cr_horiz_tap4)); | 320 | filter_cr_horiz_tap4, sizeof(filter_cr_horiz_tap4)); |
324 | } | 321 | } |
325 | 322 | ||
326 | static void mixer_cfg_gfx_blend(struct mixer_context *ctx, unsigned int win, | 323 | static void mixer_cfg_gfx_blend(struct mixer_context *ctx, unsigned int win, |
327 | bool alpha) | 324 | bool alpha) |
328 | { | 325 | { |
329 | struct mixer_resources *res = &ctx->mixer_res; | ||
330 | u32 val; | 326 | u32 val; |
331 | 327 | ||
332 | val = MXR_GRP_CFG_COLOR_KEY_DISABLE; /* no blank key */ | 328 | val = MXR_GRP_CFG_COLOR_KEY_DISABLE; /* no blank key */ |
@@ -335,13 +331,12 @@ static void mixer_cfg_gfx_blend(struct mixer_context *ctx, unsigned int win, | |||
335 | val |= MXR_GRP_CFG_BLEND_PRE_MUL; | 331 | val |= MXR_GRP_CFG_BLEND_PRE_MUL; |
336 | val |= MXR_GRP_CFG_PIXEL_BLEND_EN; | 332 | val |= MXR_GRP_CFG_PIXEL_BLEND_EN; |
337 | } | 333 | } |
338 | mixer_reg_writemask(res, MXR_GRAPHIC_CFG(win), | 334 | mixer_reg_writemask(ctx, MXR_GRAPHIC_CFG(win), |
339 | val, MXR_GRP_CFG_MISC_MASK); | 335 | val, MXR_GRP_CFG_MISC_MASK); |
340 | } | 336 | } |
341 | 337 | ||
342 | static void mixer_cfg_vp_blend(struct mixer_context *ctx) | 338 | static void mixer_cfg_vp_blend(struct mixer_context *ctx) |
343 | { | 339 | { |
344 | struct mixer_resources *res = &ctx->mixer_res; | ||
345 | u32 val; | 340 | u32 val; |
346 | 341 | ||
347 | /* | 342 | /* |
@@ -351,51 +346,39 @@ static void mixer_cfg_vp_blend(struct mixer_context *ctx) | |||
351 | * support blending of the video layer through this. | 346 | * support blending of the video layer through this. |
352 | */ | 347 | */ |
353 | val = 0; | 348 | val = 0; |
354 | mixer_reg_write(res, MXR_VIDEO_CFG, val); | 349 | mixer_reg_write(ctx, MXR_VIDEO_CFG, val); |
355 | } | 350 | } |
356 | 351 | ||
357 | static void mixer_vsync_set_update(struct mixer_context *ctx, bool enable) | 352 | static void mixer_vsync_set_update(struct mixer_context *ctx, bool enable) |
358 | { | 353 | { |
359 | struct mixer_resources *res = &ctx->mixer_res; | ||
360 | |||
361 | /* block update on vsync */ | 354 | /* block update on vsync */ |
362 | mixer_reg_writemask(res, MXR_STATUS, enable ? | 355 | mixer_reg_writemask(ctx, MXR_STATUS, enable ? |
363 | MXR_STATUS_SYNC_ENABLE : 0, MXR_STATUS_SYNC_ENABLE); | 356 | MXR_STATUS_SYNC_ENABLE : 0, MXR_STATUS_SYNC_ENABLE); |
364 | 357 | ||
365 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) | 358 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) |
366 | vp_reg_write(res, VP_SHADOW_UPDATE, enable ? | 359 | vp_reg_write(ctx, VP_SHADOW_UPDATE, enable ? |
367 | VP_SHADOW_UPDATE_ENABLE : 0); | 360 | VP_SHADOW_UPDATE_ENABLE : 0); |
368 | } | 361 | } |
369 | 362 | ||
370 | static void mixer_cfg_scan(struct mixer_context *ctx, unsigned int height) | 363 | static void mixer_cfg_scan(struct mixer_context *ctx, int width, int height) |
371 | { | 364 | { |
372 | struct mixer_resources *res = &ctx->mixer_res; | ||
373 | u32 val; | 365 | u32 val; |
374 | 366 | ||
375 | /* choosing between interlace and progressive mode */ | 367 | /* choosing between interlace and progressive mode */ |
376 | val = test_bit(MXR_BIT_INTERLACE, &ctx->flags) ? | 368 | val = test_bit(MXR_BIT_INTERLACE, &ctx->flags) ? |
377 | MXR_CFG_SCAN_INTERLACE : MXR_CFG_SCAN_PROGRESSIVE; | 369 | MXR_CFG_SCAN_INTERLACE : MXR_CFG_SCAN_PROGRESSIVE; |
378 | 370 | ||
379 | if (ctx->mxr_ver != MXR_VER_128_0_0_184) { | 371 | if (ctx->mxr_ver == MXR_VER_128_0_0_184) |
380 | /* choosing between proper HD and SD mode */ | 372 | mixer_reg_write(ctx, MXR_RESOLUTION, |
381 | if (height <= 480) | 373 | MXR_MXR_RES_HEIGHT(height) | MXR_MXR_RES_WIDTH(width)); |
382 | val |= MXR_CFG_SCAN_NTSC | MXR_CFG_SCAN_SD; | 374 | else |
383 | else if (height <= 576) | 375 | val |= ctx->scan_value; |
384 | val |= MXR_CFG_SCAN_PAL | MXR_CFG_SCAN_SD; | ||
385 | else if (height <= 720) | ||
386 | val |= MXR_CFG_SCAN_HD_720 | MXR_CFG_SCAN_HD; | ||
387 | else if (height <= 1080) | ||
388 | val |= MXR_CFG_SCAN_HD_1080 | MXR_CFG_SCAN_HD; | ||
389 | else | ||
390 | val |= MXR_CFG_SCAN_HD_720 | MXR_CFG_SCAN_HD; | ||
391 | } | ||
392 | 376 | ||
393 | mixer_reg_writemask(res, MXR_CFG, val, MXR_CFG_SCAN_MASK); | 377 | mixer_reg_writemask(ctx, MXR_CFG, val, MXR_CFG_SCAN_MASK); |
394 | } | 378 | } |
395 | 379 | ||
396 | static void mixer_cfg_rgb_fmt(struct mixer_context *ctx, unsigned int height) | 380 | static void mixer_cfg_rgb_fmt(struct mixer_context *ctx, unsigned int height) |
397 | { | 381 | { |
398 | struct mixer_resources *res = &ctx->mixer_res; | ||
399 | u32 val; | 382 | u32 val; |
400 | 383 | ||
401 | switch (height) { | 384 | switch (height) { |
@@ -408,45 +391,44 @@ static void mixer_cfg_rgb_fmt(struct mixer_context *ctx, unsigned int height) | |||
408 | default: | 391 | default: |
409 | val = MXR_CFG_RGB709_16_235; | 392 | val = MXR_CFG_RGB709_16_235; |
410 | /* Configure the BT.709 CSC matrix for full range RGB. */ | 393 | /* Configure the BT.709 CSC matrix for full range RGB. */ |
411 | mixer_reg_write(res, MXR_CM_COEFF_Y, | 394 | mixer_reg_write(ctx, MXR_CM_COEFF_Y, |
412 | MXR_CSC_CT( 0.184, 0.614, 0.063) | | 395 | MXR_CSC_CT( 0.184, 0.614, 0.063) | |
413 | MXR_CM_COEFF_RGB_FULL); | 396 | MXR_CM_COEFF_RGB_FULL); |
414 | mixer_reg_write(res, MXR_CM_COEFF_CB, | 397 | mixer_reg_write(ctx, MXR_CM_COEFF_CB, |
415 | MXR_CSC_CT(-0.102, -0.338, 0.440)); | 398 | MXR_CSC_CT(-0.102, -0.338, 0.440)); |
416 | mixer_reg_write(res, MXR_CM_COEFF_CR, | 399 | mixer_reg_write(ctx, MXR_CM_COEFF_CR, |
417 | MXR_CSC_CT( 0.440, -0.399, -0.040)); | 400 | MXR_CSC_CT( 0.440, -0.399, -0.040)); |
418 | break; | 401 | break; |
419 | } | 402 | } |
420 | 403 | ||
421 | mixer_reg_writemask(res, MXR_CFG, val, MXR_CFG_RGB_FMT_MASK); | 404 | mixer_reg_writemask(ctx, MXR_CFG, val, MXR_CFG_RGB_FMT_MASK); |
422 | } | 405 | } |
423 | 406 | ||
424 | static void mixer_cfg_layer(struct mixer_context *ctx, unsigned int win, | 407 | static void mixer_cfg_layer(struct mixer_context *ctx, unsigned int win, |
425 | unsigned int priority, bool enable) | 408 | unsigned int priority, bool enable) |
426 | { | 409 | { |
427 | struct mixer_resources *res = &ctx->mixer_res; | ||
428 | u32 val = enable ? ~0 : 0; | 410 | u32 val = enable ? ~0 : 0; |
429 | 411 | ||
430 | switch (win) { | 412 | switch (win) { |
431 | case 0: | 413 | case 0: |
432 | mixer_reg_writemask(res, MXR_CFG, val, MXR_CFG_GRP0_ENABLE); | 414 | mixer_reg_writemask(ctx, MXR_CFG, val, MXR_CFG_GRP0_ENABLE); |
433 | mixer_reg_writemask(res, MXR_LAYER_CFG, | 415 | mixer_reg_writemask(ctx, MXR_LAYER_CFG, |
434 | MXR_LAYER_CFG_GRP0_VAL(priority), | 416 | MXR_LAYER_CFG_GRP0_VAL(priority), |
435 | MXR_LAYER_CFG_GRP0_MASK); | 417 | MXR_LAYER_CFG_GRP0_MASK); |
436 | break; | 418 | break; |
437 | case 1: | 419 | case 1: |
438 | mixer_reg_writemask(res, MXR_CFG, val, MXR_CFG_GRP1_ENABLE); | 420 | mixer_reg_writemask(ctx, MXR_CFG, val, MXR_CFG_GRP1_ENABLE); |
439 | mixer_reg_writemask(res, MXR_LAYER_CFG, | 421 | mixer_reg_writemask(ctx, MXR_LAYER_CFG, |
440 | MXR_LAYER_CFG_GRP1_VAL(priority), | 422 | MXR_LAYER_CFG_GRP1_VAL(priority), |
441 | MXR_LAYER_CFG_GRP1_MASK); | 423 | MXR_LAYER_CFG_GRP1_MASK); |
442 | 424 | ||
443 | break; | 425 | break; |
444 | case VP_DEFAULT_WIN: | 426 | case VP_DEFAULT_WIN: |
445 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) { | 427 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) { |
446 | vp_reg_writemask(res, VP_ENABLE, val, VP_ENABLE_ON); | 428 | vp_reg_writemask(ctx, VP_ENABLE, val, VP_ENABLE_ON); |
447 | mixer_reg_writemask(res, MXR_CFG, val, | 429 | mixer_reg_writemask(ctx, MXR_CFG, val, |
448 | MXR_CFG_VP_ENABLE); | 430 | MXR_CFG_VP_ENABLE); |
449 | mixer_reg_writemask(res, MXR_LAYER_CFG, | 431 | mixer_reg_writemask(ctx, MXR_LAYER_CFG, |
450 | MXR_LAYER_CFG_VP_VAL(priority), | 432 | MXR_LAYER_CFG_VP_VAL(priority), |
451 | MXR_LAYER_CFG_VP_MASK); | 433 | MXR_LAYER_CFG_VP_MASK); |
452 | } | 434 | } |
@@ -456,30 +438,34 @@ static void mixer_cfg_layer(struct mixer_context *ctx, unsigned int win, | |||
456 | 438 | ||
457 | static void mixer_run(struct mixer_context *ctx) | 439 | static void mixer_run(struct mixer_context *ctx) |
458 | { | 440 | { |
459 | struct mixer_resources *res = &ctx->mixer_res; | 441 | mixer_reg_writemask(ctx, MXR_STATUS, ~0, MXR_STATUS_REG_RUN); |
460 | |||
461 | mixer_reg_writemask(res, MXR_STATUS, ~0, MXR_STATUS_REG_RUN); | ||
462 | } | 442 | } |
463 | 443 | ||
464 | static void mixer_stop(struct mixer_context *ctx) | 444 | static void mixer_stop(struct mixer_context *ctx) |
465 | { | 445 | { |
466 | struct mixer_resources *res = &ctx->mixer_res; | ||
467 | int timeout = 20; | 446 | int timeout = 20; |
468 | 447 | ||
469 | mixer_reg_writemask(res, MXR_STATUS, 0, MXR_STATUS_REG_RUN); | 448 | mixer_reg_writemask(ctx, MXR_STATUS, 0, MXR_STATUS_REG_RUN); |
470 | 449 | ||
471 | while (!(mixer_reg_read(res, MXR_STATUS) & MXR_STATUS_REG_IDLE) && | 450 | while (!(mixer_reg_read(ctx, MXR_STATUS) & MXR_STATUS_REG_IDLE) && |
472 | --timeout) | 451 | --timeout) |
473 | usleep_range(10000, 12000); | 452 | usleep_range(10000, 12000); |
474 | } | 453 | } |
475 | 454 | ||
455 | static void mixer_commit(struct mixer_context *ctx) | ||
456 | { | ||
457 | struct drm_display_mode *mode = &ctx->crtc->base.state->adjusted_mode; | ||
458 | |||
459 | mixer_cfg_scan(ctx, mode->hdisplay, mode->vdisplay); | ||
460 | mixer_cfg_rgb_fmt(ctx, mode->vdisplay); | ||
461 | mixer_run(ctx); | ||
462 | } | ||
463 | |||
476 | static void vp_video_buffer(struct mixer_context *ctx, | 464 | static void vp_video_buffer(struct mixer_context *ctx, |
477 | struct exynos_drm_plane *plane) | 465 | struct exynos_drm_plane *plane) |
478 | { | 466 | { |
479 | struct exynos_drm_plane_state *state = | 467 | struct exynos_drm_plane_state *state = |
480 | to_exynos_plane_state(plane->base.state); | 468 | to_exynos_plane_state(plane->base.state); |
481 | struct drm_display_mode *mode = &state->base.crtc->state->adjusted_mode; | ||
482 | struct mixer_resources *res = &ctx->mixer_res; | ||
483 | struct drm_framebuffer *fb = state->base.fb; | 469 | struct drm_framebuffer *fb = state->base.fb; |
484 | unsigned int priority = state->base.normalized_zpos + 1; | 470 | unsigned int priority = state->base.normalized_zpos + 1; |
485 | unsigned long flags; | 471 | unsigned long flags; |
@@ -493,8 +479,7 @@ static void vp_video_buffer(struct mixer_context *ctx, | |||
493 | luma_addr[0] = exynos_drm_fb_dma_addr(fb, 0); | 479 | luma_addr[0] = exynos_drm_fb_dma_addr(fb, 0); |
494 | chroma_addr[0] = exynos_drm_fb_dma_addr(fb, 1); | 480 | chroma_addr[0] = exynos_drm_fb_dma_addr(fb, 1); |
495 | 481 | ||
496 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) { | 482 | if (test_bit(MXR_BIT_INTERLACE, &ctx->flags)) { |
497 | __set_bit(MXR_BIT_INTERLACE, &ctx->flags); | ||
498 | if (is_tiled) { | 483 | if (is_tiled) { |
499 | luma_addr[1] = luma_addr[0] + 0x40; | 484 | luma_addr[1] = luma_addr[0] + 0x40; |
500 | chroma_addr[1] = chroma_addr[0] + 0x40; | 485 | chroma_addr[1] = chroma_addr[0] + 0x40; |
@@ -503,63 +488,59 @@ static void vp_video_buffer(struct mixer_context *ctx, | |||
503 | chroma_addr[1] = chroma_addr[0] + fb->pitches[0]; | 488 | chroma_addr[1] = chroma_addr[0] + fb->pitches[0]; |
504 | } | 489 | } |
505 | } else { | 490 | } else { |
506 | __clear_bit(MXR_BIT_INTERLACE, &ctx->flags); | ||
507 | luma_addr[1] = 0; | 491 | luma_addr[1] = 0; |
508 | chroma_addr[1] = 0; | 492 | chroma_addr[1] = 0; |
509 | } | 493 | } |
510 | 494 | ||
511 | spin_lock_irqsave(&res->reg_slock, flags); | 495 | spin_lock_irqsave(&ctx->reg_slock, flags); |
512 | 496 | ||
513 | /* interlace or progressive scan mode */ | 497 | /* interlace or progressive scan mode */ |
514 | val = (test_bit(MXR_BIT_INTERLACE, &ctx->flags) ? ~0 : 0); | 498 | val = (test_bit(MXR_BIT_INTERLACE, &ctx->flags) ? ~0 : 0); |
515 | vp_reg_writemask(res, VP_MODE, val, VP_MODE_LINE_SKIP); | 499 | vp_reg_writemask(ctx, VP_MODE, val, VP_MODE_LINE_SKIP); |
516 | 500 | ||
517 | /* setup format */ | 501 | /* setup format */ |
518 | val = (is_nv21 ? VP_MODE_NV21 : VP_MODE_NV12); | 502 | val = (is_nv21 ? VP_MODE_NV21 : VP_MODE_NV12); |
519 | val |= (is_tiled ? VP_MODE_MEM_TILED : VP_MODE_MEM_LINEAR); | 503 | val |= (is_tiled ? VP_MODE_MEM_TILED : VP_MODE_MEM_LINEAR); |
520 | vp_reg_writemask(res, VP_MODE, val, VP_MODE_FMT_MASK); | 504 | vp_reg_writemask(ctx, VP_MODE, val, VP_MODE_FMT_MASK); |
521 | 505 | ||
522 | /* setting size of input image */ | 506 | /* setting size of input image */ |
523 | vp_reg_write(res, VP_IMG_SIZE_Y, VP_IMG_HSIZE(fb->pitches[0]) | | 507 | vp_reg_write(ctx, VP_IMG_SIZE_Y, VP_IMG_HSIZE(fb->pitches[0]) | |
524 | VP_IMG_VSIZE(fb->height)); | 508 | VP_IMG_VSIZE(fb->height)); |
525 | /* chroma plane for NV12/NV21 is half the height of the luma plane */ | 509 | /* chroma plane for NV12/NV21 is half the height of the luma plane */ |
526 | vp_reg_write(res, VP_IMG_SIZE_C, VP_IMG_HSIZE(fb->pitches[0]) | | 510 | vp_reg_write(ctx, VP_IMG_SIZE_C, VP_IMG_HSIZE(fb->pitches[0]) | |
527 | VP_IMG_VSIZE(fb->height / 2)); | 511 | VP_IMG_VSIZE(fb->height / 2)); |
528 | 512 | ||
529 | vp_reg_write(res, VP_SRC_WIDTH, state->src.w); | 513 | vp_reg_write(ctx, VP_SRC_WIDTH, state->src.w); |
530 | vp_reg_write(res, VP_SRC_HEIGHT, state->src.h); | 514 | vp_reg_write(ctx, VP_SRC_HEIGHT, state->src.h); |
531 | vp_reg_write(res, VP_SRC_H_POSITION, | 515 | vp_reg_write(ctx, VP_SRC_H_POSITION, |
532 | VP_SRC_H_POSITION_VAL(state->src.x)); | 516 | VP_SRC_H_POSITION_VAL(state->src.x)); |
533 | vp_reg_write(res, VP_SRC_V_POSITION, state->src.y); | 517 | vp_reg_write(ctx, VP_SRC_V_POSITION, state->src.y); |
534 | 518 | ||
535 | vp_reg_write(res, VP_DST_WIDTH, state->crtc.w); | 519 | vp_reg_write(ctx, VP_DST_WIDTH, state->crtc.w); |
536 | vp_reg_write(res, VP_DST_H_POSITION, state->crtc.x); | 520 | vp_reg_write(ctx, VP_DST_H_POSITION, state->crtc.x); |
537 | if (test_bit(MXR_BIT_INTERLACE, &ctx->flags)) { | 521 | if (test_bit(MXR_BIT_INTERLACE, &ctx->flags)) { |
538 | vp_reg_write(res, VP_DST_HEIGHT, state->crtc.h / 2); | 522 | vp_reg_write(ctx, VP_DST_HEIGHT, state->crtc.h / 2); |
539 | vp_reg_write(res, VP_DST_V_POSITION, state->crtc.y / 2); | 523 | vp_reg_write(ctx, VP_DST_V_POSITION, state->crtc.y / 2); |
540 | } else { | 524 | } else { |
541 | vp_reg_write(res, VP_DST_HEIGHT, state->crtc.h); | 525 | vp_reg_write(ctx, VP_DST_HEIGHT, state->crtc.h); |
542 | vp_reg_write(res, VP_DST_V_POSITION, state->crtc.y); | 526 | vp_reg_write(ctx, VP_DST_V_POSITION, state->crtc.y); |
543 | } | 527 | } |
544 | 528 | ||
545 | vp_reg_write(res, VP_H_RATIO, state->h_ratio); | 529 | vp_reg_write(ctx, VP_H_RATIO, state->h_ratio); |
546 | vp_reg_write(res, VP_V_RATIO, state->v_ratio); | 530 | vp_reg_write(ctx, VP_V_RATIO, state->v_ratio); |
547 | 531 | ||
548 | vp_reg_write(res, VP_ENDIAN_MODE, VP_ENDIAN_MODE_LITTLE); | 532 | vp_reg_write(ctx, VP_ENDIAN_MODE, VP_ENDIAN_MODE_LITTLE); |
549 | 533 | ||
550 | /* set buffer address to vp */ | 534 | /* set buffer address to vp */ |
551 | vp_reg_write(res, VP_TOP_Y_PTR, luma_addr[0]); | 535 | vp_reg_write(ctx, VP_TOP_Y_PTR, luma_addr[0]); |
552 | vp_reg_write(res, VP_BOT_Y_PTR, luma_addr[1]); | 536 | vp_reg_write(ctx, VP_BOT_Y_PTR, luma_addr[1]); |
553 | vp_reg_write(res, VP_TOP_C_PTR, chroma_addr[0]); | 537 | vp_reg_write(ctx, VP_TOP_C_PTR, chroma_addr[0]); |
554 | vp_reg_write(res, VP_BOT_C_PTR, chroma_addr[1]); | 538 | vp_reg_write(ctx, VP_BOT_C_PTR, chroma_addr[1]); |
555 | 539 | ||
556 | mixer_cfg_scan(ctx, mode->vdisplay); | ||
557 | mixer_cfg_rgb_fmt(ctx, mode->vdisplay); | ||
558 | mixer_cfg_layer(ctx, plane->index, priority, true); | 540 | mixer_cfg_layer(ctx, plane->index, priority, true); |
559 | mixer_cfg_vp_blend(ctx); | 541 | mixer_cfg_vp_blend(ctx); |
560 | mixer_run(ctx); | ||
561 | 542 | ||
562 | spin_unlock_irqrestore(&res->reg_slock, flags); | 543 | spin_unlock_irqrestore(&ctx->reg_slock, flags); |
563 | 544 | ||
564 | mixer_regs_dump(ctx); | 545 | mixer_regs_dump(ctx); |
565 | vp_regs_dump(ctx); | 546 | vp_regs_dump(ctx); |
@@ -567,9 +548,7 @@ static void vp_video_buffer(struct mixer_context *ctx, | |||
567 | 548 | ||
568 | static void mixer_layer_update(struct mixer_context *ctx) | 549 | static void mixer_layer_update(struct mixer_context *ctx) |
569 | { | 550 | { |
570 | struct mixer_resources *res = &ctx->mixer_res; | 551 | mixer_reg_writemask(ctx, MXR_CFG, ~0, MXR_CFG_LAYER_UPDATE); |
571 | |||
572 | mixer_reg_writemask(res, MXR_CFG, ~0, MXR_CFG_LAYER_UPDATE); | ||
573 | } | 552 | } |
574 | 553 | ||
575 | static void mixer_graph_buffer(struct mixer_context *ctx, | 554 | static void mixer_graph_buffer(struct mixer_context *ctx, |
@@ -577,8 +556,6 @@ static void mixer_graph_buffer(struct mixer_context *ctx, | |||
577 | { | 556 | { |
578 | struct exynos_drm_plane_state *state = | 557 | struct exynos_drm_plane_state *state = |
579 | to_exynos_plane_state(plane->base.state); | 558 | to_exynos_plane_state(plane->base.state); |
580 | struct drm_display_mode *mode = &state->base.crtc->state->adjusted_mode; | ||
581 | struct mixer_resources *res = &ctx->mixer_res; | ||
582 | struct drm_framebuffer *fb = state->base.fb; | 559 | struct drm_framebuffer *fb = state->base.fb; |
583 | unsigned int priority = state->base.normalized_zpos + 1; | 560 | unsigned int priority = state->base.normalized_zpos + 1; |
584 | unsigned long flags; | 561 | unsigned long flags; |
@@ -623,45 +600,30 @@ static void mixer_graph_buffer(struct mixer_context *ctx, | |||
623 | + (state->src.x * fb->format->cpp[0]) | 600 | + (state->src.x * fb->format->cpp[0]) |
624 | + (state->src.y * fb->pitches[0]); | 601 | + (state->src.y * fb->pitches[0]); |
625 | 602 | ||
626 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) | 603 | spin_lock_irqsave(&ctx->reg_slock, flags); |
627 | __set_bit(MXR_BIT_INTERLACE, &ctx->flags); | ||
628 | else | ||
629 | __clear_bit(MXR_BIT_INTERLACE, &ctx->flags); | ||
630 | |||
631 | spin_lock_irqsave(&res->reg_slock, flags); | ||
632 | 604 | ||
633 | /* setup format */ | 605 | /* setup format */ |
634 | mixer_reg_writemask(res, MXR_GRAPHIC_CFG(win), | 606 | mixer_reg_writemask(ctx, MXR_GRAPHIC_CFG(win), |
635 | MXR_GRP_CFG_FORMAT_VAL(fmt), MXR_GRP_CFG_FORMAT_MASK); | 607 | MXR_GRP_CFG_FORMAT_VAL(fmt), MXR_GRP_CFG_FORMAT_MASK); |
636 | 608 | ||
637 | /* setup geometry */ | 609 | /* setup geometry */ |
638 | mixer_reg_write(res, MXR_GRAPHIC_SPAN(win), | 610 | mixer_reg_write(ctx, MXR_GRAPHIC_SPAN(win), |
639 | fb->pitches[0] / fb->format->cpp[0]); | 611 | fb->pitches[0] / fb->format->cpp[0]); |
640 | 612 | ||
641 | /* setup display size */ | ||
642 | if (ctx->mxr_ver == MXR_VER_128_0_0_184 && | ||
643 | win == DEFAULT_WIN) { | ||
644 | val = MXR_MXR_RES_HEIGHT(mode->vdisplay); | ||
645 | val |= MXR_MXR_RES_WIDTH(mode->hdisplay); | ||
646 | mixer_reg_write(res, MXR_RESOLUTION, val); | ||
647 | } | ||
648 | |||
649 | val = MXR_GRP_WH_WIDTH(state->src.w); | 613 | val = MXR_GRP_WH_WIDTH(state->src.w); |
650 | val |= MXR_GRP_WH_HEIGHT(state->src.h); | 614 | val |= MXR_GRP_WH_HEIGHT(state->src.h); |
651 | val |= MXR_GRP_WH_H_SCALE(x_ratio); | 615 | val |= MXR_GRP_WH_H_SCALE(x_ratio); |
652 | val |= MXR_GRP_WH_V_SCALE(y_ratio); | 616 | val |= MXR_GRP_WH_V_SCALE(y_ratio); |
653 | mixer_reg_write(res, MXR_GRAPHIC_WH(win), val); | 617 | mixer_reg_write(ctx, MXR_GRAPHIC_WH(win), val); |
654 | 618 | ||
655 | /* setup offsets in display image */ | 619 | /* setup offsets in display image */ |
656 | val = MXR_GRP_DXY_DX(dst_x_offset); | 620 | val = MXR_GRP_DXY_DX(dst_x_offset); |
657 | val |= MXR_GRP_DXY_DY(dst_y_offset); | 621 | val |= MXR_GRP_DXY_DY(dst_y_offset); |
658 | mixer_reg_write(res, MXR_GRAPHIC_DXY(win), val); | 622 | mixer_reg_write(ctx, MXR_GRAPHIC_DXY(win), val); |
659 | 623 | ||
660 | /* set buffer address to mixer */ | 624 | /* set buffer address to mixer */ |
661 | mixer_reg_write(res, MXR_GRAPHIC_BASE(win), dma_addr); | 625 | mixer_reg_write(ctx, MXR_GRAPHIC_BASE(win), dma_addr); |
662 | 626 | ||
663 | mixer_cfg_scan(ctx, mode->vdisplay); | ||
664 | mixer_cfg_rgb_fmt(ctx, mode->vdisplay); | ||
665 | mixer_cfg_layer(ctx, win, priority, true); | 627 | mixer_cfg_layer(ctx, win, priority, true); |
666 | mixer_cfg_gfx_blend(ctx, win, is_alpha_format(fb->format->format)); | 628 | mixer_cfg_gfx_blend(ctx, win, is_alpha_format(fb->format->format)); |
667 | 629 | ||
@@ -670,22 +632,19 @@ static void mixer_graph_buffer(struct mixer_context *ctx, | |||
670 | ctx->mxr_ver == MXR_VER_128_0_0_184) | 632 | ctx->mxr_ver == MXR_VER_128_0_0_184) |
671 | mixer_layer_update(ctx); | 633 | mixer_layer_update(ctx); |
672 | 634 | ||
673 | mixer_run(ctx); | 635 | spin_unlock_irqrestore(&ctx->reg_slock, flags); |
674 | |||
675 | spin_unlock_irqrestore(&res->reg_slock, flags); | ||
676 | 636 | ||
677 | mixer_regs_dump(ctx); | 637 | mixer_regs_dump(ctx); |
678 | } | 638 | } |
679 | 639 | ||
680 | static void vp_win_reset(struct mixer_context *ctx) | 640 | static void vp_win_reset(struct mixer_context *ctx) |
681 | { | 641 | { |
682 | struct mixer_resources *res = &ctx->mixer_res; | ||
683 | unsigned int tries = 100; | 642 | unsigned int tries = 100; |
684 | 643 | ||
685 | vp_reg_write(res, VP_SRESET, VP_SRESET_PROCESSING); | 644 | vp_reg_write(ctx, VP_SRESET, VP_SRESET_PROCESSING); |
686 | while (--tries) { | 645 | while (--tries) { |
687 | /* waiting until VP_SRESET_PROCESSING is 0 */ | 646 | /* waiting until VP_SRESET_PROCESSING is 0 */ |
688 | if (~vp_reg_read(res, VP_SRESET) & VP_SRESET_PROCESSING) | 647 | if (~vp_reg_read(ctx, VP_SRESET) & VP_SRESET_PROCESSING) |
689 | break; | 648 | break; |
690 | mdelay(10); | 649 | mdelay(10); |
691 | } | 650 | } |
@@ -694,57 +653,55 @@ static void vp_win_reset(struct mixer_context *ctx) | |||
694 | 653 | ||
695 | static void mixer_win_reset(struct mixer_context *ctx) | 654 | static void mixer_win_reset(struct mixer_context *ctx) |
696 | { | 655 | { |
697 | struct mixer_resources *res = &ctx->mixer_res; | ||
698 | unsigned long flags; | 656 | unsigned long flags; |
699 | 657 | ||
700 | spin_lock_irqsave(&res->reg_slock, flags); | 658 | spin_lock_irqsave(&ctx->reg_slock, flags); |
701 | 659 | ||
702 | mixer_reg_writemask(res, MXR_CFG, MXR_CFG_DST_HDMI, MXR_CFG_DST_MASK); | 660 | mixer_reg_writemask(ctx, MXR_CFG, MXR_CFG_DST_HDMI, MXR_CFG_DST_MASK); |
703 | 661 | ||
704 | /* set output in RGB888 mode */ | 662 | /* set output in RGB888 mode */ |
705 | mixer_reg_writemask(res, MXR_CFG, MXR_CFG_OUT_RGB888, MXR_CFG_OUT_MASK); | 663 | mixer_reg_writemask(ctx, MXR_CFG, MXR_CFG_OUT_RGB888, MXR_CFG_OUT_MASK); |
706 | 664 | ||
707 | /* 16 beat burst in DMA */ | 665 | /* 16 beat burst in DMA */ |
708 | mixer_reg_writemask(res, MXR_STATUS, MXR_STATUS_16_BURST, | 666 | mixer_reg_writemask(ctx, MXR_STATUS, MXR_STATUS_16_BURST, |
709 | MXR_STATUS_BURST_MASK); | 667 | MXR_STATUS_BURST_MASK); |
710 | 668 | ||
711 | /* reset default layer priority */ | 669 | /* reset default layer priority */ |
712 | mixer_reg_write(res, MXR_LAYER_CFG, 0); | 670 | mixer_reg_write(ctx, MXR_LAYER_CFG, 0); |
713 | 671 | ||
714 | /* set all background colors to RGB (0,0,0) */ | 672 | /* set all background colors to RGB (0,0,0) */ |
715 | mixer_reg_write(res, MXR_BG_COLOR0, MXR_YCBCR_VAL(0, 128, 128)); | 673 | mixer_reg_write(ctx, MXR_BG_COLOR0, MXR_YCBCR_VAL(0, 128, 128)); |
716 | mixer_reg_write(res, MXR_BG_COLOR1, MXR_YCBCR_VAL(0, 128, 128)); | 674 | mixer_reg_write(ctx, MXR_BG_COLOR1, MXR_YCBCR_VAL(0, 128, 128)); |
717 | mixer_reg_write(res, MXR_BG_COLOR2, MXR_YCBCR_VAL(0, 128, 128)); | 675 | mixer_reg_write(ctx, MXR_BG_COLOR2, MXR_YCBCR_VAL(0, 128, 128)); |
718 | 676 | ||
719 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) { | 677 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) { |
720 | /* configuration of Video Processor Registers */ | 678 | /* configuration of Video Processor Registers */ |
721 | vp_win_reset(ctx); | 679 | vp_win_reset(ctx); |
722 | vp_default_filter(res); | 680 | vp_default_filter(ctx); |
723 | } | 681 | } |
724 | 682 | ||
725 | /* disable all layers */ | 683 | /* disable all layers */ |
726 | mixer_reg_writemask(res, MXR_CFG, 0, MXR_CFG_GRP0_ENABLE); | 684 | mixer_reg_writemask(ctx, MXR_CFG, 0, MXR_CFG_GRP0_ENABLE); |
727 | mixer_reg_writemask(res, MXR_CFG, 0, MXR_CFG_GRP1_ENABLE); | 685 | mixer_reg_writemask(ctx, MXR_CFG, 0, MXR_CFG_GRP1_ENABLE); |
728 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) | 686 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) |
729 | mixer_reg_writemask(res, MXR_CFG, 0, MXR_CFG_VP_ENABLE); | 687 | mixer_reg_writemask(ctx, MXR_CFG, 0, MXR_CFG_VP_ENABLE); |
730 | 688 | ||
731 | /* set all source image offsets to zero */ | 689 | /* set all source image offsets to zero */ |
732 | mixer_reg_write(res, MXR_GRAPHIC_SXY(0), 0); | 690 | mixer_reg_write(ctx, MXR_GRAPHIC_SXY(0), 0); |
733 | mixer_reg_write(res, MXR_GRAPHIC_SXY(1), 0); | 691 | mixer_reg_write(ctx, MXR_GRAPHIC_SXY(1), 0); |
734 | 692 | ||
735 | spin_unlock_irqrestore(&res->reg_slock, flags); | 693 | spin_unlock_irqrestore(&ctx->reg_slock, flags); |
736 | } | 694 | } |
737 | 695 | ||
738 | static irqreturn_t mixer_irq_handler(int irq, void *arg) | 696 | static irqreturn_t mixer_irq_handler(int irq, void *arg) |
739 | { | 697 | { |
740 | struct mixer_context *ctx = arg; | 698 | struct mixer_context *ctx = arg; |
741 | struct mixer_resources *res = &ctx->mixer_res; | ||
742 | u32 val, base, shadow; | 699 | u32 val, base, shadow; |
743 | 700 | ||
744 | spin_lock(&res->reg_slock); | 701 | spin_lock(&ctx->reg_slock); |
745 | 702 | ||
746 | /* read interrupt status for handling and clearing flags for VSYNC */ | 703 | /* read interrupt status for handling and clearing flags for VSYNC */ |
747 | val = mixer_reg_read(res, MXR_INT_STATUS); | 704 | val = mixer_reg_read(ctx, MXR_INT_STATUS); |
748 | 705 | ||
749 | /* handling VSYNC */ | 706 | /* handling VSYNC */ |
750 | if (val & MXR_INT_STATUS_VSYNC) { | 707 | if (val & MXR_INT_STATUS_VSYNC) { |
@@ -754,13 +711,13 @@ static irqreturn_t mixer_irq_handler(int irq, void *arg) | |||
754 | 711 | ||
755 | /* interlace scan need to check shadow register */ | 712 | /* interlace scan need to check shadow register */ |
756 | if (test_bit(MXR_BIT_INTERLACE, &ctx->flags)) { | 713 | if (test_bit(MXR_BIT_INTERLACE, &ctx->flags)) { |
757 | base = mixer_reg_read(res, MXR_GRAPHIC_BASE(0)); | 714 | base = mixer_reg_read(ctx, MXR_GRAPHIC_BASE(0)); |
758 | shadow = mixer_reg_read(res, MXR_GRAPHIC_BASE_S(0)); | 715 | shadow = mixer_reg_read(ctx, MXR_GRAPHIC_BASE_S(0)); |
759 | if (base != shadow) | 716 | if (base != shadow) |
760 | goto out; | 717 | goto out; |
761 | 718 | ||
762 | base = mixer_reg_read(res, MXR_GRAPHIC_BASE(1)); | 719 | base = mixer_reg_read(ctx, MXR_GRAPHIC_BASE(1)); |
763 | shadow = mixer_reg_read(res, MXR_GRAPHIC_BASE_S(1)); | 720 | shadow = mixer_reg_read(ctx, MXR_GRAPHIC_BASE_S(1)); |
764 | if (base != shadow) | 721 | if (base != shadow) |
765 | goto out; | 722 | goto out; |
766 | } | 723 | } |
@@ -770,9 +727,9 @@ static irqreturn_t mixer_irq_handler(int irq, void *arg) | |||
770 | 727 | ||
771 | out: | 728 | out: |
772 | /* clear interrupts */ | 729 | /* clear interrupts */ |
773 | mixer_reg_write(res, MXR_INT_STATUS, val); | 730 | mixer_reg_write(ctx, MXR_INT_STATUS, val); |
774 | 731 | ||
775 | spin_unlock(&res->reg_slock); | 732 | spin_unlock(&ctx->reg_slock); |
776 | 733 | ||
777 | return IRQ_HANDLED; | 734 | return IRQ_HANDLED; |
778 | } | 735 | } |
@@ -780,26 +737,25 @@ out: | |||
780 | static int mixer_resources_init(struct mixer_context *mixer_ctx) | 737 | static int mixer_resources_init(struct mixer_context *mixer_ctx) |
781 | { | 738 | { |
782 | struct device *dev = &mixer_ctx->pdev->dev; | 739 | struct device *dev = &mixer_ctx->pdev->dev; |
783 | struct mixer_resources *mixer_res = &mixer_ctx->mixer_res; | ||
784 | struct resource *res; | 740 | struct resource *res; |
785 | int ret; | 741 | int ret; |
786 | 742 | ||
787 | spin_lock_init(&mixer_res->reg_slock); | 743 | spin_lock_init(&mixer_ctx->reg_slock); |
788 | 744 | ||
789 | mixer_res->mixer = devm_clk_get(dev, "mixer"); | 745 | mixer_ctx->mixer = devm_clk_get(dev, "mixer"); |
790 | if (IS_ERR(mixer_res->mixer)) { | 746 | if (IS_ERR(mixer_ctx->mixer)) { |
791 | dev_err(dev, "failed to get clock 'mixer'\n"); | 747 | dev_err(dev, "failed to get clock 'mixer'\n"); |
792 | return -ENODEV; | 748 | return -ENODEV; |
793 | } | 749 | } |
794 | 750 | ||
795 | mixer_res->hdmi = devm_clk_get(dev, "hdmi"); | 751 | mixer_ctx->hdmi = devm_clk_get(dev, "hdmi"); |
796 | if (IS_ERR(mixer_res->hdmi)) { | 752 | if (IS_ERR(mixer_ctx->hdmi)) { |
797 | dev_err(dev, "failed to get clock 'hdmi'\n"); | 753 | dev_err(dev, "failed to get clock 'hdmi'\n"); |
798 | return PTR_ERR(mixer_res->hdmi); | 754 | return PTR_ERR(mixer_ctx->hdmi); |
799 | } | 755 | } |
800 | 756 | ||
801 | mixer_res->sclk_hdmi = devm_clk_get(dev, "sclk_hdmi"); | 757 | mixer_ctx->sclk_hdmi = devm_clk_get(dev, "sclk_hdmi"); |
802 | if (IS_ERR(mixer_res->sclk_hdmi)) { | 758 | if (IS_ERR(mixer_ctx->sclk_hdmi)) { |
803 | dev_err(dev, "failed to get clock 'sclk_hdmi'\n"); | 759 | dev_err(dev, "failed to get clock 'sclk_hdmi'\n"); |
804 | return -ENODEV; | 760 | return -ENODEV; |
805 | } | 761 | } |
@@ -809,9 +765,9 @@ static int mixer_resources_init(struct mixer_context *mixer_ctx) | |||
809 | return -ENXIO; | 765 | return -ENXIO; |
810 | } | 766 | } |
811 | 767 | ||
812 | mixer_res->mixer_regs = devm_ioremap(dev, res->start, | 768 | mixer_ctx->mixer_regs = devm_ioremap(dev, res->start, |
813 | resource_size(res)); | 769 | resource_size(res)); |
814 | if (mixer_res->mixer_regs == NULL) { | 770 | if (mixer_ctx->mixer_regs == NULL) { |
815 | dev_err(dev, "register mapping failed.\n"); | 771 | dev_err(dev, "register mapping failed.\n"); |
816 | return -ENXIO; | 772 | return -ENXIO; |
817 | } | 773 | } |
@@ -828,7 +784,7 @@ static int mixer_resources_init(struct mixer_context *mixer_ctx) | |||
828 | dev_err(dev, "request interrupt failed.\n"); | 784 | dev_err(dev, "request interrupt failed.\n"); |
829 | return ret; | 785 | return ret; |
830 | } | 786 | } |
831 | mixer_res->irq = res->start; | 787 | mixer_ctx->irq = res->start; |
832 | 788 | ||
833 | return 0; | 789 | return 0; |
834 | } | 790 | } |
@@ -836,30 +792,29 @@ static int mixer_resources_init(struct mixer_context *mixer_ctx) | |||
836 | static int vp_resources_init(struct mixer_context *mixer_ctx) | 792 | static int vp_resources_init(struct mixer_context *mixer_ctx) |
837 | { | 793 | { |
838 | struct device *dev = &mixer_ctx->pdev->dev; | 794 | struct device *dev = &mixer_ctx->pdev->dev; |
839 | struct mixer_resources *mixer_res = &mixer_ctx->mixer_res; | ||
840 | struct resource *res; | 795 | struct resource *res; |
841 | 796 | ||
842 | mixer_res->vp = devm_clk_get(dev, "vp"); | 797 | mixer_ctx->vp = devm_clk_get(dev, "vp"); |
843 | if (IS_ERR(mixer_res->vp)) { | 798 | if (IS_ERR(mixer_ctx->vp)) { |
844 | dev_err(dev, "failed to get clock 'vp'\n"); | 799 | dev_err(dev, "failed to get clock 'vp'\n"); |
845 | return -ENODEV; | 800 | return -ENODEV; |
846 | } | 801 | } |
847 | 802 | ||
848 | if (test_bit(MXR_BIT_HAS_SCLK, &mixer_ctx->flags)) { | 803 | if (test_bit(MXR_BIT_HAS_SCLK, &mixer_ctx->flags)) { |
849 | mixer_res->sclk_mixer = devm_clk_get(dev, "sclk_mixer"); | 804 | mixer_ctx->sclk_mixer = devm_clk_get(dev, "sclk_mixer"); |
850 | if (IS_ERR(mixer_res->sclk_mixer)) { | 805 | if (IS_ERR(mixer_ctx->sclk_mixer)) { |
851 | dev_err(dev, "failed to get clock 'sclk_mixer'\n"); | 806 | dev_err(dev, "failed to get clock 'sclk_mixer'\n"); |
852 | return -ENODEV; | 807 | return -ENODEV; |
853 | } | 808 | } |
854 | mixer_res->mout_mixer = devm_clk_get(dev, "mout_mixer"); | 809 | mixer_ctx->mout_mixer = devm_clk_get(dev, "mout_mixer"); |
855 | if (IS_ERR(mixer_res->mout_mixer)) { | 810 | if (IS_ERR(mixer_ctx->mout_mixer)) { |
856 | dev_err(dev, "failed to get clock 'mout_mixer'\n"); | 811 | dev_err(dev, "failed to get clock 'mout_mixer'\n"); |
857 | return -ENODEV; | 812 | return -ENODEV; |
858 | } | 813 | } |
859 | 814 | ||
860 | if (mixer_res->sclk_hdmi && mixer_res->mout_mixer) | 815 | if (mixer_ctx->sclk_hdmi && mixer_ctx->mout_mixer) |
861 | clk_set_parent(mixer_res->mout_mixer, | 816 | clk_set_parent(mixer_ctx->mout_mixer, |
862 | mixer_res->sclk_hdmi); | 817 | mixer_ctx->sclk_hdmi); |
863 | } | 818 | } |
864 | 819 | ||
865 | res = platform_get_resource(mixer_ctx->pdev, IORESOURCE_MEM, 1); | 820 | res = platform_get_resource(mixer_ctx->pdev, IORESOURCE_MEM, 1); |
@@ -868,9 +823,9 @@ static int vp_resources_init(struct mixer_context *mixer_ctx) | |||
868 | return -ENXIO; | 823 | return -ENXIO; |
869 | } | 824 | } |
870 | 825 | ||
871 | mixer_res->vp_regs = devm_ioremap(dev, res->start, | 826 | mixer_ctx->vp_regs = devm_ioremap(dev, res->start, |
872 | resource_size(res)); | 827 | resource_size(res)); |
873 | if (mixer_res->vp_regs == NULL) { | 828 | if (mixer_ctx->vp_regs == NULL) { |
874 | dev_err(dev, "register mapping failed.\n"); | 829 | dev_err(dev, "register mapping failed.\n"); |
875 | return -ENXIO; | 830 | return -ENXIO; |
876 | } | 831 | } |
@@ -914,15 +869,14 @@ static void mixer_ctx_remove(struct mixer_context *mixer_ctx) | |||
914 | static int mixer_enable_vblank(struct exynos_drm_crtc *crtc) | 869 | static int mixer_enable_vblank(struct exynos_drm_crtc *crtc) |
915 | { | 870 | { |
916 | struct mixer_context *mixer_ctx = crtc->ctx; | 871 | struct mixer_context *mixer_ctx = crtc->ctx; |
917 | struct mixer_resources *res = &mixer_ctx->mixer_res; | ||
918 | 872 | ||
919 | __set_bit(MXR_BIT_VSYNC, &mixer_ctx->flags); | 873 | __set_bit(MXR_BIT_VSYNC, &mixer_ctx->flags); |
920 | if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags)) | 874 | if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags)) |
921 | return 0; | 875 | return 0; |
922 | 876 | ||
923 | /* enable vsync interrupt */ | 877 | /* enable vsync interrupt */ |
924 | mixer_reg_writemask(res, MXR_INT_STATUS, ~0, MXR_INT_CLEAR_VSYNC); | 878 | mixer_reg_writemask(mixer_ctx, MXR_INT_STATUS, ~0, MXR_INT_CLEAR_VSYNC); |
925 | mixer_reg_writemask(res, MXR_INT_EN, ~0, MXR_INT_EN_VSYNC); | 879 | mixer_reg_writemask(mixer_ctx, MXR_INT_EN, ~0, MXR_INT_EN_VSYNC); |
926 | 880 | ||
927 | return 0; | 881 | return 0; |
928 | } | 882 | } |
@@ -930,7 +884,6 @@ static int mixer_enable_vblank(struct exynos_drm_crtc *crtc) | |||
930 | static void mixer_disable_vblank(struct exynos_drm_crtc *crtc) | 884 | static void mixer_disable_vblank(struct exynos_drm_crtc *crtc) |
931 | { | 885 | { |
932 | struct mixer_context *mixer_ctx = crtc->ctx; | 886 | struct mixer_context *mixer_ctx = crtc->ctx; |
933 | struct mixer_resources *res = &mixer_ctx->mixer_res; | ||
934 | 887 | ||
935 | __clear_bit(MXR_BIT_VSYNC, &mixer_ctx->flags); | 888 | __clear_bit(MXR_BIT_VSYNC, &mixer_ctx->flags); |
936 | 889 | ||
@@ -938,8 +891,8 @@ static void mixer_disable_vblank(struct exynos_drm_crtc *crtc) | |||
938 | return; | 891 | return; |
939 | 892 | ||
940 | /* disable vsync interrupt */ | 893 | /* disable vsync interrupt */ |
941 | mixer_reg_writemask(res, MXR_INT_STATUS, ~0, MXR_INT_CLEAR_VSYNC); | 894 | mixer_reg_writemask(mixer_ctx, MXR_INT_STATUS, ~0, MXR_INT_CLEAR_VSYNC); |
942 | mixer_reg_writemask(res, MXR_INT_EN, 0, MXR_INT_EN_VSYNC); | 895 | mixer_reg_writemask(mixer_ctx, MXR_INT_EN, 0, MXR_INT_EN_VSYNC); |
943 | } | 896 | } |
944 | 897 | ||
945 | static void mixer_atomic_begin(struct exynos_drm_crtc *crtc) | 898 | static void mixer_atomic_begin(struct exynos_drm_crtc *crtc) |
@@ -972,7 +925,6 @@ static void mixer_disable_plane(struct exynos_drm_crtc *crtc, | |||
972 | struct exynos_drm_plane *plane) | 925 | struct exynos_drm_plane *plane) |
973 | { | 926 | { |
974 | struct mixer_context *mixer_ctx = crtc->ctx; | 927 | struct mixer_context *mixer_ctx = crtc->ctx; |
975 | struct mixer_resources *res = &mixer_ctx->mixer_res; | ||
976 | unsigned long flags; | 928 | unsigned long flags; |
977 | 929 | ||
978 | DRM_DEBUG_KMS("win: %d\n", plane->index); | 930 | DRM_DEBUG_KMS("win: %d\n", plane->index); |
@@ -980,9 +932,9 @@ static void mixer_disable_plane(struct exynos_drm_crtc *crtc, | |||
980 | if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags)) | 932 | if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags)) |
981 | return; | 933 | return; |
982 | 934 | ||
983 | spin_lock_irqsave(&res->reg_slock, flags); | 935 | spin_lock_irqsave(&mixer_ctx->reg_slock, flags); |
984 | mixer_cfg_layer(mixer_ctx, plane->index, 0, false); | 936 | mixer_cfg_layer(mixer_ctx, plane->index, 0, false); |
985 | spin_unlock_irqrestore(&res->reg_slock, flags); | 937 | spin_unlock_irqrestore(&mixer_ctx->reg_slock, flags); |
986 | } | 938 | } |
987 | 939 | ||
988 | static void mixer_atomic_flush(struct exynos_drm_crtc *crtc) | 940 | static void mixer_atomic_flush(struct exynos_drm_crtc *crtc) |
@@ -999,7 +951,6 @@ static void mixer_atomic_flush(struct exynos_drm_crtc *crtc) | |||
999 | static void mixer_enable(struct exynos_drm_crtc *crtc) | 951 | static void mixer_enable(struct exynos_drm_crtc *crtc) |
1000 | { | 952 | { |
1001 | struct mixer_context *ctx = crtc->ctx; | 953 | struct mixer_context *ctx = crtc->ctx; |
1002 | struct mixer_resources *res = &ctx->mixer_res; | ||
1003 | 954 | ||
1004 | if (test_bit(MXR_BIT_POWERED, &ctx->flags)) | 955 | if (test_bit(MXR_BIT_POWERED, &ctx->flags)) |
1005 | return; | 956 | return; |
@@ -1010,14 +961,17 @@ static void mixer_enable(struct exynos_drm_crtc *crtc) | |||
1010 | 961 | ||
1011 | mixer_vsync_set_update(ctx, false); | 962 | mixer_vsync_set_update(ctx, false); |
1012 | 963 | ||
1013 | mixer_reg_writemask(res, MXR_STATUS, ~0, MXR_STATUS_SOFT_RESET); | 964 | mixer_reg_writemask(ctx, MXR_STATUS, ~0, MXR_STATUS_SOFT_RESET); |
1014 | 965 | ||
1015 | if (test_bit(MXR_BIT_VSYNC, &ctx->flags)) { | 966 | if (test_bit(MXR_BIT_VSYNC, &ctx->flags)) { |
1016 | mixer_reg_writemask(res, MXR_INT_STATUS, ~0, MXR_INT_CLEAR_VSYNC); | 967 | mixer_reg_writemask(ctx, MXR_INT_STATUS, ~0, |
1017 | mixer_reg_writemask(res, MXR_INT_EN, ~0, MXR_INT_EN_VSYNC); | 968 | MXR_INT_CLEAR_VSYNC); |
969 | mixer_reg_writemask(ctx, MXR_INT_EN, ~0, MXR_INT_EN_VSYNC); | ||
1018 | } | 970 | } |
1019 | mixer_win_reset(ctx); | 971 | mixer_win_reset(ctx); |
1020 | 972 | ||
973 | mixer_commit(ctx); | ||
974 | |||
1021 | mixer_vsync_set_update(ctx, true); | 975 | mixer_vsync_set_update(ctx, true); |
1022 | 976 | ||
1023 | set_bit(MXR_BIT_POWERED, &ctx->flags); | 977 | set_bit(MXR_BIT_POWERED, &ctx->flags); |
@@ -1044,26 +998,75 @@ static void mixer_disable(struct exynos_drm_crtc *crtc) | |||
1044 | clear_bit(MXR_BIT_POWERED, &ctx->flags); | 998 | clear_bit(MXR_BIT_POWERED, &ctx->flags); |
1045 | } | 999 | } |
1046 | 1000 | ||
1047 | /* Only valid for Mixer version 16.0.33.0 */ | 1001 | static int mixer_mode_valid(struct exynos_drm_crtc *crtc, |
1048 | static int mixer_atomic_check(struct exynos_drm_crtc *crtc, | 1002 | const struct drm_display_mode *mode) |
1049 | struct drm_crtc_state *state) | ||
1050 | { | 1003 | { |
1051 | struct drm_display_mode *mode = &state->adjusted_mode; | 1004 | struct mixer_context *ctx = crtc->ctx; |
1052 | u32 w, h; | 1005 | u32 w = mode->hdisplay, h = mode->vdisplay; |
1053 | 1006 | ||
1054 | w = mode->hdisplay; | 1007 | DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%d\n", w, h, |
1055 | h = mode->vdisplay; | 1008 | mode->vrefresh, !!(mode->flags & DRM_MODE_FLAG_INTERLACE)); |
1056 | 1009 | ||
1057 | DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%d\n", | 1010 | if (ctx->mxr_ver == MXR_VER_128_0_0_184) |
1058 | mode->hdisplay, mode->vdisplay, mode->vrefresh, | 1011 | return MODE_OK; |
1059 | (mode->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0); | ||
1060 | 1012 | ||
1061 | if ((w >= 464 && w <= 720 && h >= 261 && h <= 576) || | 1013 | if ((w >= 464 && w <= 720 && h >= 261 && h <= 576) || |
1062 | (w >= 1024 && w <= 1280 && h >= 576 && h <= 720) || | 1014 | (w >= 1024 && w <= 1280 && h >= 576 && h <= 720) || |
1063 | (w >= 1664 && w <= 1920 && h >= 936 && h <= 1080)) | 1015 | (w >= 1664 && w <= 1920 && h >= 936 && h <= 1080)) |
1064 | return 0; | 1016 | return MODE_OK; |
1017 | |||
1018 | if ((w == 1024 && h == 768) || | ||
1019 | (w == 1366 && h == 768) || | ||
1020 | (w == 1280 && h == 1024)) | ||
1021 | return MODE_OK; | ||
1022 | |||
1023 | return MODE_BAD; | ||
1024 | } | ||
1025 | |||
1026 | static bool mixer_mode_fixup(struct exynos_drm_crtc *crtc, | ||
1027 | const struct drm_display_mode *mode, | ||
1028 | struct drm_display_mode *adjusted_mode) | ||
1029 | { | ||
1030 | struct mixer_context *ctx = crtc->ctx; | ||
1031 | int width = mode->hdisplay, height = mode->vdisplay, i; | ||
1032 | |||
1033 | struct { | ||
1034 | int hdisplay, vdisplay, htotal, vtotal, scan_val; | ||
1035 | } static const modes[] = { | ||
1036 | { 720, 480, 858, 525, MXR_CFG_SCAN_NTSC | MXR_CFG_SCAN_SD }, | ||
1037 | { 720, 576, 864, 625, MXR_CFG_SCAN_PAL | MXR_CFG_SCAN_SD }, | ||
1038 | { 1280, 720, 1650, 750, MXR_CFG_SCAN_HD_720 | MXR_CFG_SCAN_HD }, | ||
1039 | { 1920, 1080, 2200, 1125, MXR_CFG_SCAN_HD_1080 | | ||
1040 | MXR_CFG_SCAN_HD } | ||
1041 | }; | ||
1042 | |||
1043 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) | ||
1044 | __set_bit(MXR_BIT_INTERLACE, &ctx->flags); | ||
1045 | else | ||
1046 | __clear_bit(MXR_BIT_INTERLACE, &ctx->flags); | ||
1047 | |||
1048 | if (ctx->mxr_ver == MXR_VER_128_0_0_184) | ||
1049 | return true; | ||
1050 | |||
1051 | for (i = 0; i < ARRAY_SIZE(modes); ++i) | ||
1052 | if (width <= modes[i].hdisplay && height <= modes[i].vdisplay) { | ||
1053 | ctx->scan_value = modes[i].scan_val; | ||
1054 | if (width < modes[i].hdisplay || | ||
1055 | height < modes[i].vdisplay) { | ||
1056 | adjusted_mode->hdisplay = modes[i].hdisplay; | ||
1057 | adjusted_mode->hsync_start = modes[i].hdisplay; | ||
1058 | adjusted_mode->hsync_end = modes[i].htotal; | ||
1059 | adjusted_mode->htotal = modes[i].htotal; | ||
1060 | adjusted_mode->vdisplay = modes[i].vdisplay; | ||
1061 | adjusted_mode->vsync_start = modes[i].vdisplay; | ||
1062 | adjusted_mode->vsync_end = modes[i].vtotal; | ||
1063 | adjusted_mode->vtotal = modes[i].vtotal; | ||
1064 | } | ||
1065 | |||
1066 | return true; | ||
1067 | } | ||
1065 | 1068 | ||
1066 | return -EINVAL; | 1069 | return false; |
1067 | } | 1070 | } |
1068 | 1071 | ||
1069 | static const struct exynos_drm_crtc_ops mixer_crtc_ops = { | 1072 | static const struct exynos_drm_crtc_ops mixer_crtc_ops = { |
@@ -1075,7 +1078,8 @@ static const struct exynos_drm_crtc_ops mixer_crtc_ops = { | |||
1075 | .update_plane = mixer_update_plane, | 1078 | .update_plane = mixer_update_plane, |
1076 | .disable_plane = mixer_disable_plane, | 1079 | .disable_plane = mixer_disable_plane, |
1077 | .atomic_flush = mixer_atomic_flush, | 1080 | .atomic_flush = mixer_atomic_flush, |
1078 | .atomic_check = mixer_atomic_check, | 1081 | .mode_valid = mixer_mode_valid, |
1082 | .mode_fixup = mixer_mode_fixup, | ||
1079 | }; | 1083 | }; |
1080 | 1084 | ||
1081 | static const struct mixer_drv_data exynos5420_mxr_drv_data = { | 1085 | static const struct mixer_drv_data exynos5420_mxr_drv_data = { |
@@ -1217,14 +1221,13 @@ static int mixer_remove(struct platform_device *pdev) | |||
1217 | static int __maybe_unused exynos_mixer_suspend(struct device *dev) | 1221 | static int __maybe_unused exynos_mixer_suspend(struct device *dev) |
1218 | { | 1222 | { |
1219 | struct mixer_context *ctx = dev_get_drvdata(dev); | 1223 | struct mixer_context *ctx = dev_get_drvdata(dev); |
1220 | struct mixer_resources *res = &ctx->mixer_res; | ||
1221 | 1224 | ||
1222 | clk_disable_unprepare(res->hdmi); | 1225 | clk_disable_unprepare(ctx->hdmi); |
1223 | clk_disable_unprepare(res->mixer); | 1226 | clk_disable_unprepare(ctx->mixer); |
1224 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) { | 1227 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) { |
1225 | clk_disable_unprepare(res->vp); | 1228 | clk_disable_unprepare(ctx->vp); |
1226 | if (test_bit(MXR_BIT_HAS_SCLK, &ctx->flags)) | 1229 | if (test_bit(MXR_BIT_HAS_SCLK, &ctx->flags)) |
1227 | clk_disable_unprepare(res->sclk_mixer); | 1230 | clk_disable_unprepare(ctx->sclk_mixer); |
1228 | } | 1231 | } |
1229 | 1232 | ||
1230 | return 0; | 1233 | return 0; |
@@ -1233,28 +1236,27 @@ static int __maybe_unused exynos_mixer_suspend(struct device *dev) | |||
1233 | static int __maybe_unused exynos_mixer_resume(struct device *dev) | 1236 | static int __maybe_unused exynos_mixer_resume(struct device *dev) |
1234 | { | 1237 | { |
1235 | struct mixer_context *ctx = dev_get_drvdata(dev); | 1238 | struct mixer_context *ctx = dev_get_drvdata(dev); |
1236 | struct mixer_resources *res = &ctx->mixer_res; | ||
1237 | int ret; | 1239 | int ret; |
1238 | 1240 | ||
1239 | ret = clk_prepare_enable(res->mixer); | 1241 | ret = clk_prepare_enable(ctx->mixer); |
1240 | if (ret < 0) { | 1242 | if (ret < 0) { |
1241 | DRM_ERROR("Failed to prepare_enable the mixer clk [%d]\n", ret); | 1243 | DRM_ERROR("Failed to prepare_enable the mixer clk [%d]\n", ret); |
1242 | return ret; | 1244 | return ret; |
1243 | } | 1245 | } |
1244 | ret = clk_prepare_enable(res->hdmi); | 1246 | ret = clk_prepare_enable(ctx->hdmi); |
1245 | if (ret < 0) { | 1247 | if (ret < 0) { |
1246 | DRM_ERROR("Failed to prepare_enable the hdmi clk [%d]\n", ret); | 1248 | DRM_ERROR("Failed to prepare_enable the hdmi clk [%d]\n", ret); |
1247 | return ret; | 1249 | return ret; |
1248 | } | 1250 | } |
1249 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) { | 1251 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) { |
1250 | ret = clk_prepare_enable(res->vp); | 1252 | ret = clk_prepare_enable(ctx->vp); |
1251 | if (ret < 0) { | 1253 | if (ret < 0) { |
1252 | DRM_ERROR("Failed to prepare_enable the vp clk [%d]\n", | 1254 | DRM_ERROR("Failed to prepare_enable the vp clk [%d]\n", |
1253 | ret); | 1255 | ret); |
1254 | return ret; | 1256 | return ret; |
1255 | } | 1257 | } |
1256 | if (test_bit(MXR_BIT_HAS_SCLK, &ctx->flags)) { | 1258 | if (test_bit(MXR_BIT_HAS_SCLK, &ctx->flags)) { |
1257 | ret = clk_prepare_enable(res->sclk_mixer); | 1259 | ret = clk_prepare_enable(ctx->sclk_mixer); |
1258 | if (ret < 0) { | 1260 | if (ret < 0) { |
1259 | DRM_ERROR("Failed to prepare_enable the " \ | 1261 | DRM_ERROR("Failed to prepare_enable the " \ |
1260 | "sclk_mixer clk [%d]\n", | 1262 | "sclk_mixer clk [%d]\n", |
diff --git a/drivers/gpu/drm/exynos/regs-hdmi.h b/drivers/gpu/drm/exynos/regs-hdmi.h index a0507dc18d9e..04be0f7e8193 100644 --- a/drivers/gpu/drm/exynos/regs-hdmi.h +++ b/drivers/gpu/drm/exynos/regs-hdmi.h | |||
@@ -419,11 +419,9 @@ | |||
419 | #define HDMI_I2S_DSD_CON HDMI_I2S_BASE(0x01c) | 419 | #define HDMI_I2S_DSD_CON HDMI_I2S_BASE(0x01c) |
420 | #define HDMI_I2S_MUX_CON HDMI_I2S_BASE(0x020) | 420 | #define HDMI_I2S_MUX_CON HDMI_I2S_BASE(0x020) |
421 | #define HDMI_I2S_CH_ST_CON HDMI_I2S_BASE(0x024) | 421 | #define HDMI_I2S_CH_ST_CON HDMI_I2S_BASE(0x024) |
422 | #define HDMI_I2S_CH_ST_0 HDMI_I2S_BASE(0x028) | 422 | /* n must be within range 0...(HDMI_I2S_CH_ST_MAXNUM - 1) */ |
423 | #define HDMI_I2S_CH_ST_1 HDMI_I2S_BASE(0x02c) | 423 | #define HDMI_I2S_CH_ST_MAXNUM 5 |
424 | #define HDMI_I2S_CH_ST_2 HDMI_I2S_BASE(0x030) | 424 | #define HDMI_I2S_CH_ST(n) HDMI_I2S_BASE(0x028 + 4 * (n)) |
425 | #define HDMI_I2S_CH_ST_3 HDMI_I2S_BASE(0x034) | ||
426 | #define HDMI_I2S_CH_ST_4 HDMI_I2S_BASE(0x038) | ||
427 | #define HDMI_I2S_CH_ST_SH_0 HDMI_I2S_BASE(0x03c) | 425 | #define HDMI_I2S_CH_ST_SH_0 HDMI_I2S_BASE(0x03c) |
428 | #define HDMI_I2S_CH_ST_SH_1 HDMI_I2S_BASE(0x040) | 426 | #define HDMI_I2S_CH_ST_SH_1 HDMI_I2S_BASE(0x040) |
429 | #define HDMI_I2S_CH_ST_SH_2 HDMI_I2S_BASE(0x044) | 427 | #define HDMI_I2S_CH_ST_SH_2 HDMI_I2S_BASE(0x044) |
diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c index 58e9e0601a61..faf17b83b910 100644 --- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c +++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c | |||
@@ -210,7 +210,6 @@ static int fsl_dcu_drm_pm_suspend(struct device *dev) | |||
210 | return PTR_ERR(fsl_dev->state); | 210 | return PTR_ERR(fsl_dev->state); |
211 | } | 211 | } |
212 | 212 | ||
213 | clk_disable_unprepare(fsl_dev->pix_clk); | ||
214 | clk_disable_unprepare(fsl_dev->clk); | 213 | clk_disable_unprepare(fsl_dev->clk); |
215 | 214 | ||
216 | return 0; | 215 | return 0; |
@@ -233,6 +232,7 @@ static int fsl_dcu_drm_pm_resume(struct device *dev) | |||
233 | if (fsl_dev->tcon) | 232 | if (fsl_dev->tcon) |
234 | fsl_tcon_bypass_enable(fsl_dev->tcon); | 233 | fsl_tcon_bypass_enable(fsl_dev->tcon); |
235 | fsl_dcu_drm_init_planes(fsl_dev->drm); | 234 | fsl_dcu_drm_init_planes(fsl_dev->drm); |
235 | enable_irq(fsl_dev->irq); | ||
236 | drm_atomic_helper_resume(fsl_dev->drm, fsl_dev->state); | 236 | drm_atomic_helper_resume(fsl_dev->drm, fsl_dev->state); |
237 | 237 | ||
238 | console_lock(); | 238 | console_lock(); |
@@ -240,7 +240,6 @@ static int fsl_dcu_drm_pm_resume(struct device *dev) | |||
240 | console_unlock(); | 240 | console_unlock(); |
241 | 241 | ||
242 | drm_kms_helper_poll_enable(fsl_dev->drm); | 242 | drm_kms_helper_poll_enable(fsl_dev->drm); |
243 | enable_irq(fsl_dev->irq); | ||
244 | 243 | ||
245 | return 0; | 244 | return 0; |
246 | } | 245 | } |
diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c index edd7d8127d19..c54806d08dd7 100644 --- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c +++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c | |||
@@ -102,7 +102,6 @@ static int fsl_dcu_attach_panel(struct fsl_dcu_drm_device *fsl_dev, | |||
102 | { | 102 | { |
103 | struct drm_encoder *encoder = &fsl_dev->encoder; | 103 | struct drm_encoder *encoder = &fsl_dev->encoder; |
104 | struct drm_connector *connector = &fsl_dev->connector.base; | 104 | struct drm_connector *connector = &fsl_dev->connector.base; |
105 | struct drm_mode_config *mode_config = &fsl_dev->drm->mode_config; | ||
106 | int ret; | 105 | int ret; |
107 | 106 | ||
108 | fsl_dev->connector.encoder = encoder; | 107 | fsl_dev->connector.encoder = encoder; |
@@ -122,10 +121,6 @@ static int fsl_dcu_attach_panel(struct fsl_dcu_drm_device *fsl_dev, | |||
122 | if (ret < 0) | 121 | if (ret < 0) |
123 | goto err_sysfs; | 122 | goto err_sysfs; |
124 | 123 | ||
125 | drm_object_property_set_value(&connector->base, | ||
126 | mode_config->dpms_property, | ||
127 | DRM_MODE_DPMS_OFF); | ||
128 | |||
129 | ret = drm_panel_attach(panel, connector); | 124 | ret = drm_panel_attach(panel, connector); |
130 | if (ret) { | 125 | if (ret) { |
131 | dev_err(fsl_dev->dev, "failed to attach panel\n"); | 126 | dev_err(fsl_dev->dev, "failed to attach panel\n"); |
diff --git a/drivers/gpu/drm/imx/ipuv3-crtc.c b/drivers/gpu/drm/imx/ipuv3-crtc.c index 53e0b24beda6..9a9961802f5c 100644 --- a/drivers/gpu/drm/imx/ipuv3-crtc.c +++ b/drivers/gpu/drm/imx/ipuv3-crtc.c | |||
@@ -115,7 +115,7 @@ static void imx_drm_crtc_reset(struct drm_crtc *crtc) | |||
115 | 115 | ||
116 | if (crtc->state) { | 116 | if (crtc->state) { |
117 | if (crtc->state->mode_blob) | 117 | if (crtc->state->mode_blob) |
118 | drm_property_unreference_blob(crtc->state->mode_blob); | 118 | drm_property_blob_put(crtc->state->mode_blob); |
119 | 119 | ||
120 | state = to_imx_crtc_state(crtc->state); | 120 | state = to_imx_crtc_state(crtc->state); |
121 | memset(state, 0, sizeof(*state)); | 121 | memset(state, 0, sizeof(*state)); |
diff --git a/drivers/gpu/drm/imx/parallel-display.c b/drivers/gpu/drm/imx/parallel-display.c index 8def97d75030..aedecda9728a 100644 --- a/drivers/gpu/drm/imx/parallel-display.c +++ b/drivers/gpu/drm/imx/parallel-display.c | |||
@@ -183,7 +183,7 @@ static int imx_pd_register(struct drm_device *drm, | |||
183 | &imx_pd_connector_helper_funcs); | 183 | &imx_pd_connector_helper_funcs); |
184 | drm_connector_init(drm, &imxpd->connector, | 184 | drm_connector_init(drm, &imxpd->connector, |
185 | &imx_pd_connector_funcs, | 185 | &imx_pd_connector_funcs, |
186 | DRM_MODE_CONNECTOR_VGA); | 186 | DRM_MODE_CONNECTOR_DPI); |
187 | } | 187 | } |
188 | 188 | ||
189 | if (imxpd->panel) | 189 | if (imxpd->panel) |
diff --git a/drivers/gpu/drm/qxl/qxl_cmd.c b/drivers/gpu/drm/qxl/qxl_cmd.c index 74fc9362ecf9..c0fb52c6d4ca 100644 --- a/drivers/gpu/drm/qxl/qxl_cmd.c +++ b/drivers/gpu/drm/qxl/qxl_cmd.c | |||
@@ -219,7 +219,7 @@ int qxl_garbage_collect(struct qxl_device *qdev) | |||
219 | union qxl_release_info *info; | 219 | union qxl_release_info *info; |
220 | 220 | ||
221 | while (qxl_ring_pop(qdev->release_ring, &id)) { | 221 | while (qxl_ring_pop(qdev->release_ring, &id)) { |
222 | QXL_INFO(qdev, "popped %lld\n", id); | 222 | DRM_DEBUG_DRIVER("popped %lld\n", id); |
223 | while (id) { | 223 | while (id) { |
224 | release = qxl_release_from_id_locked(qdev, id); | 224 | release = qxl_release_from_id_locked(qdev, id); |
225 | if (release == NULL) | 225 | if (release == NULL) |
@@ -229,8 +229,8 @@ int qxl_garbage_collect(struct qxl_device *qdev) | |||
229 | next_id = info->next; | 229 | next_id = info->next; |
230 | qxl_release_unmap(qdev, release, info); | 230 | qxl_release_unmap(qdev, release, info); |
231 | 231 | ||
232 | QXL_INFO(qdev, "popped %lld, next %lld\n", id, | 232 | DRM_DEBUG_DRIVER("popped %lld, next %lld\n", id, |
233 | next_id); | 233 | next_id); |
234 | 234 | ||
235 | switch (release->type) { | 235 | switch (release->type) { |
236 | case QXL_RELEASE_DRAWABLE: | 236 | case QXL_RELEASE_DRAWABLE: |
@@ -248,7 +248,7 @@ int qxl_garbage_collect(struct qxl_device *qdev) | |||
248 | } | 248 | } |
249 | } | 249 | } |
250 | 250 | ||
251 | QXL_INFO(qdev, "%s: %d\n", __func__, i); | 251 | DRM_DEBUG_DRIVER("%d\n", i); |
252 | 252 | ||
253 | return i; | 253 | return i; |
254 | } | 254 | } |
@@ -381,17 +381,19 @@ void qxl_io_create_primary(struct qxl_device *qdev, | |||
381 | { | 381 | { |
382 | struct qxl_surface_create *create; | 382 | struct qxl_surface_create *create; |
383 | 383 | ||
384 | QXL_INFO(qdev, "%s: qdev %p, ram_header %p\n", __func__, qdev, | 384 | DRM_DEBUG_DRIVER("qdev %p, ram_header %p\n", qdev, qdev->ram_header); |
385 | qdev->ram_header); | ||
386 | create = &qdev->ram_header->create_surface; | 385 | create = &qdev->ram_header->create_surface; |
387 | create->format = bo->surf.format; | 386 | create->format = bo->surf.format; |
388 | create->width = bo->surf.width; | 387 | create->width = bo->surf.width; |
389 | create->height = bo->surf.height; | 388 | create->height = bo->surf.height; |
390 | create->stride = bo->surf.stride; | 389 | create->stride = bo->surf.stride; |
391 | create->mem = qxl_bo_physical_address(qdev, bo, offset); | 390 | if (bo->shadow) { |
391 | create->mem = qxl_bo_physical_address(qdev, bo->shadow, offset); | ||
392 | } else { | ||
393 | create->mem = qxl_bo_physical_address(qdev, bo, offset); | ||
394 | } | ||
392 | 395 | ||
393 | QXL_INFO(qdev, "%s: mem = %llx, from %p\n", __func__, create->mem, | 396 | DRM_DEBUG_DRIVER("mem = %llx, from %p\n", create->mem, bo->kptr); |
394 | bo->kptr); | ||
395 | 397 | ||
396 | create->flags = QXL_SURF_FLAG_KEEP_DATA; | 398 | create->flags = QXL_SURF_FLAG_KEEP_DATA; |
397 | create->type = QXL_SURF_TYPE_PRIMARY; | 399 | create->type = QXL_SURF_TYPE_PRIMARY; |
@@ -401,7 +403,7 @@ void qxl_io_create_primary(struct qxl_device *qdev, | |||
401 | 403 | ||
402 | void qxl_io_memslot_add(struct qxl_device *qdev, uint8_t id) | 404 | void qxl_io_memslot_add(struct qxl_device *qdev, uint8_t id) |
403 | { | 405 | { |
404 | QXL_INFO(qdev, "qxl_memslot_add %d\n", id); | 406 | DRM_DEBUG_DRIVER("qxl_memslot_add %d\n", id); |
405 | wait_for_io_cmd(qdev, id, QXL_IO_MEMSLOT_ADD_ASYNC); | 407 | wait_for_io_cmd(qdev, id, QXL_IO_MEMSLOT_ADD_ASYNC); |
406 | } | 408 | } |
407 | 409 | ||
diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c index afbf50d0c08f..4756b3c9bf2c 100644 --- a/drivers/gpu/drm/qxl/qxl_display.c +++ b/drivers/gpu/drm/qxl/qxl_display.c | |||
@@ -305,7 +305,9 @@ static const struct drm_crtc_funcs qxl_crtc_funcs = { | |||
305 | void qxl_user_framebuffer_destroy(struct drm_framebuffer *fb) | 305 | void qxl_user_framebuffer_destroy(struct drm_framebuffer *fb) |
306 | { | 306 | { |
307 | struct qxl_framebuffer *qxl_fb = to_qxl_framebuffer(fb); | 307 | struct qxl_framebuffer *qxl_fb = to_qxl_framebuffer(fb); |
308 | struct qxl_bo *bo = gem_to_qxl_bo(qxl_fb->obj); | ||
308 | 309 | ||
310 | WARN_ON(bo->shadow); | ||
309 | drm_gem_object_unreference_unlocked(qxl_fb->obj); | 311 | drm_gem_object_unreference_unlocked(qxl_fb->obj); |
310 | drm_framebuffer_cleanup(fb); | 312 | drm_framebuffer_cleanup(fb); |
311 | kfree(qxl_fb); | 313 | kfree(qxl_fb); |
@@ -508,6 +510,7 @@ static void qxl_primary_atomic_update(struct drm_plane *plane, | |||
508 | .x2 = qfb->base.width, | 510 | .x2 = qfb->base.width, |
509 | .y2 = qfb->base.height | 511 | .y2 = qfb->base.height |
510 | }; | 512 | }; |
513 | bool same_shadow = false; | ||
511 | 514 | ||
512 | if (old_state->fb) { | 515 | if (old_state->fb) { |
513 | qfb_old = to_qxl_framebuffer(old_state->fb); | 516 | qfb_old = to_qxl_framebuffer(old_state->fb); |
@@ -519,15 +522,23 @@ static void qxl_primary_atomic_update(struct drm_plane *plane, | |||
519 | if (bo == bo_old) | 522 | if (bo == bo_old) |
520 | return; | 523 | return; |
521 | 524 | ||
525 | if (bo_old && bo_old->shadow && bo->shadow && | ||
526 | bo_old->shadow == bo->shadow) { | ||
527 | same_shadow = true; | ||
528 | } | ||
529 | |||
522 | if (bo_old && bo_old->is_primary) { | 530 | if (bo_old && bo_old->is_primary) { |
523 | qxl_io_destroy_primary(qdev); | 531 | if (!same_shadow) |
532 | qxl_io_destroy_primary(qdev); | ||
524 | bo_old->is_primary = false; | 533 | bo_old->is_primary = false; |
525 | } | 534 | } |
526 | 535 | ||
527 | if (!bo->is_primary) { | 536 | if (!bo->is_primary) { |
528 | qxl_io_create_primary(qdev, 0, bo); | 537 | if (!same_shadow) |
538 | qxl_io_create_primary(qdev, 0, bo); | ||
529 | bo->is_primary = true; | 539 | bo->is_primary = true; |
530 | } | 540 | } |
541 | |||
531 | qxl_draw_dirty_fb(qdev, qfb, bo, 0, 0, &norect, 1, 1); | 542 | qxl_draw_dirty_fb(qdev, qfb, bo, 0, 0, &norect, 1, 1); |
532 | } | 543 | } |
533 | 544 | ||
@@ -679,8 +690,9 @@ static void qxl_cursor_atomic_disable(struct drm_plane *plane, | |||
679 | static int qxl_plane_prepare_fb(struct drm_plane *plane, | 690 | static int qxl_plane_prepare_fb(struct drm_plane *plane, |
680 | struct drm_plane_state *new_state) | 691 | struct drm_plane_state *new_state) |
681 | { | 692 | { |
693 | struct qxl_device *qdev = plane->dev->dev_private; | ||
682 | struct drm_gem_object *obj; | 694 | struct drm_gem_object *obj; |
683 | struct qxl_bo *user_bo; | 695 | struct qxl_bo *user_bo, *old_bo = NULL; |
684 | int ret; | 696 | int ret; |
685 | 697 | ||
686 | if (!new_state->fb) | 698 | if (!new_state->fb) |
@@ -689,6 +701,32 @@ static int qxl_plane_prepare_fb(struct drm_plane *plane, | |||
689 | obj = to_qxl_framebuffer(new_state->fb)->obj; | 701 | obj = to_qxl_framebuffer(new_state->fb)->obj; |
690 | user_bo = gem_to_qxl_bo(obj); | 702 | user_bo = gem_to_qxl_bo(obj); |
691 | 703 | ||
704 | if (plane->type == DRM_PLANE_TYPE_PRIMARY && | ||
705 | user_bo->is_dumb && !user_bo->shadow) { | ||
706 | if (plane->state->fb) { | ||
707 | obj = to_qxl_framebuffer(plane->state->fb)->obj; | ||
708 | old_bo = gem_to_qxl_bo(obj); | ||
709 | } | ||
710 | if (old_bo && old_bo->shadow && | ||
711 | user_bo->gem_base.size == old_bo->gem_base.size && | ||
712 | plane->state->crtc == new_state->crtc && | ||
713 | plane->state->crtc_w == new_state->crtc_w && | ||
714 | plane->state->crtc_h == new_state->crtc_h && | ||
715 | plane->state->src_x == new_state->src_x && | ||
716 | plane->state->src_y == new_state->src_y && | ||
717 | plane->state->src_w == new_state->src_w && | ||
718 | plane->state->src_h == new_state->src_h && | ||
719 | plane->state->rotation == new_state->rotation && | ||
720 | plane->state->zpos == new_state->zpos) { | ||
721 | drm_gem_object_get(&old_bo->shadow->gem_base); | ||
722 | user_bo->shadow = old_bo->shadow; | ||
723 | } else { | ||
724 | qxl_bo_create(qdev, user_bo->gem_base.size, | ||
725 | true, true, QXL_GEM_DOMAIN_VRAM, NULL, | ||
726 | &user_bo->shadow); | ||
727 | } | ||
728 | } | ||
729 | |||
692 | ret = qxl_bo_pin(user_bo, QXL_GEM_DOMAIN_CPU, NULL); | 730 | ret = qxl_bo_pin(user_bo, QXL_GEM_DOMAIN_CPU, NULL); |
693 | if (ret) | 731 | if (ret) |
694 | return ret; | 732 | return ret; |
@@ -713,6 +751,11 @@ static void qxl_plane_cleanup_fb(struct drm_plane *plane, | |||
713 | obj = to_qxl_framebuffer(old_state->fb)->obj; | 751 | obj = to_qxl_framebuffer(old_state->fb)->obj; |
714 | user_bo = gem_to_qxl_bo(obj); | 752 | user_bo = gem_to_qxl_bo(obj); |
715 | qxl_bo_unpin(user_bo); | 753 | qxl_bo_unpin(user_bo); |
754 | |||
755 | if (user_bo->shadow && !user_bo->is_primary) { | ||
756 | drm_gem_object_put_unlocked(&user_bo->shadow->gem_base); | ||
757 | user_bo->shadow = NULL; | ||
758 | } | ||
716 | } | 759 | } |
717 | 760 | ||
718 | static const uint32_t qxl_cursor_plane_formats[] = { | 761 | static const uint32_t qxl_cursor_plane_formats[] = { |
diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h index 3397a1907336..08752c0ffb35 100644 --- a/drivers/gpu/drm/qxl/qxl_drv.h +++ b/drivers/gpu/drm/qxl/qxl_drv.h | |||
@@ -62,33 +62,9 @@ | |||
62 | 62 | ||
63 | #define QXL_DEBUGFS_MAX_COMPONENTS 32 | 63 | #define QXL_DEBUGFS_MAX_COMPONENTS 32 |
64 | 64 | ||
65 | extern int qxl_log_level; | ||
66 | extern int qxl_num_crtc; | 65 | extern int qxl_num_crtc; |
67 | extern int qxl_max_ioctls; | 66 | extern int qxl_max_ioctls; |
68 | 67 | ||
69 | enum { | ||
70 | QXL_INFO_LEVEL = 1, | ||
71 | QXL_DEBUG_LEVEL = 2, | ||
72 | }; | ||
73 | |||
74 | #define QXL_INFO(qdev, fmt, ...) do { \ | ||
75 | if (qxl_log_level >= QXL_INFO_LEVEL) { \ | ||
76 | qxl_io_log(qdev, fmt, __VA_ARGS__); \ | ||
77 | } \ | ||
78 | } while (0) | ||
79 | #define QXL_DEBUG(qdev, fmt, ...) do { \ | ||
80 | if (qxl_log_level >= QXL_DEBUG_LEVEL) { \ | ||
81 | qxl_io_log(qdev, fmt, __VA_ARGS__); \ | ||
82 | } \ | ||
83 | } while (0) | ||
84 | #define QXL_INFO_ONCE(qdev, fmt, ...) do { \ | ||
85 | static int done; \ | ||
86 | if (!done) { \ | ||
87 | done = 1; \ | ||
88 | QXL_INFO(qdev, fmt, __VA_ARGS__); \ | ||
89 | } \ | ||
90 | } while (0) | ||
91 | |||
92 | #define DRM_FILE_OFFSET 0x100000000ULL | 68 | #define DRM_FILE_OFFSET 0x100000000ULL |
93 | #define DRM_FILE_PAGE_OFFSET (DRM_FILE_OFFSET >> PAGE_SHIFT) | 69 | #define DRM_FILE_PAGE_OFFSET (DRM_FILE_OFFSET >> PAGE_SHIFT) |
94 | 70 | ||
@@ -113,6 +89,8 @@ struct qxl_bo { | |||
113 | /* Constant after initialization */ | 89 | /* Constant after initialization */ |
114 | struct drm_gem_object gem_base; | 90 | struct drm_gem_object gem_base; |
115 | bool is_primary; /* is this now a primary surface */ | 91 | bool is_primary; /* is this now a primary surface */ |
92 | bool is_dumb; | ||
93 | struct qxl_bo *shadow; | ||
116 | bool hw_surf_alloc; | 94 | bool hw_surf_alloc; |
117 | struct qxl_surface surf; | 95 | struct qxl_surface surf; |
118 | uint32_t surface_id; | 96 | uint32_t surface_id; |
@@ -351,7 +329,7 @@ int qxl_check_idle(struct qxl_ring *ring); | |||
351 | static inline void * | 329 | static inline void * |
352 | qxl_fb_virtual_address(struct qxl_device *qdev, unsigned long physical) | 330 | qxl_fb_virtual_address(struct qxl_device *qdev, unsigned long physical) |
353 | { | 331 | { |
354 | QXL_INFO(qdev, "not implemented (%lu)\n", physical); | 332 | DRM_DEBUG_DRIVER("not implemented (%lu)\n", physical); |
355 | return 0; | 333 | return 0; |
356 | } | 334 | } |
357 | 335 | ||
diff --git a/drivers/gpu/drm/qxl/qxl_dumb.c b/drivers/gpu/drm/qxl/qxl_dumb.c index 5e65d5d2d937..11085ab01374 100644 --- a/drivers/gpu/drm/qxl/qxl_dumb.c +++ b/drivers/gpu/drm/qxl/qxl_dumb.c | |||
@@ -63,6 +63,7 @@ int qxl_mode_dumb_create(struct drm_file *file_priv, | |||
63 | &handle); | 63 | &handle); |
64 | if (r) | 64 | if (r) |
65 | return r; | 65 | return r; |
66 | qobj->is_dumb = true; | ||
66 | args->pitch = pitch; | 67 | args->pitch = pitch; |
67 | args->handle = handle; | 68 | args->handle = handle; |
68 | return 0; | 69 | return 0; |
diff --git a/drivers/gpu/drm/qxl/qxl_fb.c b/drivers/gpu/drm/qxl/qxl_fb.c index 844c4a31ca13..23af3e352673 100644 --- a/drivers/gpu/drm/qxl/qxl_fb.c +++ b/drivers/gpu/drm/qxl/qxl_fb.c | |||
@@ -240,18 +240,15 @@ static int qxlfb_create(struct qxl_fbdev *qfbdev, | |||
240 | return ret; | 240 | return ret; |
241 | 241 | ||
242 | qbo = gem_to_qxl_bo(gobj); | 242 | qbo = gem_to_qxl_bo(gobj); |
243 | QXL_INFO(qdev, "%s: %dx%d %d\n", __func__, mode_cmd.width, | 243 | DRM_DEBUG_DRIVER("%dx%d %d\n", mode_cmd.width, |
244 | mode_cmd.height, mode_cmd.pitches[0]); | 244 | mode_cmd.height, mode_cmd.pitches[0]); |
245 | 245 | ||
246 | shadow = vmalloc(mode_cmd.pitches[0] * mode_cmd.height); | 246 | shadow = vmalloc(mode_cmd.pitches[0] * mode_cmd.height); |
247 | /* TODO: what's the usual response to memory allocation errors? */ | 247 | /* TODO: what's the usual response to memory allocation errors? */ |
248 | BUG_ON(!shadow); | 248 | BUG_ON(!shadow); |
249 | QXL_INFO(qdev, | 249 | DRM_DEBUG_DRIVER("surface0 at gpu offset %lld, mmap_offset %lld (virt %p, shadow %p)\n", |
250 | "surface0 at gpu offset %lld, mmap_offset %lld (virt %p, shadow %p)\n", | 250 | qxl_bo_gpu_offset(qbo), qxl_bo_mmap_offset(qbo), |
251 | qxl_bo_gpu_offset(qbo), | 251 | qbo->kptr, shadow); |
252 | qxl_bo_mmap_offset(qbo), | ||
253 | qbo->kptr, | ||
254 | shadow); | ||
255 | size = mode_cmd.pitches[0] * mode_cmd.height; | 252 | size = mode_cmd.pitches[0] * mode_cmd.height; |
256 | 253 | ||
257 | info = drm_fb_helper_alloc_fbi(&qfbdev->helper); | 254 | info = drm_fb_helper_alloc_fbi(&qfbdev->helper); |
diff --git a/drivers/gpu/drm/qxl/qxl_release.c b/drivers/gpu/drm/qxl/qxl_release.c index e6ec845b5be0..a6da6fa6ad58 100644 --- a/drivers/gpu/drm/qxl/qxl_release.c +++ b/drivers/gpu/drm/qxl/qxl_release.c | |||
@@ -154,7 +154,7 @@ qxl_release_alloc(struct qxl_device *qdev, int type, | |||
154 | return handle; | 154 | return handle; |
155 | } | 155 | } |
156 | *ret = release; | 156 | *ret = release; |
157 | QXL_INFO(qdev, "allocated release %d\n", handle); | 157 | DRM_DEBUG_DRIVER("allocated release %d\n", handle); |
158 | release->id = handle; | 158 | release->id = handle; |
159 | return handle; | 159 | return handle; |
160 | } | 160 | } |
@@ -179,8 +179,7 @@ void | |||
179 | qxl_release_free(struct qxl_device *qdev, | 179 | qxl_release_free(struct qxl_device *qdev, |
180 | struct qxl_release *release) | 180 | struct qxl_release *release) |
181 | { | 181 | { |
182 | QXL_INFO(qdev, "release %d, type %d\n", release->id, | 182 | DRM_DEBUG_DRIVER("release %d, type %d\n", release->id, release->type); |
183 | release->type); | ||
184 | 183 | ||
185 | if (release->surface_release_id) | 184 | if (release->surface_release_id) |
186 | qxl_surface_id_dealloc(qdev, release->surface_release_id); | 185 | qxl_surface_id_dealloc(qdev, release->surface_release_id); |
diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c index 7ecf8a4b9fe6..ab4823875311 100644 --- a/drivers/gpu/drm/qxl/qxl_ttm.c +++ b/drivers/gpu/drm/qxl/qxl_ttm.c | |||
@@ -136,8 +136,8 @@ int qxl_mmap(struct file *filp, struct vm_area_struct *vma) | |||
136 | "filp->private_data->minor->dev->dev_private == NULL\n"); | 136 | "filp->private_data->minor->dev->dev_private == NULL\n"); |
137 | return -EINVAL; | 137 | return -EINVAL; |
138 | } | 138 | } |
139 | QXL_INFO(qdev, "%s: filp->private_data = 0x%p, vma->vm_pgoff = %lx\n", | 139 | DRM_DEBUG_DRIVER("filp->private_data = 0x%p, vma->vm_pgoff = %lx\n", |
140 | __func__, filp->private_data, vma->vm_pgoff); | 140 | filp->private_data, vma->vm_pgoff); |
141 | 141 | ||
142 | r = ttm_bo_mmap(filp, vma, &qdev->mman.bdev); | 142 | r = ttm_bo_mmap(filp, vma, &qdev->mman.bdev); |
143 | if (unlikely(r != 0)) | 143 | if (unlikely(r != 0)) |
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c index 2fcf805d3a16..33b821d6d018 100644 --- a/drivers/gpu/drm/radeon/radeon_fb.c +++ b/drivers/gpu/drm/radeon/radeon_fb.c | |||
@@ -245,7 +245,6 @@ static int radeonfb_create(struct drm_fb_helper *helper, | |||
245 | } | 245 | } |
246 | 246 | ||
247 | info->par = rfbdev; | 247 | info->par = rfbdev; |
248 | info->skip_vt_switch = true; | ||
249 | 248 | ||
250 | ret = radeon_framebuffer_init(rdev->ddev, &rfbdev->rfb, &mode_cmd, gobj); | 249 | ret = radeon_framebuffer_init(rdev->ddev, &rfbdev->rfb, &mode_cmd, gobj); |
251 | if (ret) { | 250 | if (ret) { |
diff --git a/drivers/gpu/drm/rockchip/Kconfig b/drivers/gpu/drm/rockchip/Kconfig index 3c70c6224bd2..0ccc76217ee4 100644 --- a/drivers/gpu/drm/rockchip/Kconfig +++ b/drivers/gpu/drm/rockchip/Kconfig | |||
@@ -60,7 +60,7 @@ config ROCKCHIP_INNO_HDMI | |||
60 | config ROCKCHIP_LVDS | 60 | config ROCKCHIP_LVDS |
61 | bool "Rockchip LVDS support" | 61 | bool "Rockchip LVDS support" |
62 | depends on DRM_ROCKCHIP | 62 | depends on DRM_ROCKCHIP |
63 | depends on PINCTRL | 63 | depends on PINCTRL && OF |
64 | help | 64 | help |
65 | Choose this option to enable support for Rockchip LVDS controllers. | 65 | Choose this option to enable support for Rockchip LVDS controllers. |
66 | Rockchip rk3288 SoC has LVDS TX Controller can be used, and it | 66 | Rockchip rk3288 SoC has LVDS TX Controller can be used, and it |
diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c index 4d3f6ad0abdd..93b7102dd008 100644 --- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c | |||
@@ -72,7 +72,7 @@ struct rockchip_dp_device { | |||
72 | struct reset_control *rst; | 72 | struct reset_control *rst; |
73 | 73 | ||
74 | struct work_struct psr_work; | 74 | struct work_struct psr_work; |
75 | spinlock_t psr_lock; | 75 | struct mutex psr_lock; |
76 | unsigned int psr_state; | 76 | unsigned int psr_state; |
77 | 77 | ||
78 | const struct rockchip_dp_chip_data *data; | 78 | const struct rockchip_dp_chip_data *data; |
@@ -83,21 +83,20 @@ struct rockchip_dp_device { | |||
83 | static void analogix_dp_psr_set(struct drm_encoder *encoder, bool enabled) | 83 | static void analogix_dp_psr_set(struct drm_encoder *encoder, bool enabled) |
84 | { | 84 | { |
85 | struct rockchip_dp_device *dp = to_dp(encoder); | 85 | struct rockchip_dp_device *dp = to_dp(encoder); |
86 | unsigned long flags; | ||
87 | 86 | ||
88 | if (!analogix_dp_psr_supported(dp->dev)) | 87 | if (!analogix_dp_psr_supported(dp->dev)) |
89 | return; | 88 | return; |
90 | 89 | ||
91 | DRM_DEV_DEBUG(dp->dev, "%s PSR...\n", enabled ? "Entry" : "Exit"); | 90 | DRM_DEV_DEBUG(dp->dev, "%s PSR...\n", enabled ? "Entry" : "Exit"); |
92 | 91 | ||
93 | spin_lock_irqsave(&dp->psr_lock, flags); | 92 | mutex_lock(&dp->psr_lock); |
94 | if (enabled) | 93 | if (enabled) |
95 | dp->psr_state = EDP_VSC_PSR_STATE_ACTIVE; | 94 | dp->psr_state = EDP_VSC_PSR_STATE_ACTIVE; |
96 | else | 95 | else |
97 | dp->psr_state = ~EDP_VSC_PSR_STATE_ACTIVE; | 96 | dp->psr_state = ~EDP_VSC_PSR_STATE_ACTIVE; |
98 | 97 | ||
99 | schedule_work(&dp->psr_work); | 98 | schedule_work(&dp->psr_work); |
100 | spin_unlock_irqrestore(&dp->psr_lock, flags); | 99 | mutex_unlock(&dp->psr_lock); |
101 | } | 100 | } |
102 | 101 | ||
103 | static void analogix_dp_psr_work(struct work_struct *work) | 102 | static void analogix_dp_psr_work(struct work_struct *work) |
@@ -105,7 +104,6 @@ static void analogix_dp_psr_work(struct work_struct *work) | |||
105 | struct rockchip_dp_device *dp = | 104 | struct rockchip_dp_device *dp = |
106 | container_of(work, typeof(*dp), psr_work); | 105 | container_of(work, typeof(*dp), psr_work); |
107 | int ret; | 106 | int ret; |
108 | unsigned long flags; | ||
109 | 107 | ||
110 | ret = rockchip_drm_wait_vact_end(dp->encoder.crtc, | 108 | ret = rockchip_drm_wait_vact_end(dp->encoder.crtc, |
111 | PSR_WAIT_LINE_FLAG_TIMEOUT_MS); | 109 | PSR_WAIT_LINE_FLAG_TIMEOUT_MS); |
@@ -114,12 +112,12 @@ static void analogix_dp_psr_work(struct work_struct *work) | |||
114 | return; | 112 | return; |
115 | } | 113 | } |
116 | 114 | ||
117 | spin_lock_irqsave(&dp->psr_lock, flags); | 115 | mutex_lock(&dp->psr_lock); |
118 | if (dp->psr_state == EDP_VSC_PSR_STATE_ACTIVE) | 116 | if (dp->psr_state == EDP_VSC_PSR_STATE_ACTIVE) |
119 | analogix_dp_enable_psr(dp->dev); | 117 | analogix_dp_enable_psr(dp->dev); |
120 | else | 118 | else |
121 | analogix_dp_disable_psr(dp->dev); | 119 | analogix_dp_disable_psr(dp->dev); |
122 | spin_unlock_irqrestore(&dp->psr_lock, flags); | 120 | mutex_unlock(&dp->psr_lock); |
123 | } | 121 | } |
124 | 122 | ||
125 | static int rockchip_dp_pre_init(struct rockchip_dp_device *dp) | 123 | static int rockchip_dp_pre_init(struct rockchip_dp_device *dp) |
@@ -381,7 +379,7 @@ static int rockchip_dp_bind(struct device *dev, struct device *master, | |||
381 | dp->plat_data.power_off = rockchip_dp_powerdown; | 379 | dp->plat_data.power_off = rockchip_dp_powerdown; |
382 | dp->plat_data.get_modes = rockchip_dp_get_modes; | 380 | dp->plat_data.get_modes = rockchip_dp_get_modes; |
383 | 381 | ||
384 | spin_lock_init(&dp->psr_lock); | 382 | mutex_init(&dp->psr_lock); |
385 | dp->psr_state = ~EDP_VSC_PSR_STATE_ACTIVE; | 383 | dp->psr_state = ~EDP_VSC_PSR_STATE_ACTIVE; |
386 | INIT_WORK(&dp->psr_work, analogix_dp_psr_work); | 384 | INIT_WORK(&dp->psr_work, analogix_dp_psr_work); |
387 | 385 | ||
diff --git a/drivers/gpu/drm/tegra/sor.c b/drivers/gpu/drm/tegra/sor.c index 4bcacd3f4861..b0a1dedac802 100644 --- a/drivers/gpu/drm/tegra/sor.c +++ b/drivers/gpu/drm/tegra/sor.c | |||
@@ -174,9 +174,9 @@ struct tegra_sor { | |||
174 | 174 | ||
175 | struct reset_control *rst; | 175 | struct reset_control *rst; |
176 | struct clk *clk_parent; | 176 | struct clk *clk_parent; |
177 | struct clk *clk_brick; | ||
178 | struct clk *clk_safe; | 177 | struct clk *clk_safe; |
179 | struct clk *clk_src; | 178 | struct clk *clk_out; |
179 | struct clk *clk_pad; | ||
180 | struct clk *clk_dp; | 180 | struct clk *clk_dp; |
181 | struct clk *clk; | 181 | struct clk *clk; |
182 | 182 | ||
@@ -255,7 +255,7 @@ static int tegra_sor_set_parent_clock(struct tegra_sor *sor, struct clk *parent) | |||
255 | 255 | ||
256 | clk_disable_unprepare(sor->clk); | 256 | clk_disable_unprepare(sor->clk); |
257 | 257 | ||
258 | err = clk_set_parent(sor->clk, parent); | 258 | err = clk_set_parent(sor->clk_out, parent); |
259 | if (err < 0) | 259 | if (err < 0) |
260 | return err; | 260 | return err; |
261 | 261 | ||
@@ -266,24 +266,24 @@ static int tegra_sor_set_parent_clock(struct tegra_sor *sor, struct clk *parent) | |||
266 | return 0; | 266 | return 0; |
267 | } | 267 | } |
268 | 268 | ||
269 | struct tegra_clk_sor_brick { | 269 | struct tegra_clk_sor_pad { |
270 | struct clk_hw hw; | 270 | struct clk_hw hw; |
271 | struct tegra_sor *sor; | 271 | struct tegra_sor *sor; |
272 | }; | 272 | }; |
273 | 273 | ||
274 | static inline struct tegra_clk_sor_brick *to_brick(struct clk_hw *hw) | 274 | static inline struct tegra_clk_sor_pad *to_pad(struct clk_hw *hw) |
275 | { | 275 | { |
276 | return container_of(hw, struct tegra_clk_sor_brick, hw); | 276 | return container_of(hw, struct tegra_clk_sor_pad, hw); |
277 | } | 277 | } |
278 | 278 | ||
279 | static const char * const tegra_clk_sor_brick_parents[] = { | 279 | static const char * const tegra_clk_sor_pad_parents[] = { |
280 | "pll_d2_out0", "pll_dp" | 280 | "pll_d2_out0", "pll_dp" |
281 | }; | 281 | }; |
282 | 282 | ||
283 | static int tegra_clk_sor_brick_set_parent(struct clk_hw *hw, u8 index) | 283 | static int tegra_clk_sor_pad_set_parent(struct clk_hw *hw, u8 index) |
284 | { | 284 | { |
285 | struct tegra_clk_sor_brick *brick = to_brick(hw); | 285 | struct tegra_clk_sor_pad *pad = to_pad(hw); |
286 | struct tegra_sor *sor = brick->sor; | 286 | struct tegra_sor *sor = pad->sor; |
287 | u32 value; | 287 | u32 value; |
288 | 288 | ||
289 | value = tegra_sor_readl(sor, SOR_CLK_CNTRL); | 289 | value = tegra_sor_readl(sor, SOR_CLK_CNTRL); |
@@ -304,10 +304,10 @@ static int tegra_clk_sor_brick_set_parent(struct clk_hw *hw, u8 index) | |||
304 | return 0; | 304 | return 0; |
305 | } | 305 | } |
306 | 306 | ||
307 | static u8 tegra_clk_sor_brick_get_parent(struct clk_hw *hw) | 307 | static u8 tegra_clk_sor_pad_get_parent(struct clk_hw *hw) |
308 | { | 308 | { |
309 | struct tegra_clk_sor_brick *brick = to_brick(hw); | 309 | struct tegra_clk_sor_pad *pad = to_pad(hw); |
310 | struct tegra_sor *sor = brick->sor; | 310 | struct tegra_sor *sor = pad->sor; |
311 | u8 parent = U8_MAX; | 311 | u8 parent = U8_MAX; |
312 | u32 value; | 312 | u32 value; |
313 | 313 | ||
@@ -328,33 +328,33 @@ static u8 tegra_clk_sor_brick_get_parent(struct clk_hw *hw) | |||
328 | return parent; | 328 | return parent; |
329 | } | 329 | } |
330 | 330 | ||
331 | static const struct clk_ops tegra_clk_sor_brick_ops = { | 331 | static const struct clk_ops tegra_clk_sor_pad_ops = { |
332 | .set_parent = tegra_clk_sor_brick_set_parent, | 332 | .set_parent = tegra_clk_sor_pad_set_parent, |
333 | .get_parent = tegra_clk_sor_brick_get_parent, | 333 | .get_parent = tegra_clk_sor_pad_get_parent, |
334 | }; | 334 | }; |
335 | 335 | ||
336 | static struct clk *tegra_clk_sor_brick_register(struct tegra_sor *sor, | 336 | static struct clk *tegra_clk_sor_pad_register(struct tegra_sor *sor, |
337 | const char *name) | 337 | const char *name) |
338 | { | 338 | { |
339 | struct tegra_clk_sor_brick *brick; | 339 | struct tegra_clk_sor_pad *pad; |
340 | struct clk_init_data init; | 340 | struct clk_init_data init; |
341 | struct clk *clk; | 341 | struct clk *clk; |
342 | 342 | ||
343 | brick = devm_kzalloc(sor->dev, sizeof(*brick), GFP_KERNEL); | 343 | pad = devm_kzalloc(sor->dev, sizeof(*pad), GFP_KERNEL); |
344 | if (!brick) | 344 | if (!pad) |
345 | return ERR_PTR(-ENOMEM); | 345 | return ERR_PTR(-ENOMEM); |
346 | 346 | ||
347 | brick->sor = sor; | 347 | pad->sor = sor; |
348 | 348 | ||
349 | init.name = name; | 349 | init.name = name; |
350 | init.flags = 0; | 350 | init.flags = 0; |
351 | init.parent_names = tegra_clk_sor_brick_parents; | 351 | init.parent_names = tegra_clk_sor_pad_parents; |
352 | init.num_parents = ARRAY_SIZE(tegra_clk_sor_brick_parents); | 352 | init.num_parents = ARRAY_SIZE(tegra_clk_sor_pad_parents); |
353 | init.ops = &tegra_clk_sor_brick_ops; | 353 | init.ops = &tegra_clk_sor_pad_ops; |
354 | 354 | ||
355 | brick->hw.init = &init; | 355 | pad->hw.init = &init; |
356 | 356 | ||
357 | clk = devm_clk_register(sor->dev, &brick->hw); | 357 | clk = devm_clk_register(sor->dev, &pad->hw); |
358 | 358 | ||
359 | return clk; | 359 | return clk; |
360 | } | 360 | } |
@@ -998,8 +998,10 @@ static int tegra_sor_power_down(struct tegra_sor *sor) | |||
998 | 998 | ||
999 | /* switch to safe parent clock */ | 999 | /* switch to safe parent clock */ |
1000 | err = tegra_sor_set_parent_clock(sor, sor->clk_safe); | 1000 | err = tegra_sor_set_parent_clock(sor, sor->clk_safe); |
1001 | if (err < 0) | 1001 | if (err < 0) { |
1002 | dev_err(sor->dev, "failed to set safe parent clock: %d\n", err); | 1002 | dev_err(sor->dev, "failed to set safe parent clock: %d\n", err); |
1003 | return err; | ||
1004 | } | ||
1003 | 1005 | ||
1004 | value = tegra_sor_readl(sor, SOR_DP_PADCTL0); | 1006 | value = tegra_sor_readl(sor, SOR_DP_PADCTL0); |
1005 | value &= ~(SOR_DP_PADCTL_PD_TXD_3 | SOR_DP_PADCTL_PD_TXD_0 | | 1007 | value &= ~(SOR_DP_PADCTL_PD_TXD_3 | SOR_DP_PADCTL_PD_TXD_0 | |
@@ -2007,8 +2009,10 @@ static void tegra_sor_hdmi_enable(struct drm_encoder *encoder) | |||
2007 | 2009 | ||
2008 | /* switch to safe parent clock */ | 2010 | /* switch to safe parent clock */ |
2009 | err = tegra_sor_set_parent_clock(sor, sor->clk_safe); | 2011 | err = tegra_sor_set_parent_clock(sor, sor->clk_safe); |
2010 | if (err < 0) | 2012 | if (err < 0) { |
2011 | dev_err(sor->dev, "failed to set safe parent clock: %d\n", err); | 2013 | dev_err(sor->dev, "failed to set safe parent clock: %d\n", err); |
2014 | return; | ||
2015 | } | ||
2012 | 2016 | ||
2013 | div = clk_get_rate(sor->clk) / 1000000 * 4; | 2017 | div = clk_get_rate(sor->clk) / 1000000 * 4; |
2014 | 2018 | ||
@@ -2111,13 +2115,17 @@ static void tegra_sor_hdmi_enable(struct drm_encoder *encoder) | |||
2111 | tegra_sor_writel(sor, value, SOR_XBAR_CTRL); | 2115 | tegra_sor_writel(sor, value, SOR_XBAR_CTRL); |
2112 | 2116 | ||
2113 | /* switch to parent clock */ | 2117 | /* switch to parent clock */ |
2114 | err = clk_set_parent(sor->clk_src, sor->clk_parent); | 2118 | err = clk_set_parent(sor->clk, sor->clk_parent); |
2115 | if (err < 0) | 2119 | if (err < 0) { |
2116 | dev_err(sor->dev, "failed to set source clock: %d\n", err); | ||
2117 | |||
2118 | err = tegra_sor_set_parent_clock(sor, sor->clk_src); | ||
2119 | if (err < 0) | ||
2120 | dev_err(sor->dev, "failed to set parent clock: %d\n", err); | 2120 | dev_err(sor->dev, "failed to set parent clock: %d\n", err); |
2121 | return; | ||
2122 | } | ||
2123 | |||
2124 | err = tegra_sor_set_parent_clock(sor, sor->clk_pad); | ||
2125 | if (err < 0) { | ||
2126 | dev_err(sor->dev, "failed to set pad clock: %d\n", err); | ||
2127 | return; | ||
2128 | } | ||
2121 | 2129 | ||
2122 | value = SOR_INPUT_CONTROL_HDMI_SRC_SELECT(dc->pipe); | 2130 | value = SOR_INPUT_CONTROL_HDMI_SRC_SELECT(dc->pipe); |
2123 | 2131 | ||
@@ -2628,11 +2636,24 @@ static int tegra_sor_probe(struct platform_device *pdev) | |||
2628 | } | 2636 | } |
2629 | 2637 | ||
2630 | if (sor->soc->supports_hdmi || sor->soc->supports_dp) { | 2638 | if (sor->soc->supports_hdmi || sor->soc->supports_dp) { |
2631 | sor->clk_src = devm_clk_get(&pdev->dev, "source"); | 2639 | struct device_node *np = pdev->dev.of_node; |
2632 | if (IS_ERR(sor->clk_src)) { | 2640 | const char *name; |
2633 | err = PTR_ERR(sor->clk_src); | 2641 | |
2634 | dev_err(sor->dev, "failed to get source clock: %d\n", | 2642 | /* |
2635 | err); | 2643 | * For backwards compatibility with Tegra210 device trees, |
2644 | * fall back to the old clock name "source" if the new "out" | ||
2645 | * clock is not available. | ||
2646 | */ | ||
2647 | if (of_property_match_string(np, "clock-names", "out") < 0) | ||
2648 | name = "source"; | ||
2649 | else | ||
2650 | name = "out"; | ||
2651 | |||
2652 | sor->clk_out = devm_clk_get(&pdev->dev, name); | ||
2653 | if (IS_ERR(sor->clk_out)) { | ||
2654 | err = PTR_ERR(sor->clk_out); | ||
2655 | dev_err(sor->dev, "failed to get %s clock: %d\n", | ||
2656 | name, err); | ||
2636 | goto remove; | 2657 | goto remove; |
2637 | } | 2658 | } |
2638 | } | 2659 | } |
@@ -2658,16 +2679,60 @@ static int tegra_sor_probe(struct platform_device *pdev) | |||
2658 | goto remove; | 2679 | goto remove; |
2659 | } | 2680 | } |
2660 | 2681 | ||
2682 | /* | ||
2683 | * Starting with Tegra186, the BPMP provides an implementation for | ||
2684 | * the pad output clock, so we have to look it up from device tree. | ||
2685 | */ | ||
2686 | sor->clk_pad = devm_clk_get(&pdev->dev, "pad"); | ||
2687 | if (IS_ERR(sor->clk_pad)) { | ||
2688 | if (sor->clk_pad != ERR_PTR(-ENOENT)) { | ||
2689 | err = PTR_ERR(sor->clk_pad); | ||
2690 | goto remove; | ||
2691 | } | ||
2692 | |||
2693 | /* | ||
2694 | * If the pad output clock is not available, then we assume | ||
2695 | * we're on Tegra210 or earlier and have to provide our own | ||
2696 | * implementation. | ||
2697 | */ | ||
2698 | sor->clk_pad = NULL; | ||
2699 | } | ||
2700 | |||
2701 | /* | ||
2702 | * The bootloader may have set up the SOR such that it's module clock | ||
2703 | * is sourced by one of the display PLLs. However, that doesn't work | ||
2704 | * without properly having set up other bits of the SOR. | ||
2705 | */ | ||
2706 | err = clk_set_parent(sor->clk_out, sor->clk_safe); | ||
2707 | if (err < 0) { | ||
2708 | dev_err(&pdev->dev, "failed to use safe clock: %d\n", err); | ||
2709 | goto remove; | ||
2710 | } | ||
2711 | |||
2661 | platform_set_drvdata(pdev, sor); | 2712 | platform_set_drvdata(pdev, sor); |
2662 | pm_runtime_enable(&pdev->dev); | 2713 | pm_runtime_enable(&pdev->dev); |
2663 | 2714 | ||
2664 | pm_runtime_get_sync(&pdev->dev); | 2715 | /* |
2665 | sor->clk_brick = tegra_clk_sor_brick_register(sor, "sor1_brick"); | 2716 | * On Tegra210 and earlier, provide our own implementation for the |
2666 | pm_runtime_put(&pdev->dev); | 2717 | * pad output clock. |
2718 | */ | ||
2719 | if (!sor->clk_pad) { | ||
2720 | err = pm_runtime_get_sync(&pdev->dev); | ||
2721 | if (err < 0) { | ||
2722 | dev_err(&pdev->dev, "failed to get runtime PM: %d\n", | ||
2723 | err); | ||
2724 | goto remove; | ||
2725 | } | ||
2726 | |||
2727 | sor->clk_pad = tegra_clk_sor_pad_register(sor, | ||
2728 | "sor1_pad_clkout"); | ||
2729 | pm_runtime_put(&pdev->dev); | ||
2730 | } | ||
2667 | 2731 | ||
2668 | if (IS_ERR(sor->clk_brick)) { | 2732 | if (IS_ERR(sor->clk_pad)) { |
2669 | err = PTR_ERR(sor->clk_brick); | 2733 | err = PTR_ERR(sor->clk_pad); |
2670 | dev_err(&pdev->dev, "failed to register SOR clock: %d\n", err); | 2734 | dev_err(&pdev->dev, "failed to register SOR pad clock: %d\n", |
2735 | err); | ||
2671 | goto remove; | 2736 | goto remove; |
2672 | } | 2737 | } |
2673 | 2738 | ||
diff --git a/drivers/gpu/drm/tilcdc/Kconfig b/drivers/gpu/drm/tilcdc/Kconfig index 28fed7e206d0..81ac82455ce4 100644 --- a/drivers/gpu/drm/tilcdc/Kconfig +++ b/drivers/gpu/drm/tilcdc/Kconfig | |||
@@ -12,14 +12,3 @@ config DRM_TILCDC | |||
12 | controller, for example AM33xx in beagle-bone, DA8xx, or | 12 | controller, for example AM33xx in beagle-bone, DA8xx, or |
13 | OMAP-L1xx. This driver replaces the FB_DA8XX fbdev driver. | 13 | OMAP-L1xx. This driver replaces the FB_DA8XX fbdev driver. |
14 | 14 | ||
15 | config DRM_TILCDC_SLAVE_COMPAT | ||
16 | bool "Support device tree blobs using TI LCDC Slave binding" | ||
17 | depends on DRM_TILCDC | ||
18 | default y | ||
19 | select OF_RESOLVE | ||
20 | select OF_OVERLAY | ||
21 | help | ||
22 | Choose this option if you need a kernel that is compatible | ||
23 | with device tree blobs using the obsolete "ti,tilcdc,slave" | ||
24 | binding. If you find "ti,tilcdc,slave"-string from your DTB, | ||
25 | you probably need this. Otherwise you do not. | ||
diff --git a/drivers/gpu/drm/tilcdc/Makefile b/drivers/gpu/drm/tilcdc/Makefile index 55ebd516728f..efc2c4f00daa 100644 --- a/drivers/gpu/drm/tilcdc/Makefile +++ b/drivers/gpu/drm/tilcdc/Makefile | |||
@@ -2,9 +2,6 @@ ifeq (, $(findstring -W,$(EXTRA_CFLAGS))) | |||
2 | ccflags-y += -Werror | 2 | ccflags-y += -Werror |
3 | endif | 3 | endif |
4 | 4 | ||
5 | obj-$(CONFIG_DRM_TILCDC_SLAVE_COMPAT) += tilcdc_slave_compat.o \ | ||
6 | tilcdc_slave_compat.dtb.o | ||
7 | |||
8 | tilcdc-y := \ | 5 | tilcdc-y := \ |
9 | tilcdc_plane.o \ | 6 | tilcdc_plane.o \ |
10 | tilcdc_crtc.o \ | 7 | tilcdc_crtc.o \ |
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_slave_compat.c b/drivers/gpu/drm/tilcdc/tilcdc_slave_compat.c deleted file mode 100644 index 482299a6f3b0..000000000000 --- a/drivers/gpu/drm/tilcdc/tilcdc_slave_compat.c +++ /dev/null | |||
@@ -1,269 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2015 Texas Instruments | ||
3 | * Author: Jyri Sarha <jsarha@ti.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License version 2 as published by | ||
7 | * the Free Software Foundation. | ||
8 | * | ||
9 | */ | ||
10 | |||
11 | /* | ||
12 | * To support the old "ti,tilcdc,slave" binding the binding has to be | ||
13 | * transformed to the new external encoder binding. | ||
14 | */ | ||
15 | |||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/of.h> | ||
18 | #include <linux/of_graph.h> | ||
19 | #include <linux/of_fdt.h> | ||
20 | #include <linux/slab.h> | ||
21 | #include <linux/list.h> | ||
22 | |||
23 | #include "tilcdc_slave_compat.h" | ||
24 | |||
25 | struct kfree_table { | ||
26 | int total; | ||
27 | int num; | ||
28 | void **table; | ||
29 | }; | ||
30 | |||
31 | static int __init kfree_table_init(struct kfree_table *kft) | ||
32 | { | ||
33 | kft->total = 32; | ||
34 | kft->num = 0; | ||
35 | kft->table = kmalloc(kft->total * sizeof(*kft->table), | ||
36 | GFP_KERNEL); | ||
37 | if (!kft->table) | ||
38 | return -ENOMEM; | ||
39 | |||
40 | return 0; | ||
41 | } | ||
42 | |||
43 | static int __init kfree_table_add(struct kfree_table *kft, void *p) | ||
44 | { | ||
45 | if (kft->num == kft->total) { | ||
46 | void **old = kft->table; | ||
47 | |||
48 | kft->total *= 2; | ||
49 | kft->table = krealloc(old, kft->total * sizeof(*kft->table), | ||
50 | GFP_KERNEL); | ||
51 | if (!kft->table) { | ||
52 | kft->table = old; | ||
53 | kfree(p); | ||
54 | return -ENOMEM; | ||
55 | } | ||
56 | } | ||
57 | kft->table[kft->num++] = p; | ||
58 | return 0; | ||
59 | } | ||
60 | |||
61 | static void __init kfree_table_free(struct kfree_table *kft) | ||
62 | { | ||
63 | int i; | ||
64 | |||
65 | for (i = 0; i < kft->num; i++) | ||
66 | kfree(kft->table[i]); | ||
67 | |||
68 | kfree(kft->table); | ||
69 | } | ||
70 | |||
71 | static | ||
72 | struct property * __init tilcdc_prop_dup(const struct property *prop, | ||
73 | struct kfree_table *kft) | ||
74 | { | ||
75 | struct property *nprop; | ||
76 | |||
77 | nprop = kzalloc(sizeof(*nprop), GFP_KERNEL); | ||
78 | if (!nprop || kfree_table_add(kft, nprop)) | ||
79 | return NULL; | ||
80 | |||
81 | nprop->name = kstrdup(prop->name, GFP_KERNEL); | ||
82 | if (!nprop->name || kfree_table_add(kft, nprop->name)) | ||
83 | return NULL; | ||
84 | |||
85 | nprop->value = kmemdup(prop->value, prop->length, GFP_KERNEL); | ||
86 | if (!nprop->value || kfree_table_add(kft, nprop->value)) | ||
87 | return NULL; | ||
88 | |||
89 | nprop->length = prop->length; | ||
90 | |||
91 | return nprop; | ||
92 | } | ||
93 | |||
94 | static void __init tilcdc_copy_props(struct device_node *from, | ||
95 | struct device_node *to, | ||
96 | const char * const props[], | ||
97 | struct kfree_table *kft) | ||
98 | { | ||
99 | struct property *prop; | ||
100 | int i; | ||
101 | |||
102 | for (i = 0; props[i]; i++) { | ||
103 | prop = of_find_property(from, props[i], NULL); | ||
104 | if (!prop) | ||
105 | continue; | ||
106 | |||
107 | prop = tilcdc_prop_dup(prop, kft); | ||
108 | if (!prop) | ||
109 | continue; | ||
110 | |||
111 | prop->next = to->properties; | ||
112 | to->properties = prop; | ||
113 | } | ||
114 | } | ||
115 | |||
116 | static int __init tilcdc_prop_str_update(struct property *prop, | ||
117 | const char *str, | ||
118 | struct kfree_table *kft) | ||
119 | { | ||
120 | prop->value = kstrdup(str, GFP_KERNEL); | ||
121 | if (kfree_table_add(kft, prop->value) || !prop->value) | ||
122 | return -ENOMEM; | ||
123 | prop->length = strlen(str)+1; | ||
124 | return 0; | ||
125 | } | ||
126 | |||
127 | static void __init tilcdc_node_disable(struct device_node *node) | ||
128 | { | ||
129 | struct property *prop; | ||
130 | |||
131 | prop = kzalloc(sizeof(*prop), GFP_KERNEL); | ||
132 | if (!prop) | ||
133 | return; | ||
134 | |||
135 | prop->name = "status"; | ||
136 | prop->value = "disabled"; | ||
137 | prop->length = strlen((char *)prop->value)+1; | ||
138 | |||
139 | of_update_property(node, prop); | ||
140 | } | ||
141 | |||
142 | static struct device_node * __init tilcdc_get_overlay(struct kfree_table *kft) | ||
143 | { | ||
144 | const int size = __dtb_tilcdc_slave_compat_end - | ||
145 | __dtb_tilcdc_slave_compat_begin; | ||
146 | static void *overlay_data; | ||
147 | struct device_node *overlay; | ||
148 | int ret; | ||
149 | |||
150 | if (!size) { | ||
151 | pr_warn("%s: No overlay data\n", __func__); | ||
152 | return NULL; | ||
153 | } | ||
154 | |||
155 | overlay_data = kmemdup(__dtb_tilcdc_slave_compat_begin, | ||
156 | size, GFP_KERNEL); | ||
157 | if (!overlay_data || kfree_table_add(kft, overlay_data)) | ||
158 | return NULL; | ||
159 | |||
160 | of_fdt_unflatten_tree(overlay_data, NULL, &overlay); | ||
161 | if (!overlay) { | ||
162 | pr_warn("%s: Unfattening overlay tree failed\n", __func__); | ||
163 | return NULL; | ||
164 | } | ||
165 | |||
166 | ret = of_resolve_phandles(overlay); | ||
167 | if (ret) { | ||
168 | pr_err("%s: Failed to resolve phandles: %d\n", __func__, ret); | ||
169 | return NULL; | ||
170 | } | ||
171 | |||
172 | return overlay; | ||
173 | } | ||
174 | |||
175 | static const struct of_device_id tilcdc_slave_of_match[] __initconst = { | ||
176 | { .compatible = "ti,tilcdc,slave", }, | ||
177 | {}, | ||
178 | }; | ||
179 | |||
180 | static const struct of_device_id tilcdc_of_match[] __initconst = { | ||
181 | { .compatible = "ti,am33xx-tilcdc", }, | ||
182 | {}, | ||
183 | }; | ||
184 | |||
185 | static const struct of_device_id tilcdc_tda998x_of_match[] __initconst = { | ||
186 | { .compatible = "nxp,tda998x", }, | ||
187 | {}, | ||
188 | }; | ||
189 | |||
190 | static const char * const tilcdc_slave_props[] __initconst = { | ||
191 | "pinctrl-names", | ||
192 | "pinctrl-0", | ||
193 | "pinctrl-1", | ||
194 | NULL | ||
195 | }; | ||
196 | |||
197 | static void __init tilcdc_convert_slave_node(void) | ||
198 | { | ||
199 | struct device_node *slave = NULL, *lcdc = NULL; | ||
200 | struct device_node *i2c = NULL, *fragment = NULL; | ||
201 | struct device_node *overlay, *encoder; | ||
202 | struct property *prop; | ||
203 | /* For all memory needed for the overlay tree. This memory can | ||
204 | be freed after the overlay has been applied. */ | ||
205 | struct kfree_table kft; | ||
206 | int ret; | ||
207 | |||
208 | if (kfree_table_init(&kft)) | ||
209 | return; | ||
210 | |||
211 | lcdc = of_find_matching_node(NULL, tilcdc_of_match); | ||
212 | slave = of_find_matching_node(NULL, tilcdc_slave_of_match); | ||
213 | |||
214 | if (!slave || !of_device_is_available(lcdc)) | ||
215 | goto out; | ||
216 | |||
217 | i2c = of_parse_phandle(slave, "i2c", 0); | ||
218 | if (!i2c) { | ||
219 | pr_err("%s: Can't find i2c node trough phandle\n", __func__); | ||
220 | goto out; | ||
221 | } | ||
222 | |||
223 | overlay = tilcdc_get_overlay(&kft); | ||
224 | if (!overlay) | ||
225 | goto out; | ||
226 | |||
227 | encoder = of_find_matching_node(overlay, tilcdc_tda998x_of_match); | ||
228 | if (!encoder) { | ||
229 | pr_err("%s: Failed to find tda998x node\n", __func__); | ||
230 | goto out; | ||
231 | } | ||
232 | |||
233 | tilcdc_copy_props(slave, encoder, tilcdc_slave_props, &kft); | ||
234 | |||
235 | for_each_child_of_node(overlay, fragment) { | ||
236 | prop = of_find_property(fragment, "target-path", NULL); | ||
237 | if (!prop) | ||
238 | continue; | ||
239 | if (!strncmp("i2c", (char *)prop->value, prop->length)) | ||
240 | if (tilcdc_prop_str_update(prop, i2c->full_name, &kft)) | ||
241 | goto out; | ||
242 | if (!strncmp("lcdc", (char *)prop->value, prop->length)) | ||
243 | if (tilcdc_prop_str_update(prop, lcdc->full_name, &kft)) | ||
244 | goto out; | ||
245 | } | ||
246 | |||
247 | tilcdc_node_disable(slave); | ||
248 | |||
249 | ret = of_overlay_create(overlay); | ||
250 | if (ret) | ||
251 | pr_err("%s: Creating overlay failed: %d\n", __func__, ret); | ||
252 | else | ||
253 | pr_info("%s: ti,tilcdc,slave node successfully converted\n", | ||
254 | __func__); | ||
255 | out: | ||
256 | kfree_table_free(&kft); | ||
257 | of_node_put(i2c); | ||
258 | of_node_put(slave); | ||
259 | of_node_put(lcdc); | ||
260 | of_node_put(fragment); | ||
261 | } | ||
262 | |||
263 | static int __init tilcdc_slave_compat_init(void) | ||
264 | { | ||
265 | tilcdc_convert_slave_node(); | ||
266 | return 0; | ||
267 | } | ||
268 | |||
269 | subsys_initcall(tilcdc_slave_compat_init); | ||
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_slave_compat.dts b/drivers/gpu/drm/tilcdc/tilcdc_slave_compat.dts deleted file mode 100644 index 693f8b0aea2d..000000000000 --- a/drivers/gpu/drm/tilcdc/tilcdc_slave_compat.dts +++ /dev/null | |||
@@ -1,72 +0,0 @@ | |||
1 | /* | ||
2 | * DTS overlay for converting ti,tilcdc,slave binding to new binding. | ||
3 | * | ||
4 | * Copyright (C) 2015 Texas Instruments Inc. | ||
5 | * Author: Jyri Sarha <jsarha@ti.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * version 2 as published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | /* | ||
13 | * target-path property values are simple tags that are replaced with | ||
14 | * correct values in tildcdc_slave_compat.c. Some properties are also | ||
15 | * copied over from the ti,tilcdc,slave node. | ||
16 | */ | ||
17 | |||
18 | /dts-v1/; | ||
19 | / { | ||
20 | fragment@0 { | ||
21 | target-path = "i2c"; | ||
22 | __overlay__ { | ||
23 | #address-cells = <1>; | ||
24 | #size-cells = <0>; | ||
25 | tda19988 { | ||
26 | compatible = "nxp,tda998x"; | ||
27 | reg = <0x70>; | ||
28 | status = "okay"; | ||
29 | |||
30 | port { | ||
31 | hdmi_0: endpoint@0 { | ||
32 | remote-endpoint = <&lcd_0>; | ||
33 | }; | ||
34 | }; | ||
35 | }; | ||
36 | }; | ||
37 | }; | ||
38 | |||
39 | fragment@1 { | ||
40 | target-path = "lcdc"; | ||
41 | __overlay__ { | ||
42 | port { | ||
43 | lcd_0: endpoint@0 { | ||
44 | remote-endpoint = <&hdmi_0>; | ||
45 | }; | ||
46 | }; | ||
47 | }; | ||
48 | }; | ||
49 | |||
50 | __local_fixups__ { | ||
51 | fragment@0 { | ||
52 | __overlay__ { | ||
53 | tda19988 { | ||
54 | port { | ||
55 | endpoint@0 { | ||
56 | remote-endpoint = <0>; | ||
57 | }; | ||
58 | }; | ||
59 | }; | ||
60 | }; | ||
61 | }; | ||
62 | fragment@1 { | ||
63 | __overlay__ { | ||
64 | port { | ||
65 | endpoint@0 { | ||
66 | remote-endpoint = <0>; | ||
67 | }; | ||
68 | }; | ||
69 | }; | ||
70 | }; | ||
71 | }; | ||
72 | }; | ||
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_slave_compat.h b/drivers/gpu/drm/tilcdc/tilcdc_slave_compat.h deleted file mode 100644 index 403d35d87d0b..000000000000 --- a/drivers/gpu/drm/tilcdc/tilcdc_slave_compat.h +++ /dev/null | |||
@@ -1,25 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2015 Texas Instruments | ||
3 | * Author: Jyri Sarha <jsarha@ti.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License version 2 as published by | ||
7 | * the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
12 | * more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License along with | ||
15 | * this program. If not, see <http://www.gnu.org/licenses/>. | ||
16 | */ | ||
17 | /* This header declares the symbols defined in tilcdc_slave_compat.dts */ | ||
18 | |||
19 | #ifndef __TILCDC_SLAVE_COMPAT_H__ | ||
20 | #define __TILCDC_SLAVE_COMPAT_H__ | ||
21 | |||
22 | extern uint8_t __dtb_tilcdc_slave_compat_begin[]; | ||
23 | extern uint8_t __dtb_tilcdc_slave_compat_end[]; | ||
24 | |||
25 | #endif /* __TILCDC_SLAVE_COMPAT_H__ */ | ||
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c index 316f831ad5f0..b0551aa677b8 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c | |||
@@ -744,12 +744,14 @@ static void ttm_put_pages(struct page **pages, unsigned npages, int flags, | |||
744 | } | 744 | } |
745 | 745 | ||
746 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | 746 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
747 | for (j = 0; j < HPAGE_PMD_NR; ++j) | 747 | if (!(flags & TTM_PAGE_FLAG_DMA32)) { |
748 | if (p++ != pages[i + j]) | 748 | for (j = 0; j < HPAGE_PMD_NR; ++j) |
749 | break; | 749 | if (p++ != pages[i + j]) |
750 | break; | ||
750 | 751 | ||
751 | if (j == HPAGE_PMD_NR) | 752 | if (j == HPAGE_PMD_NR) |
752 | order = HPAGE_PMD_ORDER; | 753 | order = HPAGE_PMD_ORDER; |
754 | } | ||
753 | #endif | 755 | #endif |
754 | 756 | ||
755 | if (page_count(pages[i]) != 1) | 757 | if (page_count(pages[i]) != 1) |
@@ -865,20 +867,22 @@ static int ttm_get_pages(struct page **pages, unsigned npages, int flags, | |||
865 | 867 | ||
866 | i = 0; | 868 | i = 0; |
867 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | 869 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
868 | while (npages >= HPAGE_PMD_NR) { | 870 | if (!(gfp_flags & GFP_DMA32)) { |
869 | gfp_t huge_flags = gfp_flags; | 871 | while (npages >= HPAGE_PMD_NR) { |
872 | gfp_t huge_flags = gfp_flags; | ||
870 | 873 | ||
871 | huge_flags |= GFP_TRANSHUGE; | 874 | huge_flags |= GFP_TRANSHUGE; |
872 | huge_flags &= ~__GFP_MOVABLE; | 875 | huge_flags &= ~__GFP_MOVABLE; |
873 | huge_flags &= ~__GFP_COMP; | 876 | huge_flags &= ~__GFP_COMP; |
874 | p = alloc_pages(huge_flags, HPAGE_PMD_ORDER); | 877 | p = alloc_pages(huge_flags, HPAGE_PMD_ORDER); |
875 | if (!p) | 878 | if (!p) |
876 | break; | 879 | break; |
877 | 880 | ||
878 | for (j = 0; j < HPAGE_PMD_NR; ++j) | 881 | for (j = 0; j < HPAGE_PMD_NR; ++j) |
879 | pages[i++] = p++; | 882 | pages[i++] = p++; |
880 | 883 | ||
881 | npages -= HPAGE_PMD_NR; | 884 | npages -= HPAGE_PMD_NR; |
885 | } | ||
882 | } | 886 | } |
883 | #endif | 887 | #endif |
884 | 888 | ||
diff --git a/drivers/gpu/drm/vc4/vc4_bo.c b/drivers/gpu/drm/vc4/vc4_bo.c index 01a53ba304f8..98a6cb9f44fc 100644 --- a/drivers/gpu/drm/vc4/vc4_bo.c +++ b/drivers/gpu/drm/vc4/vc4_bo.c | |||
@@ -88,11 +88,11 @@ int vc4_bo_stats_debugfs(struct seq_file *m, void *unused) | |||
88 | 88 | ||
89 | mutex_lock(&vc4->purgeable.lock); | 89 | mutex_lock(&vc4->purgeable.lock); |
90 | if (vc4->purgeable.num) | 90 | if (vc4->purgeable.num) |
91 | seq_printf(m, "%30s: %6dkb BOs (%d)\n", "userspace BO cache", | 91 | seq_printf(m, "%30s: %6zdkb BOs (%d)\n", "userspace BO cache", |
92 | vc4->purgeable.size / 1024, vc4->purgeable.num); | 92 | vc4->purgeable.size / 1024, vc4->purgeable.num); |
93 | 93 | ||
94 | if (vc4->purgeable.purged_num) | 94 | if (vc4->purgeable.purged_num) |
95 | seq_printf(m, "%30s: %6dkb BOs (%d)\n", "total purged BO", | 95 | seq_printf(m, "%30s: %6zdkb BOs (%d)\n", "total purged BO", |
96 | vc4->purgeable.purged_size / 1024, | 96 | vc4->purgeable.purged_size / 1024, |
97 | vc4->purgeable.purged_num); | 97 | vc4->purgeable.purged_num); |
98 | mutex_unlock(&vc4->purgeable.lock); | 98 | mutex_unlock(&vc4->purgeable.lock); |
diff --git a/drivers/gpu/ipu-v3/ipu-dc.c b/drivers/gpu/ipu-v3/ipu-dc.c index 7a4b8362dda8..49bfe6e7d005 100644 --- a/drivers/gpu/ipu-v3/ipu-dc.c +++ b/drivers/gpu/ipu-v3/ipu-dc.c | |||
@@ -249,11 +249,8 @@ EXPORT_SYMBOL_GPL(ipu_dc_enable); | |||
249 | 249 | ||
250 | void ipu_dc_enable_channel(struct ipu_dc *dc) | 250 | void ipu_dc_enable_channel(struct ipu_dc *dc) |
251 | { | 251 | { |
252 | int di; | ||
253 | u32 reg; | 252 | u32 reg; |
254 | 253 | ||
255 | di = dc->di; | ||
256 | |||
257 | reg = readl(dc->base + DC_WR_CH_CONF); | 254 | reg = readl(dc->base + DC_WR_CH_CONF); |
258 | reg |= DC_WR_CH_CONF_PROG_TYPE_NORMAL; | 255 | reg |= DC_WR_CH_CONF_PROG_TYPE_NORMAL; |
259 | writel(reg, dc->base + DC_WR_CH_CONF); | 256 | writel(reg, dc->base + DC_WR_CH_CONF); |
diff --git a/include/drm/amd_asic_type.h b/include/drm/amd_asic_type.h new file mode 100644 index 000000000000..599028f66585 --- /dev/null +++ b/include/drm/amd_asic_type.h | |||
@@ -0,0 +1,52 @@ | |||
1 | /* | ||
2 | * Copyright 2017 Advanced Micro Devices, Inc. | ||
3 | * | ||
4 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
5 | * copy of this software and associated documentation files (the "Software"), | ||
6 | * to deal in the Software without restriction, including without limitation | ||
7 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
8 | * and/or sell copies of the Software, and to permit persons to whom the | ||
9 | * Software is furnished to do so, subject to the following conditions: | ||
10 | * | ||
11 | * The above copyright notice and this permission notice shall be included in | ||
12 | * all copies or substantial portions of the Software. | ||
13 | * | ||
14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
17 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
18 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
19 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
20 | * OTHER DEALINGS IN THE SOFTWARE. | ||
21 | */ | ||
22 | |||
23 | #ifndef __AMD_ASIC_TYPE_H__ | ||
24 | #define __AMD_ASIC_TYPE_H__ | ||
25 | /* | ||
26 | * Supported ASIC types | ||
27 | */ | ||
28 | enum amd_asic_type { | ||
29 | CHIP_TAHITI = 0, | ||
30 | CHIP_PITCAIRN, | ||
31 | CHIP_VERDE, | ||
32 | CHIP_OLAND, | ||
33 | CHIP_HAINAN, | ||
34 | CHIP_BONAIRE, | ||
35 | CHIP_KAVERI, | ||
36 | CHIP_KABINI, | ||
37 | CHIP_HAWAII, | ||
38 | CHIP_MULLINS, | ||
39 | CHIP_TOPAZ, | ||
40 | CHIP_TONGA, | ||
41 | CHIP_FIJI, | ||
42 | CHIP_CARRIZO, | ||
43 | CHIP_STONEY, | ||
44 | CHIP_POLARIS10, | ||
45 | CHIP_POLARIS11, | ||
46 | CHIP_POLARIS12, | ||
47 | CHIP_VEGA10, | ||
48 | CHIP_RAVEN, | ||
49 | CHIP_LAST, | ||
50 | }; | ||
51 | |||
52 | #endif /*__AMD_ASIC_TYPE_H__ */ | ||
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index b4285c40e1e4..df9807a3caae 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h | |||
@@ -284,6 +284,11 @@ struct drm_display_info { | |||
284 | * @hdmi: advance features of a HDMI sink. | 284 | * @hdmi: advance features of a HDMI sink. |
285 | */ | 285 | */ |
286 | struct drm_hdmi_info hdmi; | 286 | struct drm_hdmi_info hdmi; |
287 | |||
288 | /** | ||
289 | * @non_desktop: Non desktop display (HMD). | ||
290 | */ | ||
291 | bool non_desktop; | ||
287 | }; | 292 | }; |
288 | 293 | ||
289 | int drm_display_info_set_bus_formats(struct drm_display_info *info, | 294 | int drm_display_info_set_bus_formats(struct drm_display_info *info, |
@@ -933,6 +938,7 @@ static inline unsigned drm_connector_index(struct drm_connector *connector) | |||
933 | /** | 938 | /** |
934 | * drm_connector_lookup - lookup connector object | 939 | * drm_connector_lookup - lookup connector object |
935 | * @dev: DRM device | 940 | * @dev: DRM device |
941 | * @file_priv: drm file to check for lease against. | ||
936 | * @id: connector object id | 942 | * @id: connector object id |
937 | * | 943 | * |
938 | * This function looks up the connector object specified by id | 944 | * This function looks up the connector object specified by id |
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index f7fcceef46d9..a2d81d2907a9 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h | |||
@@ -952,6 +952,7 @@ struct drm_crtc *drm_crtc_from_index(struct drm_device *dev, int idx); | |||
952 | /** | 952 | /** |
953 | * drm_crtc_find - look up a CRTC object from its ID | 953 | * drm_crtc_find - look up a CRTC object from its ID |
954 | * @dev: DRM device | 954 | * @dev: DRM device |
955 | * @file_priv: drm file to check for lease against. | ||
955 | * @id: &drm_mode_object ID | 956 | * @id: &drm_mode_object ID |
956 | * | 957 | * |
957 | * This can be used to look up a CRTC from its userspace ID. Only used by | 958 | * This can be used to look up a CRTC from its userspace ID. Only used by |
diff --git a/include/drm/drm_encoder.h b/include/drm/drm_encoder.h index 86db0da8bdcb..ee4cfbe63c52 100644 --- a/include/drm/drm_encoder.h +++ b/include/drm/drm_encoder.h | |||
@@ -208,6 +208,7 @@ static inline bool drm_encoder_crtc_ok(struct drm_encoder *encoder, | |||
208 | /** | 208 | /** |
209 | * drm_encoder_find - find a &drm_encoder | 209 | * drm_encoder_find - find a &drm_encoder |
210 | * @dev: DRM device | 210 | * @dev: DRM device |
211 | * @file_priv: drm file to check for lease against. | ||
211 | * @id: encoder id | 212 | * @id: encoder id |
212 | * | 213 | * |
213 | * Returns the encoder with @id, NULL if it doesn't exist. Simple wrapper around | 214 | * Returns the encoder with @id, NULL if it doesn't exist. Simple wrapper around |
diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h index 0b4ac2ebc610..b21e827c5c78 100644 --- a/include/drm/drm_mode_config.h +++ b/include/drm/drm_mode_config.h | |||
@@ -728,6 +728,13 @@ struct drm_mode_config { | |||
728 | */ | 728 | */ |
729 | struct drm_property *suggested_y_property; | 729 | struct drm_property *suggested_y_property; |
730 | 730 | ||
731 | /** | ||
732 | * @non_desktop_property: Optional connector property with a hint | ||
733 | * that device isn't a standard display, and the console/desktop, | ||
734 | * should not be displayed on it. | ||
735 | */ | ||
736 | struct drm_property *non_desktop_property; | ||
737 | |||
731 | /* dumb ioctl parameters */ | 738 | /* dumb ioctl parameters */ |
732 | uint32_t preferred_depth, prefer_shadow; | 739 | uint32_t preferred_depth, prefer_shadow; |
733 | 740 | ||
diff --git a/include/drm/drm_plane.h b/include/drm/drm_plane.h index 069c4c8ce360..571615079230 100644 --- a/include/drm/drm_plane.h +++ b/include/drm/drm_plane.h | |||
@@ -591,6 +591,7 @@ int drm_mode_plane_set_obj_prop(struct drm_plane *plane, | |||
591 | /** | 591 | /** |
592 | * drm_plane_find - find a &drm_plane | 592 | * drm_plane_find - find a &drm_plane |
593 | * @dev: DRM device | 593 | * @dev: DRM device |
594 | * @file_priv: drm file to check for lease against. | ||
594 | * @id: plane id | 595 | * @id: plane id |
595 | * | 596 | * |
596 | * Returns the plane with @id, NULL if it doesn't exist. Simple wrapper around | 597 | * Returns the plane with @id, NULL if it doesn't exist. Simple wrapper around |
diff --git a/include/drm/drm_property.h b/include/drm/drm_property.h index 429d8218f740..8a522b4bed40 100644 --- a/include/drm/drm_property.h +++ b/include/drm/drm_property.h | |||
@@ -305,8 +305,9 @@ drm_property_unreference_blob(struct drm_property_blob *blob) | |||
305 | } | 305 | } |
306 | 306 | ||
307 | /** | 307 | /** |
308 | * drm_connector_find - find property object | 308 | * drm_property_find - find property object |
309 | * @dev: DRM device | 309 | * @dev: DRM device |
310 | * @file_priv: drm file to check for lease against. | ||
310 | * @id: property object id | 311 | * @id: property object id |
311 | * | 312 | * |
312 | * This function looks up the property object specified by id and returns it. | 313 | * This function looks up the property object specified by id and returns it. |
diff --git a/include/dt-bindings/msm/msm-bus-ids.h b/include/dt-bindings/msm/msm-bus-ids.h deleted file mode 100644 index a75d304473d5..000000000000 --- a/include/dt-bindings/msm/msm-bus-ids.h +++ /dev/null | |||
@@ -1,887 +0,0 @@ | |||
1 | /* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. | ||
2 | * | ||
3 | * This program is free software; you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License version 2 and | ||
5 | * only version 2 as published by the Free Software Foundation. | ||
6 | * | ||
7 | * This program is distributed in the hope that it will be useful, | ||
8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
10 | * GNU General Public License for more details. | ||
11 | */ | ||
12 | |||
13 | #ifndef __MSM_BUS_IDS_H | ||
14 | #define __MSM_BUS_IDS_H | ||
15 | |||
16 | /* Aggregation types */ | ||
17 | #define AGG_SCHEME_NONE 0 | ||
18 | #define AGG_SCHEME_LEG 1 | ||
19 | #define AGG_SCHEME_1 2 | ||
20 | |||
21 | /* Topology related enums */ | ||
22 | #define MSM_BUS_FAB_DEFAULT 0 | ||
23 | #define MSM_BUS_FAB_APPSS 0 | ||
24 | #define MSM_BUS_FAB_SYSTEM 1024 | ||
25 | #define MSM_BUS_FAB_MMSS 2048 | ||
26 | #define MSM_BUS_FAB_SYSTEM_FPB 3072 | ||
27 | #define MSM_BUS_FAB_CPSS_FPB 4096 | ||
28 | |||
29 | #define MSM_BUS_FAB_BIMC 0 | ||
30 | #define MSM_BUS_FAB_SYS_NOC 1024 | ||
31 | #define MSM_BUS_FAB_MMSS_NOC 2048 | ||
32 | #define MSM_BUS_FAB_OCMEM_NOC 3072 | ||
33 | #define MSM_BUS_FAB_PERIPH_NOC 4096 | ||
34 | #define MSM_BUS_FAB_CONFIG_NOC 5120 | ||
35 | #define MSM_BUS_FAB_OCMEM_VNOC 6144 | ||
36 | #define MSM_BUS_FAB_MMSS_AHB 2049 | ||
37 | #define MSM_BUS_FAB_A0_NOC 6145 | ||
38 | #define MSM_BUS_FAB_A1_NOC 6146 | ||
39 | #define MSM_BUS_FAB_A2_NOC 6147 | ||
40 | #define MSM_BUS_FAB_GNOC 6148 | ||
41 | #define MSM_BUS_FAB_CR_VIRT 6149 | ||
42 | |||
43 | #define MSM_BUS_MASTER_FIRST 1 | ||
44 | #define MSM_BUS_MASTER_AMPSS_M0 1 | ||
45 | #define MSM_BUS_MASTER_AMPSS_M1 2 | ||
46 | #define MSM_BUS_APPSS_MASTER_FAB_MMSS 3 | ||
47 | #define MSM_BUS_APPSS_MASTER_FAB_SYSTEM 4 | ||
48 | #define MSM_BUS_SYSTEM_MASTER_FAB_APPSS 5 | ||
49 | #define MSM_BUS_MASTER_SPS 6 | ||
50 | #define MSM_BUS_MASTER_ADM_PORT0 7 | ||
51 | #define MSM_BUS_MASTER_ADM_PORT1 8 | ||
52 | #define MSM_BUS_SYSTEM_MASTER_ADM1_PORT0 9 | ||
53 | #define MSM_BUS_MASTER_ADM1_PORT1 10 | ||
54 | #define MSM_BUS_MASTER_LPASS_PROC 11 | ||
55 | #define MSM_BUS_MASTER_MSS_PROCI 12 | ||
56 | #define MSM_BUS_MASTER_MSS_PROCD 13 | ||
57 | #define MSM_BUS_MASTER_MSS_MDM_PORT0 14 | ||
58 | #define MSM_BUS_MASTER_LPASS 15 | ||
59 | #define MSM_BUS_SYSTEM_MASTER_CPSS_FPB 16 | ||
60 | #define MSM_BUS_SYSTEM_MASTER_SYSTEM_FPB 17 | ||
61 | #define MSM_BUS_SYSTEM_MASTER_MMSS_FPB 18 | ||
62 | #define MSM_BUS_MASTER_ADM1_CI 19 | ||
63 | #define MSM_BUS_MASTER_ADM0_CI 20 | ||
64 | #define MSM_BUS_MASTER_MSS_MDM_PORT1 21 | ||
65 | #define MSM_BUS_MASTER_MDP_PORT0 22 | ||
66 | #define MSM_BUS_MASTER_MDP_PORT1 23 | ||
67 | #define MSM_BUS_MMSS_MASTER_ADM1_PORT0 24 | ||
68 | #define MSM_BUS_MASTER_ROTATOR 25 | ||
69 | #define MSM_BUS_MASTER_GRAPHICS_3D 26 | ||
70 | #define MSM_BUS_MASTER_JPEG_DEC 27 | ||
71 | #define MSM_BUS_MASTER_GRAPHICS_2D_CORE0 28 | ||
72 | #define MSM_BUS_MASTER_VFE 29 | ||
73 | #define MSM_BUS_MASTER_VFE0 MSM_BUS_MASTER_VFE | ||
74 | #define MSM_BUS_MASTER_VPE 30 | ||
75 | #define MSM_BUS_MASTER_JPEG_ENC 31 | ||
76 | #define MSM_BUS_MASTER_GRAPHICS_2D_CORE1 32 | ||
77 | #define MSM_BUS_MMSS_MASTER_APPS_FAB 33 | ||
78 | #define MSM_BUS_MASTER_HD_CODEC_PORT0 34 | ||
79 | #define MSM_BUS_MASTER_HD_CODEC_PORT1 35 | ||
80 | #define MSM_BUS_MASTER_SPDM 36 | ||
81 | #define MSM_BUS_MASTER_RPM 37 | ||
82 | #define MSM_BUS_MASTER_MSS 38 | ||
83 | #define MSM_BUS_MASTER_RIVA 39 | ||
84 | #define MSM_BUS_MASTER_SNOC_VMEM 40 | ||
85 | #define MSM_BUS_MASTER_MSS_SW_PROC 41 | ||
86 | #define MSM_BUS_MASTER_MSS_FW_PROC 42 | ||
87 | #define MSM_BUS_MASTER_HMSS 43 | ||
88 | #define MSM_BUS_MASTER_GSS_NAV 44 | ||
89 | #define MSM_BUS_MASTER_PCIE 45 | ||
90 | #define MSM_BUS_MASTER_SATA 46 | ||
91 | #define MSM_BUS_MASTER_CRYPTO 47 | ||
92 | #define MSM_BUS_MASTER_VIDEO_CAP 48 | ||
93 | #define MSM_BUS_MASTER_GRAPHICS_3D_PORT1 49 | ||
94 | #define MSM_BUS_MASTER_VIDEO_ENC 50 | ||
95 | #define MSM_BUS_MASTER_VIDEO_DEC 51 | ||
96 | #define MSM_BUS_MASTER_LPASS_AHB 52 | ||
97 | #define MSM_BUS_MASTER_QDSS_BAM 53 | ||
98 | #define MSM_BUS_MASTER_SNOC_CFG 54 | ||
99 | #define MSM_BUS_MASTER_CRYPTO_CORE0 55 | ||
100 | #define MSM_BUS_MASTER_CRYPTO_CORE1 56 | ||
101 | #define MSM_BUS_MASTER_MSS_NAV 57 | ||
102 | #define MSM_BUS_MASTER_OCMEM_DMA 58 | ||
103 | #define MSM_BUS_MASTER_WCSS 59 | ||
104 | #define MSM_BUS_MASTER_QDSS_ETR 60 | ||
105 | #define MSM_BUS_MASTER_USB3 61 | ||
106 | #define MSM_BUS_MASTER_JPEG 62 | ||
107 | #define MSM_BUS_MASTER_VIDEO_P0 63 | ||
108 | #define MSM_BUS_MASTER_VIDEO_P1 64 | ||
109 | #define MSM_BUS_MASTER_MSS_PROC 65 | ||
110 | #define MSM_BUS_MASTER_JPEG_OCMEM 66 | ||
111 | #define MSM_BUS_MASTER_MDP_OCMEM 67 | ||
112 | #define MSM_BUS_MASTER_VIDEO_P0_OCMEM 68 | ||
113 | #define MSM_BUS_MASTER_VIDEO_P1_OCMEM 69 | ||
114 | #define MSM_BUS_MASTER_VFE_OCMEM 70 | ||
115 | #define MSM_BUS_MASTER_CNOC_ONOC_CFG 71 | ||
116 | #define MSM_BUS_MASTER_RPM_INST 72 | ||
117 | #define MSM_BUS_MASTER_RPM_DATA 73 | ||
118 | #define MSM_BUS_MASTER_RPM_SYS 74 | ||
119 | #define MSM_BUS_MASTER_DEHR 75 | ||
120 | #define MSM_BUS_MASTER_QDSS_DAP 76 | ||
121 | #define MSM_BUS_MASTER_TIC 77 | ||
122 | #define MSM_BUS_MASTER_SDCC_1 78 | ||
123 | #define MSM_BUS_MASTER_SDCC_3 79 | ||
124 | #define MSM_BUS_MASTER_SDCC_4 80 | ||
125 | #define MSM_BUS_MASTER_SDCC_2 81 | ||
126 | #define MSM_BUS_MASTER_TSIF 82 | ||
127 | #define MSM_BUS_MASTER_BAM_DMA 83 | ||
128 | #define MSM_BUS_MASTER_BLSP_2 84 | ||
129 | #define MSM_BUS_MASTER_USB_HSIC 85 | ||
130 | #define MSM_BUS_MASTER_BLSP_1 86 | ||
131 | #define MSM_BUS_MASTER_USB_HS 87 | ||
132 | #define MSM_BUS_MASTER_PNOC_CFG 88 | ||
133 | #define MSM_BUS_MASTER_V_OCMEM_GFX3D 89 | ||
134 | #define MSM_BUS_MASTER_IPA 90 | ||
135 | #define MSM_BUS_MASTER_QPIC 91 | ||
136 | #define MSM_BUS_MASTER_MDPE 92 | ||
137 | #define MSM_BUS_MASTER_USB_HS2 93 | ||
138 | #define MSM_BUS_MASTER_VPU 94 | ||
139 | #define MSM_BUS_MASTER_UFS 95 | ||
140 | #define MSM_BUS_MASTER_BCAST 96 | ||
141 | #define MSM_BUS_MASTER_CRYPTO_CORE2 97 | ||
142 | #define MSM_BUS_MASTER_EMAC 98 | ||
143 | #define MSM_BUS_MASTER_VPU_1 99 | ||
144 | #define MSM_BUS_MASTER_PCIE_1 100 | ||
145 | #define MSM_BUS_MASTER_USB3_1 101 | ||
146 | #define MSM_BUS_MASTER_CNOC_MNOC_MMSS_CFG 102 | ||
147 | #define MSM_BUS_MASTER_CNOC_MNOC_CFG 103 | ||
148 | #define MSM_BUS_MASTER_TCU_0 104 | ||
149 | #define MSM_BUS_MASTER_TCU_1 105 | ||
150 | #define MSM_BUS_MASTER_CPP 106 | ||
151 | #define MSM_BUS_MASTER_AUDIO 107 | ||
152 | #define MSM_BUS_MASTER_PCIE_2 108 | ||
153 | #define MSM_BUS_MASTER_VFE1 109 | ||
154 | #define MSM_BUS_MASTER_XM_USB_HS1 110 | ||
155 | #define MSM_BUS_MASTER_PCNOC_BIMC_1 111 | ||
156 | #define MSM_BUS_MASTER_BIMC_PCNOC 112 | ||
157 | #define MSM_BUS_MASTER_XI_USB_HSIC 113 | ||
158 | #define MSM_BUS_MASTER_SGMII 114 | ||
159 | #define MSM_BUS_SPMI_FETCHER 115 | ||
160 | #define MSM_BUS_MASTER_GNOC_BIMC 116 | ||
161 | #define MSM_BUS_MASTER_CRVIRT_A2NOC 117 | ||
162 | #define MSM_BUS_MASTER_CNOC_A2NOC 118 | ||
163 | #define MSM_BUS_MASTER_WLAN 119 | ||
164 | #define MSM_BUS_MASTER_MSS_CE 120 | ||
165 | #define MSM_BUS_MASTER_CDSP_PROC 121 | ||
166 | #define MSM_BUS_MASTER_GNOC_SNOC 122 | ||
167 | #define MSM_BUS_MASTER_PIMEM 123 | ||
168 | #define MSM_BUS_MASTER_MASTER_LAST 124 | ||
169 | |||
170 | #define MSM_BUS_SYSTEM_FPB_MASTER_SYSTEM MSM_BUS_SYSTEM_MASTER_SYSTEM_FPB | ||
171 | #define MSM_BUS_CPSS_FPB_MASTER_SYSTEM MSM_BUS_SYSTEM_MASTER_CPSS_FPB | ||
172 | |||
173 | #define MSM_BUS_SNOC_MM_INT_0 10000 | ||
174 | #define MSM_BUS_SNOC_MM_INT_1 10001 | ||
175 | #define MSM_BUS_SNOC_MM_INT_2 10002 | ||
176 | #define MSM_BUS_SNOC_MM_INT_BIMC 10003 | ||
177 | #define MSM_BUS_SNOC_INT_0 10004 | ||
178 | #define MSM_BUS_SNOC_INT_1 10005 | ||
179 | #define MSM_BUS_SNOC_INT_BIMC 10006 | ||
180 | #define MSM_BUS_SNOC_BIMC_0_MAS 10007 | ||
181 | #define MSM_BUS_SNOC_BIMC_1_MAS 10008 | ||
182 | #define MSM_BUS_SNOC_QDSS_INT 10009 | ||
183 | #define MSM_BUS_PNOC_SNOC_MAS 10010 | ||
184 | #define MSM_BUS_PNOC_SNOC_SLV 10011 | ||
185 | #define MSM_BUS_PNOC_INT_0 10012 | ||
186 | #define MSM_BUS_PNOC_INT_1 10013 | ||
187 | #define MSM_BUS_PNOC_M_0 10014 | ||
188 | #define MSM_BUS_PNOC_M_1 10015 | ||
189 | #define MSM_BUS_BIMC_SNOC_MAS 10016 | ||
190 | #define MSM_BUS_BIMC_SNOC_SLV 10017 | ||
191 | #define MSM_BUS_PNOC_SLV_0 10018 | ||
192 | #define MSM_BUS_PNOC_SLV_1 10019 | ||
193 | #define MSM_BUS_PNOC_SLV_2 10020 | ||
194 | #define MSM_BUS_PNOC_SLV_3 10021 | ||
195 | #define MSM_BUS_PNOC_SLV_4 10022 | ||
196 | #define MSM_BUS_PNOC_SLV_8 10023 | ||
197 | #define MSM_BUS_PNOC_SLV_9 10024 | ||
198 | #define MSM_BUS_SNOC_BIMC_0_SLV 10025 | ||
199 | #define MSM_BUS_SNOC_BIMC_1_SLV 10026 | ||
200 | #define MSM_BUS_MNOC_BIMC_MAS 10027 | ||
201 | #define MSM_BUS_MNOC_BIMC_SLV 10028 | ||
202 | #define MSM_BUS_BIMC_MNOC_MAS 10029 | ||
203 | #define MSM_BUS_BIMC_MNOC_SLV 10030 | ||
204 | #define MSM_BUS_SNOC_BIMC_MAS 10031 | ||
205 | #define MSM_BUS_SNOC_BIMC_SLV 10032 | ||
206 | #define MSM_BUS_CNOC_SNOC_MAS 10033 | ||
207 | #define MSM_BUS_CNOC_SNOC_SLV 10034 | ||
208 | #define MSM_BUS_SNOC_CNOC_MAS 10035 | ||
209 | #define MSM_BUS_SNOC_CNOC_SLV 10036 | ||
210 | #define MSM_BUS_OVNOC_SNOC_MAS 10037 | ||
211 | #define MSM_BUS_OVNOC_SNOC_SLV 10038 | ||
212 | #define MSM_BUS_SNOC_OVNOC_MAS 10039 | ||
213 | #define MSM_BUS_SNOC_OVNOC_SLV 10040 | ||
214 | #define MSM_BUS_SNOC_PNOC_MAS 10041 | ||
215 | #define MSM_BUS_SNOC_PNOC_SLV 10042 | ||
216 | #define MSM_BUS_BIMC_INT_APPS_EBI 10043 | ||
217 | #define MSM_BUS_BIMC_INT_APPS_SNOC 10044 | ||
218 | #define MSM_BUS_SNOC_BIMC_2_MAS 10045 | ||
219 | #define MSM_BUS_SNOC_BIMC_2_SLV 10046 | ||
220 | #define MSM_BUS_PNOC_SLV_5 10047 | ||
221 | #define MSM_BUS_PNOC_SLV_7 10048 | ||
222 | #define MSM_BUS_PNOC_INT_2 10049 | ||
223 | #define MSM_BUS_PNOC_INT_3 10050 | ||
224 | #define MSM_BUS_PNOC_INT_4 10051 | ||
225 | #define MSM_BUS_PNOC_INT_5 10052 | ||
226 | #define MSM_BUS_PNOC_INT_6 10053 | ||
227 | #define MSM_BUS_PNOC_INT_7 10054 | ||
228 | #define MSM_BUS_BIMC_SNOC_1_MAS 10055 | ||
229 | #define MSM_BUS_BIMC_SNOC_1_SLV 10056 | ||
230 | #define MSM_BUS_PNOC_A1NOC_MAS 10057 | ||
231 | #define MSM_BUS_PNOC_A1NOC_SLV 10058 | ||
232 | #define MSM_BUS_CNOC_A1NOC_MAS 10059 | ||
233 | #define MSM_BUS_A0NOC_SNOC_MAS 10060 | ||
234 | #define MSM_BUS_A0NOC_SNOC_SLV 10061 | ||
235 | #define MSM_BUS_A1NOC_SNOC_SLV 10062 | ||
236 | #define MSM_BUS_A1NOC_SNOC_MAS 10063 | ||
237 | #define MSM_BUS_A2NOC_SNOC_MAS 10064 | ||
238 | #define MSM_BUS_A2NOC_SNOC_SLV 10065 | ||
239 | #define MSM_BUS_SNOC_INT_2 10066 | ||
240 | #define MSM_BUS_A0NOC_QDSS_INT 10067 | ||
241 | #define MSM_BUS_INT_LAST 10068 | ||
242 | |||
243 | #define MSM_BUS_INT_TEST_ID 20000 | ||
244 | #define MSM_BUS_INT_TEST_LAST 20050 | ||
245 | |||
246 | #define MSM_BUS_SLAVE_FIRST 512 | ||
247 | #define MSM_BUS_SLAVE_EBI_CH0 512 | ||
248 | #define MSM_BUS_SLAVE_EBI_CH1 513 | ||
249 | #define MSM_BUS_SLAVE_AMPSS_L2 514 | ||
250 | #define MSM_BUS_APPSS_SLAVE_FAB_MMSS 515 | ||
251 | #define MSM_BUS_APPSS_SLAVE_FAB_SYSTEM 516 | ||
252 | #define MSM_BUS_SYSTEM_SLAVE_FAB_APPS 517 | ||
253 | #define MSM_BUS_SLAVE_SPS 518 | ||
254 | #define MSM_BUS_SLAVE_SYSTEM_IMEM 519 | ||
255 | #define MSM_BUS_SLAVE_AMPSS 520 | ||
256 | #define MSM_BUS_SLAVE_MSS 521 | ||
257 | #define MSM_BUS_SLAVE_LPASS 522 | ||
258 | #define MSM_BUS_SYSTEM_SLAVE_CPSS_FPB 523 | ||
259 | #define MSM_BUS_SYSTEM_SLAVE_SYSTEM_FPB 524 | ||
260 | #define MSM_BUS_SYSTEM_SLAVE_MMSS_FPB 525 | ||
261 | #define MSM_BUS_SLAVE_CORESIGHT 526 | ||
262 | #define MSM_BUS_SLAVE_RIVA 527 | ||
263 | #define MSM_BUS_SLAVE_SMI 528 | ||
264 | #define MSM_BUS_MMSS_SLAVE_FAB_APPS 529 | ||
265 | #define MSM_BUS_MMSS_SLAVE_FAB_APPS_1 530 | ||
266 | #define MSM_BUS_SLAVE_MM_IMEM 531 | ||
267 | #define MSM_BUS_SLAVE_CRYPTO 532 | ||
268 | #define MSM_BUS_SLAVE_SPDM 533 | ||
269 | #define MSM_BUS_SLAVE_RPM 534 | ||
270 | #define MSM_BUS_SLAVE_RPM_MSG_RAM 535 | ||
271 | #define MSM_BUS_SLAVE_MPM 536 | ||
272 | #define MSM_BUS_SLAVE_PMIC1_SSBI1_A 537 | ||
273 | #define MSM_BUS_SLAVE_PMIC1_SSBI1_B 538 | ||
274 | #define MSM_BUS_SLAVE_PMIC1_SSBI1_C 539 | ||
275 | #define MSM_BUS_SLAVE_PMIC2_SSBI2_A 540 | ||
276 | #define MSM_BUS_SLAVE_PMIC2_SSBI2_B 541 | ||
277 | #define MSM_BUS_SLAVE_GSBI1_UART 542 | ||
278 | #define MSM_BUS_SLAVE_GSBI2_UART 543 | ||
279 | #define MSM_BUS_SLAVE_GSBI3_UART 544 | ||
280 | #define MSM_BUS_SLAVE_GSBI4_UART 545 | ||
281 | #define MSM_BUS_SLAVE_GSBI5_UART 546 | ||
282 | #define MSM_BUS_SLAVE_GSBI6_UART 547 | ||
283 | #define MSM_BUS_SLAVE_GSBI7_UART 548 | ||
284 | #define MSM_BUS_SLAVE_GSBI8_UART 549 | ||
285 | #define MSM_BUS_SLAVE_GSBI9_UART 550 | ||
286 | #define MSM_BUS_SLAVE_GSBI10_UART 551 | ||
287 | #define MSM_BUS_SLAVE_GSBI11_UART 552 | ||
288 | #define MSM_BUS_SLAVE_GSBI12_UART 553 | ||
289 | #define MSM_BUS_SLAVE_GSBI1_QUP 554 | ||
290 | #define MSM_BUS_SLAVE_GSBI2_QUP 555 | ||
291 | #define MSM_BUS_SLAVE_GSBI3_QUP 556 | ||
292 | #define MSM_BUS_SLAVE_GSBI4_QUP 557 | ||
293 | #define MSM_BUS_SLAVE_GSBI5_QUP 558 | ||
294 | #define MSM_BUS_SLAVE_GSBI6_QUP 559 | ||
295 | #define MSM_BUS_SLAVE_GSBI7_QUP 560 | ||
296 | #define MSM_BUS_SLAVE_GSBI8_QUP 561 | ||
297 | #define MSM_BUS_SLAVE_GSBI9_QUP 562 | ||
298 | #define MSM_BUS_SLAVE_GSBI10_QUP 563 | ||
299 | #define MSM_BUS_SLAVE_GSBI11_QUP 564 | ||
300 | #define MSM_BUS_SLAVE_GSBI12_QUP 565 | ||
301 | #define MSM_BUS_SLAVE_EBI2_NAND 566 | ||
302 | #define MSM_BUS_SLAVE_EBI2_CS0 567 | ||
303 | #define MSM_BUS_SLAVE_EBI2_CS1 568 | ||
304 | #define MSM_BUS_SLAVE_EBI2_CS2 569 | ||
305 | #define MSM_BUS_SLAVE_EBI2_CS3 570 | ||
306 | #define MSM_BUS_SLAVE_EBI2_CS4 571 | ||
307 | #define MSM_BUS_SLAVE_EBI2_CS5 572 | ||
308 | #define MSM_BUS_SLAVE_USB_FS1 573 | ||
309 | #define MSM_BUS_SLAVE_USB_FS2 574 | ||
310 | #define MSM_BUS_SLAVE_TSIF 575 | ||
311 | #define MSM_BUS_SLAVE_MSM_TSSC 576 | ||
312 | #define MSM_BUS_SLAVE_MSM_PDM 577 | ||
313 | #define MSM_BUS_SLAVE_MSM_DIMEM 578 | ||
314 | #define MSM_BUS_SLAVE_MSM_TCSR 579 | ||
315 | #define MSM_BUS_SLAVE_MSM_PRNG 580 | ||
316 | #define MSM_BUS_SLAVE_GSS 581 | ||
317 | #define MSM_BUS_SLAVE_SATA 582 | ||
318 | #define MSM_BUS_SLAVE_USB3 583 | ||
319 | #define MSM_BUS_SLAVE_WCSS 584 | ||
320 | #define MSM_BUS_SLAVE_OCIMEM 585 | ||
321 | #define MSM_BUS_SLAVE_SNOC_OCMEM 586 | ||
322 | #define MSM_BUS_SLAVE_SERVICE_SNOC 587 | ||
323 | #define MSM_BUS_SLAVE_QDSS_STM 588 | ||
324 | #define MSM_BUS_SLAVE_CAMERA_CFG 589 | ||
325 | #define MSM_BUS_SLAVE_DISPLAY_CFG 590 | ||
326 | #define MSM_BUS_SLAVE_OCMEM_CFG 591 | ||
327 | #define MSM_BUS_SLAVE_CPR_CFG 592 | ||
328 | #define MSM_BUS_SLAVE_CPR_XPU_CFG 593 | ||
329 | #define MSM_BUS_SLAVE_MISC_CFG 594 | ||
330 | #define MSM_BUS_SLAVE_MISC_XPU_CFG 595 | ||
331 | #define MSM_BUS_SLAVE_VENUS_CFG 596 | ||
332 | #define MSM_BUS_SLAVE_MISC_VENUS_CFG 597 | ||
333 | #define MSM_BUS_SLAVE_GRAPHICS_3D_CFG 598 | ||
334 | #define MSM_BUS_SLAVE_MMSS_CLK_CFG 599 | ||
335 | #define MSM_BUS_SLAVE_MMSS_CLK_XPU_CFG 600 | ||
336 | #define MSM_BUS_SLAVE_MNOC_MPU_CFG 601 | ||
337 | #define MSM_BUS_SLAVE_ONOC_MPU_CFG 602 | ||
338 | #define MSM_BUS_SLAVE_SERVICE_MNOC 603 | ||
339 | #define MSM_BUS_SLAVE_OCMEM 604 | ||
340 | #define MSM_BUS_SLAVE_SERVICE_ONOC 605 | ||
341 | #define MSM_BUS_SLAVE_SDCC_1 606 | ||
342 | #define MSM_BUS_SLAVE_SDCC_3 607 | ||
343 | #define MSM_BUS_SLAVE_SDCC_2 608 | ||
344 | #define MSM_BUS_SLAVE_SDCC_4 609 | ||
345 | #define MSM_BUS_SLAVE_BAM_DMA 610 | ||
346 | #define MSM_BUS_SLAVE_BLSP_2 611 | ||
347 | #define MSM_BUS_SLAVE_USB_HSIC 612 | ||
348 | #define MSM_BUS_SLAVE_BLSP_1 613 | ||
349 | #define MSM_BUS_SLAVE_USB_HS 614 | ||
350 | #define MSM_BUS_SLAVE_PDM 615 | ||
351 | #define MSM_BUS_SLAVE_PERIPH_APU_CFG 616 | ||
352 | #define MSM_BUS_SLAVE_PNOC_MPU_CFG 617 | ||
353 | #define MSM_BUS_SLAVE_PRNG 618 | ||
354 | #define MSM_BUS_SLAVE_SERVICE_PNOC 619 | ||
355 | #define MSM_BUS_SLAVE_CLK_CTL 620 | ||
356 | #define MSM_BUS_SLAVE_CNOC_MSS 621 | ||
357 | #define MSM_BUS_SLAVE_SECURITY 622 | ||
358 | #define MSM_BUS_SLAVE_TCSR 623 | ||
359 | #define MSM_BUS_SLAVE_TLMM 624 | ||
360 | #define MSM_BUS_SLAVE_CRYPTO_0_CFG 625 | ||
361 | #define MSM_BUS_SLAVE_CRYPTO_1_CFG 626 | ||
362 | #define MSM_BUS_SLAVE_IMEM_CFG 627 | ||
363 | #define MSM_BUS_SLAVE_MESSAGE_RAM 628 | ||
364 | #define MSM_BUS_SLAVE_BIMC_CFG 629 | ||
365 | #define MSM_BUS_SLAVE_BOOT_ROM 630 | ||
366 | #define MSM_BUS_SLAVE_CNOC_MNOC_MMSS_CFG 631 | ||
367 | #define MSM_BUS_SLAVE_PMIC_ARB 632 | ||
368 | #define MSM_BUS_SLAVE_SPDM_WRAPPER 633 | ||
369 | #define MSM_BUS_SLAVE_DEHR_CFG 634 | ||
370 | #define MSM_BUS_SLAVE_QDSS_CFG 635 | ||
371 | #define MSM_BUS_SLAVE_RBCPR_CFG 636 | ||
372 | #define MSM_BUS_SLAVE_RBCPR_QDSS_APU_CFG 637 | ||
373 | #define MSM_BUS_SLAVE_SNOC_MPU_CFG 638 | ||
374 | #define MSM_BUS_SLAVE_CNOC_ONOC_CFG 639 | ||
375 | #define MSM_BUS_SLAVE_CNOC_MNOC_CFG 640 | ||
376 | #define MSM_BUS_SLAVE_PNOC_CFG 641 | ||
377 | #define MSM_BUS_SLAVE_SNOC_CFG 642 | ||
378 | #define MSM_BUS_SLAVE_EBI1_DLL_CFG 643 | ||
379 | #define MSM_BUS_SLAVE_PHY_APU_CFG 644 | ||
380 | #define MSM_BUS_SLAVE_EBI1_PHY_CFG 645 | ||
381 | #define MSM_BUS_SLAVE_SERVICE_CNOC 646 | ||
382 | #define MSM_BUS_SLAVE_IPS_CFG 647 | ||
383 | #define MSM_BUS_SLAVE_QPIC 648 | ||
384 | #define MSM_BUS_SLAVE_DSI_CFG 649 | ||
385 | #define MSM_BUS_SLAVE_UFS_CFG 650 | ||
386 | #define MSM_BUS_SLAVE_RBCPR_CX_CFG 651 | ||
387 | #define MSM_BUS_SLAVE_RBCPR_MX_CFG 652 | ||
388 | #define MSM_BUS_SLAVE_PCIE_CFG 653 | ||
389 | #define MSM_BUS_SLAVE_USB_PHYS_CFG 654 | ||
390 | #define MSM_BUS_SLAVE_VIDEO_CAP_CFG 655 | ||
391 | #define MSM_BUS_SLAVE_AVSYNC_CFG 656 | ||
392 | #define MSM_BUS_SLAVE_CRYPTO_2_CFG 657 | ||
393 | #define MSM_BUS_SLAVE_VPU_CFG 658 | ||
394 | #define MSM_BUS_SLAVE_BCAST_CFG 659 | ||
395 | #define MSM_BUS_SLAVE_KLM_CFG 660 | ||
396 | #define MSM_BUS_SLAVE_GENI_IR_CFG 661 | ||
397 | #define MSM_BUS_SLAVE_OCMEM_GFX 662 | ||
398 | #define MSM_BUS_SLAVE_CATS_128 663 | ||
399 | #define MSM_BUS_SLAVE_OCMEM_64 664 | ||
400 | #define MSM_BUS_SLAVE_PCIE_0 665 | ||
401 | #define MSM_BUS_SLAVE_PCIE_1 666 | ||
402 | #define MSM_BUS_SLAVE_PCIE_0_CFG 667 | ||
403 | #define MSM_BUS_SLAVE_PCIE_1_CFG 668 | ||
404 | #define MSM_BUS_SLAVE_SRVC_MNOC 669 | ||
405 | #define MSM_BUS_SLAVE_USB_HS2 670 | ||
406 | #define MSM_BUS_SLAVE_AUDIO 671 | ||
407 | #define MSM_BUS_SLAVE_TCU 672 | ||
408 | #define MSM_BUS_SLAVE_APPSS 673 | ||
409 | #define MSM_BUS_SLAVE_PCIE_PARF 674 | ||
410 | #define MSM_BUS_SLAVE_USB3_PHY_CFG 675 | ||
411 | #define MSM_BUS_SLAVE_IPA_CFG 676 | ||
412 | #define MSM_BUS_SLAVE_A0NOC_SNOC 677 | ||
413 | #define MSM_BUS_SLAVE_A1NOC_SNOC 678 | ||
414 | #define MSM_BUS_SLAVE_A2NOC_SNOC 679 | ||
415 | #define MSM_BUS_SLAVE_HMSS_L3 680 | ||
416 | #define MSM_BUS_SLAVE_PIMEM_CFG 681 | ||
417 | #define MSM_BUS_SLAVE_DCC_CFG 682 | ||
418 | #define MSM_BUS_SLAVE_QDSS_RBCPR_APU_CFG 683 | ||
419 | #define MSM_BUS_SLAVE_PCIE_2_CFG 684 | ||
420 | #define MSM_BUS_SLAVE_PCIE20_AHB2PHY 685 | ||
421 | #define MSM_BUS_SLAVE_A0NOC_CFG 686 | ||
422 | #define MSM_BUS_SLAVE_A1NOC_CFG 687 | ||
423 | #define MSM_BUS_SLAVE_A2NOC_CFG 688 | ||
424 | #define MSM_BUS_SLAVE_A1NOC_MPU_CFG 689 | ||
425 | #define MSM_BUS_SLAVE_A2NOC_MPU_CFG 690 | ||
426 | #define MSM_BUS_SLAVE_A0NOC_SMMU_CFG 691 | ||
427 | #define MSM_BUS_SLAVE_A1NOC_SMMU_CFG 692 | ||
428 | #define MSM_BUS_SLAVE_A2NOC_SMMU_CFG 693 | ||
429 | #define MSM_BUS_SLAVE_LPASS_SMMU_CFG 694 | ||
430 | #define MSM_BUS_SLAVE_MMAGIC_CFG 695 | ||
431 | #define MSM_BUS_SLAVE_VENUS_THROTTLE_CFG 696 | ||
432 | #define MSM_BUS_SLAVE_SSC_CFG 697 | ||
433 | #define MSM_BUS_SLAVE_DSA_CFG 698 | ||
434 | #define MSM_BUS_SLAVE_DSA_MPU_CFG 699 | ||
435 | #define MSM_BUS_SLAVE_DISPLAY_THROTTLE_CFG 700 | ||
436 | #define MSM_BUS_SLAVE_SMMU_CPP_CFG 701 | ||
437 | #define MSM_BUS_SLAVE_SMMU_JPEG_CFG 702 | ||
438 | #define MSM_BUS_SLAVE_SMMU_MDP_CFG 703 | ||
439 | #define MSM_BUS_SLAVE_SMMU_ROTATOR_CFG 704 | ||
440 | #define MSM_BUS_SLAVE_SMMU_VENUS_CFG 705 | ||
441 | #define MSM_BUS_SLAVE_SMMU_VFE_CFG 706 | ||
442 | #define MSM_BUS_SLAVE_A0NOC_MPU_CFG 707 | ||
443 | #define MSM_BUS_SLAVE_VMEM_CFG 708 | ||
444 | #define MSM_BUS_SLAVE_CAMERA_THROTTLE_CFG 709 | ||
445 | #define MSM_BUS_SLAVE_VMEM 710 | ||
446 | #define MSM_BUS_SLAVE_AHB2PHY 711 | ||
447 | #define MSM_BUS_SLAVE_PIMEM 712 | ||
448 | #define MSM_BUS_SLAVE_SNOC_VMEM 713 | ||
449 | #define MSM_BUS_SLAVE_PCIE_2 714 | ||
450 | #define MSM_BUS_SLAVE_RBCPR_MX 715 | ||
451 | #define MSM_BUS_SLAVE_RBCPR_CX 716 | ||
452 | #define MSM_BUS_SLAVE_BIMC_PCNOC 717 | ||
453 | #define MSM_BUS_SLAVE_PCNOC_BIMC_1 718 | ||
454 | #define MSM_BUS_SLAVE_SGMII 719 | ||
455 | #define MSM_BUS_SLAVE_SPMI_FETCHER 720 | ||
456 | #define MSM_BUS_PNOC_SLV_6 721 | ||
457 | #define MSM_BUS_SLAVE_MMSS_SMMU_CFG 722 | ||
458 | #define MSM_BUS_SLAVE_WLAN 723 | ||
459 | #define MSM_BUS_SLAVE_CRVIRT_A2NOC 724 | ||
460 | #define MSM_BUS_SLAVE_CNOC_A2NOC 725 | ||
461 | #define MSM_BUS_SLAVE_GLM 726 | ||
462 | #define MSM_BUS_SLAVE_GNOC_BIMC 727 | ||
463 | #define MSM_BUS_SLAVE_GNOC_SNOC 728 | ||
464 | #define MSM_BUS_SLAVE_QM_CFG 729 | ||
465 | #define MSM_BUS_SLAVE_TLMM_EAST 730 | ||
466 | #define MSM_BUS_SLAVE_TLMM_NORTH 731 | ||
467 | #define MSM_BUS_SLAVE_TLMM_WEST 732 | ||
468 | #define MSM_BUS_SLAVE_SKL 733 | ||
469 | #define MSM_BUS_SLAVE_LPASS_TCM 734 | ||
470 | #define MSM_BUS_SLAVE_TLMM_SOUTH 735 | ||
471 | #define MSM_BUS_SLAVE_TLMM_CENTER 736 | ||
472 | #define MSM_BUS_MSS_NAV_CE_MPU_CFG 737 | ||
473 | #define MSM_BUS_SLAVE_A2NOC_THROTTLE_CFG 738 | ||
474 | #define MSM_BUS_SLAVE_CDSP 739 | ||
475 | #define MSM_BUS_SLAVE_CDSP_SMMU_CFG 740 | ||
476 | #define MSM_BUS_SLAVE_LPASS_MPU_CFG 741 | ||
477 | #define MSM_BUS_SLAVE_CSI_PHY_CFG 742 | ||
478 | #define MSM_BUS_SLAVE_LAST 743 | ||
479 | |||
480 | #define MSM_BUS_SYSTEM_FPB_SLAVE_SYSTEM MSM_BUS_SYSTEM_SLAVE_SYSTEM_FPB | ||
481 | #define MSM_BUS_CPSS_FPB_SLAVE_SYSTEM MSM_BUS_SYSTEM_SLAVE_CPSS_FPB | ||
482 | |||
483 | /* | ||
484 | * ID's used in RPM messages | ||
485 | */ | ||
486 | #define ICBID_MASTER_APPSS_PROC 0 | ||
487 | #define ICBID_MASTER_MSS_PROC 1 | ||
488 | #define ICBID_MASTER_MNOC_BIMC 2 | ||
489 | #define ICBID_MASTER_SNOC_BIMC 3 | ||
490 | #define ICBID_MASTER_SNOC_BIMC_0 ICBID_MASTER_SNOC_BIMC | ||
491 | #define ICBID_MASTER_CNOC_MNOC_MMSS_CFG 4 | ||
492 | #define ICBID_MASTER_CNOC_MNOC_CFG 5 | ||
493 | #define ICBID_MASTER_GFX3D 6 | ||
494 | #define ICBID_MASTER_JPEG 7 | ||
495 | #define ICBID_MASTER_MDP 8 | ||
496 | #define ICBID_MASTER_MDP0 ICBID_MASTER_MDP | ||
497 | #define ICBID_MASTER_MDPS ICBID_MASTER_MDP | ||
498 | #define ICBID_MASTER_VIDEO 9 | ||
499 | #define ICBID_MASTER_VIDEO_P0 ICBID_MASTER_VIDEO | ||
500 | #define ICBID_MASTER_VIDEO_P1 10 | ||
501 | #define ICBID_MASTER_VFE 11 | ||
502 | #define ICBID_MASTER_VFE0 ICBID_MASTER_VFE | ||
503 | #define ICBID_MASTER_CNOC_ONOC_CFG 12 | ||
504 | #define ICBID_MASTER_JPEG_OCMEM 13 | ||
505 | #define ICBID_MASTER_MDP_OCMEM 14 | ||
506 | #define ICBID_MASTER_VIDEO_P0_OCMEM 15 | ||
507 | #define ICBID_MASTER_VIDEO_P1_OCMEM 16 | ||
508 | #define ICBID_MASTER_VFE_OCMEM 17 | ||
509 | #define ICBID_MASTER_LPASS_AHB 18 | ||
510 | #define ICBID_MASTER_QDSS_BAM 19 | ||
511 | #define ICBID_MASTER_SNOC_CFG 20 | ||
512 | #define ICBID_MASTER_BIMC_SNOC 21 | ||
513 | #define ICBID_MASTER_BIMC_SNOC_0 ICBID_MASTER_BIMC_SNOC | ||
514 | #define ICBID_MASTER_CNOC_SNOC 22 | ||
515 | #define ICBID_MASTER_CRYPTO 23 | ||
516 | #define ICBID_MASTER_CRYPTO_CORE0 ICBID_MASTER_CRYPTO | ||
517 | #define ICBID_MASTER_CRYPTO_CORE1 24 | ||
518 | #define ICBID_MASTER_LPASS_PROC 25 | ||
519 | #define ICBID_MASTER_MSS 26 | ||
520 | #define ICBID_MASTER_MSS_NAV 27 | ||
521 | #define ICBID_MASTER_OCMEM_DMA 28 | ||
522 | #define ICBID_MASTER_PNOC_SNOC 29 | ||
523 | #define ICBID_MASTER_WCSS 30 | ||
524 | #define ICBID_MASTER_QDSS_ETR 31 | ||
525 | #define ICBID_MASTER_USB3 32 | ||
526 | #define ICBID_MASTER_USB3_0 ICBID_MASTER_USB3 | ||
527 | #define ICBID_MASTER_SDCC_1 33 | ||
528 | #define ICBID_MASTER_SDCC_3 34 | ||
529 | #define ICBID_MASTER_SDCC_2 35 | ||
530 | #define ICBID_MASTER_SDCC_4 36 | ||
531 | #define ICBID_MASTER_TSIF 37 | ||
532 | #define ICBID_MASTER_BAM_DMA 38 | ||
533 | #define ICBID_MASTER_BLSP_2 39 | ||
534 | #define ICBID_MASTER_USB_HSIC 40 | ||
535 | #define ICBID_MASTER_BLSP_1 41 | ||
536 | #define ICBID_MASTER_USB_HS 42 | ||
537 | #define ICBID_MASTER_USB_HS1 ICBID_MASTER_USB_HS | ||
538 | #define ICBID_MASTER_PNOC_CFG 43 | ||
539 | #define ICBID_MASTER_SNOC_PNOC 44 | ||
540 | #define ICBID_MASTER_RPM_INST 45 | ||
541 | #define ICBID_MASTER_RPM_DATA 46 | ||
542 | #define ICBID_MASTER_RPM_SYS 47 | ||
543 | #define ICBID_MASTER_DEHR 48 | ||
544 | #define ICBID_MASTER_QDSS_DAP 49 | ||
545 | #define ICBID_MASTER_SPDM 50 | ||
546 | #define ICBID_MASTER_TIC 51 | ||
547 | #define ICBID_MASTER_SNOC_CNOC 52 | ||
548 | #define ICBID_MASTER_GFX3D_OCMEM 53 | ||
549 | #define ICBID_MASTER_GFX3D_GMEM ICBID_MASTER_GFX3D_OCMEM | ||
550 | #define ICBID_MASTER_OVIRT_SNOC 54 | ||
551 | #define ICBID_MASTER_SNOC_OVIRT 55 | ||
552 | #define ICBID_MASTER_SNOC_GVIRT ICBID_MASTER_SNOC_OVIRT | ||
553 | #define ICBID_MASTER_ONOC_OVIRT 56 | ||
554 | #define ICBID_MASTER_USB_HS2 57 | ||
555 | #define ICBID_MASTER_QPIC 58 | ||
556 | #define ICBID_MASTER_IPA 59 | ||
557 | #define ICBID_MASTER_DSI 60 | ||
558 | #define ICBID_MASTER_MDP1 61 | ||
559 | #define ICBID_MASTER_MDPE ICBID_MASTER_MDP1 | ||
560 | #define ICBID_MASTER_VPU_PROC 62 | ||
561 | #define ICBID_MASTER_VPU 63 | ||
562 | #define ICBID_MASTER_VPU0 ICBID_MASTER_VPU | ||
563 | #define ICBID_MASTER_CRYPTO_CORE2 64 | ||
564 | #define ICBID_MASTER_PCIE_0 65 | ||
565 | #define ICBID_MASTER_PCIE_1 66 | ||
566 | #define ICBID_MASTER_SATA 67 | ||
567 | #define ICBID_MASTER_UFS 68 | ||
568 | #define ICBID_MASTER_USB3_1 69 | ||
569 | #define ICBID_MASTER_VIDEO_OCMEM 70 | ||
570 | #define ICBID_MASTER_VPU1 71 | ||
571 | #define ICBID_MASTER_VCAP 72 | ||
572 | #define ICBID_MASTER_EMAC 73 | ||
573 | #define ICBID_MASTER_BCAST 74 | ||
574 | #define ICBID_MASTER_MMSS_PROC 75 | ||
575 | #define ICBID_MASTER_SNOC_BIMC_1 76 | ||
576 | #define ICBID_MASTER_SNOC_PCNOC 77 | ||
577 | #define ICBID_MASTER_AUDIO 78 | ||
578 | #define ICBID_MASTER_MM_INT_0 79 | ||
579 | #define ICBID_MASTER_MM_INT_1 80 | ||
580 | #define ICBID_MASTER_MM_INT_2 81 | ||
581 | #define ICBID_MASTER_MM_INT_BIMC 82 | ||
582 | #define ICBID_MASTER_MSS_INT 83 | ||
583 | #define ICBID_MASTER_PCNOC_CFG 84 | ||
584 | #define ICBID_MASTER_PCNOC_INT_0 85 | ||
585 | #define ICBID_MASTER_PCNOC_INT_1 86 | ||
586 | #define ICBID_MASTER_PCNOC_M_0 87 | ||
587 | #define ICBID_MASTER_PCNOC_M_1 88 | ||
588 | #define ICBID_MASTER_PCNOC_S_0 89 | ||
589 | #define ICBID_MASTER_PCNOC_S_1 90 | ||
590 | #define ICBID_MASTER_PCNOC_S_2 91 | ||
591 | #define ICBID_MASTER_PCNOC_S_3 92 | ||
592 | #define ICBID_MASTER_PCNOC_S_4 93 | ||
593 | #define ICBID_MASTER_PCNOC_S_6 94 | ||
594 | #define ICBID_MASTER_PCNOC_S_7 95 | ||
595 | #define ICBID_MASTER_PCNOC_S_8 96 | ||
596 | #define ICBID_MASTER_PCNOC_S_9 97 | ||
597 | #define ICBID_MASTER_QDSS_INT 98 | ||
598 | #define ICBID_MASTER_SNOC_INT_0 99 | ||
599 | #define ICBID_MASTER_SNOC_INT_1 100 | ||
600 | #define ICBID_MASTER_SNOC_INT_BIMC 101 | ||
601 | #define ICBID_MASTER_TCU_0 102 | ||
602 | #define ICBID_MASTER_TCU_1 103 | ||
603 | #define ICBID_MASTER_BIMC_INT_0 104 | ||
604 | #define ICBID_MASTER_BIMC_INT_1 105 | ||
605 | #define ICBID_MASTER_CAMERA 106 | ||
606 | #define ICBID_MASTER_RICA 107 | ||
607 | #define ICBID_MASTER_SNOC_BIMC_2 108 | ||
608 | #define ICBID_MASTER_BIMC_SNOC_1 109 | ||
609 | #define ICBID_MASTER_A0NOC_SNOC 110 | ||
610 | #define ICBID_MASTER_A1NOC_SNOC 111 | ||
611 | #define ICBID_MASTER_A2NOC_SNOC 112 | ||
612 | #define ICBID_MASTER_PIMEM 113 | ||
613 | #define ICBID_MASTER_SNOC_VMEM 114 | ||
614 | #define ICBID_MASTER_CPP 115 | ||
615 | #define ICBID_MASTER_CNOC_A1NOC 116 | ||
616 | #define ICBID_MASTER_PNOC_A1NOC 117 | ||
617 | #define ICBID_MASTER_HMSS 118 | ||
618 | #define ICBID_MASTER_PCIE_2 119 | ||
619 | #define ICBID_MASTER_ROTATOR 120 | ||
620 | #define ICBID_MASTER_VENUS_VMEM 121 | ||
621 | #define ICBID_MASTER_DCC 122 | ||
622 | #define ICBID_MASTER_MCDMA 123 | ||
623 | #define ICBID_MASTER_PCNOC_INT_2 124 | ||
624 | #define ICBID_MASTER_PCNOC_INT_3 125 | ||
625 | #define ICBID_MASTER_PCNOC_INT_4 126 | ||
626 | #define ICBID_MASTER_PCNOC_INT_5 127 | ||
627 | #define ICBID_MASTER_PCNOC_INT_6 128 | ||
628 | #define ICBID_MASTER_PCNOC_S_5 129 | ||
629 | #define ICBID_MASTER_SENSORS_AHB 130 | ||
630 | #define ICBID_MASTER_SENSORS_PROC 131 | ||
631 | #define ICBID_MASTER_QSPI 132 | ||
632 | #define ICBID_MASTER_VFE1 133 | ||
633 | #define ICBID_MASTER_SNOC_INT_2 134 | ||
634 | #define ICBID_MASTER_SMMNOC_BIMC 135 | ||
635 | #define ICBID_MASTER_CRVIRT_A1NOC 136 | ||
636 | #define ICBID_MASTER_XM_USB_HS1 137 | ||
637 | #define ICBID_MASTER_XI_USB_HS1 138 | ||
638 | #define ICBID_MASTER_PCNOC_BIMC_1 139 | ||
639 | #define ICBID_MASTER_BIMC_PCNOC 140 | ||
640 | #define ICBID_MASTER_XI_HSIC 141 | ||
641 | #define ICBID_MASTER_SGMII 142 | ||
642 | #define ICBID_MASTER_SPMI_FETCHER 143 | ||
643 | #define ICBID_MASTER_GNOC_BIMC 144 | ||
644 | #define ICBID_MASTER_CRVIRT_A2NOC 145 | ||
645 | #define ICBID_MASTER_CNOC_A2NOC 146 | ||
646 | #define ICBID_MASTER_WLAN 147 | ||
647 | #define ICBID_MASTER_MSS_CE 148 | ||
648 | #define ICBID_MASTER_CDSP_PROC 149 | ||
649 | #define ICBID_MASTER_GNOC_SNOC 150 | ||
650 | |||
651 | #define ICBID_SLAVE_EBI1 0 | ||
652 | #define ICBID_SLAVE_APPSS_L2 1 | ||
653 | #define ICBID_SLAVE_BIMC_SNOC 2 | ||
654 | #define ICBID_SLAVE_BIMC_SNOC_0 ICBID_SLAVE_BIMC_SNOC | ||
655 | #define ICBID_SLAVE_CAMERA_CFG 3 | ||
656 | #define ICBID_SLAVE_DISPLAY_CFG 4 | ||
657 | #define ICBID_SLAVE_OCMEM_CFG 5 | ||
658 | #define ICBID_SLAVE_CPR_CFG 6 | ||
659 | #define ICBID_SLAVE_CPR_XPU_CFG 7 | ||
660 | #define ICBID_SLAVE_MISC_CFG 8 | ||
661 | #define ICBID_SLAVE_MISC_XPU_CFG 9 | ||
662 | #define ICBID_SLAVE_VENUS_CFG 10 | ||
663 | #define ICBID_SLAVE_GFX3D_CFG 11 | ||
664 | #define ICBID_SLAVE_MMSS_CLK_CFG 12 | ||
665 | #define ICBID_SLAVE_MMSS_CLK_XPU_CFG 13 | ||
666 | #define ICBID_SLAVE_MNOC_MPU_CFG 14 | ||
667 | #define ICBID_SLAVE_ONOC_MPU_CFG 15 | ||
668 | #define ICBID_SLAVE_MNOC_BIMC 16 | ||
669 | #define ICBID_SLAVE_SERVICE_MNOC 17 | ||
670 | #define ICBID_SLAVE_OCMEM 18 | ||
671 | #define ICBID_SLAVE_GMEM ICBID_SLAVE_OCMEM | ||
672 | #define ICBID_SLAVE_SERVICE_ONOC 19 | ||
673 | #define ICBID_SLAVE_APPSS 20 | ||
674 | #define ICBID_SLAVE_LPASS 21 | ||
675 | #define ICBID_SLAVE_USB3 22 | ||
676 | #define ICBID_SLAVE_USB3_0 ICBID_SLAVE_USB3 | ||
677 | #define ICBID_SLAVE_WCSS 23 | ||
678 | #define ICBID_SLAVE_SNOC_BIMC 24 | ||
679 | #define ICBID_SLAVE_SNOC_BIMC_0 ICBID_SLAVE_SNOC_BIMC | ||
680 | #define ICBID_SLAVE_SNOC_CNOC 25 | ||
681 | #define ICBID_SLAVE_IMEM 26 | ||
682 | #define ICBID_SLAVE_OCIMEM ICBID_SLAVE_IMEM | ||
683 | #define ICBID_SLAVE_SNOC_OVIRT 27 | ||
684 | #define ICBID_SLAVE_SNOC_GVIRT ICBID_SLAVE_SNOC_OVIRT | ||
685 | #define ICBID_SLAVE_SNOC_PNOC 28 | ||
686 | #define ICBID_SLAVE_SNOC_PCNOC ICBID_SLAVE_SNOC_PNOC | ||
687 | #define ICBID_SLAVE_SERVICE_SNOC 29 | ||
688 | #define ICBID_SLAVE_QDSS_STM 30 | ||
689 | #define ICBID_SLAVE_SDCC_1 31 | ||
690 | #define ICBID_SLAVE_SDCC_3 32 | ||
691 | #define ICBID_SLAVE_SDCC_2 33 | ||
692 | #define ICBID_SLAVE_SDCC_4 34 | ||
693 | #define ICBID_SLAVE_TSIF 35 | ||
694 | #define ICBID_SLAVE_BAM_DMA 36 | ||
695 | #define ICBID_SLAVE_BLSP_2 37 | ||
696 | #define ICBID_SLAVE_USB_HSIC 38 | ||
697 | #define ICBID_SLAVE_BLSP_1 39 | ||
698 | #define ICBID_SLAVE_USB_HS 40 | ||
699 | #define ICBID_SLAVE_USB_HS1 ICBID_SLAVE_USB_HS | ||
700 | #define ICBID_SLAVE_PDM 41 | ||
701 | #define ICBID_SLAVE_PERIPH_APU_CFG 42 | ||
702 | #define ICBID_SLAVE_PNOC_MPU_CFG 43 | ||
703 | #define ICBID_SLAVE_PRNG 44 | ||
704 | #define ICBID_SLAVE_PNOC_SNOC 45 | ||
705 | #define ICBID_SLAVE_PCNOC_SNOC ICBID_SLAVE_PNOC_SNOC | ||
706 | #define ICBID_SLAVE_SERVICE_PNOC 46 | ||
707 | #define ICBID_SLAVE_CLK_CTL 47 | ||
708 | #define ICBID_SLAVE_CNOC_MSS 48 | ||
709 | #define ICBID_SLAVE_PCNOC_MSS ICBID_SLAVE_CNOC_MSS | ||
710 | #define ICBID_SLAVE_SECURITY 49 | ||
711 | #define ICBID_SLAVE_TCSR 50 | ||
712 | #define ICBID_SLAVE_TLMM 51 | ||
713 | #define ICBID_SLAVE_CRYPTO_0_CFG 52 | ||
714 | #define ICBID_SLAVE_CRYPTO_1_CFG 53 | ||
715 | #define ICBID_SLAVE_IMEM_CFG 54 | ||
716 | #define ICBID_SLAVE_MESSAGE_RAM 55 | ||
717 | #define ICBID_SLAVE_BIMC_CFG 56 | ||
718 | #define ICBID_SLAVE_BOOT_ROM 57 | ||
719 | #define ICBID_SLAVE_CNOC_MNOC_MMSS_CFG 58 | ||
720 | #define ICBID_SLAVE_PMIC_ARB 59 | ||
721 | #define ICBID_SLAVE_SPDM_WRAPPER 60 | ||
722 | #define ICBID_SLAVE_DEHR_CFG 61 | ||
723 | #define ICBID_SLAVE_MPM 62 | ||
724 | #define ICBID_SLAVE_QDSS_CFG 63 | ||
725 | #define ICBID_SLAVE_RBCPR_CFG 64 | ||
726 | #define ICBID_SLAVE_RBCPR_CX_CFG ICBID_SLAVE_RBCPR_CFG | ||
727 | #define ICBID_SLAVE_RBCPR_QDSS_APU_CFG 65 | ||
728 | #define ICBID_SLAVE_CNOC_MNOC_CFG 66 | ||
729 | #define ICBID_SLAVE_SNOC_MPU_CFG 67 | ||
730 | #define ICBID_SLAVE_CNOC_ONOC_CFG 68 | ||
731 | #define ICBID_SLAVE_PNOC_CFG 69 | ||
732 | #define ICBID_SLAVE_SNOC_CFG 70 | ||
733 | #define ICBID_SLAVE_EBI1_DLL_CFG 71 | ||
734 | #define ICBID_SLAVE_PHY_APU_CFG 72 | ||
735 | #define ICBID_SLAVE_EBI1_PHY_CFG 73 | ||
736 | #define ICBID_SLAVE_RPM 74 | ||
737 | #define ICBID_SLAVE_CNOC_SNOC 75 | ||
738 | #define ICBID_SLAVE_SERVICE_CNOC 76 | ||
739 | #define ICBID_SLAVE_OVIRT_SNOC 77 | ||
740 | #define ICBID_SLAVE_OVIRT_OCMEM 78 | ||
741 | #define ICBID_SLAVE_USB_HS2 79 | ||
742 | #define ICBID_SLAVE_QPIC 80 | ||
743 | #define ICBID_SLAVE_IPS_CFG 81 | ||
744 | #define ICBID_SLAVE_DSI_CFG 82 | ||
745 | #define ICBID_SLAVE_USB3_1 83 | ||
746 | #define ICBID_SLAVE_PCIE_0 84 | ||
747 | #define ICBID_SLAVE_PCIE_1 85 | ||
748 | #define ICBID_SLAVE_PSS_SMMU_CFG 86 | ||
749 | #define ICBID_SLAVE_CRYPTO_2_CFG 87 | ||
750 | #define ICBID_SLAVE_PCIE_0_CFG 88 | ||
751 | #define ICBID_SLAVE_PCIE_1_CFG 89 | ||
752 | #define ICBID_SLAVE_SATA_CFG 90 | ||
753 | #define ICBID_SLAVE_SPSS_GENI_IR 91 | ||
754 | #define ICBID_SLAVE_UFS_CFG 92 | ||
755 | #define ICBID_SLAVE_AVSYNC_CFG 93 | ||
756 | #define ICBID_SLAVE_VPU_CFG 94 | ||
757 | #define ICBID_SLAVE_USB_PHY_CFG 95 | ||
758 | #define ICBID_SLAVE_RBCPR_MX_CFG 96 | ||
759 | #define ICBID_SLAVE_PCIE_PARF 97 | ||
760 | #define ICBID_SLAVE_VCAP_CFG 98 | ||
761 | #define ICBID_SLAVE_EMAC_CFG 99 | ||
762 | #define ICBID_SLAVE_BCAST_CFG 100 | ||
763 | #define ICBID_SLAVE_KLM_CFG 101 | ||
764 | #define ICBID_SLAVE_DISPLAY_PWM 102 | ||
765 | #define ICBID_SLAVE_GENI 103 | ||
766 | #define ICBID_SLAVE_SNOC_BIMC_1 104 | ||
767 | #define ICBID_SLAVE_AUDIO 105 | ||
768 | #define ICBID_SLAVE_CATS_0 106 | ||
769 | #define ICBID_SLAVE_CATS_1 107 | ||
770 | #define ICBID_SLAVE_MM_INT_0 108 | ||
771 | #define ICBID_SLAVE_MM_INT_1 109 | ||
772 | #define ICBID_SLAVE_MM_INT_2 110 | ||
773 | #define ICBID_SLAVE_MM_INT_BIMC 111 | ||
774 | #define ICBID_SLAVE_MMU_MODEM_XPU_CFG 112 | ||
775 | #define ICBID_SLAVE_MSS_INT 113 | ||
776 | #define ICBID_SLAVE_PCNOC_INT_0 114 | ||
777 | #define ICBID_SLAVE_PCNOC_INT_1 115 | ||
778 | #define ICBID_SLAVE_PCNOC_M_0 116 | ||
779 | #define ICBID_SLAVE_PCNOC_M_1 117 | ||
780 | #define ICBID_SLAVE_PCNOC_S_0 118 | ||
781 | #define ICBID_SLAVE_PCNOC_S_1 119 | ||
782 | #define ICBID_SLAVE_PCNOC_S_2 120 | ||
783 | #define ICBID_SLAVE_PCNOC_S_3 121 | ||
784 | #define ICBID_SLAVE_PCNOC_S_4 122 | ||
785 | #define ICBID_SLAVE_PCNOC_S_6 123 | ||
786 | #define ICBID_SLAVE_PCNOC_S_7 124 | ||
787 | #define ICBID_SLAVE_PCNOC_S_8 125 | ||
788 | #define ICBID_SLAVE_PCNOC_S_9 126 | ||
789 | #define ICBID_SLAVE_PRNG_XPU_CFG 127 | ||
790 | #define ICBID_SLAVE_QDSS_INT 128 | ||
791 | #define ICBID_SLAVE_RPM_XPU_CFG 129 | ||
792 | #define ICBID_SLAVE_SNOC_INT_0 130 | ||
793 | #define ICBID_SLAVE_SNOC_INT_1 131 | ||
794 | #define ICBID_SLAVE_SNOC_INT_BIMC 132 | ||
795 | #define ICBID_SLAVE_TCU 133 | ||
796 | #define ICBID_SLAVE_BIMC_INT_0 134 | ||
797 | #define ICBID_SLAVE_BIMC_INT_1 135 | ||
798 | #define ICBID_SLAVE_RICA_CFG 136 | ||
799 | #define ICBID_SLAVE_SNOC_BIMC_2 137 | ||
800 | #define ICBID_SLAVE_BIMC_SNOC_1 138 | ||
801 | #define ICBID_SLAVE_PNOC_A1NOC 139 | ||
802 | #define ICBID_SLAVE_SNOC_VMEM 140 | ||
803 | #define ICBID_SLAVE_A0NOC_SNOC 141 | ||
804 | #define ICBID_SLAVE_A1NOC_SNOC 142 | ||
805 | #define ICBID_SLAVE_A2NOC_SNOC 143 | ||
806 | #define ICBID_SLAVE_A0NOC_CFG 144 | ||
807 | #define ICBID_SLAVE_A0NOC_MPU_CFG 145 | ||
808 | #define ICBID_SLAVE_A0NOC_SMMU_CFG 146 | ||
809 | #define ICBID_SLAVE_A1NOC_CFG 147 | ||
810 | #define ICBID_SLAVE_A1NOC_MPU_CFG 148 | ||
811 | #define ICBID_SLAVE_A1NOC_SMMU_CFG 149 | ||
812 | #define ICBID_SLAVE_A2NOC_CFG 150 | ||
813 | #define ICBID_SLAVE_A2NOC_MPU_CFG 151 | ||
814 | #define ICBID_SLAVE_A2NOC_SMMU_CFG 152 | ||
815 | #define ICBID_SLAVE_AHB2PHY 153 | ||
816 | #define ICBID_SLAVE_CAMERA_THROTTLE_CFG 154 | ||
817 | #define ICBID_SLAVE_DCC_CFG 155 | ||
818 | #define ICBID_SLAVE_DISPLAY_THROTTLE_CFG 156 | ||
819 | #define ICBID_SLAVE_DSA_CFG 157 | ||
820 | #define ICBID_SLAVE_DSA_MPU_CFG 158 | ||
821 | #define ICBID_SLAVE_SSC_MPU_CFG 159 | ||
822 | #define ICBID_SLAVE_HMSS_L3 160 | ||
823 | #define ICBID_SLAVE_LPASS_SMMU_CFG 161 | ||
824 | #define ICBID_SLAVE_MMAGIC_CFG 162 | ||
825 | #define ICBID_SLAVE_PCIE20_AHB2PHY 163 | ||
826 | #define ICBID_SLAVE_PCIE_2 164 | ||
827 | #define ICBID_SLAVE_PCIE_2_CFG 165 | ||
828 | #define ICBID_SLAVE_PIMEM 166 | ||
829 | #define ICBID_SLAVE_PIMEM_CFG 167 | ||
830 | #define ICBID_SLAVE_QDSS_RBCPR_APU_CFG 168 | ||
831 | #define ICBID_SLAVE_RBCPR_CX 169 | ||
832 | #define ICBID_SLAVE_RBCPR_MX 170 | ||
833 | #define ICBID_SLAVE_SMMU_CPP_CFG 171 | ||
834 | #define ICBID_SLAVE_SMMU_JPEG_CFG 172 | ||
835 | #define ICBID_SLAVE_SMMU_MDP_CFG 173 | ||
836 | #define ICBID_SLAVE_SMMU_ROTATOR_CFG 174 | ||
837 | #define ICBID_SLAVE_SMMU_VENUS_CFG 175 | ||
838 | #define ICBID_SLAVE_SMMU_VFE_CFG 176 | ||
839 | #define ICBID_SLAVE_SSC_CFG 177 | ||
840 | #define ICBID_SLAVE_VENUS_THROTTLE_CFG 178 | ||
841 | #define ICBID_SLAVE_VMEM 179 | ||
842 | #define ICBID_SLAVE_VMEM_CFG 180 | ||
843 | #define ICBID_SLAVE_QDSS_MPU_CFG 181 | ||
844 | #define ICBID_SLAVE_USB3_PHY_CFG 182 | ||
845 | #define ICBID_SLAVE_IPA_CFG 183 | ||
846 | #define ICBID_SLAVE_PCNOC_INT_2 184 | ||
847 | #define ICBID_SLAVE_PCNOC_INT_3 185 | ||
848 | #define ICBID_SLAVE_PCNOC_INT_4 186 | ||
849 | #define ICBID_SLAVE_PCNOC_INT_5 187 | ||
850 | #define ICBID_SLAVE_PCNOC_INT_6 188 | ||
851 | #define ICBID_SLAVE_PCNOC_S_5 189 | ||
852 | #define ICBID_SLAVE_QSPI 190 | ||
853 | #define ICBID_SLAVE_A1NOC_MS_MPU_CFG 191 | ||
854 | #define ICBID_SLAVE_A2NOC_MS_MPU_CFG 192 | ||
855 | #define ICBID_SLAVE_MODEM_Q6_SMMU_CFG 193 | ||
856 | #define ICBID_SLAVE_MSS_MPU_CFG 194 | ||
857 | #define ICBID_SLAVE_MSS_PROC_MS_MPU_CFG 195 | ||
858 | #define ICBID_SLAVE_SKL 196 | ||
859 | #define ICBID_SLAVE_SNOC_INT_2 197 | ||
860 | #define ICBID_SLAVE_SMMNOC_BIMC 198 | ||
861 | #define ICBID_SLAVE_CRVIRT_A1NOC 199 | ||
862 | #define ICBID_SLAVE_SGMII 200 | ||
863 | #define ICBID_SLAVE_QHS4_APPS 201 | ||
864 | #define ICBID_SLAVE_BIMC_PCNOC 202 | ||
865 | #define ICBID_SLAVE_PCNOC_BIMC_1 203 | ||
866 | #define ICBID_SLAVE_SPMI_FETCHER 204 | ||
867 | #define ICBID_SLAVE_MMSS_SMMU_CFG 205 | ||
868 | #define ICBID_SLAVE_WLAN 206 | ||
869 | #define ICBID_SLAVE_CRVIRT_A2NOC 207 | ||
870 | #define ICBID_SLAVE_CNOC_A2NOC 208 | ||
871 | #define ICBID_SLAVE_GLM 209 | ||
872 | #define ICBID_SLAVE_GNOC_BIMC 210 | ||
873 | #define ICBID_SLAVE_GNOC_SNOC 211 | ||
874 | #define ICBID_SLAVE_QM_CFG 212 | ||
875 | #define ICBID_SLAVE_TLMM_EAST 213 | ||
876 | #define ICBID_SLAVE_TLMM_NORTH 214 | ||
877 | #define ICBID_SLAVE_TLMM_WEST 215 | ||
878 | #define ICBID_SLAVE_LPASS_TCM 216 | ||
879 | #define ICBID_SLAVE_TLMM_SOUTH 217 | ||
880 | #define ICBID_SLAVE_TLMM_CENTER 218 | ||
881 | #define ICBID_SLAVE_MSS_NAV_CE_MPU_CFG 219 | ||
882 | #define ICBID_SLAVE_A2NOC_THROTTLE_CFG 220 | ||
883 | #define ICBID_SLAVE_CDSP 221 | ||
884 | #define ICBID_SLAVE_CDSP_SMMU_CFG 222 | ||
885 | #define ICBID_SLAVE_LPASS_MPU_CFG 223 | ||
886 | #define ICBID_SLAVE_CSI_PHY_CFG 224 | ||
887 | #endif | ||
diff --git a/sound/soc/amd/acp-pcm-dma.c b/sound/soc/amd/acp-pcm-dma.c index 08b1399d1da2..dcbf9973884d 100644 --- a/sound/soc/amd/acp-pcm-dma.c +++ b/sound/soc/amd/acp-pcm-dma.c | |||
@@ -73,12 +73,6 @@ static const struct snd_pcm_hardware acp_pcm_hardware_capture = { | |||
73 | .periods_max = CAPTURE_MAX_NUM_PERIODS, | 73 | .periods_max = CAPTURE_MAX_NUM_PERIODS, |
74 | }; | 74 | }; |
75 | 75 | ||
76 | struct audio_drv_data { | ||
77 | struct snd_pcm_substream *play_stream; | ||
78 | struct snd_pcm_substream *capture_stream; | ||
79 | void __iomem *acp_mmio; | ||
80 | }; | ||
81 | |||
82 | static u32 acp_reg_read(void __iomem *acp_mmio, u32 reg) | 76 | static u32 acp_reg_read(void __iomem *acp_mmio, u32 reg) |
83 | { | 77 | { |
84 | return readl(acp_mmio + (reg * 4)); | 78 | return readl(acp_mmio + (reg * 4)); |
@@ -916,6 +910,7 @@ static int acp_audio_probe(struct platform_device *pdev) | |||
916 | int status; | 910 | int status; |
917 | struct audio_drv_data *audio_drv_data; | 911 | struct audio_drv_data *audio_drv_data; |
918 | struct resource *res; | 912 | struct resource *res; |
913 | const u32 *pdata = pdev->dev.platform_data; | ||
919 | 914 | ||
920 | audio_drv_data = devm_kzalloc(&pdev->dev, sizeof(struct audio_drv_data), | 915 | audio_drv_data = devm_kzalloc(&pdev->dev, sizeof(struct audio_drv_data), |
921 | GFP_KERNEL); | 916 | GFP_KERNEL); |
@@ -932,6 +927,7 @@ static int acp_audio_probe(struct platform_device *pdev) | |||
932 | 927 | ||
933 | audio_drv_data->play_stream = NULL; | 928 | audio_drv_data->play_stream = NULL; |
934 | audio_drv_data->capture_stream = NULL; | 929 | audio_drv_data->capture_stream = NULL; |
930 | audio_drv_data->asic_type = *pdata; | ||
935 | 931 | ||
936 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 932 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
937 | if (!res) { | 933 | if (!res) { |
diff --git a/sound/soc/amd/acp.h b/sound/soc/amd/acp.h index 330832ef4e5e..28cf9140f49c 100644 --- a/sound/soc/amd/acp.h +++ b/sound/soc/amd/acp.h | |||
@@ -84,6 +84,13 @@ struct audio_substream_data { | |||
84 | void __iomem *acp_mmio; | 84 | void __iomem *acp_mmio; |
85 | }; | 85 | }; |
86 | 86 | ||
87 | struct audio_drv_data { | ||
88 | struct snd_pcm_substream *play_stream; | ||
89 | struct snd_pcm_substream *capture_stream; | ||
90 | void __iomem *acp_mmio; | ||
91 | u32 asic_type; | ||
92 | }; | ||
93 | |||
87 | enum { | 94 | enum { |
88 | ACP_TILE_P1 = 0, | 95 | ACP_TILE_P1 = 0, |
89 | ACP_TILE_P2, | 96 | ACP_TILE_P2, |